多表操作DQL
表与表的关系
一对多:主外键关联并且外键也是独一无二
例如:一夫一妻制
husband_id | husband_name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
wife_id | wife_name | husband_id |
---|---|---|
1 | 孙七 | 1 |
2 | 周八 | 2 |
3 | 吴九 | 3 |
wife表的外键husband_id与husband表对应,对于一对一来说此外键不能重复
一对多:外键可重复,设置外键的表就是多的一方
student_id | student_name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
textbook_id | textname | student_id |
---|---|---|
01 | 数学书 | 1 |
02 | 语文书 | 1 |
03 | 英语数 | 1 |
11 | 数学书 | 2 |
12 | 语文书 | 2 |
13 | 英语数 | 2 |
21 | 数学书 | 3 |
22 | 语文书 | 3 |
03 | 英语数 | 3 |
一个学生可以拥有多本书,但他的书只属于他
多对多:两表都需要重复,因此需要创建一个关系表来设置外键实现
student_id | student_name |
---|---|
1 | 张三 |
2 | 李四 |
course_id | course_name |
---|---|
1 | 语文 |
2 | 数学 |
student_id | course_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
2 | 2 |
学生有多门课,一个课也有多个学生,用第三张来设置外键就可以实现这种多对多的关系
合并结果集
什么是合并结果集
合并结果集的两种方式
SELECT * FROM 表1 UNION SELECT * FROM 表2;
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
/*
两个表的列数和数据类型要相同,
最终显示的列名是表1的字段名
*/
id | name |
---|---|
1 | 张三 |
2 | 李四 |
c_id | c_name |
---|---|
3 | 王五 |
4 | 赵六 |
合并后
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
4 | 赵六 |
连接查询
什么是连接查询
什么是笛卡尔集
表1:
id | name |
---|---|
1 | 张三 |
2 | 李四 |
表2:
class_id | class_name | student_id |
---|---|---|
1 | 一班 | 1 |
2 | 二班 | 2 |
执行:SELECT * FROM 表1,表2;
结果:
id | name | class_id | class_name | student_id |
---|---|---|---|---|
1 | 张三 | 1 | 一班 | 1 |
2 | 李四 | 1 | 一班 | 1 |
1 | 张三 | 2 | 二班 | 2 |
2 | 李四 | 2 | 二班 | 2 |
多表联查
筛选想要的数据
SELECT * FROM 表1,表2 WHERE 表1.id = 表2.student_id;
id | name | class_id | class_name | student_id |
---|---|---|---|---|
1 | 张三 | 001 | 一班 | 1 |
2 | 李四 | 002 | 二班 | 2 |
内连接
/* 等值连接,筛选出主外键对应相等的 */
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.id = 表2.student_id;
/* 多表 */
SELECT * FROM 表1 ,表2 ,表 3
WHERE 表1.xxx = 表2.xxx
AND 表2.xxx = 表3.xxx;
/*------------------------*/
SELECT * FROM 表1
INNER JOIN 表2 ON 表1.xxx = 表2.xxx
INNER JOIN 表3 ON 表2.xxx = 表3.xxx
/* 非等值连接,筛选连接表时用不等号关联 */
SELECT * FROM 表1
INNER JOIN 表2 ON 表1.xxx = 表2.xxx
WHERE 表1.xxx > 表2.xxx
/*
自连接:当一张表中每行的记录与其他记录可能存在一定的关系
这个时候我们想要去查询,与指定记录有关系的所有记录。
就需要自连接,当成两张表然后对应关系连接使用
*/
SELECT * FROM 表 a INNER JOIN 表 b
ON a.xxx = xxx AND a.yyy = b.xxx;
外连接
自然连接
student_id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
course | score | student_id |
---|---|---|
语文 | 50 | 1 |
语文 | 60 | 2 |
语文 | 70 | 3 |
执行:SELECT * FROM student NATURAL JOIN score;
student_id | name | course | score |
---|---|---|---|
1 | 张三 | 语文 | 50 |
2 | 李四 | 语文 | 60 |
3 | 王五 | 语文 | 70 |
子查询
什么是子查询
子查询出现的位置
SELECT * FROM student
where score > (select score from student where name = "张三");