主頁 > 資料庫 > mysql練習題emp,dept

mysql練習題emp,dept

2022-02-24 07:54:02 資料庫

DROP DATABASE IF EXISTS `emp`;
CREATE DATABASE `emp`;
USE emp;
 CREATE TABLE `dept`(
    `deptno` INT(2) NOT NULL, 
    `dname` VARCHAR(14),
    `loc` VARCHAR(13),
    CONSTRAINT pk_dept PRIMARY KEY(deptno)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
 SELECT *FROM  dept;
 INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'); 
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS'); 
INSERT INTO dept VALUES (30,'SALES','CHICAGO');  
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
CREATE TABLE `emp` (
    `empno` INT(4) NOT NULL PRIMARY KEY,
    `ename` VARCHAR(10),  
    `job` VARCHAR(9),  
    `mgr` INT(4),  
    `hiredate` DATE,  
    `sal` FLOAT(7,2),  
    `comm` FLOAT(7,2),  
    `deptno` INT(2),
    CONSTRAINT fk_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
SELECT *FROM emp;
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); 
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); 
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); 
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); 
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); 
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); 
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20); 
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-07',5000,NULL,10); 
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); 
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20); 
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); 
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); 
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
SELECT *FROM emp;
CREATE TABLE `salgrade` (  
    `grade` INT, 
    `losal` INT,  
    `hisal` INT
) ENGINE=INNODB DEFAULT CHARSET=utf8; 
INSERT INTO SALGRADE VALUES (1,700,1200); 
INSERT INTO SALGRADE VALUES (2,1201,1400); 
INSERT INTO SALGRADE VALUES (3,1401,2000); 
INSERT INTO SALGRADE VALUES (4,2001,3000); 
INSERT INTO SALGRADE VALUES (5,3001,9999);
SELECT *FROM salgrade;
-- SQL練習訓練一sal工資,comm獎金,mgr 經理編號
-- 1、 選擇部門30中的雇員
SELECT *FROM emp WHERE deptno='30';
-- 2、 檢索emp表中的員工姓名、月收入及部門編號
SELECT ename 姓名,sal 月收入,empno 部門編號 FROM emp;

-- 3、 檢索emp表中員工姓名、及雇傭時間(雇傭時間按照yyyy-mm-dd顯示)
 SELECT ename 姓名,hiredate 雇傭時間 FROM emp;
-- 4、 檢索emp表中的部門編號及工種,并去掉重復行 
SELECT DISTINCT empno 部門編號,job 工種 FROM emp;
-- 5、 檢索emp表中的員工姓名及全年的月收入 
SELECT ename 姓名,sal*12 年收入 FROM emp;
-- 6、 用姓名顯示員工姓名,用年收入顯示全年月收入, 
SELECT ename 姓名,sal*12 年收入 FROM emp;
-- 7、 檢索月收入大于2000的員工姓名及月收入 
SELECT ename 姓名,sal 月收入 FROM emp WHERE sal>2000;
-- 8、 檢索月收入在1000元到2000元的員工姓名、月收入及雇傭時間  
SELECT ename 姓名,sal 月收入 FROM emp WHERE sal<=2000 AND sal>=1000;
-- 9、 檢索以S開頭的員工姓名及月收入
SELECT ename 姓名,sal 月收入 FROM emp WHERE ename LIKE 's%';
-- 10、檢索emp表中月收入是800的或是1250的員工姓名及部門編號
SELECT ename 姓名, empno 部門編號 FROM emp WHERE sal='800'OR sal='1250';
-- 11、顯示在部門20中崗位是CLERK的所有雇員資訊 
SELECT *FROM (SELECT *FROM emp WHERE job='CLERK') s WHERE s.deptno='20';
-- 12、顯示工資高于2500或崗位為MANAGER的所有雇員資訊 
SELECT *FROM emp WHERE sal>2500 OR job='MANAGER';
-- 13、檢索emp表中有獎金的員工姓名、月收入及獎金 
SELECT ename 姓名,sal 月收入,comm 獎金 FROM emp WHERE comm>0;
-- 14、檢索emp表中部門編號是30的員工姓名、月收入及提成,并要求其結果按月收入升序、然后按提成降序顯示 
SELECT s.ename 姓名,s.sal 月收入,s.mgr 提成 FROM(SELECT *FROM emp WHERE deptno='30' ORDER BY sal ASC) s ORDER BY s.mgr DESC;
-- 15、列出所有辦事員的姓名、編號和部門(姓名對不上)
SELECT  a.ename 姓名,a.empno ,b.deptno FROM dept a LEFT JOIN emp b WHERE a.ename=b.dname;
-- 17、找出部門10中所有經理和部門20中的所有辦事員的詳細資料
SELECT *FROM emp WHERE (deptno='10' AND job='MANAGER') OR (deptno ='20' AND job='CLERK');
-- 18、找出部門10中所有經理、部門20中所有辦事員,既不是經理又不是辦事員但其薪金>=2000的所有雇員的詳細資料
SELECT *FROM emp WHERE (deptno='10' AND job='MANAGER') OR (deptno ='20' AND job='CLERK')OR (job NOT IN('MANAGER','CLERK') AND sal>=2000);

