多表查询
概述:
多表查询:指的是再多张表中的查询数据。
笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)多所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
前言
创建表的数据准备代码:通过网盘分享的文件:
链接: https://pan.baidu.com/s/1kTZC6O8IogdUtW3JwCaQVA 提取码: 757u
一、连接查询
1、内连接
概念:
内连接:相当于查询A、B交集部分数据。
语法:
隐式内连接:select 字段列表 from 表1,表2 where 条件…;
显示内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件…;
代码演示:
# 显示内连接
select * from tb_dept join tb_dept td on tb_dept.name = td.name;
# 隐式内连接
select * from tb_dept d ,tb_emp e where e.dept_id = d.id;
隐式与显示内连接的区别:
从代码的直观上看的话:你会发现显示内连接的代码更容易读懂,而隐式内类链接相对比起来就显得不是那么容易读懂了。
从性能上看的话:在大数据量下,显式内连接性能更好。
2、外连接
- 左外连接:查询左表所有数据(包括两张表的交集部分数据)
- 有外连接:查询右表所有数据(包括两张表的交集部分数据)
语法:
左外连接:select * from 表1 left [outer] join 表2 on 连接条件 …;
右外连接:select * from 表1 right [outer] join 表2 on 连接条件 …;
代码演示:
# 左外连接
select * from tb_emp e left outer join tb_dept d on e.dept_id = d.id;
# 右外连接
select * from tb_emp e right outer join tb_dept d on e.dept_id = d.id;
二、子查询
概念:
介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
形式:select * from 表1 where column1 = (select column1 from 表2 …);
子查询外部的语句可以使insert/update/delete/select的任何一个,最为常见的是select。
1.表量子查询
表量子查询:子查询返回的结果为单个值。
代码演示:
# 标量子查询
# 1、查询“教研部”的所有员工信息,2、查询教研部部门的ID
select * from tb_emp e where e.dept_id = (select id from tb_dept d where d.name = '教研部');
#查询在方东白之后入职的员工信息
select * from tb_emp e where e.entrydate > (select entrydate from tb_emp e where e.name = '方东白');
2.列子查询
列子查询:子查询返回的结果为一列。
代码演示:
# 例子查询
select * from tb_emp e where e.dept_id in (select id from tb_dept d where d.name in('教研部','咨询部'));
注解:列子查询可以使用in去判断其子查询出来的结果和dept_id进行判断
在看代码时可以直接看为:… num in (num1,num2);
3.行子查询
行子查询:子查询返回的结果为一行。
代码演示:
# 行子查询
select * from tb_emp e where (e.entrydate,e.job) in (select entrydate,job from tb_emp where tb_emp.name='韦一笑');
注解:行子查询对比列子查询看起来稍微会简单一些,因为你可以很直观的看出判断的值:(num1 ,num2)in (num3,num4)直接num1与num3,num2与num4作比较即可。
4.表子查询
表子查询:子查询返回的结果为一张表
代码演示:
# 表子查询
select e.*,d.name from (select * from tb_emp where entrydate > '2006-01-01') e , tb_dept d where e.dept_id = d.id;
注解:表子查询,对比其他的子查询是最不同的,它不是将子查询放在where语句后面来进行判断,而是将你判断好的子查询作为一个临时的表进行判断
总结
以上就是今天要讲的内容,主要是将了关于多表的查询,这一章节相对与多表的设计更为重要一些,因为对于开发者而言与数据库所接触的更多的是查询数据库里面的数据。