inner join和where区别

1 .WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。

INNER JOIN……ON子句产生的连接称为显性连接。(其他JOIN参数也是显性连接)WHERE 和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。

2.一般要使得数据库查询语句性能好点遵循一下原则:

  在做表与表的连接查询时,大表在前,小表在后

  不使用表别名,通过字段前缀区分不同表中的字段

  查询条件中的限制条件要写在表连接条件前

  尽量使用索引的字段做为查询条件

  在 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

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值