分组
-
分组查询
示例:按部门编号进行分组,查询出各个部门的平均工资
SELECT DEPTNO,FLOOR(AVG(SALARY)) AS AVG_SAL
FROM EMP GROUP BY DEPTNO;
-
HAVING 句子
HAVING子句用来对分组后的结果进一步限制,比如按部门分组后,得到每个部门的最高薪水,可以继续限制输出结果。必须跟在GROUP BY 后面,不能单独存在。
示例:查询每个部门的最高薪水,只有最高薪水大于4000的记录才会被输出显示
SELECT DEPTNO,MAN(SAL)MAN_SAL FROM EMP
GROUP BY DEPTNO HAVING MAN(SAL)>4000;
查询出10号部门的平均工资(GROUP BY 子句后面不能直接跟WHERE子句)
SELECT DEPTNO,AVG(SALARY) AS AVG_SAL
FROM EMP GROUP BY DEPTNO WHERE DEPTNO=10; //会报错
SELECT DEPTNO,AVG(SALARY) AS AVG_SAL
FROM EMP GROUP BY DEPTNO HAVING DEPTNO=10;//执行通过
关联查询
-
内连接
内连接返回两个关联表中所有满足连接条件的记录。
示例:查询员工的名字和所在部门的名字
SELECT T1.ENAME,T2.DNAME
FROM EMP T1,DEPT T2
WHERE T1.DEPTNO = T2.DEPTNO;
或者
SELECT T1.ENAME,T2.DNAME
FROM EMP T1 JOIN DEPT T2
ON (T1.DEPTNO = T2.DEPTNO);
-
内连接
示例:查询出所有员工的工号,姓名,所在城市将员工表和部门表进行连接,需要设置连接条件 (T1.DEPTNO=T2.ID) 连接数据表使用JOIN关键字
内连接(使用JOIN)
SELECT T1.ID,T1.NAME,T2.LOC
FROM EMP T1 JOIN DEPT T2
ON T1.DEPTNO=T2.ID;
内连接(不使用JOIN)
SELECT T1.ID,T1.NAME,T2.LOC
FROM EMP T1,DEPT T2
WHERE T1.DEPTNO=T2.ID;
-
左连接(LEFT JOIN)
SELECT T1.ID,T1.NAME,T2.LOC
FROM EMP T1 LEFT JOIN DEPT T2
ON T1.DEPTNO=T2.ID;
-
右连接(RIGHT JOIN)
SELECT T1.ID,T1.NAME,T2.LOC
FROM EMP T1 RIGHT JOIN DEPT T2
ON T1.DEPTNO=T2.ID;
-
全外链接(FULL OUTER JOIN)
SELECT T1.ID,T1.NAME,T2.LOC
FROM EMP T1 FULL OUTER JOIN DEPT T2
ON T1.DEPTNO=T2.ID;
-
自连接
自连接是一种特殊的连接查询,数据的来源是一个表,即关联关系来自于表单中的多个列。表中的列参照同一个表中的其他列的情况称作自参照表。
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接。
示例:查出每个职员的经理名字,以及他们的职员编码
SELECT T1.EMPNO W_EMPNO,T1.ENAME W_ENAME,
T2.EMPNO M_EMPNO,T2.ENAME M_ENAME
FROM EMP T1 JOIN EMP T2
ON T1.MGR = T2.EMPNO;