条件查询详细说明
条件查询是通过 WHERE
子句对数据进行过滤的核心操作,其本质是按指定条件筛选出满足要求的行。以下是详细说明:
🔍 一、基础语法结构
SELECT 列1, 列2
FROM 表名
WHERE 条件表达式; -- 核心过滤逻辑在此
⚙️ 二、条件表达式类型
1. 比较运算符
运算符 | 含义 | 示例 | 说明 |
---|---|---|---|
= | 等于 | salary = 10000 | |
<> 或 != | 不等于 | dept_id <> 3 | |
> | 大于 | age > 30 | |
< | 小于 | price < 50.0 | |
>= | 大于等于 | score >= 60 | |
<= | 小于等于 | order_date <= '2023-12-31' | 日期需用引号包裹 |
2. 逻辑运算符
运算符 | 含义 | 示例 |
---|---|---|
AND | 与 | age > 25 AND salary < 50000 |
OR | 或 | city = '北京' OR city = '上海' |
NOT | 非 | NOT is_deleted |
优先级:NOT
> AND
> OR
👉 建议用 ()
明确优先级:
-- 错误:会先执行 OR 再执行 AND
WHERE age > 18 OR gender = 'F' AND status = 1 -- 正确:明确分组
WHERE (age > 18 OR gender = 'F') AND status = 1
3. 特殊条件运算符
运算符 | 含义 | 示例 |
---|---|---|
BETWEEN ... AND | 范围匹配(闭区间) | salary BETWEEN 8000 AND 15000 |
IN (值列表) | 多值匹配 | dept_id IN (101, 102, 105) |
LIKE '模式' | 模糊匹配 | name LIKE '张%' |
IS NULL | 空值判断 | phone IS NULL |
IS NOT NULL | 非空判断 | email IS NOT NULL |
🧩 三、高级条件技巧
1. 模糊匹配 (LIKE
)
通配符 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
% | 任意长度字符 | LIKE 'a%' | “apple”, “abc” |
_ | 单个字符 | LIKE '张_' | “张三”, “张四” |
[charlist] | 字符集合 (仅SQL Server) | LIKE '[ae]%' | “apple”, “egg” |
转义特殊字符(如搜索含 %
的字符串):
WHERE comment LIKE '%30\%%' ESCAPE '\' -- 匹配 "折扣30%" 类文本
2. 多条件组合
-- 组合 AND/OR/NOT
SELECT *
FROM employees
WHERE (department = '研发部' OR department = '产品部')AND salary > 15000NOT is_retired;
3. 子查询条件
-- 查询薪资高于部门平均值的员工
SELECT name, salary
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department = e.department -- 关联子查询
);
4. NULL 值处理
-- 错误:NULL 无法用 = 判断
SELECT * FROM users WHERE phone = NULL; -- 无结果!-- 正确:必须用 IS NULL
SELECT * FROM users WHERE phone IS NULL;
⚠️ 四、关键注意事项
-
性能影响:
- 避免在
WHERE
中对列进行函数计算(如WHERE YEAR(order_date) = 2023
) - 改用范围查询:
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
- 避免在
-
隐式类型转换:
-- 字符串 vs 数字(可能导致全表扫描) SELECT * FROM products WHERE id = '1001'; -- 推荐显式类型一致 SELECT * FROM products WHERE id = 1001;
-
短路原则:
MySQL 对AND/OR
从左到右计算,遇到FALSE
提前终止(优化性能)
💡 五、实战示例
-- 查询2023年下半年在北京或上海、薪资1-2万且未离职的研发工程师
SELECT name, phone
FROM employees
WHERE department = '研发部'AND job_title = '工程师'AND join_date BETWEEN '2023-07-01' AND '2023-12-31'AND (city = '北京' OR city = '上海')AND salary BETWEEN 10000 AND 20000AND resign_date IS NULL;