• Oracle3连接&子查询&联合查询&分析函数


    -- 连接:内连接,外连接,自连接,交叉连接

    select * from emp,dept; -- 笛卡尔积
    select * from emp cross join dept; -- 交叉连接,结果就是笛卡尔积
    select * from emp inner join dept on emp.deptno=dept.deptno; -- 等值连接
    select * from emp,dept where emp.deptno=dept.deptno -- 等值连接,省略写
    select * from emp natural join dept; -- 自然连接,无需条件,有相同列名才能自然连接,否则就是笛卡尔积
    select * from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal -- 不等值连接
    select * from emp left join dept on emp.deptno=dept.deptno -- 左外链接
    select * from emp right join dept on emp.deptno=dept.deptno -- 右外连接
    select * from emp full join dept on emp.deptno=dept.deptno -- 全连接,full ‘左外+右外’
    -- oracle特有外连接
    select * from emp,dept where emp.deptno(+)=dept.deptno -- 右外连接

    -- 子查询:三种,单列单值 where = ,单列多值 where in ,多列多行 做虚拟小表,注意给此小表起个别名
    select * from emp where sal =(select max(sal) from emp); -- 单列单值
    select * from emp where sal in(select sal from emp where sal>=3000); -- 单列多值
    -- 查询工资大于等于3000的员工信息和部门信息
    select * from emp,dept where emp.deptno=dept.deptno and emp.sal>=3000; -- 用内连接,多条件查询
    select * from (select * from emp where sal in(select sal from emp where sal>=3000)) e,dept
    where e.deptno=dept.deptno; -- 子查询 多列多行
    -- 查询出员工编号,姓名,以及所在部门名称
    select emp.empno,emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno; -- 条件查询
    select emp.empno,emp.ename,(select dept.dname from dept where emp.deptno=dept.deptno) 部门名称
    from emp; -- 采用子查询,这种子查询自身无结果,它借助了其他表,这种子查询不能查所有字段(太多)
    select emp.empno,emp.ename,(select * from dept where emp.deptno=dept.deptno) 部门名称
    from emp; -- xx 值过多

    -- 联合查询,将两个查询结果组成一个结果
    select * from student
    union all -- 并集所有,不去重
    select * from student2

    select * from student
    union -- 并集,去重
    select * from student2

    select * from student
    intersect -- 交集
    select * from student2

    select * from student
    minus -- 补集,student2的补集,全集为student与student2的并集
    select * from student2

    -- 分析函数
    select * from emp
    -- rank()over() 数值相同排名相同,后续排名跳跃
    select emp.ename,emp.sal,rank()over(order by emp.sal desc) rank from emp; -- 所有排名
    -- partition by 字段名,根据 字段名 分组排名
    select emp.ename,emp.sal,emp.deptno,rank()over(partition by emp.deptno order by emp.sal desc) rank from emp; -- 每个部门各自内部排名
    -- 查询部分排名,将整个排名表当做虚拟小表对他进行查询0
    select * from (select emp.ename,emp.sal,rank()over(order by emp.sal desc) rank from emp) where rank<=3;

    -- dense_rank()over() 数值相同排名相同,后续排名不跳跃
    select emp.ename,emp.sal,dense_rank()over(order by emp.sal desc) rank from emp;

    -- row_number()over() 行数排名,没有并列情况
    select emp.ename,emp.sal,row_number()over(order by emp.sal desc) rw from emp;
    select emp.ename,emp.sal,rownum rn from emp; -- 仅仅行数‘排名’,rownum伪列,不是函数,是属性
    -- row_number()over()用于分页
    select * from(select emp.*,row_number()over(order by emp.sal desc) rw from emp) where rw between 1 and 3

    select rowid from emp -- 查找每一行存储地址id
    select rownum from emp -- 查找每一行‘排名’,根据储存地址id
    select emp.*,rownum from emp
    select * from(select emp.*,rownum rw from emp) e where e.rw between 1 and 3 -- 不排名,只分页
    select * from(select em.*,rownum rw from (select * from emp order by sal desc) em) e where e.rw between 1 and 3 -- 排名,分页

  • 相关阅读:
    深入理解委托、匿名方法和 Lambda 表达式
    常见SQL问题
    LeetCode题解——四数之和
    把中台说清楚
    程序员们的三高:高并发、高性能、高可用
    论文查重是怎么查的
    LeetCode题解——最长回文子串
    六百字读懂 Git(转)
    SQL中ON和WHERE的区别
    链表排序之堆排序
  • 原文地址:https://www.cnblogs.com/21556guo/p/13546362.html
Copyright © 2020-2023  润新知