mysql菜鸟教程
6.1 WHERE子句:条件筛选
WHERE子句是SQL查询的“数据过滤器”,它决定了从表中返回哪些行。如果说SELECT语句是告诉数据库“你想要什么”,那么WHERE子句就是明确“你要的条件是什么”。掌握WHERE子句,意味着你能够精准地从海量数据中提取所需的信息。
一、WHERE子句的核心作用与位置
WHERE子句紧跟在FROM表名之后,用于指定筛选条件:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件表达式;
执行顺序理解:数据库先定位表(FROM),然后逐行检查是否符合条件(WHERE),最后返回筛选后的列(SELECT)。
让我们继续使用之前的学生信息表作为示例:
-- 学生表结构示例
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
student_no CHAR(10) NOT NULL UNIQUE,
name VARCHAR(50) NOT NULL,
gender ENUM('男', '女') DEFAULT '男',
age TINYINT UNSIGNED,
major VARCHAR(100),
score DECIMAL(5,2),
enrollment_date DATE NOT NULL
);
二、基础条件操作符详解
1. 比较运算符
这些运算符用于比较值的大小或相等性。
运算符
描述
示例
=
等于
WHERE age = 20
<>
或
!=
不等于
WHERE gender != '男'
>
大于
WHERE score > 90
<
小于
WHERE age < 22
>=
大于等于
WHERE score >= 60
<=
小于等于
WHERE age <= 20
示例:
-- 查找年龄等于20岁的学生
SELECT name, age FROM students WHERE age = 20;
-- 查找分数大于等于90分的学生
SELECT student_no, name, score FROM students WHERE score >= 90;
-- 查找非计算机科学专业的学生
SELECT name, major FROM students WHERE major != '计算机科学';
2. 逻辑运算符
用于组合多个条件。
运算符
描述
示例
AND
逻辑与(所有条件必须同时满足)
WHERE age > 18 AND gender = '女'
OR
逻辑或(至少满足一个条件)
WHERE major = 'CS' OR major = 'SE'
NOT
逻辑非(条件不成立)
WHERE NOT age > 20
示例:
-- 查找年龄在19到22岁之间的男生
SELECT name, age, gender
FROM students
WHERE age >= 19 AND age <= 22 AND gender = '男';
-- 查找计算机科学或软件工程专业的学生
SELECT name, major
FROM students
WHERE major = '计算机科学' OR major = '软件工程';
-- 查找年龄不小于20岁的学生(两种写法等效)
SELECT name, age FROM students WHERE NOT age < 20;
SELECT name, age FROM students WHERE age >= 20;
3. 特殊操作符
BETWEEN ... AND ...:范围匹配
查找值在指定范围内的记录(包含边界值)。
-- 查找分数在80到90分之间的学生(包含80和90)
SELECT name, score
FROM students
WHERE score BETWEEN 80 AND 90;
-- 等价于
SELECT name, score
FROM students
WHERE score >= 80 AND score <= 90;
IN (...):集合匹配
检查值是否在指定的值列表中。
-- 查找特定几个专业的学生
SELECT name, major
FROM students
WHERE major IN ('计算机科学', '软件工程', '数据科学');
-- 等价于(但IN更简洁)
SELECT name, major
FROM students
WHERE major = '计算机科学'
OR major = '软件工程'
OR major = '数据科学';
LIKE:模糊匹配
用于字符串的模式匹配,常与通配符一起使用。
-
%:匹配任意字符(包括0个字符)
-
_:匹配单个任意字符
-- 查找姓"张"的学生(张开头,后面任意)
SELECT name FROM students WHERE name LIKE '张%';
-- 查找名字中带有"小"字的学生
SELECT name FROM students WHERE name LIKE '%小%';
-- 查找姓"王"且名字为两个字的学生
SELECT name FROM students WHERE name LIKE '王_';
-- 查找学号以"2024"开头,以"01"结尾的学生
SELECT student_no, name FROM students WHERE student_no LIKE '2024%01';
IS NULL / IS NOT NULL:空值判断
NULL表示缺失或未知的值,不能用=判断。
-- 查找专业信息未填写(为空)的学生
SELECT name, major
FROM students
WHERE major IS NULL;
-- 查找已填写专业信息的学生
SELECT name, major
FROM students
WHERE major IS NOT NULL;
三、重要注意:运算符优先级
当WHERE子句中有多个条件时,运算符的优先级决定了条件的判断顺序。优先级从高到低为:
-
() 括号
-
NOT
-
AND
-
OR
理解优先级:
-- 情况1:查找所有女生,或者年龄大于20的男生
SELECT name, gender, age
FROM students
WHERE gender = '女' OR gender = '男' AND age > 20;
-- 实际执行:gender='女' OR (gender='男' AND age>20)
-- 情况2:查找所有性别为男或女,且年龄大于20的学生
SELECT name, gender, age
FROM students
WHERE (gender = '女' OR gender = '男') AND age > 20;
-- 使用括号改变优先级
-- 复杂条件示例:查找(计算机科学专业且分数>85)或(软件工程专业且分数>90)的学生
SELECT name, major, score
FROM students
WHERE (major = '计算机科学' AND score > 85)
OR (major = '软件工程' AND score > 90);
最佳实践:当条件复杂时,使用括号明确优先级,即使默认优先级符合你的需求,也能提高代码可读性。
四、综合实战应用
场景1:多条件组合查询
查找2024年入学、年龄在19-21岁之间、分数高于80分的女生。
SELECT student_no, name, age, major, score, enrollment_date
FROM students
WHERE gender = '女'
AND age BETWEEN 19 AND 21
AND score > 80
AND YEAR(enrollment_date) = 2024
AND major IS NOT NULL;
场景2:使用函数和表达式
查找姓名长度为2或3个字,且年龄加5年后大于25岁的学生。
SELECT name, age, major
FROM students
WHERE (LENGTH(name) = 2 OR LENGTH(name) = 3)
AND (age + 5) > 25;
场景3:复杂业务逻辑
查找需要重点关注的学生:挂科(分数<60)或年龄小于18岁,且不是"体育特长生"。
SELECT student_no, name, age, score, major
FROM students
WHERE (score < 60 OR age < 18)
AND major != '体育特长生'
ORDER BY score ASC; -- 按分数从低到高排序,最需要关注的排前面
练习与测试
请基于以下数据尝试编写查询语句:
-- 假设students表有以下数据
INSERT INTO students VALUES
(1, '20240001', '张三', '男', 20, '计算机科学', 85.5, '2024-09-01'),
(2, '20240002', '李四', '女', 19, '软件工程', 92.0, '2024-09-01'),
(3, '20240003', '王小五', '男', 21, '数据科学', 78.0, '2024-09-01'),
(4, '20240004', '赵小六', '女', 22, '计算机科学', 88.5, '2024-09-01'),
(5, '20240005', '孙七', '男', 20, NULL, 95.0, '2024-09-01'),
(6, '20240006', '周小八', '女', 18, '软件工程', 59.5, '2024-09-01');
练习题目:
-
查找所有姓"王"的学生。
-
查找分数在60到90分之间(包含60和90)的学生。
-
查找专业为"计算机科学"或"软件工程",且分数不低于80分的女生。
-
查找专业信息为空,或者年龄小于20岁的学生。
-
查找名字以"小"字结尾的学生。
参考答案:
-- 1. 查找所有姓"王"的学生
SELECT * FROM students WHERE name LIKE '王%';
-- 2. 查找分数在60到90分之间(包含60和90)的学生
SELECT * FROM students WHERE score BETWEEN 60 AND 90;
-- 3. 查找专业为"计算机科学"或"软件工程",且分数不低于80分的女生
SELECT * FROM students
WHERE major IN ('计算机科学', '软件工程')
AND score >= 80
AND gender = '女';
-- 4. 查找专业信息为空,或者年龄小于20岁的学生
SELECT * FROM students
WHERE major IS NULL OR age < 20;
-- 5. 查找名字以"小"字结尾的学生
SELECT * FROM students WHERE name LIKE '%小';
WHERE子句使用要点总结
要点
说明
示例
精确匹配
使用
=
比较确切值
WHERE age = 20
范围查询
使用
BETWEEN
或比较运算符组合
WHERE score BETWEEN 60 AND 100
多选一
使用
IN
简化多个
OR
条件
WHERE major IN ('CS', 'SE')
模糊查询
使用
LIKE
配合通配符
%
和
_
WHERE name LIKE '张%'
空值处理
必须使用
IS NULL
或
IS NOT NULL
WHERE major IS NOT NULL
优先级
使用括号
()
明确复杂条件的逻辑
WHERE (A OR B) AND C
性能注意
对常查询的列建立索引可提高WHERE查询速度
在
age
列上建立索引
WHERE子句的熟练使用是成为SQL查询高手的基石。记住:先明确你的数据需求,再将其翻译为准确的WHERE条件。

发表评论
所有评论