SQL基礎 連線表

2021-10-02 07:43:08 字數 3538 閱讀 6730

sql最強大的特性之一是能夠在資料檢索查詢中動態地聯接表。連線是使用sql select可以執行的最重要的操作之一,對連線和連線語法的良好理解是學習sql極為重要的一部分。

在您可以有效地使用連線之前,您必須了解關係表和關聯式資料庫設計的基礎知識。下面的內容絕不是對這個主題的完整介紹,但應該足以讓您開始工作。

理解關係表的最佳方法是檢視乙個真實的示例。

假設您有乙個資料庫表,其中包含乙個產品目錄,每個目錄項都在自己的行中。您將與每個專案一起儲存的資訊型別將包括產品描述和**,以及關於建立產品的公司的**商資訊。

現在假設您有多個由同一**商建立的目錄項。您將在何處儲存**商資訊(如**商名稱、位址和聯絡資訊)?您不希望將這些資料與產品一起儲存,原因如下:

這裡的關鍵是,多次出現相同的資料從來都不是一件好事,這個原則是關聯式資料庫設計的基礎。設計關係表是為了將資訊分成多個表,每個表對應乙個資料型別。這些表通過公共值相互關聯(因此關係設計中的關係)。

在我們的示例中,您可以建立兩個表,乙個用於**商資訊,另乙個用於產品資訊。vendors表包含所有**商資訊,每個**商乙個錶行,以及每個**商的唯一識別符號。這個值稱為主鍵,可以是**商id,也可以是任何其他惟一的值。

products表只儲存產品資訊,除了vendor id (vendors表的主鍵)之外沒有特定於**商的資訊。此鍵將vendors表與products表聯絡起來,使用此vendor id可以使用vendors表查詢有關適當**商的詳細資訊。

這對你有什麼用?那麼,考慮以下幾點:

scale

能夠處理不斷增加的負載而不會失敗。乙個設計良好的資料庫或應用程式可以很好地擴充套件。

如前所述,將資料拆分為多個表可以實現更高效的儲存、更容易的操作和更大的可伸縮性。但這些好處是有代價的。

如果資料儲存在多個表中,如何使用單個表檢索該資料select語句?

答案是使用聯接。簡單地說,聯接是一種用於在select語句中關聯表的機制(因此也就是名稱聯接)。使用一種特殊的語法,可以聯接多個表,從而返回一組輸出,並且聯接可以動態地關聯每個表中的正確行。

建立聯接非常簡單。必須指定要包含的所有表以及它們之間的關係。請看下面的例子:

select vend_name, prod_name, prod_price

from vendors, products

where vendors.vend_id = products.vend_id;

讓我們看一下前面的**。select語句通過指定要檢索的列,以與到目前為止看到的所有語句相同的方式開始。這裡的主要區別是,兩個指定列(prod_name和prod_price)在乙個表中,而另乙個列(vend_name)在另乙個表中。

現在看看from子句。與前面的所有select語句不同,這個select語句有兩個表,分別列在from子句、vendors和products中。這是在這個select語句中聯接的兩個表的名稱。這些表通過where子句正確地連線,該子句指示dbms將vendors表中的vend_id與products表中的vend_id匹配。

您將注意到這些列被指定為**商。vend_id和

products.vend_id。這裡需要這個完全限定的列名,因為如果只指定了vend_id, dbms就無法告訴您所引用的是哪個vend_id列。(有兩個,每個表乙個。)正如您在前面的輸出中看到的,單個select語句返回來自兩個不同表的資料。

fully qualifying column names

如前一課所述,當您可能對所引用的列有歧義時,您必須使用完全限定的列名(表和用句號分隔的列)。如果您引用乙個不明確的列名,而沒有使用表名完全限定它,那麼大多數dbms將返回一條錯誤訊息。

使用where子句來設定連線關係可能看起來很奇怪,但實際上,這樣做有乙個很好的理由。請記住,在select語句中聯接表時,這種關係是動態構建的。資料庫表定義中沒有任何內容可以指導dbms如何連線這些表。你必須自己去做。當連線兩個表時,實際上要做的是將第乙個表中的每一行與第二個表中的每一行配對。where子句充當篩選器,只包含與指定篩選條件匹配的行—聯接。

