Oracle系列七 子查询

子查询语法

SELECT    select_list
FROM    table
WHERE    expr operator
             (SELECT    select_list
                FROM        table);
  • 子查询 (内查询) 在主查询之前一次执行完成。
  • 子查询的结果被主查询(外查询)使用 。

示例:

SELECT
    last_name
FROM
    employees
WHERE
    salary > (
        SELECT
            salary
        FROM
            employees
        WHERE
            last_name = ‘Abel‘
    );

注意事项

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


子查询类型

单行子查询

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

示例:

  • 返回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
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
    last_name,
    job_id
FROM
    employees
WHERE
    job_id = (
        SELECT
            job_id
        FROM
            employees
        WHERE
            last_name = ‘Haas‘
    );

多行子查询

  • 返回多行。
  • 使用多行比较操作符。

在多行子查询中使用 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‘;

子查询中的空值问题

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

原文地址:https://www.cnblogs.com/loaderman/p/11738014.html

时间: 2024-10-18 00:11:47

Oracle系列七 子查询的相关文章

彻底搞懂oracle的标量子查询

oracle标量子查询和自定义函数有时用起来比较方便,而且开发人员也经常使用,数据量小还无所谓,数据量大,往往存在性能问题. 以下测试帮助大家彻底搞懂标量子查询. SQL> create table a (id int,name varchar2(10)); Table created. SQL> create table b (id int,name varchar2(10)); Table created. SQL> insert into a values (1,'a1'); 1

[转]Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

Oracle with重用子查询

--with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开始,通过 with 子句可以给予子查询指定一个名称,并且使得在一条语句中可以完成所有任务,从而避免了使用临时表. [email protected] test10g> with summary as (  2  select dname, sum(sal) dept_total from emp,

【SqlServer系列】子查询

1   概述 1.1  已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlServer系列]表连接 1.2  本篇文章内容概要 子查询和表连接,主要是针对两张及以上表之间关联关系进行查询.子查询,按是否独立划分,分为独立子查询和相关子查询:按内部查询返回是否为单值,分为单值子查询(注意:应理解单值子查询和标量子查询关系)和多值子查询:如下表格内容为按子查询是否独立来划分

Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

Oracle 笔记之子查询

子查询 当我们的一个操作需要基于另一个查询记过,那么就先行执行的这个查询就是子查询 子查询分为: 单行单列子查询:查的结果只有一行,且只有一个字段 多行单列子查询:查询出来的结果有多行,但只有一列 多行多列子查询 查询出多行多个列. 通常,单行单列与多行多列子查询用于where子句中而多行多列子查询用于 FROM子句中. --查看和SCOTT相同职位的其他员工 SELECT ename,sal,job FROM emp WHERE job=(SELECT job FROM emp WHERE e

MySQL---数据库从入门走上大神系列(四)-子查询、表与表之间的关系

本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系! 准备: 首先我们创建一列sex.再为部分行设置好值0(女)或者1(男): delete from stud where age=26; 删除年龄为26的行. update stud set sex='1' where saddress like '湖南%'; 将地址中湖南开头的人的的sex修改为1. update stud set sex='0' where age>=30 and sex is null;

优化系列 | DELETE子查询改写优化

0.导读 有个采用子查询的DELETE执行得非常慢,改写成SELECT后执行却很快,最后把这个子查询DELETE改写成JOIN优化过程 1.问题描述 朋友遇到一个怪事,一个用子查询的DELETE,执行效率非常低.把DELETE改成SELECT后执行起来却很快,百思不得其解. 下面就是这个用了子查询的DELETE了: [[email protected]]mydb > EXPLAIN delete from trade_info where id in ( select id from ( sel

Oracle篇 之 子查询

子查询:先执行内部再外部 Select last_name,salary,dept_id From s_emp Where dept_id in ( Select dept_id From s_emp Where dept_id is not null ); Select last_name,dept_id From s_emp Where dept_id = ( Select dept_id From s_emp Where last_name=’Smith’ ); Select salary