Skip to content
On this page

带搜索条件的查询

简单的搜素条件

带上 where 语句

sql
mysql> select number,name,major from student_info where name="范剑";
+----------+--------+-----------------+
| number   | name   | major           |
+----------+--------+-----------------+
| 20180105 | 范剑   | 飞行器设计      |
+----------+--------+-----------------+
1 row in set (0.00 sec)

mysql>

搜索条件 name=中的 = 称为比较操作符

操作符示例描述
=a = ba等于b
<>或者!=a <> ba不等于b
<a < ba小于b
<=a <= ba小于或等于b
>a > ba大于b
>=a >= ba大于或等于b
BETWEENa BETWEEN b AND c满足 b <= a <= c
NOT BETWEENa NOT BETWEEN b AND c不满足 b <= a <= c

查询格式

sql
where 列名 操作符 条件

查询学号在 20180102~20180104 间的学生信息

sql
mysql> select number, name,major from student_info where number between 20180102 and 20180104;
+----------+-----------+--------------------------+
| number   | name      | major                    |
+----------+-----------+--------------------------+
| 20180102 | 杜琦燕    | 计算机科学与工程         |
| 20180103 | 范统      | 软件工程                 |
| 20180104 | 史珍香    | 软件工程                 |
+----------+-----------+--------------------------+
3 rows in set (0.00 sec)

mysql>

匹配列表中的元素

有时候搜索条件中指定的匹配值并不是单个值,而是一个列表,只要匹配到列表中的某一项就算匹配成功,这种情况可以使用 IN 操作符

操作符示例描述
INa IN (b1, b2, ...)a是b1, b2, ... 中的某一个
NOT INa NOT IN (b1, b2, ...)a不是b1, b2, ... 中的任意一个

查询格式

sql
where 列名 in (条件,条件 ...)

想查询软件工程和飞行器设计两个课程的学生

sql
mysql> select number,name,major from student_info where  major in ("软件工程", "飞行器设计");
+----------+-----------+-----------------+
| number   | name      | major           |
+----------+-----------+-----------------+
| 20180103 | 范统      | 软件工程        |
| 20180104 | 史珍香    | 软件工程        |
| 20180105 | 范剑      | 飞行器设计      |
+----------+-----------+-----------------+
3 rows in set (0.00 sec)

mysql>

匹配 null 值

操作符示例描述
IS NULLa IS NULLa的值是NULL
IS NOT NULLa IS NOT NULLa的值不是NULL

查询格式

sql
列名 is null
sql
mysql> select number,name,major from student_info where  major is null;
Empty set (0.00 sec)

mysql>

多个查询条件组合

AND

通过 and 操作符连接多个查询条件,从student_score表中找出科目为'母猪的产后护理'并且成绩大于75分的记录

sql
mysql> select * from student_score where subject="母猪的产后护理" and score > 75;
+----------+-----------------------+-------+
| number   | subject               | score |
+----------+-----------------------+-------+
| 20180101 | 母猪的产后护理        |    78 |
| 20180102 | 母猪的产后护理        |   100 |
+----------+-----------------------+-------+
2 rows in set (0.00 sec)

mysql>

OR

查询分数大于95 或者 小于55 的科目

sql
mysql> select number,subject,score from student_score where score>95 or score<55;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理              |   100 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
3 rows in set (0.00 sec)

mysql>

更复杂的搜索条件

如果我们需要在某个查询中指定很多的搜索条件,比方说我们想从student_score表中找出课程为'论萨达姆的战争准备',并且成绩大于95分或者小于55分的记录

sql
mysql> select number, subject, score from student_score where score>95 or score<55 and subject="论萨达姆的战争准备";
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理              |   100 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
3 rows in set (0.00 sec)

mysql>

虽然指定了科目,但还是在结果集中看到了母猪的产后处理,这是因为 and 操作符优先级高于 or 操作符,也就是说在判断某条记录是否符合条件时会先检测AND操作符两边的搜索条件

sql
score > 95 OR score < 55 AND subject = '论萨达姆的战争准备'

上面这条语句被看作是

  • score > 95
  • score < 55 AND subject = '论萨达姆的战争准备'

为了避免这种问题,可以在条件中加入 ()

sql
mysql> select number, subject, score from student_score where (score>95 or score<55) and subject="论萨达姆的战争准备";
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
2 rows in set (0.00 sec)

mysql>

通配符

也可以叫做模糊查询

操作符示例描述
LIKEa LIKE ba匹配b
NOT LIKEa NOT LIKE ba不匹配b

支持的通配符

  • % 代表任意一个字符串
sql
mysql> select number,name,major from student_info where name like "杜%";
+----------+-----------+--------------------------+
| number   | name      | major                    |
+----------+-----------+--------------------------+
| 20180101 | 杜子腾    | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 计算机科学与工程         |
+----------+-----------+--------------------------+
2 rows in set (0.00 sec)

mysql>
sql
mysql> select number,name,major from student_info where name like "%香%";
+----------+-----------+--------------+
| number   | name      | major        |
+----------+-----------+--------------+
| 20180104 | 史珍香    | 软件工程     |
+----------+-----------+--------------+
1 row in set (0.00 sec)

mysql>
  • _ 代表任意一个字符,有时知道查询的条件名长度
sql
mysql> select number,name,major from student_info where name like  "范_";
+----------+--------+-----------------+
| number   | name   | major           |
+----------+--------+-----------------+
| 20180103 | 范统   | 软件工程        |
| 20180105 | 范剑   | 飞行器设计      |
+----------+--------+-----------------+
2 rows in set (0.00 sec)

mysql>

注意:

  • LIKE 或者 NOT LIKE 操作符只用于字符串匹配
  • 通配符不能代表NULL,如果需要匹配NULL的话,需要使用 IS NULL 或者 IS NOT NULL。

转义通配符

如果待匹配的条件中本身包含了 %_ 字符,可以在前面加上 \ 来转义

  • '%' 代表普通字符 '%'
  • '_' 代表普通字符 '_'
sql
mysql> SELECT number, name, id_number, major FROM student_info WHERE name LIKE '范\_';
Empty set (0.00 sec)
    
mysql>