• SQL练习 高级子查询



    • 书写多列子查询
    • 在 FROM 子句中使用子查询
    • 在SQL中使用单列子查询
    • 书写相关子查询
    • 使用 EXISTS 和 NOT EXISTS 操作符
    • 使用子查询更新和删除数据
    • 使用 WITH 子句


    --多列子查询(不成对比较 & 成对比较)
    1. 查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_id, manager_id, department_id


    [方式一]
    SELECT employee_id, manager_id, department_id
    FROM employees
    WHERE manager_id IN
    (SELECT manager_id
    FROM employees
    WHERE employee_id IN (174,141))
    AND department_id IN
    (SELECT department_id
    FROM employees
    WHERE employee_id IN (174,141))
    AND employee_id NOT IN(174,141);


    [方式二]
    SELECT employee_id, manager_id, department_id
    FROM employees
    WHERE (manager_id, department_id) IN
    (SELECT manager_id, department_id
    FROM employees
    WHERE employee_id IN (141,174))
    AND employee_id NOT IN (141,174);

    --在 FROM 子句中使用子查询
    2. 返回比本部门平均工资高的员工的last_name, department_id, salary及平均工资
    [方式一]
    select last_name,department_id,salary,
    (select avg(salary)from employees e3
    where e1.department_id = e3.department_id
    group by department_id) avg_salary
    from employees e1
    where salary >
    (select avg(salary)
    from employees e2
    where e1.department_id = e2.department_id
    --group by department_id
    )


    [方式二]
    SELECT a.last_name, a.salary,
    a.department_id, b.salavg
    FROM employees a, (SELECT department_id,
    AVG(salary) salavg
    FROM employees
    GROUP BY department_id) b
    WHERE a.department_id = b.department_id
    AND a.salary > b.salavg;

    --单列子查询表达式
    • Oracle8i 只在下列情况下可以使用, 例如:
    – SELECT 语句 (FROM 和 WHERE 子句)
    – INSERT 语句中的VALUES列表中
    • Oracle9i中单列子查询表达式可在下列情况下使用:
    – DECODE 和 CASE
    – SELECT 中除 GROUP BY 子句以外的所有子句中


    3. 显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’。
    SELECT employee_id, last_name,
    (CASE department_id
    WHEN (SELECT department_id FROM departments
    WHERE location_id = 1800)
    THEN 'Canada' ELSE 'USA' END) location
    FROM employees;

    4. 查询员工的employee_id,last_name,要求按照员工的department_name排序
    SELECT employee_id, last_name
    FROM employees e
    ORDER BY (SELECT department_name
    FROM departments d
    WHERE e.department_id = d.department_id);

    5.查询员工中工资大于本部门平均工资的员工的last_name,
    salary和其department_id
    SELECT last_name, salary, department_id
    FROM employees outer
    WHERE salary >
    (SELECT AVG(salary)
    FROM employees
    WHERE department_id =
    outer.department_id) ;

    6. 若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同id的员工的employee_id,last_name和其job_id
    SELECT e.employee_id, last_name,e.job_id
    FROM employees e
    WHERE 2 <= (SELECT COUNT(*)
    FROM job_history
    WHERE employee_id = e.employee_id);

    --EXISTS 操作符
    • EXISTS 操作符检查在子查询中是否存在满足条件的行
    • 如果在子查询中存在满足条件的行:
    – 不在子查询中继续查找
    – 条件返回 TRUE

    7. 查询公司管理者的employee_id,last_name,job_id,
    department_id信息
    SELECT employee_id, last_name, job_id, department_id
    FROM employees outer
    WHERE EXISTS ( SELECT 'X'
    FROM employees
    WHERE manager_id =
    outer.employee_id);

    8. 查询departments表中,不存在于employees表中的部门的department_id和department_name
    SELECT department_id, department_name
    FROM departments d
    WHERE NOT EXISTS (SELECT 'X'
    FROM employees
    WHERE department_id
    = d.department_id);

    --关于数据更新
    9.修改表employees,添加department_name列,赋予department_id相应的部门名称。

    ALTER TABLE employees
    ADD(department_name VARCHAR2(14));

    UPDATE employees e
    SET department_name =
    (SELECT department_name
    FROM departments d
    WHERE e.department_id = d.department_id);

    --关于数据删除
    10.删除表employees中,其与emp_history表皆有的数据
    DELETE FROM employees E
    WHERE employee_id in
    (SELECT employee_id
    FROM emp_history
    WHERE employee_id = E.employee_id);

    --WITH 子句
    11. 查询公司中各部门的总工资大于公司中各部门的平均总工资的部门信息
    WITH
    dept_costs AS (
    SELECT d.department_name, SUM(e.salary) AS dept_total
    FROM employees e, departments d
    WHERE e.department_id = d.department_id
    GROUP BY d.department_name),
    avg_cost AS (
    SELECT SUM(dept_total)/COUNT(*) AS dept_avg
    FROM dept_costs)
    SELECT *
    FROM dept_costs
    WHERE dept_total >
    (SELECT dept_avg
    FROM avg_cost)
    ORDER BY department_name;

    附加题目:
    12.查询员工的last_name, department_id, salary.其中员工的salary,department_id与有奖金的任何一个员工的salary,
    department_id相同即可

    select last_name, department_id, salary
    from employees
    where (salary,department_id) in (
    select salary,department_id
    from employees
    where commission_pct is not null
    )

    13.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary

    select last_name, job_id, salary
    from employees
    where salary > all(
    select salary
    from employees
    where job_id = 'SA_MAN'
    )

    14.选择所有没有管理者的员工的last_name

    select last_name
    from employees e1
    where not exists (
    select 'A'
    from employees e2
    where e1.manager_id = e2.employee_id
    )


    15. 查询10,50,20号部门的job_id,department_id并且department_id按10,50,20的顺序排列
    Column dummy noprint;
    select job_id , department_id ,1 dummy
    from employees
    where department_id = 10
    union
    select job_id , department_id , 2
    from employees
    where department_id = 50
    union
    select job_id , department_id , 3
    from employees
    where department_id= 20
    order by 3

  • 相关阅读:
    Web自动化测试之滑动验证码的解决方案
    设计模式之单例
    设计模式之原型
    设计模式之建造者
    DG环境RMAN删除归档报错RMAN-08137: archived log not deleted【转载】
    RFS[3]: No standby redo logfiles available for thread 1
    spring-boot之webflux简单入门
    spring-boot-security组件总结补充
    spring-boot启用security组件 · 下
    spring-boot启用security组件 · 中
  • 原文地址:https://www.cnblogs.com/fengze/p/6784954.html
Copyright © 2020-2023  润新知