`db`SELECT sal FROM emp ORDER BY sal;--選出薪水進行升序排列sql
SELECT DISTINCT sal FROM emp ORDER BY sal;
--去重關鍵字diatinct 將sal挑出而且按照默認升序排序
SELECT DISTINCT job,deptno,sal FROM emp;
--挑選不一樣工做,代號函數
--統計工做崗位的數量
SELECT COUNT(DISTINCT job)FROM emp;.net
SELECT ename,deptno FROM emp;
SELECT * FROM dept;
--兩張錶鏈接沒有任何條件限
SELECT ename,dname FROM emp, dept;blog
--選擇deptno同樣的進行表格的拼接操做
SELECT ename,dname FROM emp,dept
WHERE emp.`DEPTNO` = dept.`DEPTNO`;
--起別名的方法
SELECT
e.ename,d.dname
FROM
emp e, dept d
WHERE
e.deptno = d.deptno;
--SQL99起別名的方法
SELECT E.ENAME ,D.DNAME
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
--INNER 能夠省略可是加了可讀性更好
SELECT E.ENAME ,D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;--條件是等量關係因此被稱爲等值鏈接
--找出每一個員工的薪資等級,要求顯示員工名、薪資、薪資等級?
SELECT e.ename ,e.sal ,s.GRADE
FROM salgrade s,emp e
WHERE e.sal BETWEEN s.losal AND s.hisal;--本身寫的垃圾代碼
SELECT e.ename ,e.sal ,s.GRADE
FROM emp e
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal;排序
SELECT e.ename , d.dname
FROM emp e
JOIN dept d
ON e.`DEPTNO` = d.`DEPTNO`;--sql 99語法規則date
--案例:查詢員
--工的上級領導,要求顯示員工名和對應的領導名?
SELECT e.ename , e.leader
FROM emp e
ON e.empno = e.mgr ;
SELECT empno,ename,mgr FROM emp;--bu成功示範select
--查詢案例的進行,須要將一張表當作是兩張表進行
e表的工號等於上級編號時,使用另外一張表(其實也是emp)員工的領導編號
SELECT e.empno ,e.ename AS '員工' ,m.empno,m.ename AS '領導'
FROM
emp e
JOIN
emp m
ON e.mgr = m.empno;語法
-內鏈接
SELECT
e.ename,d.dname
FROM
emp e
JOIN
dept d
ON
e.deptno = d.deptno;bug
外鏈接(右外鏈接):
SELECT
e.ename,d.dname
FROM
emp e
RIGHT JOIN
dept d
ON
e.deptno = d.deptno;
--拼接三個表格的數據,而且設定了條件分開
SELECT
e.ename,d.deptno,s.grade
FROM EMP e
JOIN dept d
ON e.deptno = d.deptno
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal;方法
一、 、 取得每一個部門最高薪水的人員名稱
SELECT
ename,sal,deptno
FROM
emp t
WHERE
sal=(SELECT MAX(sal) FROM emp)
GROUP BY
t.deptno;
--第二題
SELECT sal,ename,AVG(sal)
FROM emp
GROUP BY sal
HAVING sal>(SELECT AVG(sal)FROM emp);
三、 、 取得部門中(全部人的)平均的薪水等級,以下:從emp中獲取平均值和部門編號,經過部門編號進行分組
SELECT
AVG(sal),deptno
FROM
emp
GROUP BY
deptno;
例子:
SELECT job, SUM(sal) FROM emp GROUP BY job;--獲取每一個崗位的平均工資
四、 不許用組函數(Max ),取得最高薪水(給出兩種解決方案)
-- 方法一採用了自鏈接的方法,先定義出除了最大值的那些數字,再將整個集合中不屬於這些數的那個數字拿出來就是MAX值
SELECT
sal
FROM
emp
WHERE
sal NOT IN(SELECT DISTINCT a.sal FROM emp a JOIN emp b ON a.sal<b.sal);
-- 方法2 將sal按照順序排序取最大值便可,加入限制條件1 獲得降序排列的第一個就是最大值
SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 1;
例子:select DISTINCT a.sal FROM emp a JOIN emp b ON a.sal<b.sal;--挑選惟一的薪水從表A加入到表B條件是A的薪水小於B的薪水
五、 、 取得平均薪水最高的部門的部門編號(至少給出兩種解決方案)
-- 方法一
SELECT deptno,AVG(sal)-- 是否會有疑?deptno只是恰好在這個位置
FROM
emp
GROUP BY
deptno
ORDER BY AVG(sal)DESC
LIMIT 1;
-- 方法二
SELECT MAX(t.avgsal),deptno
FROM
(SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t;
-- 將團隊的平均值看做一個新的列表,從這個列表中取得最大值就是平均值裏面的最大值-- 是否會有疑?deptno只是恰好在這個位置
6 、 取得平均薪水最高的部門的部門名稱
SELECT MAX(t.avgsal),t.deptno , d.dname
FROM
(SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t -- 精髓之處仍然是吧部門的平均數當作是一個表格,
JOIN dept d
ON d.deptno=t.deptno; -- 仍是以爲有bug在仍然須要改進,找到緣由,只有deptno相等條件不足,須要再加上一個限定條件以下:
SELECT d.dname , MIN(t.avgsal)
FROM dept d, (SELECT AVG(e.sal) avgsal,e.deptno FROM emp e GROUP BY e.deptno)t
WHERE d.deptno = t.deptno AND t.avgsal = (SELECT AVG(sal)
FROM
emp
GROUP BY
deptno
ORDER BY AVG(sal) DESC
LIMIT 1);
---------------------------------------------------------------------------------------
SELECT d.dname, t.avgsal
FROM dept d
JOIN
( SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t
ON
d.deptno=t.deptno AND t.avgsal=(SELECT AVG(sal) avgsal FROM emp GROUP BY deptno ORDER BY avgsal DESC LIMIT 1);
————————————————
版權聲明:本文爲CSDN博主「茶花女--」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/qq_42764468/article/details/97813060
七、 求平均薪水的等級最低的部門的部門名稱
SELECT MIN(t.avgsal),t.deptno , d.dname
FROM
(SELECT e.deptno,d.dname,AVG(e.sal) avgsal FROM emp e ON dept d GROUP BY deptno HAVING d.deptno = e.deptno) t -- 精髓之處仍然是吧部門的平均數當作是一個表格,
JOIN dept d
ON d.deptno=t.deptno;//本身寫的垃圾代碼
SELECT d.dname, t.avgsal
FROM dept d
JOIN
( SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t
ON
d.deptno=t.deptno AND t.avgsal=(SELECT AVG(sal) avgsal FROM emp GROUP BY deptno ORDER BY avgsal LIMIT 1);
-- 這是創建在別人的代碼成果之上,之後還須要多去練習
-- 八、 、 取得比普通員工( 員工代碼沒有在 mgr 字段上出現的) 的最高薪水還要高的領導
-- 我的分析首先是採用自鏈接把員工以及其領導列舉出來。再採用限制條件-- 採用b表用來做爲領導的姓名排
-- 把這個表當作是表T,給表格T採起限制條件進行取值(參考價值的案例)
SELECT DISTINCT a.empno,a.ename,a.sal,a.job FROM emp a JOIN emp b WHERE a.empno=b.mgr;-- 這是全部的領導,藉助not in獲得全部的員工
SELECT empno ,job ,sal FROM emp WHERE ename NOT IN(SELECT DISTINCT a.ename FROM emp a JOIN emp b WHERE a.empno=b.mgr);
SELECT
a.empno ,a.ename worker,a.job,b.ename leader,b.ename leaderjob,a.mgr
FROM emp a
JOIN emp b
ON a.mgr = b.empno;
-- 取出員工最高薪水w 和領導薪水L比較
SELECT e.sal,e.`ENAME`,e.`DEPTNO`
FROM emp e
WHERE e.sal > (SELECT MAX(sal) FROM emp WHERE ename NOT IN(SELECT DISTINCT a.ename FROM emp a JOIN emp b WHERE a.empno=b.mgr));
-- 九、取得薪水最高的前五名員工
SELECT saL ,ename ,job
FROM
emp
ORDER BY
sal DESC
LIMIT 5;
-- 十、 、 、 取得薪水最高的第六到第十名員工
SELECT saL ,ename ,job
FROM
emp
ORDER BY
sal DESC
LIMIT 5,5;
-- 十一、 的 取得最後入職的 5 位員工
SELECT hiredate ,sal ,job
FROM
emp
ORDER BY
HIREDATE DESC
LIMIT 5;
-- 十二、 、 取得每一個薪水等級有多少員工
SELECT
COUNT(e.sal),e.`DEPTNO`
FROM
emp e
GROUP BY
e.deptno; -- 錯解 這麼作只是把每一個部門的人數統計出來 正解以下
SELECT COUNT(s.`GRADE`) AS '等級數量',s.`GRADE`
FROM emp e,salgrade s
WHERE
sal BETWEEN s.`LOSAL` AND s.`HISAL`
GROUP BY s.grade;
-- 1四、 、 列出全部員工及 領導 的姓名 (採用自鏈接方式)
SELECT a.ename ,b.ename
FROM
emp a
JOIN
emp b
ON
a.`mgr` = b.`EMPNO`;
-- 1五、 、 列出 受僱日期早於其直接上級的全部員工的編號, 姓名,部門
SELECT a.empno ,a.ename ,b.ename,a.deptno
FROM
emp a
JOIN
emp b
ON
a.`MGR`=b.`EMPNO` AND a.`HIREDATE`< b.`HIREDATE`;
-- 1六、 、 列出部門名稱和這些部門的員工信息,同時列出沒有員工的部門
-- (左右鏈接- 以一邊的表格爲準,就是說這邊的表格不管什麼狀況,都須要顯示在表格當中另外一邊的話只有條件符合纔會顯示在結果中)
SELECT d.dname ,e.*
FROM
dept d
LEFT JOIN
emp e
ON
e.`DEPTNO` = d.`DEPTNO` ;
SELECT d.dname,e.empno,e.ename,e.job,e.hiredate,e.sal FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
-- 1七、 、有 列出至少有 5 個員工的全部部門
SELECT COUNT(DEPTNO ),DEPTNO
FROM
EMP
GROUP BY
DEPTNO
HAVING
COUNT(DEPTNO)>=5;
-- 1八、 、 列出薪金比"SMITH"的員工信息
SELECT *
FROM
EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'SMITH');
-- 1九、 、 列出全部"CLERK"( 辦事員) 的姓名及其部門名稱,
SELECT E.ENAME ,D.DNAME
FROM
EMP E
JOIN
DEPT D
ON
E.`JOB` = 'CLERK' AND D.`DEPTNO` = E.`DEPTNO`;
-- 20、 、於 列出最低薪金大於 1500 的各類工做及從事此工做的所有僱員人數.
SELECT MIN(sal),COUNT(sal)
FROM
emp
GROUP BY
job
HAVING
MIN(sal)>1500;
-- 2一、 、 列出在部門"SALES"< 銷售部> 工做的員工的姓名,
SELECT d.`DNAME`,e.ename
FROM
emp e
JOIN
dept d
ON
d.`DEPTNO` = e.`DEPTNO` AND d.`DNAME` = 'sales';
-- 2二、 、 列出薪 金高於公司平均薪金的全部員工, 所在部門, 上級領導, 僱員的工資等級
-- 對於多個表的加入還不夠熟練
SELECT
e.ename '員工', d.dname '部門',a.ename '領導',s.`GRADE` '薪資等級'
FROM
emp e
JOIN
dept d
ON
d.`DEPTNO` = e.`DEPTNO` -- 一一對應部門編號得出員工所在部門的名稱
LEFT JOIN
emp a
ON
e.`MGR` = a.`empno` -- 採用左鏈接 使得首席執行官可以留下來
JOIN
salgrade s
ON
e.sal BETWEEN s.`LOSAL` AND s.`HISAL` -- 得出薪資等級
WHERE
e.sal > (SELECT AVG(sal) FROM emp); -- 將薪資大於平均水平的篩選出來
SELECT
e.ename , d.dname ,a.ename ,s.`GRADE`
FROM
emp e,dept d ,emp a,salgrade s
WHERE
e.sal > (SELECT AVG(sal) FROM emp)
AND e.`MGR` = a.`empno`
AND e.`DEPTNO` = d.`DEPTNO`
AND e.sal BETWEEN s.`LOSAL` AND s.`HISAL`; -- 本身作得結果仍是不對,缺乏一個條件致使多了一個
SELECT e1.empno, e1.ename, d.dname, e1.sal, sg.grade
FROM emp e1, emp e2, dept d, salgrade sg
WHERE e1.sal > (SELECT AVG(sal) FROM emp)
AND e1.mgr = e2.empno
AND e1.deptno = d.deptno
AND e1.sal BETWEEN losal AND hisal; -- 錯誤案例缺乏首席執行官
-- 2三、 、 列出與"SCOTT" 從事相同工做的全部員工及部門名稱.
SELECT e.ename ,d.dname
FROM emp e
JOIN dept d
ON e.job = (SELECT job FROM emp WHERE ename = 'scott')
AND e.`DEPTNO` = d.`DEPTNO`;
-- 2四、列出薪金等於部門 30 中員工的薪金的其餘員工的姓名和薪金.--我打斷先把30部門的人員球出來
SELECT a.ename ,a.sal
FROM emp a
WHERE a.deptno = 30 ;-- 表示30部門中全部人員 正解以下
SELECT a.ename ,a.sal
FROM emp a
RIGHT JOIN (SELECT a.sal
FROM emp a
WHERE a.deptno = 30) b
ON a.sal = b.sal ;
-- 25 、門 列出薪金高於在部門 30 工做的全部員工的薪金的員工姓名和薪金. 部門名
SELECT a.ename ,a.sal ,d.`DNAME`
FROM emp a
JOIN dept d
ON
d.`DEPTNO` = a.`DEPTNO`
AND a.`SAL`>(SELECT MAX(a.sal)
FROM emp a
WHERE a.deptno = 30);
-- 2六、 列出在每一個部門工做的員工數量, 平均工資和平均服務期限.
SELECT COUNT(ename) ,
AVG(sal) ,
AVG(YEAR(SYSDATE())-YEAR(hiredate))
FROM emp
GROUP BY emp.deptno; -- (網上獲取的答案)
-- 2六、 列出在每一個部門工做的員工數量, 平均工資和平均服務期限.
SELECT COUNT(ename),AVG(sal),AVG(YEAR (SYSDATE()) - YEAR(hiredate)) FROM emp GROUP BY emp.`DEPTNO`;
-- 2七、 、 列出全部員工的姓名、部門名稱和工資。 SELECT e.ename , d.dname,sal FROM emp e JOIN dept d; -- 2八、 列出全部部門的詳細信息和人數 SELECT e.* , d.dname,sal FROM emp e JOIN dept d ON d.`DEPTNO` = e.`DEPTNO` ORDER BY deptno; -- 2九、 、 列出各類工做的最低工資及從事此工做的僱員 SELECT ename ,MIN(sal) FROM emp GROUP BY job; -- 30、的 列出各個部門的 MANAGER( 領導) 的最低薪金的是 SELECT ename ,job ,MIN(sal),deptno FROM emp WHERE job = 'manager'; -- 3一、 、 列出全部員工的 年工資,按 按 年薪從低到高排序 SELECT ename ,sal*12 FROM emp ; -- 33,求出部門名稱中, 帶'S' 字符的部門員工的工資合計、部門人數. SELECT d.dname,SUM(e.sal),COUNT(e.empno)FROM emp e,dept dWHERE e.deptno=d.deptno AND d.dname LIKE '%S%'GROUP BY d.dname; -- 3四、 、過 給任職日期超過 30 年的員工加薪 10%. -- 先對錶格備份一下CREATE TABLE emp_bak AS SELECT * FROM emp; UPDATE emp_bak SET sal = sal *1.1 WHERE (TO_DAYS(NOW())-TO_DAYS(hiredate))/365>30;