当前位置:操作系统 > Unix/Linux >>

详解数据库的各种联接

详解数据库的各种联接

 在查询数据库的时候,如果涉及到两个或多个数据表中检索数据,那么你就要用到联接查询了。
  联接分为:内联接、外联接、交叉联接。而外联接又分为:左向外联接、右向外联接、完整外联接。
  下面是我建的两个用来测试的表,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
 
总结:
  多表联接在数据库查询中会经常用到,还是多多熟悉为好,在遇到具体需求时,不至于不知道还可以这样查。
  另外需要说一点就是:在查询的时候,尽量不要写*,而要把要查询的列都写出来。
 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,