执行联结

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

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