-- 19、找出收取獎金的雇員的不同作業
SELECT DISTINCT job 作業 FROM emp WHERE comm>0;
-- 20、找出不收取獎金或收取的獎金低于100的雇員 
SELECT ename 姓名 FROM emp WHERE comm<100 OR comm IS NULL;
-- 21、找出各月倒數第三天受雇的所有雇員
SELECT ename 各月倒數三天受雇人姓名 FROM emp WHERE DAYOFMONTH(LAST_DAY(hiredate))-DAYOFMONTH(hiredate)<=3;
SELECT LAST_DAY(hiredate) FROM emp;
SELECT DAYOFMONTH(LAST_DAY(hiredate)) FROM emp;

SELECT DAYOFMONTH(hiredate) FROM emp;

-- select DAYOFMONTH(now())


-- 22、獲取當前日期所在月的最后一天
SELECT CURDATE();                       -- 獲取當前日期
SELECT DATE_ADD(CURDATE(),INTERVAL -DAY(CURDATE())+1 DAY)   -- 獲取本月第一天
SELECT LAST_DAY(CURDATE());   -- 獲取當月最后一天
SELECT DATE_ADD(CURDATE()-DAY(CURDATE())+1,INTERVAL 1 MONTH ) -- 獲取下個月的第一天
SELECT DATEDIFF(DATE_ADD(CURDATE()-DAY(CURDATE())+1,INTERVAL 1 MONTH ),DATE_ADD(CURDATE(),INTERVAL -DAY(CURDATE())+1 DAY)) FROM DUAL -- 獲取當前月的天數
-- 23、找出早于25年之前受雇的雇員
SELECT *FROM emp WHERE DATE_ADD(NOW(),INTERVAL -25 YEAR)>hiredate;

-- 24、顯示正好為6個字符的雇員姓名
SELECT *FROM emp WHERE ename LIKE '%______'; 
SELECT *FROM emp WHERE LENGTH(ename)='6';
-- 25、顯示不帶有'R'的雇員姓名
SELECT *FROM emp WHERE ename  NOT LIKE '%R%';
-- 26、顯示雇員的詳細資料,按姓名排序
SELECT *FROM emp ORDER BY ename;
-- 27、顯示雇員姓名,根據其服務年限,將最老的雇員排在最前面 
 SELECT ename 姓名,hiredate FROM emp ORDER BY hiredate;
-- 28、顯示所有雇員的姓名、作業和薪金,按作業的降序順序排序,而作業相同時按薪金升序
SELECT t.ename 姓名,t.job 作業,t.sal 薪金 FROM(SELECT * FROM emp ORDER BY job DESC) t ORDER BY t.sal ASC;
-- 29、顯示所有雇員的姓名和加入公司的年份和月份,按雇員受雇日所在月排序,將最早年份的專案排在最前面 
SELECT t.ename 姓名, YEAR(t.hiredate) 年份, MONTH(t.hiredate)月份  FROM(SELECT *FROM emp ORDER BY DAY(hiredate))t ORDER BY YEAR(t.hiredate);
-- 30、顯示在一個月為30天的情況下所有雇員的日薪金
SELECT sal/30 日薪金 FROM emp WHERE  DAY(LAST_DAY(hiredate));
SELECT LAST_DAY(hiredate) FROM emp;
-- 31、找出在(任何年份的)2月受聘的所有雇員
SELECT ename 姓名,MONTH(hiredate) 月份 FROM emp WHERE MONTH(hiredate)=2;
-- 32、對于每個雇員,顯示其加入公司的天數
SELECT ename 姓名,TIMESTAMPDIFF(DAY,hiredate,NOW()) 加入公司天數 FROM emp;
-- 33、顯示姓名欄位的任何位置,包含 "A" 的所有雇員的姓名 
SELECT SUBSTRING(ename,1,1)第一個字母,SUBSTRING(ename,2,1)第二個字母,SUBSTRING(ename,3,1)第三個字母,SUBSTRING(ename,4,1)第四個字母,SUBSTRING(ename,5,1)第六個字母,SUBSTRING(ename,6,1)第五個字母,ename 姓名 FROM emp WHERE ename LIKE '%A%';
-- 34、以年、月和日顯示所有雇員的服務年限 
SELECT ename 姓名, YEAR(hiredate) 年,MONTH(hiredate)月,DAY(hiredate) 日,TIMESTAMPDIFF(YEAR,hiredate,NOW()) 服務年數 FROM emp;
 
