由于实践不足,总是忘记SQL Server 联接表查询的细节,在这里记录以便查询。
一、交叉联接
交叉联接仅执行一个罗辑查询处理阶段——笛卡尔积。也就是说,将一个输入表的每一行与另一个表的所有行匹配。所以,如果一个表有m行,另一个表有n行,得到的结果中有mxn行。
ANSI SQL-92语法:
select c.custid,e.empid
from Sales.Customers as c
cross join HR.Employees as e;
ANSI SQL-89语法:
select c.custid,e.empid
from Sales.Customers as c, HR.Employees as e;
二、内部联接
内部联接应用两个罗辑查询处理阶段——先应用笛卡尔积,然后按指定的谓词筛选行。
ANSI SQL-92语法:
select e.empid,e.firstname,e.lastname,o.orderid
from HR.Employees as e
join Sales.Orders as o
on e.empid=o.empid;
使用ANSI-92语法,应在表名之间使用 INNER JOIN 关键字。由于内部联接是默认联接,所以 INNER 关键字是可选的,可以仅指定 JOIN 关键字。
ANSI SQL-89语法:
select e.empid,e.firstname,e.lastname,o.orderid
from HR.Employees as e, Sales.Orders as o
where e.empid=o.empid;
三、外部联接
外部联接应用内部联接所应用的两个罗辑处理阶段(笛卡尔积和ON筛选),再加上一个“添加外部行”的第三阶段,此阶段是此联接类型唯一具有的阶段。
在外部联接中,需要在表名之间使用关键字LEFT OUTER JOIN、RIGHT OUTER JOIN或FULL OUTER JOIN标记一个表为“保留”表。OUTER关键字是可选的。LEFT关键字表示保留左侧表中的行,RIGHT关键字表示保留右边表中的行,FULL关键字表示左侧和右侧表中的行都保留。外部联接的第三个罗辑查询处理阶段识别保留表中基于ON谓词未能与另一个表匹配的行,此阶段添加这些行到前两个联接阶段生成的结果表中,在这些外部行中,对于联接非保留测的的属性将使用NULL作为占位符。
select c.custid,c.companyname,o.orderid
from Sales.Customers as c
left outer join Sales.Orders as o
on c.custid=o.custid;
如果Customers表中有客户没有任何订单,输出中,来自Orders表的属性中这个客户返回的是NULL标记。