SQL进阶用法—子查询

子查询分类:

  • 单行单列过滤条件子查询:子查询语句返回单行单列值作为结果

  • 多行多列过滤条件子查询:子查询语句返回多行单列值作为结果

  • 临表子查询:子查询语句返回临时列表(多行多列)作为结果

(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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值