mysql 左右内外连接

今天在研究mysql 左右内外交叉连接 资料上说mysql不支持full join 也就是传说中的外连接
但是当我试着去执行full join的时候
mysql> select * from ta full join tb ;
竟然得到了结果 而且和下面几句语句是等效的
mysql> select * from ta , tb ;
select * from ta join tb ;
select * from ta cross tb ;
select * from ta inner join tb ;

一头雾水啊 这尼玛不是不支持full join么 气愤执行 执行了fuck join语句。。
mysql> select * from ta fuck join tb ;
另外大吃一惊。。尼玛竟然不报错。。还是一样的笛卡尔积。。好吧 我服了
当我无聊试着用on条件表达式的时候 奇迹出现了 ~

mysql> select * from ta fuck join tb on ta.id=tb.id;
ERROR 1054 (42S22): Unknown column ‘ta.id’ in ‘on clause’
mysql竟然报错了!!!没错 就是报错了了!没有ta.id这个列!
尼玛我豁然开朗 马上执行另外一条语句!
mysql> select * from ta fuck join tb on fuck.id=tb.id;
得到所有结果

至此柳暗花明
原来mysql把fuck当做了表ta的别名 也就是说任何 字段 只要不是inner cross 这两个关键字 mysql都是把它当做ta的别名的。

ps:
1
ta join tb= ta inner join tb 缺省为inner内连接
2
mysql中也没有full join full被当做别名
select * from ta full join tb ;
==>
select * from ta full inner join tb ;
3
outer join 其实就是 left join <=> left outer join
right join <=> right outer join
好像在标准sql中还包含full outer join 但是mysql中没有full join
这里 full outer join语法是错误的 因为full已经被当做了别名 但是mysql又不认识outer join 所以语法错误

4 cross join <=> innner join <=> join

In MySQL, CROSS JOIN is a syntactic equivalent to INNER JOIN (they can replace each other). In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise.

5 inner join (join | cross join) 若没有指定 连接条件 那么等效于 ta,tb 笛卡尔积

6 left join ,right join 必须指定条件 否则语法错误

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">