子查询
子查询是指在查询、建表或插入语句的内部嵌入查询,以获得临时结果集。子查询可以分为相关子查询和非相关子查询。
- 相关子查询:执行查询的时候先取得外层查询的一个属性值,然后执行与此属性值相关的子查询,执行完毕后再取得外层查询的下一个值,依次再来重复执行子查询。即:
- 在子查询中引用了外部查询表中的列。
- 子查询的值依赖于外部查询表中的列的值。
- 对于外部查询中的每一行,子查询都要执行一次。
相关子查询的示例请参见示例小节中的示例1和示例2。
相关子查询的父语句可以是SELECT,UPDATE或DELETE语句。
- 非相关子查询:子查询独立于外层语句(主查询),子查询的执行不需要提前取得父查询的值,只是作为父查询的查询条件。查询执行时子查询和主查询可分为两个独立的步骤,即先执行子查询,再执行主查询。
语法格式
subquery语法:
select_statement { query_block | subquery {{ UNION [ALL] | MINUS } subquery } [...] } [ order_by_clause ] [ row_limiting_clause ]
query_block语法:select_statement [ with cluase ] SELECT [ hint ] [ DISTINCT ] select_list FROM { [ table_reference | join_clause | inline_analytic_view ] } [,...] [where_clause] [group_by_clause]
使用方法
- 子查询可以出现在FROM子句中和WHERE子句中。FROM子句中的子查询也称为内联视图。 可以在内联视图中嵌套任意数量的子查询。WHERE子句中的子查询也称为嵌套子查询。可以在嵌套子查询中嵌套最多127个子查询级别。
- 如果子查询中的列与子查询所包含的语句中的列具有相同的名称,则必须使用表名或表的别名来作为列的前缀进行修饰。 为了使语句更易读,请始终使用名称或别名来标识表或视图中的列。
子查询可以用于以下目的:
- 在INSERT或CREATE TABLE语句中定义要插入目标表的行集。
- 在CREATE VIEW语句中定义要包含在视图的行集。
- UPDATE语句中定义要分配给现有行的值。
- 为SELECT,UPDATE和DELETE语句的WHERE子句,HAVING子句或START WITH子句中的条件提供值。
- 通过包含查询定义要操作的表。
就像使用表名一样,可以通过将子查询放在包含查询的FROM子句中来定义要操作的表。可以在INSERT,UPDATE和DELETE语句中以这种方式使用子查询代替表名。
示例
- 示例1:通过相关子查询,查找每个部门中高出部门平均工资的人员。
SELECT s1.last_name, s1.section_id, s1.salary FROM staffs s1 WHERE salary >(SELECT avg(salary) FROM staffs s2 WHERE s2.section_id = s1.section_id) ORDER BY s1.section_id;
对于staffs表的每一行,父查询使用相关子查询来计算同一部门成员的平均工资。 相关子查询为staffs表的每一行执行以下步骤:
- 确定行的section_id。
- 然后使用section_id来评估父查询。
- 如果此行中工资大于所在部门的平均工资,则返回该行。
对于staffs表的每一行,子查询都将被计算一次。
- 示例2:两个表关联的相关子查询,请参见连接查询(JOIN)一节的半连接示例。
- 示例3:非相关子查询。查询部门编码为80的部门中,薪水高出该部门平均工资的人员。
SELECT staff_id, last_name, salary FROM staffs WHERE section_id = '80' AND salary >(SELECT avg(salary) FROM staffs WHERE section_id= '80');
- 示例4:通过子查询建表。
建立一个和表staffs具有相同表结构的表。
CREATE TABLE staffs_new AS SELECT * FROM staffs WHERE 1<>1;
- 示例5:向表staffs_new表中插入staffs表的所有数据。
INSERT staffs_new SELECT * FROM staffs;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论