一次讲清SQL的各种内外查询连接

一次讲清SQL的各种内外连接查询

在MySQL中,连接(JOIN)操作用于从两个或多个表中检索相关数据。主要的连接类型包括内连接、外连接和自连接,以及交叉连接等。以下是对这些连接类型的详细解释:

一、内连接(INNER JOIN)

内连接是最常用的连接方式,它返回两个表中匹配的记录。如果在一个表中有记录而在另一个表中没有匹配的记录,则这些记录不会出现在结果中。

  • 语法
1
2
3
4
SELECT columns
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;
  • 示例

假设有两个表,employees(员工表)和departments(部门表),要查询每个员工及其所在的部门名称,可以使用内连接:

1
2
3
4
SELECT e.name AS employee_name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;

二、外连接(OUTER JOIN)

外连接返回两个表中匹配的记录以及一个表中的所有记录(即使在另一个表中没有匹配项)。外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。需要注意的是,MySQL本身不直接支持全外连接,但可以通过联合左连接和右连接的结果来模拟全外连接。

  • 左外连接(LEFT JOIN)

返回左表的所有记录,以及右表中匹配的记录。如果左表中的记录在右表中没有匹配项,则结果中这些记录的右表部分将包含NULL。

  • 语法
1
2
3
4
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;
  • 示例

查询每个员工及其所在的部门名称,包括那些没有部门的员工:

1
2
3
4
SELECT e.name AS employee_name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;
  • 右外连接(RIGHT JOIN)

返回右表的所有记录,以及左表中匹配的记录。如果右表中的记录在左表中没有匹配项,则结果中这些记录的左表部分将包含NULL。

  • 语法
1
2
3
4
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;
  • 示例

(假设有一个与employees表相关的另一个表,为了示例需要,这里不具体给出表结构和数据)

1
2
3
4
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

这个查询会返回table2的所有行,以及table1中与table2匹配的行。

  • 全外连接(FULL OUTER JOIN,MySQL不直接支持,但可通过UNION模拟)

结合左连接和右连接的功能,返回左表和右表中所有的记录。如果左表中的某行在右表没有匹配,或者右表中的某行在左表没有匹配,则这些行的另一侧将包含NULL。

  • 模拟语法
1
2
3
4
5
6
7
8
9
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field
UNION
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

三、自连接(SELF JOIN)

一个表与其自身连接,通常用于查找表中与其他记录相关的数据。当表中记录之间存在关系,需要比较同一表中的不同记录时使用。

  • 语法
1
2
3
4
SELECT a.columns, b.columns
FROM table a
JOIN table b
ON a.common_field = b.related_field;
  • 示例

查询每个员工及其部门中其他员工的名字(例如,寻找与同部门员工相关的记录):

1
2
3
4
5
SELECT e1.name AS employee_name, e2.name AS colleague_name
FROM employees e1
JOIN employees e2
ON e1.department_id = e2.department_id
WHERE e1.employee_id != e2.employee_id;

四、交叉连接(CROSS JOIN)

交叉连接返回两个表的笛卡尔积,即将第一个表的每一行与第二个表的每一行进行配对。这种类型的连接不需要指定连接条件,因为它简单地将所有可能的行组合在一起。通常不带WHERE子句使用,因为它会返回大量的数据。

  • 语法
1
2
3
SELECT columns
FROM table1
CROSS JOIN table2;
  • 示例

(假设有两个表table1table2,为了示例需要,这里不具体给出表结构和数据)

1
2
3
SELECT columns
FROM table1
CROSS JOIN table2;

这个查询将产生一个结果集,其中包含table1中的每一行与table2中的每一行的所有组合。

总结

以上就是对MySQL中各种连接类型的详细解释和示例。在实际应用中,应根据具体需求选择合适的连接类型来检索相关数据。


一次讲清SQL的各种内外查询连接
https://dreamshao.github.io/2024/11/18/sql/
作者
Yun Shao
发布于
2024年11月18日
许可协议