复杂查询=简单查询+限定查询+查询排序+多表查询+分组统计查询+子查询
注:本文所用所有数据库均为Oracle官方在安装时给出的样例数据库。
想要学习数据库复杂查询是第一步,我们看一个例子。
列出薪金高于部门30的所有员工的薪金的员工的姓名和薪金、部门名称、部门人数。
要向完成这个查询首先需要分解问题,第一步找出部门30员工的最高工资,只要高于这个都是要查询的目标。既然是要大于最大值,那必然要用ALL关键字。
SELECT sal
FROM emp
WHERE deptno=30;
通过这个查询我们将所有部门30的员工的工资查询出来,只需要放在WHERE子查询中作为一个判断条件就可以完成我们的查询。所以第二步我们完成这个子查询,既然要引入dept表就不要忘记消除引入表带来的笛卡尔积问题。
SELECT e.ename,e.sal,d.dname
FROM emp e,dept d
WHERE sal>ALL(
SELECT sal
FROM emp
WHERE deptno=30) AND
e.deptno=d.deptno;
在上一步我们查询出了前三个信息,但是第四个部门人数不好查。这里的思路是先对部门进行分组,将人数统计出来之后作为一个临时表添加到FROM语句中作为子查询。
SELECT deptno,COUNT(empno)
FROM emp
GROUP BY deptno ;
上面的子查询找到了部门人数,但是这个是多行多列表,所以我们将其添加到FROM语句之中,并在WHERE语句之中消除笛卡尔积。
SELECT e.ename,e.sal,d.dname,temp.count
FROM emp e,dept d,(
SELECT deptno,COUNT(empno)count
FROM emp
GROUP BY deptno) temp
WHERE sal>ALL(
SELECT sal
FROM emp
WHERE deptno=30) AND
e.deptno=d.deptno AND
temp.deptno=e.deptno;
到此为止这个复杂查询就正式完成了。
总结
看到复杂查询不要怕,首先完成简单查询将单表信息查询完成。然后引入多表,消除笛卡尔积。如果需要获得某个数据的最大最小值就写子查询在WHERE中判断,如果要统计数字。可以考虑做临时表,不要忘记消除笛卡尔积。