我是靠谱客的博主 文静犀牛,最近开发中收集的这篇文章主要介绍【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,sal
from emp
where sal > (select avg(sal) from emp);
-- 查询和CLARK同一部门且比他工资低的雇员名字和工资。
select ename,sal
from emp
where deptno = (select deptno from emp where ename = 'CLARK') 
      and 
      sal < (select sal from emp where ename = 'CLARK')
-- 查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息  
select * 
from emp
where job = (select job from emp where ename = 'SCOTT') 
      and 
      hiredate < (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 row
select * 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 emp
where sal < any(select sal from emp where job = 'CLERK')
and job != 'CLERK'
-- 单行子查询:
select * 
from emp
where 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)
union
select * from emp where deptno = 20 and sal = (select max(sal) from emp where deptno = 20)
union
select * 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练习-子查询】的全部内容,希望文章能够帮你解决【MySQL练习-子查询】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部