mysql as join_mysql as 别名与 join 多表连接语法
在MySQL中,使用AS關(guān)鍵字為字段、表、視圖取別名,或者不用as,用空格隔開:
SELECT (SELECT id a,title b FROM blog c limit 1)d;
使用字段別名,可以幫助我們有效的組織查詢的輸出結(jié)果。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在SQL標(biāo)準(zhǔn)中規(guī)劃的(Join)聯(lián)結(jié)大致分為下面四種:
1.內(nèi)聯(lián)結(jié):將兩個表中存在聯(lián)結(jié)關(guān)系的字段符合聯(lián)結(jié)關(guān)系的那些記錄形成記錄集的聯(lián)結(jié)。
2.外聯(lián)結(jié):分為外左聯(lián)結(jié)和外右聯(lián)結(jié)。
左聯(lián)結(jié)A、B表的意思就是將表A中的全部記錄和表B中聯(lián)結(jié)的字段與表A的聯(lián)結(jié)字段符合聯(lián)結(jié)條件的那些記錄形成的記錄集的聯(lián)結(jié),這里注意的是最后出來的記錄集會包括表A的全部記錄。
右聯(lián)結(jié)A、B表的結(jié)果和左聯(lián)結(jié)B、A的結(jié)果是一樣的,也就是說:
Select A.name B.name From A Left Join B On A.id=B.id 和
Select A.name B.name From B Right Join A on B.id=A.id 執(zhí)行后的結(jié)果是一樣的。
3.全聯(lián)結(jié):將兩個表中存在聯(lián)結(jié)關(guān)系的字段的所有記錄取出形成記錄集的聯(lián)結(jié)(這個不需要記憶,只要是查詢中提到了的表的字段都會取出,無論是否符合聯(lián)結(jié)條件,因此意義不大)。
4.無聯(lián)結(jié):不用解釋了吧,就是沒有使用聯(lián)結(jié)功能唄,也有自聯(lián)結(jié)的說法。
這里我有個比較簡便的記憶方法,
內(nèi)外聯(lián)結(jié)的區(qū)別是內(nèi)聯(lián)結(jié)將去除所有不符合條件的記錄,而外聯(lián)結(jié)則保留其中部分。
外左聯(lián)結(jié)與外右聯(lián)結(jié)的區(qū)別在于如果用A左聯(lián)結(jié)B則A中所有記錄都會保留在結(jié)果中,此時(shí)B中只有符合聯(lián)結(jié)條件的記錄,而右聯(lián)結(jié)相反,這樣也就不會混淆了。
內(nèi)聯(lián)接取交集,外連接取并集。單獨(dú)的join語句默認(rèn)是inner join。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在MySQL現(xiàn)有版本中CROSS JOIN的作用和INNER JOIN是一樣的(雖然在SQL Standard中是不一樣的,然而在MySQL中他們的區(qū)別僅僅是INNER JOIN需要附加ON參數(shù)的語句,而CROSS JOIN不需要)。
ON語句其實(shí)和WHERE語句功能大致相當(dāng),只是這里的ON語句是專門針對聯(lián)結(jié)表的,ON語句后面的條件的要求和書寫方式和WHERE語句的要求是一樣的,大家基本上可以把ON當(dāng)作WHERE用。
MySQL聯(lián)結(jié)查詢中的某些參數(shù)的作用:
1.USING (column_list):其作用是為了方便書寫聯(lián)結(jié)的多對應(yīng)關(guān)系,大部分情況下USING語句可以用ON語句來代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3),其作用相當(dāng)于下面語句
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
只是用ON來代替會書寫比較麻煩而已。
2.NATURAL [LEFT] JOIN:這個句子的作用相當(dāng)于INNER JOIN,或者是在USING子句中包含了聯(lián)結(jié)的表中所有字段的Left JOIN(左聯(lián)結(jié))。
3.STRAIGHT_JOIN:由于默認(rèn)情況下MySQL在進(jìn)行表的聯(lián)結(jié)的時(shí)候會先讀入左表,當(dāng)使用了這個參數(shù)后MySQL將會先讀入右表,這是個MySQL的內(nèi)置優(yōu)化參數(shù),大家應(yīng)該在特定情況下使用,譬如已經(jīng)確認(rèn)右表中的記錄數(shù)量少,在篩選后能大大提高查詢速度。
最后要說的就是,在MySQL5.0以后,運(yùn)算順序得到了重視,所以對多表的聯(lián)結(jié)查詢可能會錯誤以子聯(lián)結(jié)查詢的方式進(jìn)行。譬如你需要進(jìn)行多表聯(lián)結(jié),因此你輸入了下面的聯(lián)結(jié)查詢:
SELECT t1.id,t2.id,t3.id
FROM t1,t2
LEFT JOIN t3 ON (t3.id=t1.id)
WHERE t1.id=t2.id;
但是MySQL并不是這樣執(zhí)行的,其后臺的真正執(zhí)行方式是下面的語句:
SELECT t1.id,t2.id,t3.id
FROM t1,( t2 LEFT JOIN t3 ON (t3.id=t1.id) )
WHERE t1.id=t2.id;
這并不是我們想要的效果,所以我們需要這樣輸入:
SELECT t1.id,t2.id,t3.id
FROM (t1,t2)
LEFT JOIN t3 ON (t3.id=t1.id)
WHERE t1.id=t2.id;
在這里括號是相當(dāng)重要的,因此以后在寫這樣的查詢的時(shí)候我們不要忘記了多寫幾個括號,至少這樣能避免很多錯誤
分享到:
2012-09-20 11:19
瀏覽 2162
評論
總結(jié)
以上是生活随笔為你收集整理的mysql as join_mysql as 别名与 join 多表连接语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos6.4 卸载mysql_彻底
- 下一篇: mysql orderby多个_MySQ