📅  最后修改于: 2023-12-03 15:33:20.469000             🧑  作者: Mango
在 Oracle 数据库中,子查询(Subquery)指的是在 SQL 语句内部使用 SELECT 语句来作为另一条 SQL 语句的一部分执行。Oracle 的子查询可以用于 SELECT、INSERT、UPDATE 和 DELETE 等语句中。
子查询可以用于获取需要的信息,这个信息通常在查询中是找不到的。子查询返回的结果可以作为父查询中的某个条件进行查询。
子查询通常会包含在括号 ()
中,并作为主查询中的一个条件使用。如果子查询返回的结果只有一列,那么可以省略括号。
子查询的语法:
SELECT column1, column2...
FROM table_name
WHERE column1 OPERATOR (SELECT column1 FROM another_table WHERE condition);
column1, column2...
:要返回的列名。table_name
:要查询的表名。column1
:主查询中的某个列名。OPERATOR
:关键字,用于比较主查询中的某个列名和子查询返回的结果。another_table
:子查询中要查询的表名。condition
:子查询的条件。例如,查询出所有销售额大于平均销售额的销售员姓名和销售额:
SELECT salesperson_name, sales_amount
FROM sales
WHERE sales_amount > (SELECT AVG(sales_amount) FROM sales);
子查询分为以下几种类型:
标量子查询是一种只返回一行一列结果的子查询。通常用于比较或计算两个或多个值。
例如,查询出最低工资大于平均工资的部门名称:
SELECT department_name
FROM departments
WHERE department_id IN (SELECT department_id FROM employees WHERE salary > (SELECT AVG(salary) FROM employees));
行子查询是一种返回一个多行一列结果集的子查询。通常用于过滤数据。
例如,查询出领导的工资低于平均工资的部门名称:
SELECT department_name
FROM departments
WHERE department_id IN (SELECT department_id FROM employees WHERE job_id = 'PU_CLERK' AND salary > ALL (SELECT AVG(salary) FROM employees GROUP BY department_id));
列子查询是一种返回一个多列一行结果集的子查询。通常用于插入、更新、删除等语句中。
例如,插入新记录时使用另一张表的数据:
INSERT INTO new_table (column1, column2, column3)
SELECT column1, column2, column3
FROM another_table
WHERE condition;
在子查询中使用 EXISTS、ANY、ALL 等关键字可以更加灵活地查询数据。
例如,查询出销售员表中(salesperson)的所有销售员姓名和销售额,其中只有销售额高于其他销售员的一半以上的销售员被返回:
SELECT salesperson_name, sales_amount
FROM sales s1
WHERE s1.sales_amount > ALL (SELECT s2.sales_amount * 0.5 FROM sales s2 WHERE s1.salesperson_id <> s2.salesperson_id);
子查询是一种很有用的 SQL 技巧,能够更加灵活地查询数据,但是在使用时一定要小心,避免产生性能问题。