SQL語句的執行順序怎么理解?

SQL語句的執行順序怎么理解?

我們常常會被SQL其書寫順序和執行順序之間的差異所迷惑。理解這兩者的區別,對于編寫高效、可靠的SQL代碼至關重要。今天,讓我們用一些生動的例子和場景來深入探討SQL的執行順序。

一、書寫順序 VS 執行順序

SQL語句的書寫順序遵循的是邏輯直觀性,使人能夠輕易理解和組織查詢的內容。然而,它的執行順序是基于數據庫查詢優化器的內部機制,旨在提高查詢的效率。

書寫順序

我們通常按照以下順序編寫SQL語句:

  1. SELECT
  2. FROM
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. ORDER BY
  8. LIMIT

執行順序

而其執行順序卻是這樣的:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. (CUBE|ROLLUP)
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. LIMIT

二、深入理解執行順序

FROM 和 JOIN(笛卡爾積、篩選器、外部行)

  • FROM子句是查詢的起點,用于確定基礎表。
  • JOINON子句決定如何將這些表連接起來。

最近無意間獲得一份阿里大佬寫的刷題筆記,一下子打通了我的任督二脈,進大廠原來沒那么難。

這是大佬寫的,?7701頁的BAT大佬寫的刷題筆記,讓我offer拿到手軟

WHERE(篩選行)

  • WHERE子句過濾掉不符合條件的行。

GROUP BY(分組)

  • GROUP BY對符合條件的行進行分組。

HAVING(分組后篩選)

  • HAVING子句篩選分組后的結果。

SELECT 和 DISTINCT(選擇與去重)

  • SELECT確定最終展示的列。
  • DISTINCT用于去除重復的行。

ORDER BY 和 LIMIT(排序和限制)

  • ORDER BY對結果進行排序。
  • LIMIT限制返回的行數。

三、實際案例分析

1. 基礎查詢

考慮一個簡單的查詢:

SELECT name, age
FROM users
WHERE age > 30
ORDER BY age;

這個查詢首先從users表中選擇年齡大于30的記錄(FROMWHERE),然后選擇nameage列(SELECT),最后按年齡排序(ORDER BY)。

2. JOIN查詢

涉及JOIN的復雜查詢:

SELECT u.name, u.age, o.order_id
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE u.age > 30
ORDER BY o.order_date;

在這個例子中,我們首先確定了兩個表(FROM usersJOIN orders),根據用戶ID將它們連接起來(ON u.user_id = o.user_id),過濾出年齡大于30的用戶(WHERE),然后選擇特定的列進行展示(SELECT),最后按訂單日期排序(ORDER BY)。

3. 性能優化場景

假設有一個大型的用戶表和訂單表,我們需要有效地查詢某個年齡段的用戶及其訂單。正確理解執行順序有助于我們優化這個查詢,例如,首先過濾出特定年齡段的用戶,然后再去JOIN訂單表,這樣可以顯著減少JOIN的計算量。

四、ORDER BY的特殊情況

在你提出的問題中,ORDER BY按照SCORE列排序,但SELECT子句中并沒有選擇這一列。這是一個常見的誤區。實際上,在執行ORDER BY時,數據庫會考慮所有的列,即使這些列沒有在SELECT子句中明確指出。因此,即使SCORE列在SELECT子句中沒有出現,它仍然可以用于排序。

五、使用聚合函數

考慮這樣一個查詢:我們想要找出每個部門平均工資最高的前三名員工。

SELECT department_id, employee_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id, employee_id
HAVING AVG(salary) > 10000
ORDER BY department_id, avg_salary DESC
LIMIT 3;

在這個查詢中,我們首先從employees表中選擇數據(FROM),根據department_idemployee_id進行分組(GROUP BY),只選擇平均工資超過10000的組(HAVING),然后選擇部門ID、員工ID和平均工資(SELECT),按部門排序且工資降序(ORDER BY),最后選擇每個部門的前三名(LIMIT)。

