」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > SQL 連結內部

SQL 連結內部

發佈於2024-11-07
瀏覽:392

Inside SQL Joins

SQL 连接是查询数据库的基础,它允许用户根据指定条件组合多个表中的数据。连接分为两种主要类型:逻辑连接和物理连接。逻辑联接代表组合表中数据的概念方式,而物理联接是指这些联接在数据库系统(例如 RDS(关系数据库服务)或其他 SQL 服务器)中的实际实现。在今天的博文中,我们将揭开 SQL 连接的神秘面纱。

让我们开始吧!

逻辑连接

SQL中有多种类型的逻辑连接。最常见的两种是内连接和外连接。当我们需要从表中检索数据时,我们使用这些联接。

物理连接

物理连接在RDS内部实现。用户使用逻辑联接编写查询,RDS 使用物理联接来执行联接操作。有不同类型的物理连接,例如
1. 嵌套循环连接
2. 哈希连接
3. Merge Join等

嵌套循环连接

这是一种连接类型,其中选择记录较少的较小表并循环访问另一个表,直到找到匹配项。这种类型的联接在 MySQL、Postgres 甚至 SQL 服务器中都可用。但是,对于大型表来说,它不是一个可扩展的选项。主要用于连接运算符不使用相等的情况。

例如,地理空间查询:在处理地理数据时,您可能想要查找距其他点一定距离内的点。这可能涉及比较每个点组合之间的距离,这可以通过嵌套循环连接来实现。

SELECT *
FROM cities
JOIN landmarks ON distance(cities.location, landmarks.location) 



哈希连接

哈希联接是一种使用哈希表执行联接以查找匹配记录的方法。在内存中创建一个哈希表。如果数据量很大而没有足够的内存来存储它,则将其写入磁盘。哈希连接比嵌套循环连接更有效。在执行过程中,RDS 会构建内存中的哈希表,其中使用连接属性作为键来存储连接表中的行。执行后,服务器开始从另一个表中读取行,并从哈希表中找到相应的行。当连接运算符使用相等时,通常使用此方法。

假设您有一个“员工”表,其中包含 ID、姓名和部门 ID 等员工详细信息,以及一个“部门”表,其中包含 ID 和名称等部门详细信息。您想要连接这些表以获取每个员工所属的部门

SELECT *
FROM Employee
JOIN Department ON Employee.department_id = Department.department_id;

在此示例中,联接条件基于列之间的相等性,使其适合哈希联接。这种方法非常高效,尤其是在处理大型数据集时,因为它可以使用哈希表快速匹配记录。然而,与任何连接方法一样,重要的是要考虑数据集的大小和可用内存以确保最佳性能。

合并连接

Merge Join 是一种在 SQL 查询执行中使用的方法,当连接条件使用相等运算符且连接两边都很大时使用。该技术依赖于排序的数据输入。如果连接列中使用的表达式存在索引,则可以利用它来高效地获取排序后的数据。但是,如果服务器需要显式对数据进行排序,则分析索引并考虑优化它们以提高性能至关重要。

例子:
考虑一个场景,涉及包含销售交易的“销售”表,包括销售 ID、客户 ID 和销售金额,以及包含客户 ID、姓名和位置等客户详细信息的“客户”表。

SELECT *
FROM Sales
JOIN Customers ON Sales.customer_id = Customers.customer_id;

在这种情况下,“Sales”和“Customers”表都很重要,并且连接条件依赖于“customer_id”列的相等性。为了实现高效的合并联接,两个输入表都需要按联接列(“customer_id”)排序。如果“customer_id”列上没有现有索引,服务器可能需要执行额外的排序操作,这可能会影响性能。

要优化合并联接,建议在两个表中的“customer_id”列上创建或修改索引。确保正确维护和优化这些索引可以显着提高查询性能,特别是对于经常涉及基于“customer_id”列的联接的查询。

通过有效利用索引并确保数据输入排序,合并联接可以有效地处理具有基于相等联接条件的大型表之间的联接,有助于增强查询性能和整体系统效率。

方面 嵌套循环连接 哈希连接 合并连接
加入条件 不等式 平等 平等
输入数据大小 小型到中型 中型到大型 大的
数据排序 不需要 不需要 必需的
内存使用情况 低的 中到高 中到高
索引利用率 不是主要问题 有利 依赖于索引
性能(大数据集) 慢点 高效的 高效的
可扩展性 可扩展性较差 可扩展 可扩展
典型用例 中小型桌子 具有相等连接的大型表 具有相等连接的大型表
版本聲明 本文轉載於:https://dev.to/balajisasi/inside-sql-joins-5h6b?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • #daysofMiva 挑戰賽的第一天。
    #daysofMiva 挑戰賽的第一天。
    100 天挑戰的第一天 日期: 8/21/2024 目標: 學習並理解 JavaScript 中的變數、邏輯運算和資料類型,使用 JavaScript 解決數學問題,並開始學習事件監聽器和條件語句。 1. JavaScript變數介紹 今天,我透過學習變數開始了 JavaScrip...
    程式設計 發佈於2024-11-07
  • 如何將 PHP 產生的值安全地整合到 JavaScript 程式碼中?
    如何將 PHP 產生的值安全地整合到 JavaScript 程式碼中?
    將PHP 產生的值合併到頁面上的JavaScript 中嘗試將PHP 產生的值嵌入到JavaScript 程式碼中時,您可能會遇到類似於給定範例中的錯誤。要解決此問題,請考慮以下方法:<?php $htmlString = 'testing'; ?> <html> &l...
    程式設計 發佈於2024-11-07
  • 了解非同步 JavaScript
    了解非同步 JavaScript
    JavaScript 是一種單執行緒語言,這意味著它一次只能做一件事。然而,Web 應用程式通常需要執行從伺服器取得資料等任務,這可能需要一些時間。如果 JavaScript 必須等待每個任務完成才能繼續,那麼您的 Web 應用程式將會變得緩慢且無回應。這就是非同步(async)JavaScript...
    程式設計 發佈於2024-11-07
  • 您應該避免的錯誤(以及如何修復它們)
    您應該避免的錯誤(以及如何修復它們)
    身為 React 開發人員,很容易陷入某些編碼模式,這些模式一開始看起來很方便,但最終可能會導致問題。在這篇文章中,我們將探討 5 個常見的 React 錯誤,並討論如何避免它們,確保您的程式碼保持高效、可維護和可擴展。 1. 濫用關鍵道具 錯誤: {myList.map((ite...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中存取 JavaScript 變數值?
    如何在 PHP 中存取 JavaScript 變數值?
    在PHP 中使用JavaScript 變數值使用同時涉及JavaScript 和PHP 的Web 應用程式時,通常需要在兩者之間交換資料兩種語言。然而,由於語言的執行環境不同,直接在 PHP 中存取 JavaScript 變數是不可能的。 PHP 在伺服器端執行,而 JavaScript 在客戶端運...
    程式設計 發佈於2024-11-07
  • Popver API VS 對話方塊模態:相同但不同
    Popver API VS 對話方塊模態:相同但不同
    我在閱讀一些科技新聞部落格時偶然發現標題 Popover API 登陸 Baseline。我很困惑,在我最近深入前端開發期間,我最近很難習慣在 HTML 中使用 Elements。在瀏覽部落格時,我一直對到目前為止我如何使用該元素感到困惑。 長話短說 選擇: 需要使用者焦點的模態彈...
    程式設計 發佈於2024-11-07
  • Go中不嵌入結構體可以實現方法繼承嗎?
    Go中不嵌入結構體可以實現方法繼承嗎?
    嵌入式結構:方法繼承的探索理解Go 中的方法繼承 In在Go 中,將方法從一種類型繼承到另一種類型的能力主要是透過嵌入結構來實現的。此技術涉及將一個結構嵌入另一個結構,允許外部結構存取和利用嵌入結構的方法。 嵌入結構的範例考慮以下內容程式碼片段:type Properties map[string]...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中的 Foreach 迴圈中檢索數組鍵
    如何在 PHP 中的 Foreach 迴圈中檢索數組鍵
    在Foreach 循環期間檢索數組鍵:PHP在PHP 中使用數組時,通常需要檢索其中的鍵和值foreach 循環。 key() 函數提供了一種在迭代期間存取當前鍵的便捷方法。但是,在某些情況下,它可能不會產生所需的結果。 考慮以下程式碼,其目的是從範例陣列產生 HTML 表:foreach($sam...
    程式設計 發佈於2024-11-07
  • 在 JavaScript 中建立物件的方法
    在 JavaScript 中建立物件的方法
    介紹 在 JavaScript 中建立物件的方法有很多種。 對象字面量 Object() 建構子 Object.create() 建構子 ES6 類 對象字面量 這可能是在 JavaScript 中建立物件最快、最簡單的方法。這也稱為物件初始值設定項,是一個由零對...
    程式設計 發佈於2024-11-07
  • 如何在 JavaScript 中擴充自訂異常的錯誤物件?
    如何在 JavaScript 中擴充自訂異常的錯誤物件?
    擴充JavaScript 中的錯誤物件在JavaScript 中拋出例外時,可能想要擴充內建Error 物件以建立自訂錯誤類型。這允許更具體和資訊豐富的異常處理。 在JavaScript 中,繼承不是透過子類化與Python 不同,在Python 中,異常通常是從Exception 基類進行子類化的...
    程式設計 發佈於2024-11-07
  • MySQL如何保證並發操作時資料的完整性?
    MySQL如何保證並發操作時資料的完整性?
    MySQL 並發:確保資料完整性如果您的MySQL 資料庫使用InnoDB 儲存引擎,您可能會擔心在執行過程中潛在的並發問題。同時記錄更新或插入。本文探討了 MySQL 如何處理並發以及是否需要在應用程式中加入額外的處理。 MySQL 的同時處理MySQL 採用原子性,這意味著單獨的 SQL 語句是...
    程式設計 發佈於2024-11-07
  • 如何使用 Go 在 SQL 查詢中有效連接字串和值?
    如何使用 Go 在 SQL 查詢中有效連接字串和值?
    在Go 中有效地製作SQL 查詢在Go 中將字串與文字SQL 查詢中的值連接起來可能有點棘手。與 Python 不同,Go 的字串格式化語法行為不同,導致常見錯誤,如此處遇到的錯誤。 元組語法錯誤初始程式碼片段嘗試使用 Python -style 元組,Go 中不支援。這會導致語法錯誤:query ...
    程式設計 發佈於2024-11-07
  • 為什麼 json_encode() 無法使用 Latin1 編碼對 MySQL 資料庫中的重音字元進行編碼?
    為什麼 json_encode() 無法使用 Latin1 編碼對 MySQL 資料庫中的重音字元進行編碼?
    MySQL 中UTF-8 字元的JSON 編碼難題當嘗試使用latin1_swedish_ci 編碼從資料庫中檢索重音字元並使用json_encode() 將它們編碼為JSON 時,結果可能出乎意料。預期結果(例如“Abord â Plouffe”)會轉換為“null”,從而使編碼的 JSON 無效...
    程式設計 發佈於2024-11-07
  • 如何在 MySQL 中將行轉置為列:綜合指南
    如何在 MySQL 中將行轉置為列:綜合指南
    在MySQL 中將行轉換為列在MySQL 中將行轉換為列在MySQL 查詢中將行轉換為列需要在應用程式中執行複雜的查詢或手動操作。 GROUP_CONCAT 解雖然 GROUP_CONCAT 可以將行轉換為單列,但它不提供整個結果集所需的轉置。 手動查詢方法對於更複雜的轉置,需要細緻的查詢,從原始行...
    程式設計 發佈於2024-11-07
  • 如何解決iOS後台模式下未收到GCM通知的問題
    如何解決iOS後台模式下未收到GCM通知的問題
    當應用程式在iOS 上處於後台模式時未收到GCM 通知當iOS 在後台收到通知但不處理時,會出現此問題它們在使用者介面中。若要解決此問題,請確保您的應用程式:啟用後台推播通知:檢查您的應用程式是否已要求並取得在背景接收推播通知的權限。 設定徽章應用程式圖示:驗證是否在應用程式的「設定」>「通知」部分...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3