意义:数据完整性是为了保证插入到数据库中的数据是正确的,防止用户可能的错误输入。
数据完整性分为实体完整性、域完整性、参照完整性。
一:数据完整性
1.实体(行)完整性 : 主键:primary key
①主键分类:
逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐)
业务主键:例如username,参与实际的业务逻辑。
②主键使用方式:
方式一:(id int primary key;)
方式二:( id int;
primary key(id));
方式三:(id int;)
alter table 表名 add primary key(id)
③主键自动增长:
关键字: auto_increment
语句: id int primary key auto_increment,
2.域(列)完整性 :
数据类型[长度]
非空约束:NOT NULL
唯一约束:UNIQUE
语句:CREATE TABLE t5(
username varchar(100) NOT NULL UNIQUE,
gender varchar(100) NOT NULL,
phonenum varchar(100) UNIQUE
);
3.参照完整性
参照完整性指的就是多表之间的设计,主要使用外键约束。
多表设计: 一对多、多对多、一对一设计
###1 : 一对多(1* N)
1.客户和订单的关系就是一对多,一个客户可以有多张订单,一张订单属于一个客户;
2. 代码实现:
创建客户表:
CREATE TABLE customers(
id int,
name varchar(100),
address varchar(255),
PRIMARY KEY(id)
);
创建订单表:
CREATE TABLE orders(
order_num int primary key,
price float(8,2),
status int,
customer_id int,
CONSTRAINT customer_id_fk FOREIGN KEY(customer_id) REFERENCES customers(id)
);
constraint customer_id_fk foreign key(customer_id) references customers(id);
创建一个名叫customer_id_fk的外键约束,其中外键指的是customer_id,并且参照的是 customers表中的id列。
注: constraint: 约束的意思。foreign key: 外键。references: 参照
扩展:子表的删除、更新策略:
子表的删除更新策略一共有四种:
1)CASCADE(级联策略) :操作主表时:同步删除或者修改子表
2)NO ACTION (无动作策略):要删除主表的记录必须先删除子表关联的记录,不能更新主表主键字段的值。
3)RSTRICT(主表约束策略):此种策略对主表的约束跟 NO ACTION 一样
4)SET NO (置空策略)如果主表被删除或者主键被更改,则将子表中的外键设置为NULL。需要注意的是,如果子表的外键是主键或者是设置为NOT NULL的,则主表的删除和主键的更改跟 NO ACTION 一样。
###2 :多对多
老师和学生是多对多关系, 一个老师对应多个学生,一个学生被多个老师教
创建老师表:
Create table teachers(
id int,
name varchar(100)
salary float(8,2),
primary key(id)
);
创建学生表:
Create table students(
id int,
name varchar(100),
grade varchar(100),
primary key(id)
);
第三张表格:
Create table teacher_student(
t_id int,
s_id int,
primary key(t_id,s_id)
CONSTRAINT teacher_id_fk FOREIGN KEY(t_id) REFERENCES teachers(id),
CONSTRAINT student_id_fk FOREIGN KEY(s_id) REFERENCES students(id)
);
二、 多表查询
1 交叉连接 :第一个表格的所有行 乘以 第二个表格中的所有行,也就是笛卡尔积
语法:
隐式语法(不使用关键字): select * from customers,orders;
显式语法(使用关键字): select * from customers CROSS JOIN orders;
注意:交叉连接结果集是不正确的。
2 内连接:因为交叉连接获得的结果集是错误的。因此内连接是在交叉连接的基础上只列出连接表中与连接条件相匹配的数据行,匹配不上的记录不会被列出。
语法:
隐式语法: select * from customers,orders where customers.id=orders.customer_id;
显式语法: select * from customers c INNER JOIN orders o ON c.id=o.customer_id;
3 外连接:内连接只列出所有购买过商品的用户的信息,不会列出没有购买商品用户。而外链接是以一张表为基表,其他表信息进行拼接,如果有就拼接上,如果没有显示null; 外链接分为左外连接和右外连接。(左外连接足够)
左外连接: 以关键字左边的表格为基表进行拼接
语法: select * from customers c LEFT JOIN orders o ON c.id=o.customer_id;
4 子查询:某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询,为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询;
子查询分为嵌套子查询和相关子查询。
嵌套子查询:
内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为 外部查询的条件使用(嵌套子查询中的子查询语句可以拿出来单独运行。)
语法及练习: 查询出id为1的老师教过的所有学生。
select * from students where id in(select s_id from teacher_student where t_id=1);