SQL 中 JOIN 相关子句是用于将两个或者多个表结合起来,进行相关操作。下面是一些关于 JOIN 的的功能描述,后面会进行详细的分析对比总结。

类型作用
1Join(Inner Join)内连接如果表之后至少有一个匹配,则返回行
2Left Join 左连接返回左表所有的行,右表返回匹配行,不匹配的返回 NULL
3Right Join 右连接返回由表所有的行,左表返回匹配行,不匹配的返回 NULL
4Full Join 全连接只要其中一个表存在匹配,则返回行

下面将对每个查询进行分析和演示

测试表分别为:

city 表
picture 0 table_city-1738921011497

school 表
picture 1 table_school-1738921032104

Join/Inner Join

Join 和 Inner Join 是相同的,表示在两个表中均匹配时返回行,他们操作图如下:
picture 2 inner_join-1738921291077
Join/Inner Join 语法
其对应的语法如下:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

-- 或者

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name = table2.column_name;

演示:

-- Inner Join
SELECT city.`name`,city.city,school.school
FROM city
INNER JOIN school
ON city.`name` = school.`name`

结果:
picture 3 inner_join_result-1738921292302
从结果中可以发现,他返回的是满足 ON 条件(city.`name` = school.`name`)的,where 后面的目标查询(city.`name`,city.city,school.school)内容。

Left Join

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。他们的操作图如下:
picture 4 left_join-1738921293412
Left Join 语法
语法:

-- 常用
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

-- 或者(在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN)
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name = table2.column_name;

演示:

-- Left JOIN
SELECT city.`name`,city.city,school.school
FROM city
LEFT JOIN school
ON city.`name` = school.`name`

结果:
picture 5 left_join_result-1738921294363
从结果可以发现,返回的内容中,以左表 city 为准全部返回,右表 school 中满足条件的则返回对应目标查询内容,不满足的返回 NULL。

Right Join

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。他和 Left Join 刚好相反。其对应的操作图如下:

picture 6 right_join-1738921295500
Right Join 语法
语法:

-- 常用
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

-- 或者
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name = table2.column_name;

演示:

-- Right JOIN
SELECT city.`name`,city.city,school.school
FROM city
RIGHT JOIN school
ON city.`name` = school.`name`

结果:

picture 7 right_join_result-1738921296789
从结果可以发现,Right Join 是以右表为准,返回所有目标查询数据,左表中满足 ON 条件的返回对应目标查询数据,不满足的返回 NULL。

Full Join

注意:MySQL 是不支持 FULL JOIN 这个操作的哈
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.它相当于是 LEFT JOIN 和 RIGHT JOIN 的结合。其对应的操作图如下:
picture 8 full_join-1738921298062
Full Join 语法
语法:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;

Full Join 使用相对较少,这里不进行演示,感兴趣的同学,可以自行进行操作。

总结

  1. A Inner Join B:类似于取 A 和 B 的交集,只取满足条件的相交部分。
  2. A Left Join B:左连接,以左表 A 为基础,取 A 表的全部行,B 满足 On 条件的取对应行,不满足的取 NULL。
  3. A Right Join B:有连接,以右表 B 为基础,取 B 表的全部行,A 满足 On 条件的取对应行,不满足的取 NULL。
  4. A Full Outer Join B:类似于取 A 和 B 的并集。全都取,但彼此没有对应的值就取 NULL。

WHERE 和 ON 的区别

数据库在通过连接两张或多张表的相关操作时候,会生成一张中间的临时表,然后再将这张临时表返回给用户。

下面以 Left Join 为例,使用 ON 和 Where 条件的区别如下:

  • ON 条件是在生成临时表时使用的条件,它不管 ON 中的条件是否满足,都会返回左表中的数据。
  • WHERE 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

演示
两张表分别如下:
tab1 表
picture 9 where_on_demo_tab1-1738921926606
tab2 表
picture 10 where_on_demo_tab2-1738921927659

where 语句

select *
from tab1
left join tab2
on (tab1.size = tab2.size)
where tab2.name='AAA'

where 语句执行过程
picture 11 where_result-1738921928764

on 语句

select *
from tab1
left join tab2
on (tab1.size = tab2.size
    and tab2.name='AAA')

on 语句执行过程
picture 12 on_result-1738921930215