【Mysql面试宝典】快速上手Mysql查询
写在前面,大家好!我是【跨考菌】,一枚跨界的程序猿,专注于后台技术的输出,目标成为
全栈攻城狮
!这博客是对我跨界过程的总结和思考。如果你也对Java
、后端技术
感兴趣,抑或是正在纠结于跨界,都可以关注我的动态,让我们一起学习,一起进步~
我的博客地址为:【跨考菌】的博客
上文【Mysql面试宝典】快速上手Mysql查询(上)介绍了Mysql查询语句,本文继续分享该模块内容。和【跨考菌】一起加油吧~
1、过滤数据
上文【Mysql面试宝典】快速上手Mysql查询(上)介绍的student_info
、student_score
表中的记录都很少,但是实际应用中的表里可能存储几千万条,甚至上亿条记录。而且我们通常并不是对所有的记录都感兴趣,只是想查询到符合某些条件的那些记录。比如我们只想查询名字为胡歌
的学生基本信息,或者计算机学院
的学生都有哪些什么的,这些条件也被称为搜索条件
或者过滤条件
,当某条记录符合搜索条件
时,它将被放入结果集中。
1.1 简单搜索条件
我们需要把搜索条件
放在WHERE
语句中,比如我们想查询student_info
表中名字是胡歌
的学生的一些信息,可以这么写:
SELECT * FROM student_info WHERE NAME = '胡歌';
这个例子中的搜索条件
就是name = '范剑'
,也就是当记录中的name
列的值是胡歌
的时候,该条记录的number
、name
、id_number
、major
这些字段才可以被放入结果集。像name = '胡歌'
这种搜索条件
称为精确匹配,=
称为条件操作符
。MySQL
中简单的条件操作符有>
,>=
,=
,!=
,<
,<=
。
我们想查询学号大于20140503
的学生信息可以这么写:
ysql> SELECT * FROM student_info WHERE number > 20140503;
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
| number | name | sex | id_number | department | major | enrollment_time |
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
| 20140504 | 张欢 | 男 | 5478412360125479 | 计算机学院 | 计算机科学 | 2018-01-26 |
| 20140505 | 李俊 | 男 | 5478412360125470 | 软件学院 | 软件工程 | 2018-01-26 |
| 20140506 | 胡歌 | 男 | 5478412360125471 | 材料学院 | 无机非金属 | 2018-01-26 |
| 20140507 | test | 男 | 5478412360125471 | 生物学院 | 生物工程 | 2018-01-26 |
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
4 rows in set (0.00 sec)
查询专业不是计算机科学
的一些学生信息可以这么写:
SELECT * FROM student_info WHERE major != '计算机科学';
需要注意的是BETWEEN ... AND ...
操作符的使用,它表示一个范围,比方说我们想查找学号在20140503
~20140506
间的学生信息,可以这么写:
mysql> SELECT * FROM student_info WHERE number between 20140503 and 20140506;
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
| number | name | sex | id_number | department | major | enrollment_time |
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
| 20140503 | 胡浩 | 男 | 5478412360125478 | 软件学院 | 软件工程 | 2018-01-26 |
| 20140504 | 张欢 | 男 | 5478412360125479 | 计算机学院 | 计算机科学 | 2018-01-26 |
| 20140505 | 李俊 | 男 | 5478412360125470 | 软件学院 | 软件工程 | 2018-01-26 |
| 20140506 | 胡歌 | 男 | 5478412360125471 | 材料学院 | 无机非金属 | 2018-01-26 |
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
4 rows in set (0.00 sec)
如果想查询指定范围之外的数据记录,可以使用NOT BETWEEN ... AND ...
的语法,比如这样:
mysql> SELECT * FROM student_info WHERE number not between 20140503 and 20140506;
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
| number | name | sex | id_number | department | major | enrollment_time |
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
| 20140501 | 田坤 | 男 | 1548742154781354 | 软件学院 | 计算机科学 | 2018-01-26 |
| 20140502 | 绕晶 | 女 | 5481645125642189 | 计算机学院 | 软件工程 | 2018-01-26 |
| 20140507 | test | 男 | 5478412360125471 | 生物学院 | 生物工程 | 2018-01-26 |
+----------+--------+------+------------------+-----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
这样就可以查出学号不在20140503
~20140506
这个区间内的所有学生信息。
1.2 多值匹配
有时候指定的匹配值并不是单个值,而是一个列表,只要匹配到列表中的某一项就算匹配成功,这种情况可以使用IN
操作符:
比如我们想查询软件工程
和计算机科学
专业的学生信息,可以这么写:
SELECT * FROM student_info WHERE major IN ('计算机科学','软件工程');
如果想查询不是这两个专业的学生的信息,可以这么写:
SELECT * FROM student_info WHERE major NOT IN ('计算机科学','软件工程');
1.3 NULL
值检查
我们前边说过,NULL
代表没有值,意味着你并不知道该列应该填入什么数据,在判断某一列是否为NULL
的时候并不能单纯的使用=
操作符,而是需要专业判断值是否是NULL
的操作符:
- IS NULL
- IS NOT NULL
比如我们想看一下student_info
表的name
列是NULL
的学生记录有哪些,可以这么写:
mysql> SELECT number, name, id_number, major FROM student_info WHERE name IS NULL;
Empty set (0.00 sec)
mysql>
由于所有记录的name
列都不是NULL
值,所以最后结果是空的,我们看一下查询name
列不是NULL
值的方式:
mysql> SELECT number, name, id_number, major FROM student_info WHERE name IS NOT NULL;
+----------+--------+------------------+-----------------+
| number | name | id_number | major |
+----------+--------+------------------+-----------------+
| 20140501 | 田坤 | 1548742154781354 | 计算机科学 |
| 20140502 | 绕晶 | 5481645125642189 | 软件工程 |
| 20140503 | 胡浩 | 5478412360125478 | 软件工程 |
| 20140504 | 张欢 | 5478412360125479 | 计算机科学 |
| 20140505 | 李俊 | 5478412360125470 | 软件工程 |
| 20140506 | 胡歌 | 5478412360125471 | 无机非金属 |
| 20140507 | test | 5478412360125471 | 生物工程 |
+----------+--------+------------------+-----------------+
7 rows in set (0.00 sec)
name
列不是NULL
值的记录就被查询出来啦!
再次强调一遍,不能直接使用普通的操作符来与NULL
值进行比较,必须使用IS NULL
或者IS NOT NULL
!
1.4 多个搜索条件的查询
上边介绍的都是指定单个的搜索条件的查询,我们也可以在一次查询中指定多个搜索条件。
AND操作符
在给定多个搜索条件的时候,我们有时需要某条记录只有在符合所有搜索条件的时候,这条记录才可以被加入到结果集当中,这种情况我们可以使用AND
操作符来连接多个搜索条件。比如我们想从student_score
表中找出科目为'数据结构'
并且成绩大于75
分的记录,可以这么写:
SELECT * FROM student_score WHERE SUBJECT = '数据结构' AND score > 75;
其中的subject = '数据结构'
和score > 75
是两个搜索条件,我们使用AND
操作符把这两个搜索条件连接起来表示只有当两个条件都满足的记录才能被加入到结果集。
OR操作符
在给定多个搜索条件的时候,我们有时需要某条记录在符合某一个搜索条件的时候,这条记录就可以被加入到结果集当中,这种情况我们可以使用OR
操作符来连接多个搜索条件。比如我们想从student_score
表中找出成绩大于95
分或者小于55
分的记录,可以这么写:
SELECT * FROM student_score WHERE score > 95 OR score < 55;
更复杂的搜索条件的组合
如果我们需要在某个查询中指定很多的搜索条件,比方说我们想从student_score
表中找出课程为'数据结构'
,并且成绩大于95
分或者小于55
分的记录,那我们可能会这么写:
SELECT * FROM student_score WHERE score > 95 OR score < 55 AND subject = '数据结构';
为什么结果中仍然会有'数据结构'
课程的记录呢?因为:AND操作符的优先级默认高于OR操作符,也就是说在判断某条记录是否符合条件时会先执行AND操作符两边的搜索条件。所以:
score > 95 OR score < 55 AND subject = '数据结构'
可以被看作下边这两个条件中任一条件成立则整个式子成立:
score > 95
score < 55 AND subject = '数据结构'
因为结果集中subject
是'数据结构'
的记录中score
值为100
,符合第1个条件,所以整条记录会被加到结果集中。为了避免这种尴尬,在一个查询中有多个搜索条件时最好使用小括号()
来显式的指定各个搜索条件的执行顺序,比如上边的例子可以写成下边这样:
SELECT * FROM student_score WHERE SUBJECT = '数据结构' AND (score > 95 OR score < 55);
1.4 通配符
有时候我们并不能精确的描述我们要查询的东西,比方说我们只是想看看姓'杜'
的学生信息,而不能精确的描述出这些姓'杜'
的同学的完整姓名,我们称这种查询为模糊查询
。MySQL
中使用下边这两个操作符来支持模糊查询
:
操作符 | 示例 | 描述 |
---|---|---|
LIKE |
a LIKE b |
a匹配b |
NOT LIKE |
a NOT LIKE b |
a不匹配b |
既然我们不能完整描述要查询的信息,那就用某个符号来替代这些模糊的信息,这个符号就被称为通配符
。MySQL
中支持下边这两个通配符
:
-
%
:代表任意一个字符串(多个字符)。比方说我们想查询
student_info
表中name
以'胡'
开头的记录,我们可以这样写:
SELECT * FROM student_info WHERE NAME LIKE '胡%';
-
_
:代表任意一个字符。有的时候我们知道要查询的字符串中有多少个字符,而使用
%
时匹配的范围太大,我们就可以用_
来做通配符。就像是支付宝的万能福卡,一张万能福卡能且只能代表任意一张福卡(也就是它不能代表多张福卡)。比方说我们想查询姓
'田'
,并且姓名只有2个字符的记录,可以这么写:
SELECT * FROM student_info WHERE NAME LIKE '田_';
转义通配符
如果我们匹配的字符串中就包含普通字符'%'
或者'_'
该咋办,怎么区分它是一个通配符还是一个普通字符呢?
答:如果匹配字符串中需要普通字符'%'
或者'_'
的话,需要在它们前边加一个反斜杠\
以和通配符区分开来:
-
'\%'
代表普通字符'%'
-
'\_'
代表普通字符'_'
比方说这样:
mysql> SELECT number, name, id_number, major FROM student_info WHERE name LIKE '范\_';
Empty set (0.00 sec)
mysql>
由于student_info
表中没有叫范_
的学生,所以查询结果为空。
通配符注意事项
使用通配符时需要特别注意一下,通配符不能代表NULL
,如果需要匹配NULL
的话,需要使用IS NULL
或者IS NOT NULL
!
2、总结
-
我们需要将搜索条件放到
WHERE
子句中。针对不同的搜索条件,MySQL提供了非常丰富的操作符。 -
如果某一列可以匹配的值有多个,可以使用
IN
或者NOT IN
操作符。 -
判断某个列的值是不是
NULL
,需要用IS NULL
或者IS NOT NULL
操作符。 -
我们可以将多个简单的搜索条件合并在一起组成一个更大搜索条件,各个简单的搜索条件可以用下边的几种操作符连接起来:
-
- AND操作符:该操作符两边的搜索条件全部满足后整个搜索条件才算满足。
- OR操作符:该操作符两边的搜索条件只需要满足一个整个搜索条件就满足了
-
%
代表任意一个字符串,_
代表任意一个字符。如果需要把这两个通配符当作pu t不过需要特别注意的是,通配符不能代表NULL
,如果需要匹配NULL
的话,需要使用IS NULL
或者IS NOT NULL
! -
%
代表任意一个字符串,_
:代表任意一个字符。如果需要把通配符当作普通字符看待的话,需要使用反斜杠\
进行转义。另外,通配符不能代表NULL
,如果需要匹配NULL
的话,需要使用IS NULL
或者IS NOT NULL
本文地址:https://blog.csdn.net/huyang_1995/article/details/110674612