SQL server 第三篇 多表联接查询

来源:互联网 发布:c语言射击游戏 编辑:程序博客网 时间:2024/06/06 20:19

一、多表联接查询的分类

多表联接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征。

联接查询可分为三大类,分另为:

1.  内联接。

2.  外联接。

3.  交叉联接。

那么我们一起来看一下如何使用多表联接查询。

A.       内联接:内联接是最典型、最常用的联接查询,它根据表中共同的列来进行匹配,只有满足匹配的条件的数据才能被查询出来。通常,两个表存在主外键关系时会使用到内联接查询。

内联结常使用“=”比较运算符来判断两列数据是否相等,在这里我们通过几个实例来学习内联接查询。

a)        先在SQL Server 2005中新建两个表usersTable和usersNote,两表的内容如下面的图中所示。

  

 

 

 

 

表usersTable

 

表usersNote

 

 

b)        在建好相应的表后,我们就可以进行多表查询了,首先内联接我们有两种方式来查询。

第一种:直接在Where条件里通过表达式来进行表之间的关联。

 

select usersTable.myuser,usersTable.mypwd,

usersNote.useraddress,userphonenumber

--查询显示dbo.usersTabledbo.usersNote表中的指定的内容

from dbo.usersTable,dbo.usersNote

--内联接两表

where usersTable.myuser=usersNote.username

--两表匹配的条件

 

在SQL 2005中的查询结果如下:

 

 

第二种:通过使用Inner Join关键字进行表之间的关联。

 

select usersTable.myuser,usersTable.mypwd,

usersNote.useraddress,userphonenumber

 

from dbo.usersTable inner join dbo.usersNote

on (usersTable.myuser=usersNote.username)

 

查询结果如下:

 

 

B.        外联接:外联接又可分为左外联接、右外联接、完整联接三种。

外联接与内联接区别在于,不仅显示两个表关联字段匹配的记录,同时不匹配记录根据外联接类型也会显示。

a)        左外联接:Left Join   或  Left Outer Join。

左外联接的结果集包括Left Join子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有区配行,则在相关联的结果集行中,右表的所有选择列均为空值。

 

以下是左外联接语句:

 

select usersTable.myuser,usersTable.mypwd,

usersNote.useraddress,userphonenumber

--查询显示dbo.usersTabledbo.usersNote表中的指定的字段

from dbo.usersTable left join dbo.usersNote

 

on usersTable.myuser=usersNote.username

--左外联接两表

 

查询结果如下图:

可以看到最后一行的右表中不匹配的行显示部分均为NULL。

 

 

b)        右外联接:Right Join 或 Right Outer Join.

右外联接是左外联接的反向联接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将左表返回空值。

 

以下是右外联接语句:

 

select usersTable.myuser,usersTable.mypwd,

usersNote.useraddress,userphonenumber

--查询显示dbo.usersTabledbo.usersNote表中的指定的字段

from dbo.usersTable left join dbo.usersNote

 

on usersTable.myuser=usersNote.username

--右外联接两表

 

查询结果如下图:

可以看到最后一行的左表中不匹配的行显示部分均为NULL

 

 

c)        完整外联接:Full Join 或 Full Outer Join。

完整外联接返回左表和右表中的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列包含空值,如果表之间有区配行,则整个结果集包含相应表的数据值。

 

以下的完整外联接语句:

    

select *

--查询显示两表的所有字段

from dbo.usersTable full join dbo.usersNote

on (usersTable.myuser=usersNote.username)

--完整外联接

 

 

select usersTable.myuser,usersTable.mypwd,

usersNote.useraddress,userphonenumber

--查询两表指定的字段

from dbo.usersTable full join dbo.usersNote

on (usersTable.myuser=usersNote.username)

--完整外联接

 

 

C.        交叉联接:交叉联接就是表之间没有任何关联条件,查询将返回左表与右表逐个联接的所有行,就是左表的的每一行与右表的所有行一一组合,相当于两个表相乘。

因为交叉联接两表之间没有关联,所以再新建两个没有关联的表进行,实验。

 

表Table_1

 

 

表Table_2

 

 

以下是交叉联接语句和相应的查询结果:

 

select * from dbo.Table_1,dbo.Table_2

 

 

 

select table_1.title ,table_2.username,table_1.showneirong

--查询两表中的指定字段

from Table_1,Table_2

--交叉联接

 

 

 

 

以上的操作中只使用了两个表,在实际使用中有时会有三个或更多的表联接使用,但其原理都是一样的。

原创粉丝点击