• oracle学习第四天


    关联查询

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

    select emp.ename,dept.dname from emp,dept;

    查询某用户下某表的约束名称(在dba角色下查询)
    select constraint_name from dba_constraints where owner = 'SCOTT' AND table_name= 'EMP' ;

    查询当前用户下的表约束
    select constraint_name, constraint_type , search_condition, r_constraint_name
    from user_constraints where table_name = upper('emp');

    删除emp表中的外键约束
    alter table emp
    drop constraint FK_DEPTNO ;

    INSERT INTO "SCOTT"."EMP" (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO) VALUES ('8888', 'lg', 'BOSS', '7839', TO_DATE('1981-11-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '4500', '50');


    等值连接
    连接查询中最常见的一种,通常是在有主外键关联关系的表之间建立,并将连接条件设定为有关系的列,使用"="连接相关的表

    查询职员的姓名,职位以及所在部门的名字和所在城市

    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 jion dept d on (e.deptno=d.deptno);


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

    自连接
    是一种特殊的连接查询,数据的来源是同一个表.也就是说关联关系来自于单表中的多个列
    表中的列参照同一个表中的其他列的情况称作自参照表
    自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接

    查出每个职员的经理名字,以及他们的职员编号

    select worker.empno w_empno,worker.ename w_ename,manager.empno m_empno,manager.ename m_ename
    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 emp where rownum>3
    解决方案:(必须使用子查询)
    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 (currentpage-1)*pagesize+1 pagesize*currentpage
    page2:21-40
    ...
    pageN:(n-1)*20+1,n*20


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

    select * from (select rownum rn,e.* from (select * from emp order by sal desc) e) where rn between 8 and 10;

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


    查询职员表,根据职员的职位计算奖金额,管理者 1.2倍工资,办事员1.1倍工资,销售员1.05倍工资,如果不是这三个职位,则取工资值
    decode函数解决此类问题
    decode(column,search1,result1,search2,result2......default_result)
    select decode(sal,MANAGER,1.2*sal,CLERK,1.1*sal,SALES,1.05*sal,default sal) from emp;//错的
    select ename,job,sal,decode(job,'MANAGER',1.2*sal,'CLERK',1.1*sal,'SALESMAN',1.05*sal,sal) bonus from emp;

    年薪的50% 办事员40% 销售30% 其他10%
    select decode(job,'MANAGER',(sal+nvl(comm,0))*12*0.5,'CLERK',(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;


    等价处理,
    select ename,job,sal,
    case job when 'MANAGER' then 1.2*sal
    when 'CLERK' then 1.1*sal
    when 'SALESMAN' then 1.05*sal
    else sal end
    bonus
    from emp;


    多列子查询
    select employee_id,manager_id,department_id
    from employees
    where (manager_id,department_id) IN
    (select manager_id,department_id from employees where employee_id IN(110,188))
    and employee_id NOT IN (166,155);

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


    java和oracle连接,实现emp表分页查询

  • 相关阅读:
    重写、隐藏基类方法(new, override)
    Java FileHandler
    JMS example
    DB Locker
    计算与所有线段都重合的线段数目
    [转载] linux内存 问题
    oracle rownum & rowid mark a good tool
    java Wget Download
    java new way to implement singleton, use enum
    HttpPut Multipart and handle https request.
  • 原文地址:https://www.cnblogs.com/zy19930408/p/4867783.html
Copyright © 2020-2023  润新知