子查询练习1

1.查询工资最低的员工的信息,这个不难吧,工资最低员工的信息,看最低工资是多少,这作为一个内查询的结果,

返回给外层,那就select last_name,salary from employees,大家刚开始写的时候,不要太着急,你看我现在的时候

是从外层写的,然后where你看salary等于多少,这怎么写,你看一下最低工资是多少,然后看看谁的工资等于最低工资,

我们那会写过类似的了,select,最低工资,这个就是返回公司当中员工的最低工资,然后看看谁的最低工资等于最低的,

这个人的信息

select last_name,salary from employees where salary > (select min(salary) from employees)

2. 查询平均工资最低的部门信息

查询平均工资最低的部门信息,平均工资最低的部门信息,我们说了,两种方式,一种是从内到外,一种是从外

到内,假设我们从内到外的话,平均工资最低的部门信息,最终肯定是求部门信息,这个肯定是外层了,我要是想

得到部门信息,你这个条件是什么,就是平均工资最低,第一步我是要先求出来,或者叫查询,查询公司的平均工资

是多少,查询公司的平均工资是多少,这个是不是得按照部门来,查询公司中各部门的,平均工资是多少,这一步查到

以后,下一步就是从各部门里面,有好多,我们看看谁的是最少的,找到平均工资中最少的那个,就是最少的平均工资,

最少的平均工资是多少,然后看看哪个部门的平均工资是最少的,这就是我们第三步要查的,哪个部门的平均工资等于

上一步第二步的结果,我这里就这样写了,大家想一想是这个意思不,我先查一下平均工资是多少,看看谁的平均工资

等于最少的,我们先做第一步,第一步不难,查询一下各部门的平均工资,按照部门来查,查平均工资,按照他查找平均工资,

然后找平均工资里面最少的

select avg(salary) from employees group by department_id

然后我直接一步往下放,找这里面最少的,我只需要这里面加一个min,现在求出来的就是最少的平均工资是多少

select min(avg(salary)) from employees group by department_id

然后我看看哪个部门的平均工资和这个一样呢,哪个部门的平均工资和这个一样呢,那你就要找这个部门,

那你就相当于select一下,哪个部门,平均工资,假设我需要找到这个id吧,from employees,看看哪个部门的

avg(salary)等于刚才算出来的这个,哪个部门等于它,哪个部门department_id,这里又有一个group by,你有

一个分组,按照部门来分,看看谁的平均工资等于刚才我们计算出来的这个,所以把它拿过来,这个题目我们就

做完了,先求出来平均工资最低的部门的信息,平均工资最低的部门信息,我先找到最低的平均工资是多少,

这是最低的平均工资,我看哪个部门的平均工资等于你的最低工资,然后得到结果,此处不允许使用分组函数,

我们这里要改成having,如果条件出现avg的话,出现了组函数的话,要把它改成having,来表示过滤,这个时候我们

再运行

select department_id from employees having avg(salary) = (select min(avg(salary)) from employees

group by department_id) group by department_id

50号部门,他想让你查询一下这个部门的信息,比如这个部门的位置在哪啊,或者你这个部门的名字叫什么啊,

这是不是相当于使用了另一个表,哪个部门的我们相当于还要再说一句,第四步,查询此部门的部门信息,这是我们

第四步要查询的,部门信息的话,那你就得是,select,我们就这样写吧,select * from departments,where department_id

等于我们刚才查询到的50号部门,所以你还得把它整个给扔进来,调整格式,这样吧,我们看一下

select * from departments where department_id = (select department_id from employees having 

avg(salary)=(select min(avg(salary)) from employees group by department_id) group by department_id)

50号部门,名字叫Shipping,manager_id,location_id,这是我们题目最终得到的结果,相当于我们通过四步查询,

分了四步,这个题目如果太复杂的话,我们可以考虑从内到外,一点点给他算出来,你看43题
3. 查询平均工资最低的部门信息和该部门的平均工资

select d.*, (select avg(salary) from employees where department_id = d.department_id)
from departments d
where d.department_id = (
      SELECT department_id
      FROM employees
      GROUP BY department_id 
      HAVING avg(salary) = (
			 SELECT min(avg(salary))
			 FROM employees
			 GROUP BY department_id
			  ) 
      )

跟这个题目有点像,但是还是有点不同,这个不仅查询部门信息还要查询一下平均工资,

那这个平均工资该怎么求,至少这个题目和这个有点像的,也得有这样几步,我们在这个题目的基础上我们来改一改,

现在我这个查询的效果我仅仅是把这个部门给列出来了,他除了让你找这个部门信息,还让你找这个部门的平均工资,

要求你这里输出了一个*,还得来一个avg,这个东西,输出这个部门的平均工资,这个部门的平均工资我们这里应该怎么去操作,

从这个结果看是50号部门,相当于找50号部门的平均工资,假设让大家输出50号部门的平均工资的话能不能输出来,这个题目稍微

有点难度的,这里我就直接这样来写了,我们这里再加入一个select,select什么啊,avg平均工资,from 当然还是employees这个表,

这个表你得有个条件吧,什么条件,就是你要查询的部门,相当于department_id得是50,这个语句表示的就是50号部门的平均工资,

他查询的是50号部门的平均工资,但是这个时候50号部门还不知道呢,最后我查询一下才知道是50,所以我们这里不能这样写,

我们这里写一个d,这是一个d,这里相当于是d.department_id来替代一下,你要查询的这个id,和我外层的这个d,它是一样的,

有一个连接,然后这个*是一个d点*

select d.*,(select avg(salary) from employees where department_id=d.department_id) from departments d

where department_id = (select department_id from employees having avg(salary)=(select min(avg(salary))

from employees group by department_id) group by department_id)

这个题目我们就这样操作完成了,这是有一些难度的,大家需要注意了,因为这里相当于后面这个信息,是用的

employees表,前面用的是departments这个表,那你要想他们两个在一个结果当中给他出现了,我们可以考虑

使用两个,他这个也相当于是一个子查询

4. 查询平均工资最高的 job 信息

	1). 按 job_id 分组, 查询最高的平均工资	
	SELECT max(avg(salary))
	FROM employees
	GROUP BY job_id
	
	2). 查询出平均工资等于 1) 的 job_id
	SELECT job_id
	FROM employees
	GROUP BY job_id
	HAVING avg(salary) = (
		SELECT max(avg(salary))
		FROM employees
		GROUP BY job_id
	)
	
	3). 查询出 2) 对应的 job 信息
	SELECT *
	FROM jobs
	WHERE job_id = (
		SELECT job_id
		FROM employees
		GROUP BY job_id
		HAVING avg(salary) = (
			SELECT max(avg(salary))
			FROM employees
			GROUP BY job_id
		)
	)

查询平均工资最高的job的信息,平均工资最高的job的信息,第一步捋一下,是不是要查询一下平均工资里面最高的是

多少,就是按job来分类,或者叫分组,查询最高的 平均工资是多少,这是第一步,第二步,我们得看一下哪个job_id的

平均工资等于最高的,查询得到哪个job_id的平均工资等于上问等于1得到的值,哪个job_id等于1得到最高的,这是不

是这个job_id找到的,job_id找到了就好办了,我再根据另一个表,就jobs表,从jobs表中返回job_id他的对应项的信息,

大家可以试着写这个问题了,那我们先看第一步,按job来分组,查询到最高的平均工资,select先找到平均工资,得分组吧,

group by job_id,按他来分组,我们找到各个job_id的平均,里边来找最大的,就是他,最大的平均工资

select max(avg(salary)) from employees group by job_id

然后看看哪个平均工资等于这个,那就是select我要找到你这个id,from employees,然后group by job_id,

那么这个条件还得写在这,where,看看avg(salary),看看谁等于这个最大值,那相当于把这个结果作为一个值返回给我们,

这个外层的过滤条件这,谁的平均工资等于这个最大的,现在找到这个job_id了

select job_id from employees having avg(salary) = (select max(avg(salary)) 

from employees group by job_id) 

group by job_id

