(四)MySQL員工部門查詢

建表腳本

-- 部門表
CREATE TABLE dept(
	deptno INT PRIMARY KEY AUTO_INCREMENT COMMENT '部門編號', -- 部門編號
	dname VARCHAR(20) COMMENT '部門名字',	  -- 部門名字
	loc VARCHAR(20) COMMENT '地址'   -- 地址
);
-- 員工表
CREATE TABLE emp(
	empno INT PRIMARY KEY AUTO_INCREMENT,-- 員工編號
	ename VARCHAR(20) COMMENT '員工姓名', -- 員工姓名										-
	job VARCHAR(20) COMMENT '崗位',	-- 崗位
	mgr INT COMMENT '直接領導編號',	 -- 直接領導編號
	hiredate date COMMENT '僱傭日期,入職日期', -- 僱傭日期,入職日期
	sal INT COMMENT '薪水', -- 薪水
	comm INT COMMENT '提成',  -- 提成
	deptno INT NOT NULL COMMENT '部門編號', -- 部門編號
	foreign key (deptno) references dept(deptno)
);
INSERT INTO dept VALUES(10,'財務部','北京');
INSERT INTO dept VALUES(20,'研發部','上海');
INSERT INTO dept VALUES(30,'銷售部','廣州');
INSERT INTO dept VALUES(40,'行政部','深圳');
INSERT INTO emp VALUES(7369,'劉一','職員',7902,'1980-12-17',800,null,20);
INSERT INTO emp VALUES(7499,'陳二','推銷員',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'張三','推銷員',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'李四','經理',7839,'1981-04-02',2975,null,20);
INSERT INTO emp VALUES(7654,'王五','推銷員',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'趙六','經理',7839,'1981-05-01',2850,null,30);
INSERT INTO emp VALUES(7782,'孫七','經理',7839,'1981-06-09',2450,null,10);
INSERT INTO emp VALUES(7788,'周八','分析師',7566,'1987-06-13',3000,null,20);
INSERT INTO emp VALUES(7839,'吳九','總裁',null,'1981-11-17',5000,null,10);
INSERT INTO emp VALUES(7844,'鄭十','推銷員',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'郭十一','職員',7788,'1987-06-13',1100,null,20);
INSERT INTO emp VALUES(7900,'錢多多','職員',7698,'1981-12-03',950,null,30);
INSERT INTO emp VALUES(7902,'大錦鯉','分析師',7566,'1981-12-03',3000,null,20);
INSERT INTO emp VALUES(7934,'木有錢','職員',7782,'1983-01-23',1300,null,10);

練習

-- 1.列出至少有一個員工的全部部門。
SELECT d.dname 部門名稱, COUNT(*) 員工數量 
FROM emp e
LEFT JOIN dept d
ON e.deptno = d.deptno
GROUP BY e.deptno;

-- 2.列出薪金比"劉一"多的全部員工。
SELECT ename 員工名稱, sal 員工薪水 
FROM emp 
WHERE sal > (SELECT sal FROM emp WHERE ename = '劉一');

-- 3.列出全部員工的姓名及其直接上級的姓名。
SELECT self.ename 員工, mgr.ename 上級 
FROM emp self
LEFT JOIN emp mgr
ON self.mgr = mgr.empno;

-- 4.列出受僱日期早於其直接上級的全部員工。
SELECT self.ename 員工, mgr.ename 上級, self.hiredate 員工受僱日期, mgr.hiredate 上級受僱日期 
FROM emp self
LEFT JOIN emp mgr
ON self.mgr = mgr.empno
WHERE self.hiredate < mgr.hiredate;

-- 5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。
SELECT d.dname 部門名稱, e.ename 員工信息 
FROM dept d
LEFT JOIN emp e
ON e.deptno = d.deptno;

-- 6.列出全部job爲「職員」的姓名及其部門名稱。
SELECT e.ename 員工名稱, d.dname 部門名稱, e.job
FROM emp e
LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE e.job = '職員';

-- 7.列出最低薪金大於1500的各類工做。
SELECT DISTINCT job FROM emp WHERE sal > 1500;

-- 8.列出在部門 "銷售部" 工做的員工的姓名,假定不知道銷售部的部門編號。
SELECT e.ename FROM emp e
LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE d.dname = '銷售部';

-- 9.列出薪金高於公司平均薪金的全部員工。
SELECT ename, sal FROM emp WHERE sal > (SELECT AVG(sal) FROM emp);

-- 10.列出與"周八"從事相同工做的全部員工。
SELECT ename, job FROM emp WHERE job = (SELECT job FROM emp WHERE ename = '周八');

-- 11.列出薪金等於部門30中員工的薪金的全部員工的姓名和薪金。
SELECT ename, sal, deptno FROM emp WHERE sal IN (SELECT sal FROM emp WHERE deptno = 30);

-- 12.列出薪金高於在部門30工做的全部員工的薪金的員工姓名和薪金。
SELECT ename, sal, deptno FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30);

-- 13.列出在每一個部門工做的員工數量、平均工資。
SELECT dept.deptno,COUNT(emp.empno),AVG(sal)
FROM dept
LEFT JOIN emp
ON dept.deptno=emp.deptno
GROUP BY dept.deptno;

-- 14.列出全部員工的姓名、部門名稱和工資。
SELECT e.ename 姓名, d.dname 部門名稱, e.sal 工資 FROM emp e
LEFT JOIN dept d
ON e.deptno = d.deptno;

-- 15.列出全部部門的詳細信息和部門人數。
SELECT d.deptno 部門編號, d.dname 部門名稱, d.loc 位置, tmp.count 人數 FROM dept d 
LEFT JOIN (SELECT deptno, COUNT(deptno) count FROM emp GROUP BY deptno) tmp
ON d.deptno = tmp.deptno;

-- 16.列出各類工做的最低工資。
SELECT job, MIN(sal) 最低工資 FROM emp GROUP BY job;

-- 17.列出各個部門的 經理 的最低薪金。
SELECT d.dname 部門名稱, tmp.sal 薪水 FROM dept d
LEFT JOIN (SELECT MIN(sal) sal, deptno FROM emp WHERE job = '經理' GROUP BY deptno) tmp
ON d.deptno = tmp.deptno;

-- 18.列出全部員工的年工資,按年薪從低到高排序。 
SELECT ename, (sal + IFNULL(comm, 0)) * 12 FROM emp;

-- 19.查出emp表中薪水在3000以上(包括3000)的全部員工的員工號、姓名、薪水。
SELECT empno, ename, sal FROM emp WHERE sal >= 3000;

-- 20.查詢出全部薪水在'陳二'之上的全部人員信息。
SELECT empno, ename, sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = '陳二');

-- 21.查詢出emp表中部門編號爲20,薪水在2000以上(不包括2000)的全部員工,顯示他們的員工號,姓名以及薪水,以以下列名顯示:員工編號 員工名字 薪水
SELECT empno 員工編號, ename 員工名字, sal 薪水 FROM emp WHERE sal > 2000 AND deptno = 20;

-- 22.查詢出emp表中全部的工做種類(無重複)
SELECT job FROM emp GROUP BY job;

-- 23.查詢出全部獎金(comm)字段不爲空的人員的全部信息。
SELECT * FROM emp WHERE comm IS NOT NULL;

-- 24.查詢出薪水在800到2500之間(閉區間)全部員工的信息。(注:使用兩種方式實現and以及between and)
SELECT * FROM emp WHERE sal BETWEEN 800 AND 2500;
SELECT * FROM emp WHERE sal >= 800 AND sal <= 2500;

-- 25.查詢出員工號爲7521,7900,7782的全部員工的信息。(注:使用兩種方式實現,or以及in)
SELECT * FROM emp WHERE empno IN (7521, 7900, 7782);
SELECT * FROM emp WHERE empno = 7521 OR empno = 7900 OR empno = 7782;

-- 26.查詢出名字中有「張」字符,而且薪水在1000以上(不包括1000)的全部員工信息。
SELECT * FROM emp WHERE ename LIKE '%張%' AND sal > 1000;

-- 27.查詢出名字第三個漢字是「多」的全部員工信息。
SELECT * FROM emp WHERE ename LIKE '__多%';

-- 28.將全部員工按薪水升序排序,薪水相同的按照入職時間降序排序。
SELECT * FROM emp ORDER BY sal, hiredate DESC;

-- 29.將全部員工按照名字首字母升序排序,首字母相同的按照薪水降序排序。 order by convert(name using gbk) asc; 
SELECT ename, SUBSTR(ename, 1, 1), sal FROM emp ORDER BY CONVERT(substring(ename,1,1) USING gbk), sal DESC;

-- 30.查詢出最先工做的那我的的名字、入職時間和薪水。
SELECT * FROM emp WHERE hiredate = (SELECT MIN(hiredate) FROM emp);

-- 31.顯示全部員工的名字、薪水、獎金,若是沒有獎金,暫時顯示100.
SELECT ename, sal, IFNULL(comm, 100) comm FROM emp;

-- 32.顯示出薪水最高人的職位。
SELECT job, sal FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);

-- 33.查出emp表中全部部門的最高薪水和最低薪水,部門編號爲10的部門不顯示。
SELECT deptno, MAX(sal) 最高薪水, MIN(sal) 最低薪水 FROM emp WHERE deptno != 10 GROUP BY deptno;

-- 34.刪除10號部門薪水最高的員工。
DELETE FROM emp WHERE sal = (SELECT emp.sal FROM (SELECT MAX(sal) sal FROM emp WHERE deptno = 10) emp);

-- 35.將薪水最高的員工的薪水降30%。
UPDATE emp SET sal = sal * 0.7 WHERE sal = (SELECT tmp.sal FROM (SELECT MAX(sal) sal FROM emp) tmp);

-- 36.查詢員工姓名,工資和 工資級別(工資>=3000 爲3級,工資>2000 爲2級,工資<=2000 爲1級)
-- 語法:case when ... then ... when ... then ... else ... end
SELECT ename, sal,
    CASE WHEN sal>=3000 THEN '3級'
         WHEN sal>=2000 THEN '2級'
         ELSE '1級'
    END
FROM emp;
相關文章
相關標籤/搜索