• Sqlserver 理解子查询


    理解子查询:

    理解子查询:

    多表连接查询往往也可以用子查询进行替代

    子查询本质是嵌套进其他 select update insert Delete 语句的一个被限制的select语句,在子查询中,只有下面几个子句可以使用:

    1 select 子句(必须)
    2 From 子句(必须)
    3 where 子句(可选)
    4 group by(可选)
    5 having(可选)
    6 order by(只有在top关键字使用时才可用)

    子查询也可以嵌套在其他子查询中,
    子查询的返回:
    1 返回一张表
    2 返回一列值
    3 返回单个值

    一 子查询作为数据源使用(子查询的最简单的使用):
    当子查看在外部查询的from子句之后使用时,子查询被当作一个数据源使用,即使这个子查询只返回一个值,一列值,一张表,这里都看做是数据源,
    作为数据源使用的子查询很像一个 View(视图),只是这个子查询只是临时存在,并不包含在数据库中


    select a.username from a
    inner join (select * from b ) as c
    on a.id = c.id

    当子查询作为数据源使用时候,也分为相关子查询和无关子查询

    二 :子查询作为选择条件使用(比较复杂的应用)

    作为选择条件的子查询是那些只返回一列(column)的子查询,如果作为选择条件使用,即使返回单个值,也可以看做是只有一行的一列

    SELECT *
    FROM a
    WHERE ID IN

    (SELECT ID
    FROM b
    WHERE age >68)

    上面是 在in或者 not in 关键字后面的子查询返回一列值作为外部查询的选择条件使用,不过不太建议用这兄弟俩,比较耗性能,当然如果 in后的返回是固定的值,可以随便用

    如果需要实现in的作用,可以用 exists ,not exists ,join 关键字进行代替,,除了in之外,用于选择条件的关键字还有 any和all,和 < ,>,= 连接使用
    例如:

    SELECT c.Nickname,c.Id FROM Customer AS c
    WHERE c.Id = any(SELECT a.CustomerId FROM ForumTopicCustomerXREF AS a )
    
    
    SELECT c.Nickname,c.Id FROM Customer AS c
    WHERE c.Id IN (SELECT a.CustomerId FROM ForumTopicCustomerXREF AS a )

    上面使用的any就完全可以替换 in


    =ANY  和IN等价
    <>ALL 和NOT IN等价
    >ANY 大于最小的(>MIN)
    <ANY 小于最大的(<MAX)
    >ALL 大于最大的(>MAX)
    <ALL 小于最小的(<MIN)
    =ALL 这个效果在子查询中如果只有一个返回值,则和=相等,如果有多个返回值,则为空(很少使用)

    前面说的都是无关子查询,
    相关子查询:
    如何区分相关子查询和无关子查询:最简单的办法是查看子查询本身能否执行
    ,如果能独立执行,是无关子查询,如果不能独立执行,是相关子查看
    对于无关子查询,整个查询过程为子查看只执行一次,然后交给外部查询

    相关子查询:子查询的执行次数依赖于外部查询,外部查询每执行一次,子查询执行一次
    相关子查询内部原理:外部查询每执行一行,都会将对应行所用的参数传递到子查询中,如果子查询有对应值,则返回True,如果没有,则返回false,然后执行下一行
    例如:SELECT * FROM [User] AS u
    WHERE EXISTS ( SELECT 1 FROM Customer AS c WHERE u.Id = c.Id AND u.UserType = 1)

    子查询作为计算列使用:只返回单个值,用在select语句之后,作为计算列使用
    (同样分为相关子查询和无关子查询)

  • 相关阅读:
    将数据写入Word模版,生成PDF并加水印
    JSPDF 中文乱码
    DataTable 计算列
    ZIP压缩类
    统一社会信用代码验证
    avalon SVG 画流程图
    横线
    验证身份证合法性
    Centos7.3安装Mysql8.0
    MVC全局验证登陆信息
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5704531.html
Copyright © 2020-2023  润新知