-- 35、選擇公司中有獎金 (COMM不為空,且不為0) 的員工姓名,工資和獎金比例,按工資逆排序,獎金比例逆排序.
SELECT t.ename 有獎金員工姓名,t.sal 工資,t.comm 獎金 FROM ( SELECT *FROM emp WHERE comm>0 ORDER BY sal DESC) t ORDER BY t.comm DESC; 
-- 36、選擇公司中沒有管理者的員工姓名及job 
SELECT ename 姓名,job 作業 FROM emp WHERE job NOT IN('MANAGER','PRESIDENT');
-- 37、選擇在1987年雇用的員工的姓名和雇用時間 
SELECT ename 姓名,hiredate 雇用時間 FROM emp WHERE YEAR(hiredate)=1987;
-- 38、選擇在20或10號部門作業的員工姓名和部門號 
SELECT ename 姓名,deptno 部門號 FROM  emp WHERE deptno=10 OR deptno=20;
-- 39、選擇雇用時間在1981-02-01到1981-05-01之間的員工姓名,職位(job)和雇用時間,按從早到晚排序. 
SELECT ename 姓名,job 職位,hiredate 雇傭時間 FROM emp WHERE hiredate>'1981-02-01' AND hiredate<'1981-05-01';
-- 40、選擇工資不在5000到12000的員工的姓名和工資 
SELECT ename 姓名,sal 工資 FROM emp WHERE NOT sal>'5000' AND sal<'12000';
-- 41、查詢員工號為7934的員工的姓名和部門號 
SELECT ename 姓名,deptno 部門號 FROM emp WHERE empno IN('7934');
-- 42、查詢工資大于1200的員工姓名和工資
SELECT ename 姓名,sal 工資 FROM emp WHERE sal>1200;

-- 復雜查詢
-- 1.  列出與“SCOTT”從事相同作業的所有員工及部門名稱,部門人數,
SELECT ename 名字,dname 部門名稱,(SELECT COUNT(*) FROM emp WHERE deptno=20) 人數 FROM emp,dept WHERE emp.`job`IN(SELECT emp.`JOB` FROM emp WHERE emp.`ENAME` = 'SCOTT')AND emp.`deptno`=dept.`deptno`;
SELECT COUNT(*) FROM emp WHERE deptno=20;

-- 2.  列出公司各個工資等級雇員的數量、平均工資,
SELECT salgrade.`GRADE` AS '薪資等級', COUNT(tt.`EMPNO`) AS '員工數' ,AVG(tt.sal)平均工資
FROM salgrade, 
(SELECT emp.`EMPNO`, emp.`SAL`FROM emp) AS tt WHERE tt.`SAL` >= salgrade.`LOSAL` AND tt.`SAL` <= salgrade.`HISAL`
GROUP BY salgrade.`GRADE`;
-- 3.  列出薪金高于在部門30作業的所有員工的薪金的員工姓名和薪金、部門名稱,
   SELECT MAX(sal) FROM emp WHERE deptno=30;
   SELECT *FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30);
   SELECT c.ename 姓名,c.sal 薪金,d.`dname` 部門名稱 FROM dept AS d JOIN (SELECT *FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30)) AS c WHERE d.`deptno`=c.deptno; 
-- 4.  列出在每個部門作業的員工數量、平均工資和平均服務期限,
SELECT AVG(sal),(SELECT COUNT(*)FROM emp GROUP BY deptno) FROM emp ;
SELECT COUNT(*)FROM emp GROUP BY deptno;
SELECT AVG(sal)FROM emp GROUP BY deptno;
SELECT COUNT(*),AVG(sal),AVG(YEAR(NOW())-YEAR(hiredate))FROM emp GROUP BY deptno;
-- 5.  列出所有員工的姓名、部門名稱和工資,
SELECT e.`ename` 姓名,d.`dname` 部門名稱,e.sal 工資 FROM emp e JOIN dept d ON e.`deptno`=d.`deptno`;
-- 6.  列出所有部門的詳細資訊和部門人數,
SELECT d.*,COUNT(*) 部門人數 FROM dept d JOIN emp e ON e.`deptno`=d.`deptno` GROUP BY deptno;
-- 7.  列出各種作業的最低工資及從事此作業的雇員姓名,
SELECT job, MIN(sal) FROM emp  GROUP BY job;
SELECT job, MIN(sal) FROM emp  GROUP BY job;

