笛卡尔积
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
浙公网安备 33010602011771号