1.1 INNER JOIN(内连接)
内连接是最常见的连接查询,它只返回两个表中匹配条件的数据。如果某一行在其中一个表中不存在对应的匹配行,那么该行将不会出现在结果集中。
语法:
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
示例:
假设有两个表:
-
orders
表(存储订单信息) -
customers
表(存储客户信息)
我们希望查询每个订单对应的客户信息:
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
此查询返回订单和客户的匹配结果,仅显示那些在 orders
表中有订单,并且在 customers
表中有对应客户的记录。
1.2 LEFT JOIN(左连接)
左连接返回左表中的所有行,即使右表中没有匹配的数据,右表中的数据为空(NULL
)。
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
示例:
我们希望查询所有订单,包括那些没有匹配到客户的订单:
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;
此查询会显示所有订单,即使某些订单的客户信息缺失。
1.3 RIGHT JOIN(右连接)
右连接与左连接相反,它返回右表中的所有行,即使左表中没有匹配的数据。
语法:
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例:
我们希望查询所有客户,包括那些没有下订单的客户:
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
此查询会显示所有客户信息,包含那些没有订单的客户。
1.4 FULL JOIN(全连接)
全连接返回两个表中的所有行,不论是否匹配。MySQL 本身不直接支持 FULL JOIN
,但可以通过使用 UNION
结合 LEFT JOIN
和 RIGHT JOIN
来实现全连接。
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例:
返回所有客户和订单,不论是否有匹配关系:
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
1.5 CROSS JOIN(交叉连接)
交叉连接会返回两个表的笛卡尔积,即每一个表中的行都和另一个表中的每一行进行组合,不考虑是否有匹配条件。
语法:
SELECT columns
FROM table1
CROSS JOIN table2;
示例:
查询所有产品与所有订单的组合:
SELECT products.product_name, orders.order_id
FROM products
CROSS JOIN orders;
此查询返回所有产品和订单的每一种组合。