子查询分类:
- 单行单列过滤条件子查询:子查询语句返回单行单列值作为结果
- 多行多列过滤条件子查询:子查询语句返回多行单列值作为结果
- 临表子查询:子查询语句返回临时列表(多行多列)作为结果
(1)单列过滤子查询
案例:列出所有产品单价高于或等于最高产品单价50%产品的详情信息
需求拆解:
- 最终返回结果:产品详细信息
- 过滤数据列:产品单价
- 过滤条件:高于或等于最高产品单价50%
# 普通SQL语句解答过程和思路
## 第一步:查询产品最高售价,手动记录最高推荐售价
SELECT
MAX(`产品单价`) AS `最高单价`
FROM `产品信息`
## 第二步:使用记住的最高推荐售价构建SQL语句解答问题
SELECT *
FROM `产品信息` WHERE `产品单价` >= 0.5 *97
# 单行单列过滤条件子查询解答思路&过程
## 使用查询产品最高价作为子句来直接构建主句中的WHERE过滤条件
## 单个SQL语句解决问题
SELECT
*
FROM
`产品信息`
WHERE
`产品单价` >= 0.5 * ( SELECT MAX( `产品单价` ) AS '最高单价' FROM `产品信息` )
# 主查询语句/子查询语句
select * from T where qty > 0.1* (select MAX(qty) from T)
(2)多行多列过滤条件子查询
案例:列出所有广东省供应商供应的产品详情信息
需求拆解:
- 最终返回结果:产品详情信息
- 过滤数据列:供应商信息
- 过滤条件:广东省供应商
SELECT
`供应商号码`
FROM `供应商信息` WHERE `省份`= '广东省'
——————————
供应商号码
1
3
10
11
...
________
# 使用多行单列子查询构建语句来过滤产品信息表中的数据
SELECT
*
FROM
`产品信息`
WHERE
`供应商号码` IN ( SELECT `供应商号码` FROM `供应商信息` WHERE `省份` = '广东省' )
select * from B where AID in(select distinct ID from A where flag = '0')
(3) 临表子查询
案例需求背景: 列出产品数目最多的供应商号码
需求拆解:
- 最终返回结果:供应商号码
- 过滤数据:产品数目
- 过滤条件:最多
# 业务目标:列出产品数目最多的供应商号码
## 使用临时子查询语句选择供应商号码
### 使用聚合语句作为子语句与AS关键字创建临时列表 'a'
### 使用SELECT语句选择供应商号码
SELECT
`供应商号码`
FROM
(
SELECT
`供应商号码`,
COUNT(`产品号码`) AS `产品数目`
FROM `产品信息`
GROUP BY `供应商号码`
ORDER BY `产品数目` DESC
LIMIT 1
) AS a # Every derived table must have its own alias
SELECT
userid,
sumA,
sumB,
CASE
WHEN sumA-sumB>0 THEN '部分'
WHEN sumA-sumB=0 THEN '完全'
END AS state
FROM(
SELECT
userid,
isnull(SUM(a),0) as sumA,
isnull(SUM(b),0) as sumB
FROM T
GROUP BY userid) as t