上接《深入SELECT語句的查詢功能一)》
檢索語句與多個表的連接
SELECT語句不僅可以從單個表中檢索數據,也可以通過連接多個表來檢索數據。這裡將介紹全連接和左連接的作用。
我們創建兩個表作為例子。
mysql> CREATE TABLE first -> ( -> id TINYINT, -> first_name CHAR(10) -> );
錄入如下數據:
+------+-----------+
| id | first_name|
+------+-----------+
| 1 | Tom |
| 2 | Marry |
| 3 | Jarry |
+------+-----------+
mysql> CREATE TABLE last -> ( -> id TINYINT, -> last_name CHAR(10) -> );
錄入數據
+------+-----------+
| id | last_name |
+------+-----------+
| 2 | Stone |
| 3 | White |
| 4 | Donald |
+------+-----------+
全連接
全連接:在檢索時指定多個表,將每個表用都好分隔,這樣每個表的數據行都和其他表的每行交叉產生所有可能的組合,這樣就是一個全連接。所有可能的組和數即每個表的行數之和。
那麼觀察下面的檢索的結果:
mysql> SELECT * FROM first,last;
+------+------------+------+-----------+
| id | first_name | id | last_name |
+------+------------+------+-----------+
| 1 | Tom | 2 | Stone |
| 2 | Marry | 2 | Stone |
| 3 | Jarry | 2 | Stone |
| 1 | Tom | 3 | White |
| 2 | Marry | 3 | White |
| 3 | Jarry | 3 | White |
| 1 | Tom | 4 | Donald |
| 2 | Marry | 4 | Donald |
| 3 | Jarry | 4 | Donald |
+------+------------+------+-----------+
你可以看到輸出的結果集中共有3×3=9 行,這就是全連接的結果。
你也可以這樣使用SQL語句:
mysql> SELCT first.*,last.* FROM first,last;
輸出結果與上面的例子相同,並無二致。記錄集的輸出的排序是以FROM子句後的表的順序進行,即先排列位置靠前的表,即使你改變記錄集中列的顯示順序,例如下面的例子:
mysql> SELECT last.*,first.* FROM first,last;
+------+-----------+------+------------+
| id | last_name | id | first_name |
+------+-----------+------+------------+
| 2 | Stone | 1 | Tom |
| 2 | Stone | 2 | Marry |
| 2 | Stone | 3 | Jarry |
| 3 | White | 1 | Tom |
| 3 | White | 2 | Marry |
| 3 | White | 3 | Jarry |
| 4 | Donald | 1 | Tom |
| 4 | Donald | 2 | Marry |
| 4 | Donald | 3 | Jarry |
+------+-----------+------+------------+
上面的例子是兩個非常小的表的例子,如果是幾個非常大的表的全連接,例如,兩個行數分別為1000的表,這樣的連接可以產生非常大的結果集合1000×1000=100萬行。而實際上你並不需要這麼多行的結果,通常你需要使用一個WHERE從句來限制返回的記錄集的行數:
mysql> SELECT * FROM first,last WHERE first.id= last.id;
+------+------------+------+-----------+
| id | first_name | id | last_name |
+------+------------+------+-----------+
| 2 | Marry | 2 | Stone |
| 3 | Jarry | 3 | White |
+------+------------+------+-----------+