跳转到主要内容
模块 4 · 第 1 课(共 4)课程中的13/57~8 min
模块课程(1/4)

列表和范围:IN 和 BETWEEN

在前面的模块中,您使用等式和 WHERE 进行过滤 比较:salary > 30000、department_id = 1、hired_on >= '2020-01-01'。 但是当条件变成*“该值必须是这五个之一”*时, 链式 OR 堆积起来:

SQL
-- Heavy and fragile: adding a department means touching the query
SELECT first_name, last_name
FROM   employees
WHERE  department_id = 1
   OR  department_id = 2
   OR  department_id = 3;

SQL 提供了两个快捷方式来使其可读。

IN —“其中一个”

IN (...) 运算符采用值列表并返回 true,如果 列等于其中的任何一个:

SQL
SELECT first_name, last_name, department_id
FROM   employees
WHERE  department_id IN (1, 2, 3);

它在语义上与上面的 OR 相同,但更具可读性: 自然地读作 "where department_id is in (1, 2, 3)"。它也有效 带有字符串和日期:

SQL
SELECT name
FROM   departments
WHERE  city IN ('Milano', 'Roma');

还有 NOT IN (...),其作用相反:

SQL
-- Employees who are NOT in Engineering or Sales:
SELECT first_name, last_name
FROM   employees
WHERE  department_id NOT IN (1, 2);

BETWEEN —“A 和 B 之间,包括两者”

当条件是连续范围(数字、日期)时,而不是 写 column >= A AND column <= B 你有 BETWEEN A AND B:

SQL
-- Employees with a salary between 30000 and 50000 (both inclusive):
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary BETWEEN 30000 AND 50000;

BETWEEN 在两个端点上都是包含的。它可以很好地与 日期也:

SQL
-- Everyone hired in 2020:
SELECT first_name, last_name, hired_on
FROM   employees
WHERE  hired_on BETWEEN '2020-01-01' AND '2020-12-31';

尝试一下

锻炼#sql.m4.l1.e1
尝试:0加载中...

显示工资在 30000 到 50000 之间的员工的名字 (first_name)、姓氏 (last_name) 和工资 (salary)。三列。

正在加载编辑器...
显示提示

使用 BETWEEN 30000 AND 50000 — 比通过 AND 连接的两个比较更紧凑、更易读。

3 次尝试后可用的解决方案

复习练习

锻炼#sql.m4.l1.e2
尝试:0加载中...

列出在部门 1、2 或 4 工作的员工的名字 (first_name) 和姓氏 (last_name)(使用 IN)。按姓氏字母顺序排列。

正在加载编辑器...
显示提示

WHERE Department_id IN (1, 2, 4) 是三个 OR 的紧凑版本。

3 次尝试后可用的解决方案