PL/SQL 知识量:16 - 57 - 244
子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句,或者其他子查询中的查询,任何允许使用表达式的地方都可以使用子查询。子查询和表的连接一样,提供了使用单个查询访问多个表中的数据的方法。
子查询也称为内部查询或内部选择,它本质上也是一种嵌入的SELECT语句,而包含子查询的语句也称为外部查询或外部选择。子查询不但可以出现在WHERE子句中,而且可以出现在FROM子句中,作为一个临时表使用;也可以出现在SELECT子句中,作为一个字段值返回。
在相关子查询中,由于子查询是在外部查询返回的结果集上执行的,因此它的效率肯定有所下降。如果相关子查询的语句写得很有效率,那么它的执行效率将能够超过那些使用多个连接和临时表的程序。
子查询分为非相关子查询和相关子查询。
非相关子查询是指作为子查询的查询能够独立运行,并不依赖外部查询的数据和结果。
以下示例查询销量排名前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名,使用了嵌套的两个子查询。
相关子查询与非相关子查询的区别在于:相关子查询引用了外部查询中的列。这种用外部查询来限制子查询的方法使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
嵌套在外部SELECT语句中的子查询包括以下组件:
包含常规选择列表组件的常规SELECT子句。
包含一个或多个表或者视图名称的常规FROM子句。
可选的WHERE子句。
可选的GROUP BY子句。
可选的HAVING子句。
子查询的SELECT查询语句总是使用圆括号括起来。
子查询可以嵌套在外部SELECT、INSERT、UPDATE或DELETE语句的WHERE或HAVING子句内,也可以嵌套在其他子查询内。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6