本文转载至微信公众号:我们都是小青蛙
一、数据准备
学生基本信息表:
学号 | 姓名 | 性别 | 身份证号 | 学院 | 专业 | 入学时间 |
---|---|---|---|---|---|---|
20180101 | 杜子腾 | 男 | 15817719901044792 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
20180102 | 杜琦燕 | 女 | 151008199801178529 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
20180103 | 范统 | 男 | 17156319980116959X | 计算机学院 | 软件工程 | 2018-09-01 |
20180104 | 史珍香 | 女 | 141992199701078600 | 计算机学院 | 软件工程 | 2018-09-01 |
20180105 | 范剑 | 男 | 181048200008156368 | 航天学院 | 飞行器设计 | 2018-09-01 |
20180106 | 朱逸群 | 男 | 197995199801078445 | 航海学院 | 电子信息 | 2018-09-01 |
学生成绩表:
学号 | 科目 | 成绩 |
---|---|---|
20180101 | 母猪的产后护理 | 78 |
20180101 | 论萨达姆的战争准备 | 88 |
20180102 | 母猪的产后护理 | 100 |
20180102 | 论萨达姆的战争准备 | 88 |
20180103 | 母猪的产后护理 | 59 |
20180103 | 论萨达姆的战争准备 | 61 |
20180104 | 母猪的产后护理 | 55 |
20180104 | 论萨达姆的战争准备 | 46 |
二、 简单搜索条件
where子句
我们需要把搜索条件放在WHERE语句中
,比如我们想查询student_info表中名字是范剑的学生的一些信息,可以这么写:
这个例子中的搜索条件就是name = ‘范剑’,也就是当记录中的name列的值是’范剑’的时候,该条记录的number、name、id_number、major这些字段才可以被放入结果集。像name = '范剑’这种搜索条件称为精确匹配
,=称为条件操作符。我们看MySQL中都有哪些简单的条件操作符:
我们想查询学号大于20180103的学生信息可以这么写:
查询专业不是计算机科学与工程的一些学生信息可以这么写:
需要注意的是BETWEEN ... AND ...操作符
的使用,它表示一个范围
,比方说我们想查找学号在20180102~20180104间的学生信息,可以这么写:
如果想查询指定范围之外的数据记录,可以使用NOT BETWEEN ... AND ...的语法,
比如这样:
这样就可以查出学号不在20180102~20180104这个区间内的所有学生信息。
多值匹配
有时候指定的匹配值并不是单个值,而是一个列表,只要匹配到列表中的某一项就算匹配成功,这种情况可以使用IN操作符
:
比如我们想查询软件工程和飞行器设计专业的学生信息,可以这么写:
如果想查询不是这两个专业的学生的信息,可以这么写:
NULL值检查
我们前边说过,NULL代表没有值,意味着你并不知道该列应该填入什么数据,在判断某一列是否为NULL的时候并不能单纯的使用=操作符,而是需要专业判断值是否是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值的方式:
name列不是NULL值的记录就被查询出来啦!
再次强调一遍,不能直接使用普通的操作符来与NULL值进行比较,必须使用IS NULL或者IS NOT NULL!
三、多个搜索条件的查询
上边介绍的都是指定单个的搜索条件的查询,我们也可以在一次查询中指定多个搜索条件。
AND操作符
在给定多个搜索条件的时候,我们有时需要某条记录只有在符合所有搜索条件的时候,这条记录才可以被加入到结果集当中,这种情况我们可以使用AND操作符来连接多个搜索条件。比如我们想从student_score表中找出科目为’母猪的产后护理’并且成绩大于75分的记录,可以这么写:
其中的subject = '母猪的产后护理’和score > 75是两个搜索条件,我们使用AND操作符把这两个搜索条件连接起来表示只有当两个条件都满足的记录才能被加入到结果集。
OR操作符
在给定多个搜索条件的时候,我们有时需要某条记录在符合某一个搜索条件的时候,这条记录就可以被加入到结果集当中,这种情况我们可以使用OR操作符来连接多个搜索条件。比如我们想从student_score表中找出成绩大于95分或者小于55分的记录,可以这么写:
更复杂的搜索条件的组合
如果我们需要在某个查询中指定很多的搜索条件,比方说我们想从student_score表中找出课程为’论萨达姆的战争准备’,并且成绩大于95分或者小于55分的记录,那我们可能会这么写:
为什么结果中仍然会有’母猪的产后护理’课程的记录呢?因为:AND操作符的优先级默认高于OR操作符,也就是说在判断某条记录是否符合条件时会先执行AND操作符两边的搜索条件。所以:
score > 95 OR score < 55 AND subject = ‘论萨达姆的战争准备’
可以被看作下边这两个条件中任一条件成立则整个式子成立:
-
score > 95
-
score < 55 AND subject = ‘论萨达姆的战争准备’
因为结果集中subject是’母猪的产后护理’的记录中score值为100,符合第1个条件,所以整条记录会被加到结果集中。为了避免这种尴尬,在一个查询中有多个搜索条件时最好使用小括号()来显式的指定各个搜索条件的执行顺序,比如上边的例子可以写成下边这样:
通配符
有时候我们并不能精确的描述我们要查询的东西
,比方说我们只是想看看姓’杜’的学生信息,而不能精确的描述出这些姓’杜’的同学的完整姓名,我们称这种查询为模糊查询
。MySQL中使用下边这两个操作符来支持模糊查询:
操作符 示例 描述
LIKE | a LIKE b | a匹配b |
---|---|---|
NOT LIKE | a NOT LIKE b | a不匹配b |
既然我们不能完整描述要查询的信息,那就用某个符号来替代这些模糊的信息,这个符号就被称为通配符
。MySQL中支持下边这两个通配符
:
%:代表任意一个字符串。
比方说我们想查询student_info表中name以’杜’开头的记录,我们可以这样写:
或者我们只知道学生名字里边包含了一个’香’字,那我们可以这么查:
_:代表任意一个字符。
有的时候我们知道要查询的字符串中有多少个字符,而使用%时匹配的范围太大,我们就可以用_来做通配符。就像是支付宝的万能福卡,一张万能福卡能且只能代表任意一张福卡(也就是它不能代表多张福卡)。
比方说我们想查询姓’范’,并且姓名只有2个字符的记录,可以这么写:
不过下边这个查询却什么都没有查到:
mysql> SELECT number, name, id_number, major FROM student_info WHERE name LIKE '杜_';
Empty set (0.00 sec)
mysql>
这是因为一个_只能代表一个字符(%是代表任意一个字符串),并且student_info表中并没有姓’杜’并且姓名长度是2个字符的记录,所以这么写是查不出东西的。
转义通配符
如果我们匹配的字符串中就包含普通字符’%‘或者’_'该咋办,怎么区分它是一个通配符还是一个普通字符呢?
答:如果匹配字符串中需要普通字符’%‘或者’_'的话,需要在它们前边加一个反斜杠\以和通配符区分开来
:
‘%‘代表普通字符’%’
‘_‘代表普通字符’_’
比方说这样:
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!
四、总结
-
我们需要将搜索条件放到WHERE子句中。针对不同的搜索条件,MySQL提供了非常丰富的操作符。
-
如果某一列可以匹配的值有多个,可以使用IN或者NOT IN操作符。
-
判断某个列的值是不是NULL,需要用IS NULL或者IS NOT NULL操作符。
-
我们可以将多个简单的搜索条件合并在一起组成一个更大搜索条件,各个简单的搜索条件可以用下边的几种操作符连接起来:
AND操作符:该操作符两边的搜索条件全部满足后整个搜索条件才算满足。
OR操作符:该操作符两边的搜索条件只需要满足一个整个搜索条件就满足了
- %代表任意一个字符串,_代表任意一个字符。如果需要把这两个通配符当作pu t不过需要特别注意的是,通配符不能代表NULL,如果需要匹配NULL的话,需要使用IS NULL或者IS NOT NULL!