最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL DQL從基礎(chǔ)查詢到實(shí)戰(zhàn)優(yōu)化全指南

 更新時(shí)間:2025年09月18日 09:41:33   作者:cyforkk  
本文系統(tǒng)講解MySQL DQL核心概念與規(guī)范,涵蓋基礎(chǔ)查詢、條件篩選、聚合分析、分組排序及分頁優(yōu)化,強(qiáng)調(diào)避免SELECT*、合理使用索引、執(zhí)行順序理解,助你寫出高效可讀的查詢語句,感興趣的朋友跟隨小編一起看看吧

MySQL DQL 完全指南:從基礎(chǔ)查詢到實(shí)戰(zhàn)優(yōu)化

DQL(數(shù)據(jù)查詢語言)是 SQL 中最常用、最核心的部分 ——80% 的數(shù)據(jù)庫操作都是 “查詢”。無論是業(yè)務(wù)報(bào)表、數(shù)據(jù)分析還是頁面展示,都離不開SELECT語句。但很多開發(fā)者寫查詢時(shí)只追求 “能查出結(jié)果”,卻忽視了效率和可讀性,導(dǎo)致 “查詢慢”“邏輯亂” 等問題。本文從基礎(chǔ)查詢到復(fù)雜分組,再到執(zhí)行順序和規(guī)范,系統(tǒng)拆解 DQL 的核心知識點(diǎn),幫你寫出 “既正確又高效” 的查詢語句。

一、DQL 核心概念與通用規(guī)范

1. 什么是 DQL?

DQL(Data Query Language)是用于從表中查詢數(shù)據(jù)的 SQL 語句,核心命令只有一個(gè):SELECT。它不修改數(shù)據(jù),只返回結(jié)果集,是業(yè)務(wù)開發(fā)中使用頻率最高的 SQL 類型。

2. 通用語法框架

所有查詢語句都遵循以下基本結(jié)構(gòu)(按執(zhí)行順序排列,而非書寫順序):

SELECT [DISTINCT] 字段列表  -- 5. 確定返回哪些字段
FROM 表名                  -- 1. 確定查詢的表
[WHERE 條件]               -- 2. 篩選行(分組前)
[GROUP BY 分組字段]        -- 3. 按字段分組
[HAVING 分組條件]          -- 4. 篩選分組(分組后)
[ORDER BY 排序字段 [ASC/DESC]]  -- 6. 排序
[LIMIT 起始位置, 條數(shù)];    -- 7. 分頁(限制返回條數(shù))

3. 通用規(guī)范(提升可讀性和效率)

  • 字段明確化:禁止用SELECT *(冗余字段拖慢速度,表結(jié)構(gòu)變更易出錯(cuò)),需指定具體字段;
  • 關(guān)鍵字大寫:SELECT、FROM等關(guān)鍵字大寫,字段名 / 表名小寫,區(qū)分清晰;
  • 格式對齊:多條件 / 多字段時(shí)換行對齊(示例見下文),避免一行堆到底;
  • 注釋說明:復(fù)雜查詢加注釋,說明查詢目的(如 “統(tǒng)計(jì)各部門月均薪資”);
  • 優(yōu)先索引:WHERE、GROUP BY、ORDER BY的字段盡量建索引(加速查詢)。

二、基礎(chǔ)查詢:獲取數(shù)據(jù)的第一步

基礎(chǔ)查詢是所有復(fù)雜查詢的基礎(chǔ),核心是 “明確要查哪些字段”。

1. 語法與案例

