关于sql中子查询的用法

关于sql中子查询的用法

由于子查询比较好理解,以《mysql必知必会》为蓝本简单解释后上各种例子

一、子查询是什么及为何存在

子查询是嵌套在其他查询中的查询,以一个查询的结果作为另一个查询的条件。它避免了面对复杂查询步骤时不容易硬编码的问题,增强了sql的灵活性。

例:

1,检索包含物品的tnt2的订单编号
2,检索步骤1中的订单编号对应的客户id
3,检索前一个步骤中所有客户id的客户信息

对于1select order_num from orderitems where prod_id = 'tnt2';   -- 结果 20005,20007
对于2select cust_id from orders where order_num in (20005,20007);  -- 10001,10004
对于3select cust_id from orders where order_num in (
    											select order_num from orderitems where prod_id = 'tnt2')
    											
不必具体考虑每个字段对应什么意思(因为我懒,没具体标注),理解这个思想。
可以看到如果条件繁多,可以考虑一步步拆解,然后用子查询组合起来。不用硬编码去进行指定,(这就避免了有时候硬编码的对象不容易获取或者编写的问题)

二、子查询的各种用法

  • 单行、多行、多列、内联、having子查询,嵌套,子查询作为计算字段
  • 以牛客网sql21 浙江大学用户题目回答情况 为变形
1,单行、子查询出来的结果是单行

select
  q.device_id,
  question_id,
  result
from
  question_practice_detail q
where
  device_id in (
    select
      u.device_id
    from
      user_profile u
    where
      university = '浙江大学'
  )
2,多行、子出来的结果是多行
select
  q.device_id,
  question_id,
  result
from
  question_practice_detail q
where
  device_id in (
    select
      u.device_id
    from
      user_profile u
    where
      university like =  '%大学'  -- 这个地方出来多列
  )
3,多列,子查出来的结果是多列(多个条件)
select
  q.device_id,
  question_id,
  result
from
  question_practice_detail q
where
  device_id,question_id in (
    select
      u.device_id,max(question_id)  -- 出来多列,一般难度上升的题,会在这里设置陷阱让你分组和联结后发现条件无法对应
    from
      user_profile u
    group by
      u.device_id;    
  )
4,内联
 
 -- 内联视图子查询实际上就是将查询的结果集作为一个查询表,继续进行查询操作,一般是指写在 FROM 子句后面的子查询
 -- 查询年龄为21的,且答题id为2138的人的所有信息,这个可以用where组合查询即可,现只做理解用法
 select 
 	*
 from(
 	select * from user_profile where age = 21
 ) temp 
 where temp.device_id = 2138;
4,子查询作为计算字段结果
-- 用户表和问题细节表下,查device_id设备id相同时的数量和对应问题id
select 
	question_id,
    (select count(*) from from user_profile u where temp.device_id = q.device_id ) as  
from
	  question_practice_detail q
order by question_id;

补充:嵌套子查询即一层层嵌套,having子查询即分组后筛选用子查询的结果作为筛选,子查询效率比较低,不要嵌套太多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值