MySQL讲义第21讲——select 查询之查询条件


文章目录

  • MySQL讲义第21讲——select 查询之查询条件
  • 一、比较运算符和逻辑运算符
  • 1、比较运算符
  • 2、逻辑运算符
  • 二、WHERE 子句的一般用法
  • 1、查询身高超过 170 的学生的信息
  • 2、查询 2000 年 1 月 1 日以后出生的员工信息
  • 三、逻辑运算符的用法
  • 1、查询 2000 年出生的学生信息
  • 2、查询系编号为 D01 和 D02 的学生信息
  • 3、查询系编号为 D01 和 D02 的男生信息
  • 四、BETWEEN … AND 的用法
  • 1、查找 2000 年出生的学生信息。
  • 2、查找身高在 170 和 180 之间的学生信息
  • 3、查找身高不在 170 和 180 之间的学生信息
  • 五、IN 的用法
  • 1、查询系编号为 D01 和 D02 的学生信息
  • 2、查询系编号不是 D01 和 D02 的学生信息
  • 3、查询身高为 170、175 和 180 的学生的信息
  • 六、使用 IS NULL 查询空值
  • 1、查询 phone 为空值的学生信息
  • 2、查询 phone 不为空值的学生信息


在 MySQL 中,如果需要从数据表中查询满足某个条件的数据,可以使用 WHERE 关键字来指定查询条件。

一、比较运算符和逻辑运算符

可以使用比较运算符和逻辑运算符构造查询的条件。

1、比较运算符

比较运算符可以对两个数据的值进行比较,常用的比较运算符如下:

比较运算符

描述

=

等于

<> 或 !=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN … AND

在某个范围内

IN

在某个集合内

IS NULL

为空值

LIKE

搜索某种模式

2、逻辑运算符

逻辑运算符包括 NOT、AND 和 OR,是对多个查询条件进行运算,用于构造复杂的查询条件。用法如下:

逻辑运算符

描述

NOT 条件1

对条件1求反,如果条件1为真,结果为假;如果条件1为假,则结果为真。

条件1 AND 条件2

如果条件1和条件2都为真,结果为真。

条件1 OR 条件2

条件1和条件2有一个为真,结果为真。

二、WHERE 子句的一般用法

使用等于(=)、大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)、不等于(!= 或 <>)构造条件。例如:

1、查询身高超过 170 的学生的信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> height >= 170;
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901004 |       | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | 15937320654 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
7 rows in set (0.02 sec)

2、查询 2000 年 1 月 1 日以后出生的员工信息

mysql> SELECT
    -> *
    -> FROM 
    -> stu
    -> WHERE
    -> birth >= '2000-1-1';
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801202 | 赵牡丹    | 女     | 2001-08-10 00:00:00 |  160.0 | 15937320666 | D03     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901003 | 张静静    | 女     | 2001-08-17 00:00:00 |  167.0 | 15937320123 | D01     |
| 201901004 |       | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | 15937320654 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
8 rows in set (0.00 sec)

三、逻辑运算符的用法

1、查询 2000 年出生的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> birth >= '2000-1-1' AND birth <= '2000-12-31';
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901004 |       | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
4 rows in set (0.00 sec)

2、查询系编号为 D01 和 D02 的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> dept_id = 'D01' OR dept_id = 'D02';
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801104 | 宋丹风    | 女     | 1999-11-20 00:00:00 |  165.0 | 15937320444 | D02     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901003 | 张静静    | 女     | 2001-08-17 00:00:00 |  167.0 | 15937320123 | D01     |
| 201901004 |       | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | 15937320654 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
8 rows in set (0.00 sec)

3、查询系编号为 D01 和 D02 的男生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> (dept_id = 'D01' OR dept_id = 'D02') AND gender = '男';
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901004 |     | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | 15937320654 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
5 rows in set (0.00 sec)
--说明:注意条件中的括号。这是因为 AND 运算的优先级高于 OR,因此需要使用括号。

四、BETWEEN … AND 的用法

BETWEEN … AND 用来限定查找的信息在两个值(一个表示最小值,一个表示最大值)之间。例如:

1、查找 2000 年出生的学生信息。

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> birth BETWEEN '2000-1-1' AND '2000-12-31';
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901004 |    | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
4 rows in set (0.00 sec)

2、查找身高在 170 和 180 之间的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> height BETWEEN 170 AND 180;
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901004 |     | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | 15937320654 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
7 rows in set (0.00 sec)

3、查找身高不在 170 和 180 之间的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> height NOT BETWEEN 170 AND 180;
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801104 | 宋丹风    | 女     | 1999-11-20 00:00:00 |  165.0 | 15937320444 | D02     |
| 201801201 | 王艳艳    | 女     | 1999-09-30 00:00:00 |  162.0 | 15937320888 | D03     |
| 201801202 | 赵牡丹    | 女     | 2001-08-10 00:00:00 |  160.0 | 15937320666 | D03     |
| 201901003 | 张静静    | 女     | 2001-08-17 00:00:00 |  167.0 | 15937320123 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
4 rows in set (0.00 sec)

五、IN 的用法

使用 IN 可以代替逻辑表达式 OR,表示某个字段的取值在一个集合内。例如:

1、查询系编号为 D01 和 D02 的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> dept_id IN ('D01','D02');
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801104 | 宋丹风    | 女     | 1999-11-20 00:00:00 |  165.0 | 15937320444 | D02     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901003 | 张静静    | 女     | 2001-08-17 00:00:00 |  167.0 | 15937320123 | D01     |
| 201901004 |      | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | 15937320654 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
8 rows in set (0.01 sec)

2、查询系编号不是 D01 和 D02 的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> dept_id NOT IN ('D01','D02');
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801201 | 王艳艳    | 女     | 1999-09-30 00:00:00 |  162.0 | 15937320888 | D03     |
| 201801202 | 赵牡丹    | 女     | 2001-08-10 00:00:00 |  160.0 | 15937320666 | D03     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
3 rows in set (0.00 sec)

3、查询身高为 170、175 和 180 的学生的信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> height IN (175,170,180);
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
2 rows in set (0.00 sec)

六、使用 IS NULL 查询空值

查询某个字段为空值的记录不能使用等号(=),需要使用 IS NULL。例如:

1、查询 phone 为空值的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> phone IS NULL;
+-----------+-----------+--------+---------------------+--------+-------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone | dept_id |
+-----------+-----------+--------+---------------------+--------+-------+---------+
| 201801201 | 王艳艳    | 女     | 1999-09-30 00:00:00 |  162.0 | NULL  | D03     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | NULL  | D01     |
+-----------+-----------+--------+---------------------+--------+-------+---------+
2 rows in set (0.00 sec)

2、查询 phone 不为空值的学生信息

mysql> SELECT
    -> *
    -> FROM
    -> stu
    -> WHERE
    -> phone IS NOT NULL;
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国量    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801104 | 宋丹风    | 女     | 1999-11-20 00:00:00 |  165.0 | 15937320444 | D02     |
| 201801202 | 赵牡丹    | 女     | 2001-08-10 00:00:00 |  160.0 | 15937320666 | D03     |
| 201801203 | 王大强    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901003 | 张静静    | 女     | 2001-08-17 00:00:00 |  167.0 | 15937320123 | D01     |
| 201901004 |  | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
9 rows in set (0.00 sec)