sql的多表链接查询中

来源:互联网 发布:好看的便签软件 编辑:程序博客网 时间:2024/05/16 23:53
联接的原理是这样的
如有一张表A(4条数据),一张表B(5条数据),2张表通过ID关联SELECT *FROM A INNER JOIN B ON A.ID=B.ID首先A表与B表做笛卡尔集 也就是4*5 =20条数据先将这20条数据生成一张虚拟表然后通过ON条件去筛选该虚拟表最终将输出符合条件(A.ID=B.ID)的结果集(也就是查询器里所看到的数据)以前看到有人说联接 要把小表放前面 性能会高,位置你可随便换,SQL优化器会自动优化的,自己测试CTRL+L(我用的是SQL2005)
如果是外部联接left join ,right join,与上面有一点不一样。如:SELECT *    FROM A LEFT JOIN B ON A.ID=B.ID首先还是生成20条数据的虚拟表然后通过ON条件筛选由于用到LEFT, 将添加外部行, 将以左输入的表(A表)作为基表添加未在B中出现的数据外部行,,然后外部行中的数据B表值将以NULL值填充,总数据将是4条(ID唯一的情况下),格式像这样,B表中未有A4的IDA1,B1A2,B2A3,B3A4,NULL条件位置可以任意换 但表但表的循序在外部联接就不能乱换了
如果改成这样了SELECT *  FROM B LEFT JOIN A ON A.ID=B.ID或SELECT *  FROM A Right JOIN B ON A.ID=B.ID原理同上,结果将变成这样,总5条数据,A4与B4未有ID匹配,如果ID不是主键可能B5那行的A表也许会有值B1,A1B2,A2B3,A3B4,NULLB5,NULL 
 
多联接的写法与上面一样SELECT *FROM A JOIN B ON A.ID=B.ID     JOIN C ON B.ID=C.ID原理同上 先A与B生成虚拟表,然后再用该虚拟表与C关联又生成虚拟表,就这样重复生成。联接里面还有种老语法这样写的,效果都一样SELECT *FROM A,B,CWHERE A.ID=B.ID AND B.ID=C.ID这不属于SQL标准写法,还是用join比较好,上面这种写法,如果忘记写条件的话,就会出现大错,没条件表数据会直接做笛卡尔积 
关于多联接的表的循序问题,我想SQLSERVER优化自动会优化的就拿我现在的一个数据库例子来说我有3张表 一张客户Customer(数据5000多),一张订单主表OrderMaster(8W多),一张订单明细OrderDetail(200多W)不管是SELECT *FROM Customer JOIN OrderMaster ON Customer.CustomerID=OrderMaster.CustomerID     JOIN OrderDetail ON OrderMaster.OrderID=OrderDetail.OrderID还是SELECT *FROM OrderDetail JOIN OrderMaster ON OrderMaster.OrderID=OrderDetail.OrderID      JOIN  Customer ON Customer.CustomerID=OrderMaster.CustomerID运行查看执行计划CTRL+LSQL优化器总是会先扫描Customer这张表(数据量很小),把他做为最外输入表,这点也符合了上面的原理,要尽量先生成最小数据虚拟表,来提高性能。具体我也就是这样理解的,写了挺久,希望对你有帮助,还有联接在2005有3种算法,迭代循环,合并,哈希,有兴趣自己找找,性能都不一样,一般优化器会根据表结构与条件选择最好的联接算法,但有时候也需人工指定算法达到最高性能。

 

原创粉丝点击