【Oracle 数据库】奶妈式教程 day09 子查询

编程知识 行业动态 更新时间:2024-06-13 00:20:52

子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询

1.from后面的子查询

举例:查询员工的姓名和他上级的姓名

SELECT E.*, E2.EMPNO, E2.ENAME MNAME, E2.JOB, E2.SAL, E2.DEPTNO
 FROM EMP E, EMP E2
 WHERE E.MGR = E2.EMPNO(+);

所谓的from后面的子查询,无法就像将上面代码当作一张 “表” ,在外层在套一层select语句,表示从后面语句的结果集里进行字段筛选。

SELECT ENAME, MNAME
 FROM 
 (SELECT E.*, D.EMPNO, D.ENAME MNAME, D.JOB, D.SAL, D.DEPTNO
 FROM EMP E, EMP D
 WHERE E.MGR = D.EMPNO(+));

2.where后面的子查询

2.1 单行子查询

单行子查询:子查询的sql语句只查出一条记录

举例:查询工资大于10号部门平均工资的员工信息
首先查询10号部门的员工平均工资

SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 10;

也就是说我要查询的数据,其工资要大于我上面查的值。那我们可以这么写:

SELECT * FROM EMP WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 10);

2.2 多行子查询

多行子查询:子查询的sql语句查出若干条记录。
一般用于:IN,NOT IN,EXISTS,NOT EXISTS,ALL,ANY

举例:查询工资比20号部门所有人工资都高的员工信息
1)用单行子查询实现
思路:现在查询20部门最高的工资

SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 20;



然后将上面语句做为条件写入到where条件表达式种

 SELECT *
 FROM EMP
 WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 20);



2)用多行子查询实现:>all
思路:首先查询20部门的工资,将其视为一个集合

SELECT SAL FROM EMP WHERE DEPTNO = 20;



将上面查询的集合放入where条件中,用 >all (等价于大于最大的)

SELECT * FROM EMP WHERE SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO = 20);

3.having后面的子查询

举例:查询各个部门的部门编号和员工人数,要求部门的平均工资大于30号部门的平均工资
首先我们需要查询出30部门的平局工资

SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30;



然后将其做为条件利用having进行过滤

SELECT DEPTNO, COUNT(*)
 FROM EMP
 GROUP BY DEPTNO
HAVING AVG(SAL) > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30);

4.select 和from 之间的子查询

注意:select 和from之间的子查询,子查询的结果只能是单行单列

SELECT EMPNO, ENAME, (SELECT 1 FROM DUAL) FROM EMP;

更多推荐

【Oracle 数据库】奶妈式教程 day09 子查询

本文发布于:2023-03-30 18:52:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/183b4bc6748b4e84e3cbf25c81318478.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:奶妈   数据库   教程   Oracle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!