如果沒有where子句,第乙個表中的每一行都將與第二個表中的每一行配對,不管它們在邏輯上是否匹配。

笛卡兒積

沒有連線條件的表關係返回的結果。 檢索到的行數將是第乙個表中的行數乘以第二個表中的行數。

別忘了where子句

確保所有的連線都有where子句,否則dbms返回的資料會比您想要的多得多。同樣,確保where子句是正確的。不正確的篩選條件將導致dbms返回不正確的資料。有時您會聽到返回笛卡爾積的連線型別稱為交叉連線。

到目前為止使用的連線稱為equijoin—基於兩個表之間的相等性測試的連線。這種連線也稱為內連線。實際上,您可以對這些連線使用稍微不同的語法,顯式地指定連線的型別。下面的select語句返回與前乙個示例完全相同的資料:

select vend_name, prod_name, prod_price

from vendors inner

join products

on vendors.vend_id = products.vend_id;

語句中的select與前面的select語句相同,但是from子句是不同的。在這裡,兩個表之間的關係是指定為內部連線的from子句。使用這種語法時,連線條件是使用特殊的on子句而不是where子句指定的。傳遞給on的實際條件與傳遞給where的實際條件相同。

請參閱dbms文件,以了解哪種語法是首選的。

根據ansi sql規範,內部連線語法的使用優於前面使用的簡單等連線語法。的確,sql純粹主義者往往對簡單語法不屑一顧。也就是說,dbms確實既支援簡單格式,也支援標準格式,所以我的建議是您花時間來理解這兩種格式,但是使用您覺得更舒服的格式。

sql不限制可以在select語句中連線的表的數量。建立聯接的基本規則保持不變。首先列出所有表,然後定義每個表之間的關係。

效能方面的考慮

dbmss程序在執行時連線指定的每個表。這個過程可能會非常消耗資源,所以要小心不要不必要地連線表。加入的表越多,效能下降的也就越多。

聯接中表的最大數目

雖然sql本身對每個連線沒有最大的表數限制,但是許多dbms確實有限制。如果有限制,請參考dbms文件來確定有哪些限制。

實驗是值得的

正如您所看到的,通常有不止一種方法來執行任何給定的操作sql操作。很少有明確的對錯之分。操作的型別、使用的dbms、表中的資料量、是否存在索引和鍵以及大量其他條件都可能影響效能。因此,嘗試不同的選擇機制來找到最適合你的方法通常是值得的。

如前所述,使用表別名的主要原因之一是能夠在單個select語句中多次引用同乙個表。乙個示例將演示這一點。

假設您想向jim jones工作的同一家公司的所有客戶聯絡人傳送郵件。這個查詢要求您首先找出jim jones為哪家公司工作,然後找出哪家客戶為該公司工作。以下是解決這個問題的一種方法:

sql基礎 sql連線查詢

這兩天在專案中寫連線查詢的時候突然回憶了一下各種連線查詢的語法 結果等,發現自己出了經常用的left join on 和等值連線以外其他的都不是很確定,於是乎就看看了相關的資料便有了這篇博文。sql 92標準所定義的from子句的連線語法格式為 fromjoin tablejoin typejoin...

mysql表連線sql表 MYSQL表連線查詢

表連線查詢 一 交叉連線 笛卡爾積 查詢teacher和course表中所有的資料 select from teacher,course select name,courseid,course.id,cname from teacher,course where teacher.courseid c...

SQL基礎4 資料表的連線

第四篇 資料庫的基礎資料 本方將分為10個短文發布,此為第四篇,講述了sql查詢時表之間的相關欄位的連線問題的一些常用 和對應分析,包括結構型別 約束條件等 sql查詢的重中之中就是將多表之間建立正確的連線,以此為基礎才能得到我們為了滿足業務方的需求而進行有效地查詢。連線的型別 內連線 按照連線條件...