数据库是如何存储数据的---外键:来自
主键:唯一的标识或者说区分开一个事物。
外键:能够标识事物之间的联系。数据来自外部
1、表的相关数据
字段:用来模拟事物的某一个静态特征。对于表中每一列都代表一个字段。
记录:字段的组合,表示的是一个具体的事物。对于表中的每一行都是一个记录。
表:记录的组合,表示的是同一类型事物的集合。
表与字段、记录的关系:
字段是事物的属性
记录是事物本身
表是事物的集合
列:是字段的另一种称谓。
属性:字段的另一种称谓。
元组:记录的另一种称谓。
数据库中名词
-
数据库中表的每一行称为记录
-
数据库中表的每一列称为字段
在数据库中:每一个字段也即是每一列代表一个事物的某一种属性
每一个记录也即是每一行代表一个事物整体。
2
、create table命令
通过图形化界面建表
此命令的()中的语句后需要添加逗号
creat table 中最后一个语句的后面建议不要写逗号,否则不便于与Oracle之间进行移植代码。因为Oracle使用create table时最后一个语句不允许添加“,”然而sqlserver是可有可无的
3、什么是约束
定义:
对一个表中的属性操作的限制叫做约束
分类:
主键约束:
-
不允许重复元素,避免了数据的冗余,主键上的这个非重复的约束是默认的。
-
且主键值不允许为null值。
外键约束:
-
通过外键约束从语法上保证了本事物所关联的其他事物一定是存在的
-
事物与事物之间的关系是通过外键来体现的
主键表与外键表区分:
对于两个具有关系的表,既包含自己的主键又包含外键则称为外键表,仅仅包含自己主键的表称为主键表。
check约束
-
保证事物属性的取值在合法的范围之内。
-
保证某个字段的取值是在check语句的规定范围内的
default约束
unique唯一约束
-
保证了事物属性的取值不允许重复,
但允许其中一列且只能有一列为空。
问题:
Sql server 20005只允许一个unique列为null值
Oracle 11g允许多个unique列为null值
no NULL(非空)约束
stu_name nvarchar(20) not null;表示此字段值不允许为空。不写则默认为null,表示允许为空,除主键外
-
要求用户必须的为该属性赋值,否则语法出错!
-
如果一个字段不写null,也不写not null----则默认是null,即默认允许为空,用户可以不给该字段赋值----如果用户没有为该字段赋值,则该字段的值默认为null。
!!!注意:null与default的区别
相同点:
都允许用户不赋值
不同点
null修饰的字段如果用户不赋值则默认是null。
default修饰的字段如果用户不赋值则默认是default。
4、表和约束的区别
数据库是通过表来解决事物存储问题的。
数据库是通过约束来解决事物取值的有效性和合法性的问题。
建表的过程就是指定事物属性及其事物属性各种约束的过程。
5、什么是关系
定义:
实现方式:
分类(假设为A表和B表):
-
一对一-----既可以把表A的主键充当表B的外键,也可以把表B的主键当作表A的外键。
-
一对多-----建立了两个表中的一对多的关系,是此时外键在“多”的表中进行设立。把表A的主键充当表B的外键----或者是把表A的主键添加到B中充当外键-----在多的一方添加外键
-
例如:用户和账户的关系,一个用户对应多个账户,其中账户就是多表,可以在多表中建立外键,表达这种一对多的关系,此时多表是从表,如果在用户表中建立外键,可能有的用户不存在账户,而这个外键又是从表的主键置空不合适,所以一般在从表中建立外键,来表达一对多的关系
-
多对多-----需要建立第三个表来表示两个表之间的多对多的关系,且需要在第三个表中定义多个字段组合作为主键,此时多个外键并存。
-
对于多个字段组合主键的理解:在第三方表中标识两表之间的关系,比如三方表指示同学和老师之间的关系,其中a同学----jack老师,b同学----jane老师,在三方表中这样两个字段才能表达出多对多的关系,此时的主键我们不在是一个单独的字段,此时同学列和老师列同时组合起来作为主键,同时这两列又是外键,来表达这种多对多的关系。
-
多对多必须通过一个单独的表来进行表示,
6、主键
定义
-
能够唯一标识一个事物的字段或者多个字段的组合,被称为主键
附注:
-
含有主键的表叫做主键表
-
主键通常都是整数,不建议使用字符串当主键,除非主键是用于集群式的服务,
-
主键的值通常都不允许修改,除非本记录被删除
-
主键不要定义成id,而是要定义成表名ID或者表明_id;
-
要使用代理主键,就是另外建立一个字段,尽量是整型且与其他值无关,不会被修改;
-
任何一张表,强烈建议不要使用有业务含义的字段充当主键;
-
业务主键在使用过程中可能会存在变动,一旦变动可能关联数据将出现问题,因此常采用业务主建
-
我们通常都是在表中单独添加一个整型的标号充当主键字段。
7、外键
定义:
-
如果一个表中的若干个字段是来自另外若干个表的主键或唯一键,则称这若干个字段就是外键。
注意:
-
外键通常是来自了另外表的主键而不是唯一键,因为唯一键可能为null;
-
外键不一定是来自另外的表,也可能来自本表的主键;
-
含有外键的表叫做外键表,外键字段来自的那一张表叫做主键表。
问题:先删除主键表还是外键表
-
先删除外键表,如果先删除主键表,会导致外键表中的数据引用错误,而操作失败。
--创建表,以及设置主键和外键
create table emp --emp是表的名字
(
--建表使用()而不是{}
--在表中建立字段,以及选择某一个字段称为主键来唯一标识表中的事物,不会重复
emp_id int primary key, --其中emp_id表示字段的名称;int表示该字段的数据类型;primary key 表示将该字段设置为主键,用来标识该表
emp_name nvarchar(20) not null, --其中nvarchar(20)数据类型为支持20个字符,20数值可变;not null表示该字段数据不允许为空。
emp_sex nchar(1),
--可以使用constraint为主键或者外键定义一个别名,如果不进行自定义会有一个默认值
dept_id int constraint pk_id_lockkey foreign key references dept(dept_id) --表示为该表设置一个外键并进行自定义别名
--reterencers表示此外键来自于dept表中的dept_id,表明此外键的来源
)
--创建另一个表,用来与emp表设置外键,与此表建立联系
create tabel dept --创建表dept
(
dept_id int primary key, --为此表创建外键
dept_name nvarchar(100) not null,
dept_address nvarchar(100)
)
--check约束的应用
create tabel student
(
stu_id int primary key,
stu_sal int check (stu_sal>=1000 and stu_sal <=8000) --使用check约束将sal的值限制在1000到8000之间。
--也可以使用关键字为check约束进行自定义别名
)
--使用关键字insert,into,values来为表student插入数据
insert into student values(1,1000);--ok,此数据可以插入表student
insert into student values(2,500);--error,不允许插入,不符合check约束
--详述defualt约束
create table student
(
stu_id int primary key,
stu_sal int ,
stu_sex nchar(1) defualt ('男') --()可以省略对于mysql中()需要省略使用,在数据库中字符串必须用单引号括起来,,,双引号用来括起来为某个字段自定义的名字等
)
insert into student(stu_id,stu_sal) values (1,1000);--表名后()中的字段名,表示为指定字段添加数据,不为其他添加数据,
--此命令不为表中的stu_sex添加数据,则stu_sex会自动使用默认值。
insert into student values(2,1000,'女');--此时为字段添加数值,则不使用默认值
--详述unique唯一约束
create table student
(
stu_id int identify(1,1) primary key,
stu_sal int check (stu_sal>=1000 and stu_dal<=8000),
stu_sex nchar(1) default '男',
stu_name nvarchar(200) unique
)
insert into student values(1,1000,'女','张三');--ok,
insert into student values(2,1000,'女','张三');--error,违反唯一性原则,张三值与第一个重复,
insert into student values(2,1000,'女','李四');--ok
insert into student values(3,1000,'女',null);--唯一性原则允许为空
--当使用此【stu_name nvarchar(200) unique not null】时,stu_name字段不允许为空。且表明unique,not null可组合使用
--对于主键可以使用identity(m,n)进行主键的值的自动增长,其中的m表示开始增长的起始点,n表示每次增长的幅度。
8、数据类型
数据类型:在选择要使用的数据类型时,所选择的类型越简单越好,能保存数值的类型越小越好。
数据类型的特点与使用方式:
整形特点与使用方式:
格式:变量名 int(M), 其中M数值表示整数的字符长度,其中M值可省略。
1、对于整形数据类型默认为有符号数,可以通过使用关键字unsigned定义无符号数。
2、每个类型在内存中占用的字节数是一定的,当插入的数据超出可以表达的范围会出现out of range异常,并且插入临界值。
3、如果不设置长度,会默认长度,当使用关键字zerofill,如果长度不够会使用0向左进行填充。
小数类型特点:
格式:变量名 数据类型(M,D);M,D的值不指定时,将会使用默认值。
1、M:整数部位+小数部位
D:小数部位长度
如果插入数值超出范围,则插入临界值
2、M和D都可以省略
如果是decimal,则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度
3、定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
字符类型特点
格式:变量名 数据类型(M)
特点:1、对于char其中的M值可以省略,默认为1,相对于varchar空间分配固定长度的字符,而varchar则根据需要进行分配可变长度的字符。varchar中的M数值不可以省略。
日期类型的特点
格式:变量名 数据类型
特点:
1、datetime(占用8字节)年份范围(1000-9999),不受时区的影响。
2、timestamp(占用4字节,相当于时间戳),年份范围(1970-2038),受时区影响。