SELECT ename FROM emp e JOIN (SELECT job, MIN(sal) FROM emp  GROUP BY job) t WHERE e.`job`=t.job AND e.`sal`=MIN(sal); 
-- 8.  列出各個部門的MANAGER(經理)的最低薪金、姓名、部門名稱、部門人數,
SELECT MIN(e.sal),e.`ename` FROM emp e JOIN dept t ON e.`deptno`=t.`deptno` WHERE job IN('MANAGER') GROUP BY t.`deptno`;
SELECT e.`sal`,e.`ename`, d.`dname`,COUNT=(SELECT COUNT(*) FROM emp WHERE job IN('MANAGER')GROUP BY deptno ) FROM emp e JOIN dept d ON e.`deptno`=d.`deptno` WHERE job IN('MANAGER')
-- 9.  列出所有員工的年工資,所在部門名稱,按年薪從低到高排序,
 SELECT ename, sal*12 FROM emp ORDER BY sal*12 ASC;
-- 10. 查出某個員工的上級主管及所在部門名稱,并要求出這些主管中的薪水超過3000
    SELECT mgr FROM emp WHERE ename='SMITH' 
    SELECT e.ename ,d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno WHERE empno=(SELECT mgr FROM emp WHERE ename='SMITH') AND e.sal>3000;
-- 11. 求出部門名稱中,帶‘S’字符的部門員工的工資合計、部門人數,
   SELECT deptno FROM dept WHERE dname LIKE '%S%';-- 查詢部門
   SELECT SUM(sal),COUNT(*)FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname LIKE '%S%') GROUP BY deptno;
-- 12. 給任職日期超過40年或者在87年雇傭的雇員加薪,加薪原則:10部門增長10%,20部門增長20%,30部門增長30%,依次類推,
     SELECT *FROM emp WHERE  YEAR(NOW())-YEAR(hiredate)>40 OR YEAR(hiredate)=1987;
     SELECT YEAR(NOW())-YEAR(hiredate)FROM emp;
     SELECT IF(emp.deptno=10,sal+sal*0.1,IF(emp.`sal`=20,sal+sal*0.2,IF(emp.`deptno`=30,sal+sal*0.3,'無'))) FROM emp WHERE YEAR(NOW())-YEAR(hiredate)>40 OR YEAR(hiredate)=1987; 
-- 13. 列出至少有一個員工的所有部門的資訊:
     SELECT COUNT(*)FROM emp GROUP BY deptno;
     SELECT   deptno FROM emp  ;
     SELECT *FROM emp LEFT JOIN dept ON dept.`deptno`=emp.`deptno` GROUP BY dept.`dname`  HAVING COUNT(emp.`empno`)>=5;
     SELECT dept.`DNAME` AS '部門名', COUNT(emp.`EMPNO`) AS '員工個數'
FROM dept LEFT JOIN emp ON dept.`DEPTNO` = emp.`DEPTNO`
GROUP BY dept.`DNAME` HAVING COUNT(emp.`EMPNO`) >= 5;
-- 14. 列出薪水比“SMITH”多的所有員工資訊

SELECT *FROM emp WHERE emp.`SAL` > (SELECT emp.`SAL`FROM emp WHERE emp.`ENAME` = 'SMITH');


-- 15. 列出所有員工的姓名以及其直接上級的姓名:
SELECT DISTINCT e.ename 員工姓名,d.ename FROM emp e JOIN (SELECT ename FROM emp WHERE empno IN(SELECT mgr FROM emp WHERE ename=ename)) d; 
SELECT mgr FROM emp WHERE ename=ename;
SELECT ename FROM emp WHERE empno IN(SELECT mgr FROM emp WHERE ename=ename);

SELECT emp.`ENAME` AS '員工名稱', tt.lname AS '領導名稱'
FROM emp LEFT JOIN (
    SELECT emp.`EMPNO`, emp.`ENAME` AS 'lname'
    FROM emp 
    WHERE empno IN (SELECT mgr FROM emp)) AS tt ON emp.`MGR` = tt.empno;


