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

MySQL函數(shù)大全超詳細完整指南(語法說明和使用示例)

 更新時間:2026年07月13日 08:50:33   作者:周水_buss  
MySQL函數(shù)也是我們?nèi)粘i_發(fā)過程中經(jīng)常使用的,選用合適的函數(shù)能夠提高我們的開發(fā)效率,這篇文章主要介紹了MySQL函數(shù)大全超詳細完整指南的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

MySQL 提供了海量的內(nèi)置函數(shù),熟練運用這些函數(shù)可以讓我們在數(shù)據(jù)處理、字符串操作、日期計算、統(tǒng)計分析等場景下事半功倍。本文將系統(tǒng)梳理 MySQL 8.0 中所有常用內(nèi)置函數(shù),涵蓋聚合函數(shù)、字符串函數(shù)、日期時間函數(shù)、窗口函數(shù)、數(shù)學(xué)函數(shù)、JSON函數(shù)、加密函數(shù)、信息函數(shù)、類型轉(zhuǎn)換函數(shù)等,并為每個函數(shù)提供語法說明和使用示例。

環(huán)境說明:本文示例基于 MySQL 8.0 版本,MySQL 8.0 引入了窗口函數(shù)、JSON_TABLE 等大量新特性,建議使用 8.0 及以上版本以獲得完整函數(shù)支持。

1. 聚合函數(shù)

聚合函數(shù)對一組值執(zhí)行計算,返回單個匯總值,常與 GROUP BY 子句配合使用。

1.1 基礎(chǔ)聚合函數(shù)

函數(shù)名說明語法
COUNT()統(tǒng)計行數(shù)COUNT([DISTINCT] expr)
SUM()求和SUM([DISTINCT] expr)
AVG()求平均值AVG([DISTINCT] expr)
MAX()返回最大值MAX(expr)
MIN()返回最小值MIN(expr)

示例 1 — 基礎(chǔ)統(tǒng)計

-- 假設(shè)有一張 products 表
-- 總產(chǎn)品數(shù)
SELECT COUNT(*) AS total_products FROM products;
?
-- 有效庫存記錄數(shù)(stock 列非 NULL)
SELECT COUNT(stock) AS stock_count FROM products;
?
-- 不同類別的數(shù)量
SELECT COUNT(DISTINCT category) AS category_count FROM products;
?
-- 總庫存
SELECT SUM(stock) AS total_stock FROM products;
?
-- 平均價格
SELECT AVG(price) AS avg_price FROM products;
?
-- 最高價格
SELECT MAX(price) AS max_price FROM products;
?
-- 最低價格
SELECT MIN(price) AS min_price FROM products;

1.2 COUNT 詳解:COUNT(1)、COUNT(*)、COUNT(字段) 的區(qū)別

生產(chǎn)環(huán)境中經(jīng)?;煜?COUNT 的不同用法,它們的區(qū)別如下:

  • COUNT(1):統(tǒng)計所有行數(shù),不受字段定義影響。相當于增加一個常量列,統(tǒng)計有多少個 1。

  • COUNT(*):統(tǒng)計所有行數(shù),包括 NULL 行。

  • COUNT(字段):統(tǒng)計指定字段不為 NULL 的行數(shù)。

  • COUNT(DISTINCT 字段):統(tǒng)計指定字段去重且不為 NULL 的行數(shù)。

-- 示例對比
SELECT 
    COUNT(1)         AS all_rows,       -- 所有行
    COUNT(*)         AS all_rows_too,   -- 所有行(同上)
    COUNT(email)     AS has_email,      -- 郵件不為空的行
    COUNT(DISTINCT department) AS dept_count  -- 部門數(shù)量
FROM employees;

使用建議:表中存在主鍵或索引時使用 COUNT(主鍵字段)COUNT(索引字段);表中無主鍵時使用 COUNT(1) 優(yōu)于 COUNT(*)

1.3 高級聚合函數(shù)

函數(shù)名說明語法
GROUP_CONCAT()將分組中的值連接成一個字符串GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR 'str'])
BIT_AND()按位與BIT_AND(expr)
BIT_OR()按位或BIT_OR(expr)
BIT_XOR()按位異或BIT_XOR(expr)

示例 2 — GROUP_CONCAT 行轉(zhuǎn)列

-- 將每個部門的人員姓名合并
SELECT 
    department,
    GROUP_CONCAT(name ORDER BY name SEPARATOR ', ') AS members
FROM employees
GROUP BY department;
?
-- 結(jié)果類似:IT | Alice, Bob, Charlie

示例 3 — JSON 聚合(MySQL 8.0 新增):

