Oracel_子查询

SQL子查询

子查询语法

SELECT  select_list
FROM  table
WHERE expr operator
      (SELECT select_list
         FROM table)
  • 子查询 (内查询) 在主查询之前一次执行完成。
  • 子查询的结果被主查询(外查询)使用 。
  • 示例 :谁的工资比 Abel 高?
SELECT last_name
FROM   employees
WHERE  salary >
               (SELECT salary
                FROM   employees
                WHERE  last_name = 'Abel');

子查询注意事项

  • 子查询要包含在括号内。
  • 将子查询放在比较条件的右侧。
  • 单行操作符对应单行子查询,多行操作符对应多行子查询。

子查询类型

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

单行子查询 | center

单行操作符 | center

  • 执行单行子查询
-- 题目:返回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 = 140)
AND SALARY > (
  SELECT SALARY
  FROM EMPLOYEES
  WHERE EMPLOYEE_ID = 143)
  • 在子查询中使用组函数
-- 题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE SALARY = (
    SELECT "MIN" (SALARY)
    FROM EMPLOYEES)
  • 子查询中的 HAVING 子句
    • 首先执行子查询。
    • 向主查询中的HAVING 子句返回结果。
-- 题目:查询最低工资大于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)
  • 非法使用子查询

错误示例:多行子查询使用单行比较符

SELECT employee_id, last_name
FROM   employees
WHERE  salary =
               (SELECT   MIN(salary)
               FROM     employees
                GROUP BY department_id);
  • 子查询中的空值问题

错误示例:子查询不返回任何行

SELECT last_name, job_id
FROM   employees
WHERE  job_id =
               (SELECT job_id
                FROM   employees
                WHERE  last_name = 'Haas');
多行子查询
  • 返回多行。
  • 使用多行比较操作符
  • 体会any和all的区别

多行子查询 | center

多行操作符 | center

  • 在多行子查询中使用 ANY 操作符
-- 题目:返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE SALARY < ANY
         (SELECT SALARY 
        FROM EMPLOYEES
        WHERE JOB_ID = 'IT_PROG')
AND JOB_ID != 'IT_PROG'
  • 在多行子查询中使用 ALL 操作符
-- 题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id 以及salary
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE SALARY < ALL
        (SELECT SALARY 
        FROM EMPLOYEES
        WHERE JOB_ID = 'IT_PROG')
AND JOB_ID != 'IT_PROG'
  • 子查询中的空值问题
-- no rows selected
SELECT emp.last_name
FROM   employees emp
WHERE  emp.employee_id NOT IN
                             (SELECT mgr.manager_id
                              FROM   employees mgr);
人生如棋,我愿为为卒;行走虽慢,可曾见我后退一步!
原文地址:https://www.cnblogs.com/MPPC/p/5924750.html