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
同理
要解決這個問題,我們仍然可以利用投影查詢的「設置列的別名」來給兩個表各自的id
和name
列起別名:
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>
。這樣我們用別名s
和c
分別表示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行記錄;
多表查詢的結果集可能非常巨大,要小心使用。