[推薦]ORACLE SQL:
經典查詢練手第二篇(不懂裝懂,永世飯桶!)
——通過知識共享樹立個人品牌。
本文與大家共同讨論與分享ORACLE SQL的一些常用經典查詢,歡迎大家補充,同時你認為有那些經典的也可分享出來。在本文中,對每一個問題,你要是認為有什麼更好的解決方法也歡迎你及時提出。交流與分享才能共同進步嘛,感謝!
本篇相對上篇來說比較簡單,如果你對本篇的各測試做得不稱心如意的話,我想你是時候給自己充下電了!
scott.emp員工表結構如下:
SQL> DESC SCOTT.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 所在部門編号
--提示:工資 = 薪金 + 傭金
scott.dept部門表
SQL> DESC SCOTT.DEPT;
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
DEPTNO NUMBER(3) 部門編号
DNAME VARCHAR2(14) Y 部門名稱
LOC VARCHAR2(13) Y 地點
scott.emp表的現有資料如下:
SQL> SELECT * FROM SCOTT.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 4000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
102 EricHu Developer 1455 2011-5-26 1 5500.00 14.00 10
104 huyong PM 1455 2011-5-26 1 5500.00 14.00 10
105 WANGJING Developer 1455 2011-5-26 1 5500.00 14.00 10
17 rows selected
Scott.dept表的現有資料如下:
SQL> SELECT * FROM SCOTT.DEPT;
DEPTNO DNAME LOC
------ -------------- -------------
110 資訊科 海口
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 50abc 50def
60 Developer HaiKou
7 rows selected
用SQL完成以下問題清單:
1. 找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名。
2. 找出EMP表員工名字中含有A 和N的員工姓名。
3. 找出所有有傭金的員工,列出姓名、工資、傭金,顯示結果按工資從小到大,傭金從大到小。
4. 列出部門編号為20的所有職位。
5. 列出不屬于SALES 的部門。
6. 顯示工資不在1000 到1500 之間的員工資訊:名字、工資,按工資從大到小排序。
7. 顯示職位為MANAGER 和SALESMAN,年薪在15000 和20000 之間的員工的資訊:名字、職位、年薪。
8. 說明以下兩條SQL語句的輸出結果:
SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
9. 讓SELECT 語句的輸出結果為
SELECT * FROM SALGRADE;
SELECT * FROM BONUS;
SELECT * FROM EMP;
SELECT * FROM DEPT;
……
列出目前使用者有多少張資料表,結果集中存在多少條記錄。
10. 判斷SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否抱錯,為什麼?
各試題解答如下(歡迎大家指出不同的方法或建議!):
--------1. 找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名。---------
SQL> SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '__A%';
ENAME
----------
ADAMS
BLAKE
CLARK
-------2. 找出EMP表員工名字中含有A 和N的員工姓名。----------
SQL> SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '%A%' AND ENAME LIKE '%N%';
ALLEN
MARTIN
WANGJING
--------或--------
SQL> SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '%A%N%';
/*--------3. 找出所有有傭金的員工,列出姓名、工資、傭金,顯示結果按工資從小到大,
傭金從大到小。----------*/
SQL> SELECT ENAME,SAL + COMM AS WAGE,COMM
2 FROM SCOTT.EMP
3 ORDER BY WAGE,COMM DESC;
ENAME WAGE COMM
---------- ---------- ---------
TURNER 1500 0.00
WARD 1750 500.00
ALLEN 1900 300.00
MARTIN 2650 1400.00
EricHu 5514 14.00
WANGJING 5514 14.00
huyong 5514 14.00
SMITH
JONES
JAMES
MILLER
FORD
ADAMS
BLAKE
CLARK
SCOTT
KING
-------4. 列出部門編号為20的所有職位。----------
SQL> SELECT DISTINCT JOB FROM EMP WHERE DEPTNO = 20;
JOB
---------
ANALYST
CLERK
MANAGER
-------5. 列出不屬于SALES 的部門。----------
SQL> SELECT DISTINCT * FROM SCOTT.DEPT WHERE DNAME <> 'SALES';
6 rows selected
--或者:
SQL> SELECT DISTINCT * FROM SCOTT.DEPT WHERE DNAME != 'SALES';
SQL> SELECT DISTINCT * FROM SCOTT.DEPT WHERE DNAME NOT IN('SALES');
SQL> SELECT DISTINCT * FROM SCOTT.DEPT WHERE DNAME NOT LIKE 'SALES';
---6. 顯示工資不在1000 到1500 之間的員工資訊:名字、工資,按工資從大到小排序。---------
SQL> SELECT ENAME,SAL + COMM AS WAGE FROM SCOTT.EMP
2 WHERE SAL + COMM NOT BETWEEN 1000 AND 1500
3 ORDER BY WAGE DESC;
ENAME WAGE
---------- ----------
EricHu 5514
huyong 5514
WANGJING 5514
MARTIN 2650
ALLEN 1900
WARD 1750
--或者
2 WHERE SAL + COMM < 1000 OR SAL + COMM > 1500
/*----- 7. 顯示職位為MANAGER 和SALESMAN,年薪在15000 和20000 之間的員工的資訊:名字、職位、年薪。----------*/
SQL> SELECT ENAME 姓名,JOB 職位,(SAL + COMM) * 12 AS 年薪
3 WHERE (SAL + COMM) * 12 BETWEEN 15000 AND 20000
4 AND JOB IN('MANAGER','SALESMAN');
姓名 職位 年薪
---------- --------- ----------
TURNER SALESMAN 18000
/*----- 8. 說明以下兩條SQL語句的輸出結果:
SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
----------*/
SQL> SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
EMPNO COMM
----- ---------
7369
7566
7698
7782
7788
7839
7876
7900
7902
7934
10 rows selected
---------------------------------------------------------------
SQL> SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
--說明:IS NULL是判斷某個字段是否為空,為空并不等價于為空字元串或為數字0;
--而 =NULL 是判斷某個值是否等于 NULL,NULL = NULL和NULL <> NULL都為 FALSE。
/*-----9. 讓SELECT 語句的輸出結果為
SELECT * FROM SALGRADE;
SQL> SELECT 'SELECT * FROM '||TABLE_NAME||';' FROM USER_TABLES;
'SELECT*FROM'||TABLE_NAME||';'
---------------------------------------------
--......等等,在此不列出。
---10. 語句SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否抱錯?---------
SQL> SELECT ENAME,SAL FROM EMP WHERE SAL > '1500';
ENAME SAL
---------- ---------
ALLEN 1600.00
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
SCOTT 4000.00
KING 5000.00
FORD 3000.00
EricHu 5500.00
huyong 5500.00
WANGJING 5500.00
SQL> SELECT ENAME,SAL FROM EMP WHERE SAL > 1500;
--說明不會抱錯,這兒存在隐式資料類型的。
本文轉自yonghu86 51CTO部落格,原文連結:http://blog.51cto.com/yonghu/1321344,如需轉載請自行聯系原作者