• Mysql:相关子查询


    相关子查询

    如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询
    相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。相当于Java的两层嵌套for
    image

    题目1:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
    方式1:
    image

    方式2:

    SELECT last_name,salary,e1.department_id 
    FROM employees e1,
    (	SELECT department_id,AVG(salary) dept_avg_sal 
    	FROM employees 
    	GROUP BY department_id) e2 
    WHERE e1.`department_id` = e2.department_id AND e2.dept_avg_sal < e1.`salary`;
    

    题目2:若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 与 NOT EXISTS关键字

    子查询是经常和EXISTS 与 NOT EXISTS来搭配使用。英译是存在和不存在的意思,但他的用法更符合“满足”的意思。
    题目1:查询公司管理者的employee_id,last_name,job_id,department_id信息

    SELECT employee_id, last_name, job_id, department_id 
    FROM employees e1 
    WHERE EXISTS ( 
    	SELECT 1 FROM employees e2 WHERE e2.manager_id = e1.employee_id
    );
    

    遍历e1表的数据,当前行记录如果满足于EXISTS中的子查询,则当前记录是会被查出来。

    题目2:查询departments表中,不存在于employees表中的部门的department_id和department_name

    SELECT 
    department_id, 
    department_name 
    FROM departments d
    WHERE NOT EXISTS (
    	SELECT 1 FROM employees WHERE department_id = d.department_id
    );
    

    遍历e1表的数据,当前行记录如果不满足于EXISTS中的子查询,则当前记录是会被查出来。

  • 相关阅读:
    Linux中的文件特殊权限
    服务器管理
    程序图表统计知识
    EasyUI 添加tab页(iframe方式)
    打造自己的reset.css
    CI的知识点
    easyui资源
    eval解析JSON中的注意点
    如何在一个frame中调用另一个frame中的javascript函数
    Egret 摇一摇功能
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/16692813.html
Copyright © 2020-2023  润新知