【SQL】未订购的客户

时间:2024-10-01 21:52:58

目录

语法

需求

示例

分析

代码


语法

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子句允许使用各种条件表达式,包括比较运算符(如=><<>等)、逻辑运算符(如ANDORNOT)以及特殊函数(如LIKEINBETWEEN等),以实现复杂的筛选逻辑。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