一、概念
多表查询也叫关联查询, 其就是指 一次性查询多张表,并且将每张表得到的数据联系作为查询结果
二、关键字
当我们需要一次查询两张表时,如果使用:
select * from employees,departmaents;
这样的话会出现笛卡尔积错误 (笛卡尔积错误:两个表的数据量相乘后的数量成为查询的结果)
这里就需要使用特定的写法,使用专门的关键字
select last_name,department_id from employees,departments where employees.`department_id` = departments.`department_id`;
这里虽然可以使用条件判断去防止笛卡尔积错误,但不建议使用,一般使用 ↓ 关键字:
join on
select * from student s join grade g on s.grade = g.id;
三、多表查询的类型
1. 等值查询
查询两张表种都存在并且通过条件等价查询获得的结果集
2. 自连接
自己表和自己表连接,核心:将一张表拆分为两张一样的表即可
select b.bookName '父栏目',a.bookName '子栏目' from book_p a ,book_p b where a.pid = b.sid;
原始数据
查询结果
3 . 外连接
3.1 左外连接
left join on
select s.name,s.address,g.class from student s right join grade g on s.gradeid = g.id;
表示查询无论 s.grade = g.id 是否成立,student 表中的结果都会返回
3.2 右外连接
right join on
select s.name,s.address,g.class from student s left join grade g on s.gradeid = g.id;
表示查询无论 s.grade = g.id 是否成立,grade表中的结果都会返回
3.3 直连接
join on
select s.name,s.address,g.class,g.id from student s join grade g on s.gradeid = g.id;
将两张表相同的部分移除,剩下的合并成一张表返回
3.4 inner join on
select name,class from student s inner join grade g on s.gradeid = g.id;
原始表
在两个表中,都分别有别 gradeid = id 没有联系的段落
查询结果
该结果并没有把 student 中的 id = 8 的字段查出 和 grade 表中 id = 4 的字段查出