-- 將分組數(shù)據(jù)聚合為 JSON 數(shù)組
SELECT department, JSON_ARRAYAGG(name) AS names FROM employees GROUP BY department;
?
-- 將分組數(shù)據(jù)聚合為 JSON 對象
SELECT department, JSON_OBJECTAGG(emp_id, name) AS emp_map FROM employees GROUP BY department;

2. 字符串函數(shù)

2.1 字符串截取與拼接

函數(shù)名說明語法
CONCAT()拼接字符串CONCAT(str1, str2, ...)
CONCAT_WS()用分隔符拼接CONCAT_WS(separator, str1, str2, ...)
SUBSTRING() / SUBSTR()截取子字符串SUBSTRING(str, pos [, len])
LEFT()左側(cè)截取LEFT(str, len)
RIGHT()右側(cè)截取RIGHT(str, len)

示例 4

-- 拼接姓名
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
-- 結(jié)果:Alice Smith
?
-- 用分隔符拼接
SELECT CONCAT_WS('-', '2024', '01', '15') AS date_str;
-- 結(jié)果:2024-01-15
?
-- 截取子字符串(pos 從 1 開始)
SELECT SUBSTRING('Hello World', 1, 5) AS result;
-- 結(jié)果:Hello
?
-- 手機號脫敏
SELECT CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS masked_phone FROM users;
-- 結(jié)果:138****1234

2.2 大小寫轉(zhuǎn)換與修剪

函數(shù)名說明語法
UPPER()轉(zhuǎn)換為大寫UPPER(str)
LOWER()轉(zhuǎn)換為小寫LOWER(str)
TRIM()移除首尾空格/指定字符TRIM([{BOTH \| LEADING \| TRAILING} [remstr] FROM] str)
LTRIM()移除左側(cè)空格LTRIM(str)
RTRIM()移除右側(cè)空格RTRIM(str)

示例 5

SELECT UPPER('mysql') AS result;         -- MYSQL
SELECT LOWER('MYSQL') AS result;         -- mysql
SELECT TRIM('  hello  ') AS result;      -- hello
SELECT TRIM(LEADING '0' FROM '00123') AS result;  -- 123
SELECT TRIM(TRAILING 'x' FROM 'abcxxx') AS result; -- abc

2.3 填充與重復(fù)

函數(shù)名說明語法
LPAD()左側(cè)填充LPAD(str, len, padstr)
RPAD()右側(cè)填充RPAD(str, len, padstr)
REPEAT()重復(fù)字符串REPEAT(str, count)

示例 6

-- 左側(cè)補零(常用于生成工號)
SELECT LPAD('123', 8, '0') AS emp_id;
-- 結(jié)果:00000123
?
-- 右側(cè)填充
SELECT RPAD('MySQL', 10, '*') AS result;
-- 結(jié)果:MySQL*****
?
-- 重復(fù)
SELECT REPEAT('Go', 3) AS result;
-- 結(jié)果:GoGoGo

2.4 查找與替換

函數(shù)名說明語法
LOCATE()返回子字符串首次出現(xiàn)的位置LOCATE(substr, str [, pos])
POSITION()同 LOCATE(標準 SQL)POSITION(substr IN str)
INSTR()返回子字符串首次出現(xiàn)的位置INSTR(str, substr)
REPLACE()替換子字符串REPLACE(str, from_str, to_str)
INSERT()在指定位置插入/替換INSERT(str, pos, len, newstr)

注意LOCATE() 不區(qū)分大小寫,與 INSTR() 功能相同但參數(shù)順序相反。

示例 7

-- 查找位置(不區(qū)分大小寫)
SELECT LOCATE('world', 'Hello World') AS position;  -- 7
SELECT INSTR('Hello World', 'world') AS position;    -- 7
?
-- SQL 標準寫法
SELECT POSITION('world' IN 'Hello World') AS position; -- 7
?
-- 替換
SELECT REPLACE('Hello World', 'World', 'MySQL') AS result;
-- Hello MySQL
?
-- 指定位置替換
SELECT INSERT('Hello World', 7, 5, 'CSDN') AS result;
-- Hello CSDN

2.5 長度與字符集

函數(shù)名說明語法
LENGTH()返回字節(jié)長度LENGTH(str)
CHAR_LENGTH() / CHARACTER_LENGTH()返回字符長度CHAR_LENGTH(str)
BIT_LENGTH()返回比特長度BIT_LENGTH(str)
CHARSET()返回字符集CHARSET(str)

重要區(qū)別LENGTH() 返回字節(jié)長度,中文 UTF-8 編碼下每個字符占 3 字節(jié);CHAR_LENGTH() 返回字符個數(shù)

示例 8

SELECT 
    CHAR_LENGTH('Hello')    AS char_len,   -- 5(字符數(shù))
    LENGTH('Hello')         AS byte_len,   -- 5(字節(jié)數(shù))
    CHAR_LENGTH('你好')      AS cn_char_len,-- 2(字符數(shù))
    LENGTH('你好')           AS cn_byte_len; -- 6(UTF-8 每中文字符 3 字節(jié))

2.6 其他字符串函數(shù)

函數(shù)名說明示例
ASCII(str)返回最左側(cè)字符的 ASCII 值SELECT ASCII('A'); → 65
CHAR(n, ...)返回各整數(shù)對應(yīng)的字符SELECT CHAR(65, 66, 67); → ABC
REVERSE(str)反轉(zhuǎn)字符串SELECT REVERSE('abc'); → cba
SPACE(n)返回 n 個空格SELECT SPACE(5);
STRCMP(s1, s2)字符串比較(相等為 0)SELECT STRCMP('abc', 'abd'); → -1
FORMAT(n, d)格式化數(shù)字(千分位)SELECT FORMAT(1234567.89, 2); → 1,234,567.89
ELT(n, s1, s2, ...)返回第 n 個字符串SELECT ELT(2, 'a', 'b', 'c'); → b
FIELD(s, s1, s2, ...)返回 s 在列表中的位置SELECT FIELD('b', 'a', 'b', 'c'); → 2
FIND_IN_SET(s, list)返回 s 在逗號列表中的位置SELECT FIND_IN_SET('b', 'a,b,c'); → 2

3. 日期時間函數(shù)

3.1 獲取當前時間

函數(shù)名說明
NOW()當前日期時間
CURDATE() / CURRENT_DATE()當前日期
CURTIME() / CURRENT_TIME()當前時間
SYSDATE()當前日期時間(執(zhí)行時取值,NOW() 是語句開始時取值)
UTC_DATE() / UTC_TIME() / UTC_TIMESTAMP()UTC 時間

示例 9

SELECT NOW();          -- 2024-01-15 10:30:45
SELECT CURDATE();      -- 2024-01-15
SELECT CURTIME();      -- 10:30:45
SELECT UTC_TIMESTAMP();-- 2024-01-15 02:30:45(UTC 時間)

3.2 日期提取

函數(shù)名說明示例
YEAR(date)提取年份SELECT YEAR('2024-06-15'); → 2024
MONTH(date)提取月份SELECT MONTH('2024-06-15'); → 6
DAY(date) / DAYOFMONTH(date)提取日SELECT DAY('2024-06-15'); → 15
HOUR(time)提取小時SELECT HOUR('10:30:45'); → 10
MINUTE(time)提取分鐘SELECT MINUTE('10:30:45'); → 30
SECOND(time)提取秒SELECT SECOND('10:30:45'); → 45
DAYNAME(date)星期名稱SELECT DAYNAME('2024-06-15'); → Saturday
DAYOFWEEK(date)星期索引(周日=1)SELECT DAYOFWEEK('2024-06-15'); → 7
DAYOFYEAR(date)一年中的第幾天SELECT DAYOFYEAR('2024-06-15'); → 167
WEEK(date [, mode])一年中的第幾周SELECT WEEK('2024-06-15');
QUARTER(date)季度SELECT QUARTER('2024-06-15'); → 2
LAST_DAY(date)月份最后一天SELECT LAST_DAY('2024-06-15'); → 2024-06-30

3.3 日期計算

函數(shù)名說明語法
DATE_ADD(date, INTERVAL expr unit)日期加DATE_ADD(date, INTERVAL 3 DAY)
DATE_SUB(date, INTERVAL expr unit)日期減DATE_SUB(date, INTERVAL 1 MONTH)
ADDDATE(date, INTERVAL expr unit)同 DATE_ADDADDDATE(date, INTERVAL expr unit)
SUBDATE(date, INTERVAL expr unit)同 DATE_SUBSUBDATE(date, INTERVAL expr unit)
DATEDIFF(date1, date2)日期差(天數(shù))DATEDIFF(date1, date2)
TIMESTAMPDIFF(unit, dt1, dt2)時間差(指定單位)TIMESTAMPDIFF(DAY, dt1, dt2)
ADDTIME(expr1, expr2)時間相加ADDTIME('10:30:00', '01:30:00')

INTERVAL 常用單位MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR

示例 10

-- 加 3 天
SELECT DATE_ADD('2024-01-15', INTERVAL 3 DAY) AS result;
-- 2024-01-18
?
-- 減 1 個月
SELECT DATE_SUB('2024-01-15', INTERVAL 1 MONTH) AS result;
-- 2023-12-15
?
-- 日期差
SELECT DATEDIFF('2024-03-01', '2024-02-15') AS days_diff;
-- 15
?
-- 時間差
SELECT TIMESTAMPDIFF(HOUR, '2024-01-15 08:00:00', '2024-01-15 17:30:00') AS hours;
-- 9
?
-- 計算年齡
SELECT TIMESTAMPDIFF(YEAR, '1990-05-20', CURDATE()) AS age;

