計算機, 程序設計
左連接(SQL) - 的例子,詳細描述中,使用錯誤的
在任何實際的關係數據庫中,所有信息都分佈在一個單獨的表。 很多表都是在互相通信方案闡述。 然而,隨著幫助SQL查詢很可能把數據,而不是嵌入電路之間的連接。 這是通過執行一個加入的連接,它允許你建立任意數量的表之間的關係,甚至連看似不相干的信息來完成。
關於左外連接本文將具體談。 在繼續這種類型的連接的描述中,加入一些數據庫表。
準備必要的表
例如,在我們的數據庫中,有關於人民和他們的房產信息。 摘要基於三個表:人民(人),不動產(房地產),Realty_peoples(表之間的關係,人誰從什麼屬性屬於)。 假設存儲在人的表中的以下數據:
人民 | ||||
ID | L_name | F_name | Middle_name | 生日 |
1 | 伊万諾娃 | 達里婭 | B. | 2000年7月16日 |
2 | 普金 | 弗拉季斯拉夫· | 尼古拉耶維奇 | 1986年1月29日 |
3 | Evgenin | 亞歷山大 | Federovich | 1964年4月30日 |
4 | 安妮娜 | 愛 | P. | 1989年12月31日 |
五 | Gerasimovsky | 希望 | P. | 1992年3月14日 |
6 | Gerasimovsky | 奧列格 | Albertovich | 1985年1月29日 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 |
8 | Sukhanovskaya | 朱莉婭 | Y. | 二零零一年十月一日 |
房地產:
物業 | |
ID | 地址 |
1 | 阿爾漢格爾斯克,UL認證。 沃羅寧,D 7,kv.6 |
2 | 阿爾漢格爾斯克,UL認證。 Severodvinskaya,D。84,Q。 9 BR。 五 |
3 | 阿爾漢格爾斯克地區,北德文斯克,ST。 列寧,D,134,Q。 85 |
4 | 阿爾漢格爾斯克地區,新德文斯克,UL認證。 Proletarshaya,D。16,Q。 137 |
五 | 阿爾漢格爾斯克,PL。 Terekhina,D。89,Q。 13 |
關係人 - 財產:
Realty_peoples | ||
id_peoples | id_realty | 類型 |
7 | 3 | 總共同所有權 |
8 | 3 | 總共同所有權 |
3 | 五 | 屬性 |
7 | 1 | 屬性 |
五 | 4 | 通用零件 |
6 | 4 | 通用零件 |
LEFT JOIN(SQL) - 說明
左化合物具有的語法如下:
表-A LEFT JOIN表-B [{ 謂詞} | {USING spisok_ 與 tolbtsov}] |
並且示意如下:
並且該表達被翻譯為“全選,無一例外表A和表B的線,以便只顯示謂詞的匹配的行。 如果字符串表被發現的對的表,然後填寫所產生的列空 - 值“。
大多數情況下,當左連接指示ON,用的就是只有當列名,這是計劃建立連接都是一樣的使用。
LEFT JOIN - 使用實例
隨著左邊的連接,我們可以看到,所有的人從名單中是否有人民財產。 在左這樣做連接SQL查詢示例:
SELECT人民。*,Realty_peoples.id_realty,Realty_peoples.type FROM人民LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
結果如下:
查詢1 | ||||||
ID | L_name | F_name | Middle_name | 生日 | id_realty | 類型 |
1 | 伊万諾娃 | 達里婭 | B. | 2000年7月16日 | ||
2 | 普金 | 弗拉季斯拉夫· | 尼古拉耶維奇 | 1986年1月29日 | ||
3 | Evgenin | 亞歷山大 | Federovich | 1964年4月30日 | 五 | 屬性 |
4 | 安妮娜 | 愛 | P. | 1989年12月31日 | ||
五 | Gerasimovsky | 希望 | P. | 1992年3月14日 | 4 | 通用零件 |
6 | Gerasimovsky | 奧列格 | Albertovich | 1985年1月29日 | 4 | 通用零件 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 1 | 屬性 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 3 | 總共同所有權 |
8 | Sukhanovskaya | 朱莉婭 | Y. | 二零零一年十月一日 | 3 | 總共同所有權 |
正如我們看到的, 伊万諾娃錫爾河 普金弗拉季和Anninoy Lyubovi沒有註冊房地產權利。
什麼將我們已經收到,使用內部聯接內部聯接? 如你所知,它排除了不匹配的行,所以三我們的最終樣品的只會被丟棄:
查詢1 | ||||||
ID | L_name | F_name | Middle_name | 生日 | id_realty | 類型 |
3 | Evgenin | 亞歷山大 | Federovich | 1964年4月30日 | 五 | 屬性 |
五 | Gerasimovsky | 希望 | P. | 1992年3月14日 | 4 | 通用零件 |
6 | Gerasimovsky | 奧列格 | Albertovich | 1985年1月29日 | 4 | 通用零件 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 1 | 屬性 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 3 | 總共同所有權 |
8 | Sukhanovskaya | 朱莉婭 | Y. | 二零零一年十月一日 | 3 | 總共同所有權 |
這似乎是第二個版本也符合我們的問題的條件。 但是,如果我們開始在另一個附加和另一個表,從結果三個人已經無可挽回地消失了。 因此,在實踐中,結合多個表時,更經常使用左,右連接比內連接。
將繼續尋找到左連接SQL實例。 附上我們的房子的地址表:
SELECT人民。*,Realty_peoples.id_realty,Realty_peoples.type,Realty.address 從人民 LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples LEFT JOIN地產ON Realty.id = Realty_peoples.id_realty |
現在我們得到的不僅是一種規律,也是房地產的地址:
查詢1 | |||||||
ID | L_name | F_name | Middle_name | 生日 | id_realty | 類型 | 地址 |
1 | 伊万諾娃 | 達里婭 | B. | 2000年7月16日 | |||
2 | 普金 | 弗拉季斯拉夫· | 尼古拉耶維奇 | 1986年1月29日 | |||
3 | Evgenin | 亞歷山大 | Federovich | 1964年4月30日 | 五 | 屬性 | 阿爾漢格爾斯克,PL。 Terekhina,D。89,Q。 13 |
4 | 安妮娜 | 愛 | P. | 1989年12月31日 | |||
五 | Gerasimovsky | 希望 | P. | 1992年3月14日 | 4 | 通用零件 | 阿爾漢格爾斯克地區,新德文斯克,UL認證。 Proletarshaya,D。16,Q。 137 |
6 | Gerasimovsky | 奧列格 | Albertovich | 1985年1月29日 | 4 | 通用零件 | 阿爾漢格爾斯克地區,新德文斯克,UL認證。 Proletarshaya,D。16,Q。 137 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 3 | 總共同所有權 | 阿爾漢格爾斯克地區,北德文斯克,ST。 列寧,D,134,Q。 85 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 1 | 屬性 | 阿爾漢格爾斯克,UL認證。 沃羅寧,D 7,kv.6 |
8 | Sukhanovskaya | 朱莉婭 | Y. | 二零零一年十月一日 | 3 | 總共同所有權 |
阿爾漢格爾斯克地區,北德文斯克,ST。 列寧,D,134,Q。 85 |
LEFT JOIN - 典型用途錯誤:無效的過程表
在左外發基本錯誤連接表二:
- 正確地選擇用於該數據丟失的表的順序。
- 當使用與查詢時的錯誤連接的表。
考慮的第一個錯誤。 任何問題的決定之前應該清楚地知道,我們到底想要得到的。 在上面這個例子中,我們採取了人的每一個,但完全失去了對下2號,其主人未找到對象的信息。
如果我們在一些地方查詢移動的桌子,和將與開始«...從房產左加入人民...»任何一個屬性,我們就不至於丟了,你會不會跟人有關。
但是,不要害怕左連接,切換到全屏外部,其中包括在結果和匹配,而不是匹配的行。
畢竟, 樣品的體積 往往非常大,和額外的數據實際上是無用的。 主要的事情 - 弄清楚你想要得到的結果是什麼:所有的人與他們的現有財產清單或與它們的主人全屬性列表(如果有的話)。
LEFT JOIN - 典型使用錯誤的:在哪裡設置的條件時請求是正確的
第二誤差還與數據的損失相關聯,並且並不總是立即顯而易見。
讓我們回到查詢,當我們離開通過連接接收所有的人都和他們的現有屬性數據。 請記住以下與左連接SQL示例:
FROM人民LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
假設我們要澄清的請求,不輸出數據,其中法的類型 - “屬性”。 如果我們簡單地添加,使用左連接SQL,以下條件的一個例子:
...
當鍵入<>“屬性” |
我們將失去誰沒有財產,因為空值null是不是比較如下人口數據:
查詢1 | ||||||
ID | L_name | F_name | Middle_name | 生日 | id_realty | 類型 |
五 | Gerasimovsky | 希望 | P. | 1992年3月14日 | 4 | 通用零件 |
6 | Gerasimovsky | 奧列格 | Albertovich | 1985年1月29日 | 4 | 通用零件 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 3 | 總共同所有權 |
8 | Sukhanovskaya | 朱莉婭 | Y. | 二零零一年十月一日 | 3 | 總共同所有權 |
為了防止這個原因發生的錯誤,最好是在連接時立即設置選擇條件。 我們建議考慮與左下面的連接SQL實例。
SELECT人民。*,Realty_peoples.id_realty,Realty_peoples.type 從人民 LEFT JOIN Realty_peoples ON(Peoples.id = Realty_peoples.id_peoples AND型<>“屬性”) |
其結果將是如下:
查詢1 | ||||||
ID | L_name | F_name | Middle_name | 生日 | id_realty | 類型 |
1 | 伊万諾娃 | 達里婭 | B. | 2000年7月16日 | ||
2 | 普金 | 弗拉季斯拉夫· | 尼古拉耶維奇 | 1986年1月29日 | ||
3 | Evgenin | 亞歷山大 | Federovich | 1964年4月30日 | ||
4 | 安妮娜 | 愛 | P. | 1989年12月31日 | ||
五 | Gerasimovsky | 希望 | P. | 1992年3月14日 | 4 | 通用零件 |
6 | Gerasimovsky | 奧列格 | Albertovich | 1985年1月29日 | 4 | 通用零件 |
7 | Sukhanovskaya | 陪審團 | A. | 1976年9月25日 | 3 | 總共同所有權 |
8 | Sukhanovskaya | 朱莉婭 | Y. | 二零零一年十月一日 | 3 | 總共同所有權 |
因此,通過以下簡單到左連接SQL例子中,我們收到的所有的人的名單,進一步移動,在股權/共同擁有這些特性之一。
作為結論,我想再次從數據庫中的任何信息的樣本必須負責任地採取突出。 在左前面我們開設了許多細微之處連接SQL簡單的例子,解釋其中之一 - 你開始寫,甚至基本的查詢之前,您必須仔細了解我們到底想要得到的。 祝你好運!
Similar articles
Trending Now