工作面试必备:SQL 中的各种连接 JOIN 的区别总结

前言

尽管大多数开发者在日常工作中经常用到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区别和用法。

SQL连接JOIN图解

数据库表结构和对应数据

本文咱们用的是MS Sql Server作为数据操作示例。

Students 学生表:

Class 班级表:

Join(where联立查询)

概念:用于两表或多表之间数据联立查询。

vbnet 复制代码
select * from Students s,Class c where s.ClassId=c.ClassId

Inner Join(内连接查询)

概念:与Join相同,两表或多表之间联立查询数据,因此我们在使用多表join查询的时候既可以使用where关联,也可以是inner join关联查询。

vbnet 复制代码
select * from Students s inner join  Class c  on s.ClassId=c.ClassId

Left Join(左连接查询)

概念:以左表中的数据为主,即使与右表中的数据不匹配也会把左表中的所有数据返回。

vbnet 复制代码
select * from Students s left join  Class c on s.ClassId=c.ClassId

Right Join(右连接查询)

概念:与Left Join的用法相反,是以右表中的数据为主,即使左表中不存在匹配数据也会把右表中所有数据返回。

vbnet 复制代码
select * from Students s right join  Class c  on s.ClassId=c.ClassId

Full Join(全连接查询)

概念:返回表中所有的数据数据,无论匹配与否。

vbnet 复制代码
select * from Students s Full JOIN  Class c  on s.ClassId=c.ClassId

On、Where的异同

这两个概念中也是绝大多数人无法区分到底它们两者之间有何区别,我什么时候使用On,什么时候使用Where,下面将分别展示两者的异同。

On条件的作用:

ON的使用无论是左右内全都使用到了On来进行关联!

对于inner join 的作用就是起到了与where相同的作用条件筛选:

vbnet 复制代码
select * from Students s inner join  Class c  on s.ClassId=c.ClassId and s.Sex='男'

对于左右连接而言,无论查询条件是否满足都会返回对应所指向的那边的所有数据:

vbnet 复制代码
select * from Students s left join  Class c  on s.ClassId=c.ClassId and s.Sex='男'

对于Full Join 而言无论,只有同时满足的时候才会返回全部关联的数据,假如有一方不满足返回以左边的表数据为基准返回:

vbnet 复制代码
--全连接
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='男' 

WHERE条件的作用:

WHERE条件在临时表生成后的过滤阶段应用,对最终结果进行筛选。此时LEFT JOIN的"保留左表所有记录"特性已失效,WHERE 会过滤掉不符合条件的行(包括左表记录),如下所示:

仅返回右表 ClassId=1 的匹配记录,左表中无匹配的记录会被过滤掉。

vbnet 复制代码
select * from Students s left join Class c on s.ClassId=c.ClassId WHERE c.ClassId=1

区别总结:

一句话概括:ON用作于生成临时表时的条件筛选,WHERE用作于对临时表中的记录进行过滤。

  • ON条件是在生成临时表时使用的条件,它不管ON中的条件是否为真,都会返回左边表中的记录(以左连接为例)。
  • WHERE条件是在临时表生成好后,再对临时表产生的数据进行过滤条件筛选。
相关推荐
qq_297574677 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
此刻你11 小时前
常用的 SQL 语句
数据库·sql·oracle
山岚的运维笔记13 小时前
SQL Server笔记 -- 第14章:CASE语句
数据库·笔记·sql·microsoft·sqlserver
中二病码农不会遇见C++学姐15 小时前
SQLiteStudio 下载安装指南
sql
一碗面42115 小时前
SQL性能优化:让数据库飞起来
数据库·sql·性能优化
June bug15 小时前
【高频SQL基础版】排序和分组
数据库·sql
计算机程序设计小李同学15 小时前
基于 Spring Boot + Vue 的龙虾专营店管理系统的设计与实现
java·spring boot·后端·spring·vue
怣5016 小时前
MySQL多表连接完全指南:内连接与外连接超详细讲解
数据库·sql·mysql
Charlie_lll17 小时前
力扣解题-[3379]转换数组
数据结构·后端·算法·leetcode
VX:Fegn089517 小时前
计算机毕业设计|基于springboot + vue云租车平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计