zoukankan      html  css  js  c++  java
  • Oracle SQL:经典查询练手第二篇

    承接上一篇,表结构如下,用户scott

     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) 

    数据如下:

    用SQL完成以下问题列表:

    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'是否抱错,为什么?

    解答如下:

    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.htm

  • 相关阅读:
    菜刀失效以后得到web的方法
    mimikatz使用
    hydra使用教程
    web安全学习-攻击会话管理
    web安全学习-验证机制存在的问题
    web安全学习-绕过客户端限制
    基于MaxCompute/Dataworks实现数据仓库管理与全链路数据体系
    tensorflow学习|基于TF-IDF的垃圾短信预测
    WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
    CentOS7下安装CDH,clouderamanager,hadoop
  • 原文地址:https://www.cnblogs.com/qingkongwanli/p/7381998.html
Copyright © 2011-2022 走看看