從屬表
現在讓我們的查詢複雜一點。讓我們向我們的數據庫添加一個新的任務表,其中包含我們員工的任務。讓我們看看它包含哪些條目:
SELECT * FROM task
這樣請求的結果:
ID | emploee_id | 姓名 | 最後期限 |
---|---|---|---|
1個 | 1個 | 修復一個前端bug | 2022-06-01 |
2個 | 2個 | 修復後端的一個bug | 2022-06-15 |
3個 | 5個 | 買咖啡 | 2022-07-01 |
4個 | 5個 | 買咖啡 | 2022-08-01 |
5個 | 5個 | 會買咖啡 | 2022-09-01 |
6個 | (無效的) | 打掃辦公室 | (無效的) |
7 | 4個 | 享受生活 | (無效的) |
8個 | 6個 | 享受生活 | (無效的) |
該表只有 4 列:
- id — 唯一的任務編號(和表中的行);
- employee_id — 分配任務的員工表中員工的 ID;
- 名稱― 任務的名稱和描述;
- deadline - 任務必須完成的時間。
注意一些細微差別。任務 N6 沒有 employee_id,我們沒有清潔工。任務在那裡,但執行者不在。它發生了。
此外,任務 6-9 沒有設定的截止日期。當必須定期且持續地完成一項任務時,就會發生這種情況。比如辦公室每天都要打掃衛生,但你也需要每天享受生活:)
如果一個表使用另一個表的 ID,則這樣的表稱為依賴表。
查詢多個表
這裡我們看到在任務表中有兩個任務“享受生活”。我們怎麼知道這些幸運兒是誰?
為此,在 SQL 中,您可以同時對兩個表執行查詢。一般來說,在SQL中,可以同時查詢任意多張表。這種請求的一般格式是:
SELECT columns
FROM Table 1, table 2, tableN
重要的!如果您同時對多個表編寫查詢,那麼您將得到所謂的表行的笛卡爾積。第一個表中的每一行將粘附到第二個表中的每一行,依此類推。
也就是說,如果第一個表中有 5 行,第二個表中有 10 行,那麼總共有 50 行。在 Java 中,這個查詢看起來像這樣:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
讓我們一次將查詢寫入兩個表,看看會發生什麼:
SELECT * FROM employee, task
這個查詢的結果是:
ID | 姓名 | 職業 | 薪水 | 年齡 | ID | 僱員 | _ID | 姓名 | 最後期限 |
---|---|---|---|---|---|---|---|---|---|
1個 | 伊万諾夫伊万 | 程序員 | 100000 | 25 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 | |
2個 | 彼得羅夫彼得 | 程序員 | 80000 | 23 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 | |
3個 | 伊万諾夫謝爾蓋 | 測試儀 | 40000 | 三十 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 | |
4個 | 拉比諾維奇·莫伊沙 | 導演 | 200000 | 35 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 | |
5個 | 基連科阿納斯塔西婭 | 辦公室主管 | 40000 | 25 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 | |
6個 | 瓦斯卡 | 貓 | 1000 | 3個 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 | |
1個 | 伊万諾夫伊万 | 程序員 | 100000 | 25 | 2個 | 2個 | 修復後端的一個bug | 2022-06-15 | |
2個 | 彼得羅夫彼得 | 程序員 | 80000 | 23 | 2個 | 2個 | 修復後端的一個bug | 2022-06-15 | |
3個 | 伊万諾夫謝爾蓋 | 測試儀 | 40000 | 三十 | 2個 | 2個 | 修復後端的一個bug | 2022-06-15 | |
4個 | 拉比諾維奇·莫伊沙 | 導演 | 200000 | 35 | 2個 | 2個 | 修復後端的一個bug | 2022-06-15 | |
5個 | 基連科阿納斯塔西婭 | 辦公室主管 | 40000 | 25 | 2個 | 2個 | 修復後端的一個bug | 2022-06-15 |
我們總共有 48 行結果,但這裡我只給出了 11 行。否則,空間就不夠了。
注意三件事:
- 具有相同名稱的列:id。這是employee表中的 id和task表中的 id 。
- 每個表的行都是重複的。在左列中,ID 6 之後又是 ID = 1。
- 我們有無意義的行,例如,id(來自 employee 表)為 6,而在同一行中,employee_id 為 1。
刪除無意義的行
結果表中的行太多 ,這是employee和task兩個表的所有行的笛卡爾積。
從邏輯上講,如果行 employee_id 為 3,那麼它應該只保留 employee 表中 id 為 3 的行。讓我們嘗試用 WHERE 來解決這個誤解。
讓我們寫一個這樣的查詢:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
這個查詢的結果是:
ID | 姓名 | 職業 | 薪水 | 年齡 | ID | emploee_id | 姓名 | 最後期限 |
---|---|---|---|---|---|---|---|---|
1個 | 伊万諾夫伊万 | 程序員 | 100000 | 25 | 1個 | 1個 | 修復一個前端bug | 2022-06-01 |
2個 | 彼得羅夫彼得 | 程序員 | 80000 | 23 | 2個 | 2個 | 修復後端的一個bug | 2022-06-15 |
4個 | 拉比諾維奇·莫伊沙 | 導演 | 200000 | 35 | 7 | 4個 | 享受生活 | (無效的) |
5個 | 基連科阿納斯塔西婭 | 辦公室主管 | 40000 | 25 | 3個 | 5個 | 買咖啡 | 2022-07-01 |
5個 | 基連科阿納斯塔西婭 | 辦公室主管 | 40000 | 25 | 4個 | 5個 | 買咖啡 | 2022-08-01 |
5個 | 基連科阿納斯塔西婭 | 辦公室主管 | 40000 | 25 | 5個 | 5個 | 會買咖啡 | 2022-09-01 |
6個 | 瓦斯卡 | 貓 | 1000 | 3個 | 8個 | 6個 | 享受生活 | (無效的) |
好消息是無意義的行已經消失:第一列的 id 始終等於 employee_id。
壞消息是沒有分配給任何人的任務,例如打掃辦公室,都沒有了。他們的 employee_id 是 NULL,所以他們在 WHERE 完成後被丟棄。
GO TO FULL VERSION