多表查询

※ 笛卡尔积

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}

※ 内链接

※ 1. 等值链接:基于主外建找到有用的数据

//表中数据
s_emp                                    s_dept
id,ast_name,dept_id                 id,name
1    Tom        4                       3    jk
2    Jake       3                       4    sl
//(from)进行卡尔积计算
s_emp*s_dept:
{1,3}{1,4}
{2,3}{2,4}
1    Tom        4                       3    jk
1    Tom        4                       4    sl
2    Jake       3                       4    sl
2    Jake       3                       3    jk

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s,s_dapt d  
where s.dept_id=d.id;
//结果:where筛选出有用的数据
1    Tom        4                       4    sl
2    Jake       3                       3    jk

※ 2. 不等值链接:把不具有关联关系的两张表通过某些列建立联系

create table rank(
id number primary key,
name varcher2(10),
minsal number,
naxsal number
);
insert into 表名[列名] values(列值);
insert into rank values(1,’白领’,0,1000);
insert into rank values(2,’蓝领’,1001,2000);
insert into rank values(3,’金领’,2001,3000);

查询员工所处薪水等级
select s.last_name,s.salary,r.name,r.minsal,r.maxsal
from s_emp s,rank r
where s.salary between r.minsal and r.maxsal;

※ 3. 自连接:(自己和自己链接)
查询员工及其经理的信息

select s.last_name,s.manager_id,m.id,m.last_name
from s_emp s,s_emp m
where s.manager_id=m.id

※ 外链接

//表中数据
s_emp                                    s_dept
id,ast_name,dept_id                     id,name
1    Tom        4                       3    jk
2    Jake       3                       4    sl
3    lili                               5    lp

※ 1. 左外链接:在等值链接的基础之上,主表中没有匹配的数据也要显示出来
查询员工及所处部门的信息,即使员工没有部门也要显示出来

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s,s_dapt d  
where s.dept_id=d.id(+);
//结果:
1    Tom        4                       4    sl
2    Jake       3                       3    jk
3    lili

等价于

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s left [outer] join s_dapt d  
on s.dept_id=d.id;

※ 2. 右外链接:在等值链接的基础之上,把从表没有匹配的数据也要显示出来

//表中数据
s_emp                                    s_dept
id,ast_name,dept_id                 id,name
1    Tom        4                       3    jk
2    Jake       3                       4    sl
3    lili                                   5    lp

查询员工及所处部门的信息,即使部门没有员工匹配也要显示出来

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s,s_dapt d  
where s.dept_id(+)=d.id;
//结果:
1    Tom        4                       4    sl
2    Jake       3                       3    jk
                                            5    lp

等价于:

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s right [outer] join s_dapt d  
on s.dept_id=d.id;

※ 3. 全连接:在等值链接的基础之上,把主表和从表没有匹配的数据全部显示出来

//表中数据
s_emp                                    s_dept
id,ast_name,dept_id                 id,name
1    Tom        4                       3    jk
2    Jake       3                       4    sl
3    lili                                   5    lp

查询员工及所有部门信息,没有员工的部门及没有部门的员工都要显示

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s full [outer] join s_dapt d  
on s.dept_id=d.id;
//结果:
1    Tom        4                       4    sl
2    Jake       3                       3    jk
3    lili
                                            5    lp

等价于:(一般不用)

select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s,s_dapt d  
where s.dept_id=d.id(+);
union
select s.id,s.last_name,s.dept_id,d.id,d.name
from s_emp s,s_dapt d  
where s.dept_id(+)=d.id;

※ 并、交集查询

※ 1. union 求并集

select id
from s_emp
where id<5    //1,2,3,4
union
select id
from s_emp
where id<10 and id>3; //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<10 and id>3; //4,5,6,7,8,9
//结果:1,2,3,4,4, 5,6,7,8,9

※ 2. minus 第一个查询的结果去掉第二个结果相同的部分

select id
from s_emp
where id<5   //1,2,3,4
minus
select id
from s_emp   //4,5,6,7,8,9
where id<10 and id>3;
//结果:1,2,3

※ 3. intersect 求交集

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

※ rownum 伪列

数据库表中不存在,只有查询的时候,数据库会给查询的内容每一行都分配一个伪列(分页)
1.rownum=1,查的是第一条(1除外的值都不能等于)
2.rownum <n(<=n), n可以是任意值,不能为0
3.rownum >m, m只能为0,为0显示所有内容

查询第五条到第十条数据

select id
from s_emp
where rownum<=10
minus
select id
from s_emp
where rownum<=4;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值