id找到了,然后看看他的基本信息,select * from jobs,where job_id等于,这里面有一点需要注意的是啥,我们这里面

是一个值,单行的,有可能平均工资等于这个的,有可能是有多个,恰好有两个是一样的,那你这里用等号有可能会出问题,

我们先拿过来演示看看

select * from jobs where job_id = (select job_id from employees having avg(salary) = 

(select max(avg(salary)) from employees group by job_id) group by job_id)

尽量把格式给他对齐一下,大家看到这个问题了吧,他说此处不允许使用组函数,是这儿错了,先给他改成having,因为这是一个

组函数

这个结果出来了,那是因为这里恰好返回的是一个部门,最大的就是他自己,假设要有多个的话,

大家是不是要给他改成in

select * from jobs where job_id in (select job_id from employees having avg(salary)=

(select max(avg(salary)) from employees group by job_id) group by job_id)

改成in肯定是没错的,等号有时候是会出问题的,这是我们讲的这个题目,通过这几个题目大家应该越来越

熟悉怎么去写这个子查询,尤其这个题目比较复杂的时候,建议大家从内到外

45. 查询平均工资高于公司平均工资的部门有哪些?

	1). 查询出公司的平均工资
	SELECT avg(salary)
	FROM employees
	
	2). 查询平均工资高于 1) 的部门 ID
	SELECT department_id
	FROM employees
	GROUP BY department_id
	HAVING avg(salary) > (
		SELECT avg(salary)
		FROM employees
	)

查询平均工资高于公司平均工资的有哪些,我就得到部门id就行,平均工资高于公司平均工资,

我们就直接来写吧,他不是要查一下department_id吗,我顺便给你列一下你的平均工资是多少,

from employees,因为有一个非组函数,要写在group by当中,然后需要注意,是不是要看看各个部门的

avg(salary),比公司的平均工资高的,大于公司的平均工资,不用where就搞定了,平均工资高于公司的

平均工资的,高于公司的平均工资的,有哪些部门,就这样呗

select department_id,avg(salary) from departments group by department_id having 

avg(salary)>(select avg(salary) from employees)

6. 查询出公司中所有 manager 的详细信息.
	1). 查询出所有的 manager_id
	SELECT distinct manager_id
	FROM employeess
	
	2). 查询出 employee_id 为 1) 查询结果的那些员工的信息
	SELECT employee_id, last_name
	FROM employees
	WHERE employee_id in (
		SELECT distinct manager_id
		FROM employees
	)

查询出所有manager的详细信息,所有Manager的详细信息,你看manager_id是多少,manager的employee_id

给他输出来,这不就是这样,select详细信息那我就select*,from employees,所有manager的详细信息,那employee_id

恰好我这里要查询到的,返回manager_id,那你这样写的话,就得写in了,因为你不止一个employee_id,select manager_id,

from employees,这里查询所有是老板,什么叫老板,是管理者的,id都是哪些,他们这些人本身不就是employee吗,把它们

的信息都给输出出来,多行没法返回给一行的

select * from employees where employee_id = (select manager_id from employees)

select * from employees where employee_id = (select manager_id from employees)
各个部门中最高工资中最低部门的那个部门的最低工资是多少

47. 各个部门中 最高工资中最低的那个部门的 最低工资是多少
	1). 查询出各个部门的最高工资
	SELECT max(salary)
	FROM employees
	GROUP BY department_id
	
	2). 查询出 1) 对应的查询结果的最低值: 各个部门中最低的最高工资(无法查询对应的 department_id)
	SELECT min(max(salary))
	FROM employees
	GROUP BY department_id
	
	3). 查询出 2) 所对应的部门 id 是多少: 各个部门中最高工资等于 2) 的那个部门的 id
	SELECT department_id
	FROM employees
	GROUP BY department_id 
	HAVING max(salary) = (
		SELECT min(max(salary))
		FROM employees
		GROUP BY department_id
	)

我们一点点来理会这个题,他说各个部门中,最高工资中,各个部门都有一个最高工资,从最高工资里面找最低工资

的部门,那个部门里面的最低工资,看我举个例子,是这个意思,我们这里的各个部门,我们就以这个部门来说,假设

