1. 程式人生 > 實用技巧 >大資料分析SQL資料庫連結教程

大資料分析SQL資料庫連結教程

  第一次學習SQL時,通常在單個表中處理資料。在現實世界中,資料庫通常具有多個表中的資料。如果我們希望能夠使用該資料,則必須在一個查詢中合併多個表。在此SQL聯接教程中,我們將學習如何使用聯接從多個表中選擇資料。

  我們假設您瞭解使用SQL的基礎知識,包括過濾,排序,聚合和子查詢。如果您不這樣做,我們的SQL基礎課程將教授所有這些概念,您可以免費參加該課程。

  概況資料庫

  我們將使用具有兩個表的CIA World Factbook(Factbook)資料庫版本。第一個表格稱為facts,每行代表Factbook中的國家/地區。這是facts表格的前5行:

  

大資料分析SQL聯接教程

  除了該facts表外,還有第二個表cities,其中包含《概況》中各個國家/ 地區的主要城市區域的資訊(在本教程的其餘部分中,我們將使用“城市”一詞來表示與“主要城市區域”相同的含義) 。讓我們看一下該表的前幾行,以及每列代表的描述:

  

大資料分析SQL聯接教程

  1)id –每個城市的唯一ID。

  2)name –城市名稱。

  3)population –城市人口。

  4)capital–城市是否為省會城市:1如果是,0如果不是。

  5)facts_id– facts表中國家的ID 。

  最後一列對我們特別有意義,因為它是原始facts表中也存在的一列資料。表之間的連結很重要,因為它用於合併查詢中的資料。下面是一個架構圖,它顯示了資料庫中的兩個表,其中的列以及如何連結這兩個表。

  

大資料分析SQL聯接教程

  模式圖中的線清楚地顯示id了facts表中的facts_id列與cities表中的列之間的連結。

  如果您想下載資料庫以在自己的計算機上繼續學習,則可以將資料集下載為SQLite資料庫。

  我們的第一個SQL連線

  使用SQL連線資料的最常見方法是使用內部連線。內部聯接的語法為:

  

大資料分析SQL聯接教程

  內部連線子句由兩部分組成:

  1)INNER JOIN,它告訴SQL引擎您希望在查詢中聯接的表的名稱,並希望使用內部聯接。

  2)ON,它告訴SQL引擎使用哪些列來連線兩個表。

  聯接通常在FROM子句之後的查詢中使用。讓我們看一下一個基本的內部聯接,在其中合併兩個表中的資料。

  

大資料分析SQL聯接教程

  讓我們看一下其中包含聯接的查詢行:

  1)INNER JOIN cities:這告訴SQL引擎我們希望cities使用內部聯接將表聯接到查詢中。

  2)ON cities.facts_id = facts.id:按照語法告訴SQL引擎在連線資料時使用哪些列table_name.column_name。

  您可能會認為這SELECT * FROM facts將意味著查詢僅返回表中的列facts,但是將*萬用字元與聯接一起使用時,將為您提供兩個表中的所有列。這是此查詢的結果:

  

大資料分析SQL聯接教程

  該查詢為我們提供了兩個表中的所有列,以及每行中idfrom facts和facts_idfrom 之間的匹配項cities(僅限於前5行)。

  瞭解SQL內部聯接

  現在,我們已經將兩個表合併在一起,以向我們提供有關中每行的更多資訊cities。讓我們仔細看看這個內部聯接是如何工作的。

  內部聯接的工作方式是僅包含每個表中具有使用ON子句指定的匹配項的行。讓我們看一下上一個螢幕中的聯接如何工作的圖。我們包含了一些行,這些行最能說明連線:

  

大資料分析SQL聯接教程

  我們的內部聯接將包括:

  a.從行cities表中有cities.facts_id一個匹配facts.id的facts。

  我們的內部聯接將不包括:

  a.從行cities表中有一個cities.facts_id不匹配任何facts.id從facts。

  b.從行facts表中有一個facts.id不匹配任何cities.facts_id從cities。

  您可以看到這以維恩圖表示:

  

大資料分析SQL聯接教程

  我們已經知道如何使用別名為列指定自定義名稱,例如:

  

大資料分析SQL聯接教程

  我們還可以為表名建立別名,這使帶有聯接的查詢更易於讀寫。代替:

  

大資料分析SQL聯接教程

  我們可以這樣寫:

  

大資料分析SQL聯接教程

  就像列名一樣,using AS是可選的。通過寫可以得到相同的結果:

  

大資料分析SQL聯接教程

  我們還可以將別名與萬用字元結合使用-例如,使用上面建立的別名,c.*將為我們提供表中的所有列cities。

  雖然我們在上一個螢幕中的查詢包含了該ON子句中的兩列,但ON在最終的列列表中,我們不需要使用該子句中的任何一列。這很有用,因為這意味著我們只能顯示我們感興趣的資訊,而不必每次都包含兩個聯接列。

  讓我們使用我們學到的內容來構建原始查詢。好:

  a.加入cities到facts使用INNER JOIN。

  b.使用別名作為表名。

  c.按順序包括:

  1)來自的所有列cities。

  2)name從facts別名到 的列country_name。

  d.僅包括前5行。

  

