今天在学习Mybatis一对一,一对多,多对多查询的时候突然发现自己已经把多表查询忘光了,然后看了一下博客,发现自己竟然没有做这一部分的笔记,简直了,所以,就先把这一部分补上,同时增强一下记忆。
多表查询
一、合并结果集
1、合并结果集的要求:
- 合并的两个结果集中,列的类型和列数相同
-
union
,去除重复行 -
union all
,不去除重复行
2、创建两张表,并插入数据
3、进行合并结果集
SELECT * FROM ab
UNION ALL
SELECT * FROM cd;
SELECT * FROM ab
UNION
SELECT * FROM cd;
二、连接查询
1、连接查询的分类:
- 内连接
- 外链接
- 左外链接
- 右外链接
- 全外链接(mysql不支持)
- 自然连接
2、内连接:
MySQL版本:select * from 表1 别名1,表2 别名2 where 别名1.列名=别名2.列名
标准版本:select * from 表1 别名1 inner join 表2 别名2 on 别名1.列名=别名2.列名
内查询会将所有不符合条件的记录去除。
3、外连接:
左外连接:select * from 表1 别名1 left outer join 表2 别名2 on 别名1.列名=别名2.列名
左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能查询出来,左表不满足条件的记录,会在右表示为null
右外连接:select * from 表1 别名1 right outer join 表2 别名2 on 别名1.列名=别名2.列名
右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能查询出来,右表不满足条件的记录,会在左表中表示为null
4、全外连接:
我们可以通过union
关键字来实现全外连接:
select * from 表1 别名1 left outer join 表2 别名2 on 别名1.列名=别名2.列名
union
select * from 表1 别名1 right outer join 表2 别名2 on 别名1.列名=别名2.列名
4、自然连接:
自然连接可以使内连接也可以是外连接,语法就是在sql语句中的right outer
、left outer
前加natural
,和将inner
换为natural
,且去掉条件。用的不多。
三、子查询
子查询出现的位置
select
from 子查询
where 子查询
在where
后的子查询,就是将子查询的结果作为判断条件,比如我们想查询一个公司中工资最高的人的详细信息我们就可以用到子查询
select *
from emp
where salary=(select max(salary) from emp);
在from
后的子查询,是将子查询的结果作为一个表进行二次查询