zoukankan      html  css  js  c++  java
  • Oracle学习第六课

    伪列

    rowid: 当前数据在数据库中的物理位置.

    特点: 不存在任何表中,能查询出来.

    -- 查看员工的工号,名字,薪资,及其物理位置id
    select employee_id,first_name,salary,rowid
    from employees;

    rownum: 对满足查询条件的,查询结果进行编号(从1开始)

    特点:

    1. 对满足where条件的查询结果进行标序号.

    2. 序号一定从1开始,且连续整数值.

    3. rownum做条件判断: <n <=n >=1 =1

    -- 查看员工的工号,名字,薪资, 每行数据添加编号(1-开始)
    select employee_id,frist_name,salary,rownum
    from employees;
    ​
    -- 查看薪资大于10000的员工信息: 工号,名字,薪资,序号 rownum.
    select employee_id,first_name,salary,rownum
    from employees
    where salary>10000;
    ​
    ​
    -- 查看员工表中,前10个员工信息(工号,名字,薪资,序号)[序号<=10]
    ​
    select employee_id,first_name,salary,rownum
    from employees
    where rownum <= 10;
    ​
    -- 查看员工表中,第11~第20个员工信息(工号,名字,薪资,序号)
    select employee_id,first_name,salary,rownum
    from employees
    where rownum >10 and rownum <=20; [×]

    子查询

    概念: 一个查询语句执行过程,需要用到另一条查询sql(子查询)的执行结果?

    -- 具有x薪资的员工信息(工号,名字,薪资)?
     select * from employees where salary = X; --x 是最高薪资?
     select max(salary) from employees; -- x

    1. 子查询结果是1行1列的值

    将子查询的结果作为主查询的条件判断.

    -- 具有最高薪资的员工信息(工号,名字,薪资)?
    思路:
    1. 获得员工的最高薪资   maxSalary
       select max(salary) from employees;--maxSalary;
    ​
    2. 获得薪资为maxSalary的员工信息(工号,名字,薪资)
       select employee_id,first_name,salary from employees where salary = (maxSalary);
    3. 合并SQL
        select employee_id,first_name,salary from employees where salary = (select max(salary) from employees);
        
    -- 查询薪资数大于平均工资员工信息(工号,名字,薪资)
    1. 获得平均工资 avgSalary
        select avg(salary) from employees;--avgSalary
    2. 获得薪资>avgSalary的员工信息?
        select * from employees where salary > (avgSalary);
    3. 合并
        select * from employees where salary > (select avg(salary) from employees);

    2. 子查询的结果是n行1列的值

    将子查询的结果作为主查询的条件判断,且一般使用多值 枚举判断 in

    -- 查询和姓 'King' 的在同一部门的员工信息?
    1. 获得king所在的部门id: --deptId
        select department_id from employees where last_name ='King';--DeptId
    2. 查询部门id为deptId的员工信息?
        select * from employees where department_id in (DeptId)
    3. 合并:
     select * from employees where department_id in (select department_id from employees where last_name ='King');

    3. 子查询的结果是n行n列

    主查询将子查询的结果作为临时表,再次查询.

    -- 查看员工信息(工号,名字,薪资),按照薪资降序排序的前10名员工信息?
    select employee_id,first_name,salary
    from employees
    where rownum <=10
    order by salary desc;[错误: 按理先排序后取前10个,实际sql执行顺序先获取前10后排序]
    ​
    人工思路:
    1. 先按照薪资降序排序---排序后的结果   
        select employee_id,first_name,salary from employees order by salary desc; -- EMP1 表-- n行n列的结果  临时表
    2. 对排序后的结果取前10
        select * 
        from (EMP1) 
        where rownum <=10;
    3. 合并
        select * from
            (select employee_id,first_name,salary from employees order by salary desc) 
        where rownum <=10;

    分页查询[重点]

    -- 1. 查看员工表中,第11~第20个员工信息(工号,名字,薪资,序号)
        思路:
        1. 获得拥有序号效果的列的EMP1表?[对表添加一个rownum的RN的序号列]
        select employee_id,first_name,salary,rownum as rn
        from employees;--EMP1
        2. 查询EMP1中RN的值为11~20之间的员工信息?[对步骤1的查询临时表,再次查询]
        select employee_id,first_name,salary,rn
        from (emp1)
        where rn >=11 and rn <=20;
        3. 合并
        select employee_id,first_name,salary,rn
        from 
            (select employee_id,first_name,salary,rownum as rn from employees)
        where rn >=11 and rn <=20;
    -- 2. 查询员工信息按照薪资降序排序后的第11条~第20条员工信息?[重要, 笔试, 100%开发]
    ​
        1. 按照薪资降序排序:
            select * from employees order by salary desc;-- t1
        2. 对t1表 添加RN序号列
            select employee_id,first_name,salary,rownum rn
            from (t1);--t2
        3. 获取RN 11~20之间的员工信息?
           select employee_id,first_name,salary,rn
           from (t2)
           where rn >=11 and rn <=20;
            
        4. 合并
            select employee_id,first_name,salary,rn
            from
                (select employee_id,first_name,salary,rownum rn
                     from 
                        (select * from employees order by salary desc))
            where rn >=11 and rn<=20;
  • 相关阅读:
    定时器Timer的使用
    Queue和BlockingQueue的使用以及使用BlockingQueue实现生产者-消费者
    ReentrantReadWriteLock读写锁的使用
    利用Lucene与Nutch构建简单的全文搜索引擎
    再见了,DM
    互联网公司高并发图片(缩略图)处理中间层服务架构设计一
    poj 3131 双向搜索+hash判重
    [置顶] linux常用命令大全
    堆排序
    iOS UIView非常用方法及属性详解
  • 原文地址:https://www.cnblogs.com/chenpeisong/p/9751539.html
Copyright © 2011-2022 走看看