六、多表連接

假設我們需要查詢所有顧客的訂單信息,包括顧客姓名和訂單細節。

SELECT c.name, o.order_details
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.order_date > '2023-01-01'
ORDER BY c.name, o.order_date;

這個查詢首先確定了連接customersorders表(FROMJOIN),根據顧客ID連接(ON),篩選出2023年1月1日之后的訂單(WHERE),選擇顧客姓名和訂單詳情(SELECT),并按顧客姓名和訂單日期排序(ORDER BY)。

最近無意間獲得一份阿里大佬寫的刷題筆記,一下子打通了我的任督二脈,進大廠原來沒那么難。

這是大佬寫的,?7701頁的BAT大佬寫的刷題筆記,讓我offer拿到手軟

七、子查詢

子查詢可以用于多種場合,比如在WHERE子句中篩選記錄。

SELECT name, age
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE order_date > '2023-01-01')
ORDER BY age;

在這個例子中,SELECT子查詢首先找出2023年1月1日之后下單的用戶ID,然后外層查詢根據這些ID選擇用戶的名字和年齡(FROMWHERE),最后按年齡排序(ORDER BY)。

八、使用CASE語句

CASE語句可以用來在查詢中添加邏輯。

SELECT name, CASE WHEN age < 20 THEN '少年'WHEN age BETWEEN 20 AND 60 THEN '成年'ELSE '老年'END AS age_group
FROM users
ORDER BY age;

這里,CASE語句根據年齡分組(在SELECT中處理),首先從users表選擇數據(FROM),然后按年齡排序(ORDER BY)。

九、窗口函數

窗口函數可以用來執行復雜的數據分析任務。

SELECT name, age, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

在此查詢中,RANK()窗口函數被用來計算每個部門內員工的工資排名(在SELECT中處理),首先選擇所有員工(FROM),沒有指定特別的排序或限制條件。

這些SQL案例中,可以提煉出幾個關鍵的最佳實踐和技巧

1. 優化數據篩選(WHERE和JOIN)

  • 有效使用WHERE子句:在連接表格前先用WHERE子句過濾掉不需要的數據,可以減少處理的數據量,從而提高查詢效率。
  • 明智選擇JOIN類型:根據查詢需求選擇合適的JOIN類型(INNER JOIN, LEFT JOIN, RIGHT JOIN等),可以有效控制結果集的大小和準確性。

2. 熟練使用聚合和分組(GROUP BY和HAVING)

  • 合理使用聚合函數:在GROUP BY子句中使用聚合函數(如AVG, SUM, COUNT等)可以有效地對數據進行總結和分析。
  • 精確過濾分組結果:HAVING子句用于過濾分組后的結果,特別是在處理聚合數據時,它比WHERE子句更加靈活。

3. 掌握數據排序和限制(ORDER BY和LIMIT)

  • 有效利用ORDER BY:正確使用ORDER BY子句可以確保結果集按照特定的順序返回,這對于報告和用戶界面顯示非常重要。
  • 合理應用LIMIT:LIMIT子句非常有用,尤其是在處理大數據集時,它可以限制返回的結果數量,加快查詢速度并減少內存消耗。

4. 靈活應用子查詢和CASE語句

  • 子查詢的強大功能:子查詢可以在主查詢之前或之內執行,使得SQL語句更加強大和靈活。
  • 使用CASE語句進行條件邏輯處理:CASE語句可以在SELECT、WHERE和ORDER BY子句中使用,實現復雜的條件邏輯。

5. 理解窗口函數

  • 窗口函數的應用:窗口函數(如RANK, ROW_NUMBER等)可以用于執行復雜的數據分析和處理,如排名、分區數據處理等。

6. 性能優化

  • 索引的重要性:合理使用索引可以顯著提高查詢效率,尤其是在大數據量的表上。
  • 避免不必要的復雜性:過于復雜的JOIN和子查詢可能導致性能下降,應當避免不必要的復雜性。

