查询语句的FROM子句在逻辑上是第一条要处理的子句,在From子句内可以用表运算符对输入的表进行操作。Microsoft server 2008支持四种表运算符---JOIN,APPLY,PIOVT,UNPIVOT。JOIN表运算符是ANSI的标准,而其他3种是T-SQL对标准的扩展,这3种是在SQL Server 2005中引入的。先讨论JOIN表运算符。
JOIN表运算符对两个输入表进行操作。联接有三种基本类型:交叉联接,内联接和外联接。这三种联接的区别是它们采用的逻辑查询处理步骤各不相同,每种联接都有一套不同的步骤。交叉联接只有一个步骤---笛卡尔积(Cartesian Product);内联接有两个步骤---笛卡尔积,过滤(Filter);外联接有三个步骤---笛卡尔积,过滤,添加外部行。
交叉联接(Cross Join):
在逻辑上,交叉联接是一种最简单的联接,只实现一个笛卡尔积步骤。如果一个表有m行,而另一个表有n行,将得到m*n行的结果集。
ANSI SQL-92语法:
SELECT *
FROM Table1 CROSS JOIN Table2;
如果Table1有10行,Table2有8行,那么这个查询会返回一个80行的结果集。
内联接(Inner Join):
内联接有2个逻辑查询步骤:它首先像交叉联接一样,对两个输入表进行笛卡尔积运算;然后根据根据用户指定的谓词结果对结果集进行过滤。
ANSI SQL-92语法:
SELECT *
FROM Table1 Join Table2
ON Table1.a = Table2.a
外联接(OUTER Join):
外联接的逻辑查询步骤是在内联接后加上一个外联接特有的第三步:添加外部行。在外联接中,要把一个表标记为"保留的"表,可以在表名之间使用关键字LEFT OUTER JOIN,
RIGHT OUTER JOIN, 以及FULL OUTER JOIN,其中OUTER关键字是可选的。LEFT关键字表示左边表的行都是保留的。外联接的第三个逻辑查询处理步骤就是要识别保留表中按照ON条件在另一个表找不到与之匹配的那些行,再把这些行添加到联接的前两个步骤生产的结果表中;对于来自联接的非保留表的那些列,追加的外部行中的这些列则用NULL作为占位符。
ANSI SQL-92语法:
SELECT *
FROM Table1 LEFT OUTER JION Table2
ON Table1.a = Table2.a
注:以上内容摘自<<Microsoft SQL Server 2008 T-SQL Fundamentals>> By Itzik Ben-GAN
**********************************************************************************************************************************************************************************
实验:
新建数据库和表,然后在表中添加数据:
IF DB_ID('Lab') IS NULL
Create DataBase Lab;
USE Lab;
IF OBJECT_ID('dbo.employee','U') IS NOT NULL
Drop table dbo.employee;
Create Table dbo.employee
(
empid INT NOT NULL,
emName Varchar(30) NOT NULL,
Dept Varchar(20) NOT NULL,
Constraint PK_employee Primary Key(empid)
);
Insert into dbo.employee(empid,emName,Dept)
Values
(1,'a','IVS'),
(2,'b','MFG'),
(3,'c','IVS');
IF OBJECT_ID('dbo.Department','U') IS NOT NULL
Drop table dbo.Department;
Create Table dbo.Department
(
DepName Varchar(30) Not NULL,
Addre Varchar(10) NOt NULL,
DepBoss Varchar(30) Not NULL,
Constraint PK_DepName Primary Key(DepName)
);
Insert into dbo.Department(DepName,Addre,DepBoss)
Values
('IVS','1F','X'),
('MFG','2F','Y'),
('CK','3F','Z');
交叉联接
查询语句:
Select *
from dbo.employee AS E
Cross Join dbo.Department AS D
内联接
查询语句:
Select *
from dbo.employee AS E
Join dbo.Department AS D
ON E.Dept = D.DepName
左外联接
查询联接:
Select *
from dbo.Department AS D Left Join dbo.employee AS E
ON D.DepName = E.Dept