PL/SQL

PL/SQL 知识量:16 - 57 - 244

7.5 子查询><

子查询概述- 7.5.1 -

子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句,或者其他子查询中的查询,任何允许使用表达式的地方都可以使用子查询。子查询和表的连接一样,提供了使用单个查询访问多个表中的数据的方法。

子查询也称为内部查询或内部选择,它本质上也是一种嵌入的SELECT语句,而包含子查询的语句也称为外部查询或外部选择。子查询不但可以出现在WHERE子句中,而且可以出现在FROM子句中,作为一个临时表使用;也可以出现在SELECT子句中,作为一个字段值返回。

在相关子查询中,由于子查询是在外部查询返回的结果集上执行的,因此它的效率肯定有所下降。如果相关子查询的语句写得很有效率,那么它的执行效率将能够超过那些使用多个连接和临时表的程序。

非相关子查询- 7.5.2 -

子查询分为非相关子查询和相关子查询。

非相关子查询是指作为子查询的查询能够独立运行,并不依赖外部查询的数据和结果。

以下示例查询销量排名前3的书籍的名称和价格:

SQL> select * from books;

 ID NAME        PRICE
--- ---------- ------
  1 SQL            50
  2 MySQL          32
  3 CSS            50
  4 Java       
  5 JavaScript 
  6 Python         32
  7 C++            66
  8 C              70

8 rows selected


SQL> select * from sale;

NAME          NUM
---------- ------
CSS          2234
Java          256
SQL            85
C++          8455
C            1208

SQL> select b.name,b.price
     from books b 
     where name in 
         (select * 
         from (select s.name from sale s order by s.num desc)
         where rownum<4
         );

NAME        PRICE
---------- ------
C++            66
CSS            50
C              70

以上代码中,子查询的功能是查询销量的排名。为实现取排序前3名,使用了嵌套的两个子查询。

相关子查询- 7.5.3 -

相关子查询与非相关子查询的区别在于:相关子查询引用了外部查询中的列。这种用外部查询来限制子查询的方法使SQL查询变得更加强大和灵活。因为相关子查询能够引用外部查询,所以它们尤其适合编写复杂的WHERE条件。

以下示例查询价格不低于平均价格的图书信息:

SQL> select * from books;

 ID NAME        PRICE
--- ---------- ------
  1 SQL            50
  2 MySQL          32
  3 CSS            50
  4 Java       
  5 JavaScript 
  6 Python         32
  7 C++            66
  8 C              70

8 rows selected


SQL> select name,price from books where price>=(select avg(price) from books);

NAME        PRICE
---------- ------
SQL            50
CSS            50
C++            66
C              70

子查询的组成- 7.5.4 -

嵌套在外部SELECT语句中的子查询包括以下组件:

  • 包含常规选择列表组件的常规SELECT子句。

  • 包含一个或多个表或者视图名称的常规FROM子句。

  • 可选的WHERE子句。

  • 可选的GROUP BY子句。

  • 可选的HAVING子句。

子查询的SELECT查询语句总是使用圆括号括起来。

子查询可以嵌套在外部SELECT、INSERT、UPDATE或DELETE语句的WHERE或HAVING子句内,也可以嵌套在其他子查询内。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。