内连接:
- 等值连接:在连接条件中使用“=”运算符比较连接列的列值,查询结果中列出被连接表的所有列,包括其中的重复属性。
- 不等连接:在连接条件中使用除“=”运算符之外的比较运算符连接列的列值。如>、>=、<=、<、!>、!<和<>等运算符。
- 自然连接:当两个自然连接表中有相同的列,两个表中的列名相同,且对应数据类型完全相同,则这种列会作为连接属性进行连接,得到的结果中会去掉重复的属性。因此在表的设计时,如果多个表中的列含义相同,尽量使用相同的列名和一致的数据类型,方便进行自然连接。
外连接
- 左(外)连接:两个表进行左连接,符合连接条件的,将所有列连接起来,不符合连接条件的,保留左表的列,右表对应的列置为null。
- 右(外)连接:两个表进行右连接,符合连接条件的,将所有列连接起来,不符合连接条件的,保留右表的列,左表对应的列置为null。
- 全连接:左连接和右连接得到的值的合集。
笛卡尔(交叉)连接
交叉连接也称为笛卡尔连接,得到的结果时两个表进行笛卡尔运算的得到的数据。
自连接
自连接:将自身的那张表作为一个镜子表,自己和自己进行连接,可用来获得一些特殊的值,如公交车的路线。
示例语句
先建两张表(示例作用,忽略表的设计问题)
-- student表
create table student(
sid number(10) primary key,
sname varchar2(20),
cname varchar2(10)
);
-- 加点数据进去
insert into student(sid,sname,cname) values(1,'宋江','水浒班');
insert into student(sid,sname,cname) values(2,'林冲','水浒班');
insert into student(sid,sname,cname) values(3,'刘备','三国班');
insert into student(sid,sname,cname) values(4,'张飞','三国班');
insert into student(sid,sname,cname) values(5,'关羽','三国班');
insert into student(sid,sname,cname) values(6,'唐僧','西游班');
-- class表
create table class(
cid number(10) primary key,
cname varchar2(10)
);
-- 加数据
insert into class(cid,cname) values(1,'水浒班');
insert into class(cid,cname) values(2,'三国班');
insert into class(cid,cname) values(3,'红楼班');
得到两张表如下
student表
class表
等值连接
select * from student inner join class on student.cname=class.cname;
不等连接
select * from student inner join class on student.cname<>class.cname;
自然连接
select * from student natural join class;
左连接
select * from student left join class on student.cname=class.cname;
右连接
select * from student right join class on student.cname=class.cname;
全连接
select * from student full join class on student.cname=class.cname;
笛卡尔连接(交叉连接)
select * from student cross join class;