3.4 日期格式化

函數(shù)名說明語法
DATE_FORMAT(date, format)日期格式化DATE_FORMAT(date, format)
TIME_FORMAT(time, format)時間格式化TIME_FORMAT(time, format)
STR_TO_DATE(str, format)字符串轉(zhuǎn)日期STR_TO_DATE(str, format)

常用格式化符號

格式符說明示例輸出
%Y四位年份2024
%y兩位年份24
%m月份(01-12)01
%c月份(1-12)1
%d日期(01-31)15
%H小時(00-23)10
%i分鐘(00-59)30
%s秒(00-59)45
%W星期名稱Monday
%a星期縮寫Mon
%M月份名稱January

示例 11

-- 格式化
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s') AS formatted;
-- 2024年01月15日 10:30:45
?
-- 字符串轉(zhuǎn)日期
SELECT STR_TO_DATE('2024-01-15', '%Y-%m-%d') AS date_val;
-- 2024-01-15
?
-- 時間格式化
SELECT TIME_FORMAT('10:30:45', '%H時%i分%s秒') AS time_str;
-- 10時30分45秒

3.5 其他日期函數(shù)

函數(shù)名說明
CONVERT_TZ(dt, from_tz, to_tz)時區(qū)轉(zhuǎn)換
TO_DAYS(date)日期轉(zhuǎn)天數(shù)(公元 0 年起)
FROM_DAYS(n)天數(shù)轉(zhuǎn)日期
TO_SECONDS(expr)時間轉(zhuǎn)秒
UNIX_TIMESTAMP([date])返回 Unix 時間戳
FROM_UNIXTIME(unix_timestamp [, format])Unix 時間戳轉(zhuǎn)日期
EXTRACT(unit FROM date)提取日期部分
MAKEDATE(year, dayofyear)根據(jù)年份和天數(shù)創(chuàng)建日期
MAKETIME(h, m, s)根據(jù)時分秒創(chuàng)建時間
GET_FORMAT(type, style)返回格式字符串

4. 窗口函數(shù)

窗口函數(shù)是 MySQL 8.0 引入的重要特性,作用類似于分組聚合,但不會將分組結(jié)果聚合成一條記錄,而是將結(jié)果保留在每一條數(shù)據(jù)中。

4.1 序號函數(shù)

函數(shù)名說明
ROW_NUMBER()為每行分配唯一的行號(對等行也不同)
RANK()排名,對等行排名相同,有間隔
DENSE_RANK()排名,對等行排名相同,無間隔

示例 12

-- 假設(shè)有 scores 表:student, subject, score
SELECT 
    student, subject, score,
    ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num,
    RANK()       OVER (ORDER BY score DESC) AS rank_val,
    DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_val
FROM scores;
?
-- 結(jié)果對比(分數(shù)相同時):
-- student | score | row_num | rank_val | dense_rank_val
-- Alice   | 95    | 1       | 1        | 1
-- Bob     | 95    | 2       | 1        | 1
-- Charlie | 90    | 3       | 3        | 2

從 MySQL 8.0.2 開始,窗口函數(shù)不再需要顯式的 FROM DUAL,可直接在普通查詢中使用。

4.2 偏移函數(shù)

函數(shù)名說明
LEAD(expr [, offset] [, default])向后偏移(當前行之后的行)
LAG(expr [, offset] [, default])向前偏移(當前行之前的行)
FIRST_VALUE(expr)窗口幀中第一行的值
LAST_VALUE(expr)窗口幀中最后一行的值
NTH_VALUE(expr, n)窗口幀中第 n 行的值

示例 13

-- LAG/LEAD 計算環(huán)比
SELECT 
    order_date,
    daily_amount,
    LAG(daily_amount, 1) OVER (ORDER BY order_date) AS prev_day_amount,
    daily_amount - LAG(daily_amount, 1) OVER (ORDER BY order_date) AS diff
FROM daily_sales;

4.3 分布函數(shù)

函數(shù)名說明
CUME_DIST()累計分布值(≤當前行值的行數(shù) / 總行數(shù))
PERCENT_RANK()百分比排名
NTILE(n)將分區(qū)劃分為 n 個分組

示例 14

SELECT 
    student, score,
    NTILE(4) OVER (ORDER BY score DESC) AS quartile,
    PERCENT_RANK() OVER (ORDER BY score DESC) AS pct_rank
FROM scores;

4.4 窗口函數(shù)語法說明

function_name([expr]) OVER (
    [PARTITION BY expr, ...]    -- 分區(qū)
    [ORDER BY expr [ASC|DESC]]  -- 排序
    [frame_clause]              -- 窗口幀范圍
)