(1)查詢指定字段
-- 語法:SELECT 字段1, 字段2 FROM 表名;
SELECT emp_id, emp_name, salary FROM employee;  -- 查員工的ID、姓名、薪資
(2)查詢所有字段(不推薦,僅臨時(shí)調(diào)試用)
SELECT * FROM employee;  -- 查所有字段(生產(chǎn)環(huán)境禁止?。?

問題:返回冗余字段(如無需展示的create_time),表加新字段后會(huì)自動(dòng)返回,可能導(dǎo)致業(yè)務(wù)異常。

(3)去重查詢(DISTINCT)
-- 語法:SELECT DISTINCT 字段 FROM 表名;  -- 去除字段重復(fù)值
SELECT DISTINCT dept_id FROM employee;  -- 查所有有員工的部門ID(去重)

注意:DISTINCT作用于其后所有字段(如DISTINCT a,b會(huì)同時(shí)去重 a 和 b 的組合)。

(4)別名查詢(AS)

用別名簡化字段名或表名,提升可讀性:

-- 語法:字段/表名 [AS] 別名(AS可省略)
SELECT 
  emp_id AS 員工ID, 
  emp_name 姓名,  -- 省略AS
  salary * 12 年薪  -- 表達(dá)式也可加別名
FROM employee e;  -- 表別名e(后續(xù)可簡寫)

三、條件查詢:篩選符合要求的數(shù)據(jù)

實(shí)際業(yè)務(wù)中很少查全表數(shù)據(jù),而是按條件篩選(如 “查薪資> 10000 的員工”),WHERE子句是條件查詢的核心。

1. 常用條件運(yùn)算符

類型運(yùn)算符 / 關(guān)鍵字說明
比較運(yùn)算=、!=、>、<、>=、<=基本比較(如salary > 10000)
邏輯運(yùn)算AND、OR、NOT多條件組合(如salary > 8000 AND dept_id=1)
范圍查詢BETWEEN … AND …在指定范圍內(nèi)(如age BETWEEN 20 AND 30)
集合查詢IN (值1, 值2…)在指定集合中(如dept_id IN (1,2))
模糊查詢LIKE匹配字符串(%通配任意字符,_通配單個(gè)字符)
空值查詢IS NULL / IS NOT NULL判斷是否為空(如dept_id IS NULL)

2. 實(shí)戰(zhàn)案例

-- 案例1:查研發(fā)部(dept_id=1)薪資>10000的員工
SELECT emp_name, salary 
FROM employee 
WHERE dept_id = 1 AND salary > 10000;
-- 案例2:查年齡在25-35歲之間(包含25和35)的員工
SELECT emp_name, age 
FROM employee 
WHERE age BETWEEN 25 AND 35;  -- 等價(jià)于 age >=25 AND age <=35
-- 案例3:查部門ID為1、2、3的員工(用IN替代多個(gè)OR)
SELECT emp_name, dept_id 
FROM employee 
WHERE dept_id IN (1, 2, 3);  -- 比 dept_id=1 OR dept_id=2 更簡潔
-- 案例4:查姓名以“張”開頭的員工(模糊查詢)
SELECT emp_name 
FROM employee 
WHERE emp_name LIKE '張%';  -- %匹配任意字符(如“張三”“張三豐”)
-- 案例5:查沒有部門(dept_id為空)的員工
SELECT emp_name 
FROM employee 
WHERE dept_id IS NULL;  -- 注意:不能用 = NULL(NULL需用IS判斷)

3. 條件查詢規(guī)范

  • 多條件優(yōu)先用AND/OR,避免嵌套過深(超過 3 層建議拆分);
  • 范圍判斷優(yōu)先用BETWEEN(比>=+<=更簡潔);
  • 模糊查詢慎用%開頭(如LIKE ‘%張’,會(huì)導(dǎo)致索引失效,查詢變慢)。

四、聚合函數(shù):對數(shù)據(jù)做統(tǒng)計(jì)分析

聚合函數(shù)用于 “匯總數(shù)據(jù)”(如 “計(jì)算平均薪資”“統(tǒng)計(jì)員工總數(shù)”),常與GROUP BY配合使用。

1. 常用聚合函數(shù)

函數(shù)說明示例
COUNT()統(tǒng)計(jì)行數(shù)(非 NULL 值的數(shù)量)COUNT(emp_id) 統(tǒng)計(jì)有效員工數(shù)
SUM()求和(僅數(shù)值類型)SUM(salary) 計(jì)算總薪資
AVG()求平均值(僅數(shù)值類型)AVG(salary) 計(jì)算平均薪資
MAX()求最大值MAX(salary) 查最高薪資
MIN()求最小值MIN(hire_date) 查最早入職日期

2. 實(shí)戰(zhàn)案例

-- 案例1:統(tǒng)計(jì)員工總數(shù)(COUNT(*)包含NULL,COUNT(字段)排除NULL)
SELECT 
  COUNT(*) AS 總記錄數(shù),  -- 包含所有行(包括字段為NULL的)
  COUNT(emp_id) AS 有效員工數(shù)  -- 僅統(tǒng)計(jì)emp_id非NULL的行(主鍵不會(huì)NULL)
FROM employee;
-- 案例2:計(jì)算研發(fā)部(dept_id=1)的薪資總和、平均值、最高值
SELECT 
  SUM(salary) AS 總薪資,
  AVG(salary) AS 平均薪資,
  MAX(salary) AS 最高薪資
FROM employee 
WHERE dept_id = 1;  -- 先篩選研發(fā)部,再聚合

3. 聚合函數(shù)注意事項(xiàng)

  • COUNT(*) 統(tǒng)計(jì)所有行(包括 NULL),COUNT(字段) 統(tǒng)計(jì)該字段非 NULL 的行;
  • 聚合函數(shù)會(huì)自動(dòng)忽略NULL值(如SUM(salary) 不會(huì)計(jì)算salary為 NULL 的行);
  • 不能在WHERE中使用聚合函數(shù)(如WHERE AVG(salary) > 8000 錯(cuò)誤,需用HAVING)。

五、分組查詢:按類別匯總數(shù)據(jù)

分組查詢(GROUP BY)用于 “按某個(gè)字段分類統(tǒng)計(jì)”(如 “按部門統(tǒng)計(jì)員工數(shù)”),常與聚合函數(shù)配合。

1. 語法與案例

-- 基礎(chǔ)語法:GROUP BY 分組字段 [HAVING 分組條件]
-- 案例1:按部門分組,統(tǒng)計(jì)每個(gè)部門的員工數(shù)和平均薪資
SELECT 
  dept_id AS 部門ID,
  COUNT(emp_id) AS 員工數(shù),  -- 每個(gè)部門的員工數(shù)
  AVG(salary) AS 平均薪資   -- 每個(gè)部門的平均薪資
FROM employee 
GROUP BY dept_id;  -- 按部門ID分組
-- 案例2:分組后篩選(HAVING):平均薪資>9000的部門
SELECT 
  dept_id AS 部門ID,
  COUNT(emp_id) AS 員工數(shù),
  AVG(salary) AS 平均薪資
FROM employee 
GROUP BY dept_id
HAVING 平均薪資 > 9000;  -- 篩選分組后的結(jié)果(用別名更簡潔)

2. WHERE vs HAVING(核心區(qū)別)

子句作用時(shí)機(jī)能否用聚合函數(shù)典型場景
WHERE分組篩選行不能篩選單個(gè)字段(如dept_id=1)
HAVING分組篩選組篩選聚合結(jié)果(如AVG(salary)>9000)

示例對比

-- 先篩選2022年后入職的員工,再按部門分組統(tǒng)計(jì)平均薪資>8000的部門
SELECT 
  dept_id, 
  AVG(salary) AS 平均薪資
FROM employee 
WHERE hire_date >= '2022-01-01'  -- 分組前:只留2022年后入職的
GROUP BY dept_id
HAVING 平均薪資 > 8000;  -- 分組后:只留平均薪資超8000的部門

六、排序查詢:按規(guī)則排列結(jié)果

查詢結(jié)果默認(rèn)無序,ORDER BY用于按指定字段排序(如 “按薪資從高到低排列”)。

1. 語法與案例

-- 基礎(chǔ)語法:ORDER BY 字段1 [ASC/DESC], 字段2 [ASC/DESC]
-- ASC:升序(默認(rèn),可省略);DESC:降序
-- 案例1:按薪資降序排列(從高到低)
SELECT emp_name, salary 
FROM employee 
ORDER BY salary DESC;
-- 案例2:多字段排序:先按部門ID升序,再按薪資降序
SELECT emp_name, dept_id, salary 
FROM employee 
ORDER BY dept_id ASC, salary DESC;  -- 部門相同則比薪資

2. 排序規(guī)范

  • 字符串排序按字符編碼順序(如中文按拼音,需注意數(shù)據(jù)庫字符集);
  • 大表排序加索引(ORDER BY的字段建索引,避免全表掃描排序);
  • 分頁前必須排序(否則分頁結(jié)果可能混亂,如第 1 頁和第 2 頁有重復(fù)數(shù)據(jù))。

七、分頁查詢:限制返回結(jié)果條數(shù)

當(dāng)數(shù)據(jù)量很大時(shí)(如 10 萬條),需分頁查詢(如 “每頁顯示 10 條”),LIMIT是實(shí)現(xiàn)分頁的核心。

1. 語法與案例

-- 語法:LIMIT 起始位置, 每頁條數(shù)(起始位置從0開始)
-- 計(jì)算方式:第N頁的起始位置 = (N-1) * 每頁條數(shù)
-- 案例1:查詢第1頁數(shù)據(jù)(每頁10條,起始位置0)
SELECT emp_id, emp_name 
FROM employee 
ORDER BY emp_id ASC  -- 分頁必須先排序,保證順序一致
LIMIT 0, 10;
-- 案例2:查詢第2頁數(shù)據(jù)(起始位置10,取10條)
SELECT emp_id, emp_name 
FROM employee 
ORDER BY emp_id ASC 
LIMIT 10, 10;

2. 分頁規(guī)范

  • 分頁必加ORDER BY(否則每次查詢的 “第 1 頁” 可能不同);
  • 大表分頁優(yōu)化:用主鍵范圍替代LIMIT(如WHERE emp_id > 100 LIMIT 10,比LIMIT 100,10快);
  • 前端傳遞 “頁碼” 和 “每頁條數(shù)”,后端計(jì)算起始位置(避免前端傳錯(cuò))。

八、案例練習(xí):綜合查詢實(shí)戰(zhàn)

結(jié)合以上所有知識點(diǎn),實(shí)現(xiàn)一個(gè) “多條件統(tǒng)計(jì) + 排序 + 分頁” 的綜合查詢:

需求:查詢研發(fā)部(dept_id=1)2022 年后入職的員工,按薪資降序排列,統(tǒng)計(jì)每個(gè)薪資段的人數(shù),只看人數(shù)≥2 的薪資段,最后取第 1 頁(每頁 5 條)。

-- 分步拆解:
-- 1. 篩選研發(fā)部+2022年后入職(WHERE)
-- 2. 按薪資段分組(GROUP BY)
-- 3. 篩選人數(shù)≥2的組(HAVING)
-- 4. 按人數(shù)降序(ORDER BY)
-- 5. 分頁取第1頁(LIMIT)
SELECT 
  FLOOR(salary / 1000) * 1000 AS 薪資段,  -- 按1000為單位分組(如8000-8999)
  COUNT(emp_id) AS 人數(shù)
FROM employee 
WHERE dept_id = 1 AND hire_date >= '2022-01-01'
GROUP BY 薪資段
HAVING 人數(shù) >= 2
ORDER BY 人數(shù) DESC
LIMIT 0, 5;

九、DQL 執(zhí)行順序:理解查詢的 “幕后流程”

很多人困惑 “為什么WHERE不能用聚合函數(shù)”“別名在哪個(gè)階段生效”,答案在執(zhí)行順序里。DQL 各部分的執(zhí)行順序如下(與書寫順序不同):

  • FROM:確定查詢的表;
  • WHERE:篩選行(分組前);
  • GROUP BY:按字段分組;
  • HAVING:篩選分組(分組后);
  • SELECT:確定返回的字段和別名;
  • ORDER BY:按字段或別名排序(此時(shí)已能識別SELECT中的別名);
  • LIMIT:分頁限制返回條數(shù)。

舉例說明

SELECT salary12 AS 年薪 FROM employee WHERE 年薪 > 100000 會(huì)報(bào)錯(cuò) —— 因?yàn)閃HERE在SELECT之前執(zhí)行,此時(shí) “年薪” 別名還未生成。正確寫法是WHERE salary12 > 100000。

