连接
连接
当外连接(LEFT JOIN, RIGHT JOIN和FULL JOIN)不带连接条件时,等于笛卡尔积,即交叉连接的效果。
类型 | 关键字 | 讲解 |
---|---|---|
内连接 | (INNER) JOIN | 只有当两个表都存在满足条件的记录时才会返回行。 |
左(外)连接 | LEFT (OUTER) JOIN | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 |
右(外)连接 | RIGHT (OUTER) JOIN | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 |
全(外)连接 | FULL (OUTER) JOIN | 只要其中有一个表存在满足条件的记录,就返回行。 |
交叉连接 | CROSS JOIN | 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。 |
类型
内连接
JOIN
,INNER JOIN
:如果表中有至少一个匹配,则返回行外连接
LEFT JOIN
:即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN
:即使左表中没有匹配,也从右表返回所有的行FULL JOIN
:只要其中一个表中存在匹配,则返回行
交叉连接
CROSS JOIN
:笛卡尔积,即一般情况下FROM多个表直接默认简写的。将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。 换句话说,交叉连接返回两个表中行的笛卡尔积。
与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。
自连接 SELF JOIN
将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。
自联接用于将表连接到自身(同一个表)。 它对于查询分层数据或比较同一个表中的行很有用。自联接使用内连接或左连接子句。 由于使用自联接的查询引用同一个表,因此表别名用于为查询中的表分配不同的名称
SELECT
a.Name 'Employee'
FROM
Employee a,
Employee b
WHERE
a.ManagerId = b.Id
AND a.Salary > b.Salary
;
查询工资比他经理的工资还高的员工的姓名
SELECT
a.NAME AS Employee
FROM Employee a JOIN Employee b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
;
ON
:更加灵活,可以有多种条件以及函数USING()
:更加简洁,且可以有效去除重复子段,但是仅能用于两个表子段名称相同且值相等的情况
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left join 时,on 和 where 条件的区别如下:
- on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
对比
MySQL 中的 UNION 和 JOIN 是两种不同的操作,它们的作用和使用场景也不同。
UNION 是用于合并两个或多个 SELECT 语句的结果集,它会将多个结果集合并成一个结果集,并去除重复的行。UNION 操作的语法如下:
SELECT column1, column2, ... FROM table1
UNION [ALL]
SELECT column1, column2, ... FROM table2;
其中,UNION
表示合并两个结果集并去除重复的行,UNION ALL
表示合并两个结果集但不去除重复的行。
JOIN 是用于将两个或多个表中的数据进行关联的操作,它会根据指定的条件将两个表中的数据进行匹配,并返回匹配的结果。JOIN 操作的语法如下:
SELECT column1, column2, ...
FROM table1
JOIN table2 ON condition;
其中,JOIN
表示内连接,只返回两个表中匹配的行,LEFT JOIN
和 RIGHT JOIN
表示左连接和右连接,会返回左表或右表中的所有行,即使没有匹配的行。
总的来说,UNION 用于合并结果集,而 JOIN 用于关联表中的数据。在使用时需要根据具体的需求选择合适的操作。