程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle 經典語法(一)

Oracle 經典語法(一)

編輯:Oracle教程

員工表 emp

Name     Type         Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO    NUMBER(4)                       員工號      
ENAME    VARCHAR2(10) Y                  員工姓名      
JOB      VARCHAR2(9)  Y                  工作      
MGR      NUMBER(4)    Y                  上級編號      
HIREDATE DATE         Y                  雇傭日期      
SAL      NUMBER(7,2)  Y                  薪金      
COMM     NUMBER(7,2)  Y                  傭金      
DEPTNO   NUMBER(2)    Y                  部門編號

提示:工資 = 薪金 + 傭金


部門表 dept
Name   Type         Nullable Default Comments
------ ------------ -------- ------- --------
DEPTNO NUMBER(2)                         部門編號       
DNAME  VARCHAR2(14) Y                    部門名稱    
LOC    VARCHAR2(13) Y                    地點 

 

select * from dept;
select * from emp;

1.列出至少有一個員工的所有部門。

 select dname from dept where deptno in
 (select deptno from emp)
 
 
 
2.列出薪金比“SMITH”多的所有員工。

 

 select * from emp where sal>(select sal from emp where ename='SMITH')
 
 
 
3.列出所有員工的姓名及其直接上級的姓名。

select a.ename ,(select ename from emp b where b.empno= a.mgr )as boss
from emp a

 

4.列出受雇日期早於其直接上級的所有員工。

select ename from emp a  where a.hiredate<
(select hiredate from emp b
where b.empno=a.mgr )

 

5.列出部門名稱和這些部門的員工信息,
同時列出那些沒有員工的部門


select a.dname,b.empno,b.ename,b.job,
b.mgr,b.hiredate,b.sal,b.deptno
from dept a left join emp b on a.deptno=b.deptno

 

6.列出所有“CLERK”(辦事員)的姓名及其部門名稱。


select a.ename ,b.dname from emp a
join dept b on a.deptno=b.deptno
where job='CLERK'

 

7.列出最低薪金大於1500的各種工作

select distinct job from emp
 group by job having min(sal)>1500

 

8.列出在部門“SALES”(銷售部)工作的員工的姓名,
假定不知道銷售部的部門編號。

 

select ename from emp where deptno =
(select deptno from dept
where dname='SALES ')

9.列出薪金高於公司平均薪金的所有員工。
 

select * from emp where sal >(select avg(sal) from  emp)

 

10.列出與“SCOTT”從事相同工作的所有員工。


select * from emp where job=
(select job from emp where ename='SCOTT')

 

11.列出薪金等於部門30中員工的薪金的所有員工的姓名
和薪金。

 

select ename,sal from emp where sal in
( select sal from emp where deptno=30)
and deptno not in 30

 

12.列出薪金高於在部門30工作的所有員工的薪金的
員工姓名
和薪金。
select ename,sal from emp where sal >
( select max(sal) from emp where deptno=30)
and deptno not in 30

 


select ename,sal from emp where sal>
(select max(sal) from emp where deptno=30);


13.列出在每個部門工作的員工數量、平均工資
select deptno , count(*) ,avg(sal)
from emp group by deptno


select (select b.dname from dept b where b.deptno=a.deptno) as dname ,
count(deptno) as deptcount,avg(sal)  from emp a group by deptno


14.列出所有員工的姓名、部門名稱和工資。

 

select ename,dname,sal from emp a
 left join dept b on a.deptno=b.deptno


15.列出所有部門的詳細信息和部門人數。

select a.deptno,a.dname,a.loc,
(select count(deptno) from emp b
where a.deptno=b.deptno group by deptno )
as deptcount from dept a

 

16.列出各種工作的最低工資。


select job,min(sal) from emp group by job

 

17.列出各個部門的MANAGER(經理)的最低薪金。

 

select deptno,min(sal) from emp where
job='MANAGER' group by deptno

 


18.列出所有員工的年工資,按年薪從低到高排序。


select ename,(sal+nvl(comm,0))*12 as salpersal
from emp order by salpersal asc

 

  -- nul 函數    格式為:NVL( string1, replace_with) 功能:如果string1為NULL,則NVL函數返回replace_with的值,否則返回string1的值。

 
 
  查詢第二講
 
 
 

1. 找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名。

 

SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '__A%';
sub

 

2. 找出EMP表員工名字中含有A 和N的員工姓名。

 

SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '%A%' AND ENAME LIKE '%N%';
SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '%A%N%';

 

3. 找出所有有傭金的員工,列出姓名、工資、傭金,
顯示結果按工資從小到大,
傭金從大到小。
select * from emp where comm is null

 

