数据库里一张表中的记录很多,可能有几千万或者上亿的数量级,我们只想查询某些符合条件的记录,即通过一些过滤器将满足查询条件的记录过滤出来,这就是带搜索条件的查询。

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

举例:

  1. # 查询学生信息表中student_number大于20180104的记录
  2. SELECT * FROM student_info WHERE student_number > 20180104;
  3. # 查询学生信息表中性别为男的记录
  4. SELECT * FROM student_info WHERE sex ='男';
  5. # 查询学生成绩表中score在61和98之间的记录
  6. 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,…中的任意一个

举例:

  1. # 查询学生信息表中专业是“计算机科学与工程”或者“软件工程”的记录
  2. SELECT * FROM student_info WHERE major IN ('计算机科学与工程', '软件工程');
  3. # 查询学生信息表中专业既不是“计算机科学与工程”也不是“软件工程”的记录
  4. 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

举例:

  1. # 查询学生信息表中专业是null的记录
  2. SELECT * FROM student_info WHERE major IS NULL;
  3. # 查询学生信息表中专业不是null的记录
  4. SELECT * FROM student_info WHERE major IS NOT NULL;

4、多个搜索条件的查询

上面介绍的查询都是WHERE后面仅跟一个表达式的,当搜索条件有多个时需要用到AND操作符和OR操作符。

4.1 AND操作符

当记录满足所有搜索条件时才将记录加入结果集。

操作符 示例 描述
AND express1 AND express2 搜索条件同时满足表达式1和表达式2

举例:

  1. # 查询学生信息表中专业是“计算机科学与工程”且性别是男的记录
  2. SELECT * FROM student_info WHERE major = '计算机科学与工程' AND sex = '男';

4.2 OR操作符

当记录满足所有搜索条件中的任意一个时就将记录加入结果集。

操作符 示例 描述
OR express1 OR express2 搜索条件满足表达式1和表达式2中的一个

举例:

  1. # 查询学生信息表中专业是“计算机科学与工程”或者性别是男的记录
  2. SELECT * FROM student_info WHERE major = '计算机科学与工程' OR sex = '男';

注意:AND操作符的优先级要高于OR操作符。

**AND****OR**操作符和**IN****NOT IN**操作符的区别:

  • 相同点是二者语义上都是“满足其中一个”和“满足所有”;
  • 不同点是INNOT IN操作符的过滤条件是具体元素或者数据,ANDOR操作符的过滤条件是表达式,二者的过滤条件或者说候选集不是一个维度。

    5、模糊查询和通配符

    5.1 模糊查询

    有时候我们无法精确的描述我们的查询条件,比如想查询名字里有“张”这个字的记录,此时可以使用模糊查询,MySQL中有以下两个操作符支持模糊查询:
操作符 示例 描述
LIKE a LIKE b a匹配b
NOT LIKE a NOT LIKE b a不匹配b

5.2 通配符

既然不能精确地描述查询条件,就需要用某些符号去代替查询条件里的模糊信息,这些符号被称为通配符,模糊查询一般搭配通配符使用。

通配符 描述
% 代表任意一个字符串
_ 代表任意一个字符
/ 转义符

举例:

  1. # 查询学生信息表中姓名列姓氏为杜的记录
  2. SELECT * FROM student_info WHERE name LIKE '杜%';
  3. # 查询学生信息表中姓名列为“杜某燕”的记录
  4. SELECT * FROM student_info WHERE name LIKE '杜_燕';
  5. # 查询学生信息表中姓名列为“杜_”的记录
  6. SELECT * FROM student_info WHERE name LIKE '杜\_';