十、DQL 小結(jié):核心要點(diǎn)與規(guī)范總覽

1. 核心操作清單

操作類型關(guān)鍵字 / 語法核心作用注意事項(xiàng)
基礎(chǔ)查詢SELECT 字段 FROM 表獲取指定字段數(shù)據(jù)禁止SELECT *,用別名簡化
條件查詢WHERE 條件篩選符合條件的行支持AND/OR/BETWEEN/LIKE等
聚合查詢COUNT()/SUM()/AVG()等統(tǒng)計(jì)匯總數(shù)據(jù)忽略 NULL,WHERE中不能用
分組查詢GROUP BY 字段 [HAVING 條件]按類別統(tǒng)計(jì)HAVING用于篩選分組結(jié)果
排序查詢ORDER BY 字段 [ASC/DESC]按規(guī)則排列結(jié)果大表加索引,分頁前必排序
分頁查詢LIMIT 起始位置, 條數(shù)限制返回條數(shù),實(shí)現(xiàn)分頁起始位置從 0 開始,需配合ORDER BY

2. 規(guī)范與最佳實(shí)踐

  • 性能優(yōu)化
    • 只查需要的字段(避免SELECT *);
    • WHERE/GROUP BY/ORDER BY的字段建索引;
    • 避免LIMIT大偏移量(如LIMIT 100000, 10,改用主鍵范圍)。
  • 可讀性
    • 多字段 / 多條件換行對齊;
    • 復(fù)雜查詢加注釋說明業(yè)務(wù)目的;
    • 表和字段用別名簡化(如e代表employee)。
  • 正確性
    • 分頁必加ORDER BY;
    • 分組查詢中,SELECT只能包含分組字段和聚合函數(shù);
    • 模糊查詢慎用%開頭(防止索引失效)。

