1、外键
如果一个实体的某个字段指向另一个实体的主键,就称为外键
用于约束处于关系内的实体
增加子表记录时,是否有与之对应的父表记录
增加外键如果数据库中添加字段,在所指的外键中没有。将添加报错
例:
名 | 字段 | 被引用的模式 | 被引用的表(父) | 被引用的字段 | 删除时 | 更新时 |
可以不写自动生成 | teacher_student中的字段 | 数据库名 | 被引用的表名 | 被引用的表字段 | 默认 | 默认 |
级联操作的类型(删除时、更新时)
restrict | 限制 默认值,抛异常 |
cascade | 级联 如果主表的记录删除,则从表中相关的记录都要被删除 |
set null | 将外键设置为空 |
no action | 什么都不做 |
2、连接查询
- 表A inner join 表B:表A和表B匹配 全部出现在结果中
- 表A left join 表B:表A和表B匹配 出现在结果中,外加表A中独有的数据,未对应的数据使用null填充
- 表A right join 表B:表A和表B匹配 出现在结果中,外加表B中独有的数据,未对应的数据使用null填充
2.1 一对多 查询
下面分别是 author表 authorbook表
例:inner join
select * from author inner join authorbook on author.id = authorbook.authorid;
例:left join
SELECT * from author LEFT JOIN authorbook on author.id = authorbook.authorid;
例:right join
SELECT * from author RIGHT JOIN authorbook on author.id = authorbook.authorid;
2.2 多对多 查询
project 科目表 student 学生表 score 成绩表
-- 查所有学生的语文成绩 多表查询
SELECT score.id,student.name,score.score,project.project FROM score
INNER JOIN student ON student.id = score.studentid
INNER JOIN project ON project.id = score.projectid
WHERE project.project = '语文';
2.3 自关联查询
地区表 district 一张表 一部分 pid是和id关联
-- 自关联查询
-- id,area,parentAreaId
-- 1 , 广东省,0
-- 2 , 广州市,1
-- 3 , 梅州市,1
-- 4 , 白云区,2
-- 5 ,天河区,2
-- 广东省,广州市,天河区
-- 找出广东省里的所有市
SELECT * from district where district_name = "广东"
-- 1将2张表关联(同一张表)
select d1.id,d1.pid,d1.district_name as '省份',d2.district_name as '市区' from
district as d1
INNER JOIN district as d2
on d1.id=d2.pid
where d1.district_name = "广东";
-- 注意:上下级关系包含,公司的层级关系,游戏里帮派层级关系
2.4 子查询
查询套查询
-- 找出年龄小于20岁的学生成绩
SELECT name from student where age < 20;
SELECT * from score
INNER JOIN student
on score.studentid = student.id
where student.name = "小红"
SELECT * from score
INNER JOIN student
on score.studentid = student.id
where student.name in (SELECT name from student where age < 20)
-- 存在某个条件下,才做某个查询
-- 如果有学生大于50岁才将老师查找出来,EXISTS条件查找,存在exists后面的查询内容,才执行前面的查找。
SELECT * from teacher where EXISTS (SELECT studentname from student where studentage > 50)
3、视图
对于复杂的查询,多次使用 可以用视图对查询封装;
create view 视图名称 as
-- 视图
-- create view 视图名称 as
create view student_yw as
SELECT score.id,student.name,score.score,project.project FROM score
INNER JOIN student ON student.id = score.studentid
INNER JOIN project ON project.id = score.projectid
WHERE project.project = '语文';
4、事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
MYSQL 事务处理
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认