精华内容
下载资源
问答
  • SQL子查询和关联子查询

    千次阅读 2020-09-05 13:03:58
    SQL语句的复杂查询语句,包括标量子查询及关联子查询

    子查询:将用来定义视图的SELECT语句直接用于FROM子句中。

    SELECT <列名1>, <列名2>,FROM (<SELECT语句>) AS <视图名称>;
    /*
    内层的SELECT语句会先执行;
    Oracle的FROM子句中不能使用AS,直接删除即可;
    */
    

    上述代码等价于:

    CREATE VIEW 视图名称(<视图列名1>, <视图列名2>,)
    AS
    <SELECT语句>
    

    标量子查询

    返回单一值的子查询是标量子查询,即必须且只能返回1行1列的结果。能够使用常数或列名的地方,无论是SELECT子句、GROUP BY子句、HAVING子句,还是ORDER BY子句,几乎所有的地方都能使用(SELECT标量子查询)。

    例:在SELECT子句中使用标量子查询

    SELECT product_id, 
           product_name, 
           sale_price,
           (SELECT AVG(sale_price)
            FROM Product) AS avg_price
           -- 标量子查询
    FROM Product; 
    

    标量子查询不能返回多行结果:

    SELECT product_id, 
           product_name, 
           sale_price,
           (SELECT AVG(sale_price)
           	FROM Product
           	GROUP BY product_type) AS avg_price
           -- 该子查询返回了多行结果,产生错误
    FROM Product; 
    

    关联子查询

    在细分的组内进行比较时,需要使用关联子查询。

    例:关联子查询

    SELECT <列名1>, <列名2>,FROM <表名> AS <别名1>
    WHERE <列名2> > (SELECT <表达式>
                     FROM <表名> AS <别名2>
                     WHERE <别名1>.<列名1> = <别名2>.<列名1>);
                     -- 关联子查询可对集合根据<列名1>进行切分
    
    SELECT product_id, 
           product_name, 
           sale_price,
           (SELECT AVG(sale_price)
           	FROM Product AS P2
           	WHERE P1.product_type = P2.product_type
           	GROUP BY P1.product_type) AS avg_sale_price
           -- 该关联子查询可当作加了条件的标量子查询
    FROM Product AS P1;
    

    关联子查询中别名的作用范围为子查询内部。

    参考资料

    《SQL基础教程》(第2版)[日] MICK著;孙淼,罗勇译

    展开全文
  • sql 子查询多于一个!SQL子查询

    千次阅读 2010-11-08 11:14:00
    sql 子查询多于一个!SQL子查询

    一:◎单行子查询:归回一行一列结果到外部查询
      ◎多行子查询:归回多行结果
      ◎多列子查询:归回多列结果
      ◎相干子查询:援用外部查询中的一列。对于外部查询中的每行执行一次子查询。
      ◎不相干子查询:首先执行子查询,然后将值传递给外部查询。
      ◎子查询可用于select、from、where、having子句中,后二者用的最多。
      ◎如果用于where或having子句,则该子查询只能位于比较运算符(分为数学比较运算符=<和其它比较运算between,in,like,is null)的左面。
      ◎如果用于select子句,则必是单行子查询。
      ◎子查询本身就是一个完整的查询,即至少包含select from子句。
      ◎子查询不能包含order by子句。
      ◎子查询必须包孕在一组括号中。
      ◎如果在select子句中随组函数据排列出了某个字段,那么必须也在group by 子句中列出这个字段。
      二:第六章.子查询
      目标:
      定义子查询
      列出子查询的类型
      写单行和多行子查询 要端:
      1.子查询的语法和使用原则
      SELECT select_list
      FROM table
      WHERE expr operator(SELECT select_list
      FROM table);
      子查询(内查询) 在主查询以前执行一次;
      子查询的结果被用于主查询(外查询);
      子查询可被放置在select、from、where、having子句中;
      另外,子查询可以被放在 CREATE VIEW 语句中、CREATE TABLE 语句、
      UPDATE 语句、INSERT 语句的 INTO 子句和 UPDATE 语句的 SET 子句中;
      子查询放在圆括号中;
      将子查询放在比较前提的右边;
      在子查询中的ORDER BY 子句不需要,除非正在执行Top-N 分析;
      在单行子查询顶用单交运算符,在多行子查询顶用多交运算符;
      Oracle 服务器没有强制限制子查询的数目;限制只与查询所需的缓和冲突区巨细有关;
      子查询和父查询可从不同的表中取值
      2.单行子查询
      仅归回一行,使用单行比较符(等于,大于小于,大于等于,小于等于,不等于);
      单行子查询的一个常见错误是单行子查询归回多于一个的行;
      另一个问题是子查询没有归回行,但这样不会报错,会提醒:no rows selected
      3.多行子查询
      归回多行,使用多行比较符(in,any,all)
      <ANY 意思是小于最大值, >ANY 意思是大于最小值, =ANY 等同于 IN;
      <ALL 意思是小于最小值, >ALL 意思是大于最大值;
      当使用 SOME 或 ANY 时,通常用 DISTINCT 要害字防止归回被多次选择的行;
      NOT 运算符可以与 IN、ANY 和 ALL 运算符一起使用;

    展开全文
  • SQL子查询、关联查询

    万次阅读 2018-08-25 00:13:45
    SQL子查询、关联查询:

    SQL子查询、关联查询:

    这里写图片描述


























    注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!


    持续更新中…

    如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:
    你遇到的问题是小编创作灵感的来源!


    展开全文
  • SQL子查询优化

    千次阅读 2018-07-26 23:26:36
    此研究下SQL子查询的相关知识 ~ 以下内容主要参考《数据库查询优化器的艺术》一书 一、子查询介绍 概念:当一个查询是另一个查询的子部分时,称之为子查询(查询语句中嵌套有查询语句)。 子查询出现的位置...

    背景:
    在此研究下SQL子查询的相关知识 ~ 以下内容主要参考《数据库查询优化器的艺术》一书


    一、子查询介绍

    概念:当一个查询是另一个查询的子部分时,称之为子查询(查询语句中嵌套有查询语句)。

    子查询出现的位置有:

    a)目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误: 子查询必须只能返回一个字段”的提示。

    注:标量子查询 - SQL允许子查询出现在返回单个值的表达式能够出现的任何地方,只要该子查询只返回包含单个属性的单个元组;这样的子查询称为标量子查询(scalar subquery)。

    错误示范:
    这里写图片描述
    这里写图片描述

    正确写法(标量子查询):
    这里写图片描述

    但是在 HiveImpala 中测试甚至连标量子查询都不支持!:
    这里写图片描述
    这里写图片描述

    b)FROM子句位置: 相关子查询 出现在FROM子句中,数据库可能返回类似“在FROM子句中的子查询无法参考相同查询级别中的关系”的提示,所以相关子查询不能出现在FROM子句中;非相关子查询出现在FROM子句中,可上拉子查询到父层,在多表连接时统一考虑连接代价然后择优。
    注:此处我想了下,好像没有from后跟相关子查询的使用情形,这种错误基本不可能犯的。。

    c)WHERE子句位置:出现在WHERE子句中的子查询,是一个条件表达式的一部分,而表达式可以分解为操作符和操作数;根据参与运算的不同的数据类型,操作符也不尽相同,如INT型有“>、<、=、<>”等操作,这对子查询均有一定的要求(如INT型的等值操作,要求子查询必须是标量子查询)。另外,子查询出现在WHERE子句中的格式,也有用谓词指定的一些操作,如IN、BETWEEN、EXISTS等。

    d)JOIN/ON子句位置: JOIN/ON子句可以拆分为两部分,一是JOIN块类似于FROM子句,二是ON子句块类似于WHERE子句,这两部分都可以出现子查询。子查询的处理方式同FROM子句和WHERE子句。

    e)GROUP BY子句位置: 目标列必须和GROUPBY关联。可将子查询写在GROUPBY位置处,但子查询用在GROUPBY处没有实用意义。

    f)ORDER BY子句位置: 可将子查询写在ORDERBY位置处。但ORDERBY操作是作用在整条SQL语句上的,子查询用在ORDERBY处没有实用意义。

    以下这种情况还是有实用的:

    SELECT * FROM `user` AS u ORDER BY (SELECT DATA FROM `customer` c WHERE c.id = u.user_id )

    二、子查询分类

    从对象间的关系看:

    a)相关子查询

    子查询的执行依赖于外层父查询的一些属性值。子查询因依赖于父查询的参数,当父查询的参数改变时,子查询需要根据新参数值重新执行(查询优化器对相关子查询进行优化有一定意义),如:

    SELECT * FROM t1 WHERE col_1 = ANY (SELECT col_1 FROM t2 WHERE t2.col_2 = t1.col_2);
    # 子查询语句中存在父查询的t1表的col_2列

    注:

    ANY关键词可以理解为“对于子查询返回的列中的任一数值,如果比较结果为true,则返回true”。
    ALL 的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”

    b)非相关子查询

    子查询的执行,不依赖于外层父查询的任何属性值。这样子查询具有独立性,可独自求解,形成一个子查询计划先于外层的查询求解,如:

    SELECT * FROM t1 WHERE col_1 = ANY

    (SELECT col_1 FROM t2 WHERE t2.col_2 = 10);

    //子查询语句中(t2)不存在父查询(t1)的属性

    从特定谓词看:

    a)[NOT] IN/ALL/ANY/SOME子查询

    语义相近,表示“[取反] 存在/所有/任何/任何”,左面是操作数,右面是子查询,是最常见的子查询类型之一。

    b)[NOT] EXISTS子查询

    半连接语义,表示“[取反] 存在”,没有左操作数,右面是子查询,也是最常见的子查询类型之一。

    c)其他子查询

    除了上述两种外的所有子查询。

    从语句的构成复杂程度看

    a)SPJ子查询

    由选择、连接、投影操作组成的查询。

    b)GROUPBY子查询

    SPJ子查询加上分组、聚集操作组成的查询。

    c)其他子查询

    GROUPBY子查询中加上其他子句如Top-N 、LIMIT/OFFSET、集合、排序等操作。

    后两种子查询有时合称非SPJ子查询。

    从结果的角度看:

    a)标量子查询

    子查询返回的结果集类型是一个简单值。

    b)单行单列子查询

    子查询返回的结果集类型是零条或一条单元组。相似于标量子查询,但可能返回零条元组。

    c)多行单列子查询

    子查询返回的结果集类型是多条元组但只有一个简单列。

    d)表子查询

    子查询返回的结果集类型是一个表(多行多列)。


    三、子查询优化

    a)子查询合并(Subquery Coalescing)

    在某些条件下(语义等价:两个查询块产生同样的结果集),多个子查询能够合并成一个子查询(合并后还是子查询,以后可以通过其他技术消除掉子查询)。这样可以把多次表扫描、多次连接减少为单次表扫描和单次连接,如:

    SELECT * FROM t1 WHERE a1<10 AND (
        EXISTS (SELECT a2 FROM t2 WHERE t2.a2<5 AND t2.b2=1) OR 
        EXISTS (SELECT a2 FROM t2 WHERE t2.a2<5 AND t2.b2=2) 
    );

    可优化为:

    SELECT * FROM t1 WHERE a1<10 AND (
        EXISTS (SELECT a2 FROM t2 WHERE t2.a2<5 AND(t2.b2=1 OR t2.b2=2) 
        # 两个ESISTS子句合并为一个,条件也进行了合并
    );

    b)子查询展开(Subquery Unnesting)

    又称子查询反嵌套,又称为子查询上拉。把一些子查询置于外层的父查询中,作为连接关系与外层父查询并列,其实质是把某些子查询重写为等价的多表连接操作(展开后,子查询不存在了,外部查询变成了多表连接)。带来的好处是,有关的访问路径、连接方法和连接顺序可能被有效使用,使得查询语句的层次尽可能的减少。

    常见的IN/ANY/SOME/ALL/EXISTS依据情况转换为半连接(SEMI JOIN)、普通类型的子查询消除等情况属于此类,如:

    SELECT * FROM t1, (SELECT * FROM t2 WHERE t2.a2 >10) v_t2 
    WHERE t1.a1<10 AND v_t2.a2<20;

    可优化为:

    SELECT * FROM t1, t2 WHERE t1.a1<10 AND t2.a2<20 AND t2.a2 >10; 

    /* 子查询变为了t1、t2表的连接操作,相当于把t2表从子查询中上拉了一层 */

    子查询展开的条件:

    a)如果子查询中出现了聚集、GROUPBY、DISTINCT子句,则子查询只能单独求解,不可以上拉到外层。

    b)如果子查询只是一个简单格式的(SPJ格式)查询语句,则可以上拉子查询到外层,这样往往能提高查询效率。子查询上拉,讨论的就是这种格式,这也是子查询展开技术处理的范围。

    把子查询上拉到上层查询,前提是上拉(展开)后的结果不能带来多余的元组,所以子查询展开需要遵循如下规则:

    a)如果上层查询的结果没有重复(即SELECT子句中包含主码),则可以展开其子查询。并且展开后的查询的SELECT子句前应加上DISTINCT标志。

    b)如果上层查询的SELECT语句中有DISTINCT标志,可以直接进行子查询展开。

    如果内层查询结果没有重复元组,则可以展开。

    子查询展开的具体步骤:

    a)将子查询和外层查询的FROM子句连接为同一个FROM子句,并且修改相应的运行参数。

    b)将子查询的谓词符号进行相应修改(如:“IN”修改为“=”)。

    c)将子查询的WHERE条件作为一个整体与外层查询的WHERE条件合并,并用AND条件连接词连接,从而保证新生成的谓词与原旧谓词的上下文意思相同,且成为一个整体。

    c)聚集子查询消除(Aggregate Subquery Elimination)

    通常,一些系统支持的是标量聚集子查询消除。如:

    SELECT * FROM t1 WHERE t1.a1 > (SELECT avg(t2.a2) FROM t2);
    展开全文
  • sql子查询

    万次阅读 2016-10-14 11:09:22
     SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面。 简介  子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,...
  • SQL子查询什么时候用

    千次阅读 2014-01-22 18:39:27
    SQL子查询什么时候用
  • SQL 子查询

    万次阅读 2018-04-21 14:52:19
     SQL还允许创建子查询(subquery),即嵌套其他查询中的查询。为什么要这样做呢?理解这个概念的最好方法是考察几个例子。利用子查询进行过滤 订单存储两个表中。每个订单包含订单编号、客户ID、订单日期,...
  • Sql子查询

    千次阅读 2009-08-17 15:48:00
    Sql子查询即是当一个查询语句嵌套另一个查询语句的查询条件中时叫做子查询也叫做嵌套子查询。根据子查询的返回结果不同,子查询又可分为单行子查询,多行子查询与多列子查询。现在如下三类子查询作说明,并假设有...
  • SQL子查询、相关子查询

    千次阅读 2018-10-21 17:52:35
    1、使用子查询时尽量把子查询分解为多行并且适当进行缩进,能极大的简化子查询的使用。 2、不能嵌套太多的子查询,这样会降低性能。 3、WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目...
  • 文章目录两者的各种叫法相关子查询MySQL解释相关子查询Wikipedia解释相关...相关子查询是一个子查询中引用了某张表且这张表也在子查询外部被使用到。比如: SELECT * FROM t1 WHERE column1 IN ( SELECT column1 FROM
  • SQL子查询总结

    千次阅读 2012-09-14 12:39:30
    一个SQL语句中嵌套另一个SQL语句成为子查询。 当一个问题无法通过一部解决时可考虑使用子查询,一个出现SELECT语句的FROM子句中的子查询被称为"内嵌视图";一个出现SELECT语句的WHERE子句中的子查询被称为"内...
  • SQL 子查询 总结

    千次阅读 2012-09-19 21:03:34
    子查询是一个嵌套SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。 三种基本的子查询 (1)通过 IN 或由 ANY 或 ALL 修改的比较运算符引入的...
  • SQL教程——子查询

    万次阅读 2020-11-30 15:30:19
    摘要:本文主要介绍SQL子查询 目录 目录: 一、where或having后面 1、标量子查询 2、列子查询 3、行子查询 二、select后面 三、from后面 四、exists后面(相关子查询子查询 含义: 出现其它语句...
  • sql 查询插入SQL INSERT Query also referred as SQL INSERT INTO is the command used for inserting data into database. SQL INSERT statement allows insertion of data into one table at a time. SQL INSERT...
  • 一文详解SQL关联子查询

    千次阅读 2021-03-30 13:42:20
    简介:本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询。 本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询。 背景介绍中我们将讲讲常见的关联子查询的...
  • SQL中的子查询的使用

    万次阅读 多人点赞 2018-06-11 13:05:46
    什么子查询? 把一个查询的结果另一个查询中使用就叫做子查询 初始数据 有五个表:学生表,老师表,课程表,学院表,课程成绩表。 表结构 初始数据 学生表 老师表 课程表 学院表 课程...
  • SQL相关子查询与非相关子查询

    万次阅读 多人点赞 2018-07-05 10:31:04
    SQL子查询可以分为相关子查询和非相关子查询两类。 假设Books表如下: 类编号 图书名 出版社 价格 2 c#高级应用 圣通出版 23.00 2 Jsp开发应用 机械出版社...
  • sql子查询左链接

    千次阅读 2017-04-28 15:23:24
    1:子查询: (表中字段一一对应 一张表和另外一张表的一个字段唯一确定一行数据)select (select (select wname from wcode where wcode = users_weixin.wcode) from users_weixin where wxicode = users_rec
  • sql 子查询表级联查询

    万次阅读 2013-08-22 17:34:49
    处理少量数据是使用 示例 select * from A where aid in(select aid from b) 查找a表数据条件aid属于b表中的aid select * from A where aid not in(select aid from b) 查找a表数据条件aid不属于b表中的...
  • SQL 子查询 EXISTS 和 NOT EXISTS

    万次阅读 多人点赞 2016-11-08 23:00:19
    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果...
  • SQL查询,子查询作为结果字段

    千次阅读 2019-08-23 10:30:16
    SQL查询,子查询作为结果字段, SELECT DISTINCT sp.comcode, sp.projectname, sp.projecttime, sp.busnature, sp.bustype, sl.concode, sl.conname, sl.contype, sl.conpartya, sl.contotal, sl....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 334,558
精华内容 133,823
关键字:

在sql子查询是什么