WHERE 子句是 MySQL 中最核心的查询功能之一,它允许我们根据特定条件筛选数据。以下是 WHERE 子句的全面解析:
基本语法
SELECT 字段列表
FROM 表名
WHERE 查询条件;
比较运算符查询
运算符 | 描述 | 示例 |
---|---|---|
= | 等于 | WHERE age = 20 |
<> 或 != | 不等于 | WHERE age <> 20 |
> | 大于 | WHERE height > 170 |
< | 小于 | WHERE height < 170 |
>= | 大于等于 | WHERE age >= 18 |
<= | 小于等于 | WHERE age <= 30 |
示例:
查询身高等于170cm的学生
SELECT name, height FROM students WHERE height = 170;
查询年龄小于22岁的学生
SELECT name, age FROM students WHERE age < 22;
逻辑运算符查询
1. AND (&&) - 与运算
查询年龄大于21且身高≥175的学生
SELECT name, age, height FROM students WHERE age > 21 AND height >= 175;
2. OR (||) - 或运算
查询年龄大于21或身高≥175的学生
SELECT name, age, height FROM students WHERE age > 21 OR height >= 175;
3. XOR - 异或运算
查询满足年龄>21或身高≥175,但不同时满足的学生
SELECT name, age, height FROM students WHERE age > 21 XOR height >= 175;
4. NOT (!) - 非运算
查询不是22岁的学生
SELECT name, age FROM students WHERE NOT age = 22;
特殊条件查询
1. BETWEEN AND - 范围查询
查询年龄在20到23岁之间的学生
SELECT name, age FROM students WHERE age BETWEEN 20 AND 23;
2. IS NULL - 空值查询
查询没有填写身高的学生
SELECT name FROM students WHERE height IS NULL;
3. IN - 集合查询
查询年龄为22、23或25岁的学生
SELECT name, age FROM students WHERE age IN (22, 23, 25);
4. LIKE - 模糊查询
查询姓"张"的学生(%表示任意多个字符)
SELECT name FROM students WHERE name LIKE '张%';
查询名字包含"an"的学生
SELECT name FROM students WHERE name LIKE '%an%';
查询姓"李"且名字为两个字的学生(_表示单个字符)
SELECT name FROM students WHERE name LIKE '李_';
运算符优先级
当多个运算符一起使用时,MySQL 按照以下优先级顺序计算:
优先级 | 运算符/关键字 | 描述 |
---|---|---|
1 | () | 括号(最高优先级) |
2 | NOT | 逻辑非 |
3 | = , > , < 等 | 比较运算符 |
4 | AND | 逻辑与 |
5 | OR | 逻辑或 |
6 | XOR | 逻辑异或(最低优先级) |
建议:使用括号明确优先级,增强可读性
清晰的优先级表达
SELECT name, age, height FROM students WHERE (age > 20 OR height > 170) AND sex = 'F';
复合条件查询示例
示例1:多条件组合
查询20-23岁之间,身高在160-180cm的女生
SELECT name, age, height FROM students WHERE age BETWEEN 20 AND 23 AND height BETWEEN 160 AND 180 AND sex = 'F';
示例2:复杂逻辑组合
查询(年龄<22或身高>175)且不是计算机系的学生
SELECT name, age, height, dept FROM students WHERE (age < 22 OR height > 175) AND dept != '计算机';
示例3:NULL值处理
查询没有填写身高或身高低于160cm的学生
SELECT name, height FROM students WHERE height IS NULL OR height < 160;
性能优化建议
1. 为常用查询条件建立索引:特别是 WHERE 子句中频繁使用的字段
2. 避免在索引列上使用函数:
不推荐(无法使用索引)
WHERE YEAR(register_date) = 2023;
推荐
WHERE register_date BETWEEN '2023-01-01' AND '2023-12-31';
3. 注意LIKE查询的通配符位置:
`LIKE '张%'` 可以使用索引
`LIKE '%张%'` 无法使用索引
4. 合理使用EXISTS代替IN:对于子查询,EXISTS通常性能更好
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程