在数据库的应用中我们不免用到数据库中各个表的连接问题,在这里从别的地方摘录了一些,便于自己学习,也供大家参考。
数据库中的连接问题(一)
连接查询的格式:
在数据库应用中,经常要涉及从两个或更多的表中查询数据,这就需要使用连接查询。其格式如下:
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),就是指不带WHERE子句的查询。在数学上,就是表的笛卡尔积。若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的缺省连接,可简写为JOIN。在JOIN后面指定哪些表作连接。ON后面指定了连接的条件。以上操作的过程如下:
1) 从TITLES表中取出一条符合其条件的记录。
2) 扫描PUBLISHERS表,分别检查每条记录是否在连接属性上同表TITLES取出的记录相等。
3) 相等就显示信息,继续从表TITLES中取下一条记录,重复步骤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.title_id = B. title_id),相当于LEFT JOIN。
" A =* B 包括第二张表B的所有行在内,而不考虑语句限制(如: A.title_id = B. title_id),相当于RIGHT JOIN。
创建外连接规则:
1) 外连接显示外部表中的所有行,包括与相关表不相匹配的行在内。
2) 外连接只能在两张表之间进行。
3) 不能在内部表上使用IS NULL检索条件。
数据库中的连接问题(二)
左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行并不是像内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
比如:职员表包括:name,jobid。有如下数据 mike 01 jack 02 rose 03 职务表包括jobid,jobname。有01 engineer02 secretry。现在显示
name,jobname两列。如果通过jobid的内部连接做,结果为:mike engineer ,jack secretry .若用左连接(左边表的数据必显示)结果为
mike engineer ,jack secretry,rose.右连接则必显示右边表对应的数据
有两个表:
table1
user_id user_name user_pss
1 aaa a
2 bbb b
3 ccc c
table2
user_id user_power
1 111000
2 000111
使用sql语句查询
正常状态:
select table1.user_id,
table1.user_name,
table2.user_power
from table1,table2
where table1.user_id = table2.user_id
但是这样检索到的数据只有两条:
user_id user_name user_power
1 aaa 000111
2 bbb 111000
因为第三条数据在table2中沒有关联。
这时使用左连接查询:
select table1.user_id,table1.user_name,table2.user_power
from table1,table2
where table1.user_id (+)= table2.user_id
就可以得到如下的结果:
user_id user_name user_power
1 aaa 000111
2 bbb 111000
3 ccc (null)
说明,左或右连接查询实际上是指定以哪个表的数据为准,而默认(不指定左或右连接)是以两个表中都存在关键列的数据的为准。
内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来;左连接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来;右连接是只要右边表中有记录,数据就能检索出来。
左连接就是以左边的表记录为主,右连接就是以右边的表记录为主;具体的sql可以在做个有左右连接的数据窗口,然后导出去看一下
比如在如下语句:
select * from testdata!customer;
left outer join testdata!orders;
on customer.cust_id=orders.cust_id
如果是左连接该命令将返回join左侧表(customer)中的所有记录以及右侧表中匹配的记录;右连接则反之,返回orders中所有记录和customer的匹配记录;完全连接返回两个表中的所有记录。