落落空间

缘来是java
posts - 12, comments - 12, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

sql内、外、左、右连接

Posted on 2007-06-08 18:12 落落 阅读(2055) 评论(0)  编辑  收藏 所属分类: database
在数据库应用中,经常要涉及从两个或更多的表中查询数据,这就需要使用连接查询。
              其格式如下:
              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检索条件。

只有注册用户登录后才能发表评论。


网站导航: