子查询的分类?
- 标量子查询: 出现在SELECT 列表中的子查询称为标量子查询
- 内联视图 :出现在 FROM 子句中的视图称为内联视图
- 嵌套子查询 :出现在 WHERE 子句中的子查询称为嵌套子查询
嵌套子查询的语法格式?
Where 查询表达式 [NOT] in (子查询)
Where 查询表达式 比较运算符 [ANY/ALL ] (子查询)
Where 查询表达式 【NOT】EXISTS 子查询
子查询的使用规则?
- 子查询必须“自身就是一个完整的查询”。即,它必须至少包括一个SELECT子句和FROM子句。
- 子查询SELECT语句不能包括在ORDER BY子句中。因为ORDER BY字句只能对最终查询结果排序,如果显示的输出需要按照特定顺序显示,那么ORDER BY子句应该作为外部查询的最后一个子句列出。
- 子查询“必须包括在一组括号中”,以便将它与外部查询分开。
- 如果将子查询放在外部查询的WHERE或HAVING子句中,那么该子查询只能位于比较运算符的“右边”。
- 任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
- 子查询最多可以嵌套32层,个别查询可能会不支持32层。
子查询举例
假如有2个盒子, 都是放有数字编号的球, 1号盒子放的球编号是1~10 , 2号盒子放的球编号是 5~15
我首先把 2号盒子的球编号全部查出来, SELECT 球编号 from 2号盒子
那得出的结果就是 5~15 这些数字
SELECT 球编号 from 1号盒子WHERE 球编号 not in (SELECT 球编号 from 2号盒子);
相当于这样:
SELECT 球编号 from 1号盒子
WHERE 球编号 not in (5,6,7,8,9,10,11,12,13,14,15);
所以结果就是( 1234 )
子查询举例-嵌套子查询
国债与企业债券概况表有记录,债券发行上市与增发表没有记录
--子查询的写法
select DISTINCT A.GPDM 代码,A.ZQJC 简称,A.ZWMC 中文名称
FROM usrZQZB A
join usrGZYQYZQGK C ON C.ZINBBM = A.INBBM
where A.INBBM not in ( select B.ZINBBM from usrZQFXSSYZF B )
--关联的写法
select DISTINCT B.GPDM 代码,B.ZQJC 简称,B.ZWMC 中文名称
FROM usrGZYQYZQGK A
join usrZQZB B on A.ZINBBM =B.INBBM
LEFT JOIN usrZQFXSSYZF C ON B.INBBM =C.ZINBBM
WHERE C.ZINBBM IS NULL
AND A.ZINBBM is not NULL
子查询举例-嵌套子查询
子查询的写法
SELECT DISTINCT a.ID,a.GSMC 企业编号,a.XXFBRQ,a.JZRQ 截止日期,
(select left( a.XXLY,charindex('2', a.XXLY)-1)) 信息来源
from usrJRGSCWZB a,usrZQZB b
where b.ZQSC in (83,90)
and b.ZQLB in (1,2)
and a.XXFBRQ>'2017-01-01'
AND (select left( a.XXLY,charindex('2', a.XXLY)-1))=b.ZWMC
AND NOT EXISTS (SELECT * FROM usrGSGGYWFWB WHERE IGSDM= b.IGSDM AND XXFBRQ=a.XXFBRQ)
关联的写法
SELECT DISTINCT a.ID,a.GSMC 企业编号,a.XXFBRQ,a.JZRQ 截止日期,
(select left( a.XXLY,charindex('2', a.XXLY)-1)) 信息来源
from usrJRGSCWZB a
join usrZQZB b on (select left( a.XXLY,charindex('2', a.XXLY)-1))=b.ZWMC
and b.ZQSC in (83,90)
and b.ZQLB in (1,2)
and a.XXFBRQ>'2017-01-01'
left join usrGSGGYWFWB c on c.IGSDM= b.IGSDM
and c.XXFBRQ=a.XXFBRQ
where c.IGSDM is null
子查询举例-内联视图
--内联视图
select * from
(
select a.XXFBRQ,a.IGSDM,a.TZBZ,a.JZRQ ,b.ZQJC,a.GGLB ,a.XXLY ,c.OPERATORNAME,
count(1) over (partition by a.IGSDM) zs from usrCWBBZCFZB a—开窗函数
join usrZQZB b on b.IGSDM = a.IGSDM
join cmdOPERATORS c on c.OPERATORID=a.XGRY
where b.ZQLB IN (1,2)
and a.HBZJ IS NULL
and a.XXLY not like '跟踪评级报告'
and a.WZBZ=1
AND a.QYXZ=99
and c.OPERATORNAME <> '无(unknown)'
AND a.ZCZE<>0
and b.INBBM = (select top 1 INBBM from usrZQZB where IGSDM = a.IGSDM order by ZQLB)
) a
where zs<10
order by a.JZRQ desc