摘要:本文先介紹數據庫 SQL 的核心概念,接著闡述 SQL 通用語法與 DDL、DML、DQL、DCL 四大分類,隨后詳細講解各類語句操作,包括 DDL 的數據庫與表操作及數據類型,DML 的數據增刪改,DQL 的查詢語法與功能,DCL 的用戶管理和權限控制,助力掌握 MySQL 基礎操作。
思維導圖
1. MySQL 概述
1.1 數據庫相關概念
本部分將講解三個核心概念:數據庫、數據庫管理系統、SQL。
名稱 | 全稱 | 簡稱 |
---|---|---|
數據庫 | 存儲數據的倉庫,數據是有組織的進行存儲 | DataBase |
數據庫管理系統 | 操縱和管理數據庫的大型軟件 | DataBase Management System? |
SQL | 操作關系型數據庫的編程語言,定義了一套操作關系型數據庫統一標準 | Structured Query Language? |
2. SQL語句
全稱 Structured Query Language(結構化查詢語言),是操作關系型數據庫的編程語言,定義了一套操作關系型數據庫的統一標準。無論使用 Oracle、SQL Server 還是 MySQL 等關系型數據庫,均可以通過 SQL 語言進行統一操作,因此掌握 SQL 可靈活適配不同關系型數據庫場景。
2.1 SQL 通用語法
在學習具體 SQL 語句前,需先了解 SQL 語言的通用規則:
-
SQL 語句可單行或多行書寫,必須以分號結尾;
-
可使用空格 / 縮進來增強語句可讀性(不影響執行結果);
-
MySQL 中的 SQL 語句不區分大小寫,建議關鍵字使用大寫,提高辨識度;
2.2 SQL 分類
根據功能,SQL 語句主要分為四類:DDL、DML、DQL、DCL,具體說明如下:
分類 | 說明 |
---|---|
DDL | 用于定義數據庫對象(數據庫、表、字段),如創建 / 刪除數據庫、創建 / 修改表結構等 |
DML | 用于對數據庫表中的數據進行增、刪、改操作 |
DQL | 用于查詢數據庫表中的記錄,是業務中使用頻次最高的 SQL 類型 |
DCL | 用于管理數據庫用戶、控制數據庫訪問權限,如創建用戶、授予 / 撤銷權限等 |
2.3 DDL(數據定義語言)
DDL 主要用于操作數據庫、表、字段等 “結構級” 對象,核心是 “定義結構”,不涉及具體數據。
2.3.1 數據庫操作
1. 查詢所有數據庫
show databases;
執行結果會顯示當前 MySQL 服務器中所有已創建的數據庫,例如系統默認數據庫 information_schema
、mysql
、sys
等。
2. 查詢當前數據庫
select database();
用于確認當前所處/正在使用的數據庫上下文(若未切換數據庫,返回 NULL
)。
3. 創建數據庫
create database [ if not exists ] 數據庫名 [ default charset 字符集 ] [ collate 排序規則 ];
易錯點:數據庫名稱在【 if not exists 】后面
-
if not exists
:可選參數,避免重復創建同名數據庫導致報錯(若數據庫已存在則不執行); -
default charset
:可選參數,指定數據庫默認字符集; -
collate
:可選參數,指定字符排序規則(通常默認跟隨字符集,無需手動設置)。
4. 刪除數據庫
drop database [ if exists ] 數據庫名;
-
if exists
:可選參數,避免刪除不存在的數據庫導致報錯(若數據庫不存在則不執行操作)。
5. 切換數據庫
use 數據庫名;
操作某數據庫下的表前,必須先通過 use
切換到該數據庫上下文。
2.3.2 表操作
2.3.2.1 表操作 - 查詢與創建
1. 查詢當前數據庫所有表
show tables;
需先通過 use
切換到目標數據庫,否則無法查詢表。
2. 查看指定表結構
desc 表名;
返回表的字段名、數據類型、是否允許為 NULL
、主鍵 / 外鍵、默認值等結構信息。
3. 查詢指定表的建表語句
show create table 表名;
返回創建該表的完整 SQL 語句,包含默認存儲引擎(如 InnoDB)、字符集等隱式配置。
4. 創建表結構
CREATE TABLE 表名(
?字段1 字段1類型 [ COMMENT 字段1注釋 ],
?字段2 字段2類型 [ COMMENT 字段2注釋 ],
?...
?字段n 字段n類型 [ COMMENT 字段n注釋 ]
?
) [ COMMENT 表注釋 ];
-
字段定義格式:
字段名 類型 [約束] [注釋]
; -
最后一個字段后不能加逗號,否則會語法報錯;
-
COMMENT
:可選參數,用于添加字段 / 表的說明,提高可讀性。
2.3.2.2 表操作 - 數據類型
MySQL 中的數據類型主要分為三類:數值類型、字符串類型、日期時間類型,需根據業務場景選擇合適的類型(如年齡用 TINYINT
,手機號用 CHAR(11)
)。
1. 數值類型
適用于存儲整數、小數等數值數據,核心是 “節省存儲空間” 和 “保證精度”。
類型 | 大小 | 有符號(SIGNED)范圍 | 無符號(UNSIGNED)范圍 | 描述 |
---|---|---|---|---|
TINYINT | 1byte | (-128, 127) | (0, 255) | 小整數值(如年齡、狀態碼) |
SMALLINT | 2bytes | (-32768, 32767) | (0, 65535) | 中整數值(如數量較少的 ID) |
MEDIUMINT | 3bytes | (-8388608, 8388607) | (0, 16777215) | 大整數值 |
INT/INTEGER | 4bytes | (-2147483648, 2147483647) | (0, 4294967295) | 常用大整數值(如用戶 ID、訂單 ID) |
BIGINT | 8bytes | (-2^63, 2^63-1) | (0, 2^64-1) | 極大整數值(如海量數據的 ID) |
FLOAT | 4bytes | (-3.4E+38, 3.4E+38) | 0 和 (1.2E-38, 3.4E+38) | 單精度浮點數(精度較低,不適合金額) |
DOUBLE | 8bytes | (-1.8E+308, 1.8E+308) | 0 和 (2.2E-308, 1.8E+308) | 雙精度浮點數(精度較高,仍不適合金額) |
DECIMAL | 可變 | 依賴 M(精度)和 D(標度) | 依賴 M(精度)和 D(標度) | 定點小數(精確存儲,適合金額、分數等) |
使用建議:
-
年齡:
TINYINT UNSIGNED
(無負數,范圍 0-255 足夠); -
分數(如滿分 100,1 位小數):
DOUBLE(4,1)
(總長度 4,小數位 1,范圍 0.0-100.0); -
金額(如保留 2 位小數):
DECIMAL(10,2)
(避免浮點數精度丟失)。
2. 字符串類型
適用于存儲文本、符號等字符數據,核心是 “區分定長與變長”。
類型 | 大小 | 描述 |
---|---|---|
CHAR | 0-255 bytes | 定長字符串(指定長度后,無論實際值多長,均占用固定字節) |
VARCHAR | 0-65535 bytes | 變長字符串(僅占用實際值長度 + 1-2 字節的長度標識,節省空間) |
TINYTEXT | 0-255 bytes | 短文本(適合存儲少量文字,如備注) |
TEXT | 0-65535 bytes | 長文本(適合存儲文章、評論等) |
MEDIUMTEXT | 0-16777215 bytes | 中等長度文本 |
LONGTEXT | 0-4294967295 bytes | 極大文本(適合存儲超大文本,如日志) |
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB | 同對應 TEXT 類型 | 二進制數據(如圖片、文件,不推薦直接存儲,建議存文件路徑) |
CHAR 與 VARCHAR 區別:
-
CHAR(10)
:存儲 “abc” 時,仍占用 10 字節(空格填充),性能高; -
VARCHAR(10)
:存儲 “abc” 時,僅占用 3 + 1 = 4 字節(1 字節標識長度),節省空間。
使用建議:
-
用戶名(長度不定,最長 50):
VARCHAR(50)
; -
性別(固定值 “男 / 女”):
CHAR(1)
; -
手機號(固定 11 位):
CHAR(11)
。
3. 日期時間類型
適用于存儲日期、時間或混合時間數據,核心是 “匹配業務場景精度”。
類型 | 大小 | 范圍 | 格式 | 描述 |
---|---|---|---|---|
DATE | 3bytes | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 僅日期(如生日) |
TIME | 3bytes | -838:59:59 至 838:59:59 | HH:MM:SS | 僅時間(如打卡時間) |
YEAR | 1byte | 1901 至 2155 | YYYY | 僅年份(如畢業年份) |
DATETIME | 8bytes | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 日期 + 時間(如訂單創建時間,不依賴時區) |
TIMESTAMP | 4bytes | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 日期 + 時間(依賴時區,自動更新,適合記錄 “最后修改時間”) |
使用建議:
-
生日:
DATE
; -
訂單創建時間:
DATETIME
; -
數據最后修改時間:
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
(自動更新)。
2.3.2.3 表操作 - 修改(修改表結構)
1. 添加字段
ALTER TABLE 表名 ADD 字段名 類型 (長度) [ COMMENT 注釋 ] [ 約束 ];
2. 修改數據類型
ALTER TABLE 表名 MODIFY 字段名 新數據類型 (長度);
3. 修改字段名和數據類型
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型 (長度) [ COMMENT 注釋 ] [ 約束 ];
可同時修改字段名和類型,需注意新舊字段名的順序。
4. 刪除字段
ALTER TABLE 表名 DROP 字段名;
5. 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
核心:ALTER??TABLE? 表名? ?[ 操作 ]? 字段名???類型?
2.3.2.4 表操作 - 刪除
1. 刪除表
DROP TABLE [ IF EXISTS ] 表名;
if exists
:避免刪除不存在的表導致報錯。
2. 刪除表并重新創建(清空數據 + 保留結構)
TRUNCATE TABLE 表名;
-
效果:刪除表中所有數據,但保留表結構(相當于 “清空表”);
-
注意:數據無法恢復,且自增字段會重置為初始值(如 1)。
2.5 DML(數據操作語言)
DML 用于對表中的數據進行 “增、刪、改” 操作,核心是 “操作數據”,不改變表結構。
2.5.1 添加數據(INSERT)
1. 給指定字段添加數據
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
-
字段名與值必須一一對應(順序、數量、類型需匹配);
-
字符串和日期類型的值必須用單引號包裹;
-
字段值需符合表結構約束。
2. 給全部字段添加數據(省略字段名)
INSERT INTO 表名 VALUES (值1, 值2, ...);
-
需按表中字段的默認順序傳入所有字段的值,不推薦(表結構變更后易報錯)。
3. 批量添加數據
-- 方式1:指定字段批量插入
?
INSERT INTO 表名 (字段名1, 字段名2, ...)
?
VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
?
-- 方式2:全部字段批量插入
?
INSERT INTO 表名
?
VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
注意事項
-
字段順序與值順序必須一致;
-
字符串、日期類型必須用單引號包裹;
-
插入的值需符合字段約束(如長度、范圍、非空等),否則報錯。
2.5.2 修改數據(UPDATE)
UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 條件 ];
WHERE
:可選參數,用于指定修改的范圍(若省?WHERE
,則修改表中所有數據,謹慎)。
注意事項
-
無
WHERE
條件會修改全表數據,生產環境中需嚴格校驗條件; -
可同時修改多個字段,用逗號分隔字段賦值表達式。
2.5.3 刪除數據(DELETE)
DELETE FROM 表名 [ WHERE 條件 ];
-
WHERE
:可選參數,指定刪除的范圍(若省略WHERE
,則刪除表中所有數據!)。
注意事項
-
無
WHERE
條件會刪除全表數據,且數據無法通過ROLLBACK
恢復(除非開啟事務); -
DELETE
只能刪除行數據,不能刪除單個字段的值(需用UPDATE
將字段設為NULL
); -
DataGrip 等工具會對刪除全表操作進行二次確認,避免誤操作。
2.6 DQL(數據查詢語言)
DQL 用于查詢表中的記錄,是業務中最常用的 SQL 類型,支持條件篩選、排序、分組、分頁等復雜操作。
2.6.1 數據準備
先創建 emp
員工表并插入測試數據,后續案例基于該表展開。
2.6.2 DQL 基本語法
完整 DQL 語法結構(按編寫順序):
SELECT
?
字段列表 -- 要查詢的字段(如 name, age 或 * 表示所有字段)
?
FROM
?
表名列表 -- 要查詢的表(單表查詢僅需寫表名)
?
WHERE
?
條件列表 -- 行級篩選條件(如 age > 20)
?
GROUP BY
?
分組字段列表 -- 按指定字段分組(如按 gender 分組)
?
HAVING
?
分組后條件列表 -- 分組后的篩選條件(如 count(*) > 5)
?
ORDER BY
?
排序字段列表 -- 按指定字段排序(如 age ASC 升序)
?
LIMIT
?
分頁參數 -- 分頁查詢(如 LIMIT 0, 10 表示第 1 頁,10 條/頁)
執行順序(與編寫順序不同,需重點理解):
FROM
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
→ ORDER BY
→ LIMIT
2.6.3 基礎查詢(無篩選條件)
1. 查詢多個指定字段
SELECT 字段1, 字段2, ... FROM 表名;
2. 查詢所有字段(不推薦)
SELECT * FROM 表名;
缺點:不直觀、影響效率(若表字段多,會冗余返回不必要的字段),生產環境建議明確指定字段。
3. 字段設置別名
-- 方式1:使用 AS(推薦,可讀性高)
?
SELECT 字段1 AS 別名1, 字段2 AS 別名2 FROM 表名;
?
-- 方式2:省略 AS(簡潔)
?
SELECT 字段1 別名1, 字段2 別名2 FROM 表名;
別名含空格或特殊字符時,需用單引號包裹。
4. 去除重復記錄
SELECT DISTINCT 字段列表 FROM 表名;
僅當所有指定字段的值完全相同時,才會被視為重復記錄并去重。
2.6.4 條件查詢(WHERE)
通過 WHERE
子句篩選符合條件的行數據,支持比較運算符和邏輯運算符。
1. 常用比較運算符
比較運算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在指定范圍(含邊界) |
IN(...) | 在指定集合中 |
LIKE 占位符 | 模糊匹配 |
IS NULL | 為空 |
IS NOT NULL | 不為空 |
-
模糊匹配占位符:
? `_`:匹配單個任意字符;
?`%`:匹配 0 個或多個任意字符。
2. 常用邏輯運算符
邏輯運算符 | 功能 |
---|---|
AND 或 && | 并且(多個條件同時成立) |
OR 或 ` | ` |
NOT 或 ! | 非(否定條件) |
2.6.5 聚合函數
聚合函數用于對一列數據進行 “縱向計算”(將列數據視為一個整體),返回單個結果值。
1. 常用聚合函數
函數 | 功能 |
---|---|
count(字段) | 統計非 NULL 值的記錄數 |
max(字段) | 求該列的最大值 |
min(字段) | 求該列的最小值 |
avg(字段) | 求該列的平均值 |
sum(字段) | 求該列的總和 |
注意:
NULL
值不參與任何聚合函數計算。
2. 語法
SELECT 聚合函數(字段列表) FROM 表名 [ WHERE 條件 ];
2.6.6 分組查詢(GROUP BY)
通過 GROUP BY
按指定字段分組,將相同值的行歸為一組,然后對每組進行聚合計算(如統計每組人數、平均年齡)。
1. 語法
SELECT 分組字段, 聚合函數(字段) FROM 表名 [ WHERE 條件 ] GROUP BY 分組字段 [ HAVING 分組后條件 ];
-
WHERE
:分組前的篩選條件(篩選行數據,不滿足條件的行不參與分組); -
HAVING
:分組后的篩選條件(篩選分組結果,不滿足條件的分組不顯示)。
注意:前后的第一個查詢字段必須相同,都為分組字段,第二個是聚合函數才有意義
2. WHERE 與 HAVING 的區別
對比維度 | WHERE | HAVING |
---|---|---|
執行時機 | 分組前 | 分組后 |
作用對象 | 行數據 | 分組結果 |
支持的條件 | 不能使用聚合函數 | 可以使用聚合函數 |
3. 注意事項
-
分組后查詢的字段只能是 “分組字段” 或 “聚合函數”,查詢其他字段無意義(結果不可控);
-
多字段分組時,按字段順序依次分組(先按第一個字段分組,同組內再按第二個字段分組)。
2.6.7 排序查詢(ORDER BY)
通過 ORDER BY
按指定字段對查詢結果排序,支持升序和降序。
1. 語法
SELECT 字段列表 FROM 表名 [ WHERE 條件 ] [ GROUP BY 分組字段 ] [ HAVING 分組后條件 ] ORDER BY 字段1 排序方式1, 字段2 排序方式2 ...;
-
排序方式:
? `ASC`:升序(默認,可省略);
?`DESC`:降序;
多字段排序:先按字段 1 排序,字段 1 值相同的行再按字段 2 排序。
2.6.8 分頁查詢(LIMIT)
通過 LIMIT
實現分頁查詢(避免一次性返回大量數據,優化性能),僅 MySQL 支持(其他數據庫如 Oracle 用 ROWNUM
)。
1. 語法
SELECT 字段列表 FROM 表名 [ 其他子句 ] LIMIT 起始索引, 查詢記錄數;
-
起始索引:從 0 開始(表示第 1 條數據的索引為 0);
-
計算公式:
起始索引 = (頁碼 - 1) * 每頁記錄數
; -
若查詢第 1 頁數據,起始索引可省略。
2.6.9 DQL 執行順序驗證
通過別名測試可確認 DQL 執行順序:
FROM
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
→ ORDER BY
→ LIMIT
2.7 DCL(數據控制語言)
DCL 用于管理數據庫用戶和控制訪問權限,主要由 DBA(數據庫管理員)操作,開發人員使用較少。
2.7.1 管理用戶
1. 查詢用戶
MySQL 中所有用戶信息存儲在系統數據庫 mysql
的 user
表中:
select * from mysql.user;
-
核心字段:
? `Host`:用戶可訪問的主機(`localhost` 表示僅本地訪問,`%` 表示任意主機訪問);
?`User`:用戶名;
?`authentication_string`:用戶密碼(加密存儲)。
-
注意:
Host + User
唯一標識一個用戶(同一用戶名,不同主機視為不同用戶)。
2. 創建用戶
CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
-
主機名:
`localhost`:僅允許本地(當前服務器)訪問;
?`%`:允許任意主機訪問(遠程訪問需開放 MySQL 端口 3306);
密碼:長度至少 4 位(MySQL 8.0+ 默認密碼策略較嚴格,需包含字母、數字、符號)。
3. 修改用戶密碼
ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql\_native\_password BY '新密碼';
mysql_native_password
:指定密碼加密方式(兼容舊版本客戶端,MySQL 8.0+ 推薦)。
4. 刪除用戶
DROP USER '用戶名'@'主機名';
注意事項
-
必須指定
主機名
(即使是%
),否則無法準確匹配用戶; -
開發環境中避免創建
%
主機的用戶(安全風險),建議僅允許指定 IP 訪問。
2.7.2 權限控制
MySQL 定義了多種權限,常用權限如下:
權限 | 說明 |
---|---|
ALL 或 ALL PRIVILEGES | 所有權限 |
SELECT | 查詢數據權限(僅 DQL) |
INSERT | 插入數據權限(僅 DML) |
UPDATE | 修改數據權限(僅 DML) |
DELETE | 刪除數據權限(僅 DML) |
ALTER | 修改表結構權限(僅 DDL) |
DROP | 刪除數據庫 / 表 / 視圖權限(僅 DDL) |
CREATE | 創建數據庫 / 表權限(僅 DDL) |
1. 查詢用戶權限
SHOW GRANTS FOR '用戶名'@'主機名';
2. 授予權限
GRANT 權限列表 ON 數據庫名.表名 TO '用戶名'@'主機名';
-
權限列表:多個權限用逗號分隔(如
SELECT, INSERT
),ALL
表示所有權限; -
數據庫名。表名:
`*.*`:所有數據庫的所有表(全局權限);
?`itcast.*`:`itcast` 數據庫的所有表;
?`itcast.emp`:`itcast` 數據庫的 `emp` 表。
3. 撤銷權限
REVOKE 權限列表 ON 數據庫名.表名 FROM '用戶名'@'主機名';
注意事項
-
授予 / 撤銷權限后,無需重啟 MySQL,權限立即生效;
-
開發環境中遵循 “最小權限原則”(如僅給查詢需求的用戶授予
SELECT
權限),避免權限過大導致安全風險。
黑馬十天精通MYSQL百度網盤資料鏈接
?提取碼: wind?