4. IN、BETWEEN 与 EXISTS 的等价改写

IN、BETWEEN 与 EXISTS 的等价改写 学习卡片

任务说明

本案例完成SQL查询中的条件过滤功能:使用WHERE子句从数据表中筛选出满足指定条件的记录。你将创建一张员工信息表,写入样例数据,并通过多个WHERE条件组合查询验证过滤效果。

数据表结构

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(30),
    salary DECIMAL(10,2),
    hire_date DATE
);

样例数据

INSERT INTO employees VALUES
(1, '张伟', '技术部', 15000.00, '2020-03-15'),
(2, '李娜', '市场部', 12000.00, '2021-07-01'),
(3, '王强', '技术部', 18000.00, '2019-11-20'),
(4, '赵敏', '财务部', 13500.00, '2022-01-10'),
(5, '刘洋', '市场部', 11000.00, '2023-05-08'),
(6, '陈静', '技术部', 16000.00, '2020-09-30');

WHERE子句过滤实现

以下SQL语句演示WHERE子句的典型过滤场景,每条语句独立执行,观察返回结果:

-- 1. 等值比较:查询技术部员工
SELECT * FROM employees WHERE department = '技术部';

-- 2. 范围比较:查询薪资大于等于13000的员工
SELECT * FROM employees WHERE salary >= 13000;

-- 3. 多条件AND组合:技术部且薪资高于14000
SELECT * FROM employees WHERE department = '技术部' AND salary > 14000;

-- 4. 多条件OR组合:财务部或入职晚于2022-01-01
SELECT * FROM employees WHERE department = '财务部' OR hire_date > '2022-01-01';

-- 5. IN列表过滤:查询指定部门的员工
SELECT * FROM employees WHERE department IN ('技术部', '市场部');

-- 6. BETWEEN范围:查询薪资在12000到16000之间的员工
SELECT * FROM employees WHERE salary BETWEEN 12000 AND 16000;

-- 7. LIKE模糊匹配:查询姓"张"的员工
SELECT * FROM employees WHERE name LIKE '张%';

-- 8. 空值判断:查询部门为空的记录(当前数据无空值,演示语法)
SELECT * FROM employees WHERE department IS NULL;

执行与验证

在MySQL或PostgreSQL中执行上述建表、插入和查询语句。验证方法:

  1. 执行第1条查询,应返回3行(张伟、王强、陈静);
  2. 执行第2条查询,应返回4行(张伟、王强、赵敏、陈静);
  3. 执行第3条查询,应返回2行(王强、陈静);
  4. 执行第4条查询,应返回3行(赵敏、刘洋、陈静);
  5. 执行第5条查询,应返回5行(除赵敏外的所有员工);
  6. 执行第6条查询,应返回4行(张伟、王强、赵敏、陈静);
  7. 执行第7条查询,应返回1行(张伟);
  8. 执行第8条查询,应返回0行(当前无NULL数据)。

判定标准:每条查询返回的行数与上述预期一致,且字段值正确,即表示WHERE子句条件过滤功能实现正确。

WHERE子句条件过滤执行流程 employees 表 id name dept salary 1 张伟 技术 15000 2 李娜 市场 12000 3 王强 技术 18000 4 赵敏 财务 13500 5 刘洋 市场 11000 6 陈静 技术 16000 WHERE 条件 dept = '技术部' salary >= 13000 dept='技术' AND salary>14000 dept IN ('技术','市场') salary BETWEEN 12000 AND 16000 name LIKE '张%' 过滤结果 匹配行 条件1 → 3行 (张伟,王强,陈静) 条件2 → 4行 (张伟,王强,赵敏,陈静) 条件3 → 2行 (王强,陈静) 条件4 → 5行 (除赵敏外) 条件5 → 4行 (张伟,王强,赵敏,陈静) 条件6 → 1行 (张伟) 条件7 → 0行 (无NULL) 执行流程:全表扫描 → 逐行判断WHERE条件 → 返回满足条件的行