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

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


本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2011/07/08/2100803.html,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
296 1
|
1月前
|
SQL 人工智能 数据库
【三桥君】如何正确使用SQL查询语句:避免常见错误?
三桥君解析了SQL查询中的常见错误和正确用法。AI产品专家三桥君通过三个典型案例:1)属性重复比较错误,应使用IN而非AND;2)WHERE子句中非法使用聚合函数的错误,应改用HAVING;3)正确的分组查询示例。三桥君还介绍了学生、课程和选课三个关系模式,并分析了SQL查询中的属性比较、聚合函数使用和分组查询等关键概念。最后通过实战练习帮助读者巩固知识,强调掌握这些技巧对提升数据库查询效率的重要性。
86 0
|
2月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
4月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
3月前
|
SQL 存储 弹性计算
OSS Select 加速查询:10GB CSV 文件秒级过滤的 SQL 语法优化技巧
OSS Select 可直接在对象存储上执行 SQL 过滤,跳过文件下载,仅返回所需数据,性能比传统 ECS 方案提升 10~100 倍。通过减少返回列、使用等值查询、避免复杂函数、分区剪枝及压缩优化等技巧,可大幅降低扫描与传输量,显著提升查询效率并降低成本。
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的闪回版本查询
本文介绍了Oracle数据库的闪回版本查询(Flashback Version Query)功能,通过示例详细讲解了其使用方法。闪回版本查询可获取指定时间区间内行的不同版本,利用`versions between`子句实现。文中包含视频讲解,并通过创建测试表、插入数据及执行查询等步骤,演示如何获取历史版本信息和伪列详情,帮助用户深入了解该功能的实际应用。
117 13
|
5月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
207 6
|
5月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
131 3
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
SQL 存储 索引

推荐镜像

更多