JOIN 運算符出現的先決條件
隨著表中數據量的增長,其中經常會出現重複值。例如,產品表有品牌名稱。有時會重複。為他們準備一個單獨的品牌表會很有用,例如,其中包含以下數據:
- id - 品牌標識;
- 名稱——品牌名稱;
- company_owner - 品牌公司所有者的名稱;
- company_contacts - 品牌所有者公司的聯繫人。
然後我們想創建一個地址表,我們可以將所有地址放入其中:
- id – id 地址;
- 國家;
- 地區;
- 城市;
- 街道;
- 房子;
- 壓縮。
此外,在此表中,不僅可以存儲品牌擁有公司的地址,還可以存儲客戶和員工的地址。這種方法只是數據量(表中的行數)增長的結果。這使得操作表中的數據和維護它們的完整性變得更加容易。
當您有 5 名員工時,您只需在職業欄中輸入他們的職業即可。如果您的公司有 5000 名員工,那麼您需要一個包含 x 個職業及其職責列表的表格。
順便說一下,在 Java 語言中也有類似的東西。如果你在一個方法中有很多代碼,那麼就有將它分解成幾個方法的願望。如果一個類中有很多方法,那麼我想把它分成幾個類。
這就是大型數據庫有數千張表的原因。而且幾乎所有的查詢都是同時在多個表上執行的。而每張表都有一千條記錄的三個表的行的笛卡爾積已經是十億行。
但是僅使用 WHERE 過濾十億行可能需要數小時。因此,SQL 語言的創建者提供了他們的解決方案——JOIN 運算符。
JOIN 運算符簡介
JOIN 運算符用於明確告訴 SQL 服務器我們不需要所有表的所有行的笛卡爾積,而是使用 ID(或以其他方式)相互引用的不同表的行的智能粘合. 服務器有一個單獨的算法來處理使用 JOIN 運算符的表連接,這樣可以更快地執行此類操作。JOIN 運算符的一般形式如下:
table 1 JOIN table 2 ON condition
這裡說的是需要將表table1和table2合二為一,並以condition作為join criterion 。
讓我們以我們的舊例子為例:
SELECT * FROM employee, task WHERE emploee.id = task.emploee_id
並使用 JOIN 運算符重寫它:
SELECT * FROM employee JOIN task ON emploee.id = task.emploee_id
在我們的例子中,兩個查詢都會給出相同的結果,但這只是因為查詢非常簡單。將來,WHERE 允許您精確地構建行過濾器,而在 ON 之後指定的那個允許您編寫用於鏈接表的複雜腳本。在使用 JOIN 語句時也可以使用別名(表別名)。例子:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id