如何使用sql連線一次查詢多個數據庫表

瞭解如何使用SQL聯接來簡化查詢、節省時間,並讓您感覺自己是SQL超級使用者。...

使用MySQL等關係資料庫的最大好處之一是,它的關係結構允許您輕鬆地跨多個表儲存和查詢資訊。

Join databases in mySQL

讓我們探索如何從多個數據庫表中準確地檢索所需的資料,以及各種可用的聯接,這些聯接允許您提取所需的準確結果。

初始化示例資料庫

這不是必需的,但是如果您希望遵循本文中的示例,可以使用以下終端命令在本地初始化示例資料庫:

git clone https://github.com/mdizak/sample-select-db.gitcd sample-select-dbsudo mysql < store.sqlsudo mysql sampledbmysql> SELECT COUNT(*) FROM customers;

您應該得到一個結果,說明customers表中有2000行。

預設/內部聯接

MySQL資料庫中使用的預設連線稱為內部連線,這是最常見和最直接的連線。此聯接返回兩個表中都有匹配記錄的所有記錄,並取消所有其他記錄。

例如,如果您想檢視客戶的名字和姓氏,以及訂單金額和日期(對於超過1000美元的所有訂單),您可以使用以下SQL語句:

SELECTc.id, c.first_name, c.last_name, o.amount, o.created_atFROMcustomers c, orders oWHEREo.customer_id = c.id AND o.amount >= 1000;

關於上述問題的一些注意事項:

  • 正在選擇五個不同的列,其中三個來自customers表,兩個來自orders表。
  • 在FROM子句中定義了兩個表,但字尾是字母“c”和“o”。它們只是在SQL中指定別名,可以是您想要的任何東西,並用於縮短SQL查詢。
  • o.customer_id=c.id是查詢的連線方面,並確保客戶和訂單之間的適當關聯。

下面是一種不同的、技術上更符合語法的方法來編寫相同的查詢:

SELECTc.id, c.first_name, c.last_name, o.amount, o.created_atFROMcustomers c INNER JOIN orders oONcustomer_id = c.idWHEREo.amount >= 1000;

上面的查詢比較容易閱讀,因為您可以很容易地看到customers和orders表之間的連線。儘管如此,這兩個查詢是相同的,將產生完全相同的記錄。

左連線

左聯接將返回左表中與右表中的記錄匹配的所有記錄,並消除所有其他記錄。例如,如果要檢視資料庫中每個產品的總銷售額,可以嘗試使用以下查詢:

SELECTp.name, sum(item.amount) AS tamountFROMorders_items item LEFT JOIN products pONitem.product_id = p.idGROUP BY item.product_id ORDER BY tamount DESC

這將產生一個很好的兩列檢視,顯示產品名稱和總銷售額,並按預期工作。查詢遍歷orders\u items表中的所有產品,將它們與products表中的記錄關聯,並返回每個產品的總銷售額。

右連線

使用上面的示例,請注意,上面的查詢只返回19條記錄,而資料庫中總共有22個產品。這是因為查詢是從orders\u items表開始的,並將其與products表連線,而且由於某些產品從未訂購過,因此orders\u items表中不存在這些產品的記錄。

如果您想獲得一個包含銷售金額的所有產品的列表,包括尚未訂購的產品,會發生什麼情況?使用以下查詢嘗試右聯接:

SELECTp.name, sum(item.amount) AS tamountFROMorders_items item RIGHT JOIN products pONitem.product_id = p.idGROUP BY p.id ORDER BY tamount DESC

這樣更好,查詢現在返回完整的22個產品,其中三個產品的值為null。這是因為右聯接不使用orders\u items作為聯接到products表的主表,而是翻轉order並將products表聯接到orders\u items表。

查詢中的多個聯接

有時您需要將三個或更多的表連線在一起以獲得一組特定的結果。

