连接查询的格式:
在数据库应用中,经常要涉及从两个或更多的表中查询数据,这就需要使用连接查询。
其格式如下:
SELECT COLUMN_NAME,COLUMN_NAME[,...n]
FROM TABLE_NAME,TABLE_NAME[,...n]
WHERE TABLE_NAME.COLUMN_NAME JOIN_OPERATOR TABLE_NAME.COLUMN_NAME
上述的连接操作符(JOIN_OPERAOR)可以是:
=、>、<、> =、< =、! =、< >、! >、! <、= *、* =。
在ANSI中,“=”连接应该写成Inner Join;
“* =”连接应该写成LEFT OUT JOIN;
“= *”连接应该写成“RIGHT OUT JOIN”。
在SQL SERVER中,这些写法都可以用。
一、非限制连接
非限制连接(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。
其实,两个或多个表要做连接,那么这些表之间必然存在着主键和外键的关系。所以,
只需要将这些键的关系列出,就可以得出表连接的结果。如上例中, PUB_ID是PUBLISHERS
表的主键, PUB_ ID又是TITLES表的外键,参照PUBLISHERS表中的PUB_ ID .所以,这两个表
的连接条件就是TITLES.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 JOIN。
• A =* B 包括第二张表B的所有行在内,而不考虑语句限制(如: A . t i t l e _ i d = B . t i t l e _ i d)。
相当于RIGHT JOIN。
创建外连接规则:
1) 外连接显示外部表中的所有行,包括与相关表不相配的行在内。
2) 外连接只能在两张表之间进行。
3) 不能在内部表上使用IS NULL检索条件。