外观
MySQL 的连接查询
MySQL
的连接查询是从多个相关表中获取数据的操作,可将两张或多张表中的数据根据某些条件组合在一起,返回一个联合结果集。主要有以下几种类型:
- 内连接(
INNER JOIN
)- 含义:仅返回两个表中满足连接条件的记录。
- 语法:
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段;
- 示例:
SELECT users.username, orders.order_id FROM users INNER JOIN orders ON users.user_id = orders.user_id;
,该语句会返回所有在users
表和orders
表中都有匹配记录的用户和他们的订单。
- 左连接(
LEFT JOIN
或LEFT OUTER JOIN
)- 含义:返回左表中的所有记录,即使右表中没有匹配的记录。如果右表没有匹配,则结果为
NULL
。 - 语法:
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 表1.字段 = 表2.字段;
- 示例:
SELECT users.username, orders.order_id FROM users LEFT JOIN orders ON users.user_id = orders.user_id;
,会返回所有用户以及他们的订单,若某个用户没有订单,则相应的订单ID
将为NULL
。
- 含义:返回左表中的所有记录,即使右表中没有匹配的记录。如果右表没有匹配,则结果为
- 右连接(
RIGHT JOIN
或RIGHT OUTER JOIN
)- 含义:返回右表中的所有记录,即使左表中没有匹配的记录。如果左表没有匹配,则结果为
NULL
。 - 语法:
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
- 示例:
SELECT users.username, orders.order_id FROM users RIGHT JOIN orders ON users.user_id = orders.user_id;
,会返回所有订单以及对应的用户,若某个订单没有匹配的用户,则相应的用户名将为NULL
。
- 含义:返回右表中的所有记录,即使左表中没有匹配的记录。如果左表没有匹配,则结果为
- 全连接(
FULL JOIN
或FULL OUTER JOIN
)- 含义:返回左表和右表中的所有记录,如果没有匹配则返回
NULL
。MySQL 不直接支持FULL JOIN
,可以通过UNION
实现。 - 语法:
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 表1.字段 = 表2.字段 UNION SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
- 含义:返回左表和右表中的所有记录,如果没有匹配则返回
- 交叉连接(
CROSS JOIN
)- 含义:返回两个表的笛卡尔积,即两个表中所有可能的组合。
- 语法:
SELECT 字段列表 FROM 表1 CROSS JOIN 表2;
- 示例:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers CROSS JOIN Orders;
- 自连接
- 含义:在同一个表内进行连接操作,通常用于在表中查找相关联的信息。
- 语法:
SELECT a.column1, b.column2 FROM table AS a, table AS b WHERE a.column = b.column;
- 示例:
SELECT e1.EmployeeName AS Employee, e2.EmployeeName AS Manager FROM Employees AS e1, Employees AS e2 WHERE e1.ManagerID = e2.EmployeeID;