-- 16. 列出受雇日期早于其直接上級的所有員工的編號、姓名,部門名稱
SELECT t2.eno AS '編號', t2.ename AS '姓名', dept.`DNAME` AS '部門名稱', t2.ehiredate AS '員工受雇日期', t2.lhiredate AS '領導受雇日期'
FROM dept
INNER JOIN 
(
    SELECT emp.`EMPNO` AS 'eno', emp.`ENAME`, emp.`HIREDATE` AS 'ehiredate', t1.lhiredate, emp.`DEPTNO`
    FROM 
    emp LEFT JOIN 
    (
        SELECT emp.`EMPNO` AS 'lno', emp.`HIREDATE` AS 'lhiredate'
        FROM emp 
        WHERE empno IN 
        (
            SELECT mgr FROM emp
        ) -- 找出所有是領導的員工no
 
    ) AS t1
    ON emp.`MGR` = t1.lno
) AS t2
ON t2.deptno = dept.`DEPTNO`
WHERE t2.ehiredate <  t2.lhiredate OR t2.lhiredate IS NULL;
-- 17. 列出部門名稱和這些部門的員工資訊,同時列出那些沒有員工的部門
SELECT dept.`DNAME` AS '部門名稱', emp.`ENAME` AS '員工名稱', emp.`JOB` AS '職位', emp.`HIREDATE` AS '入職時間', emp.`SAL` AS '薪水'
FROM dept LEFT JOIN emp ON dept.`DEPTNO` = emp.`DEPTNO`;
 
 

-- 18. 列出所有"CLERK(職員)"的姓名以及部門名稱,部門的人數
SELECT emp.`ENAME` AS '姓名', dept.`DNAME` AS '部門名稱', tt.emp_count AS '部門人數'
FROM emp LEFT JOIN dept ON emp.`DEPTNO` = dept.`DEPTNO`
INNER JOIN 
(
    SELECT dept.`DEPTNO`, COUNT(emp.`EMPNO`) AS 'emp_count'
    FROM dept LEFT JOIN emp ON dept.`DEPTNO` = emp.`DEPTNO`
    GROUP BY dept.`DEPTNO` 
 
) AS tt
ON emp.`DEPTNO` = tt.deptno
 
WHERE emp.`JOB` = 'CLERK';
-- 19. 列出最低薪金大于1500的各種作業以及從事此作業的全部雇員人數
SELECT emp.`JOB` AS '作業名稱', COUNT(emp.`EMPNO`) AS '雇員人數'
FROM emp 
WHERE emp.`JOB` IN (
    SELECT emp.`JOB`
    FROM emp
    GROUP BY emp.`JOB` HAVING MIN(emp.`SAL`) >1500
)
GROUP BY emp.`JOB`;
-- 20. 列出在部門"SALES"作業的員工的姓名,假定不知道銷售部的部門編號
SELECT emp.`ENAME` AS '銷售部人員'
FROM emp
WHERE emp.`DEPTNO` = (
    SELECT dept.`DEPTNO`
    FROM dept
    WHERE dept.`DNAME` = 'sales'
);
-- 21. 列出薪金高于公司平均薪金的所有員工,所在部門,上級領導,公司的工資等級
SELECT t1.ename AS '員工名稱', dept.`DNAME` AS '部門名稱', t2.ename AS '上級名稱', t1.grade AS '工資等級', t1.sal AS '工資'
 
FROM 
(
    SELECT emp.`EMPNO`, emp.`DEPTNO`, emp.`ENAME`, emp.`SAL`, emp.`MGR`,salgrade.`GRADE`
    FROM emp, salgrade
    WHERE emp.`SAL` > (
        SELECT AVG(sal) AS 'avg_sal'
        FROM emp
    ) AND emp.`SAL` >= salgrade.`LOSAL` AND emp.`SAL` <= salgrade.`HISAL`
) AS t1
LEFT JOIN 
(
    SELECT emp.`EMPNO` AS 'mgr', emp.`ENAME` -- 注意這里是查出所有領導的empno,作為mgr編號
    FROM emp 
    WHERE emp.`EMPNO` IN 
    (
        SELECT DISTINCT(emp.`MGR`) -- 必須要distinct 不然查出來的mgr有重復,后面上層再查重復值接近笛卡爾積
        FROM emp
        WHERE mgr IS NOT NULL
    )
) AS t2
ON t1.mgr = t2.mgr
LEFT JOIN dept ON t1.deptno = dept.`DEPTNO`;
-- 22. 列出至少有一個員工的所有部門編號、名稱,并統計出這些部門的平均工資、最低工資、最高工資,

