mysql多表查询
1. 多表的关系
多个表之间是有关系的,多表之间的关系约束是通过外键列来完成的。
1.1 一对多/多对一的关系
- 比如:部门和员工,班级和学生,省份和城市
- 一对多和多对一仅仅是视角不同而已,如班级和学生,班级是1、学生是多,因此
一对多是班级对学生,反过来多对一就是学生对班级,因此也是双向一对多。 - 一对多建表原则:在多方创建一个属性,该属性作为外键指向一方的主键
1.2 多对多的关系
- 比如一门课程有多个学生,而且每个学生学了多门课程
- 多对多建表原则:需要创建第三张表这种表中至少有两个属性,分别作为外键指向两个多方的主键。
问: 为什么建立外键列会降低效率?如何解决该问题?既能保证数据正确又可以不用人工检查?
1.3 一对一的关系
- 实际应用并不多,因为可以直接创建成一张表。
- 一对一有两种建表原则:
- 在任意一个一方建立一个外键指向另外一个一方的主键,且将这个外键设置为unique
- 让一对一的双方的主键建立关系
2. 多表查询
多表查询主要有如下几种:
-
合并结果集:
union、union all
-
连接查询:
-
内连接:
-
外连接:
- 左外连接:
- 右外连接
- 全外连接:
-
自然连接:
-
-
子查询
2.1 合并结果集
-
作用:将两个select语句的执行结果合并;这将导致结果的行(实体)增加
-
被合并的两个结果:列数、列类型必须相同;
-
关键字
union
是将结果合并并去重,关键字union all
是将结果合并但不去重 -
用法
-- 将table1和table2的查询结果合并并且去重(table2的查询结果添加到table1的查询结果上) select * from table1 union select * from table2; -- 将table1和table2的查询结果合并 select * from table1 union all select * from table2; -- 错误写法, 显然各select查询的结果列数不一致,无法合并 select attr1, attr2 from table1 union all select attr3 from table2;