目录
语法
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;
LEFT JOIN
(或称为左外连接)是SQL中的一种连接类型,它用于从两个或多个表中基于连接条件返回左表(LEFT JOIN语句左侧的表)的所有记录,以及右表中满足连接条件的记录。如果左表中的某行在右表中没有匹配行,则结果中该行的右表部分将包含NULL。
table1
是左表,即你希望从中获取所有记录的表。table2
是右表,即你希望根据连接条件从左表中获取匹配记录的表。common_field
是两个表中用于连接的共同字段。
使用LEFT JOIN
时,如果右表(departments
在上述示例中)有多行与左表(employees
)中的某一行相匹配,结果中将包括左表的这一行与右表中所有匹配行的组合。这可能导致结果集中有多行具有相同的左表数据但不同的右表数据。
如果查询目的是获取右表中的所有记录,并且当左表中没有匹配项时,这些记录也应被包括在内,则应该使用RIGHT JOIN
。然而,由于SQL标准的可移植性考虑,通常建议通过改变表的顺序和使用LEFT JOIN
来达到相同的目的,因为并非所有数据库系统都支持RIGHT JOIN
。在某些情况下,当两个表都没有完全匹配的记录时,你可能想要使用FULL OUTER JOIN
,但这也不是所有数据库系统都支持的。
SELECT name
FROM customers
WHERE age > 30;
WHERE
子句是一个非常重要的组成部分,它用于指定筛选数据的条件,从而限制查询结果集仅包含满足条件的行。WHERE
子句允许使用各种条件表达式,包括比较运算符(如=
, >
, <
, <>
等)、逻辑运算符(如AND
, OR
, NOT
)以及特殊函数(如LIKE
、IN
、BETWEEN
等),以实现复杂的筛选逻辑。WHERE
子句的使用非常灵活,可以基于单个字段或多个字段的组合来设置筛选条件。此外,还可以结合子查询来实现更高级的筛选逻辑。通过精确地指定筛选条件,WHERE
子句有助于减少数据库需要处理的数据量,从而提高查询效率。
- 在使用
WHERE
子句时,需要确保条件表达式的正确性,以避免查询结果不符合预期。 - 当使用多个条件进行筛选时,要注意逻辑运算符的优先级,必要时可以使用括号来明确表达式的执行顺序。
- 对于大型数据库表,合理的索引设计可以显著提高
WHERE
子句的执行效率。
需求
Customers
表:
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
+-------------+---------+
在 SQL 中,id 是该表的主键。
该表的每一行都表示客户的 ID 和名称。
Orders
表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| customerId | int |
+-------------+------+
在 SQL 中,id 是该表的主键。
customerId 是 Customers 表中 ID 的外键( Pandas 中的连接键)。
该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。
找出所有从不点任何东西的顾客。
以 任意顺序 返回结果表。
结果格式如下所示。
示例
输入:
Customers table:
+----+-------+
| id | name |
+----+-------+
| 1 | Joe |
| 2 | Henry |
| 3 | Sam |
| 4 | Max |
+----+-------+
Orders table:
+----+------------+
| id | customerId |
+----+------------+
| 1 | 3 |
| 2 | 1 |
+----+------------+
输出:
+-----------+
| Customers |
+-----------+
| Henry |
| Max |
+-----------+
分析
找出所有从不点任何东西的顾客。
判断客户是否曾经下过订单的条件是:如果一个客户 ID 在 orders
表中不存在,这就意味着他们从未下过订单。
基于共同的客户 ID(在 customers 表中的 id 列和 orders 表中的 customerId 列),将表 customers 与表 orders 进行连接。
left join Orders on Customers.Id = Orders.CustomerId
左连接之后选择
customerId
为null
的记录,我们可以确定哪些客户没有下过订单。
where Orders.CustomerId is null
代码
select name as 'Customers'
from Customers
left join Orders on Customers.Id = Orders.CustomerId
where Orders.CustomerId is null