首页 > 学院 > 开发设计 > 正文

【Oracle数据库】高级子查询

2019-11-08 20:56:13
字体:
来源:转载
供稿:网友

嵌套子查询

在通常的子查询中,子查询是以嵌套的方式写在父查询的FROM、WHERE、HAVING子句中,所以被称为嵌套子查询嵌套子查询的执行过程:子查询首先执行一次用来自子查询的值确认或取消父查询的候选行嵌套子查询示例
-- 查询工资大于所在部门平均工资的员工编号、员工姓名、工资SELECT empno,ename,salFROM emp e,(SELECT deptno,AVG(sal) avgsal,            FROM emp            GROUP BY deptno) dWHERE e.deptno=d.deptnoAND e.sal>d.avgsal

相关子查询

相关子查询指的是查询中再查询,通常是以一个查询作为条件来供另一个查询使用相关子查询的执行过程:父查询中的行每被处理一次,子查询就执行一次取得父查询的候选行用候选行被子查询引用列的值执行子查询用来自子查询的值确认或取消候选行重复步骤1、2、3,直到父查询中再无剩余的候选行相关子查询示例
-- 查询工资大于所在部门平均工资的员工编号、员工姓名、工资、部门编号SELECT empno,ename,sal,deptnoFROM emp outerWHERE sal>(SELECT AVG(sal)           FROM emp           WHERE deptno=outer.deptno)-- 查询所有部门名称和人数SELECT dname,(SELECT COUNT(empno)              FROM emp              WHERE deptno=d.deptno)FROM dept d

EXISTS和NOT EXISTS操作符

EXISTS判断是否“存在”EXISTS具体操作过程:子查询中如果有记录找到,子查询语句不会继续执行,返回值为TRUE子查询中如果到表的末尾页没有记录找到,返回值为FALSEEXISTS子查询并没有确切记录返回,只判断是否有记录存在,而且只要找到相关记录,子查询就不需要再执行,然后再进行下面的操作,极大的提高了语句的执行效率
-- 查询哪些人是经理SELECT ename,job,sal,deptnoFROM emp eWHERE EXISTS (SELECT '1'              FROM emp              WHERE mgr=e.empno)“'1'”只是占位用,没有实际意义NOT EXISTS与EXISTS正好相反,判断子查询是否没有返回值:如果没有返回值,表达式为真,如果找到一条返回值,则为假NOT EXISTS操作符只会返回TRUE或FALSE,不会返回空值,所以不需要考虑子查询去除空值的问题
-- 查询哪些人不是经理SELECT ename,job,sal,deptnoFROM emp eWHERE EXISTS (SELECT '1'              FROM emp              WHERE mgr=e.empno)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表