关于SQL的联接

今天没事好好看了下联机帮助,总结下SQL的联接。。。

联接基础知识

通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据。联接表示如何使用一个表中的数据来选择另一个表中的行。

联接条件通过以下方法定义两个表在查询中的关联方式:

指定每个表中要用于联接的列。典型的联接条件在一个表中指定外键,在另一个表中指定与其关联的键。

指定比较各列的值时要使用的逻辑运算符(=、<> 等)。 
可在 FROM 或 WHERE 子句中指定联接。联接条件与 WHERE 和 HAVING 搜索条件组合,用于控制 FROM 子句引用的基表中所选定的行。

在 FROM 子句中指定联接条件有助于将这些联接条件与 WHERE 子句中可能指定的其它搜索条件分开,指定联接时建议使用这种方法。简化的 SQL-92 FROM 子句联接语法如下:

FROM first_table join_type second_table [ON (join_condition)]

SQL Server 处理联接时,查询引擎从多种可能的方法中选择最高效的方法处理联接。尽管不同联接的物理执行采用多种不同的优化,但是逻辑序列都:

  • 应用 FROM 子句中的联接条件。
  • 应用 WHERE 子句中的联接条件和搜索条件。
  • 应用 HAVING 子句中的搜索条件。


说明  无法在 ntext、text 或 image 列上直接联接表。不过,可以用 SUBSTRING 在 ntext、text 或 image 列上间接联接表。例如,SELECT * FROM t1 JOIN t2 ON SUBSTRING(t1.textcolumn, 1, 20) = SUBSTRING(t2.textcolumn, 1, 20) 在表 t1 和 t2 中的每个文本列前 20 个字符上进行两表内联接。此外,另一种比较两个表中的 ntext 或 text 列的方法是用 WHERE 子句比较列的长度,例如在 pub_info 表上执行自联接:

WHERE DATALENGTH(p1.pr_info) = DATALENGTH(p2.pr_info)


使用联接
联接条件可在 FROM 或 WHERE 子句中指定,建议在 FROM 子句中指定联接条件。WHERE 和 HAVING 子句也可以包含搜索条件,以进一步筛选联接条件所选的行。

联接可分为以下几类:

内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students 和 courses 表中学生标识号相同的所有行。

外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:

LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

交叉联接。
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

使用自联接

表可以通过自联接与自身联接。例如,可以使用自联接查找居住在 California 的 Oakland 相同邮码区域中的作者。

由于此查询涉及 authors 表与其自身的联接,因此 authors 表以两种角色显示。若要区分这两个角色,必须在 FROM 子句中为 authors 表提供两个不同的别名(au1 和 au2)。这些别名用来限定其余查询中的列名。下面是自联接 Transact-SQL 语句示例:

USE pubs
SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname
FROM authors au1 INNER JOIN authors au2
   ON au1.zip = au2.zip
WHERE au1.city = 'Oakland'
ORDER BY au1.au_fname ASC, au1.au_lname ASC联接三个或更多的表虽然每个联接规范只联接两个表,但 FROM 子句可包含多个联接规范。这样一个查询可以联接若干个表。pubs 数据库的 titleauthor 表提供了一个很好的示例,该示例说明联接两个以上的表非常有用。下面的 Transact-SQL 查询可找到特定类型的所有书名及相应的作者姓名:USE pubs
SELECT a.au_lname, a.au_fname, t.title
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id JOIN titles t
   ON ta.title_id = t.title_id
WHERE t.type = 'trad_cook'
ORDER BY t.title ASC


附: 函数NULLIF 的妙用 <转自CSDN>

ID Name Type
1  aaa  1
2  bbb  2
3  ccc  4
4  eee  8 

这样的一个表,有这样的几条记录.我想这样简单的一个表,所有的查询操作,大家都没有问题.现在用户要求,进行排序时要将 Type=4的排的首位,你用的最简便的方法是什么如果你对NULLIF函数有印像的话,那么这个问题就很好解决
SELECT * FROM [table] ORDER BY NULLIF([Type],4)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值