SELECT * FROM t1 LEFT [OUTER] JOIN t2 ON 連接條件 [WHERE 普通過(guò)濾條件]; 其中中括號(hào)里的OUTER單詞是可以省略的。對(duì)于LEFT JOIN類型的連接來(lái)說(shuō),我們把放在左邊的表稱之為外表或者驅(qū)動(dòng)表,右邊的表稱之為內(nèi)表或者被驅(qū)動(dòng)表。所以上述例子中t1就是外表或者驅(qū)動(dòng)表,t2就是內(nèi)表或者被驅(qū)動(dòng)表。需要注意的是,對(duì)于左(外)連接和右(外)連接來(lái)說(shuō),必須使用ON子句來(lái)指出連接條件。了解了左(外)連接的基本語(yǔ)法之后,再次回到我們上邊那個(gè)現(xiàn)實(shí)問(wèn)題中來(lái),看看怎樣寫查詢語(yǔ)句才能把所有的學(xué)生的成績(jī)信息都查詢出來(lái),即使是缺考的考生也應(yīng)該被放到結(jié)果集中:
mysql> SELECT * FROM t1, t1; ERROR 1066 (42000): Not unique table/alias: 't1' mysql> 咦,報(bào)了個(gè)錯(cuò),這是因?yàn)樵O(shè)計(jì)MySQL的大叔不允許FROM子句中出現(xiàn)相同的表名。我們這里需要的是兩張一模一樣的t1表進(jìn)行連接,為了把兩個(gè)一樣的表區(qū)分一下,需要為表定義別名。比如這樣:
mysql> SELECT * FROM t1 AS table1, t1 AS table2; +------+------+------+------+ | m1 | n1 | m1 | n1 | +------+------+------+------+ | 1 | a | 1 | a | | 2 | b | 1 | a | | 3 | c | 1 | a | | 1 | a | 2 | b | | 2 | b | 2 | b | | 3 | c | 2 | b | | 1 | a | 3 | c | | 2 | b | 3 | c | | 3 | c | 3 | c | +------+------+------+------+ 9 rows in set (0.00 sec)
根據(jù)s1.name = '史珍香'搜索條件過(guò)濾s1表,可以得到該同學(xué)的基本信息: +----------+-----------+------+--------------------+-----------------+--------------+-----------------+ | number | name | sex | id_number | department | major | enrollment_time | +----------+-----------+------+--------------------+-----------------+--------------+-----------------+ | 20180104 | 史珍香 | 女 | 141992199701078600 | 計(jì)算機(jī)學(xué)院 | 軟件工程 | 2018-09-01 | +----------+-----------+------+--------------------+-----------------+--------------+-----------------+ 因?yàn)橥ㄟ^(guò)查詢s1表,得到了'史珍香'所在的專業(yè)其實(shí)是'軟件工程',接下來(lái)就應(yīng)該查詢s2表了,查詢s2表的時(shí)候的過(guò)濾條件s1.major = s2.major就相當(dāng)于s2.major = '軟件工程',于是查詢到2條記錄: +----------+-----------+------+--------------------+-----------------+--------------+-----------------+ | number | name | sex | id_number | department | major | enrollment_time | +----------+-----------+------+--------------------+-----------------+--------------+-----------------+ | 20180103 | 范統(tǒng) | 男 | 17156319980116959X | 計(jì)算機(jī)學(xué)院 | 軟件工程 | 2018-09-01 | | 20180104 | 史珍香 | 女 | 141992199701078600 | 計(jì)算機(jī)學(xué)院 | 軟件工程 | 2018-09-01 | +----------+-----------+------+--------------------+-----------------+--------------+-----------------+ 而我們只需要s2表的number、name、major這3個(gè)列的數(shù)據(jù),所以最終的結(jié)果就長(zhǎng)這樣: +----------+-----------+--------------+ | number | name | major | +----------+-----------+--------------+ | 20180103 | 范統(tǒng) | 軟件工程 | | 20180104 | 史珍香 | 軟件工程 | +----------+-----------+--------------+ 連接查詢與子查詢的轉(zhuǎn)換 有的查詢需求既可以使用連接查詢解決,也可以使用子查詢解決,比如
SELECT * FROM student_score WHERE number IN (SELECT number FROM student_info WHERE major = '計(jì)算機(jī)科學(xué)與工程'); 這個(gè)子查詢就可以被替換:
SELECT s2.* FROM student_info AS s1 INNER JOIN student_score AS s2 WHERE s1.number = s2.number AND s1.major = '計(jì)算機(jī)科學(xué)與工程'; 大家在實(shí)際使用時(shí)可以按照自己的習(xí)慣來(lái)書寫查詢語(yǔ)句。