大資料分析SQL聯接教程

  在SQL中練習內部聯接

  讓我們練習編寫一個查詢,以使用內部聯接來回答資料庫中的問題。假設我們要使用到目前為止所學的知識,從資料庫中生成國家及其首都城市的表格。我們的第一步是考慮在最終查詢中需要哪些列。我們需要:

  1)name來自 的專欄facts

  2)name來自 的專欄cities

  鑑於我們已經確定需要兩個表中的資料,因此需要考慮如何將它們聯接。前面的模式圖表明,每個表中只有一列將它們連結在一起,因此我們可以對這些列使用內部聯接來聯接資料。

  到目前為止,考慮到我們的問題,我們已經可以編寫大部分查詢了(與我們之前編寫的查詢幾乎相同):

  

大資料分析SQL聯接教程

  我們過程的最後一部分是確保我們具有正確的行。從前面的兩個螢幕,我們知道,像這樣的查詢將返回所有行cities中具有相應匹配從facts在facts_id列。我們只對“城市”表中的首都感興趣,因此我們需要WHERE在該capital列上使用一個子句,該子句的值是1城市是否為首都,是否為首都0:

  

大資料分析SQL聯接教程

  現在,我們可以將所有這些放在一起編寫一個查詢,以回答我們的問題。我們將其限制為僅前10行,以便可以管理輸出量。

  

大資料分析SQL聯接教程

  SQL中的左聯接

  如前所述,內部聯接將不包括兩個表中沒有相互匹配的行。這意味著可能存在我們在查詢中看不到的資訊,其中行不匹配。

  我們可以使用SQL查詢來探索這一點:

  

大資料分析SQL聯接教程

  通過執行這兩個查詢,我們可以看到facts表中有些國家的表中沒有對應的城市cities,這表明我們可能有一些不完整的資料。

  讓我們看一下如何建立查詢以使用新型連線(左連線)來探索丟失的資料。

  左聯接包括內部聯接將選擇的所有行,以及第一(或左)表中與第二表不匹配的任何行。我們可以看到這以維恩圖表示。

  

大資料分析SQL聯接教程

  讓我們看一個示例,方法INNER JOIN是LEFT JOIN從我們編寫的第一個查詢中替換為,並與之前的圖中的行進行相同的選擇

  

大資料分析SQL聯接教程

  在這裡我們可以看到,對於與(237、238、240和244)facts.id中的任何值都不匹配cities.facts_id的行,結果中仍包含這些行。發生這種情況時,cities表中的所有列都將填充空值。

  我們可以使用這些空值將結果過濾到僅cities包含WHERE子句的國家/地區。在SQL中與null進行比較時,我們使用IS關鍵字而不是=符號。如果要選擇列為空的行,可以編寫:

  

大資料分析SQL聯接教程

  如果要選擇列名不為空的行,請使用:

  

大資料分析SQL聯接教程

  讓我們使用左聯接來探索cities表中不存在的國家。

  

大資料分析SQL聯接教程

  通過檢視我們在上一個螢幕中編寫的查詢結果,我們可以看到許多不同的原因,導致國家在以下方面沒有相應的值cities:

  a.人口少和/或沒有主要城市地區(定義為人口超過750,000)的國家,例如聖馬利諾,科索沃和諾魯。

  b.摩納哥和新加坡等城市州。

  c.本身不是國家的領土,例如香港,直布羅陀和庫克群島。

  d.不是國家/地區的地區和海洋,例如歐盟和太平洋。

  e.真實的資料丟失案例,例如臺灣。

  每當您使用內部聯接時要謹記自己可能會排除重要資料,這一點很重要,尤其是如果要基於資料庫模式中未連結的列進行聯接時,這一點很重要。

  右連線和外連線

  SQLite不支援兩種不常見的聯接型別,您應該注意這些聯接型別。首先是正確的聯接。顧名思義,右連線與左連線完全相反。左聯接包括該子句之前JOIN表中的所有行,而右聯接包括該JOIN子句中新表中的所有行。我們可以在下面的維恩圖中看到一個右連線:

  

大資料分析SQL聯接教程

  以下兩個查詢,一個使用左聯接,一個使用右聯接,產生相同的結果。

  

大資料分析SQL聯接教程

  使用正確聯接的主要原因是當您聯接兩個以上的表時。在這些情況下,最好使用右連線,因為它可以避免重組整個查詢以連線一個表。除此之外,右聯接很少使用,因此對於簡單聯接,使用左聯接比右聯接更好,因為其他人更容易閱讀和理解您的查詢。

  SQLite不支援的另一種聯接型別是完全外部聯接。完整的外部聯接將包括聯接兩側表中的所有行。我們可以在下面的維恩圖中看到完整的外部聯接:

  

