2007年8月10日星期五

【SQL SERVER】SQLl内、外、左、右连接

在数据库应用中,经常要涉及从两个或更多的表中查询数据,这就需要使用连接查询。
其格式如下:
SELECT COLUMN_NAME,C O L U M N _ N A M E [ , . . . n ]
FROM TA B L E _ N A M E,TA B L E _ N A M E [ , . . . n ]
WHERE TABLE_NAME.COLUMN_NAME JOIN_OPERATOR TA B L E _ N A M E . C O L U M N _ N A M E
上述的连接操作符(J O I N _ O P E R ATO R)可以是:=、>、<、> =、< =、! =、< >、! >、! <、= *、* =。
在A N S I中,"="连接应该写成Inner Join;"* ="连接应该写成LEFT OUT JOIN;"= *"连接应该写成" RIGHT OUT JOIN"。
在SQL SERVER中,这些写法都可以用。但是,A N S I规定的写法是INNER JOIN等标志。一般而言,在任何连接中,都使用"主键=外键"的连接查询条件。
---------------------------------------------------------------------------------

非限制连接(CROSS JOIN),就是指不带W H E R E子句的查询。在数学上,就是表的笛卡尔积。若R表和S表非限制连接,而且R表有X行,S表有Y行,那么结果集是X * Y行。即:R表的一行对应着S表的所有行。在应用中,非限制连接产生的是无意义结果集,但在数据库的数学模式上有重要的作用。
-------------------------------------------------------------------------
自然连接(INNER JOIN)也叫内连接。我们先看下面的例子:

SELECT PUB_NAME,TITLE
FROM TITLES,PUBLISHERS
WHERE TITLES.PUB_ID=PUBLISHERS.PUB_ID
或写成:
SELECT PUB_NAME,TITLE
FROM TITLES INNER JOIN PUBLISHERS
ON TITLES.PUB_ID=PUBLISHERS.PUB_ID
其中,INNER JOIN是SQL Server的缺省连接,可简写为J O I N。在J O I N后面指定哪些表作连接。O N后面指定了连接的条件。
以上操作的过程如下:
1) 从T I T L E S表中取出一条符合其条件的记录。
2) 扫描P U B L I S H E R S表,分别检查每条记录是否在连接属性上同表T I T L E S取出的记录相
3) 相等就显示信息。继续从表T I T L E S中取下一条记录,重复步骤2。其实,两个或多个表要做连接,那么这些表之间必然存在着主键和外键的关系。所以,只需要将这些键的关系列出,就可以得出表 连接的结果。如上例中, P U B _ I D是P U B L I S H E R S表的主键, P U B_ I D又是TI T L E S表的外键,参照P U B L I S H E R S表中的P U B _ I D .所以,这两个表的连接条件就是T I T L E S.PUB_ID=PUBLISHERS. PUB_ID。
-----------------------------------------------------------------------
外连接(OUTER JOIN)允许限制一张表中的行,而不限制另一张表中的行。
下面举两个例子来说明外连接的用法。请比较这两个例子。
例显示所有的书名(无销售记录的书也包括在内,"*"在左边表示不限制左边表的数
SELECT TITLES.TITLE_ID,title=convert(char(38),TITLE),QTY
FROM TITLES,SALES
WHERE TITLES.TITLE_ID *= SALES.TITLE_ID
或写为:
SELECT TITLES.TITLE_ID,title=convert(char(38),TITLE),QTY
FROM TITLES LEFT OUTER JOIN SALES
ON TITLES.TITLE_ID = SALES.TITLE_ID

外连接的方法有两种:
• A *= B 包括第一张表A的所有行在内,而不考虑语句限制(如: A . t i t l e _ i d = B . t i t l e _ i d)。
相当于LEFT OUT JOIN。
• A =* B 包括第二张表B的所有行在内,而不考虑语句限制(如: A . t i t l e _ i d = B . t i t l e _ i d)。
相当于RIGHT OUT JOIN。
创建外连接规则:
1) 外连接显示外部表中的所有行,包括与相关表不相配的行在内。
2) 外连接只能在两张表之间进行。
3) 不能在内部表上使用IS NULL检索条件。

没有评论: