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 employeesgroup 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)
3. 查询平均工资最低的部门信息和该部门的平均工资select d.*, (select avg(salary) from employees where department_id = d.department_id)
from departments d
where d.department_id = (SELECT department_idFROM employeesGROUP BY department_id HAVING avg(salary) = (SELECT min(avg(salary))FROM employeesGROUP 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 dwhere 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 employeesGROUP BY job_id2). 查询出平均工资等于 1) 的 job_idSELECT job_idFROM employeesGROUP BY job_idHAVING avg(salary) = (SELECT max(avg(salary))FROM employeesGROUP BY job_id)3). 查询出 2) 对应的 job 信息SELECT *FROM jobsWHERE job_id = (SELECT job_idFROM employeesGROUP BY job_idHAVING avg(salary) = (SELECT max(avg(salary))FROM employeesGROUP 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_idid找到了,然后看看他的基本信息,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,因为这是一个组函数
这个结果出来了,那是因为这里恰好返回的是一个部门,最大的就是他自己,假设要有多个的话,大家是不是要给他改成inselect * 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 employees2). 查询平均工资高于 1) 的部门 IDSELECT department_idFROM employeesGROUP BY department_idHAVING 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_idSELECT distinct manager_idFROM employeess2). 查询出 employee_id 为 1) 查询结果的那些员工的信息SELECT employee_id, last_nameFROM employeesWHERE employee_id in (SELECT distinct manager_idFROM 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 employeesGROUP BY department_id2). 查询出 1) 对应的查询结果的最低值: 各个部门中最低的最高工资(无法查询对应的 department_id)SELECT min(max(salary))FROM employeesGROUP BY department_id3). 查询出 2) 所对应的部门 id 是多少: 各个部门中最高工资等于 2) 的那个部门的 idSELECT department_idFROM employeesGROUP BY department_id HAVING max(salary) = (SELECT min(max(salary))FROM employeesGROUP 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, salary1). 各个部门中, 查询平均工资最高的平均工资是多少SELECT max(avg(salary))FROM employeesGROUP BY department_id2). 各个部门中, 平均工资等于 1) 的那个部门的部门号是多少SELECT department_idFROM employeesGROUP BY department_idHAVING avg(salary) = (SELECT max(avg(salary))FROM employeesGROUP BY department_id)3). 查询出 2) 对应的部门的 manager_idSELECT manager_idFROM departmentsWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING avg(salary) = (SELECT max(avg(salary))FROM employeesGROUP BY department_id) )4). 查询出 employee_id 为 3) 查询的 manager_id 的员工的 last_name, department_id, email, salarySELECT last_name, department_id, email, salaryFROM employeesWHERE employee_id = (SELECT manager_idFROM departmentsWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING avg(salary) = (SELECT max(avg(salary))FROM employeesGROUP 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_idselect 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等于刚才得到的90select 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 employeesgroup 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就行,然后呢我给他整合在一起,这个大家要一层一层的写,每一层写好以后最好验证一下,运行一下看他成不成功,你别最后写完以后再去验证,可能这个代码太多了,放在一块难免会出错,现在我看看这个人,他说单行子查询返回多行的值,那我把这个等号改成inselect last_name,department_id,email,salary from employees where employee_id in (select distinctmanager_id from employees group by department_id having avg(salary)=(select max(avg(salary)) from employees group by department_id))