SQL LEFT JOIN

SQL LEFT JOIN 关键字

LEFT JOIN 是 SQL 中的一个连接关键字,用于从多个表中提取数据。

LEFT JOIN 与 INNER JOIN 不同之处在于,LEFT JOIN 会返回左表中的所有记录,即使在右表中没有匹配的记录。

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SQL LEFT JOIN 语法

SELECT column_name(s)

FROM table1

LEFT JOIN table2

ON table1.column_name=table2.column_name;

或:

SELECT column_name(s)

FROM table1

LEFT OUTER JOIN table2

ON table1.column_name=table2.column_name;

注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。

  • table1:左表(主表),LEFT JOIN 会保留该表的所有记录。
  • table2:右表(从表),如果没有匹配的数据,用 NULL 填充对应的列。
  • ON table1.column_name=table2.column_name:指定连接条件,通常是两个表的共同字段。

SQL LEFT JOIN

特点:

  • 返回左表中的所有记录,即使右表没有匹配的数据。
  • 如果右表没有匹配的记录,结果中该行右表字段为 NULL

假设有两个表:CustomersOrders

Customers 表

CustomerID Name
1 Alice
2 Bob
3 Charlie
4 David

Orders 表

OrderID CustomerID Product
101 1 Laptop
102 2 Smartphone

使用 LEFT JOIN 查询:

SELECT Customers.Name, Orders.Product

FROM Customers

LEFT JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

查询输出结果

Name Product
Alice Laptop
Bob Smartphone
Charlie NULL
David NULL

解释LEFT JOIN 返回了 Customers 表中的所有记录。对于 CharlieDavid,由于在 Orders 表中没有匹配的 CustomerID,它们对应的 Product 列为 NULL


演示数据库

在本教程中,我们将使用 ez4code 样本数据库。

下面是选自 "Websites" 表的数据:


+----+--------------+---------------------------+-------+---------+

| id | name         | url                       | alexa | country |

+----+--------------+---------------------------+-------+---------+

| 1  | Google       | https://www.google.cm/    | 1     | USA     |

| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |

| 3  | 易知码      | http://www.ez4code.com/    | 4689  | CN      |

| 4  | 微博          | http://weibo.com/         | 20    | CN      |

| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |

| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |

+----+---------------+---------------------------+-------+---------+

下面是 "access_log" 网站访问记录表的数据:


mysql> SELECT * FROM access_log;

+-----+---------+-------+------------+

| aid | site_id | count | date       |

+-----+---------+-------+------------+

|   1 |       1 |    45 | 2016-05-10 |

|   2 |       3 |   100 | 2016-05-13 |

|   3 |       1 |   230 | 2016-05-14 |

|   4 |       2 |    10 | 2016-05-14 |

|   5 |       5 |   205 | 2016-05-14 |

|   6 |       4 |    13 | 2016-05-15 |

|   7 |       3 |   220 | 2016-05-15 |

|   8 |       5 |   545 | 2016-05-16 |

|   9 |       3 |   201 | 2016-05-17 |

+-----+---------+-------+------------+

9 rows in set (0.00 sec)


SQL LEFT JOIN 实例

下面的 SQL 语句将返回所有网站及他们的访问量(如果有的话)。

以下实例中我们把 Websites 作为左表,access_log 作为右表:

实例

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

执行以上 SQL 输出结果如下:

注释:LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。