六、mysql查询(二)

本文转载至微信公众号:我们都是小青蛙

一、数据准备

学生基本信息表:

学号姓名性别身份证号学院专业入学时间
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 = ‘论萨达姆的战争准备’
可以被看作下边这两个条件中任一条件成立则整个式子成立:

  1. score > 95

  2. score < 55 AND subject = ‘论萨达姆的战争准备’

因为结果集中subject是’母猪的产后护理’的记录中score值为100,符合第1个条件,所以整条记录会被加到结果集中。为了避免这种尴尬,在一个查询中有多个搜索条件时最好使用小括号()来显式的指定各个搜索条件的执行顺序,比如上边的例子可以写成下边这样:

在这里插入图片描述

通配符

有时候我们并不能精确的描述我们要查询的东西,比方说我们只是想看看姓’杜’的学生信息,而不能精确的描述出这些姓’杜’的同学的完整姓名,我们称这种查询为模糊查询。MySQL中使用下边这两个操作符来支持模糊查询:

操作符 示例 描述

LIKEa LIKE ba匹配b
NOT LIKEa NOT LIKE ba不匹配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!
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值