别名
SELECT t.ename
FROM (
SELECT empno, ename, sal
FROM emp
JOIN dept
ON emp.deptno = dept.deptno
) as t
GROUP BY
-- 三行: 10 20 30
SELECT deptno
FROM emp
GROUP BY deptno
SELECT deptno, avg(sal) as '部门平均工资'
FROM emp
GROUP BY deptno
-----
先按部门分组,再按职称分组
HAVING 【对分组后的信息进行过滤】
SELECT deptno ,avg(sal), count(*) AS '这个分组内,记录的个数'
FROM emp
GROUP BY deptno
HAVING avg(sal) >= 2000
连接
SELECT ename, dname, sal
FROM dept, emp
WHERE emp.deptno = dept.deptno AND emp.sal > 2000;
SELECT ename, dname, sal
FROM emp
JOIN dept
ON emp.deptno = dept.deptno
WHERE emp.sal > 2000
多用JOIN ON来连接表
习题:
1>求出每个员工的 姓名 部门编号 薪水 和 薪水的等级
SELECT emp.empno, emp.ename, emp.sal ,emp.deptno , dept.dname, salgrade.grade
FROM emp
JOIN dept
ON emp.deptno = dept.deptno
JOIN salgrade
ON emp.sal >= salgrade.losal AND emp.sal <= salgrade.hisal
2>查找 每个部门的编号 该部门所有员工的平均工资 平均工资的等级
-- 错误写法:
SELECT deptno, avg(sal)
FROM emp
GROUP BY deptno
-- 以下部分错误
JOIN salgrade
ON avg(sal) BETWEEN salgrade.losal AND salgrade.hisal
-- 视图、不好的做法
CREATE VIEW view_avg
AS
SELECT deptno, avg(sal)
FROM emp
GROUP BY deptno;
-- 上面不加AS 就只能``,而且这`是esc下面那个 不是'' 不是""
SELECT *
FROM view_avg
JOIN salgrade
ON view_avg.`avg(sal)` BETWEEN salgrade.losal AND salgrade.hisal;
-- 视图的做法
CREATE VIEW dept_avgsal
AS
SELECT deptno, avg(sal) as avgsal
FROM emp
GROUP BY deptno;
SELECT dept_avgsal.deptno, dept_avgsal.avgsal, salgrade.grade
FROM dept_avgsal
JOIN salgrade
ON dept_avgsal.avgsal BETWEEN salgrade.losal AND salgrade.hisal;
-- 查找结果 起个别名
SELECT *
FROM (SELECT deptno, avg(sal) as avgsal
FROM emp
GROUP BY deptno
) as t
JOIN salgrade
ON t.avgsal BETWEEN salgrade.losal AND salgrade.hisal;
3>查找每个部门的 编号 部门名称 该部门所有员工的平均工资 平均工资的等级
CREATE VIEW dept_avgsal
SELECT deptno,avg(sal) as avgsal
FROM emp
GROUP BY deptno
SELECT dept_avgsal.deptno, dept.dname , dept_avgsal.avgsal, salgrade.grade
FROM dept_avgsal
JOIN dept
ON dept_avgsal.deptno = dept.deptno
JOIN salgrade
ON dept_avgsal.avgsal BETWEEN salgrade.losal AND salgrade.hisal;
4>求出emp表中所有领导的信息
CREATE VIEW leader
AS
SELECT DISTINCT mgr
FROM emp
SELECT *
FROM emp
JOIN leader
ON emp.empno = leader.mgr
5>求出平均薪水最高的部门的编号 和 部门的平均工资
SELECT deptno, avg(sal) as avgsal
FROM emp
GROUP BY deptno
ORDER BY avgsal DESC
LIMIT 1
6>把 工资大于所有员工中工资最低的 前3个人的 姓名 工资 部门编号 部门名称 工资等级 输出
CREATE VIEW lowest
AS
SELECT sal
FROM emp
ORDER BY sal
LIMIT 1;
SELECT *
FROM emp
JOIN lowest
ON emp.sal > lowest.sal
LIMIT 3