个人技术分享

1. INNER JOIN(内连接)

内连接返回两个表中匹配的记录。如果表A的某行在表B中没有匹配,那么这行不会出现在结果集中。

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

2. LEFT JOIN(左连接)

左连接返回左表(LEFT JOIN左边的表)的所有记录,即使在右表中没有匹配。如果右表中没有匹配,则结果为NULL。

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

3. RIGHT JOIN(右连接)

与左连接相反,右连接返回右表(RIGHT JOIN右边的表)的所有记录,即使左表中没有匹配。如果左表中没有匹配,则结果为NULL。

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

4. FULL OUTER JOIN(全外连接)

MySQL本身不直接支持FULL OUTER JOIN,但可以通过UNION来模拟实现,同时获取左连接和右连接的结果集。

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID
UNION
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

5. CROSS JOIN(交叉连接)

交叉连接返回左表的每一行与右表的每一行的笛卡尔积,即结果集中每一行都是左表某一行与右表某一行的组合。

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
CROSS JOIN Customers;

使用表别名和WHERE条件

为了提高可读性和效率,可以给表起别名,并在JOIN语句中明确指定连接条件。

SELECT o.OrderID, c.CustomerName
FROM Orders AS o
INNER JOIN Customers AS c ON o.CustomerID = c.CustomerID
WHERE o.OrderDate > '2023-01-01';