Mysql从入门到精通day5————子查询精讲

本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑

一.带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关键字的子查询

第一步:我们先建立一个数据库,并创建一个学生成绩的表,包含学生的班级,姓名,班号

第二步:填充表数据并查看

插入数据代码:

sql 复制代码
insert into tb_student(classid,name,score) values
(13,'顾大可',60),
(14,'王三水',65),
(15,'王四火',80),
(13,'王光军',70);

插入结果如下图:

这里的classid的第一位数字表示年级,第二位数字表示班级,如13表示一年级三班

第三步:使用ANY关键字查询比一年级三班最低分高的所有学生的信息
语句如下:

sql 复制代码
select *from tb_student
where score>any(select score from tb_student where classid=13);

查询结果如下图,可以看出一年级三班的学生最低分是60分,所以比60分高的数据都被查了出来

总结:ANY关键字只要满足内层查询语句返回的结果中的任意一个就可以通过该条件就可以执行外层语句。相当于逻辑运算符中的或运算符

第四步:使用ALL关键字查询比一年级三班最高分高的所有学生的信息

语句如下:

sql 复制代码
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的结果


更是离了大谱了,直接成空集了,演都不演了

小编的教训希望能引起读者的高度重视

相关推荐
不像程序员的程序媛7 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
Jane Chiu8 小时前
Oracle DBMS_REDEFINITION(在线重定义)
数据库·oracle·分区表
我叫黑大帅8 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
全栈前端老曹9 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
怕孤单的草丛9 小时前
缓存管理面临的主要问题
java·数据库·缓存
我会尽全力 乐观而坚强9 小时前
MySQL零基础入门(二)
数据库·mysql·adb
kali-Myon11 小时前
某校园门禁系统高危 SQL 注入漏洞挖掘复盘
数据库·sql·安全·web安全
程序员在囧途12 小时前
likeadmin-api API 中转站怎么做统一报价?从 /pricing、/user/balance 到 task_id 回执的落地方法
运维·服务器·数据库·likeadmin-api·api中转站·token计费
龙石数据12 小时前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台