📜  Oracle子查询(1)

📅  最后修改于: 2023-12-03 15:33:20.469000             🧑  作者: Mango

Oracle子查询

在 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 关键字

在子查询中使用 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 技巧,能够更加灵活地查询数据,但是在使用时一定要小心,避免产生性能问题。