4.8、子查询
子查询:在一个查询的内部还包括另外一个查询,则此查询称为子查询,子查询的格式:
SELECT {DISTINCT}*| 查询列1 别名1,查询列2 别名2,… FROM 表名称1别名1,表名称2 别名2, ( SELECT {DISTINCT}*| 查询列1 别名1,查询列2 别名2,… FROM 表名称1别名1,表名称2 别名2,… {WHERE 条件(s)} {GROUP BY 分组条件 {HAVING 分组条件}} {ORDER BY 排序的字段 ASC|DESC,排序的字段 ASC|DESC,…} )别名, … {WHERE 条件(s) ( SELECT {DISTINCT}*| 查询列1 别名1,查询列2 别名2,… FROM 表名称1别名1,表名称2 别名2,… {WHERE 条件(s)} {GROUP BY 分组条件 {HAVING 分组条件}} {ORDER BY 排序的字段 ASC|DESC,排序的字段 ASC|DESC,…} ) } {GROUP BY 分组条件 {HAVING 分组条件}} {ORDER BY 排序的字段 ASC|DESC,排序的字段 ASC|DESC,…} |
范例:要求查询出比7654工资要高的全部雇员的信息
·要首先清楚的知道7654雇员的工资是多少
SELECT sal FROM emp WHERE empno=7654; |
·之后要以以上的结果做为后续查询的依据,只要是其他的工资大于sal,则表示符合条件。
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno=7654); |
所有的子查询必须在“()”中编写代码。
子查询的操作中有分为以下三类:
·单列子查询:返回的结果是一列的一个内容,出现几率最高
·单行子查询:返回多个列,有可能是一条完整的记录
·多行子查询:返回多条记录
范例:要求查询出工资比7654高,同时与7788从事相同工作的全部雇员信息。
·查询出7654的工资
SELECT sal FROM emp WHERE empno=7654; |
·查询出7788的工作
SELECT job FROM emp WHERE empno=7788; |
·之后把两个条件进行综合查找
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno=7654) AND job=(SELECT job FROM emp WHERE empno=7788); |
范例:要求查询出工资最低的雇员姓名、工作、工资
·求出最低工资
SELECT MIN(sal) FROM emp; |
·以最低工资为条件进行下一步的查询
SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp); |
思考:
要求查询出:部门名称、部门的员工数,部门的平均工资,部门的最低收入雇员的姓名。
程序需要两张表关联:dept、emp
1、如果要想求出每个部门的员工数量,及平均工资,则肯定要使用分组统计,按照deptno进行分组。
SELECT deptno,COUNT(empno),AVG(sal) FROM emp GROUP BY deptno; |
2、但是如果要想查出来部门的名称,则需要与dept表进行关联。
SELECT d.dname,ed.c,ed.a FROM dept d,( SELECT deptno,COUNT(empno) c,AVG(sal) a FROM emp GROUP BY deptno) ed WHERE d.deptno=ed.deptno; |
3、求出最低收入的雇员姓名
SELECT d.dname,ed.c,ed.a,e.ename FROM dept d,( SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min FROM emp GROUP BY deptno) ed,emp e WHERE d.deptno=ed.deptno AND e.sal=ed.min; |
如果此时,在一个部门之中同时存在两个工资最低的雇员,则程序就会出现错误。
在子查询中,存在以下三种查询的操作符号:
·IN
·ANY
·ALL
IN操作符,指定一个查询的范围
范例:求出每个部门的最低工资的雇员信息
·每个部门的最低工资,返回的值肯定是多个,所以此时可以使用IN指定一个操作的范围。
SELECT * FROM emp WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno); |
ANY操作:
·=ANY:与IN的操作符功能完全一样
SELECT * FROM emp WHERE sal=ANY(SELECT MIN(sal) FROM emp GROUP BY deptno); |
·>ANY:比里面最小的值要大
SELECT * FROM emp WHERE sal>ANY(SELECT MIN(sal) FROM emp GROUP BY deptno); |
·:比最大的值要小
SELECT * FROM emp WHERE sal |
所有人的工资都小于1300
ALL操作:
·>ALL:比最大的值要大
SELECT * FROM emp WHERE sal>ALL(SELECT MIN(sal) FROM emp GROUP BY deptno); |
·:比最小的值要小
SELECT * FROM emp WHERE sal |
对于子查询来讲,还可以进行多列子查询,一个子查询中同时返回多个查询的列。
SELECT * FROM emp WHERE (sal,NVL(comm,-1)) IN (SELECT sal,NVL(comm,-1) FROM emp WHERE deptno=20); |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21817401/viewspace-621927/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21817401/viewspace-621927/