当前位置: 首页 > news >正文

MySQL 系统学习 第二阶段 第三章 DQL(Data Query Language)第二节:WHERE 条件查询

一、WHERE 是什么?

语法:

SELECT 字段 FROM 表名 WHERE 条件;

例如:

SELECT * FROM student WHERE age > 20;

可以理解为:

student(所有数据) ↓ WHERE 进行筛选 ↓ 只留下符合条件的数据 ↓ SELECT 返回

所以:

WHERE 的作用就是:

过滤数据。


二、准备测试数据

以后这一章我们都使用下面这张表。

CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(30), age INT, gender CHAR(1), score DECIMAL(5,2) );

插入数据:

INSERT INTO student(name,age,gender,score) VALUES ('Tom',20,'M',88.5), ('Jack',22,'M',91), ('Lucy',19,'F',95.5), ('Rose',21,'F',86), ('Mike',20,'M',78.5);

数据如下:

idnameagegenderscore
1Tom20M88.5
2Jack22M91
3Lucy19F95.5
4Rose21F86
5Mike20M78.5

三、比较运算符

这是 WHERE 最基础的内容。


1、等于(=)

查询:

Tom。

SELECT * FROM student WHERE name = 'Tom';

结果:

idname
1Tom

再例如:

查询:

20 岁。

SELECT * FROM student WHERE age = 20;

结果:

nameage
Tom20
Mike20

注意:

字符串必须使用单引号' '

正确:

WHERE name='Tom'

错误:

WHERE name=Tom

2、大于(>)

查询:

年龄大于20。

SELECT * FROM student WHERE age > 20;

结果:

nameage
Jack22
Rose21

3、小于(<)

查询:

年龄小于20。

SELECT * FROM student WHERE age < 20;

结果:

Lucy。


4、大于等于(>=)

SELECT * FROM student WHERE score >= 90;

结果:

namescore
Jack91
Lucy95.5

5、小于等于(<=)

SELECT * FROM student WHERE score <=80;

结果:

Mike。


6、不等于

MySQL 支持两种写法。

第一种:

!=

例如:

SELECT * FROM student WHERE gender != 'M';

第二种:

<>
SELECT * FROM student WHERE gender <> 'M';

结果一样:

name
Lucy
Rose

企业建议:

<>是 SQL 标准写法,!=是 MySQL 也支持的写法,两者都很常见。


四、逻辑运算符

实际开发中,一个条件往往不够。

例如:

查询20 岁以上的男生


AND(并且)

SELECT * FROM student WHERE age > 20 AND gender='M';

结果:

name
Jack

必须:

条件1 并且 条件2

都成立。


OR(或者)

查询:

女生

或者

成绩大于90。

SELECT * FROM student WHERE gender='F' OR score>90;

结果:

name
Jack
Lucy
Rose

NOT(取反)

查询:

不是女生。

SELECT * FROM student WHERE NOT gender='F';

结果:

name
Tom
Jack
Mike

也可以写:

WHERE gender <> 'F'

五、BETWEEN

例如:

查询:

年龄:

19~21。

SELECT * FROM student WHERE age BETWEEN 19 AND 21;

结果:

nameage
Tom20
Lucy19
Rose21
Mike20

注意:

BETWEEN 包含两端。

即:

19 ≤ age ≤ 21

等价于:

WHERE age>=19 AND age<=21

六、IN

查询:

Tom

Mike

Lucy

很多人:

写:

WHERE name='Tom' OR name='Mike' OR name='Lucy'

其实:

推荐:

SELECT * FROM student WHERE name IN ('Tom','Mike','Lucy');

结果:

name
Tom
Lucy
Mike

IN 本质上就是多个等值判断的简洁写法。


七、LIKE(重点)

这是企业开发中最常用的模糊查询。

例如:

搜索用户名。


%

表示:

任意多个字符(包括 0 个字符)

查询:

T 开头。

SELECT * FROM student WHERE name LIKE 'T%';

结果:

Tom。


查询:

e 结尾。

SELECT * FROM student WHERE name LIKE '%e';

结果:

Rose

Mike


查询:

包含 o。

SELECT * FROM student WHERE name LIKE '%o%';

结果:

Tom

Rose


_

表示:

任意一个字符。

例如:

SELECT * FROM student WHERE name LIKE '_o%';

解释:

第一位:任意字符 第二位:o 后面:任意多个字符

符合:

Tom

不符合:

Mike

八、NULL 判断

这是 SQL 新手最容易犯错的地方。

错误写法:

WHERE name = NULL;

永远查不到结果。

正确写法:

WHERE name IS NULL;

查询:

不是 NULL。

WHERE name IS NOT NULL;

原因:

NULL表示"未知值",不是普通的数据,因此不能使用=比较,必须使用IS NULLIS NOT NULL


九、逻辑运算符优先级

例如:

WHERE age>20 OR gender='F' AND score>90

很多人认为:

从左到右执行。

实际上:

SQL 优先级:

