聯結是使用兩個或更多表的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'
外聯結
外聯結不同於內聯結(在兩個表之間返回匹配記錄),它將會返回兩個表都匹配的記錄和不匹配的記錄。
外聯結包括:左聯結、右聯結、全聯結。
左聯結
將返回左表中的所有記錄和右表中的匹配項,不匹配的消息列返回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;