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. 比较运算符
这些运算符用于比较值的大小或相等性。
示例:
-- 查找年龄等于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. 逻辑运算符
用于组合多个条件。
示例:
-- 查找年龄在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子句的熟练使用是成为SQL查询高手的基石。记住:先明确你的数据需求,再将其翻译为准确的WHERE条件。

发表评论
所有评论