SQL数据处理之查询(2)子查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TDCQZD/article/details/82708403

一、子查询语法

1、子查询 (内查询) 在主查询之前一次执行完成。
2、子查询的结果被主查询(外查询)使用 。

二、分类:单行子查询 和 多行子查询

这里写图片描述
注意事项
1)子查询要包含在括号内。
2)将子查询放在比较条件的右侧。
3)单行操作符对应单行子查询,多行操作符对应多行子查询。

三、单行子查询

1、基本介绍

  • 只返回一行。
  • 使用单行比较操作符。

2、执行单行子查询实操:

#题目:返回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
        );

3、在子查询中使用组函数

#题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
        SELECT MIN(salary)
        FROM employees
        );

4、子查询中的 HAVING 子句

  • 首先执行子查询。
  • 向主查询中的HAVING 子句返回结果。
#题目:查询最低工资大于50号部门最低工资的部门id和其最低工资

SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary ) > (
            #查询50号部门的最低工资
            SELECT MIN(salary)
            FROM employees
            WHERE department_id = 50
            );

5、子查询中的空值问题
如果为空,子查询不返回任何行

# 子查询中的空值问题
SELECT last_name, job_id
FROM   employees
WHERE  job_id =
                (SELECT job_id
                 FROM   employees
                 WHERE  last_name = 'Haas');

6、非法使用子查询

#错误原因:Subquery returns more than 1 row。因为内查询是一个多行子查询,却使用了单行子查询的运算符。
SELECT employee_id, last_name
FROM   employees
WHERE  salary =
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id
                 );

四、多行子查询

这里写图片描述
1、在多行子查询中使用IN操作符

#多行子查询
# in的使用
SELECT employee_id, last_name
FROM   employees
WHERE  salary IN
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id
                 );

2、在多行子查询中使用 ANY 操作符

any 的使用
#题目:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary

SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(
        #job_id为‘IT_PROG’部门的员工工资
        SELECT salary
        FROM employees
        WHERE job_id = 'IT_PROG'
        )
AND job_id <> 'IT_PROG';

3、子查询中的空值问题

SELECT emp.last_name
FROM   employees emp
WHERE  emp.employee_id NOT IN
                             (SELECT mgr.manager_id
                              FROM   employees mgr);

4、如何使用子查询。
在查询时基于未知的值时,应使用子查询。

五、子查询相关性与不相关性

所有的子查询可以分为两类,即相关子查询和非相关子查询
1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。
2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
3)故非相关子查询比相关子查询效率高

#非相关查询
# 查询工资比公司平均工资高的员工的员工号,姓名和工资。
SELECT employee_id,last_name,salary
FROM employees
WHERE salary > (
        SELECT AVG(salary)
        FROM employees
        );
#相关查询: 
#查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
SELECT employee_id,last_name,salary
FROM employees e1
WHERE salary > (
        SELECT AVG(salary)
        FROM employees e2
        WHERE e1.`department_id` = e2.`department_id`
        );

猜你喜欢

转载自blog.csdn.net/TDCQZD/article/details/82708403
今日推荐