基本连接

是数据库中缀基本的连接,就是用where语句来指定匹配列和条件,以此连接两个或多个表。例如,Teacher,Course是多对多的一个关系,Relation是他们的对应表

1
2
3
select tname as 教师名字,Cname as 课程名称
from Teacher,Course,Relation
where Teacher.tid=Relation.Rtid and Relation.Rcid=Course.Cid

建立数据表

非常简单的一对表,说的是一个老师只能上一种课,一种课可以有很多不同老师来上。接下来的讲解都建立在这两个表之上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
--课程表
create table Course(
Cname varchar(20),
cid int identity(1,1) primary key,
)
--课程表数据
insert into Course
values ('高等数学')
insert into Course
values ('大学物理')
insert into Course
values ('面向对象程序设计')
insert into Course
values ('数据库入门')
insert into Course
values ('BeyondTech入门')
--老师表
create table Teacher(
tname varchar(20),
tid int identity(1,1) primary key,
cid int references Course(Cid)
)
--老师表数据
insert into Teacher
values ('李珊','1')
insert into Teacher
values ('王大伟','5')
insert into Teacher
values ('何实诚',null)
insert into Teacher
values ('刘惠','3')

内连接

就是INNER JOIN。当然更具条件还可以分为,等值连接、不等连接、自然连接。

等值连接

用join的特点就是可以把where里的一些条件紧凑的写到from子语句中,紧凑简约好看可装逼。

1
2
select tname as 教师名字,Cname as 课程名称
from Teacher join Course on Teacher.cid=Course.cid

不等连接

大家都是学过语文的,就不说了。

自然连接

JOIN的自然连接和where的基本语句执行的自然连接不同。where语句的自然连接必须是你手动指定不重复的列,然后进行连接。说白了就是不选重复的列呗。JOIN语句可以用NATURAL JOIN,他会自动查找两个表中同名的,数据类型兼容或一致的列进行匹配。然后不会重复显示相同列。这个看起来很牛逼,而且我试验了很多次,这个语句在SQL_SEVER2008上是不能运行的,估计只能在ORACLE的数据库下运行。他的缺点是,没有where语句灵活呗,你想想,如果有一个表里两个列与另一个表的两个列相同,岂不是GG?

1
2
select tname,cid,cname
from Course natural join Teacher

外连接

分为左外连接和右外连接。功能是列出所有符合条件的行并且列出一些不能匹配的行,比如有NULL的一些情况。可以看看运行效果。

1
2
3
--左外连接
select tname as 教师名字,Cname as 课程名称
from Teacher left outer join Course on Teacher.cid=Course.cid

左外连接

1
2
3
--右外连接
select tname as 教师名字,Cname as 课程名称
from Teacher right outer join Course on Teacher.cid=Course.cid

右外连接

这个很好理解吧。

交叉连接

这个连接很白痴,我一下子不知道他可以干嘛。他的功能是列出所有可能的排列组合……
自己看图吧,我很无语。

1
2
select tname as 教师名字,Cname as 课程名称
from Teacher cross join Course

交叉连接

集合操作

还是很简单的,只有一个重点。就是两个集合操作时,必须要列名,列数,列的顺序,数据类型都相同,才可以进行集合操作。

UNION

1
2
3
4
5
6
7
select *
from Teacher
where Teacher.tid=1
union
select *
from Teacher
where Teacher.tname='刘惠'

UNOIN

INTERSECT

1
2
3
4
5
6
7
select *
from Teacher
where Teacher.tid>1
intersect
select *
from Teacher
where Teacher.tid<3

MINUS

MINUS是减法的意思,在集合里就是差。前一个集合去除后一个集合。而且,注意了,这个用法在SQL_SEVER2008也是不能用的,在Oracle中可以使用。然而我的SQLdeveleper奇慢无比,我就不截图了……

1
2
3
4
5
6
7
select *
from Teacher
where Teacher.tid>1
minus
select *
from Teacher
where Teacher.tid=3