-- 23. 列出薪金比“SMITH”或“ALLEN”多的所有員工的編號、姓名、部門名稱、其領導姓名,
 
-- 24. 列出所有員工的編號、姓名及其直接上級的編號、姓名,顯示的結果按領導年工資的降序排列,
SELECT emp.`EMPNO` AS '員工編號', emp.`ENAME` AS '員工名稱', (emp.`SAL`*12) AS '年薪' 
FROM emp
ORDER BY 年薪 ASC; 
-- 25. 列出受雇日期早于其直接上級的所有員工的編號、姓名、部門名稱、部門位置、部門人數, 
-- 26. 列出部門名稱和這些部門的員工資訊(數量、平均工資),同時列出那些沒有員工的部門,
SELECT dept.`DNAME` AS '部門名稱', COUNT(emp.`EMPNO`) AS '員工數量', ROUND(AVG(emp.`SAL`), 2) AS '平均工資', t2.avg_year AS '平均服務年限'
FROM dept LEFT JOIN emp ON dept.`DEPTNO` = emp.`DEPTNO`
LEFT JOIN 
(
    SELECT t1.deptno, ROUND(AVG(t1.year), 0) AS 'avg_year' -- 四舍五入,保留0位小數
    FROM 
    (
        SELECT emp.`DEPTNO`, ROUND((TO_DAYS(NOW())-TO_DAYS(emp.`HIREDATE`))/366, 0) AS 'year'
        FROM emp
    ) AS t1
    GROUP BY t1.deptno
) AS t2 
ON dept.`DEPTNO` = t2.deptno
GROUP BY dept.`DEPTNO`; 
-- 27. 列出所有“CLERK”(辦事員)的姓名及其部門名稱,部門的人數,工資等級,
SELECT emp.`ENAME` AS '姓名', dept.`DNAME` AS '部門名稱', tt.emp_count AS '部門人數'
FROM emp LEFT JOIN dept ON emp.`DEPTNO` = dept.`DEPTNO`
INNER JOIN 
(
    SELECT dept.`DEPTNO`, COUNT(emp.`EMPNO`) AS 'emp_count'
    FROM dept LEFT JOIN emp ON dept.`DEPTNO` = emp.`DEPTNO`
    GROUP BY dept.`DEPTNO` 
 
) AS tt
ON emp.`DEPTNO` = tt.deptno
 
WHERE emp.`JOB` = 'CLERK';
-- 28. 列出最低薪金大于1500的各種作業及此從事此作業的全部雇員人數及所在部門名稱、位置、平均工資, 
SELECT emp.`JOB` AS '作業名稱', COUNT(emp.`EMPNO`) AS '雇員人數'
FROM emp 
WHERE emp.`JOB` IN (
    SELECT emp.`JOB`
    FROM emp
    GROUP BY emp.`JOB` HAVING MIN(emp.`SAL`) >1500
)
GROUP BY emp.`JOB`;
29. 列出在部門“SALES”(銷售部)作業的員工的姓名、基本工資、雇傭日期、部門名稱,假定不知道銷售部的部門編號, 
30. 列出薪金高于公司平均薪金的所有員工,所在部門,上級領導,公司的工資等級,     
-- 31. 列出與“SCOTT”從事相同作業的所有員工及部門名稱,部門人數,
SELECT emp.`EMPNO` AS '員工編號', emp.`ENAME` AS '員工名稱', dept.`DNAME` AS '部門名稱'-- , emp.`DEPTNO`
FROM emp, dept
WHERE emp.`JOB` = (
    SELECT emp.`JOB` -- 查詢出SCOTT從事的職業
    FROM emp
    WHERE emp.`ENAME` = 'SCOTT'
) AND emp.`ENAME` <> 'SCOTT'
AND emp.`DEPTNO` = dept.`DEPTNO`;
-- 32. 查詢dept表的結構
33. 檢索emp表,用is a 這個字串來連接員工姓名和工種兩個欄位
34. 檢索emp表中有提成的員工姓名、月收入及提成,

SELECT *FROM emp WHERE deptno='20'
SELECT *FROM emp;
SELECT *FROM dept;
SELECT *FROM salgrade;

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/431452.html

標籤:其它

上一篇:Oracle的常用命令和表空間

下一篇:MySQL 學習筆記 - 日志

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more