例如,您可能需要一個購買了微波爐(產品id#1)的所有客戶的列表,包括他們的姓名和訂購日期。這需要跨三個表進行選擇,這可以透過對以下查詢使用兩個聯接來完成:

SELECTc.first_name, c.last_name, o.amount, o.created_atFROMcustomers c INNER JOIN orders oONc.id = o.customer_id INNER JOIN orders_items itemONitem.order_id = o.idWHEREitem.product_id = 1 ORDER BY o.created_at;

此查詢返回所有426個微波爐訂單,並按預期工作。它首先將所有客戶與其各自的訂單進行匹配,然後進一步查詢結果集,方法是將所有訂單僅與orders#items表中包含微波產品(id#1)的訂單匹配。

決不要將子查詢與in子句一起使用

請注意,無論如何,您應該避免在SQL查詢中使用子查詢,例如:

SELECT first_name,last_name FROM customers WHERE id IN (SELECT customer_id FROM orders WHERE status = 'approved' AND amount < 100);

像上面這樣的查詢效率很低,佔用大量資源,應該儘量避免。相反,請使用上面幾節中概述的正確連線。例如,上述查詢應重寫為:

SELECT c.first_name, c.last_name FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.status = 'approved' AND o.amount < 100;

使用sql聯接節省時間

本文希望能幫助您瞭解MySQL等關係資料庫的強大功能,以及如何構建SQL查詢,使用連線從一個查詢中的多個表中檢索記錄,從而使您能夠檢索到所需的確切結果。

您已經學習了SQL中的三種不同聯接,如何別名列名和表名,如何在一個查詢中使用多個聯接,以及為什麼應該避免子查詢。不要再試圖手動將不同的資料集編譯成一個數據集,開始使用連線來打動同事並節省時間。

  • 發表於 2021-03-27 04:02
  • 閱讀 ( 44 )
  • 分類:程式設計

你可能感興趣的文章

資料庫管理系統(dbms)和檔案管理系統(file management system)的區別

...是檔案管理系統(file management system)? 檔案管理系統處理如何在硬碟上讀寫資料。安裝作業系統時,檔案系統也會安裝到計算機上。例如,Linux和Windows等作業系統提供檔案系統。它將資料儲存到硬碟上,並透過該檔案管理系統儲...

  • 發佈於 2020-10-16 16:44
  • 閲讀 ( 55 )

聯盟(union)和sqlserver中的union all(union all in sql server)的區別

...的行,而union all給出的結果資料集包含重複的行。SQLServer使用這些SQL命令執行語句。 引用 1.“SQL聯合。”First Normal Form(1NF)-資料庫規範化。請參閱2。“SQL UNION ALL。”First Normal Form(1NF)-資料庫規範化。此處提供2.“SQL聯合所...

  • 發佈於 2020-10-18 10:13
  • 閲讀 ( 46 )

映象(mirroring)和複製(replication)的區別

...資料合併到一個數據庫中。第三,在事務複製中,最初,使用者接收資料的完整副本,然後隨著資料的變化而不斷地更新。 總的來說,資料庫複製提供了一個分散式資料庫環境,幫助使用者訪問與其任務相關的資料。MSSQL Server...

  • 發佈於 2020-10-18 12:40
  • 閲讀 ( 49 )

春天(spring)和冬眠(hibernate)的區別

...面(API)。它連線專案所需的所有元件。程式設計師可以使用框架在程式中使用預定義的程式碼。一些常見的基於Java的框架有Spring、Hibernate、Struts、Maven和JSF。本文討論了Spring和Hibernate之間的區別。Spring框架為基於Java的企業應...

  • 發佈於 2020-10-19 14:07
  • 閲讀 ( 56 )

nosql(nosql)和資料庫(mongodb)的區別

...別–nosql與mongodb 關係資料庫管理系統(RDBMS)被許多組織使用。結構化查詢語言(SQL)用於儲存、檢索和修改關係資料庫中的資料。它們在儲存大量資料方面效率不高,而且很難進行橫向擴充套件。因此,引入了NoSQL。NoSQL代表...

  • 發佈於 2020-10-20 01:00
  • 閲讀 ( 34 )

如何在windows上安裝mysql資料庫

...常編寫連線到資料庫伺服器的應用程式,那麼如果您知道如何在Windows機器上安裝MySQL資料庫以進行測試,這會有所幫助。 ...

  • 發佈於 2021-03-11 21:33
  • 閲讀 ( 52 )

所有程式設計師都應該知道的13條最重要的sql命令

... 注意行的順序是如何變化的嗎?Union以最有效的方式執行,因此返回的資料可以按順序變化。 ...

  • 發佈於 2021-03-14 06:57
  • 閲讀 ( 43 )

如何使用powerquery合併microsoftexcel中的多個數據集

... 現在您已經學習瞭如何使用powerquery附加資料,您有了一個強大的新工具來簡化資料。現在資料已載入到Excel中使用,您可以像處理任何表一樣處理它。您可以從Excel表格建立圖形和圖表,也...

  • 發佈於 2021-03-19 06:12
  • 閲讀 ( 53 )

如何使用ipstack api進行ip地理位置查詢

...請繼續閱讀以瞭解有關此IP地理定位工具的更多資訊以及如何使用它。 ...

  • 發佈於 2021-03-25 03:02
  • 閲讀 ( 86 )

sql與nosql:下一個專案的最佳資料庫是什麼?

...供一個更簡單的途徑,因為他們可以清楚地看到資料庫是如何結構化的。 ...

  • 發佈於 2021-03-28 05:16
  • 閲讀 ( 44 )
bphb1993
bphb1993

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