1、多表连接查询
可分为:
- 内连接(inner join)
- 左外连接(left join)
- 又外连接(right join)
- 交叉连接(cross join)- 笛卡尔积
- 全连接(full join)
先假设有两张表tab1和tab2:
- tab1
id | age |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
- tab2
age | name |
---|---|
10 | 张三 |
20 | 李四 |
30 | 王五 |
1.1 内连接
#内连接(取两表交集)
SELECT * FROM tab1 a inner join tab2 b on a.age = b.age
#等同于
SELECT * FROM tab1 a ,tab2 b where a.age = b.age
1.2 左外连接
#左外连接
SELECT * FROM tab1 a left join tab2 b on a.age = b.age and b.name = '张三' order by id
1.3 右外连接
#右外连接
SELECT * FROM tab1 a right join tab2 b on a.age = b.age and b.name = '张三' order by b.age
1.4 交叉连接
#交叉连接(笛卡尔积)
SELECT * FROM tab1 a cross join tab2 b
各增一行数据
- tab1
id | age |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
4 | 40 |
- tab2
age | name |
---|---|
10 | 张三 |
20 | 李四 |
30 | 王五 |
60 | 马六 |
1.5 全连接
- mysql中
#全连接
SELECT * FROM tab1 a left join tab2 b on a.age = b.age
union
SELECT * FROM tab1 a right join tab2 b on a.age = b.age
- oracle中
#全连接
selcet * from tab1 a full join tab2 b on a.age = b.age
1.6 外连接总结
可以理解为就是以哪个表为基准表,在外连接查询结果中,基础表中的数据即使没有外键关联,也会被查询出来
--((+)加在右表,表示以左表为基准表left join)
--((+)加在左表,表示以右表为基准表right join)
select empno,ename,dname from emp2 e,dept d where e.deptno=d.deptno(+);
1.7 在使用外连接查询时,on和where条件的区别
- sql1
select * from tab1 a left join tab2 b on (a.age = b.age) where b.name = '张三'
- sql2
select * from tab1 a left join tab2 b on (a.age = b.age and b.name = '张三')
sql1的执行过程
sql2的执行过程
1.8 on和where区别总结
on
条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。where
条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
总之:在外连接查询中
- ON可以理解为是在两张表中进行条件筛选(即,在生成临时中间表时候
进行条件筛选),满足条件的则展示左右表拼接的数据记录,不满足条件
的,则优先展示左表中的数据,右表中不满足条件的字段为NULL。- WHERE则可以理解为是在一张表上进行条件过滤(即,将生成的临时表看作一张表)
其实以上结果的关键原因就是left join
,right join
,full join
的特殊性,不管on
上的条件是否为真都会返回left或right表中的记录,full
则具有left和right的特性的并集。 而inner jion
没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/189445.html