NOT ↓ AND ↓ OR

所以:

实际上相当于:

WHERE age>20 OR ( gender='F' AND score>90 )

企业开发建议:

复杂条件一定加括号。

例如:

WHERE (age>20 OR gender='F') AND score>90

可读性更好,也避免歧义。


十、企业开发规范

推荐:

SELECT id, name, score FROM student WHERE age >= 20 AND gender = 'M';

不推荐:

select * from student where age>=20 and gender='M';

推荐原因:

  • SQL 关键字统一大写
  • 不使用SELECT *
  • 条件清晰
  • 复杂表达式使用括号
  • 字段按需查询

本节知识总结

类型常用语法
等于=
不等于!=<>
大于>
小于<
大于等于>=
小于等于<=
范围BETWEEN ... AND ...
多值匹配IN (...)
模糊查询LIKE
空值判断IS NULLIS NOT NULL
并且AND
或者OR
取反NOT

本节思考题(企业面试高频)

请尝试回答下面五个问题:

  1. BETWEEN 18 AND 20age >= 18 AND age <= 20有什么关系?有没有区别?
    BETWEEN 18 AND 20本质等价于age >= 18 AND age <= 20,都是范围查询,区别主要在语法表达形式,BETWEEN 更简洁,但底层逻辑一致。
  2. 为什么IN比多个OR更推荐?
    IN本质是集合查询,比多个OR更简洁、可读性更强,同时数据库优化器通常能更高效处理集合匹配,因此企业开发中更推荐使用IN
  3. %_的区别是什么?请分别举一个例子。
    %表示任意长度字符,_表示单个字符占位。%用于模糊匹配整体结构,_用于精确控制字符位置。
  4. 为什么 SQL 判断NULL必须使用IS NULL,而不能使用= NULL
    因为 NULL 表示未知值,不是具体数据,无法使用=比较。SQL 使用IS NULL专门判断空值,本质上是三值逻辑(TRUE / FALSE / UNKNOWN)导致的设计。
  5. 为什么企业开发中建议复杂的ANDOR条件一定要加括号,即使 SQL 可以正常执行?
    因为 SQL 存在 AND/OR 优先级问题(AND 优先级高于 OR),不加括号容易导致逻辑歧义。企业开发中通过加括号明确逻辑边界,提高可读性并避免业务错误。
http://www.jsqmd.com/news/1141907/

相关文章:

  • GWAS数据整合的终极指南:如何用gwasglue连接不同分析工具
  • 华硕笔记本性能管家:GHelper轻量级控制工具完全指南
  • 番茄小说下载器:5分钟学会免费下载番茄小说的终极指南 [特殊字符]
  • 5分钟快速上手:Buzz本地离线语音转录工具终极指南
  • 百考通「降重+降AI」来帮你用更自然的方式重新组织论文
  • GTA5线上小助手:解锁洛圣都无限可能的终极工具集
  • PE不饱和聚酯木器漆基础知识
  • 百考通「降重+降AI」帮你避开那些莫名其妙的技术误判
  • 基于PIC32的高效数字电源设计与实现
  • SpringBoot 全局异常处理与日志记录——统一规范实战
  • 2026最新8款团队编程协作平替工具权威实测合集
  • 如何快速掌握BS-RoFormer:音乐分离深度学习模型实战问题解决方案指南
  • 基于TPAFE0808与PIC24的多通道信号采集系统设计
  • 华硕笔记本性能控制终极指南:G-Helper轻量级工具完整教程
  • Python 多重比较 5 种校正方法实战:Bonferroni vs FDR vs Holm vs Sidak vs Tukey
  • IQ-TREE:终极系统发育分析工具的革命性突破
  • PyTorch Adam 优化器 weight_decay 参数详解:从 1e-4 到 1e-6 的 3 个调优场景
  • 2026年PDF转PPT,完整实操指南:各类转换方法与免费工具全梳理
  • IntelliJ IDEA 中 JRebel 扩展插件 激活
  • ChatGPT写完还不够:发布前我一定会检查这7项
  • 论绝对真理的不可让渡性与西方学术产业的结构性腐败​​​​​​​——对形式系统僭越、证伪主义迷思及当代“论文制造业“的系统性批判
  • 从零开始搭建个人游戏串流服务器:Sunshine全攻略
  • 5分钟找回QQ空间青春记忆:GetQzonehistory终极数据备份指南
  • milvus | 第 4 章:Milvus 启动流程与组件生命周期
  • okbiye 科研绘图新解法!文字输入一键产出全学科规范学术图表
  • 基于171010550与MK20DN128VFM5的DC-DC降压方案设计
  • 爬虫请求性能优化——连接池复用、缓存策略、并发控制
  • ImageGlass图片浏览器终极指南:免费开源支持90+格式的高效工具
  • ICM-42688-P与MK64FX512VDC12在机器人控制与工业监测中的应用
  • Calibre路径翻译插件NoTrans:彻底解决中文路径乱码问题的终极指南