Oracle SQL:經典查詢練手第二篇

承接上一篇,表結構以下,用戶scottspa

 1 desc emp  2 名稱 空值 類型  3 -------- -------- ------------ 
 4 EMPNO NOT NULL NUMBER(4)  5 ENAME          VARCHAR2(10)  6 JOB           VARCHAR2(9)  7 MGR          NUMBER(4)  8 HIREDATE DATE  9 SAL           NUMBER(7,2) 10 COMM          NUMBER(7,2) 11 DEPTNO          NUMBER(2) 
1 desc dept 2 名稱 空值 類型 3 ------ -------- ------------ 
4 DEPTNO NOT NULL NUMBER(2) 5 DNAME          VARCHAR2(14) 6 LOC          VARCHAR2(13) 

數據以下:3d

用SQL完成如下問題列表:code

  1. 找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名。
  2. 找出EMP表員工名字中含有A 和N的員工姓名。
  3. 找出全部有佣金的員工,列出姓名、工資、佣金,顯示結果按工資從小到大,佣金從大到小。
  4. 列出部門編號爲20的全部職位。
  5. 列出不屬於SALES 的部門。
  6. 顯示工資不在1000 到1500 之間的員工信息:名字、工資,按工資從大到小排序。
  7. 顯示職位爲MANAGER 和SALESMAN,年薪在15000 和20000 之間的員工的信息:名字、職位、年薪。
  8. 說明如下兩條SQL語句的輸出結果
  9. 讓SELECT 語句的輸出結果爲
  10. 判斷SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否抱錯,爲何?

解答以下:htm

1 --1.找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名
2 --使用下劃線代替一個字符 若是是第三個字母 那麼使用兩個下劃線
3 SELECT e.ENAME FROM EMP e WHERE e.ENAME like '__A%'; 4 --使用截取 截取第三個字符且截取一個字符
5 SELECT e.ENAME FROM EMP e WHERE substr(e.ename,3,1)='A';

 

1 --2.找出EMP表員工名字中含有A 和N的員工姓名
2 -- 使用and 兩個like
3 SELECT e.ENAME FROM EMP e WHERE e.ENAME like '%A%' and e.ENAME like '%N%'; 4 -- 或者'%A%N%' 這種我沒有想到
5 SELECT e.ENAME FROM EMP e WHERE e.ENAME like '%A%N%';

 

 

 

1 --3.找出全部有佣金的員工,列出姓名、工資、佣金,顯示結果按工資從小到大 佣金從大到小
2 -- 既然是有佣金 我以爲應該判斷 comm is not null 原做者沒有判斷
3 SELECT e.ENAME,e.SAL+e.COMM,e.COMM FROM EMP e WHERE e.COMM is NOT NULL ORDER BY e.SAL+e.COMM asc,e.COMM desc;

 

1 --4.列出部門編號爲20的全部職位
2 SELECT DISTINCT e.JOB FROM EMP e WHERE e.DEPTNO='20';

 

1 --5. 列出不屬於SALES 的部門
2 -- 好幾種方式
3 -- <>、!= 、not in 、not like
4 SELECT * FROM DEPT d WHERE d.DNAME <>'SALES'; 5 SELECT * FROM DEPT d WHERE d.DNAME !='SALES'; 6 SELECT * FROM DEPT d WHERE d.DNAME not in ('SALES'); 7 SELECT * FROM DEPT d WHERE d.DNAME NOT like 'SALES';

 

1 --6.顯示工資不在1000 到1500 之間的員工信息:名字、工資,按工資從大到小排序
2 -- 工資=sal+comm 因爲comm有null值 因此要給它一個默認值0 否則和sal相加的時候會沒有結果 原答案沒有加nvl
3 SELECT e.SAL+nvl(e.COMM,0) wage FROM EMP e WHERE e.SAL+nvl(e.COMM,0)>1500 OR e.SAL+nvl(e.COMM,0)<1000 ORDER BY wage desc;

 

--7. 顯示職位爲MANAGER 和SALESMAN,年薪在15000 和20000 之間的員工的信息:名字、職位、年薪 -- 職位能夠使用in('MANAGER','SALESMAN') -- 年薪計算的時候也要注意null值的相加 使用nvl
SELECT e.ENAME,e.JOB,(e.SAL+nvl(e.COMM,0))*12 yearly_salary FROM EMP e WHERE e.JOB IN ('MANAGER','SALESMAN') and (e.SAL+nvl(e.COMM,0))*12 BETWEEN 15000 AND 20000;

 

--8. 說明如下兩條SQL語句的輸出結果
SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL; SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL; IS NULL判斷某個字段是否爲空 =NULL判斷某個值是否等於NULL
--9.SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否會報錯 -- 不會 存儲隱式類型轉換
-- 10. 讓SELECT 語句的輸出結果爲
SELECT * FROM SALGRADE; SELECT * FROM BONUS; SELECT * FROM EMP; SELECT * FROM DEPT; SELECT 'SELECT * FROM '||table_name||';' from user_tables;

 

--11.列出當前用戶有多少張數據表,結果集中存在多少條記錄 -- 4
select COUNT(1) from user_tables; -- 23
SELECT sum(num_rows) from user_tables;

 原文地址:http://database.51cto.com/art/201106/270285_2.htmblog

相關文章
相關標籤/搜索