MySQL的视图练习题

数据准备

CREATE TABLE dept  (
  deptno int NOT NULL,
  dname varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  loc varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`deptno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO dept VALUES (10, '教研部', '北京');
INSERT INTO dept VALUES (20, '学工部', '上海');
INSERT INTO dept VALUES (30, '销售部', '广州');
INSERT INTO dept VALUES (40, '财务部', '武汉');

CREATE TABLE emp  (
  empno int NOT NULL,
  ename varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  job varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  mgr int NULL DEFAULT NULL,
  hiredate date NULL DEFAULT NULL,
  sal decimal(7, 2) NULL DEFAULT NULL,
  COMM decimal(7, 2) NULL DEFAULT NULL,
  deptno int NULL DEFAULT NULL,
  PRIMARY KEY (empno) USING BTREE,
  INDEX fk_emp(mgr) USING BTREE,
  CONSTRAINT fk_emp FOREIGN KEY (mgr) REFERENCES emp (empno) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO emp VALUES (1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, NULL, 20);
INSERT INTO emp VALUES (1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30);
INSERT INTO emp VALUES (1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30);
INSERT INTO emp VALUES (1004, '刘备', '经理', 1009, '2001-04-02', 29750.00, NULL, 20);
INSERT INTO emp VALUES (1005, '谢逊', '销售员', 1006, '2001-09-28', 12500.00, 14000.00, 30);
INSERT INTO emp VALUES (1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, NULL, 30);
INSERT INTO emp VALUES (1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, NULL, 10);
INSERT INTO emp VALUES (1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, NULL, 20);
INSERT INTO emp VALUES (1009, '曾阿牛', '董事长', NULL, '2001-11-17', 50000.00, NULL, 10);
INSERT INTO emp VALUES (1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30);
INSERT INTO emp VALUES (1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, NULL, 20);
INSERT INTO emp VALUES (1012, '程普', '文员', 1006, '2001-12-03', 9500.00, NULL, 30);
INSERT INTO emp VALUES (1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, NULL, 20);
INSERT INTO emp VALUES (1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, NULL, 10);

CREATE TABLE salgrade  (
  grade int NOT NULL,
  losal int NULL DEFAULT NULL,
  hisal int NULL DEFAULT NULL,
  PRIMARY KEY (grade) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO salgrade VALUES (1, 7000, 12000);
INSERT INTO salgrade VALUES (2, 12010, 14000);
INSERT INTO salgrade VALUES (3, 14010, 20000);
INSERT INTO salgrade VALUES (4, 20010, 30000);
INSERT INTO salgrade VALUES (5, 30010, 99990);

练习题

1:查询部门平均薪水最高的部门名称

2:查询员工比所属领导薪资高的部门名、员工名、员工领导编号

3:查询工资等级为4级,2000年以后入职的工作地点为上海的员工编号、姓名和工资,并查出薪资在前三名的员工信息

练习题答案

-- 1:查询部门平均薪水最高的部门名称
SELECT
	a.deptno,
	a.dname,
	a.loc,
	avg_sal
FROM
	dept a,

(
SELECT
	* 
FROM
	( SELECT *, RANK ( ) ) OVER ( ORDER BY avg_sal DESC ) rn 
FROM
	( SELECT deptno, AVG( deptno ) avg_sal FROM emp GROUP BY deptno ) t 
	) tt 
WHERE
	rn = 1 
	) ttt 
WHERE
	a.deptno = ttt.deptno

-- 方法二 	
	CREATE VIEW test_view1 AS SELECT deptno, AVG( deptno ) avg_sal FROM emp GROUP BY deptno
	CREATE VIEW test_view2 AS SELECT *, RANK ( ) ) OVER ( ORDER BY avg_sal DESC) rn FROM test_view1
	CREATE VIEW test_view3 AS SELECT * FROM test_view2 tt WHERE rn=1

SELECT
	a.deptno,
	a.dname,
	a.loc,
	avg_sal
FROM
	dept a,
	test_view3 ttt
WHERE
	a.deptno = ttt.deptno
	

-- 2:查询员工比所属领导薪资高的部门名、员工名、员工领导编号
-- 2.1查询员工比领导工资高的部门号
CREATE view test_view4
AS
SELECT
	a.ename enane,
	a.sal sal,
	b.ename mgrname,
	b.sal msal,
	a.deptno 
FROM
	emp a,
	emp b 
WHERE
	a.mgr = b.empno 
	AND a.sal > b.sal;
	
	-- 2.2将第一步查询出来的部门号和部门表进行链表查询
SELECT
	* 
FROM
	dept a
	JOIN test_view4 b ON a.deptno = b.deptno;
	
-- 3:查询工资等级为4级,2000年以后入职的工作地点为上海的员工编号、姓名和工资,并查出薪资在前三名的员工信息
-- 3.1需求1:查询工资等级为4级,2000年以后入职的工作地点为上海的员工编号、姓名和工资
CREATE VIEW test_view5 AS SELECT
a.deptno,
a.dname,
a.loc,
b.empno,
b.ename,
b.sal 
FROM
	dept a
	JOIN emp b ON a.deptno = b.deptno 
	AND YEAR ( hiredate ) > '2000' 
	AND a.loc = '上海'
	JOIN salgrade c ON c.grade = 4 
	AND ( b.sal BETWEEN c.losal AND c.hisal );
	
	SELECT * FROM
	(
	SELECT *,RANK() OVER(ORDER BY sal DESC)rn
	FROM
	test_view5
)t
WHERE rn<=3;
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火眼猊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值