※ 笛卡尔积
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;