数据库里一张表中的记录很多,可能有几千万或者上亿的数量级,我们只想查询某些符合条件的记录,即通过一些过滤器将满足查询条件的记录过滤出来,这就是带搜索条件的查询。
1、简单搜索条件
最简单的带搜索条件的查询,是使用WHERE
关键字,把搜索条件放在WHERE
字句中,这些搜索条件是表达式,由被操作元素和比较操作符组成,常用的比较操作符如下:
操作符 | 示例 | 描述 |
---|---|---|
= |
a = b |
a等于b |
!= 或者<> |
a != b |
a不等于b |
< |
a < b |
a小于b |
<= |
a <= b |
a小于或者等于b |
> |
a > b |
a大于b |
>= |
a >= b |
a大于等于b |
BETWEEN |
a BETWEEN b AND c |
满足 b <= a <= c |
NOT BETWEEN |
a NOT BETWEEN b AND c |
不满足 满足 b <= a <= c |
举例:
# 查询学生信息表中student_number大于20180104的记录
SELECT * FROM student_info WHERE student_number > 20180104;
# 查询学生信息表中性别为男的记录
SELECT * FROM student_info WHERE sex ='男';
# 查询学生成绩表中score在61和98之间的记录
SELECT * FROM student_score WHERE score BETWEEN 61 AND 98;
2、匹配列表中的元素
有时WHERE
后面跟的匹配条件不是仅满足一个条件,而是一个由条件组成的列表,只要成功匹配到列表中的某一项就算命中,这种场景可以使用IN
操作符。
操作符 | 示例 | 描述 |
---|---|---|
IN |
a IN (b1, b2, ...) |
a是b1,b2,…中的某一个 |
NOT IN | a NOT IN (b1, b2, ...) |
a不是b1,b2,…中的任意一个 |
举例:
# 查询学生信息表中专业是“计算机科学与工程”或者“软件工程”的记录
SELECT * FROM student_info WHERE major IN ('计算机科学与工程', '软件工程');
# 查询学生信息表中专业既不是“计算机科学与工程”也不是“软件工程”的记录
SELECT * FROM student_info WHERE major NOT IN ('计算机科学与工程', '软件工程');
3、匹配NULL值
当不知道向列中填入什么数据时,系统默认会向该列填充NULL
,当然也可以用DEFAULT
列属性指定列的初始值。很多时候数据不是完整的,有很多处都是NULL
,因此当需要过滤出这些列为NULL
的记录时,可以用匹配NULL
值。
操作符 | 示例 | 描述 |
---|---|---|
IS NULL |
a IS NULL |
a的值是NULL |
IS NOT NULL | a IS NOT NULL |
a的值不是NULL |
举例:
# 查询学生信息表中专业是null的记录
SELECT * FROM student_info WHERE major IS NULL;
# 查询学生信息表中专业不是null的记录
SELECT * FROM student_info WHERE major IS NOT NULL;
4、多个搜索条件的查询
上面介绍的查询都是WHERE
后面仅跟一个表达式的,当搜索条件有多个时需要用到AND
操作符和OR
操作符。
4.1 AND操作符
当记录满足所有搜索条件时才将记录加入结果集。
操作符 | 示例 | 描述 |
---|---|---|
AND |
express1 AND express2 |
搜索条件同时满足表达式1和表达式2 |
举例:
# 查询学生信息表中专业是“计算机科学与工程”且性别是男的记录
SELECT * FROM student_info WHERE major = '计算机科学与工程' AND sex = '男';
4.2 OR操作符
当记录满足所有搜索条件中的任意一个时就将记录加入结果集。
操作符 | 示例 | 描述 |
---|---|---|
OR |
express1 OR express2 |
搜索条件满足表达式1和表达式2中的一个 |
举例:
# 查询学生信息表中专业是“计算机科学与工程”或者性别是男的记录
SELECT * FROM student_info WHERE major = '计算机科学与工程' OR sex = '男';
注意:AND
操作符的优先级要高于OR
操作符。
**AND**
、**OR**
操作符和**IN**
、**NOT IN**
操作符的区别:
- 相同点是二者语义上都是“满足其中一个”和“满足所有”;
- 不同点是
IN
、NOT IN
操作符的过滤条件是具体元素或者数据,AND
、OR
操作符的过滤条件是表达式,二者的过滤条件或者说候选集不是一个维度。5、模糊查询和通配符
5.1 模糊查询
有时候我们无法精确的描述我们的查询条件,比如想查询名字里有“张”这个字的记录,此时可以使用模糊查询,MySQL
中有以下两个操作符支持模糊查询:
操作符 | 示例 | 描述 |
---|---|---|
LIKE |
a LIKE b |
a匹配b |
NOT LIKE |
a NOT LIKE b |
a不匹配b |
5.2 通配符
既然不能精确地描述查询条件,就需要用某些符号去代替查询条件里的模糊信息,这些符号被称为通配符,模糊查询一般搭配通配符使用。
通配符 | 描述 |
---|---|
% | 代表任意一个字符串 |
_ | 代表任意一个字符 |
/ | 转义符 |
举例:
# 查询学生信息表中姓名列姓氏为杜的记录
SELECT * FROM student_info WHERE name LIKE '杜%';
# 查询学生信息表中姓名列为“杜某燕”的记录
SELECT * FROM student_info WHERE name LIKE '杜_燕';
# 查询学生信息表中姓名列为“杜_”的记录
SELECT * FROM student_info WHERE name LIKE '杜\_';