一、概念

多表查询也叫关联查询, 其就是指 一次性查询多张表,并且将每张表得到的数据联系作为查询结果

二、关键字 

当我们需要一次查询两张表时,如果使用:

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 的字段查出

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