> 文档中心 > 【MySQL练习-子查询】

【MySQL练习-子查询】

跟大家一起学习也有一段日子了,而我给大家分享的MySQL基础操作也即将告一段落(不是今天),欸嘿,皮一下很开心。咱们言归正传,其实呢,这段时间给大家分享知识是令我灰常开心的一件事情,我每天都会登上CSDN看看有没有跟我一样醉心于学习的熊孩子(其实是看阅读量涨了没有啦)。大概在这一两天内会结束MySQL基础操作的分享,可能会给大家分享一些python的基础语法和进阶编程啥的,大家也不要嫌弃哈。闲话少说,进入今天的正题。

子查询

【1】什么是子查询?
一条SQL语句含有多个select。

-- 引入子查询:-- 查询所有比“CLARK”工资高的员工的信息  -- 步骤1:“CLARK”工资select sal from emp where ename = 'CLARK'  -- 2450-- 步骤2:查询所有工资比2450高的员工的信息  select * from emp where sal > 2450;-- 两次命令解决问题 --》效率低 ,第二个命令依托于第一个命令,第一个命令的结果给第二个命令使用,但是-- 因为第一个命令的结果可能不确定要改,所以第二个命令也会导致修改-- 将步骤1和步骤2合并 --》子查询:select * from emp where sal > (select sal from emp where ename = 'CLARK');-- 一个命令解决问题 --》效率高

【2】执行顺序:
先执行子查询,再执行外查询;
【3】不相关子查询:
子查询可以独立运行,称为不相关子查询。
【4】不相关子查询分类:
根据子查询的结果行数,可以分为单行子查询和多行子查询。

单行子查询

不跟大家多哔哔嗷,直接整硬菜。

-- 单行子查询:-- 查询工资高于平均工资的雇员名字和工资。select ename,salfrom empwhere sal > (select avg(sal) from emp);-- 查询和CLARK同一部门且比他工资低的雇员名字和工资。select ename,salfrom empwhere deptno = (select deptno from emp where ename = 'CLARK')andsal < (select sal from emp where ename = 'CLARK')-- 查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息  select * from empwhere job = (select job from emp where ename = 'SCOTT')andhiredate < (select hiredate from emp where ename = 'SCOTT')

多行子查询

-- 多行子查询:--1】查询【部门20中职务同部门10的雇员一样的】雇员信息。-- 查询雇员信息select * from emp;-- 查询部门20中的雇员信息select * from emp where deptno = 20;-- CLERK,MANAGER,ANALYST-- 部门10的雇员的职务:select job from emp where deptno = 10; -- MANAGER,PRESIDENT,CLERK-- 查询部门20中职务同部门10的雇员一样的雇员信息。select * from emp where deptno = 20 and job in (select job from emp where deptno = 10)-- > Subquery returns more than 1 rowselect * from emp where deptno = 20 and job = any(select job from emp where deptno = 10)--2】查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。-- 查询雇员的编号、名字和工资select empno,ename,sal from emp-- “SALESMAN”的工资:select sal from emp where job = 'SALESMAN'-- 查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。-- 多行子查询:select empno,ename,sal from emp where sal > all(select sal from emp where job = 'SALESMAN');-- 单行子查询:select empno,ename,sal from emp where sal > (select max(sal) from emp where job = 'SALESMAN');--3】查询工资低于任意一个“CLERK”的工资的雇员信息。  -- 查询雇员信息select * from emp;-- 查询工资低于任意一个“CLERK”的工资的雇员信息select * from empwhere sal < any(select sal from emp where job = 'CLERK')and job != 'CLERK'-- 单行子查询:select * from empwhere sal < (select max(sal) from emp where job = 'CLERK')and job != 'CLERK'

WARNING:代码有点多,大家慢慢看嗷,我不催你们!

相关子查询

【1】不相关的子查询引入:
不相关的子查询:子查询可以独立运行,先运行子查询,再运行外查询。
相关子查询:子查询不可以独立运行,并且先运行外查询,再运行子查询

【2】不相关的子查询优缺点:
好处:简单 功能强大(一些使用不相关子查询不能实现或者实现繁琐的子查询,可以使用相关子查询实现)
缺点:稍难理解

【3】sql展示:

--1】查询最高工资的员工  (不相关子查询)select * from emp where sal = (select max(sal) from emp)--2】查询本部门最高工资的员工   (相关子查询)-- 方法1:通过不相关子查询实现:select * from emp where deptno = 10 and sal = (select max(sal) from emp where deptno = 10)unionselect * from emp where deptno = 20 and sal = (select max(sal) from emp where deptno = 20)unionselect * from emp where deptno = 30 and sal = (select max(sal) from emp where deptno = 30)-- 缺点:语句比较多,具体到底有多少个部分未知-- 方法2: 相关子查询select * from emp e where sal = (select max(sal) from emp where deptno = e.deptno) order by deptno--3】查询工资高于其所在岗位的平均工资的那些员工  (相关子查询)-- 不相关子查询:select * from emp where job = 'CLERK' and sal >= (select avg(sal) from emp where job = 'CLERK')union ......-- 相关子查询:select * from emp e where sal >= (select avg(sal) from emp e2 where e2.job = e.job)

想对大家说的话

说来还挺不好意思的,跟大家相处这么久的时间,每天都是开心且充实的,精神上的愉悦直接拉满。虽然我看不到你们在物质形态上的具体展现,但我还是能感觉到你们的存在。只不过我也与你们没有什么交流,也不知道自己写的到底怎么样,是令人嗤之以鼻,还是赞赏有加,亦或是有待进步,所以我特别期待大家的反馈。我也想把文章写得像红毛辰东(东哥莫怪)那样大气磅礴,引人入胜,奈何境界还未臻至造化之境,所以需要各位道友助我一臂之力,让我以后为大家带来耳目一新的文章。看到这儿,道友还不吱一声再走???
【MySQL练习-子查询】