【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
相关推荐
知识分享小能手19 分钟前
mysql学习教程,从入门到精通,SQL 修改表(ALTER TABLE 语句)(29)
大数据·开发语言·数据库·sql·学习·mysql·数据分析
暮毅25 分钟前
Django对接支付宝沙箱环境(2024年9月新测有效)
数据库·django
fat house cat_28 分钟前
mysql-索引笔记
数据库·mysql
He guolin34 分钟前
【MySQL】数据库基础知识
数据库·mysql
AitTech1 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
我焦虑的编程日记1 小时前
【RabbitMQ】RabbitMQ学习
java·数据库·java-ee
晨曦启明6342 小时前
MySQL表操作(进阶)
数据库
攻城狮numberOne2 小时前
MongoDB集群模式详解及应用实战
数据库·mongodb
姜豆豆耶2 小时前
MongoDB-aggregate流式计算:带条件的关联查询使用案例分析
数据库·mongodb
DngYT2 小时前
MongoDB入门:安装及环境变量配置
数据库·mongodb