Sql 子查询

子查询的分类?

  • 标量子查询: 出现在SELECT 列表中的子查询称为标量子查询
  • 内联视图 :出现在 FROM 子句中的视图称为内联视图
  • 嵌套子查询 :出现在 WHERE 子句中的子查询称为嵌套子查询

嵌套子查询的语法格式?

Where 查询表达式 [NOT] in  (子查询)

Where 查询表达式  比较运算符 [ANY/ALL  ] (子查询)

Where 查询表达式 NOTEXISTS 子查询

子查询的使用规则?

  1. 子查询必须“自身就是一个完整的查询”。即,它必须至少包括一个SELECT子句和FROM子句。
  2. 子查询SELECT语句不能包括在ORDER BY子句中。因为ORDER BY字句只能对最终查询结果排序,如果显示的输出需要按照特定顺序显示,那么ORDER BY子句应该作为外部查询的最后一个子句列出。
  3. 子查询“必须包括在一组括号中”,以便将它与外部查询分开。
  4. 如果将子查询放在外部查询的WHERE或HAVING子句中,那么该子查询只能位于比较运算符的“右边”。
  5. 任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
  6. 子查询最多可以嵌套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


打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