MySQL多表查詢筆記總結

  • 2019 年 10 月 5 日
  • 筆記

SELECT查詢不但可以從一張表查詢數據,還可以從多張表同時查詢數據。查詢多張表的語法是:SELECT * FROM <表1> <表2>

例如,同時從students表和classes表的「乘積」,即查詢數據,可以這麼寫:

SELECT * FROM students, classes;

這種一次查詢兩個表的數據,查詢的結果也是一個二維表,它是students表和classes表的「乘積」,即students表的每一行與classes表的每一行都兩兩拼在一起返回。結果集的列數是students表和classes表的列數之和,行數是students表和classes表的行數之積。

這種多表查詢又稱笛卡爾查詢,使用笛卡爾查詢時要非常小心,由於結果集是目標表的行數乘積,對兩個各自有100行記錄的表進行笛卡爾查詢將返回1萬條記錄,對兩個各自有1萬行記錄的表進行笛卡爾查詢將返回1億條記錄。

你可能還注意到了,上述查詢的結果集有兩列id和兩列name,兩列id是因為其中一列是students表的id,而另一列是classes表的id,但是在結果集中,不好區分。兩列name同理

要解決這個問題,我們仍然可以利用投影查詢的「設置列的別名」來給兩個表各自的idname列起別名:

SELECT students.id sid, students.name, students.gender students.score, classes.id cid, classes.name cname FROM students, classes;

注意,多表查詢時,要使用表名.列名這樣的方式來引用列和設置別名,這樣就避免了結果集的列名重複問題。但是,用表名.列名這種方式列舉兩個表的所有列實在是很麻煩,所以SQL還允許給表設置一個別名,讓我們在投影查詢中引用起來稍微簡潔一點:

SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname FROM students s, classes c;

注意到FROM子句給表設置別名的語法是FROM <表名1> <別名1>, <表名2> <別名2>。這樣我們用別名sc分別表示students表和classes表。

多表查詢也是可以添加WHERE條件的,我們來試試:

SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname FROM students s, classes c WHERE s.gender = 'M' AND c.id = 1;

這個查詢的結果集每行記錄都滿足條件s.gender = 'M'c.id = 1。添加WHERE條件後結果集的數量大大減少了。

小結

使用多表查詢可以獲取M x N行記錄;

多表查詢的結果集可能非常巨大,要小心使用。