大資料分析SQL聯接教程

  像右連線一樣,完全外連線通常是不常見的。完全外部聯接的標準SQL語法為:

  

大資料分析SQL聯接教程

  當進行聯接cities並facts使用完全外部聯接時,結果將與上面的左右聯接相同,因為中沒有cities.facts_id不存在的值facts.id。

  讓我們並排檢視每種聯接型別的維恩圖,這應該可以幫助您比較到目前為止我們已經討論過的四種聯接中每種聯接的區別。

  

大資料分析SQL聯接教程

  接下來,讓我們練習使用聯接來回答有關資料的一些問題。

  尋找人口最多的首都城市

  以前,我們在為查詢結果指定順序時使用了列名,如下所示:

  

大資料分析SQL聯接教程

  我們可以在查詢中使用一個方便的快捷方式,使我們可以跳過列名,而使用列在SELECT子句中的顯示順序。在這種情況下,migration_rate是SELECT子句中的第二列,因此我們可以使用2而不是列名:

  

大資料分析SQL聯接教程

  您可以在ORDER BYor GROUP BY子句中使用此快捷方式。請記住,您要確保查詢仍然可讀,因此對於更復雜的查詢,鍵入完整的列名可能會更好。

  讓我們利用我們所學的知識,按人口列出前十大首都城市的清單。由於我們對facts沒有相應城市的國家不感興趣cities,因此應使用INNER JOIN。

  

大資料分析SQL聯接教程

  將SQL連線與子查詢結合

  子查詢可用於替代部分查詢,使我們能夠找到更復雜問題的答案。我們也可以連線到子查詢的結果,就像可以建立表一樣。

  這是一個使用聯接和子查詢來生成國家及其首都城市表的示例,就像我們在任務早期所做的那樣。

  

大資料分析SQL聯接教程

  最初,讀取子查詢可能會讓人不知所措,因此,我們將分幾個步驟來分解本示例中發生的情況。要記住的重要一點是,任何子查詢的結果總是首先計算得出,因此我們從內而外讀取。

  a.首先計算紅色框中的子查詢。這個簡單的查詢從中選擇所有列cities,通過將值設定capital為1 來過濾標記為省會城市的行。

  b.在INNER JOIN加入子查詢結果,如別名c,在facts基於表ON的條款。

  c.從聯接結果中選擇兩列:

  1)f.name,別名為country。

  2)c.name,別名為capital_city。

  d.結果僅限於前10行。

  以下是此查詢的輸出:

  

大資料分析SQL聯接教程

  使用此示例作為模型,我們將編寫一個類似的查詢來查詢人口超過1000萬的非首都城市。

  

大資料分析SQL聯接教程

  SQL挑戰:具有聯接和子查詢的複雜查詢

  讓我們把以前學過的所有東西都用起來,並用它來編寫更復雜的查詢。發現“ SQL思維”需要一點時間來適應並不少見,因此,如果一開始看起來很難理解該查詢,不要氣our。通過實踐,它將變得更加容易!

  當您使用聯接和子查詢編寫複雜的查詢時,遵循以下過程將有所幫助:

  a.考慮一下最終輸出中需要哪些資料

  b.確定您需要聯接哪些表,以及是否需要聯接到子查詢。

  1)如果需要加入子查詢,請首先編寫子查詢。

  c.然後開始編寫您的SELECT子句,然後是join和您需要的任何其他子句。

  d.不要害怕逐步地編寫查詢,隨心所欲地執行它,例如,在編寫外部查詢之前,可以先將子查詢作為“獨立”查詢執行,以確保它看起來像您想要的。

  我們將寫一個查詢來查詢城市中心(城市)人口占該國總人口一半以上的國家。編寫此查詢的方法有多種,但我們將逐步介紹一種方法。

  我們可以從編寫查詢開始,以彙總每個國家/地區城市的所有城市人口。我們可以通過不分組的方式做到這一點facts_id(在下面的示例中將使用限制以使輸出可管理):

  

大資料分析SQL聯接教程

  接下來,我們將facts表格連線到該子查詢,選擇國家/地區名稱,城市人口和總人口(同樣,我們使用限制來保持整潔):

  

大資料分析SQL聯接教程

  最後,我們將建立一個新列,該列將城市人口除以總人口,並使用WHERE和ORDER BY過濾/排序結果:

  

大資料分析SQL聯接教程

  您可以看到,雖然我們的最終查詢很複雜,但是如果逐步構建它,則更容易理解。

  SQL聯接教程:後續步驟

  在此sql join教程中,我們瞭解到:

  a.內部聯接和左聯接之間的區別。

  b.正確和外部連線的作用

  c.如何選擇適合您任務的聯接。

  d.對子查詢,聚合函式和其他SQL技術使用聯接。

摘自:https://www.aaa-cg.com.cn/data/2300.html