当前位置: 首页> 文旅> 酒店 > SQL - 子查询

SQL - 子查询

时间:2025/7/11 10:25:19来源:https://blog.csdn.net/m0_74403543/article/details/141299505 浏览次数:0次
  • 子查询可以写的位置:select、from、where
  • 子查询可以返回一个值:一个列的一些值,一个结果集(表)
  • 子查询的作用:可以作为条件判断的范围,作为判断条件,可以返回特定结果值,
  • 与子查询相关:
    • in 运算符;
      • in (子查询),其中子查询返回的结果是一个结果集
      • select *
        from clients
        where client_id in (
        select client_id
        from invoices
        group by client_id
        having count(*)>2)

    • 子查询 vs 连接;
      • 子查询和连接,都能用来查询信息,比较的是可读性和查询效率
      • select *
        from clients
        where client_id not in (
        select  distinct client_id 
        from invoices)
        -- 同一个问题,连接和子查询的比较
        select *
        from clients 
        left join invoices using (client_id)
        where invoice_id is null

    • all 关键字
      • 表示一个值要比all修饰的子查询返回的一列值都大,或都小等;同理可得,any关键字和some关键字都是类似的含义。
      • select *
        from invoices
        where invoice_total > all(
        select invoice_total
        from invoices
        where client_id=3)
        -- 等价于
        -- select *
        -- from invoices
        -- where invoice_total > (
        -- select max(invoice_total)
        -- from invoices
        -- where client_id=3)

    • 相关子查询
      • 子查询和外查询存在相关性,子查询的返回结果集和外查询存在联系,但是相关子查询经常执行得很慢
      • select *
        from employees e
        where salary >(
        select avg(salary)
        from employees 
        where office_id=e.office_id)
        -- 也可以写这样,但是体现不了相关子查询的特点
        -- select *
        -- from employees
        -- join (select office_id,avg(salary) as aaa
        -- from employees
        -- group by office_id) o
        -- on o.office_id=employees.office_id
        -- where salary>aaa

    • exists 运算符(存在)
      • where exists (子查询)
      • 能够提高效率,在子查询的过程中,找到一行符合条件的记录就返回true
      • -- exists
        select *
        from clients c
        where exists (
        select client_id
        from clients
        where client_id=c.client_id)

    • select 子句中的子查询
    • select invoice_id,invoice_total,(select avg(invoice_total) from invoices) as invoice_avg,invoice_total- (select invoice_avg) as defference
      from invoices;select client_id,name,sum(invoice_total),
      (select avg(invoice_total) from invoices) as average,
      sum(invoice_total)-(select average) as difference
      from clients
      left join invoices using (client_id)
      group by client_id,name

    • from 子句中的子查询
      • 子查询的结果可以作为一张真实的表使用
      • select *
        from employees
        join (select office_id,avg(salary) as aaa
        from employees
        group by office_id) o
        on o.office_id=employees.office_id
        where salary>aaa

关键字:SQL - 子查询

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: