子查询

--  谁的工资比Abel高?

select  last_name, salary 
from employees 
where  salary>(select salary
               from employees 
               where  last_name = 'Abel'); 
LAST_NAME                     SALARY
------------------------- ----------
King                           24000 
Kochhar                        17000 
De Haan                        17000 
Hartstein                      13000 

--查询员工为Chen的manager的信息(Chen对应一个manager_id)

select last_name,salary 
from employees 
where employee_id = (select manager_id
                     from employees 
                     where last_name = 'Chen');
LAST_NAME                     SALARY
------------------------- ----------
Greenberg                      12000 

-- 返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资

select last_name, job_id,salary 
from employees
where  job_id = (select job_id 
                from employees 
                where employee_id=141) and
        salary >(select salary 
                from employees
                where employee_id = 143);        
LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Rajs                      ST_CLERK         3500 
Davies                    ST_CLERK         3100 
Nayer                     ST_CLERK         3200 
Mikkilineni               ST_CLERK         2700 

-- 查询最低工资大于50号部门的最低工资的部门id和其最低工资

select department_id,min(salary)
from employees 
group by department_id
having min(salary)>(select min(salary)
                     from employees
                     where department_id = 50);
DEPARTMENT_ID MIN(SALARY)
------------- -----------
                     7000 
          100        6900 
           30        2500 

-- 多行子查询

 --返回其他部门中比job_id为IT_PROG部门任一工资低的员工的员工号,姓名,job_id, salary

select employee_id,last_name,job_id,salary
from employees
where job_id <> 'IT_PROG' AND salary < any (select salary
                                              from employees
                                              where job_id = 'IT_PROG');
EMPLOYEE_ID LAST_NAME                 JOB_ID         SALARY
----------- ------------------------- ---------- ----------
        132 Olson                     ST_CLERK         2100 
        128 Markle                    ST_CLERK         2200 
        136 Philtanker                ST_CLERK         2200

子查询中的空值  空值了不会报错 空了就空了

练习:

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

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);                         
                     
DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           50 Shipping                              124        1500 

2.从 jobs 表中返回  job_id 的对应项的信息

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
JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AD_PRES    President                                20000      40000 

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

select department_id,avg(salary)
from  employees
group by  department_id
having avg(salary)>(
                  select avg(salary)
                  from employees
 )order by department_id asc;
DEPARTMENT_ID AVG(SALARY)
------------- -----------
           20        9500 
           40        6500 
           70       10000 
           80 8955.882353 

-- 4.各个部门中,最高工资中最低的那个部门的最低工资是多少

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

--各个部门最高工资最低的那个部门工资, 通过那个部门最高的工资 找到department_id,用到分组了最高得group by一下
select department_id
from employees
having max(salary) = (select min(max(salary)) 
                       from employees
                       group by department_id)
group by department_id;
--各个部门最高工资最低的那个部门工资
select min(max(salary)) 
from employees
group by department_id;
MIN(SALARY)
-----------
       4400 

-- 5.查询1999年来公司的员工中最高工资的那个员工的信息

select * 
from employees
where salary = (
                select max(salary)
                from employees
                where to_char(hire_date,'yyyy') = '1999'
                )
and to_char(hire_date,'yyyy') = '1999';
EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- --------- ---------- ---------- -------------- ---------- -------------
        148 Gerald               Cambrault                 GCAMBRAU                  011.44.1344.619268   15-10月-99 SA_MAN          11000            0.3        100            80 

-- 6.查询和Zlotkey相同部门的员工姓名和雇用日期

select last_name,hire_date
from employees
where department_id = (
                          select department_id
                          from employees
                        where last_name = 'Zlotkey'
                          )
and last_name <> 'Zlotkey'
LAST_NAME                 HIRE_DATE
------------------------- ---------
Abel                      11-5月 -96 
Taylor                    24-3月 -98 

--7.查询工资比公司平均工资高的员工的员工号,姓名和工资。

select last_name,employee_id,salary
from employees
where salary > (
                select avg(salary)
                from employees);
LAST_NAME                 EMPLOYEE_ID     SALARY
------------------------- ----------- ----------
King                              100      24000 
Kochhar                           101      17000 

-- 8.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资, 两个salary都是同一个部门 得建立关系

select employee_id,last_name,salary
from employees e1
where salary > (
                   select avg(salary)
                   from employees e2
                   where e1.department_id = e2.department_id
                   group by department_id
               );
EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        100 King                           24000 
        103 Hunold                          9000 

--9.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名

select employee_id,last_name
from employees
where department_id in (
                           select department_id
                           from employees
                           where last_name like '%u%'
                            )
    and last_name not like '%u%';
EMPLOYEE_ID LAST_NAME               
----------- -------------------------
        106 Pataballa                 
        107 Lorentz     

--10.查询在部门的location_id为1700的部门工作的员工的员工号

select employee_id
from employees
where department_id in (
                       select department_id
                       from departments
                       where location_id = 1700
                       );
EMPLOYEE_ID
-----------
        100 
        101 
        102 

--11.查询管理者是King的员工姓名和工资

select last_name,salary
from employees
where manager_id in (
                   select employee_id
                   from employees
                   where last_name = 'King'
                   )        
LAST_NAME                     SALARY
------------------------- ----------
Kochhar                        17000 
De Haan                        17000 
All that work will definitely pay off
原文地址:https://www.cnblogs.com/afangfang/p/12551370.html