暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 子查询

墨天轮 2019-10-12
576

子查询

子查询是指在查询、建表或插入语句的内部嵌入查询,以获得临时结果集。子查询可以分为相关子查询和非相关子查询。

  • 相关子查询:执行查询的时候先取得外层查询的一个属性值,然后执行与此属性值相关的子查询,执行完毕后再取得外层查询的下一个值,依次再来重复执行子查询。即:
    • 在子查询中引用了外部查询表中的列。
    • 子查询的值依赖于外部查询表中的列的值。
    • 对于外部查询中的每一行,子查询都要执行一次。

    相关子查询的示例请参见示例小节中的示例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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论