使用内联接

本文深入探讨了SQL内联接的概念,包括相等联接、不等联接及自然联接的原理与应用。通过示例展示了如何在Transact-SQL中实现这些联接,并解释了联接运算符和谓词的使用。重点介绍了等号以外的联接方式,如大于联接和不等联接,并提供了实际查询案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内联接是用比较运算符比较要联接列的值的联接。  
   
  在   SQL-92   标准中,内联接可在   FROM   或   WHERE   子句中指定。这是   WHERE   子句中唯一一种   SQL-92   支持的联接类型。WHERE   子句中指定的内联接称为旧式内联接。  
   
  下面的   Transact-SQL   查询是内联接的一个示例:  
   
  USE   pubs  
  SELECT   *  
  FROM   authors   AS   a   INNER   JOIN   publishers   AS   p  
        ON   a.city   =   p.city  
  ORDER   BY   a.au_lname   DESC  
   
  此内联接称为相等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。  
   
  下面是结果集:  
   
  au_id                 au_lname     au_fname   phone                   address                     city          
  -----------     --------     --------   ------------     ---------------     --------  
  238-95-7766     Carson         Cheryl       415   548-7723     589   Darwin   Ln.         Berkeley  
  409-56-7008     Bennet         Abraham     415   658-9932     6223   Bateman   St.     Berkeley  
   
  state   zip       contract   pub_id   pub_name                             city           state   country  
  -----   -----   --------   ------   ---------------------   --------   -----   -------  
  CA         94705   1                 1389       Algodata   Infosystems     Berkeley   CA         USA          
  CA         94705   1                 1389       Algodata   Infosystems     Berkeley   CA         USA          
   
  (2   row(s)   affected)  
   
  在结果集中,city   列出现两次。由于重复相同的信息没有意义,因此可以通过更改选择列表消除两个相同列中的一个。其结果称为自然联接。可以重新表述前面的   Transact-SQL   查询以形成自然联接。例如:  
   
  USE   pubs  
  SELECT   p.pub_id,   p.pub_name,   p.state,   a.*  
  FROM   publishers   p   INNER   JOIN   authors   a  
        ON   p.city   =   a.city  
  ORDER   BY   a.au_lname   ASC,   a.au_fname   ASC  
   
  下面是结果集:  
   
  pub_id   pub_name                             state         au_id                 au_lname     au_fname  
  ------   ---------------               --------   -----------     --------     --------   1389       Algodata   Infosystems     CA               409-56-7008     Bennet         Abraham  
  1389       Algodata   Infosystems     CA               238-95-7766     Carson         Cheryl  
   
  phone                   address                     city             state   zip       contract  
  ---------------     -------------   --------     -----   -----   ---------  
  415   658-9932     6223   Bateman   St.   Berkeley     CA         94705   1  
  415   548-7723     589   Darwin   Ln.       Berkeley     CA         94705   1  
   
  (2   row(s)   affected)  
   
  本示例中,publishers.city   没有出现在结果中。  
   
  使用等号以外的运算符的联接  
  也可以联接两个不相等的列中的值。用于内联接的运算符和谓词同样也可用于不相等联接。有关联接中可用的运算符和谓词的更多信息,请参见在表达式中使用运算符和   WHERE。    
   
  下面的   Transact-SQL   示例是一个大于   (>)   联接,可用于查找住在   Massachusetts   之后(按字母顺序排列)的州的   New   Moon   作家,Massachusetts   是   New   Moon   Books   的所在地。  
   
  USE   pubs  
  SELECT   p.pub_name,   p.state,   a.au_lname,   a.au_fname,   a.state  
  FROM   publishers   p   INNER   JOIN   authors   a  
        ON   a.state   >   p.state  
  WHERE   p.pub_name   =   'New   Moon   Books'  
  ORDER   BY   au_lname   ASC,   au_fname   ASC  
   
  下面是结果集:  
   
  pub_name                   state       au_lname                           au_fname                           state    
  ----------------   -------   --------------------   --------------------   -----    
  New   Moon   Books       MA         Blotchet-Halls                   Reginald                           OR  
  New   Moon   Books       MA         del   Castillo                       Innes                                 MI  
  New   Moon   Books       MA         Greene                                   Morningstar                     TN  
  New   Moon   Books       MA         Panteley                               Sylvia                               MD  
  New   Moon   Books       MA         Ringer                                   Albert                               UT  
  New   Moon   Books       MA         Ringer                                   Anne                                   UT  
   
  (6   row(s)   affected)  
   
  使用不等运算符的联接  
  很少使用不等联接   (<   >)。通常不等联接只有与自联接同时使用才有意义。例如,可以使用下面的不等   Transact-SQL   联接和自联接查找包含不同价格的两本或多本廉价(低于   $15)书的类别:  
   
  USE   pubs  
  SELECT   DISTINCT   t1.type,   t1.price  
  FROM   titles   t1   INNER   JOIN   titles   t2    
        ON   t1.type   =   t2.type  
        AND   t1.price   <>   t2.price  
  WHERE   t1.price   <   $15   AND   t2.price   <   $15  
   
   
   
  说明     表达式   NOT   column_name   =   column_name   与表达式   column_name   <   >   column_name   等效。  
   
   
  下面的   Transact-SQL   示例中,使用不等联接和自联接的组合查找   titleauthor   表中的所有行,在该表中有两行或多行具有相同的   title_id   但   au_id   号不同(即一本书有多个作者):  
   
  USE   pubs  
  SELECT   DISTINCT   t1.au_id,   t1.title_id  
  FROM   titleauthor   t1   INNER   JOIN   titleauthor   t2    
        ON   t1.title_id   =   t2.title_id  
  WHERE   t1.au_id   <>   t2.au_id  
  ORDER   BY   t1.au_id  
   
  下面是结果集:  
   
  au_id                         title_id  
  -----------                   --------  
  213-46-8915                   BU1032  
  267-41-2394                   BU1111  
  267-41-2394                   TC7777  
  409-56-7008                   BU1032  
  427-17-2319                   PC8888  
  472-27-2349                   TC7777  
  672-71-3249                   TC7777  
  722-51-5454                   MC3021  
  724-80-9391                   BU1111  
  724-80-9391                   PS1372  
  756-30-7391                   PS1372  
  846-92-7186                   PC8888  
  899-46-2035                   MC3021  
  899-46-2035                   PS2091  
  998-72-3567                   PS2091  
   
  (15   row(s)   affected)  

 

http://topic.youkuaiyun.com/t/20031031/21/2415911.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值