MySQL
2025-09-15 10:13:09 0 举报
MySQL是一种流行的开源关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据库管理。作为数据库软件的核心,MySQL支持数据操作、更新、查询等多种功能。此系统以高效的执行速度和可靠的性能闻名于世,广泛应用于各种规模的企业级应用中。其跨平台支持多种操作系统,包括Linux, Windows, MacOS等。作为一种技术,MySQL常被用来构建交互式网站应用程序,极大地提高了数据处理和存储能力。修饰语可能包括“高效、稳定、灵活、开源”。文件类型通常包括.sql的数据表结构定义,.frm用于存储表定义,.myd用于表数据等格式。
作者其他创作
大纲/内容
数据类型
数字类型
TINYINT
说明:非常小的整数
有符号范围(近似):-128 ~ 127
无符号范围(近似):0 ~ 255
用途:状态值、布尔值(0/1)、年龄
SMALLINT
说明:小整数
有符号范围(近似):-32768 ~ 32767
无符号范围(近似):0 ~ 65535
用途:小范围数值
MEDIUMINT
说明:中等整数
有符号范围(近似):-8388608 ~ 8388607
无符号范围(近似):0 ~ 16777215
INT / INTEGER
说明:标准整数
有符号范围(近似):-2^31 ~ 2^31-1
无符号范围(近似):0 ~ 2^32-1
用途:最常用的整数类型
BIGINT
说明:大整数
有符号范围(近似):-2^63 ~ 2^63-1
无符号范围(近似):0 ~ 2^64-1
用途:非常大的人口数、科学计算
FLOAT
说明:单精度浮点数
有符号范围(近似):-3.4E+38 ~ -1.1E-38, 0, 1.1E-38 ~ 3.4E+38
用途:近似数值,7位有效数字
DOUBLE
说明:双精度浮点数
有符号范围(近似):-1.7E+308 ~ -2.2E-308, 0, 2.2E-308 ~ 1.7E+308
用途:近似数值,15位有效数字
DECIMAL(M, D)
说明:精确小数
有符号范围(近似):取决于 M 和 D
用途:精确计算(如金额)。M 是总位数,D 是小数位数。
日期和时间类型
DATE
格式:YYYY-MM-DD
范围:1000-01-01 ~ 9999-12-31
用途:仅存储日期
TIME
格式:HH:MM:SS
范围:-838:59:59 ~ 838:59:59
用途:存储时间或持续时间
DATETIME
格式:YYYY-MM-DD HH:MM:SS
范围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
用途:日期和时间组合
TIMESTAMP
格式:YYYY-MM-DD HH:MM:SS
范围:1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
用途:时间戳,与时区相关,占用空间小
YEAR
格式:YYYY
范围:1901 ~ 2155
用途:存储年份
字符串类型
CHAR(M)
说明:定长字符串
最大长度:0 ~ 255 字符
用途:存储固定长度的数据(如国家代码、MD5哈希),速度快
VARCHAR(M)
说明:变长字符串
最大长度:0 ~ 65535 字节
用途:存储可变长度数据(如姓名、地址),节省空间
TEXT
说明:长文本数据
最大长度:65,535 字节
用途:存储大段文本,如文章正文、评论
BLOB
说明:二进制大对象
最大长度:65,535 字节
用途:存储二进制数据,如图片、文件
ENUM
说明:枚举类型
最大长度:65535 个成员
用途:存储预定义列表中的一个值(如‘男’,‘女’)
SET
说明:集合类型
最大长度:64 个成员
用途:存储预定义列表中的多个值
窗口函数(Window Functions)
窗口函数是 MySQL 8.0 版本引入的一个极其强大的特性
语法结构
window_function_name(expression) OVER (
[PARTITION BY partition_expression, ... ]
[ORDER BY sort_expression [ASC | DESC], ... ]
[frame_definition]
)
[PARTITION BY partition_expression, ... ]
[ORDER BY sort_expression [ASC | DESC], ... ]
[frame_definition]
)
聚合函数作为窗口函数
所有聚合函数(如 SUM(), AVG(), COUNT(), MAX(), MIN())都可以与 OVER() 子句一起使用。
计算每个员工的薪水及其所在部门的平均薪水
SELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS avg_department_salary
FROM employees;
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS avg_department_salary
FROM employees;
上述语句结果
专用窗口函数
排名函数
ROW_NUMBER():为分区内的每一行分配一个唯一的连续序号(1, 2, 3...)。
RANK():排名,相同值的行排名相同,但下一排名会跳过重复的序号(1, 2, 2, 4...)。
DENSE_RANK():密集排名,相同值的行排名相同,且下一排名是连续的(1, 2, 2, 3...)。
RANK():排名,相同值的行排名相同,但下一排名会跳过重复的序号(1, 2, 2, 4...)。
DENSE_RANK():密集排名,相同值的行排名相同,且下一排名是连续的(1, 2, 2, 3...)。
对每个部门的员工按薪水排名
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as ‘row_num‘,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as ‘rank‘,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) as ‘dense_rank‘
FROM employees;
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as ‘row_num‘,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as ‘rank‘,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) as ‘dense_rank‘
FROM employees;
以上为上面数据结果
分布函数
PERCENT_RANK():计算行的百分排名((rank - 1) / (total_rows - 1))。
CUME_DIST():计算行的累积分布(<= 当前行的行数 / 分区总行数)。
CUME_DIST():计算行的累积分布(<= 当前行的行数 / 分区总行数)。
前后行函数
LAG(expr, offset):返回分区中当前行之前第 offset 行的值。
LEAD(expr, offset):返回分区中当前行之后第 offset 行的值。
非常适合计算环比、增长率。
LEAD(expr, offset):返回分区中当前行之后第 offset 行的值。
非常适合计算环比、增长率。
查看某日销售额以及前一天的销售额
SELECT
order_date,
daily_sales,
LAG(daily_sales, 1) OVER (ORDER BY order_date) as previous_day_sales
FROM sales;
order_date,
daily_sales,
LAG(daily_sales, 1) OVER (ORDER BY order_date) as previous_day_sales
FROM sales;
结果
首尾值函数
FIRST_VALUE(expr):返回窗口框架第一行的值。
LAST_VALUE(expr):返回窗口框架最后一行的值。(注意默认框架范围)
NTH_VALUE(expr, N):返回窗口框架第N行的值。
LAST_VALUE(expr):返回窗口框架最后一行的值。(注意默认框架范围)
NTH_VALUE(expr, N):返回窗口框架第N行的值。
窗口框架(Frame Clause)
框架定义了窗口函数在分区内计算的行范围。使用 ROWS 或 RANGE 来定义。
ROWS BETWEEN start AND end
UNBOUNDED PRECEDING:分区开始
n PRECEDING:当前行之前的第 n 行
CURRENT ROW:当前行
n FOLLOWING:当前行之后的第 n 行
UNBOUNDED FOLLOWING:分区结束
计算累计薪水(从部门开始到当前行)
SELECT
name,
department,
salary,
SUM(salary) OVER (
PARTITION BY department
ORDER BY hire_date -- 按入职日期排序
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 框架:从开始到当前行
) AS running_total
FROM employees;
内置函数
字符串函数
CONCAT()
连接两个或多个字符串
子主题
SUBSTRING() / SUBSTR()
提取子字符串
子主题
LENGTH() / CHAR_LENGTH()
返回字符串长度(字节/字符)
子主题
UPPER() / LOWER()
转换大小写
子主题
REPLACE()
替换字符串
SELECT REPLACE('I like apples', 'apples', 'oranges'); -- 输出: 'I like oranges'
LOCATE() / POSITION()
查找子字符串位置
数值函数
ROUND()
四舍五入
SELECT ROUND(3.14159, 2); -- 输出: 3.14
SELECT ROUND(123.456, -1); -- 输出: 120
CEIL() / CEILING() / FLOOR()
向上/向下取整
ABS()
绝对值
MOD()
取模运算
SELECT MOD(10, 3); -- 输出: 1
SELECT 10 % 3; -- 输出: 1 (同MOD函数)
POW() / POWER()
幂运算
SELECT POW(2, 3); -- 输出: 8
SELECT POWER(2, 4); -- 输出: 16
SQRT()
平方根
SELECT SQRT(16); -- 输出: 4
RAND()
随机数
日期和时间函数
NOW() / CURDATE() / CURTIME()
获取当前日期时间
SELECT NOW(); -- 输出: '2023-10-12 14:30:45'
SELECT CURDATE(); -- 输出: '2023-10-12'
SELECT CURTIME(); -- 输出: '14:30:45'
DATE() / TIME()
提取年/月/日
SELECT YEAR('2023-10-12'); -- 输出: 2023
SELECT MONTH('2023-10-12'); -- 输出: 10
SELECT DAY('2023-10-12'); -- 输出: 12
DATEDIFF()
计算日期差
SELECT DATEDIFF('2023-10-15', '2023-10-12'); -- 输出: 3
DATE_ADD() / DATE_SUB()
日期加减
SELECT DATE_ADD('2023-10-12', INTERVAL 7 DAY); -- 输出: '2023-10-19'
SELECT DATE_SUB('2023-10-12', INTERVAL 1 MONTH); -- 输出: '2023-09-12'
DATE_FORMAT()
格式化日期
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 输出: '2023-10-12'
SELECT DATE_FORMAT(NOW(), '%W, %M %e, %Y'); -- 输出: 'Thursday, October 12, 2023'
聚合函数
COUNT()
计数
SUM()
求和
SELECT SUM(salary) FROM employees; -- 返回所有员工的薪资总和
AVG()
平均值
SELECT AVG(salary) FROM employees; -- 返回平均薪资
MAX() / MIN()
最大值/最小值
GROUP_CONCAT()
将组内值连接成字符串
SELECT department, GROUP_CONCAT(name)
FROM employees
GROUP BY department;
-- 输出每个部门的所有员工姓名列表
条件函数
IF()
条件判断
CASE
多条件判断
IFNULL() / COALESCE()
处理NULL值
子主题
如果expr1不为NULL,则返回expr1;
如果expr1为NULL,则返回expr2。
子主题
是 MySQL 专属函数,不兼容其他数据库(如 PostgreSQL、SQL Server 等)。
COALESCE()是标准 SQL 函数(兼容所有遵循 SQL 标准的数据库),用于从多个参数中返回第一个非NULL的值。
COALESCE(expr1, expr2, ..., exprn)
依次检查参数expr1, expr2, ..., exprn,返回第一个非NULL的参数;
如果所有参数都是NULL,则返回NULL。
子主题
NULLIF()
比较两个表达式,相等则返回NULL
JSON函数 (MySQL 5.7+)
JSON_EXTRACT() / -> / ->>
提取JSON数据
JSON_OBJECT()
创建JSON对象
JSON_ARRAY()
创建JSON数组
其他有用函数
CAST() / CONVERT()
类型转换
SELECT CAST('123' AS UNSIGNED); -- 输出: 123
SELECT CONVERT('2023-10-12', DATE); -- 输出: 2023-10-12
INET_ATON() / INET_NTOA()
IP地址转换
SELECT INET_ATON('192.168.1.1'); -- 输出: 3232235777
SELECT INET_NTOA(3232235777); -- 输出: '192.168.1.1'
MD5() / SHA1() / SHA2()
哈希函数
0 条评论
下一页