博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子查询语法详解
阅读量:4556 次
发布时间:2019-06-08

本文共 2703 字,大约阅读时间需要 9 分钟。

子查询所要解决的问题:不能一步求解的问题!

语法:select 语句的嵌套
1.单行子查询:如果子查询只返回一行记录,就是单行子查询
单行操作符: = , > , >=,<,<=,<>
2.多行子查询:如果子查询返回多行记录,就是多行子查询
多行操作符: in(set) , any , all
如:查询工资比SCOTT高的员工信息,分两步
1.查询SCOTT的工资: select sal from emp where ename='SCOTT';
2. 查询比3000高的员工: select * from emp where sal>3000;
子查询: select * from emp where sal > (select sal from emp where ename='SCOTT');
//多行子查询
1.in 在集合中
select * from emp where deptno in (select deptno from dept where dname='SALES'or dname='ACCOUNTNG');
select e.* from emp e,dept d where e.deptno=d.deptnoand (d.dname='SALES' or d.dname='ACCOUNTING');
2.any: 和集合中任意一个值比较
//查询工资比30号部门任意一个员工高的员工信息
select * from emp where sal > any (select sal from emp where deptno=30);
//大于集合任意一个值,只需要大于集合最小值即可
select * from emp where sal > (select min(sal) from emp where deptno=30)
3. all:和集合中的所有值比较
//查询工资比30号部门所有员工高的员工信息
select * from emp where sal > all (select sal from emp where deptno=30);
或 select * from emp where sal > (select max(sal) from emp where deptno=30)
注意的问题:
1. 要有括号
2.合理的书写风格
3.可以在主查询的where ,select, having ,from后面都可以使用子查询
select 语句后面使用子查询,只能使用单行子查询,即只允许返回一条记录
4.不可以在group by后面使用子查询
5.强调from后面的子查询
6.主查询和子查询可以不是同一张表;只要子查询返回的结果主查询可以使用 即可
7.一般不在子查询中排序;但在top-n分析问题中,必须对子查询排序
8.一般先执行子查询 再执行主查询;但相关子查询例外
9.单行子查询只能使用单行操作符;多行子查询只能使用多行操作
主查询可以有多个子查询,即1:n关系,子查询可以嵌套用,最多855层
10.子查询中的null ,为什么集合中若有空值,不能用not in(10,20,null) 可以用in( );
举例:和上面序号对应
3. //select 语句后面使用子查询,只能使用单行子查询,即只允许返回一条记录
select empno,ename,sal,(select job from emp where empno=7839) 第四列 from emp;
//按部门分组查询最低工资,且最低工资大于10号部门的最低工资才显示
select deptno ,min(sal) from emp group by deptno having min(sal) >
(select min(sal) from emp where deptno = 10);
//查询员工号,姓名,月薪 ,年薪
select * from (select empno,ename,sal , sal*12 年薪 from emp );
6.查询部门名称是sales的员工
select * from emp where deptno = (select deptno from dept where dname='SALES');//子查询方式
select e.* from emp e,dept d where e.deptno = d.deptno and d.dname='SALES';//多表查询方式
7.Top-n分析: 找出员工工资表的前三名
8.一般先执行子查询 再执行主查询;但相关子查询例外
9.单行子查询只能使用单行操作符;多行子查询只能使用多行操作
//查询工资最低的员工的职位和薪水
select ename,job,sal from emp where sal =(select min(sal) from emp);
//下面是非法的,因为多行子查询使用单行比较符
select ename from emp where sal = (select min(sal) from emp groupby deptno);错误
10. 单行子查询空值问题 不能贸然使用 = 或 != ,因为后面返回null就永远不成立
select ename, job from emp where job=(select job from emp where ename='mike') //子查询可能返回null ,而判断是否为空,不能使用 = 或者 !=
多行子查询中的null:
集合有空值,不能用not in 可以用in
//查询不是领导的员工
select * from emp where empno not in (select mgr from emp); //错误写法
select * from emp where empno not in (select mgr from emp where mgr is not null);//正确
---------------------
作者:水河澹澹
来源:CSDN
原文:https://blog.csdn.net/qq_33497137/article/details/53791261
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/CandiceW/p/10037366.html

你可能感兴趣的文章
128.C++文件操作小结
查看>>
开源项目托管GitHub
查看>>
WebStorm、Intellij IDEA、PhpStorm jar包破解
查看>>
Unity学习笔记—— 常用脚本函数
查看>>
.getCellType()的几种类型值
查看>>
linux中启动 java -jar 后台运行程序
查看>>
运行web项目端口占用问题
查看>>
Java Spring-IOC和DI
查看>>
【NOIP1999】【Luogu1015】回文数(高精度,模拟)
查看>>
Linux上安装Python3.5
查看>>
crt安装
查看>>
git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git
查看>>
c++中static的用法详解
查看>>
转 我修改的注册表,但是程序运行起来,还是记着以前的
查看>>
图片轮播功能
查看>>
第六周小组作业:软件测试和评估
查看>>
UVA2636
查看>>
PHP环境搭建所遇到的问题
查看>>
Flash开发移动设备技巧
查看>>
QQ西游内存数据分析-2012年9月28日
查看>>