• Oracle学习第三讲


    关联查询

    笛卡尔积
    指做关联操作的每个表的每一行都和其他表的每一行组合,假设两个表的记录条数分别为x和y,笛卡尔积将返回x*y条记录
    例如:select count(*) from emp;
    select count(*) from dept;
    select emp.ename,dept.dname from emp,dept;

    等值连接
    连接查询中最常见的一种,通常是在有主外键关联关系的表之间建立,并将连接条件设定为有关系的列,使用“=”连接相关的表
    例如:查询职员的姓名、职位以及所在部门的名字和所在城市
    select e.ename,e.job,d.dname,d.loc
    from emp e,dept d
    where e.deptno=d.deptno;

    内连接
    返回所有满足条件的记录
    例如:查询职员的姓名、职位以及所在部门的名字和所在城市
    select e.ename,e.job,d.dname,d.loc
    from emp e,dept d
    where e.deptno=d.deptno;
    或者(如果要写内练接,就用下面这个)
    select e.ename,e.job,d.dname,d.loc
    from emp e join dept d
    on (e.deptno=d.deptno);

    外连接
    不仅返回满足条件的记录,还将返回不满足条件的记录
    select table1.column,table2.column
    from table1 left|right|full[outer] join tanle2
    on table1.column=table2.column;

    例如:查询职员的姓名、职位以及所在部门的名字和所在城市
    左外连接
    select e.ename,e.job,d.dname,d.loc
    from emp e left outer join dept d
    on e.deptno=d.deptno;
    右外连接
    select e.ename,e.job,d.dname,d.loc
    from emp e right outer join dept d
    on e.deptno=d.deptno;
    全外连接
    select e.ename,e.job,d.dname,d.loc
    from emp e full outer join dept d
    on e.deptno=d.deptno;

    自连接
    是一种特殊的连接查询,数据的来源是同一个表,也就是说关联关系来自于单表中的多个列
    表中的列参照同一个表中的其它列的情况称作自参照表
    自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接
    例如:查询出每个职员的经理的名字以及他们的职员编号
    select worker.empno w_empno, worker.ename w_ename,manager.ename m_ename,manager.empno m_empno
    from emp worker join emp manager
    on worker.mgr=manager.empno;

    ----------------------------------------------------------------------------------------

    子查询
    子查询在where子句中
    在select查询中,在where查询条件中的限制条件不是一个确定的值,而是来自于另一个查询的结果
    为了给查询提供数据而首先执行的查询语句叫子查询
    子查询是嵌入在其他SQL语句中的select语句,大部分出现在where子句中
    子查询嵌入的语句称作主查询或者父查询
    主查询可以是select语句,也可以是其他sql语句中

    根据返回结果的不同,子查询可以分为单行子查询、多行子查询和多列子查询
    例如:查询和Scott同职位的员工
    select ename from emp where job=(select job from emp where ename='SCOTT');

    rownum
    被称作为伪列,用于返回标识行数据顺序的数字
    select rownum,empno,ename,sal from emp;

    例如:查询出emp表第三条以后的数据
    select * from (select rownum rm,e.* from emp e) where rm>3;
    查询出emp表第三条到第七条数据
    select * from (select rownum rm,e.* from emp e) where rm between 3 and 7;

    使用子查询进行分页
    分页策略:每次只取一页的数据,每次换页,取下一页的数据
    在oracle中利用rownum的功能可用来进行分页,假设结果集共有105条数据,每页20条数据,那么
    page1:1-20
    page2:21-40
    ...
    pageN:pagesize*(currentpage-1)+1 pagesize*currentpage

    例如:按照薪水倒序排列,去除结果集中第8-10条记录
    select * from (select rownum rm,sal from (select * from emp order by sal desc) ) where rm between 8 and 10;

    查询emp表,根据职员的职位计算奖金额,管理者1.2倍工资、办事员1.1倍工资、销售员1.05倍工资,如果不是这三个职位的就取工资值。
    decode函数解决此类问题
    decode(column,search1,result1,search2,result2... ,result)

    select ename,job,sal, decode(job,'MANAGER',sal*1.2,'ANALYST',sal*1.1,'SALESMAN',sal*1.05,sal) bonus from emp;
    等同于
    select ename,job,sal,case job when 'MANAGER' then sal*1.2
    when 'ANALYST' then sal*1.1
    when 'SALESMAN' then sal*1.05
    else sal end bonus
    from emp;

    根据年薪算
    select ename,job,sal,comm,decode(
    job,
    'MANAGER',(sal+nvl(comm,0))*12*0.5,
    'ANALYST',(sal+nvl(comm,0))*12*0.4,
    'SALESMAN',(sal+nvl(comm,0))*12*0.3,
    (sal+nvl(comm,0))*12*0.1
    ) bonus from emp;

    多列子查询

    exists操作符
    检查子查询中是否满足条件的行
    1--如果在子查询中存在满足条件的行,返回true,就不再子查询继续查找
    2--如果子查询中不存在满足条件的行,就返回false,继续在子查询中查找

  • 相关阅读:
    算法题:单调递增的数字
    算法题:搜索旋转排序数组
    算法题:K个一组翻转链表
    django错误
    virtualenvwrapper出错
    谷歌浏览器css样式不显示问题
    Python爬取豆瓣电子书信息
    flask secret key的作用
    【Hibernate】--实体状体与主键生成策略
    【Struts2+Spring3+Hibernate3】SSH框架整合实现CRUD_1.3
  • 原文地址:https://www.cnblogs.com/xujianbo/p/4918586.html
Copyright © 2020-2023  润新知