1. 程式人生 > >Oracle資料庫 基礎SQL語句練習

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