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';