SELECT ENAME,SAL + COMM AS WAGE,COMM  FROM SCOTT.EMP
 ORDER BY WAGE,COMM DESC;


4. 列出部門編號為20的所有職位。

 

 SELECT DISTINCT JOB FROM EMP WHERE DEPTNO = 20;
 
 

5. 列出不屬於SALES 的部門。

 

SELECT DISTINCT * FROM DEPT WHERE DNAME <> 'SALES';
SELECT DISTINCT * FROM DEPT WHERE DNAME not in
( 'SALES');

 


6. 顯示工資不在1000 到1500 之間的員工信息
:名字、工資,按工資從大到小排序。

 

SELECT ENAME,(SAL + COMM) AS WAGE FROM SCOTT.EMP 
WHERE SAL + COMM NOT BETWEEN 1000 AND 1500
 ORDER BY WAGE DESC;


SELECT ENAME,SAL + COMM AS WAGE FROM SCOTT.EMP
 WHERE WAGE < 1000 OR WAGE > 1500
  ORDER BY WAGE DESC;


7. 顯示職位為MANAGER 和SALESMAN,
年薪在15000 和20000 之間的員工的信息:
名字、職位、年薪。


SELECT ENAME 姓名,JOB 職位,(SAL + COMM) * 12 AS 年薪
 FROM EMP 
 WHERE (SAL + COMM) * 12
 BETWEEN 15000 AND 20000 
 AND JOB IN('MANAGER','SALESMAN');
 
 
8. 說明以下兩條SQL語句的輸出結果:


SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;

 

--說明:IS NULL是判斷某個字段是否為空,為空並不等價於為空字符串或為數字0;
--而 =NULL 是判斷某個值是否等於 NULL,NULL = NULL和NULL <> NULL都為 FALSE。

 

9. 讓SELECT 語句的輸出結果為
SELECT * FROM SALGRADE;
SELECT * FROM BONUS;
SELECT * FROM EMP;
SELECT * FROM DEPT;
……
列出當前用戶有多少張數據表,結果集中存在多少條記錄。


 SELECT 'SELECT * FROM '||TABLE_NAME||';'
  FROM USER_TABLES;
 
 

10. 判斷SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'
是否抱錯,為什麼?

 

SELECT ENAME,SAL FROM EMP WHERE SAL > '1500';
SELECT ENAME,SAL FROM EMP WHERE SAL > 1500;
--不會抱錯,這兒存在隱式數據類型的。

查詢第三講

1. 讓SELECT LTRIM(TO_CHAR(sal,'L99,999.99'))
 FROM emp WHERE  ROWNUM < 5
輸出結果的貨幣單位是¥和$。
LTRIM和RTRIM
--LTRIM  刪除左邊出現的字符串
---RTRIM  刪除右邊出現的字符串


SELECT TO_CHAR(sal,'L99,999.99') FROM emp WHERE  ROWNUM < 5;
SELECT TO_CHAR(sal,'$99,999.99') FROM emp WHERE  ROWNUM < 5;

/*--說明:對於'$99,999.99'格式符:
L:表示強制顯示當地貨幣符號
$: 表示顯示美元符號
9: 表示一個數字
0: 表示強制0顯示
.: 表示一個小數點
,: 表示一個千位分隔符
--------------*/

2. 列出前五位每個員工的名字,工資、漲薪後的的工資
(漲幅為8%),
以“元”為單位進行四捨五入。

SELECT ename,sal,ROUND(sal * 1.08,2) FROM emp
 WHERE ROWNUM <=5;


3. 找出誰是最高領導,將名字按大寫形式顯示。


SELECT UPPER(ename) AS NAME   FROM  emp 
WHERE  mgr is null;


4. 找出SMITH 的直接領導名字。


SELECT  ename AS NAME  FROM emp where empno in
(select mgr from emp where ename ='SMITH')


6. 哪些員工的工資高於他直接上司的工資,
列出員工的名字和工資,上司的名字和工資。
select a.ename,a.sal, b.ename,b.sal
 from emp a,emp b where a.mgr=b.empno
and a.sal>b.sal

--SELECT E.ENAME,E.SAL,M.ENAME,M.SAL  FROM EMP E,EMP M
--WHERE  E.EMPNO = M.EMPNO AND E.SAL > M.SAL;


--SELECT E.ENAME,E.SAL FROM EMP E WHERE E.SAL >
--(SELECT M.SAL FROM EMP M   WHERE E.EMPNO = M.EMPNO);


7. 哪些員工和SMITH同部門。

SELECT ENAME  FROM EMP WHERE DEPTNO IN
(SELECT DEPTNO FROM EMP WHERE ENAME='SMITH')

8. 哪些員工跟SMITH做一樣職位。

SELECT ENAME  FROM EMP WHERE JOB=
(SELECT JOB FROM EMP WHERE ENAME='SMITH')

9. 哪些員工跟SMITH不在同一個部門。

SELECT ENAME  FROM EMP WHERE DEPTNO NOT IN
(SELECT DEPTNO FROM EMP WHERE ENAME='SMITH')


10. 哪些員工跟SMITH做不一樣的職位。

SELECT ENAME  FROM EMP WHERE JOB !=
(SELECT JOB FROM EMP WHERE ENAME='SMITH')

11. 顯示有提成的員工的信息:
名字、提成、所在部門名稱、所在地區的名稱。


SELECT E.ENAME, E.COMM,D.DNAME,D.LOC FROM EMP E,DEPT D 
WHERE E.DEPTNO = D.DEPTNO AND
(E.COMM IS NOT NULL AND E.COMM >0) ;

12. 顯示 RESEARCH部門有哪些職位。


SELECT DISTINCT E.JOB FROM EMP E,DEPT D  WHERE
D.DEPTNO = E.DEPTNO AND D.DNAME = ' RESEARCH';

13. 整個公司中,最高工資和最低工資相差多少。

 

 SELECT MAX(SAL) - MIN(SAL) FROM EMP

14. 提成大於0 的人數。

 SELECT COUNT(*) AS 提成大於0的人數
  FROM emp WHERE comm > 0;


15. 顯示整個公司的最高工資、
最低工資、工資總和、
平均工資保留到整數位。

 

SELECT MAX(sal) AS 最高工資, MIN(sal) AS 最低工資,
SUM(sal) AS 工資總和,
ROUND(AVG(sal)) AS 平均工資 FROM emp


16. 整個公司有多少個領導。

SELECT COUNT(DISTINCT(mgr)) 
FROM emp WHERE mgr IS NOT NULL


17. 列出在同一部門入職日期晚但工資高於其他同事的員工:
名字、工資、入職日期。

SELECT DISTINCT E1.ename AS 姓名, E1.sal AS 工資,
E1.hiredate AS 入職日期
 FROM emp E1,emp E2  WHERE
  e1.empno = E2.empno AND E1.hiredate > E2.hiredate
 AND E1.sal > E2.sal ORDER BY 工資 DESC;
 

查詢 第四講

1. 各個部門平均、最大、最小工資、人數,
按照部門號升序排列。


SELECT deptno AS 部門號,AVG(sal) AS 平均工資 ,
MAX(sal) AS 最高工資,MIN(sal)
 AS 最低工資 ,COUNT(*) AS 人數
 FROM emp GROUP BY deptno  
 ORDER BY deptno ASC;

2. 各個部門中工資大於5000的員工人數。

SELECT deptno,COUNT(*) FROM emp WHERE
sal > 5000  GROUP BY deptno;

3. 各個部門平均工資和人數,按照部門名字升序排列。

SELECT DNAME,AVG(SAL),COUNT(*) FROM
(SELECT
(SELECT DEPT.DNAME FROM DEPT WHERE
DEPT.DEPTNO = EMP.DEPTNO)
 DNAME,EMP.SAL FROM  EMP)
 GROUP BY DNAME  ORDER BY DNAME;
 
 select dname,sala,num from
 (select deptno ,avg(sal) as sala,count(*) as num from emp
 group by deptno
 order by deptno
 )a
 join  dept on dept.deptno= a.deptno
 order by dname
 
 
4. 列出每個部門中有同樣工資的員工的統計信息,
列出他們的部門號,工資,人數。

 SELECT EMP1.DEPTNO,EMP1.SAL,COUNT(*)
   FROM   EMP EMP1,EMP EMP2
   WHERE  EMP1.DEPTNO = EMP2.DEPTNO
   AND  EMP1.SAL = EMP2.SAL
   AND EMP1.EMPNO <> EMP2.EMPNO
   GROUP BY EMP1.DEPTNO,EMP1.SAL;

5. 列出同部門中工資高於1000 的員工數量超過2 人的部門,
顯示部門名字、地區名稱。
SELECT
D.DNAME,D.LOC,COUNT(*)
     FROM EMP E,DEPT D
     WHERE E.DEPTNO = D.DEPTNO AND
            E.SAL > 1000
     GROUP BY D.DNAME,D.LOC
     HAVING COUNT(*) > 2;

6. 哪些員工的工資,高於整個公司的平均工資,
列出員工的名字和工資(降序)。
SELECT ENAME,SAL
     FROM EMP
     WHERE SAL> (
           SELECT AVG(SAL)
           FROM EMP
           )
     ORDER BY SAL DESC;