常見 frame_clause:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW   -- 默認
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING            -- 前后各一行
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING    -- 當前行到末尾
RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW -- 時間范圍

5. 數(shù)學(xué)函數(shù)

5.1 基本運算

函數(shù)名說明示例
ABS(x)絕對值SELECT ABS(-5); → 5
MOD(n, m)取余SELECT MOD(10, 3); → 1
SQRT(x)平方根SELECT SQRT(16); → 4
POW(x, y) / POWER(x, y)x 的 y 次方SELECT POW(2, 3); → 8
SIGN(x)符號(正=1,負=-1,0=0)SELECT SIGN(-5); → -1

5.2 取整與舍入

函數(shù)名說明示例
CEIL(x) / CEILING(x)向上取整SELECT CEIL(3.14); → 4
FLOOR(x)向下取整SELECT FLOOR(3.99); → 3
ROUND(x [, d])四舍五入SELECT ROUND(3.14159, 2); → 3.14
TRUNCATE(x, d)截斷(去尾法)SELECT TRUNCATE(3.999, 1); → 3.9

ROUND 的 d 為負數(shù)時

SELECT ROUND(88.234, -1);   -- 90
SELECT ROUND(88.234, -2);   -- 100

5.3 隨機數(shù)與三角函數(shù)

函數(shù)名說明示例
RAND([seed])生成 [0, 1) 隨機數(shù)SELECT RAND();
SIN(x) / COS(x) / TAN(x)三角函數(shù)SELECT SIN(PI()/2); → 1
ASIN(x) / ACOS(x) / ATAN(x)反三角函數(shù)SELECT ASIN(0); → 0
PI()圓周率 πSELECT PI(); → 3.141593

生成指定范圍隨機數(shù)

-- [a, b) 之間的隨機數(shù):RAND() * (b - a) + a
-- 生成 [5, 10) 的隨機數(shù)
SELECT RAND() * 5 + 5;
?
-- 生成 [1, 100] 的隨機整數(shù)
SELECT FLOOR(RAND() * 100) + 1;

5.4 對數(shù)與指數(shù)

函數(shù)名說明
EXP(x)e 的 x 次方
LN(x) / LOG(x)自然對數(shù)
LOG2(x)以 2 為底
LOG10(x)以 10 為底
LOG(b, x)以 b 為底
RADIANS(x)角度轉(zhuǎn)弧度
DEGREES(x)弧度轉(zhuǎn)角度

6. 流程控制函數(shù)

函數(shù)名說明語法
IF(expr, v1, v2)條件判斷IF(score >= 60, '及格', '不及格')
IFNULL(v1, v2)NULL 值替換IFNULL(nickname, '匿名用戶')
NULLIF(v1, v2)v1=v2 返回 NULL,否則返回 v1NULLIF(expr, 0)
COALESCE(v1, v2, ...)返回第一個非 NULL 值COALESCE(mobile, phone, '無')
CASE WHEN ... THEN ... ELSE ... END多條件判斷見下方示例

示例 15

-- IF 簡單判斷
SELECT name, IF(score >= 60, '通過', '未通過') AS result FROM exams;
?
-- IFNULL 處理 NULL
SELECT IFNULL(avatar_url, '/images/default.png') AS avatar FROM users;
?
-- NULLIF 避免除零錯誤
SELECT amount / NULLIF(quantity, 0) AS unit_price FROM orders;
?
-- COALESCE 優(yōu)先取值
SELECT COALESCE(mobile, phone, email, '無聯(lián)系方式') AS contact FROM users;
?
-- CASE 多條件判斷
SELECT name, score,
    CASE 
        WHEN score >= 90 THEN '優(yōu)秀'
        WHEN score >= 80 THEN '良好'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS grade
FROM students;

7. JSON 函數(shù)

MySQL 8.0 提供了強大的 JSON 處理能力。

7.1 創(chuàng)建 JSON

函數(shù)名說明示例
JSON_ARRAY(val, ...)創(chuàng)建 JSON 數(shù)組SELECT JSON_ARRAY(1, 2, 'hello'); → [1, 2, "hello"]
JSON_OBJECT(key, val, ...)創(chuàng)建 JSON 對象SELECT JSON_OBJECT('id', 1, 'name', 'Alice'); → {"id":1, "name":"Alice"}
JSON_QUOTE(str)將字符串轉(zhuǎn)為 JSON 值SELECT JSON_QUOTE('hello'); → "hello"

7.2 查詢 JSON

函數(shù)名說明語法
JSON_EXTRACT(doc, path)提取值JSON_EXTRACT(doc, '$.key')
->JSON_EXTRACT 簡寫doc->'$.key'
->>提取并取消引用(返回文本)doc->>'$.key'

示例 16

-- 假設(shè) data 列存儲:{"name":"Alice","address":{"city":"Beijing"}}
?
-- 提取字段
SELECT data->'$.name' AS name FROM users;         -- "Alice"(帶引號)
SELECT data->>'$.name' AS name FROM users;        -- Alice(文本)
?
-- 嵌套取值
SELECT data->>'$.address.city' AS city FROM users; -- Beijing
?
-- 提取數(shù)組元素
SELECT JSON_EXTRACT('[1, 2, 3]', '$[0]');         -- 1

7.3 修改 JSON

函數(shù)名說明
JSON_SET(doc, path, val [, ...])設(shè)置值(存在則替換,不存在則插入)
JSON_INSERT(doc, path, val [, ...])插入值(不存在才插入)
JSON_REPLACE(doc, path, val [, ...])替換值(存在才替換)
JSON_REMOVE(doc, path [, ...])刪除值
JSON_MERGE_PRESERVE(doc, doc)合并 JSON
JSON_MERGE_PATCH(doc, doc)合并 JSON(RFC 7396)

7.4 JSON 工具函數(shù)

函數(shù)名說明
JSON_TYPE(val)返回 JSON 值類型
JSON_VALID(val)檢查是否為有效 JSON
JSON_LENGTH(val [, path])返回長度
JSON_DEPTH(val)返回最大深度
JSON_KEYS(val [, path])返回所有鍵
JSON_CONTAINS(target, candidate [, path])判斷是否包含
JSON_PRETTY(val)格式化輸出
JSON_TABLE(expr, path COLUMNS ...)JSON 轉(zhuǎn)結(jié)果集

示例 17 — JSON_TABLE

-- 將 JSON 數(shù)組轉(zhuǎn)為表格數(shù)據(jù)
SELECT * FROM JSON_TABLE(
    '[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]',
    '$[*]' COLUMNS (
        id INT PATH '$.id',
        name VARCHAR(50) PATH '$.name'
    )
) AS jt;
?
-- 結(jié)果:
-- +------+-------+
-- | id   | name  |
-- +------+-------+
-- | 1    | Alice |
-- | 2    | Bob   |
-- +------+-------+

8. 加密與壓縮函數(shù)

8.1 哈希函數(shù)

函數(shù)名說明語法
MD5(str)計算 MD5 校驗和SELECT MD5('hello');
SHA(str) / SHA1(str)計算 SHA-1SELECT SHA('hello');
SHA2(str, hash_length)計算 SHA-2 (224/256/384/512)SELECT SHA2('hello', 256);
CRC32(str)計算 CRC32 校驗和SELECT CRC32('hello');

8.2 加密解密

函數(shù)名說明
AES_ENCRYPT(str, key)AES 加密
AES_DECRYPT(crypt_str, key)AES 解密
COMPRESS(str)壓縮
UNCOMPRESS(str)解壓
RANDOM_BYTES(n)生成隨機字節(jié)
UUID()生成 UUID
UUID_SHORT()生成短 UUID(64 位無符號整數(shù))

注意:MySQL 8.0 已棄用 PASSWORD()、ENCRYPT()、DES_ENCRYPT()、DES_DECRYPT() 等函數(shù)。

9. 信息函數(shù)

信息函數(shù)用于獲取 MySQL 系統(tǒng)和會話相關(guān)信息。

函數(shù)名說明示例
DATABASE() / SCHEMA()當前數(shù)據(jù)庫名SELECT DATABASE();
VERSION()MySQL 版本SELECT VERSION(); → 8.0.32
USER() / CURRENT_USER()當前用戶SELECT USER();
CONNECTION_ID()連接 IDSELECT CONNECTION_ID();
LAST_INSERT_ID()最后插入的自增 IDSELECT LAST_INSERT_ID();
ROW_COUNT()上條語句影響的行數(shù)INSERT INTO ...; SELECT ROW_COUNT();
FOUND_ROWS()最后 SELECT 的結(jié)果行數(shù)(不加 LIMIT 時的總行數(shù))SELECT FOUND_ROWS();
BENCHMARK(n, expr)性能測試SELECT BENCHMARK(1000000, MD5('test'));
CHARSET(str)返回字符集SELECT CHARSET('hello'); → utf8mb4
COLLATION(str)返回排序規(guī)則SELECT COLLATION('hello');

10. 類型轉(zhuǎn)換函數(shù)

函數(shù)/操作符說明示例
CAST(expr AS type)類型轉(zhuǎn)換SELECT CAST('123' AS SIGNED);
CONVERT(expr, type)類型轉(zhuǎn)換SELECT CONVERT('2024-01-15', DATE);
BINARY expr轉(zhuǎn)為二進制字符串(大小寫敏感比較時常用)SELECT 'ABC' = 'abc' → 1(不區(qū)分大小寫)

