联结是使用两个或更多表的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;