7. 清晰易懂的代碼

  • 代碼可讀性:寫出清晰、易于理解的SQL代碼對于維護和團隊協作非常重要。

通過運用這些技巧,你可以編寫出既高效又易于理解的SQL查詢,這對于處理各種數據分析和數據庫操作任務至關重要。記住,良好的SQL實踐不僅僅關乎代碼本身,還涉及到如何在特定的數據環境中最有效地運用這些代碼。

推薦一個學習 MySQL 的專欄

  • 01、MySQL MariaDB 基礎教程
  • 02、MySQL 簡介
  • 03、MySQL MariaDB 安裝
  • 04、MySQL 管理
  • 05、MySQL 日常管理
  • 06、MySQL PHP 語法
  • 07、MySQL 創建連接
  • 08、MySQL 獲取數據庫列表
  • 09、MySQL 創建數據庫
  • 10、MySQL 刪除數據庫
  • 11、MySQL 選擇數據庫
  • 12、MySQL 數據類型
  • 13、MySQL 列出數據表
  • 14、MySQL 創建數據表
  • 15、MySQL 刪除表
  • 16、MySQL 插入數據
  • 17、MySQL 獲取插入數據的 ID
  • 18、MySQL SELECT FROM 查詢數據
  • 19、MySQL WHERE 子句有條件的查詢數據
  • 20、MySQL UPDATE 更新數據
  • 21、MySQL DELETE FROM 語句刪除數據
  • 22、MySQL 返回刪改查受影響的行數
  • 23、MySQL LIKE 子句模糊查詢數據
  • 24、MySQL UNION 操作符查詢多張表
  • 25、MySQL ORDER BY 排序
  • 26、MySQL GROUP BY 分組查詢數據
  • 27、MySQL JOIN 進行多表查詢
  • 28、MySQL NULL 值處理
  • 29、MySQL REGEXP 子句正則表達式查詢
  • 30、MySQL 數據庫事務
  • 31、MySQL ALTER 命令
  • 32、MySQL 索引
  • 33、CREATE TEMPORARY TABLE 創建臨時表
  • 34、MySQL DROP TABLE 刪除臨時表
  • 35、MySQL INSERT INTO SELECT 復制表
  • 36、MySQL 獲取服務器元數據
  • 37、MySQL 自增序列 AUTO_INCREMENT
  • 38、MySQL 處理重復數據
  • 39、MySQL 安全及防止 SQL 注入攻擊
  • 40、MySQL 導出數據
  • 41、MySQL 導入數據

總結

理解SQL的執行順序不僅能幫助我們寫出更有效的查詢,還能讓我們更好地理解數據庫是如何處理我們的請求的。通過實際案例的分析和理解,我們可以更好地掌握SQL查詢的藝術。記住,每一條SQL語句都像是一次小小的旅行,從FROM出發,經過一系列的處理,最終到達SELECT的歸宿。

在SQL的世界里,旅途的順序和規劃同樣重要,它決定了查詢的效率和準確性。我們要做的,就是成為這個旅程的優秀規劃師。

最后說一句(求關注,求贊,別白嫖我)

最近無意間獲得一份阿里大佬寫的刷題筆記,一下子打通了我的任督二脈,進大廠原來沒那么難。

這是大佬寫的, 7701頁的BAT大佬寫的刷題筆記,讓我offer拿到手軟

項目文檔&視頻:

項目文檔 & 視頻

本文,已收錄于,我的技術網站 ddkk.com,有大廠完整面經,工作技術,架構師成長之路,等經驗分享

求一鍵三連:點贊、分享、收藏

點贊對我真的非常重要!在線求贊,加個關注我會非常感激!@架構師專欄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【unity實戰】一個通用的FPS槍支不同武器射擊控制腳本

文章目錄 前言模型素材文章用到的粒子火光特效射擊效果換彈瞄準開槍抖動效果設置顯示文本最終代碼不同武器射擊效果1. 手槍2. 機槍3. 狙擊槍4. 霰彈槍5. 加特林 其他感謝完結 前言 實現FPS槍支不同武器效果&#xff0c;比如手槍&#xff0c;噴子&#xff0c;狙擊槍&#xff0c…

《使用ThinkPHP6開發項目》 - 創建應用

《使用ThinkPHP6開發項目》 - 安裝ThinkPHP框架-CSDN博客 《使用ThinkPHP6開發項目》 - 設置項目環境變量-CSDN博客 《使用ThinkPHP6開發項目》 - 項目使用多應用開發-CSDN博客 根據前面的步驟&#xff0c;我們現在就可以開發我們的項目開發了&#xff0c;根據項目開發的需要…

【數據挖掘】國科大蘇桂平老師數據庫新技術課程作業 —— 第四次作業

云數據庫研究 云計算與云數據庫背景 云計算&#xff08;cloud computing&#xff09;是 IT 技術發展的最新趨勢&#xff0c;正受到業界和學術界的廣泛關注。云計算是在分布式處理、并行處理和網格計算等技術的基礎上發展起來的&#xff0c;是一種新興的共享基礎架構的方法。它…

Django多對多ManyToManyField字段

Django是一個支持多對多關系的Web框架&#xff0c;可以在模型中定義多對多關系。多對多關系通常涉及兩個實體之間的復雜交互&#xff0c;例如用戶和組之間的關系&#xff0c;或者課程和學生之間的關系。在Django中&#xff0c;可以使用ManyToManyField字段來定義多對多關系。 …

[足式機器人]Part4 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;CLEAR_LAB 筆者帶更新-運動學 課程主講教師&#xff1a; Prof. Wei Zhang 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

機器學習基礎入門

機器學習 引言 介紹機器學習的重要性和應用領域。簡要說明機器學習與人工智能的關系。 在當今迅速發展的技術世界中&#xff0c;機器學習已經成為一項不可或缺的技術&#xff0c;它正在改變我們解決問題和理解世界的方式。機器學習&#xff0c;作為人工智能&#xff08;AI&a…

最新Redis7持久化(權威出版)

首先我們要知道什么是持久化&#xff1a;持久化是指將數據保存到磁盤上&#xff0c;以確保在Redis服務器重啟時數據不會丟失。 Redis支持兩種主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面讓我依次給你介紹一下&#xff1a; RDB持久化 作用 這是將Redis數據保存…

Java8新特性 - Stream

一、特性 Java 8引入的Stream API為集合&#xff08;Collections&#xff09;提供了一種聲明式的處理方式&#xff0c;支持豐富的操作&#xff0c;包括篩選、映射、歸約等。以下是一些Stream的主要功能和使用方式的案例&#xff1a; 創建Stream&#xff1a; List<String&…

Java語言概述及保姆級入門教程(JDK 17版本)

筆記來自尚硅谷老師-康老師 學習教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 1、Java基礎全程脈絡圖 1.1 本章專題與脈絡 2. 抽絲剝繭話Java 2.1 當前大學生就業形勢 麥可思研究院發布了《2022年中國大學生就業…

TCP 和UDP 到底有啥區別

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是互聯網上常用的兩種傳輸層協議&#xff0c;它們在數據傳輸方式和特性上有顯著的區別。下面是TCP和UDP的主要區別&#xff1a; 連接性: TCP 是一種面向連接的協議。在數據傳輸前&#xf…

C#圖像處理OpenCV開發指南(CVStar,09)——邊緣識別之Scharr算法的實例代碼

1 邊緣識別之Scharr算法 算法文章很多&#xff0c;不再論述。 1.1 函數原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 參數說明 src 代表原始圖像。dst 代表目標圖像。ddepth 代表輸出圖像的深度。CV_16Sdx 代表x方向上的求導階數…