支持的轉(zhuǎn)換類型BINARY, CHAR, DATE, DATETIME, TIME, DECIMAL, SIGNED, UNSIGNED, DOUBLE, FLOAT, JSON。

示例 18

-- 字符串轉(zhuǎn)整數(shù)
SELECT CAST('123' AS SIGNED) + 1;          -- 124
?
-- 整數(shù)轉(zhuǎn)字符串
SELECT CONCAT('編號:', CAST(123 AS CHAR)); -- 編號:123
?
-- 字符串轉(zhuǎn)日期
SELECT CAST('2024-01-15' AS DATE);          -- 2024-01-15
?
-- 轉(zhuǎn)為 JSON
SELECT CAST('{"id":1}' AS JSON);
?
-- 大小寫敏感比較
SELECT 'ABC' = 'abc';                        -- 1(不區(qū)分大小寫)
SELECT BINARY 'ABC' = 'abc';                 -- 0(區(qū)分大小寫)

11. 其他函數(shù)

11.1 比較與條件函數(shù)

函數(shù)名說明示例
GREATEST(v1, v2, ...)返回最大值SELECT GREATEST(3, 7, 2); → 7
LEAST(v1, v2, ...)返回最小值SELECT LEAST(3, 7, 2); → 2
ISNULL(expr)判斷 NULLSELECT ISNULL(NULL); → 1
COALESCE(v1, ...)返回第一個非 NULL 值見第 6 節(jié)
ANY_VALUE(expr)抑制 ONLY_FULL_GROUP_BY 校驗SELECT dept, ANY_VALUE(name) FROM emp GROUP BY dept;

11.2 進制轉(zhuǎn)換

函數(shù)名說明示例
BIN(n)十進制轉(zhuǎn)二進制SELECT BIN(10); → 1010
OCT(n)十進制轉(zhuǎn)八進制SELECT OCT(10); → 12
HEX(n)十進制轉(zhuǎn)十六進制SELECT HEX(10); → A
CONV(n, from_base, to_base)任意進制轉(zhuǎn)換SELECT CONV('FF', 16, 10); → 255

11.3 鎖函數(shù)

函數(shù)名說明
GET_LOCK(name, timeout)獲取命名鎖
RELEASE_LOCK(name)釋放命名鎖
IS_FREE_LOCK(name)檢查鎖是否空閑
IS_USED_LOCK(name)返回鎖的連接 ID

12. 常見問題解答

Q1:COUNT(1) 和 COUNT(*) 到底有什么區(qū)別?

在 MySQL 8.0 的 InnoDB 引擎中,COUNT(*)COUNT(1) 在性能上幾乎沒有區(qū)別,優(yōu)化器會將它們做同樣的優(yōu)化處理。不同點在于:

  • COUNT(字段)忽略 NULL

  • COUNT(*)COUNT(1) 統(tǒng)計所有行,包括 NULL 行

Q2:LENGTH() 和 CHAR_LENGTH() 的區(qū)別?

  • LENGTH(str):返回字節(jié)長度,UTF-8 中文字符占 3 字節(jié)

  • CHAR_LENGTH(str):返回字符個數(shù),每個字符算 1 個

Q3:NOW() 和 SYSDATE() 的區(qū)別?

NOW()語句執(zhí)行開始時取值,同一事務(wù)中多次調(diào)用返回相同值;SYSDATE()每次調(diào)用時實時取值,多次調(diào)用可能返回不同時間。

Q4:RANK() 和 DENSE_RANK() 的區(qū)別?

當存在相同值時,RANK() 會跳過排名(1, 1, 3),DENSE_RANK() 不會跳過(1, 1, 2)。

Q5:MySQL 8.0 中哪些函數(shù)已被棄用?

MySQL 8.0 中已棄用或移除的函數(shù)包括:PASSWORD()、ENCRYPT()、DES_ENCRYPT()、DES_DECRYPT()、OLD_PASSWORD() 等,請使用 MD5()、SHA2()、AES_ENCRYPT() 等替代。

Q6:如何避免除零錯誤?

使用 NULLIF 函數(shù):

-- 如果 quantity 為 0,NULLIF 返回 NULL,除 NULL 結(jié)果為 NULL
SELECT amount / NULLIF(quantity, 0) AS unit_price FROM orders;

總結(jié)

本文系統(tǒng)梳理了 MySQL 8.0 的常用內(nèi)置函數(shù),涵蓋以下十大類別:

