使用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;關於上述問題的一些注意事項:
下面是一種不同的、技術上更符合語法的方法來編寫相同的查詢:
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)的訂單匹配。
請注意,無論如何,您應該避免在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;本文希望能幫助您瞭解MySQL等關係資料庫的強大功能,以及如何構建SQL查詢,使用連線從一個查詢中的多個表中檢索記錄,從而使您能夠檢索到所需的確切結果。
您已經學習了SQL中的三種不同聯接,如何別名列名和表名,如何在一個查詢中使用多個聯接,以及為什麼應該避免子查詢。不要再試圖手動將不同的資料集編譯成一個數據集,開始使用連線來打動同事並節省時間。
...是檔案管理系統(file management system)? 檔案管理系統處理如何在硬碟上讀寫資料。安裝作業系統時,檔案系統也會安裝到計算機上。例如,Linux和Windows等作業系統提供檔案系統。它將資料儲存到硬碟上,並透過該檔案管理系統儲...
...的行,而union all給出的結果資料集包含重複的行。SQLServer使用這些SQL命令執行語句。 引用 1.“SQL聯合。”First Normal Form(1NF)-資料庫規範化。請參閱2。“SQL UNION ALL。”First Normal Form(1NF)-資料庫規範化。此處提供2.“SQL聯合所...
...資料合併到一個數據庫中。第三,在事務複製中,最初,使用者接收資料的完整副本,然後隨著資料的變化而不斷地更新。 總的來說,資料庫複製提供了一個分散式資料庫環境,幫助使用者訪問與其任務相關的資料。MSSQL Server...
...面(API)。它連線專案所需的所有元件。程式設計師可以使用框架在程式中使用預定義的程式碼。一些常見的基於Java的框架有Spring、Hibernate、Struts、Maven和JSF。本文討論了Spring和Hibernate之間的區別。Spring框架為基於Java的企業應...
...別–nosql與mongodb 關係資料庫管理系統(RDBMS)被許多組織使用。結構化查詢語言(SQL)用於儲存、檢索和修改關係資料庫中的資料。它們在儲存大量資料方面效率不高,而且很難進行橫向擴充套件。因此,引入了NoSQL。NoSQL代表...
...常編寫連線到資料庫伺服器的應用程式,那麼如果您知道如何在Windows機器上安裝MySQL資料庫以進行測試,這會有所幫助。 ...
... 注意行的順序是如何變化的嗎?Union以最有效的方式執行,因此返回的資料可以按順序變化。 ...
... 現在您已經學習瞭如何使用powerquery附加資料,您有了一個強大的新工具來簡化資料。現在資料已載入到Excel中使用,您可以像處理任何表一樣處理它。您可以從Excel表格建立圖形和圖表,也...