JOIN 按照功能大致分爲如下三類:
A INNER JOIN B on 條件(內連接,或等值連接):獲取兩個表中字段匹配關係的記錄。
A LEFT JOIN B on條件(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
A RIGHT JOIN B on 條件(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
內連接查詢
INNER JOIN子句的語法如下:
SELECT column_list FROM t1 INNER JOIN t2 ON join_condition1 INNER JOIN t3 ON join_condition2 ... WHERE where_conditions;
MySQL INNER JOIN支持使用等於以外的運算符,但是也可以使用大於(>),小於(<)和不等於(<>)運算符的其他運算符來形成連接謂詞。
實例:
#兩張表的數據如下:
mysql> select * from girl; +-----+--------+ | hid | bname | +-----+--------+ | 3 | 默默 | | 2 | 羞羞 | | 5 | 海燕 | +-----+--------+ 3 rows in set (0.00 sec) mysql> select * from boy;
+-----+--------+ | hid | bname | +-----+--------+ | 1 | lisi | | 2 | 王五 | | 3 | 趙六 | +-----+--------+ 3 rows in set (0.00 sec)
#查詢boy表和girl表中hid想同的bname。
mysql> select boy.hid,boy.bname,girl.hid,girl.bname -> from -> boy inner join girl on boy.hid=girl.hid; +-----+--------+-----+--------+ | hid | bname | hid | bname | +-----+--------+-----+--------+ | 3 | 趙六 | 3 | 默默 | | 2 | 王五 | 2 | 羞羞 | +-----+--------+-----+--------+ 2 rows in set (0.01 sec)
#查詢boy和girl表中數據,boy.hid=3的行.
mysql> select boy.hid,boy.bname,girl.hid,girl.bname from boy inner join girl on boy.hid=girl.hid where boy.hid=3; +-----+--------+-----+--------+ | hid | bname | hid | bname | +-----+--------+-----+--------+ | 3 | 趙六 | 3 | 默默 | +-----+--------+-----+--------+ 1 row in set (0.00 sec)
#查詢boy和girl表中數據,”boy.hid=girl.hid=3“的行.
mysql> select boy.hid,boy.bname,girl.hid,girl.bname from boy inner join girl on boy.hid=girl.hid where boy.hid and girl.hid=3; +-----+--------+-----+--------+ | hid | bname | hid | bname | +-----+--------+-----+--------+ | 3 | 趙六 | 3 | 默默 | +-----+--------+-----+--------+ 1 row in set (0.00 sec)
注意:在匹配階段 WHERE 子句的條件都不會被使用.僅在匹配階段完成以後,WHERE 子句條件纔會被使用。它將從匹配階段產生的數據中檢索過濾.
左連接查詢
MySQL left join 與 join 有所不同,MySQL LEFT JOIN 會讀取左邊數據表的全部數據,即便右邊表無對應數據.
實例:
#以左表所有的數據爲準,查詢右表所有的數據,匹配不到以"null"代替。
mysql> select boy.hid,boy.bname,girl.hid,girl.bname from boy left join girl on boy.hid=girl.hid; +-----+--------+------+--------+ | hid | bname | hid | bname | +-----+--------+------+--------+ | 3 | 趙六 | 3 | 默默 | | 2 | 王五 | 2 | 羞羞 | | 1 | lisi | NULL | NULL | +-----+--------+------+--------+ 3 rows in set (0.00 sec)
注意:如果 B 表中沒有任何一行數據匹配 ON 的條件,將會額外生成一行所有列爲 NULL 的數據。
右連接查詢
MySQL RIGHT JOIN 會讀取右邊數據表的全部數據,即便左邊邊表無對應數據。
mysql> select boy.hid,boy.bname,girl.hid,girl.bname from boy right join girl on boy.hid=girl.hid; +------+--------+-----+--------+ | hid | bname | hid | bname | +------+--------+-----+--------+ | 2 | 王五 | 2 | 羞羞 | | 3 | 趙六 | 3 | 默默 | | NULL | NULL | 5 | 海燕 | +------+--------+-----+--------+ 3 rows in set (0.00 sec)
三種連接的區別: