基本连接
是数据库中缀基本的连接,就是用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='刘惠'
|
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
|