uniApp應用軟件在運行時,不符合華為應用市場審核標準。解決方案合集!

&#xff08;暫時用不到的也建議收藏一下&#xff0c;因為文章持續更新中&#xff09; 最新更改時間&#xff1a;20023-12-10 第一次做App應用開發相信大家一定都遇到過華為應用市場審核的“駁回”&#xff01; 有些問題一看就明白可以立馬修改&#xff0c;而有一些問題修改意…

Dubbo入門直接上手,結合微服務詳解

Dubbo 高性能、輕量級的 Java RPC 框架 RPC&#xff1a; Remote Procedure Call 遠程過程調用&#xff0c;簡單來說就是它允許一個計算機程序通過網絡請求調用另一個計算機上的程序&#xff0c;就像本地調用一樣。有非常多的協議和技術來都實現了RPC的過程&#xff0c;比如&a…

Elasticsearch 8.9 refresh刷Es緩沖區的數據到Lucene,更新segemnt,使數據可見

一、相關API的handler1、接受HTTP請求的hander(RestRefreshAction)2、往數據節點發送刷新請求的action(TransportRefreshAction)3、數據節點接收主節點refresh傳輸的action(TransportShardRefreshAction) 二、在IndexShard執行refresh操作1、根據入參決定是使用lucene提供的阻塞…

【華為數據之道學習筆記】3-8以確保合規遵從為核心的外部數據管理

一、以確保合規遵從為核心的外部數據管理 外部數據是指華為公司引入的外部組織或者個人擁有處置權利的 數據&#xff0c;如供應商資質證明、消費者洞察報告等。外部數據治理的出發點是合規遵從優先&#xff0c;與內部數據治理的目的不同。 外部數據的治理主要遵循以下原則。 1&…

【設計模式--創建型--原型模式】

設計模式--創建型--原型模式 原型模式概述結構實現結果 案例代碼結果使用場景 擴展&#xff08;深\淺克隆&#xff09;淺克隆演示&#xff1a;結果&#xff1a;使用深克隆&#xff08;利用對象流&#xff09;結果 原型模式 概述 用一個已經創建的實例作為原型&#xff0c;通過…

Go簡單了解

0.一直很好奇,go是不是像傳說中的速度快,解決了多線程問題,快速進行了解了解,和java進行對比,他是怎么解決語言發展的問題的…,所有語言都是差不多的,只是熟練程度不同而已 1.go圖標是土撥鼠,2009發行 docker使用go,解決了并發問題 google facebook 騰訊 百度 七牛云 京東 小米…

Spring Cloud Gateway + Nacos + LoadBalancer實現企業級網關

1. Spring Cloud Gateway 整合Nacos、LoadBalancer 實現企業級網關 前置工作&#xff1a; 創建 SpringBoot 多模塊項目創建網關&#xff08;gateway-service&#xff09;、用戶&#xff08;user-service&#xff09;模塊用戶模塊添加 Nacos discovery 支持以及 Spring Web&am…

gitbash下載安裝

參考教程 零、下載 官網地址 2.43.0win64 鏈接&#xff1a;https://pan.baidu.com/s/16urs_nmky7j20-qNzUTTkg 提取碼&#xff1a;7jaq 一、安裝 圖標組件&#xff08;Additional icons&#xff09;&#xff1a;選擇是否創建桌面快捷方式&#xff1b;桌面瀏覽&#xff08;Win…

設計模式--命令模式的簡單例子

引入&#xff1a;以一個對數組的增刪改查為例。通過命令模式可以對數組進行增刪改查以及撤銷回滾。 一、基本概念 命令模式有多種分法&#xff0c;在本文中主要分為CommandMgr、Command、Receiver. CommandMgr主要用于控制命令執行等操作、Command為具體的命令、Receiver為命…