8. 子查询
子查询定义:在一个查询的内部还包括另外一个查询
子查询格式:在小括号中编写代码
SELECT DISTINCT *|列名 别名
FROM 表名 别名
{括号内容就是子查询
SELECT DISTINCT *|列名 别名
FROM 表名 别名
{WHERE 条件(s)}
{GROUP BY分组条件{HAVING 分组条件}}
{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}
}
{WHERE 条件(s)}
{GROUP BY分组条件{HAVING 分组条件}}
{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}
子查询类别:
单列子查询:返回的结果是一列的一个内容,出现几率最高
单行子查询:返回多个列,有可能是一条完整的记录
多行子查询:返回多条记录
范例:要求查询比7654工资要高的全部雇员的信息,要首先知道7654雇员的工资
之后要以以上的结果作为后续查询的依据。只要是其他的工资大于sal,就符合条件
范例:要求查询比7654工资要高,同时与7788从事相同工作的全部雇员的信息
范例:要求查询出部门名称、部门员工数、部门的平均工资、部门的最低收入雇员的姓名
程序需要两张表关联:dept、emp
第一步:如果要像求出每个部门的员工数量及平均工资,则要按照deptno分组;
第二步:但是如果要想查出来部门的名称,则需要与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;
第三步:部门的最低收入雇员的姓名
SELECT d.dname,ed.c,ed.a,e.ename
FROM dept d,emp e,(
SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min
FROM emp
GROUP BY deptno) ed
WHERE d.deptno=ed.deptno AND e.sal=ed.min;
如果此时在一个部门中同时存在两个工资最低的雇员,程序就会出现错误。
1)IN
指定查询的范围
范例:求出每个部门最低工资的雇员信息。每个部门的最低工资,返回值肯定是多个,所以此时可以使用IN制定一个操作的范围
2)ANY
三种情况:
=ANY 与IN的操作符的功能完全一样
>ANY 比里面最小的值要大
<ANY 比里面最小的值要大
3)ALL
>ALL 比最大的值要大
<ALL 比最小的值要小
对于子查询来讲,还可以进行多列子查询,一个子查询中同时返回多个查询的列,但在开发中不建议使用。