SQL查询语句,连接查询知识总结。
| 一 . 有哪些连接查询
连接查询包括外连接:LEFT JOIN、RIGHT JOIN、FULL JOIN,以及内连接:INNER JOIN。本文重点总结LEFT JOIN,其他连接查询不一一举例。
| 二 . 左连接LEFT JOIN
1)原理:
LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的数据在右表没有匹配到,那么右表字段返回NULL。
![5894625ec0fbb75b9565d77aa81d8f36.png](https://img-blog.csdnimg.cn/img_convert/5894625ec0fbb75b9565d77aa81d8f36.png)
score表:
结论:不管on后面是什么条件,都会返回左表所有行数据,然后再根据on 后面的条件视情况返回右表字段的数据。
举栗:
2.1)and 1= 1,这个条件为真,所以返回左表所有数据,右表返回所有满足条件的数据。
2.2)and 1=0,这个条件为否,但是不影响返回左表所有的值,只不过右表全部返回NULL
2.3)即使少了连接条件,左表也返回所有数据
2.4)限定左表字段条件。先左表返回所有数据,连接右表的时候,左表先过滤class_name=语文的数据,然后和右表关联,然后右表返回满足条件的数据。
2.5)限定右表字段条件。左表返回所有数据,右表先过滤出Score=65的数据,再与左表关联
3)使用on过滤数据和在where里面过滤数据区别
- 在on后面加过滤条件
- 使用where过滤条件
可以看出区别:
使用on过滤数据:先返回左表所有数据(因为左连接要返回左表所有数据),然后过滤A.class_name=语文的数据,最后再用过滤后的左表数据与右边进行关联。也即先过滤数据,再关联。
使用where过滤数据:是先关联查询,然后再对结果进行过滤。
4)重复数据现象
关联字段,左右表存在1对多的情况的时候,特别注意重复数据,如下图:class_id 在右表有两条数据的class_id都等于1。
此时关联查询结果,左表部分会有重复数据,如下图:
参考资料
https://www.cnblogs.com/abclife/p/9559658.html
![fa117a6ff10119c37076d63dc7d3cc1b.png](https://img-blog.csdnimg.cn/img_convert/fa117a6ff10119c37076d63dc7d3cc1b.png)