類別核心函數(shù)數(shù)量典型應(yīng)用場景
聚合函數(shù)~15數(shù)據(jù)統(tǒng)計、匯總分析
字符串函數(shù)~60文本處理、格式化
日期時間函數(shù)~40日期計算、格式化
窗口函數(shù)~12排名、環(huán)比分析、累計計算
數(shù)學(xué)函數(shù)~30數(shù)值運算、隨機數(shù)
流程控制函數(shù)~5條件判斷、NULL 處理
JSON 函數(shù)~30JSON 數(shù)據(jù)操作
加密壓縮函數(shù)~15數(shù)據(jù)加密、校驗
信息函數(shù)~10獲取系統(tǒng)和會話信息
類型轉(zhuǎn)換函數(shù)~3數(shù)據(jù)類型轉(zhuǎn)換

建議將本文收藏,在實際開發(fā)中查閱參考。完整函數(shù)列表可查閱 MySQL 8.0 官方參考手冊。

溫馨提示:熟練掌握常用函數(shù)可以讓你在寫 SQL 時得心應(yīng)手,但也要注意函數(shù)對性能的影響。在 WHERE 子句中對列使用函數(shù)(如 WHERE YEAR(created_at) = 2024)可能導(dǎo)致索引失效,建議在條件中直接使用范圍比較(如 WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01')。

到此這篇關(guān)于MySQL函數(shù)大全超詳細完整指南的文章就介紹到這了,更多相關(guān)MySQL函數(shù)大全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL存儲過程中變量的定義以及應(yīng)用詳解

    MySQL存儲過程中變量的定義以及應(yīng)用詳解

    MySQL變量定義和應(yīng)用是我們經(jīng)常會遇到的問題,下面這篇文章主要給大家介紹了關(guān)于MySQL存儲過程中變量的定義以及應(yīng)用的相關(guān)資料,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • MySQL中Xtrabackup高效部署實現(xiàn)主從復(fù)制方案

    MySQL中Xtrabackup高效部署實現(xiàn)主從復(fù)制方案

    本文主要介紹了使用PerconaXtrabackup進行大規(guī)模數(shù)據(jù)庫(>50GB)主從復(fù)制的部署流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Windows環(huán)境MySQL全量備份+增量備份的實現(xiàn)

    Windows環(huán)境MySQL全量備份+增量備份的實現(xiàn)

    本文主要介紹了Windows環(huán)境MySQL全量備份+增量備份的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 詳解MySQL?substring()?字符串截取函數(shù)

    詳解MySQL?substring()?字符串截取函數(shù)

    MySQL 查詢數(shù)據(jù)有時候需要對數(shù)據(jù)項進行日期格式化或截取特定部分的操作,當需要對字符串進行截取加工時用到了 substring() 函數(shù),這篇文章主要介紹了MySQL?substring()?字符串截取函數(shù),需要的朋友可以參考下
    2022-07-07
  • MySQL磁盤碎片整理實例演示

    MySQL磁盤碎片整理實例演示

    這篇文章主要給大家介紹了關(guān)于MySQL磁盤碎片整理的相關(guān)資料,為什么數(shù)據(jù)庫會產(chǎn)生碎片,以及如何清理磁盤碎片,還有一些清理磁盤碎片的注意事項,需要的朋友可以參考下
    2022-04-04
  • Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表

    Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表

    在Mysql的范圍分區(qū)表定義中,分區(qū)范圍需要連續(xù)并且不會有覆蓋,定義范圍分區(qū)表時,使用VALUES LESS THAN操作符,這篇文章主要介紹了Mysql如何按照范圍區(qū)間創(chuàng)建分區(qū)表,需要的朋友可以參考下
    2024-08-08
  • Mac下mysql 8.0.22 找回密碼的方法

    Mac下mysql 8.0.22 找回密碼的方法

    這篇文章主要介紹了Mac下mysql 8.0.22 找回密碼的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 如何使用mysql完成excel中的數(shù)據(jù)生成

    如何使用mysql完成excel中的數(shù)據(jù)生成

    這篇文章主要介紹了如何使用mysql完成excel中的數(shù)據(jù)生成的相關(guān)資料,需要的朋友可以參考下
    2017-11-11
  • mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用

    mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用

    本文主要介紹了mysql聚集索引、輔助索引、覆蓋索引、聯(lián)合索引的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • MySQL8.0.11版本的新增特性介紹

    MySQL8.0.11版本的新增特性介紹

    這篇文章主要介紹了MySQL8.0.11版本的新增特性介紹,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-05-05

最新評論

兰溪市| 阳原县| 环江| 通河县| 玉林市| 罗田县| 平乡县| 天峨县| 上杭县| 滁州市| 伽师县| 金寨县| 米易县| 隆昌县| 图木舒克市| 共和县| 乐昌市| 安塞县| 分宜县| 故城县| 河曲县| 灵武市| 正宁县| 益阳市| 和平区| 威宁| 锦州市| 施甸县| 峨边| 花莲市| 垦利县| 沧州市| 古田县| 图们市| 嘉禾县| 从化市| 锡林郭勒盟| 屏东市| 海丰县| 清原| 竹溪县|