執行聯結

聯結是使用兩個或更多表的SQL查詢,能產生虛擬的結果表。

聯結的基本語法:

SELECT columns FROM tableA JOIN_TYPE tableB JOIN_ CLAUSE;

聯結的類型(JOIN_TYPE)包括:內聯結、外聯結。


內聯結

內聯結會從指定的表中返回所有記錄。

例如:SELECT m.message_id, m.subject, f.name FROM messages AS m INNER JOIN forums AS f ON m.forum_id = f.forum_id WHERE f.name = 'MySQL' 

上述跨兩個表執行相等性比較(m.forum_id = f.forum_id),稱爲等值聯結,在等值比較中,兩個表的列具有相同的名稱,可以使用USING簡化查詢,如:

SELECT m.message_id, m.subject, f.name FROM messages AS m INNER JOIN forums AS f USING (forum_id) WHERE f.name = 'MySQL' 

不包含聯結子句(ON或USING)或WHERE子句的聯結被稱爲全聯結,會返回兩個表中的所有記錄。


外聯結

外聯結不同於內聯結(在兩個表之間返回匹配記錄),它將會返回兩個表都匹配的記錄和不匹配的記錄。

外聯結包括:左聯結、右聯結、全聯結。

左聯結

將返回左表中的所有記錄和右表中的匹配項,不匹配的消息列返回NULL值

例如:SELECT f.*, m.subject FROM forums AS f LEFT JOIN messages AS m ON f.forum_id = m.forum_id 

右聯結

將返回右表中的所有記錄和左表中的匹配項,不匹配的消息列返回NULL值

例如:SELECT f.*, m.subject FROM messages AS m RIGHT JOIN forums AS f USING (forum_id) 

全聯結

全聯結是左聯結和右聯結的結合,兩個表中所有匹配的記錄都將被返回,包括左表中不匹配右表中的所有記錄,以及右表中不匹配左表中的所有記錄。

MySQL不直接支持全聯結,但可以使用左聯結、右聯結加UNION語句來實現這個功能。


自聯結

例如:SELECT m1.subject, m2.subject AS Reply FROM messages AS m1 LEFT JOIN message AS m2 ON m1.message_id=m2.parent _id WHERE m1.parent_id=0


聯結多個表

基本語法:

SELECT what_columns FROM tableA JOIN_TYPE tableB JOIN_CLAUSE JOIN_TYPE tableC JOIN_CLAUSE 

例如:

SELECT u.username, m.subject, f.nameFROM users AS u INNER JOIN messages AS m USING (user_id) INNER JOIN forums AS f USING (forum_id) ORDER BY m.date_entered DESCLIMIT 5; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章