本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑
一.带IN关键字的子查询
in关键字可以检测结果集中是否存在某个特定的值,检测成功则执行外部查询
这里我们使用之前的文章已经创建过的图书借阅表和图书信息表,先查看两表中的图书id部分,结果如下图:
下面的语句的意思是通过in关键字从图书借阅表中查询图书id,前提条件是这个id在图书信息表也出现过,然后返回图书id,图书名,作者,价格可以看出上图中的图书信息表中的id有4个,但是查询记录只有三条即两表的公共部分
二.带exists关键字的子查询
使用exists关键字时,内层查询不返回查询记录而是返回一个布尔值,内层查询到满足条件的记录返回true然后外层语句进行查询否则外层语句不执行查询
如图,内层查询两表的公共id外层返回查询到的记录
三.带比较运算符的子查询
为了使读者更直观了解比较运算符查询我们新建了两个表为图书归还表和管理员信息表
然后我们插入数据包含姓名,年龄,部门
查看插入的结果
使用>号查询booknumber大于1的所有记录,由上图可知只有一条记录
下图是我们查询booknumber>=1的结果,limit 1限制结果为1条,不加会报错
我们注意下图有一条报错,报错原因是查询到的记录不止一条,有多条记录,这也是比较运算符的一个易错点,一般我们只需要满足条件的一条记录比如最高的或者最低的才使用比较运算符,如果需要多条结果则使用ALL/ANY关键字,下面会讲,这是小编实践发现的
我们改进的报错措施有三条:
1.使用limit 1限制结果为1条
2.使用ALL/ANY关键字显示多条记录
3.使用join on外连接查询
我们要想查询图书归还涉及的管理员信息可以采用in关键字,结果如上,所以关键字是需要活学活用的
四.带ANY和ALL关键字的子查询
第一步:我们先建立一个数据库,并创建一个学生成绩的表,包含学生的班级,姓名,班号
第二步:填充表数据并查看
插入数据代码:
insert into tb_student(classid,name,score) values
(13,'顾大可',60),
(14,'王三水',65),
(15,'王四火',80),
(13,'王光军',70);
插入结果如下图:
这里的classid的第一位数字表示年级,第二位数字表示班级,如13表示一年级三班
第三步:使用ANY关键字查询比一年级三班最低分高的所有学生的信息
语句如下:
select *from tb_student
where score>any(select score from tb_student where classid=13);
查询结果如下图,可以看出一年级三班的学生最低分是60分,所以比60分高的数据都被查了出来
总结:ANY关键字只要满足内层查询语句返回的结果中的任意一个就可以通过该条件就可以执行外层语句。相当于逻辑运算符中的或运算符
第四步:使用ALL关键字查询比一年级三班最高分高的所有学生的信息
语句如下:
select *from tb_student
where score>all(select score from tb_student where classid=13);
查询结果如下图,可以看出一年级三班的学生最高分是70分,所以比70分高的数据只有80被查了出来
总结:ALL关键字只要满足内层查询语句返回的所有结果才可以执行外层语句,相当于逻辑运算符中的与运算符
误区警示:使用select语句时一定要加from,切记一定要加!!!不加不会报错但会导致灾难性的结果!!!
这是小编在实践过程中忘了加from才发现的误区,但是奇怪的是系统没有报错,只是查询结果与正确结果相差很大,看下图:
这是使用ALL关键字不加from的结果,比正确结果多了一条记录
再来看一下使用ANY关键字不加from的结果
更是离了大谱了,直接成空集了,演都不演了
小编的教训希望能引起读者的高度重视