mysql菜鸟教程

首页 >> 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子句中有多个条件时,运算符的优先级决定了条件的判断顺序。优先级从高到低为:

  1. () 括号

  2. NOT

  3. AND

  4. 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');

练习题目

  1. 查找所有姓"王"的学生。

  2. 查找分数在60到90分之间(包含60和90)的学生。

  3. 查找专业为"计算机科学"或"软件工程",且分数不低于80分的女生。

  4. 查找专业信息为空,或者年龄小于20岁的学生。

  5. 查找名字以"小"字结尾的学生。

参考答案

-- 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条件


发表评论

昵称:
联系方式:
评论内容:

所有评论

关于我 备案号:蜀ICP备2023042032号-1