Oracle学习日记——复杂查询入门

复杂查询=简单查询+限定查询+查询排序+多表查询+分组统计查询+子查询
注:本文所用所有数据库均为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中判断,如果要统计数字。可以考虑做临时表,不要忘记消除笛卡尔积。

你可能感兴趣的:(Oracle学习日记,数据库,java)