Skip to content

MySQL 常见函数

1. 聚合函数

聚合函数用于对一组数据执行计算,常用于 GROUP BY 语句来进行数据分组后的计算。例如常见的有,平均数,最大值,最小值和总和。

函数描述
COUNT(*)统计行数
SUM(column)计算某列的总和
AVG(column)计算某列的平均值
MAX(column)计算某列的最大值
MIN(column)计算某列的最小值

使用示例

sql
select count(*) from emp where sal>2000;
select SUM(sal) from emp where sal>2000;
select AVG(sal) from emp where sal>2000;
select MAX(sal) from emp where sal>2000;
select MIN(sal) from emp where sal>2000;

2. 开窗函数

开窗函数用于在查询结果的某一组数据上进行计算,但不会折叠行,即计算结果仍然返回到每一行。简单理解他是为了简化SQL开发的一种简单嵌套函数。

函数描述
ROW_NUMBER()按指定顺序编号,无重复值
RANK()按顺序编号,遇到相同值会跳号
DENSE_RANK()按顺序编号,相同值不会跳号
LAG(column, offset, default)取前 offset 行的值
LEAD(column, offset, default)取后 offset 行的值
SUM(column) OVER (PARTITION BY ...)按窗口计算总和
AVG(column) OVER (PARTITION BY ...)按窗口计算均值

使用示例

sql
#基本结构
函数名([参数]) OVER (
  [PARTITION BY 分组字段]
  [ORDER BY 排序字段]
  [ROWS/RANGE 窗口范围]
)

3. 数值函数

用于处理数值类型的数据,如四舍五入、取整、取绝对值等。

函数作用示例结果
ABS(x)取绝对值SELECT ABS(-10);10
CEIL(x)向上取整SELECT CEIL(3.4);4
FLOOR(x)向下取整SELECT FLOOR(3.8);3
ROUND(x, d)四舍五入SELECT ROUND(3.14159,2);3.14
RAND()生成 0~1 之间的随机数SELECT RAND();0.78452
MOD(x, y)取模(余数)SELECT MOD(10,3);1

4. 字符串函数

用于处理字符串,如拼接、替换、提取子串等。

函数作用示例结果
LENGTH(s)计算字符串长度SELECT LENGTH('Hello');5
UPPER(s)转换为大写SELECT UPPER('hello');HELLO
LOWER(s)转换为小写SELECT LOWER('HELLO');hello
TRIM(s)去掉首尾空格SELECT TRIM(' abc ');abc
SUBSTRING(s, start, length)提取子串SELECT SUBSTRING('abcdef',2,3);bcd
CONCAT(s1, s2, ...)字符串拼接SELECT CONCAT('Hello',' ','World');Hello World
REPLACE(s, from, to)替换子串SELECT REPLACE('Hello World', 'World', 'SQL');Hello SQL

5. 日期时间函数

用于处理日期和时间,如计算日期差、格式化日期等。

函数作用示例结果
NOW()获取当前时间SELECT NOW();2025-02-25 12:30:45
CURDATE()获取当前日期SELECT CURDATE();2025-02-25
CURTIME()获取当前时间SELECT CURTIME();12:30:45
YEAR(d)提取年份SELECT YEAR('2025-02-25');2025
MONTH(d)提取月份SELECT MONTH('2025-02-25');2
DAY(d)提取日SELECT DAY('2025-02-25');25
DATEDIFF(d1, d2)计算日期间隔(天)SELECT DATEDIFF('2025-03-01', '2025-02-25');4
TIMEDIFF(t1, t2)计算时间差SELECT TIMEDIFF('12:30:45', '11:25:30');01:05:15
DATE_ADD(d, INTERVAL n unit)日期加法SELECT DATE_ADD('2025-02-25', INTERVAL 10 DAY);2025-03-07
DATE_SUB(d, INTERVAL n unit)日期减法SELECT DATE_SUB('2025-02-25', INTERVAL 1 MONTH);2025-01-25

6. 条件判断函数

用于逻辑判断,比如 CASE、IFNULL 等。

函数作用示例结果
IF(condition, true_value, false_value)条件判断SELECT IF(10 > 5, 'Yes', 'No');Yes
IFNULL(expr, value)为空时替换值SELECT IFNULL(NULL, 'default');default
COALESCE(a, b, c, ...)取第一个非 NULL 值SELECT COALESCE(NULL, NULL, 'Hello');Hello
CASE WHEN ... THEN ... ELSE ... END多条件判断见示例

条件逻辑函数案例

sql
SELECT 
    account,
    gender,
    CASE 
        WHEN gender = 'M' THEN 'Male'
        WHEN gender = 'F' THEN 'Female'
        ELSE 'Unknown'
    END AS gender_desc
FROM dim_user;

7.案例和练习

下面给出一个简单的案例,包含两个表的创建、插入样例数据以及一个基本的 JOIN 查询,适合新手练习 SQL。最后还附带三个个简单的练习题。

sql
# 创建数据库并使用
CREATE DATABASE IF NOT EXISTS test;
USE test;

# 事件日志表
CREATE TABLE ods_app_event_log (
  account VARCHAR(50) COMMENT '用户账号',
  eventId VARCHAR(50) COMMENT '事件类型',
  ts BIGINT COMMENT '事件时间戳',
  PRIMARY KEY (account, ts)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='APP用户事件日志表';

# 用户维度表
CREATE TABLE dim_user (
  account VARCHAR(50) COMMENT '用户账号',
  user_name VARCHAR(100) COMMENT '用户名',
  gender VARCHAR(10) COMMENT '性别',
  PRIMARY KEY (account)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户维度表';

# 插入样例数据
-- 插入事件日志数据
INSERT INTO ods_app_event_log (account, eventId, ts) VALUES
('user1', 'login', 1650000000),
('user1', 'search', 1650003600),
('user2', 'login', 1650007200),
('user3', 'purchase', 1650010800),
('user2', 'search', 1650014400);

-- 插入用户维度数据
INSERT INTO dim_user (account, user_name, gender) VALUES
('user1', 'Alice', 'F'),
('user2', 'Bob', 'M'),
('user3', 'Charlie', 'M');
  • 练习题1:写一个 SQL 查询,将事件日志表和用户维度表通过 account 字段连接,显示每条事件记录中用户的账号、用户名和事件类型。
sql
SELECT e.account, u.user_name, e.eventId
FROM ods_app_event_log e
JOIN dim_user u ON e.account = u.account;
  • 练习题2:统计每个用户在事件日志表中的总事件数,并显示账号、用户名和事件总数。
sql
SELECT u.account, u.user_name, COUNT(e.eventId) AS event_count
FROM ods_app_event_log e
JOIN dim_user u ON e.account = u.account
GROUP BY u.account, u.user_name;
  • 练习题3:根据用户性别统计所有用户的总事件数,显示性别以及对应的事件总数。
sql
SELECT u.gender, COUNT(e.eventId) AS total_events
FROM ods_app_event_log e
JOIN dim_user u ON e.account = u.account
GROUP BY u.gender;

示例:计算每个用户的事件数

sql
SELECT account, COUNT(eventId) AS event_count
FROM ods_app_event_log
GROUP BY account;

如有转载或 CV 的请标注本站原文地址

访客数 --| 总访问量 --