7. 哪些員工的工資,介於10號 和30號部門平均工資之間。
SELECT ENAME,SAL
     FROM EMP
     WHERE SAL
     BETWEEN
         (SELECT AVG(SAL) FROM EMP
         WHERE DEPTNO = 10)
     AND (SELECT AVG(SAL) FROM EMP
         WHERE DEPTNO = 80);

8. 所在部門平均工資高於5000 的員工名字。
 SELECT  ENAME,SAL
     FROM EMP
     WHERE DEPTNO IN
            (SELECT DEPTNO FROM EMP
             GROUP BY DEPTNO
             HAVING AVG(SAL) > 5000);

9. 列出各個部門中工資最高的員工的信息:
名字、部門號、工資。
 SELECT ENAME
             ,SAL ,DEPTNO
      FROM EMP
      WHERE (DEPTNO,SAL ) IN
            (SELECT DEPTNO,MAX(SAL)
             FROM EMP
             GROUP BY DEPTNO);


10. 最高的部門平均工資是多少。
SELECT  MAX(AVGSALARY)
     FROM(SELECT DEPTNO,AVG(SAL) AVGSALARY
       FROM EMP
        GROUP BY DEPTNO);
       

查詢 第五講

1. 哪些部門的人數比20 號部門的人數多。

 

SELECT DEPTNO,COUNT(*) FROM EMP
    GROUP BY DEPTNO
      HAVING COUNT(*) >
            (SELECT COUNT(*) FROM EMP
             WHERE DEPTNO = 20
            );
           
2. SMITH的領導是誰(非關聯子查詢)。

SELECT ENAME
      FROM EMP
     WHERE EMPNO in
            (SELECT MGR FROM EMP
            WHERE ENAME='SMITH'
           );

3.FORD 領導誰(非關聯子查詢)。
SELECT  ENAME
     FROM EMP
      WHERE MGR IN
           (SELECT EMPNO FROM EMP
             WHERE ENAME='FORD'  
                 );                
      5. FORD 領導誰(關聯子查詢)。
SELECT ENAME
      FROM EMP  E1
     WHERE EXISTS (
           SELECT 1 FROM EMP E2
           WHERE ENAME='FORD'
            AND E2.EMPNO = E1.MGR);           

4. SMITH 的領導是誰(關聯子查詢)。
SELECT ENAME
      FROM EMP E1
      WHERE EXISTS (
            SELECT 1 FROM EMP   E2
            WHERE ENAME='SMITH'
            AND E2.MGR = E1.EMPNO);

5. FORD 領導誰(關聯子查詢)。
SELECT ENAME
      FROM EMP  E1
     WHERE EXISTS (
           SELECT 1 FROM EMP E2
           WHERE ENAME='FORD'
            AND E2.EMPNO = E1.MGR);


6. 列出在同一部門共事,入職日期晚但工資高於其他同事的員工:
名字、工資、入職日期
(關聯子查詢)。
 SELECT ename 姓名,
             SAL  AS 工資,HIREDATE AS 入職日期
     FROM EMP E1
     WHERE EXISTS (
            SELECT 1 FROM EMP E2
           WHERE E2.DEPTNO = E1.DEPTNO
           AND   E1.HIREDATE > E2.HIREDATE
            AND   E1.SAL    > E2.SAL
           );


7. 哪些員工跟SMITH不在同一個部門(非關聯子查詢)。
SELECT ENAME
     FROM EMP a
           WHERE
          not EXISTS
           (SELECT 1 FROM EMP b
            WHERE b.ENAME='SMITH'
            and a.deptno=b.deptno
           );
          
           SELECT ENAME
      FROM EMP  E1
     WHERE EXISTS (
           SELECT 1 FROM EMP E2
           WHERE ENAME='FORD'
            AND E2.EMPNO = E1.MGR);


8. 哪些員工跟SMITH不在同一個部門(關聯子查詢)。
SELECT ENAME
      FROM EMP  E1
      WHERE NOT EXISTS (
            SELECT 1 FROM EMP  E2
           WHERE E1.DEPTNO = E2.DEPTNO
            AND E2.ENAME='SMITH'
           );

9.  RESEARCH部門有哪些職位(非關聯子查詢)。
 SELECT DISTINCT JOB  FROM EMP
      WHERE DEPTNO = (
           SELECT DEPTNO FROM DEPT
            WHERE DNAME = ' RESEARCH');  

10.  RESEARCH部門有哪些職位(關聯子查詢)。
SELECT DISTINCT JOB  FROM EMP
     WHERE EXISTS(
           SELECT 1 FROM DEPT
            WHERE EMP.DEPTNO = DEPT.DEPTNO
           AND DEPT.DNAME = ' RESEARCH');
    

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved