【SQL】未订购的客户

目录

语法

需求

示例

分析

代码


语法

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)以及特殊函数(如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

左连接之后选择 customerIdnull 的记录,我们可以确定哪些客户没有下过订单。

where Orders.CustomerId is null

代码

复制代码
select name as 'Customers'
from Customers
left join Orders on Customers.Id = Orders.CustomerId
where Orders.CustomerId is null
相关推荐
倔强的石头_1 分钟前
深度解析:数据库内核如何通过逻辑推理与常值推导突破去重性能瓶颈
数据库
devilnumber2 分钟前
MySQL 部门表:树结构 (自关联) vs 非树结构 (扁平化 / 冗余字段)
数据库·mysql
User_芊芊君子5 分钟前
一条命令搞定 mysql_exporter 部署,Shell 脚本把重复配置这件事自动化了
android·mysql·自动化
fengxin_rou16 分钟前
【MySQL 三大日志深度解析】:redo log、undo log、binlog 作用与两阶段提交原理
数据库·mysql·日志·redo log
ECT-OS-JiuHuaShan16 分钟前
存在是微分张量积,标量是参数但不可能是本质。还原论泛化,是语义劫持和以偏概全的逻辑谋杀伪科学庞氏骗局
数据库·人工智能·算法·机器学习·数学建模
IT策士20 分钟前
Django 从 0 到 1 打造完整电商平台:使用 Django 消息框架与用户权限初步
数据库·django·sqlite
斯特凡今天也很帅23 分钟前
Spring Boot+mybatis项目切换sql为传参成无参
spring boot·sql·mybatis
星河耀银海26 分钟前
JAVA 注解(Annotation):从原理到实战应用
java·开发语言·数据库
lzp079128 分钟前
基于多模态视觉模型和图文向量模型的工业图像知识库研究与应用(伍)
数据库·学习·neo4j
weelinking30 分钟前
【claude】15_Claude使用经验与最佳实践
前端·人工智能·python·sql·数据挖掘·前端框架·github