13、子查询

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);

思考:

       要求查询出:部门名称、部门的员工数,部门的平均工资,部门的最低收入雇员的姓名。

       程序需要两张表关联:deptemp

       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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值