不说废话,大牛初始亦菜鸟,成功之路贵执行,马上行动!如果想获得更优质的显示效果,请在Chrome、Firefox等现代浏览器浏览本站。

[推荐]ORACLE SQL:经典查询练手第二篇(不懂装懂,永世饭桶!)

:: 数据库精典 EricHu 822℃ 0评论

[推荐]ORACLE SQL

经典查询练手第二篇(不懂装懂,永世饭桶!)

——通过知识共享树立个人品牌。

 

 本文与大家共同讨论与分享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 19801217     800.00               20
7499 ALLEN      SALESMAN   7698 1981220     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981222     1250.00    500.00     30
7566 JONES      MANAGER    7839 198142      2975.00               20
7654 MARTIN     SALESMAN   7698 1981928     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 198151      2850.00               30
7782 CLARK      MANAGER    7839 198169      2450.00               10
7788 SCOTT      ANALYST    7566 1987419     4000.00               20
7839 KING       PRESIDENT       19811117    5000.00               10
7844 TURNER     SALESMAN   7698 198198      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1987523     1100.00               20
7900 JAMES      CLERK      7698 1981123      950.00               30
7902 FORD       ANALYST    7566 1981123     3000.00               20
7934 MILLER     CLERK      7782 1982123     1300.00               10
102 EricHu     Developer  1455 2011526 1   5500.00     14.00     10
104 huyong     PM         1455 2011526 1   5500.00     14.00     10
105 WANGJING   Developer  1455 2011526 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%;

ENAME
——–
ALLEN
MARTIN
WANGJING
——或——–
SQL> SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE %A%N%;

ENAME
——–
ALLEN
MARTIN
WANGJING
 

/*——–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

17 rows selected 

—–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;

DEPTNO DNAME          LOC
—- ————– ————-
    10 ACCOUNTING     NEW YORK
20 RESEARCH       DALLAS
40 OPERATIONS     BOSTON
50 50abc          50def
60 Developer      HaiKou
110 信息科         海口

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

6 rows selected
或者
SQL> SELECT ENAME,SAL + COMM AS WAGE FROM SCOTT.EMP
2  WHERE SAL + COMM < 1000 OR SAL + COMM > 1500
3  ORDER BY WAGE DESC;

ENAME            WAGE
——– ———-
EricHu           5514
huyong           
5514
WANGJING         
5514
MARTIN           
2650
ALLEN            
1900
WARD             
1750

6 rows selected 

/*—– 7. 显示职位为MANAGER 和SALESMAN,年薪在15000 和20000 之间的员工的信息:名字、职位、年薪。———-*/
SQL
> SELECT ENAME 姓名,JOB 职位,(SAL + COMM) * 12 AS 年薪
2  FROM SCOTT.EMP
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;

EMPNO      COMM
— ———

说明:IS NULL是判断某个字段是否为空,为空并不等价于为空字符串或为数字0;
而 =NULL 是判断某个值是否等于 NULL,NULL = NULL和NULL <> NULL都为 FALSE。

/*—–9. 让SELECT 语句的输出结果为
SELECT * FROM SALGRADE;
SELECT * FROM BONUS;
SELECT * FROM EMP;
SELECT * FROM DEPT;
……
列出当前用户有多少张数据表,结果集中存在多少条记录。
———-
*/SQL

> SELECT SELECT * FROM ||TABLE_NAME||; FROM USER_TABLES;

SELECT*FROM||TABLE_NAME||;
——————————————-
SELECT * FROM BONUS;
SELECT * FROM EMP;
SELECT * FROM DEPT;
……等等,在此不列出。

-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

10 rows selected

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

10 rows selected
说明不会抱错,这儿存在隐式数据类型的。

转载请注明:RDIFramework.NET » [推荐]ORACLE SQL:经典查询练手第二篇(不懂装懂,永世饭桶!)

喜欢 (1)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址