今天有同学在群里面问了这样一个问题:
select t1.*,t2.* from T1 t1 ,T2 t2 where t1.a = t2.a;
和
select t1.*,t2.* from T1 t1 join T2 t2 on t1.a = t2.a;
是一样的吗?
通过伟大的搜索引擎,我找到这样一个回答:
FROM T1,T2是ANSI SQL-89的旧语法,用逗号分隔FROM子句出现的表名,没有JOIN关键字,也没有ON子句,它只支持交叉联接和内联接,不支持外联接;如果没有指定联接条件就是一个交叉联接。
新的ANSI SQL-92去掉了逗号,引入了JOIN和ON,支持交叉联接、内联接和外联接。
优化器为使用上面两种语法的语句生成了相同的执行计划,性能是一样的。
虽然提问的同学对这个答案很满意,但是还是有同学对这个答案提出了自己的怀疑。于是我试图去证明这个答案的正确性。
由于已经找不到 SQL-89 的语法标准,所以关于 SQL-89 和 SQL-92 的比较只好暂时搁置。
我们来看一下 MySQL 优化器为上面两种语法的语句的执行计划是不是一样的:
mysql> explain extended select wp_users.display_name, wp_posts.post_title from wp_users, wp_posts where wp_users.ID = wp_posts.post_author;
mysql> show warnings;
mysql> explain extended select wp_users.display_name, wp_posts.post_title from wp_users join wp_posts on wp_users.ID = wp_posts.post_author;
mysql> show warnings;
我直接使用 wordpress 数据库,分别使用两种语法写了两条查询语句:
select wp_users.display_name, wp_posts.post_title from wp_users, wp_posts where wp_users.ID = wp_posts.post_author
select wp_users.display_name, wp_posts.post_title from wp_users join wp_posts on wp_users.ID = wp_posts.post_author
使用 mysql explain extended 和 show warnings 命令得到 mysql 优化器优化后的查询语句是一模一样的。
select `blog`.`wp_users`.`display_name` AS `display_name`,`blog`.`wp_posts`.`post_title` AS `post_title` from `blog`.`wp_users` join `blog`.`wp_posts` where (`blog`.`wp_posts`.`post_author` = `blog`.`wp_users`.`ID`)
参考
T-SQL查询笔记4: FROM T1,T2与联接的区别
http://www.cnblogs.com/gdjlc/archive/2012/03/06/2382820.html
MySQL执行计划解读
http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html
845 total views, 1 views today