数据库中的连接问题

   在数据库的应用中我们不免用到数据库中各个表的连接问题,在这里从别的地方摘录了一些,便于自己学习,也供大家参考。

数据库中的连接问题(一)

连接查询的格式:

在数据库应用中,经常要涉及从两个或更多的表中查询数据,这就需要使用连接查询。其格式如下:
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的匹配记录;完全连接返回两个表中的所有记录。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值