我这里有4个部门,A,B,C,D四个部门,这里有各个部门的公司员工,各个部门有最低的工资,也有最高的工资,还有其他的

乱七八糟的,然后你把最高的工资给拿出来,然后这个四个部门,把最高工资亮一亮,然后这个部门发现6500,这个7500,

这是8500,这个就是10000,这几个数,这几个最高工资里面,最低的就是6500,我找6500部门里面的,你这个部门里面的

最高的是6500,我找你这个部门里面最低的,我就想把你这里的2000给找到,这个题目大家看个明白,题目看懂以后,

我得找到这个最高工资,最高工资里面要看哪个最低,所以select最高max,from employees,得加上一个group by,

按照department_id来进行分组,分组以后我看看

select max(salary) from employees group by department_id

然后我看看这里面最小的那个

select min(max(salary)) from employees group by department_id

现在谁的最高工资等于4400,我想查询这个部门department_id,from employees,

where什么,having你的最高工资,等于我们刚才的这个值,然后你这里用的分组了,所以我们还得给你group by一下,

group by department_id,然后这个拿过来

select department_id,max(salary) from employees having max(salary) = (select min(max(salary)) 

from employees 

group by department_id) group by department_id

现在我就找到这个id了,我就看哪个部门是这么多

而且是这里面最少的一个

然后我看你10号部门的最低工资,那就好做了,select min(salary) from employees,

department_id等于10号部门,只不过我是通过查询的方式得到的

select min(salary) from employees where employee_id = (select department_id from employees 

having max(salary)=(select min(max(salary) from employees group by department_id))

group by department_id)

10部门的最高工资是4400,最低工资还是4400,我们写的没啥问题,我们看一下,这个部门就一个人,

select * from employees where department_id = 10

48. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
	
	1). 各个部门中, 查询平均工资最高的平均工资是多少
	SELECT max(avg(salary))
	FROM employees
	GROUP BY department_id
	
	
	2). 各个部门中, 平均工资等于 1) 的那个部门的部门号是多少
	SELECT department_id
	FROM employees
	GROUP BY department_id
	HAVING avg(salary) = (
		SELECT max(avg(salary))
		FROM employees
		GROUP BY department_id
	)
	
	
	
	3). 查询出 2) 对应的部门的 manager_id
	SELECT manager_id
	FROM departments
	WHERE department_id = (
		SELECT department_id
		FROM employees
		GROUP BY department_id
		HAVING avg(salary) = (
			SELECT max(avg(salary))
			FROM employees
			GROUP BY department_id
		)	
	)
	
	
	4). 查询出 employee_id 为 3) 查询的 manager_id 的员工的 last_name, department_id, email, salary
	SELECT last_name, department_id, email, salary
	FROM employees
	WHERE employee_id = (
		SELECT manager_id
		FROM departments
		WHERE department_id = (
			SELECT department_id
			FROM employees
			GROUP BY department_id
			HAVING avg(salary) = (
				SELECT max(avg(salary))
				FROM employees
				GROUP BY department_id
			)	
		)	
	)

查询平均工资最高部门的manager信息,平均工资最高的部门,找到平均工资最高的是多少,然后看哪个部门的平均工资等于

这个最高的,然后这个部门的manager有哪些,我们先找到平均工资最高的是多少,跟上面的题目是类似的,求平均工资,select 

avg(salary),按部门来

select avg(salary) from employees group by department_id

然后找这里面最大的

select max(avg(salary)) from employees group by department_id

然后我们要看看谁的额工资等于最高的,我们先看最高值是多少

我想查询一下部门id,group by department_id

select department_id from employees group by department_id having avg(salary) =

(select max(avg(salary)) from employees group by department_id)

哪个部门的平均工资等于这个值,哪个等于这个值,得到这个department_id

这个部门找到了,manager的信息,部门的manager信息,我先要看这个部门的manager_id有哪些,

where department_id等于刚才得到的90

select manager_id from employees where department_id = (select department_id from employees group by 

department_id having avg(salary)= (select max(avg(salary)) from employees group by department_id))

这个越写越长了,现在我是得到90号部门的manager_id,有哪些

manager_id两个,这两个都是100,相当于这里有两个员工,两个员工的manager_id都是他,你可以加上一个distinct,

select distinct manager_id from employees where department_id = (select department_id from employees

group by department_id having avg(salary) = (select max(avg(salary)) from employees 

group by department_id))

这不就是一个,我现在就想看这个人的这些信息,那就再加一层,看看他要求的这些信息,from employees,

where employee_id,因为你manager_id等于100,是不是这个100也是员工的employee_id,所以这里写100

就行,然后呢我给他整合在一起,这个大家要一层一层的写,每一层写好以后最好验证一下,运行一下看他成不成功,

你别最后写完以后再去验证,可能这个代码太多了,放在一块难免会出错,现在我看看这个人,他说单行子查询返回

多行的值,那我把这个等号改成in

select last_name,department_id,email,salary from employees where employee_id in (select distinct

manager_id from employees group by department_id having avg(salary)=(select max(avg(salary)) from 

employees group by department_id))

department_id90号部门,就是这个人,这是这个人的相信信息,我们这个题就搞定了,所以刚才你也看到了,

如果你真的是等号的话,如果真的是等号,还有大于,小于,不等于等等,如果是等号的话,你不凡给他改成in

更保险,因为八把不准里面就返回多行,这是我们的这个题,大家看最后一个

49. 查询 1999 年来公司的人所有员工的最高工资的那个员工的信息.
 		
		1). 查询出 1999 年来公司的所有的员工的 salary
		SELECT salary
		FROM employees
		WHERE to_char(hire_date, 'yyyy') = '1999'
		
		2). 查询出 1) 对应的结果的最大值
		SELECT max(salary)
		FROM employees
		WHERE to_char(hire_date, 'yyyy') = '1999'
		
		3). 查询工资等于 2) 对应的结果且 1999 年入职的员工信息		
		SELECT *
		FROM employees
		WHERE to_char(hire_date, 'yyyy') = '1999' AND salary = (
			SELECT max(salary)
			FROM employees
			WHERE to_char(hire_date, 'yyyy') = '1999'
		)

查询1999年来公司的人,1999年来公司的员工,最高工资中员工的信息,我找到99年来公司的人,这里面肯定有工资最高的,

我找到工资最高的那个人的信息,这个我们怎么写,他想查询这个人的信息,select,我写个*吧,我们从外层到内层,select 

* from employees,其实你从内到外也行,然后有一个限制条件,首先他的工资是不是要等于一个值,工资等于一个值的可能

有很多,而且这个人还是99年来公司的,99年来的我们已经有这个经验了,我们把hire_date转成一个char,转成以后,它是1999,

是这样吧,先这样来看的话就是,我想查询一下这个信息,什么信息,工资等于某个值,并且是99年来公司的,工资等于某个值的,

工资等于多少,这里面就是我们内层需要做的事了,内层需要做的事,这个你要返回给外层什么结果,就是99年来的最高工资,

找最高工资,select max(salary),from employees,这里成了员工当中最高的工资了,你得找99年来的,是不是还是这个,

你看看这里面是不是我们所想要的,99年来公司的员工当中的,最高工资,谁的工资等于这个最高工资,并且也是99年来的,

这就搞定了

select * from employees where salary = (select max(salary) from employees 

to_char(hire_date,'yyyy')='1999')

and to_char(hire_date,'yyyy')='1999'

你看看这个信息,99年来的,大家你写的时候尤其需要注意,最后这个别给丢了,很多人从内层往外层写的

时候,我说一下,很多人内层往外层写的时候,就这样操作写完,也就得了,这个是错的,你要这样写的话,

因为你内层是99年来的,他返回给外层的只返回一个公司的值,这个99年来的这个信息,并没有同步的返回

出去,所以还是的显示的再加上一个

你看你要是不加的话,你看这个结果

就是多个了,看一下他们的时间,其中有两个,所以你一定要给他加上,这是我们讲子查询比较容易出错的地方,

关于这里面的这些练习,我们就说完了

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值