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

本文与大家共同讨论与分享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% ';
 
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
-- 说明不会抱错,这儿存在隐式数据类型的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值