带搜索条件的查询
简单的搜素条件
带上 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 = 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 |
查询格式
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
操作符
操作符 | 示例 | 描述 |
---|---|---|
IN | a IN (b1, b2, ...) | a是b1, b2, ... 中的某一个 |
NOT IN | a 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 NULL | a IS NULL | a的值是NULL |
IS NOT NULL | a IS NOT NULL | a的值不是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>
通配符
也可以叫做模糊查询
操作符 | 示例 | 描述 |
---|---|---|
LIKE | a LIKE b | a匹配b |
NOT LIKE | a NOT LIKE b | a不匹配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>