笛卡尔积
    A{a,b,c}     B{1,2,3}
    A*B:{a,1}{a,2}{a,3}
        {b,1}{b,2}{b,3}
        {c,1}{c,2}{c,3}
    select
    from s_emp s,s_dept d
    
    s_emp                    s_dept
      id last_name dept_id(fk)     id  name
    1     tom    2            3   kk
    2    Jake    3            2   yy
    3     briup                5   xx
    select
    from s_emp s,s_dept d
    结果:
    id last_name dept_id(fk)     id  name
    1     tom    2        3   kk
    2    Jake    3        3   kk
    3     briup            3   kk
    1     tom    2        2   yy
    2    Jake    3        2   yy
    3     briup            2   yy
    1     tom    2        5   xx
    2    Jake    3        5   xx
    3     briup            5   xx


    内链接:
    等值链接:基于主外键获取两张表相关联的数据
    select s.id,s.last_name,d.id
    from s_emp s,s_dept d;
    where s.dept_id=d.id
    结果
    id last_name dept_id(fk)     id  name
    2    Jake    3        3   kk
    1     tom    2        2   yy    
    非等值链接:把两张没有关联关系的表基于表中的列
        建立关系
    create table rank(
    id number primary key,
    name varchar2(6),
    minsal number,
    maxsal number
    );
    insert into rank values(1,’白领’,0,1000);
    insert into rank values(2,’蓝领’,1001,2000);
    insert into rank values(3,’金领’,2001,3000);
    查看员工薪水所出的等级
    select    
    from s_emp s,rank r;
    s_emp                rank
    id last_name  dept_id    salary    id name minsal maxsal
    1     tom    2    800    1. ’白领’  0.    1000
    2    Jake    3    1500    1. ’白领’  0.    1000
    3     briup        2200    1. ’白领’  0.    1000
    1     tom    2    800    2. ’蓝领’ 1001.  2000
    2    Jake    3    1500    2. ’蓝领’ 1001.  2000
    3     briup        2200    2. ’蓝领’ 1001.  2000
    1     tom    2    800    3. ’金领’.2001   3000
    2    Jake    3    1500    3. ’金领’.2001   3000
    3     briup        2200    3. ’金领’.2001   3000
    
    select    s.last_name,s.salary,r.name
    from s_emp s,rank r
    where s.salary between r.minsal and r.maxsal
    s_emp                rank
    id last_name  dept_id    salary    id name minsal maxsal
    1     tom    2    800    1. ’白领’  0.    1000
    2    Jake    3    1500    2. ’蓝领’ 1001.  2000
    3     briup        2200    3. ’金领’.2001   3000
    
    自链接
    查看员工信息及对应经理的信息
    s_emp                    
      id last_name   manager_id     
    1     tom    2            
    2    Jake    3            
    3     briup        
    
    select     
    from s_emp e,s_emp m

    s_emp    e                s_emp m
      id last_name   manager_id     id last_name   manager_id
    1     tom    2            1     tom    2
    2    Jake    3            1     tom    2
    3     briup            1     tom    2
    1     tom    2            2    Jake    3    
    2    Jake    3            2    Jake    3
    3     briup            2    Jake    3
    1     tom    2           3     briup     
    2    Jake    3          3     briup      
    3     briup            3     briup
    
    select e.last_name,m.last_name    
    from s_emp e,s_emp m
    where e.manager_id=m.id
    //结果
    s_emp    e                s_emp m
      id last_name   manager_id     id last_name   manager_id
    1     tom    2            2    Jake    3    
    2    Jake    3          3     briup      
    
    外链接
    左外链接:在等值链接的基础之上,主表没有通过主外键关系
    的数据也要显示出来
    s_emp                    s_dept
      id last_name dept_id(fk)     id  name
    1     tom    2            3   kk
    2    Jake    3            2   yy
    3     briup            5   pp
    

    select s.id,s.last_name,d.id
    from s_emp s,s_dept d;
    where s.dept_id=d.id(+)
    结果
    id last_name dept_id(fk)     id  name
    2    Jake    3        3   kk
    1     tom    2        2   yy    
    3     briup    
    等价
    select s.id,s.last_name,d.id
    from s_emp s left outer join s_dept d;
    on s.dept_id=d.id
    注意:left前面的是主表
    outer可以省略
    右外链接:在等值链接的基础之上,
        把从表没有匹配的数据也显示出来
    s_emp                    s_dept
      id last_name dept_id(fk)     id  name
    1     tom    2            3   kk
    2    Jake    3            2   yy
    3     briup            5   pp
    select s.id,s.last_name,d.id
    from s_emp s,s_dept d;
    where s.dept_id(+)=d.id
    结果
    id last_name dept_id(fk)     id  name
    2    Jake    3        3   kk
    1     tom    2        2   yy    
                    5   pp    
    等价
    select s.id,s.last_name,d.id
    from s_emp s right outer join s_dept d;
    on s.dept_id=d.id
    
    全链接:在等值链接的基础之上,主表和从表没有匹配的数据
    也要显示
    s_emp                    s_dept
      id last_name dept_id(fk)     id  name
    1     tom    2            3   kk
    2    Jake    3            2   yy
    3     briup            5   pp

    select s.id,s.last_name,d.id
    from s_emp s full outer join s_dept d;
    on s.dept_id=d.id
    结果
    s_emp                    s_dept
      id last_name dept_id(fk)     id  name
    2    Jake    3        3   kk
    1     tom    2        2   yy    
    3     briup
                    5   pp

    等价
    select s.id,s.last_name,d.id
    from s_emp s,s_dept d;
    where s.dept_id(+)=d.id
    union
    select s.id,s.last_name,d.id
    from s_emp s,s_dept d;
    where s.dept_id=d.id(+)
    
    union并集(重复的元素只保留一个)
    select    id
    from s_emp
    where id<5        //1,2,3,4
    union     
    select id
    from s_emp
    where id>3 and id <10 //4,5,6,7,8,9
    结果1,2,3,4,5,6,7,8,9
    
    union all并集(不会去掉重复的元素)
    select    id
    from s_emp
    where id<5        //1,2,3,4
    union all     
    select id
    from s_emp
    where id>3 and id <10 //4,5,6,7,8,9
    结果1,2,3,4,4,5,6,7,8,9

    minus 第一个结果去掉和第二个结果相同的数据
    select    id
    from s_emp
    where id<5        //1,2,3,4
    minus    
    select id
    from s_emp
    where id>3 and id <10 //4,5,6,7,8,9
    结果1,2,3

    
    intersect交集
    select    id
    from s_emp
    where id<5        //1,2,3,4
    intersect    
    select id
    from s_emp
    where id>3 and id <10 //4,5,6,7,8,9
    结果4

    rownum伪列,数据库表不存在该列,查询数据的时候数据库会给每一行数据
    分配一个rownum,rownum从1开始的连续数字的标记
    
    rownum=1 获取第一条数据,其它的数字不能写

    rownum<=n n可以是大于0的任意值
    rownum>=m m只能为0,获取所有的数据
    查询第6条到第10条数据
    select id    
    from s_emp
    where rownum<=15
    minus
    select id
    from s_emp
    where rownum<=10

posted on 2018-10-17 23:36  天堂里的另一天  阅读(37)  评论(0)    收藏  举报