Oracle資料庫 基礎SQL語句練習
一、說明
第一次使用Oracle,想做一些練習,熟悉一些oracle。
表:使用的是scott使用者,預設的表
具體表講解,可以參考該文件:https://www.cnblogs.com/xjcheng1/p/7220159.html
二、基礎練習
第一、查詢工資在0-1000,1000-2000,2000-3000,3000以上各個工資範圍的員工數。
SELECT SUM(CASE WHEN sal>0 AND sal<1000 THEN 1 ELSE 0 END) AS "0<sal<1000", SUM(CASE WHEN sal>1000 AND sal<2000 THEN 1 ELSE 0 END) AS "1000<sal<2000", SUM(CASE WHEN sal>2000 AND sal<3000 THEN 1 ELSE 0 END) AS "2000<sal<3000", SUM(CASE WHEN sal>3000 THEN 1 ELSE 0 END) AS "sal>3000" FROM emp
第二、要求查詢出: 部門名稱,部門的員工數,部門的平均工資,部門的最低收入僱員的姓名。
SELECT d.dname as "部門名稱", s.count as "部門的員工數", s.avgsal as "部門的平均工資", e.ename as "最低收入僱員的姓名" FROM emp e , dept d, ( SELECT deptno,COUNT(1) count,AVG(sal) avgsal,MIN(sal) minsal FROM emp GROUP BY deptno ) s WHERE e.deptno = d.deptno AND e.deptno = s.deptno AND s.minsal = e.sal
第三、查詢各個職位員工工資大於平均工資(平均工資包括所有員工)的人數和員工職。
SELECT COUNT(1), job FROM emp WHERE sal > (SELECT AVG(SAL) FROM emp) GROUP BY job
第四、列出所有員工的姓名及其直接上級的姓名。
SELECT
e1.ename,
e2.ename AS manage
FROM
emp e1 LEFT JOIN emp e2
ON
e1.mgr = e2.empno
第五、返回比本部門平均工資高的員工的empno,ename,deptno,sal,以及平均工資。
SELECT t1.empno, t1.ename, t1.deptno, t1.sal, t2.avgsal FROM emp t1 , (SELECT deptno,AVG(sal) avgsal FROM emp t2 GROUP BY t2.deptno) t2 WHERE t1.deptno = t2.deptno AND t1.sal > t2.avgsal
第六、查詢與7369或者7499號具有相同job和deptno的其他員工的empno,ename,job和empno。
SELECT empno, ename, job, deptno FROM emp WHERE (job,deptno) IN ( SELECT job, deptno FROM emp WHERE empno IN (7369,7499) )
第七、查詢員工工資2到5名的員工資訊。
SELECT * FROM ( SELECT rownum r,empno,ename,sal FROM ( SELECT empno,ename,sal FROM emp ORDER BY sal DESC ) ) t WHERE t.r>=2 and t.r<=5
第八、列出薪金比smith多的所有員工資訊。
SELECT * FROM emp WHERE sal > ( SELECT sal FROM emp WHERE ename = 'SMITH' )
第九、把hiredate列看做是員工的生日,求本月過生日的員工。
SELECT * FROM emp WHERE EXTRACT(MONTH FROM hiredate) = EXTRACT(MONTH FROM sysdate);
第十、查詢出1981各個月入職的員工數。
SELECT COUNT(*), to_char(hiredate,'yyyy-MM') FROM emp WHERE to_char(hiredate,'yyyy') = '1981' GROUP BY to_char(hiredate,'yyyy-MM') ORDER BY to_char(hiredate,'yyyy-MM')
第十一、查詢和scott相同部門的員工姓名ename和僱用日期hiredate。
SELECT ename, hiredate FROM emp WHERE deptno = ( SELECT deptno FROM emp WHERE ename = 'SCOTT' )
第十二、查詢在部門的loc為NEW YORK的部門工作的員工的員工姓名ename,部門名稱dname和崗位名稱job。
SELECT e.ename, d.dname, e.job From emp e , dept d WHERE e.deptno = d.deptno AND dname = ( SELECT dname FROM dept WHERE loc = 'NEW YORK' )
第十三、查詢上司是king的員工姓名(ename)和工資(sal)。
SELECT ename, sal FROM emp WHERE mgr = ( SELECT empno FROM emp WHERE ename = 'KING' )
第十四、查詢與姓名中包含字母U的員工在相同部門的員工資訊。
SELECT * FROM emp WHERE deptno IN ( SELECT deptno FROM emp WHERE ename LIKE '%U%' )
第十五、查詢所有僱員姓名和部門名稱(使用left join,inner join, right join)。
SELECT
e.ename,
d.dname
FROM
emp e
INNER JOIN
dept d
ON
e.deptno = d.deptno
注意:這裡的INNER JOIN 可以直接替換成 LEFT JOIN 和 RIGHT JOIN
第十六、顯示每個員工的員工姓名、部門名稱、職務、工資、和工資等級資訊(使用left join,inner join, right join)。
SELECT e.ename, d.dname, e.job, e.sal, s.grade FROM emp e INNER JOIN dept d ON e.deptno = d.deptno INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
注意:這裡的INNER JOIN 可以直接替換成 LEFT JOIN 和 RIGHT JOIN
第十七、取得每個部門最高薪水的人員名稱。
SELECT e.ename, r.maxsal, r.deptno FROM emp e , ( SELECT MAX(sal) maxsal, deptno FROM emp GROUP BY deptno ) r WHERE e.deptno = r.deptno AND e.sal = r.maxsal ORDER BY deptno
第十八、列出受僱日期早於其直接上級的所有員工的編號,姓名,部門名稱。
SELECT * FROM ( SELECT e1.empno, e1.deptno, e1.ename, e2.ename AS manage, e2.hiredate managedate, e1.hiredate staffdate FROM emp e1 LEFT JOIN emp e2 ON e1.mgr = e2.empno ) z WHERE z.staffdate < z.managedate ORDER BY z.empno
第十九、列出所有"CLERK"(辦事員)的姓名及其部門名稱,部門的人數。
SELECT s.ename, s.dname, k.deptno, k.count FROM ( SELECT e.ename, d.dname, e.deptno deptno FROM emp e , dept d WHERE e.deptno = d.deptno AND job = 'CLERK' ) s, ( SELECT COUNT(*) count, deptno FROM emp GROUP BY deptno ) k WHERE s.deptno = k.deptno
第二十、找出早於12年前受僱的員工. 並且按受僱年份倒序排序。
SELECT e.*, TO_CHAR(hiredate,'yyyy') 受僱年份, ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)/12,2) 受僱年限 FROM emp e WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>12 ORDER BY 受僱年份 DESC
第二十一、列出從事同一種工作但屬於不同部門的員工的一種組合。
SELECT DISTINCT e.empno, e.ename, e.job, e.deptno FROM emp e,emp k WHERE e.deptno != k.deptno AND e.job = k.job ORDER BY job,deptno
三、重點說明
1.oracle資料庫,sql語句不能使用limit關鍵字。
2.rownum非常的特殊,使用的時候需要特別注意。詳細可參考文件:https://www.cnblogs.com/szlbm/p/5806070.html
3.所有包含中文的字型,需要加單引號。比如:job = 'CLERK' ,ename = 'KING'
4.函式的使用。
to_char() 函式功能,就是將數值型或者日期型轉化為字元型。具體參考文件:https://www.cnblogs.com/aipan/p/7941917.html
extract()函式----用於擷取年、月、日、時、分、秒。具體參考文件:https://www.cnblogs.com/xqzt/p/4477239.html