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,如需转载请自行联系原作者

目录
相关文章
|
11天前
|
SQL 资源调度 数据库
深入探究SQL查询语句执行过程
深入探究SQL查询语句执行过程
27 2
|
11天前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
21 1
|
1月前
|
SQL 存储 缓存
高基数 GroupBy 在 SLS SQL 中的查询加速
本文详细介绍了SLS中的高基数GroupBy查询加速技术。
|
1天前
|
SQL 存储 缓存
一条 SQL 查询语句是如何运行?
本文详细剖析了SQL语句在MySQL中的执行流程,涵盖客户端、Server层及存储引擎层。Server层包括连接器、查询缓存、分析器、优化器与执行器等核心组件。连接器管理连接与权限校验,查询缓存加速查询,分析器负责词法与语法分析,优化器提升SQL性能,执行器调用存储引擎接口。了解这些流程有助于深入理解MySQL内部机制及其优化原理。
11 0
|
1月前
|
SQL 运维 程序员
一个功能丰富的SQL审核查询平台
一个功能丰富的SQL审核查询平台
|
16天前
|
SQL
SQL: 巧妙使用CASE WHEN实现查询
文章演示了如何利用SQL中的CASE WHEN语句来有效地进行条件性聚合查询,通过具体示例展示了CASE WHEN在统计分析中的应用技巧。
36 0
|
2月前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age &gt; 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
41 0
|
2月前
|
SQL 关系型数据库 MySQL
|
2月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
72 0
|
2月前
|
Java UED 开发者
当错误遇上Struts 2:一场优雅的异常处理盛宴,如何让错误信息成为用户体验的救星?
【8月更文挑战第31天】在Web应用开发中,异常处理对确保用户体验和系统稳定性至关重要。Struts 2 提供了完善的异常处理机制,包括 `exception` 拦截器、`ActionSupport` 类以及 OGNL 表达式,帮助开发者优雅地捕获和展示错误信息。本文详细介绍了 Struts 2 的异常处理策略,涵盖拦截器配置、错误信息展示及自定义全局异常处理器的实现方法,使应用程序更加健壮和用户友好。
39 0

推荐镜像

更多