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 条评论
 下一页
  
   
  
  
  
  
  
  
  
  
 