SQL(给SELECT出来的结果表 起别名、GROUP BY、HAVING、连接JOIN ON、TOP 1(其实是LIMIT 1))

别名

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

发布了123 篇原创文章 · 获赞 1 · 访问量 5437

猜你喜欢

转载自blog.csdn.net/bijingrui/article/details/104999356