详解数据库的各种联接

        在查询数据库的时候,如果涉及到两个或多个数据表中检索数据,那么你就要用到联接查询了。

        联接分为:内联接、外联接、交叉联接。而外联接又分为:左向外联接、右向外联接、完整外联接。

        下面是我建的两个用来测试的表,student和class。

        


内联接


        联接的默认联接就是内连接,我个人感觉这个联接也是最简单的一种联接。用于返回两个表中所有匹配的行。

        我对默认是这样理解的,用的最多。事实也是这样的,就目前为止,我用的是最多的就是内联接。

        内联接的格式:数据表1 inner join 数据表2 on 联接表达式。

        例如选出学号为001的学生,要求显示SID,SNAME,CNAME

        select sid,sname,cname from student inner join class on classid=cid(其中inner可以去掉)

        但是,在之前我一直是这样写的:select sid,sname,cname from student,class where classid=cid

        

        注:推荐数据库字段命名是每个字段前加上表明的缩写(3-5个字符)


外连接之左外联接


        格式为:数据表1 left join 数据表2 on 联接表达式    或者   数据表1 left outer join 数据表2 on 联接表达式

        左外联接返回集中包括数据表1中所有的记录,而不仅仅是链接字段所匹配的记录。如果数据表1的某条记录在数据表2中没有匹配的记录,则结果集相应的有关数据表2的所有字段将为空值。

        为实现此例子,我们将003的的classid改为4。

        update student set classid='4' where sid='003'

        然后我们进行左外联接的查询

        select sid,sname,cname from student left outer join class on classid=cid(outer可以省略)

        下面两图分别是内联接和左外联接的查询结果:

        


外联接之右外联接


        格式为:数据表1 right join 数据表2 on 联接表达式    或者   数据表1 right outer join 数据表2 on 联接表达式

        和左外联接类似。结果集中包含数据表2中所有的记录,而不仅仅是链接字段所匹配的记录。如果数据表2的某条记录在数据表1中没有匹配的记录,则结果集相应的有关数据表1的所有字段将为空值。

        如果将左联接中的student和class的位置换一下,然后将left改成right,那么结果将一样,所以关于这个例子我就不在这写了。


外联接之全联接


        格式为:数据表1 full join 数据表2 on 联接表达式    或者   数据表1 full outer join 数据表2 on 联接表达式

        结果集包含两个数据表中所有的记录,当某条记录在另一个数据表中没有匹配记录时,则将另一个数据表中的选择列表字段指定为空值。

        不多说,直接看例子:

        select sid,sname,cname from student full outer join class on classid=cid(outer可以省略)

        


交叉联接


        在说交叉联接,需要引入一个数学概念,笛卡尔积。

        笛卡尔积又叫直积。假设集合A={a,b},集合B={0,1,2},那么两个集合的笛卡尔积为:{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。

        如果A是学生集合,B是所有课程集合,那么A与B的笛卡尔积表示所有可能的选课情况。

        知道了笛卡尔积,那么我们现在可以看数据库中的笛卡尔积。

        格式:数据表1 cross join 数据表2

        返回集包括数据表1中所有的记录,以及数据表2中的每条记录与数据表2中所有记录的组合。

        例

        select * from student cross join class

        

总结:

        多表联接在数据库查询中会经常用到,还是多多熟悉为好,在遇到具体需求时,不至于不知道还可以这样查。

        另外需要说一点就是:在查询的时候,尽量不要写*,而要把要查询的列都写出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值