表连接
from tableName1 join_type tableName2 【 on (join_condition)】
【join_type tableNameN on join_condition …..】
tableName1:表1
tableName2:表2
join_type :连接类型,有inner join(内连接),outer join(外连接),cross join(交叉连接)
join_condition:连接条件,可以是使用多组join_type tableNameN on join_condition ….来实现多个表连接.
内连接
inner join 、join
1. 等值连接
简单说明就是:表之间用=连接
1)select …from A,B where A.no=B.no
2)select …from A inner join B on A.no=B.no where…
2. 不等值连接
where 或者on 后面 列比较不是用=,而是用一下这些
<>,>,<,>=,<=,like,in,between on,not 等等
3. 自然连接
两表的同名列(一个或多个)进行连接
select ….from A natural join B
注意:上面sql语句实际上还默认包含a.同名列=b.同名列
同名列:列名和数据类型都相同的字段
using基于两表有同名列
select ….from A join B using(同名列【同名列,……】)
注意:
1上面using(同名列)等价于a.同名列=b.同名列
2同名列:列名和数据类型都相同的字段
3查询必须是等值连接.
4在select字句或者using字句中都不能为同名列指定表名或别名
5如果对多个表进行检索,必须使用多次using例如
select …from tb1 inner join tb2 using(同名列1)
inner join tb3 using(同名列2)
…….
外连接
用于检索一个表的所有记录和另外一个表的匹配行
关键字outer join,
+:外连接:要放缺少相应信息的那一边
2. 左外连接
select ….from A left [outer] join B on…
左边的所有表纪录与右边表的纪录进行匹配,最后返回左边表所有记录+右边表匹配纪录的表数据。
步骤:两表先匹配已有的,在加上左边剩下未匹配的,右边没有匹配到的加null补充.
举例
3. 右外连接
select ….from A right[outer] join B on…
右边的所有表纪录与左边表的纪录进行匹配,最后返回右边表所有记录+左边表匹配纪录的表数据。
4. 全连接
select ….from A full[outer] join B on..
右边的所有表纪录与左边所有表纪录进行匹配,最后返回右边表所有记录+左边表所有表纪录的表数据。
自连接(连接同一表的行)
交叉连接
select …..
from tb1 cross join tb2
where …….
实现2个表的交叉连接,所得的结果是这2个表各行数据的组合,即这2个表的笛卡尔积。
交叉连接与普通连接的不同点
1不同的地方在于from字句多个表之间不是用逗号,而是用cross join关键字
2交叉连接不使用on限定连接条件
其他都与简单连接一样。
create table class(
cno varchar2(10) primary key,
cname varchar2(20),
cnum number(2)
);
insert into class values(‘1’,’一班’,55);
insert into class values(‘2’,’二班’,45);
create table student2(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
cno varchar2(2),
constraint fk_sno foreign key(cno) references class(cno) on delete cascade
);
insert into student2 values(‘1’,’lili’,18,’1’);
insert into student2 values(‘2’,’lili’,18,’1’);
insert into student2 values(‘3’,’lili’,18,’1’);
insert into student2 values(‘4’,’lili’,20,’1’);
insert into student2 values(‘5’,’lili’,21,’1’);
select c.cno,s.sno,s.sname
from student2 s cross join class c;
class表2条数据,student2表纪录,交叉连接10条纪录(2*5)
过程
class 第一条纪录与student2表组合
class 第二条纪录与student2表组合