T-SQL表连接(内连接,外连接,交叉连接)

来源:未知 责任编辑:责任编辑 发表时间:2013-12-18 11:36 点击:

1.旧语法和新语法
旧语法由ANSI SQL-89引入的,它与新语法的区别在与没有JOIN关键字和ON子句:SELECT T1.*,T2.* FROM T1,T2 WHERE
新语法由ANSI SQL-92引入的,它引入了JOIN关键字,ON子句 SELECT T1.*,T2.* FROM T1 JOIN T2 ON <子句> WHERE
旧语法ANSI SQL-89只支持内连接和交叉连接,不支持外连接
2.交叉连接(CROSS JOIN)
我现在使用cross join来查询Employee 表的信息
[sql]
--cross join  
SELECT  E1.Name,E1.Title AS emp1,  
        E2.Name,E2.Title AS emp2  
FROM Employee AS E1  www.2cto.com    
CROSS JOIN Employee AS E2;  
查看执行计划

 
  然后使用ANSI SQl-89旧语法来实现
[sql]
--ANSI SQL-89语法  
SELECT  E1.Name,E1.Title AS emp1,  
        E2.Name,E2.Title AS emp2  
FROM Employee AS E1,Employee AS E2;<span>     </span>  
查看执行计划
 

 
通过对比查询计划,它们二者之间性能完全一样,虽然这样但是我还是建议你使用新语法
1)出于安全性的考虑,刚才我们提到过旧语法不能使用外连接,在查询中我们同时使用旧语法,新语法是个不明智的选择
2)便于维护
交叉连接应用
操作Product 表


 
添加索引:
[sql]
CREATE INDEX id_price on dbo.Product(Price);  
任务对于每个产品的价格占总价格,平均价格的百分比
下面使用子查询聚合查询
[sql]
SELECT ProductName,  
        Price,  
        CAST(Price/(SELECT SUM(Price) FROM Product)* 100 AS NUMERIC(5,2)) AS Psp,  
        CAST(Price/(SELECT AVG(Price) FROM Product)* 100 AS NUMERIC(5,2)) AS Asp  
FROM Product  
GROUP BY  
    ProductName,Price;  
看执行计划
 

 
从查询计划我们可以看出,刚才在price列上创建的索引被扫描了2次,一次用于SUM(),一次用于AVG(),如果没有包含聚合列的索引,需要为每个子查询扫描一次.
现在我们使用交叉连接来进行优化,我们可以在一个查询中计算所有的聚合,而且在查询中只需要对表,索引进行一次扫描
[sql]
WITH Aggs AS  
(  
    SELECT SUM(Price) AS sumP,AVG(Price) AS avgP  
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • SQL编程(一)
  • LINUX上RMAN自动备份脚本
  • sql server面试题
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
  • SQL小技巧系列 --- 行转列合并
  • sql server 列转行
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1