從多個表中選擇數據

開放

從屬表

現在讓我們的查詢複雜一點。讓我們向我們的數據庫添加一個新的任務表,其中包含我們員工的任務。讓我們看看它包含哪些條目:

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。

刪除無意義的行

結果表中的行太多 ,這是employeetask兩個表的所有行的笛卡爾積。

從邏輯上講,如果行 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 完成後被丟棄。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言