关于sql中子查询的用法
由于子查询比较好理解,以《mysql必知必会》为蓝本简单解释后上各种例子
一、子查询是什么及为何存在
子查询是嵌套在其他查询中的查询,以一个查询的结果作为另一个查询的条件。它避免了面对复杂查询步骤时不容易硬编码的问题,增强了sql的灵活性。
例:
1,检索包含物品的tnt2的订单编号
2,检索步骤1中的订单编号对应的客户id
3,检索前一个步骤中所有客户id的客户信息
对于1:
select order_num from orderitems where prod_id = 'tnt2'; -- 结果 20005,20007
对于2:
select cust_id from orders where order_num in (20005,20007); -- 10001,10004
对于3:
select 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子查询即分组后筛选用子查询的结果作为筛选,子查询效率比较低,不要嵌套太多。