SQL 中的各种连接 JOIN 的区别总结!

墨韵书香 / 03-18 / 3点赞 / 0评论 / 839阅读
## 前言 尽管大多数开发者在日常工作中经常用到Join操作,如Inner Join、Left Join、Right Join等,但在面对特定查询需求时,选择哪种Join类型以及如何使用On和Where子句往往成为一大挑战。特别是对于初学者而言,这些概念可能显得抽象且难以区分。在实际应用中,错误地使用Join类型或混淆On与Where子句的功能,都可能导致数据查询结果的不准确或遗漏关键信息。 **今天大姚给大家讲解一下SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、Where区别和用法。** - 全面的C#/.NET/.NET Core面试宝典(永久免费) - 互联网寒冬下,如何写好一份.NET求职简历?附带简洁简历模板和简历优化服务来了!!! ## SQL连接JOIN图解 ![](https://cdn.res.knowhub.vip/c/2503/18/f7e0cbec.png?G1cAAMTsdJxI8qGh26hD2jvFHc2ARRpBpYT1es9Z%2byb6fgcjxWe0Pn1%2f%2bE3r00lUL6mVwMisCEEMnAqDswYpKrAipnENBw%3d%3d) ## 数据库表结构和对应数据 > 本文咱们用的是MS Sql Server作为数据操作示例。 ### Students 学生表: ![](https://cdn.res.knowhub.vip/c/2503/18/84ce7d23.png?G1cAAMTsdJxIPiSl26hD2jvFHc2ARRpBpYT1es9Z%2byb6fheWHJ%2fR%2bvT94TetTyekZKiVhEU5IQRcwrmgmGiAmGqGGeIaDg%3d%3d) ### Class 班级表: ![](https://cdn.res.knowhub.vip/c/2503/18/473a1949.png?G1YAAMTW3Dgp8BhF22gDdWfqnTYDElkElRLW6917rpvo%2bwOMkp9e24j14S%2b1jSBRNXEnMA5WJC8nuFxwhaXibm6mmmcP) ## Join(where联立查询) 概念:用于两表或多表之间数据联立查询。 ```csharp select * from Students s,Class c where s.ClassId=c.ClassId ``` ![](https://cdn.res.knowhub.vip/c/2503/18/70cb7b25.png?G1cAAOTcVkxwvwe2iOF0Q2CDZsAijaBSwnq956x9A3x%2fMLLmZ7Q%2bY3%2f4TeszgEQuqhUY2VCQAjmjFmWqJZEWE3cVy2sE) ## Inner Join(内连接查询) 概念:与Join相同,两表或多表之间联立查询数据,因此我们在使用多表join查询的时候既可以使用where关联,也可以是inner join关联查询。 ```csharp select * from Students s inner join Class c on s.ClassId=c.ClassId ``` ![](https://cdn.res.knowhub.vip/c/2503/18/4f54d8f0.png?G1cAAMT0bJxoryhsox%2f6n3gkNAMWaQSVEtbrvXefRvT9JizRP7OPZefDb%2fpYRghBUSsJS%2bIAF5CFY0klZjhkVYYy4Pc0) ## Left Join(左连接查询) 概念:以左表中的数据为主,即使与右表中的数据不匹配也会把左表中的所有数据返回。 ```csharp select * from Students s left join Class c on s.ClassId=c.ClassId ``` ![](https://cdn.res.knowhub.vip/c/2503/18/3b1592e3.png?G1UAAETn9LwUoOjCvtMdbIlTE20GJLIIKiWs13vO2jfR94eyWn5G6zP2h7%2b0PoMEqOJOyloYSFouZXOBoSZjURRGXiMA) ## Right Join(右连接查询) 概念:与Left Join的用法相反,是以右表中的数据为主,即使左表中不存在匹配数据也会把右表中所有数据返回。 ```csharp select * from Students s right join Class c on s.ClassId=c.ClassId ``` ![](https://cdn.res.knowhub.vip/c/2503/18/91c2db87.png?G1cAAOTcVkxwP3i2iOF0Q2CDZsAijaBSwnq956x9A3x%2fMLLmZ7Q%2bY3%2f4TeszgEQKuQMjGwpSoMqozuXimsjUqqoL5TUC) ## Full Join(全连接查询) 概念:返回表中所有的数据数据,无论匹配与否。 ```csharp select * from Students s Full JOIN Class c on s.ClassId=c.ClassId ``` ![](https://cdn.res.knowhub.vip/c/2503/18/c245ecbe.png?G1cAAER17rxg7Rgofice0wSBBJsBizSCSgnr9fz%2f2pfI%2b7lCLd6j9en7w29any5MqbBWUWhGQgg8FFaNBAMzrJxAYVzDAQ%3d%3d) ## On、Where的异同 这两个概念中也是绝大多数人无法区分到底它们两者之间有何区别,我什么时候使用On,什么时候使用Where,下面将分别展示两者的异同。 ### On条件的作用: > ON的使用无论是左右内全都使用到了On来进行关联! **对于inner join 的作用就是起到了与where相同的作用条件筛选:** ```csharp select * from Students s inner join Class c on s.ClassId=c.ClassId and s.Sex='男' ``` ![](https://cdn.res.knowhub.vip/c/2503/18/64214114.png?G1cAAMTsdJxI8oGm26hD2jvFHc2ARRpBpYT1es9Z%2byb6fgcjxWe0Pn1%2f%2bE3r00lUi5gRGJkVIUgFJ8uZqwapJjBwuuIaDg%3d%3d) **对于左右连接而言,无论查询条件是否满足都会返回对应所指向的那边的所有数据:** ```csharp select * from Students s left join Class c on s.ClassId=c.ClassId and s.Sex='男' ``` ![](https://cdn.res.knowhub.vip/c/2503/18/795f115e.png?G1cAAMTsdJzIJxGq26hD2jvFHc2ARRpBpYT1es9Z%2byb6fhdIis9offr%2b8JvWpxOrZq6VBGJQhMBFYEC5YIEVCci1aFzDAQ%3d%3d) **对于Full Join 而言无论,只有同时满足的时候才会返回全部关联的数据,假如有一方不满足返回以左边的表数据为基准返回:** ```csharp --全连接select * from Students s full join Class c on s.ClassId=c.ClassId --全连接加on查询select * from Students s full join Class c on s.ClassId=c.ClassId and s.Sex='男' ``` ![](https://cdn.res.knowhub.vip/c/2503/18/2b33ca25.png?G1UAAMTsdJxIPiGq26hD2jvFHc2ARBZBpYT1es9Z%2byb6fheWFJ%2fR%2bvT94S%2btTyeoGmolYcmsCBpFOLOgwMIFBcMQ13A%3d) ![](https://cdn.res.knowhub.vip/c/2503/18/1d52d8a6.png?G1YAAMTsdJxI8pCm26hD2jvFHc2ARBZBpYT1es9Z%2byb6fgcjx2e0Pn1%2f%2bEvr00lSqmJGYBROCF4UXBg1mwVTuUShHNdw) ### WHERE条件的作用: WHERE条件在临时表生成后的过滤阶段应用,对最终结果进行筛选。此时LEFT JOIN的“保留左表所有记录”特性已失效,WHERE 会过滤掉不符合条件的行(包括左表记录),如下所示: > 仅返回右表 `ClassId=1` 的匹配记录,左表中无匹配的记录会被过滤掉。 ```csharp select * from Students s left join Class c on s.ClassId=c.ClassId WHERE c.ClassId=1 ``` ### 区别总结: > 一句话概括:ON用作于生成临时表时的条件筛选,WHERE用作于对临时表中的记录进行过滤。 - ON条件是在生成临时表时使用的条件,它不管ON中的条件是否为真,都会返回左边表中的记录(以左连接为例)。 - WHERE条件是在临时表生成好后,再对临时表产生的数据进行过滤条件筛选。