DQL 是 SQL 的 “靈魂”,掌握它不僅能完成業(yè)務(wù)需求,更能通過優(yōu)化查詢提升系統(tǒng)性能。記?。簩懖樵儠r(shí)多思考 “是否有更高效的方式”“別人能否看懂”,養(yǎng)成規(guī)范習(xí)慣,才能從 “會(huì)查” 變成 “查得好”。

到此這篇關(guān)于MySQL DQL 完全指南:從基礎(chǔ)查詢到實(shí)戰(zhàn)優(yōu)化的文章就介紹到這了,更多相關(guān)mysql dql內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL?中?truncate、delete、drop的區(qū)別詳解

    MySQL?中?truncate、delete、drop的區(qū)別詳解

    本文詳細(xì)解析了MySQL中三種刪除方式——DELETE、TRUNCATE和DROP的核心區(qū)別,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL自5.7版本起,對JSON數(shù)據(jù)類型提供了全面的支持,本文主要介紹了MySQL中查詢JSON字段的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 解決sql server不支持variant數(shù)據(jù)類型的問題

    解決sql server不支持variant數(shù)據(jù)類型的問題

    在數(shù)據(jù)庫中,數(shù)據(jù)類型是非常重要的,但有時(shí)候我們可能會(huì)遇到 SQL Server 不支持的數(shù)據(jù)類型,例如 Variant,在本篇博文中,我們將探討問題的背景,提供解決思路,并總結(jié)如何解決 SQL Server 不支持 Variant 數(shù)據(jù)類型的挑戰(zhàn)
    2023-09-09
  • MySQL全局鎖和表鎖的深入理解

    MySQL全局鎖和表鎖的深入理解

    這篇文章主要給大家介紹了關(guān)于MySQL全局鎖和表鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Mysql 日期格式化及復(fù)雜日期區(qū)間查詢

    Mysql 日期格式化及復(fù)雜日期區(qū)間查詢

    最近在做項(xiàng)目涉及到Mysql的復(fù)雜日期查詢,日期查詢其實(shí)在數(shù)據(jù)庫中查詢其實(shí)還是用的挺多的,所以本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-09-09
  • mysql查詢當(dāng)天的數(shù)據(jù)

    mysql查詢當(dāng)天的數(shù)據(jù)

    這篇文章主要介紹了mysql查詢當(dāng)天的數(shù)據(jù),第一種數(shù)量小的時(shí)候用,數(shù)據(jù)量稍微起來巨慢,第二種速度快,但是最好配合復(fù)合索引來查,避免全表掃描,需要的朋友可以參考下
    2023-08-08
  • MySQL連接異常報(bào)10061錯(cuò)誤問題解決

    MySQL連接異常報(bào)10061錯(cuò)誤問題解決

    這篇文章主要介紹了MySQL連接異常報(bào)10061錯(cuò)誤問題解決,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • mysql中WITH的多種用法與常見示例

    mysql中WITH的多種用法與常見示例

    這篇文章主要介紹了mysql中WITH的多種用法與常見示例,MySQL中的WITH語句,也稱為公用表表達(dá)式(CTE),用于定義臨時(shí)結(jié)果集,可以在查詢中重復(fù)引用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法

    使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法

    使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法...
    2007-07-07
  • MySQL數(shù)據(jù)庫InnoDB引擎下服務(wù)器斷電數(shù)據(jù)恢復(fù)方法

    MySQL數(shù)據(jù)庫InnoDB引擎下服務(wù)器斷電數(shù)據(jù)恢復(fù)方法

    這篇文章主要介紹了MySQL數(shù)據(jù)庫InnoDB引擎下服務(wù)器斷電數(shù)據(jù)恢復(fù)方法,需要的朋友可以參考下
    2016-04-04

最新評論

平遥县| 从化市| 孙吴县| 兴城市| 安新县| 准格尔旗| 图木舒克市| 定陶县| 苏尼特右旗| 温泉县| 定西市| 图片| 儋州市| 石嘴山市| 广灵县| 枣阳市| 饶河县| 重庆市| 聂荣县| 涞源县| 青神县| 高邮市| 安宁市| 额尔古纳市| 延长县| 山阳县| 白山市| 沙雅县| 乌鲁木齐市| 聂拉木县| 青冈县| 宁波市| 徐州市| 凉山| 将乐县| 富锦市| 甘南县| 鄂伦春自治旗| 林州市| 延吉市| 迁安市|