认识Joins

查询语句的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

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值