前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL理论课-Class 5

SQL理论课-Class 5

作者头像
OliverHan
发布2023-04-04 11:18:56
2730
发布2023-04-04 11:18:56
举报
文章被收录于专栏:阿狐和柴柴阿狐和柴柴

Class_5: 子查询2

代码语言:javascript
复制
select ENAME
from EMP
where salary = some (select salary from EMP where EMPNO = 30) and deptno <> 30

判断子查询是否存在:exists 和 not exists(相关子查询)

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。

和 in\not in 的区别:

in 的子查询可以先执行,因为子查询和外部查询无关(无关子查询) exists 先执行外部查询,因为子查询内部与外部查询可能有关(比如where条件中使用外部查询的别名) – 注意:只要子查询能独立执行就是不相关。 – 外查询表中有多少行,就执行多少次exists,每一行都去测试。 – in 是子查询结束,进行筛选。

代码语言:javascript
复制
select name 
from student as s
where not exists (select *  --exists子查询的select后面属性可以随便写,因为exists只判断是否符合条件。
                  from takes as t
                  where s.ID=t.ID and course_id='cd-347')

-- 注意:not exists 不会受表中数据存在NULL的影响。                                    

查找所有选了全部生物课的学生

生物系的课 - 学生选的课 = 空,即子查询不会返回行。

– 判断条件: not exists (生物系的课 except 学生选的课)

练习:找出哪个部门包含了除了总经理以外的所有种类的职位

代码语言:javascript
复制
select DEPTNO
from EMP
where not exists (select distinct job 
                  from EMP 
                  where MGR is not NULL)  --所有除了总经理的职位
                  
                  except 
                  
                  (select distinct job 
                   from EMP a 
                   where emp.deptno = a.deptno)--减去部门包含的职位
-- 减去部门包含的职位这里,外面的emp.deptno = 里面a.deptno 说明子查询的职位对应部门,正在外部查询的部门   

子查询可以出现在任何表出现的地方。

比如说select, from,where,having

select 里面可以相关,不相关子查询 from 不相关子查询 where 相关,不相关,标量子查询

标量子查询:子查询返回行数为1行:

可以出现在任何 值出现的地方:值运算符

with 语句

当子查询出现在from,可读性太差用with子句:(也是不相关子查询)

代码语言:javascript
复制
with 表名(属性名1,属性名2) as 表

with 表1
select 属性
from 表2
where 小表和大表的条件

with 表1
     由表1定义的表2
from 表1,表2
where 表1和表2条件

重点习题:

1.谁的工资比自己部门的平均工资高

代码语言:javascript
复制
-- from写法:

select ename
from emp a,(select AVG(sal) avgs,deptno   
            from emp    
            group by deptno) as b
where a.DEPTNO=b.DEPTNO and a.sal>b.avgs



-- with写法:

with avg_SAL(avgs,deptno) as (select avg(sal),deptno 
                              from EMP 
                              group by DEPTNO)
select ENAME
from EMP a,avg_SAL --这里EMP记为a和上面子查询区分开。
where a.DEPTNO = avg_SAL.DEPTNO and a.SAL > avg_SAL.avgs


-- where写法:

select ename
from emp a
where a.sal >(select avg(sal)
              from emp b
			        where a.DEPTNO=b.DEPTNO)

2.(标量子查询) 查询每个员工的工资和平均工资的差,以及该部门有多少人。

代码语言:javascript
复制
select empno,sal-(select avg(sal) from emp),(count(*) from emp b where a.deptno=b.deptno)
from emp a
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Class_5: 子查询2
    • 判断子查询是否存在:exists 和 not exists(相关子查询)
      • 和 in\not in 的区别:
      • 查找所有选了全部生物课的学生
      • 练习:找出哪个部门包含了除了总经理以外的所有种类的职位
    • 子查询可以出现在任何表出现的地方。
      • 比如说select, from,where,having
    • 标量子查询:子查询返回行数为1行:
      • with 语句
        • 当子查询出现在from,可读性太差用with子句:(也是不相关子查询)
      • 重点习题:
        • 1.谁的工资比自己部门的平均工资高
        • 2.(标量子查询) 查询每个员工的工资和平均工资的差,以及该部门有多少人。
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档