最强总结!SQL Server/MySQL/Oracle函数完全指南!
liebian365 2025-01-29 16:44 15 浏览 0 评论
最强总结!数据库开窗函数完全指南!!
今天给大家总结的是SQL Server/MySQL/Oracle这三个关系数据库的函数内容,包含常用和不常用的。
这些总结都是此前整理好后保存的,最近集中发布,觉得有帮助,记得三连(点赞+转发+在看),笔者才会更有动力继续发布。此外,大家也可以留言需要哪方面的总结。
- 字符串函数
- 数值函数
- 日期时间函数
- 条件和控制函数
- 窗口函数
- JSON函数(MySQL 5.7+)
- 加密和安全函数
- XML函数(SQL Server)
- 正则表达式函数
- 系统信息函数
- 高级聚合函数
- 统计和数学函数
- 字符串模式匹配函数
- 条件和流程控制增强
- 表分析函数
- 实用复合函数示例
1. 字符串函数
1.1 基础字符串函数
- LENGTH/LEN/LENGTH - 获取字符串长度
-- MySQL
SELECT LENGTH('Hello World'); -- 11
-- SQL Server
SELECT LEN('Hello World'); -- 11
-- Oracle
SELECT LENGTH('Hello World') FROM DUAL; -- 11
- CHAR_LENGTH - 获取字符数(区别于字节长度)
-- MySQL & Oracle
SELECT CHAR_LENGTH('你好'); -- 2
- SUBSTRING/SUBSTR - 截取字符串
-- MySQL & SQL Server
SELECT SUBSTRING('Hello World', 1, 5); -- 'Hello'
SELECT SUBSTRING('Hello World', -5); -- 'World'
-- Oracle
SELECT SUBSTR('Hello World', 1, 5) FROM DUAL;
- LEFT/RIGHT - 从左/右截取
-- MySQL & SQL Server
SELECT LEFT('Hello World', 5); -- 'Hello'
SELECT RIGHT('Hello World', 5); -- 'World'
- REPLACE - 替换字符串
-- 所有数据库通用
SELECT REPLACE('Hello World', 'World', 'SQL'); -- 'Hello SQL'
- STUFF - 字符串替换(SQL Server特有)
SELECT STUFF('Hello World', 1, 5, 'Hi'); -- 'Hi World'
- POSITION/INSTR/CHARINDEX - 查找子字符串位置
-- MySQL
SELECT POSITION('World' IN 'Hello World'); -- 7
-- Oracle
SELECT INSTR('Hello World', 'World') FROM DUAL; -- 7
-- SQL Server
SELECT CHARINDEX('World', 'Hello World'); -- 7
- REVERSE - 反转字符串
-- 所有数据库
SELECT REVERSE('Hello'); -- 'olleH'
- SPACE - 生成空格字符串
-- SQL Server & MySQL
SELECT 'Hello' + SPACE(1) + 'World'; -- 'Hello World'
- REPEAT/REPLICATE - 重复字符串
-- MySQL
SELECT REPEAT('SQL', 3); -- 'SQLSQLSQL'
-- SQL Server
SELECT REPLICATE('SQL', 3); -- 'SQLSQLSQL'
1.2 高级字符串函数
- FORMAT - 格式化字符串
-- MySQL & SQL Server
SELECT FORMAT(123456.789, 2); -- '123,456.79'
- STRING_SPLIT(SQL Server)/SPLIT_STRING(MySQL) - 字符串分割
-- SQL Server
SELECT value FROM STRING_SPLIT('a,b,c', ',');
-- MySQL
SELECT SUBSTRING_INDEX('a,b,c', ',', 1); -- 'a'
- GROUP_CONCAT/STRING_AGG - 字符串聚合
-- MySQL
SELECT GROUP_CONCAT(name SEPARATOR ',') FROM employees;
-- SQL Server
SELECT STRING_AGG(name, ',') FROM employees;
-- Oracle
SELECT LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) FROM employees;
2. 数值函数
2.1 基础数学函数
- ROUND/TRUNC/TRUNCATE - 截断
-- 所有数据库
SELECT ROUND(123.456, 2); -- 123.46
-- Oracle
SELECT TRUNC(123.456, 2) FROM DUAL; -- 123.45
-- MySQL
SELECT TRUNCATE(123.456, 2); -- 123.45
- MOD - 取模
-- 所有数据库
SELECT MOD(10, 3); -- 1
- SQRT - 平方根
SELECT SQRT(16); -- 4
- SIGN - 获取数字符号
SELECT SIGN(-10); -- -1
SELECT SIGN(10); -- 1
SELECT SIGN(0); -- 0
2.2 高级数学函数
- LOG/LOG10/LN - 对数运算
SELECT LOG(10, 100); -- 2
SELECT LOG10(100); -- 2
SELECT LN(2.7); -- 0.993
- EXP - 指数运算
SELECT EXP(1); -- 2.718281828459045
- RAND/RANDOM - 随机数
-- MySQL & SQL Server
SELECT RAND();
-- Oracle
SELECT DBMS_RANDOM.VALUE FROM DUAL;
3. 日期时间函数
3.1 获取日期时间
- NOW/GETDATE/SYSDATE - 当前日期时间
-- MySQL
SELECT NOW();
-- SQL Server
SELECT GETDATE();
-- Oracle
SELECT SYSDATE FROM DUAL;
- CURDATE/CURRENT_DATE - 当前日期
-- MySQL
SELECT CURDATE();
-- Oracle & SQL Server
SELECT CURRENT_DATE;
- CURTIME/CURRENT_TIME - 当前时间
-- MySQL
SELECT CURTIME();
-- Oracle & SQL Server
SELECT CURRENT_TIME;
3.2 日期时间处理
- DATE_ADD/DATEADD - 日期加减
-- MySQL
SELECT DATE_ADD('2024-03-12', INTERVAL 1 DAY);
SELECT DATE_ADD('2024-03-12', INTERVAL 1 MONTH);
SELECT DATE_ADD('2024-03-12', INTERVAL 1 YEAR);
-- SQL Server
SELECT DATEADD(day, 1, '2024-03-12');
SELECT DATEADD(month, 1, '2024-03-12');
SELECT DATEADD(year, 1, '2024-03-12');
- DATE_FORMAT/FORMAT - 日期格式化
-- MySQL
SELECT DATE_FORMAT('2024-03-12', '%Y年%m月%d日'); -- '2024年03月12日'
-- SQL Server
SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日');
- EXTRACT/DATEPART - 提取日期部分
-- MySQL & Oracle
SELECT EXTRACT(YEAR FROM '2024-03-12');
SELECT EXTRACT(MONTH FROM '2024-03-12');
SELECT EXTRACT(DAY FROM '2024-03-12');
-- SQL Server
SELECT DATEPART(year, '2024-03-12');
SELECT DATEPART(month, '2024-03-12');
SELECT DATEPART(day, '2024-03-12');
- LAST_DAY - 获取月末日期
-- MySQL & Oracle
SELECT LAST_DAY('2024-03-12'); -- '2024-03-31'
4. 条件和控制函数
- IF/IIF - 条件判断
-- MySQL
SELECT IF(1 > 0, 'True', 'False');
-- SQL Server
SELECT IIF(1 > 0, 'True', 'False');
- IFNULL/ISNULL/NVL - NULL值处理
-- MySQL
SELECT IFNULL(NULL, 'Default');
-- SQL Server
SELECT ISNULL(NULL, 'Default');
-- Oracle
SELECT NVL(NULL, 'Default') FROM DUAL;
- NULLIF - 相等返回NULL
SELECT NULLIF(10, 10); -- NULL
SELECT NULLIF(10, 20); -- 10
- GREATEST/LEAST - 最大最小值
-- MySQL & Oracle
SELECT GREATEST(1, 2, 3, 4, 5); -- 5
SELECT LEAST(1, 2, 3, 4, 5); -- 1
5. 窗口函数
- ROW_NUMBER/RANK/DENSE_RANK - 排序
SELECT
name,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) as row_num,
RANK() OVER (ORDER BY salary DESC) as rank_num,
DENSE_RANK() OVER (ORDER BY salary DESC) as dense_rank_num
FROM employees;
- FIRST_VALUE/LAST_VALUE - 首尾值
SELECT
name,
department,
salary,
FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) as highest_salary,
LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as lowest_salary
FROM employees;
- LAG/LEAD - 前后行
SELECT
name,
department,
salary,
LAG(salary) OVER (PARTITION BY department ORDER BY salary) as prev_salary,
LEAD(salary) OVER (PARTITION BY department ORDER BY salary) as next_salary
FROM employees;
- NTILE - 分组
SELECT
name,
salary,
NTILE(4) OVER (ORDER BY salary) as quartile
FROM employees;
6. JSON函数(MySQL 5.7+)
- JSON_EXTRACT - 提取JSON值
SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name'); -- "John"
- JSON_OBJECT - 创建JSON对象
SELECT JSON_OBJECT('name', 'John', 'age', 30);
- JSON_ARRAY - 创建JSON数组
SELECT JSON_ARRAY(1, 2, 3, 4, 5);
- JSON_CONTAINS - 检查JSON包含
SELECT JSON_CONTAINS('{"a": 1, "b": 2}', '1', '$.a'); -- 1
7. 加密和安全函数
- MD5 - MD5加密
-- MySQL & SQL Server
SELECT MD5('password');
- SHA1/SHA2 - SHA加密
-- MySQL
SELECT SHA1('password');
SELECT SHA2('password', 256);
- ENCRYPT/DECRYPT - 加密解密
-- MySQL
SET @key = 'secret_key';
SET @encrypted = AES_ENCRYPT('text', @key);
SELECT AES_DECRYPT(@encrypted, @key);
8. XML函数(SQL Server)
- FOR XML PATH - 生成XML
SELECT name, age
FROM employees
FOR XML PATH('employee'), ROOT('employees')
- XML数据类型方法
DECLARE @xml XML
SET @xml = '<root><child>value</child></root>'
SELECT @xml.value('(/root/child)[1]', 'varchar(50)')
9. 正则表达式函数
- REGEXP/RLIKE - 正则匹配(MySQL)
SELECT 'hello' REGEXP '^h'; -- 1
SELECT 'hello' RLIKE 'l+'; -- 1
- REGEXP_LIKE - 正则匹配(Oracle)
SELECT * FROM employees WHERE REGEXP_LIKE(email, '^[A-Za-z]+@[A-Za-z]+\.[A-Za-z]{2,4}#39;);
10. 系统信息函数
- VERSION - 数据库版本
-- MySQL
SELECT VERSION();
-- SQL Server
SELECT @@VERSION;
-- Oracle
SELECT * FROM V$VERSION;
- USER/CURRENT_USER - 当前用户
-- 所有数据库
SELECT USER;
SELECT CURRENT_USER;
- DATABASE/DB_NAME - 当前数据库
-- MySQL
SELECT DATABASE();
-- SQL Server
SELECT DB_NAME();
11. 高级聚合函数
- GROUPING SETS - 多维度聚合
SELECT department, location, COUNT(*)
FROM employees
GROUP BY GROUPING SETS (
(department, location),
(department),
(location),
()
);
- CUBE - 所有可能的组合
SELECT department, location, COUNT(*)
FROM employees
GROUP BY CUBE (department, location);
- ROLLUP - 层次聚合
SELECT
COALESCE(department, 'Total') as department,
COALESCE(location, 'Subtotal') as location,
COUNT(*) as employee_count,
AVG(salary) as avg_salary
FROM employees
GROUP BY ROLLUP (department, location);
- PIVOT - 行转列
-- SQL Server
SELECT *
FROM (
SELECT department, location, salary
FROM employees
) AS SourceTable
PIVOT (
AVG(salary)
FOR location IN ([New York], [London], [Tokyo])
) AS PivotTable;
12. 统计和数学函数
- PERCENTILE_CONT/PERCENTILE_DISC - 百分位数
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) as median_salary,
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary) as discrete_median
FROM employees;
- CORR - 相关系数
SELECT CORR(salary, performance_score)
FROM employees;
- STDDEV/VARIANCE - 标准差和方差
SELECT
department,
AVG(salary) as avg_salary,
STDDEV(salary) as salary_stddev,
VARIANCE(salary) as salary_variance
FROM employees
GROUP BY department;
- FIRST/LAST - 组内第一个/最后一个值
-- Oracle
SELECT
department,
FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date) as first_salary,
LAST_VALUE(salary) OVER (
PARTITION BY department
ORDER BY hire_date
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) as last_salary
FROM employees;
13. 字符串模式匹配函数
- LIKE模式匹配增强
-- 复杂LIKE模式
SELECT * FROM employees
WHERE
name LIKE '[A-M]%' -- SQL Server, 以A到M开头的名字
AND email LIKE '%@__%.__%'; -- 标准email模式
14. 条件和流程控制增强
- CHOOSE - 索引选择
-- SQL Server
SELECT CHOOSE(2, 'First', 'Second', 'Third'); -- 返回 'Second'
- 复杂CASE表达式
SELECT
employee_name,
salary,
CASE
WHEN salary <= (SELECT AVG(salary) FROM employees) THEN 'Below Average'
WHEN salary <= (SELECT AVG(salary) + STDDEV(salary) FROM employees) THEN 'Average'
WHEN salary <= (SELECT AVG(salary) + 2*STDDEV(salary) FROM employees) THEN 'Above Average'
ELSE 'Exceptional'
END as salary_category
FROM employees;
15. 表分析函数
- PERCENT_RANK - 百分比排名
SELECT
name,
salary,
PERCENT_RANK() OVER (ORDER BY salary) as salary_percentile
FROM employees;
- CUME_DIST - 累积分布
SELECT
name,
salary,
CUME_DIST() OVER (ORDER BY salary) as salary_distribution
FROM employees;
16. 实用复合函数示例
- 年龄计算
-- MySQL
SELECT
name,
birthdate,
TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) as age,
DATE_ADD(birthdate,
INTERVAL TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) YEAR) as last_birthday,
DATE_ADD(birthdate,
INTERVAL TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) + 1 YEAR) as next_birthday
FROM employees;
- 工龄分析
SELECT
name,
hire_date,
CASE
WHEN DATEDIFF(YEAR, hire_date, GETDATE()) < 2 THEN 'Junior'
WHEN DATEDIFF(YEAR, hire_date, GETDATE()) < 5 THEN 'Intermediate'
WHEN DATEDIFF(YEAR, hire_date, GETDATE()) < 10 THEN 'Senior'
ELSE 'Expert'
END as experience_level
FROM employees;
- 薪资分析
WITH salary_stats AS (
SELECT
department,
AVG(salary) as avg_salary,
STDDEV(salary) as salary_stddev
FROM employees
GROUP BY department
)
SELECT
e.name,
e.department,
e.salary,
s.avg_salary,
(e.salary - s.avg_salary) / s.salary_stddev as z_score,
PERCENT_RANK() OVER (PARTITION BY e.department ORDER BY e.salary) as dept_percentile
FROM employees e
JOIN salary_stats s ON e.department = s.department;
- 考勤分析
WITH daily_attendance AS (
SELECT
employee_id,
attendance_date,
check_in_time,
check_out_time,
CASE
WHEN check_in_time > '09:00:00' THEN 'Late'
WHEN check_out_time < '17:00:00' THEN 'Early Leave'
ELSE 'Normal'
END as attendance_status
FROM attendance
)
SELECT
e.name,
COUNT(*) as total_days,
SUM(CASE WHEN a.attendance_status = 'Late' THEN 1 ELSE 0 END) as late_days,
SUM(CASE WHEN a.attendance_status = 'Early Leave' THEN 1 ELSE 0 END) as early_leave_days,
FORMAT(COUNT(*) * 1.0 /
(SELECT COUNT(DISTINCT attendance_date) FROM attendance), 'P') as attendance_rate
FROM employees e
JOIN daily_attendance a ON e.id = a.employee_id
GROUP BY e.name;
- 销售分析
WITH monthly_sales AS (
SELECT
YEAR(sale_date) as year,
MONTH(sale_date) as month,
SUM(amount) as total_sales,
COUNT(DISTINCT customer_id) as customer_count
FROM sales
GROUP BY YEAR(sale_date), MONTH(sale_date)
)
SELECT
year,
month,
total_sales,
customer_count,
total_sales / customer_count as avg_customer_value,
LAG(total_sales) OVER (ORDER BY year, month) as prev_month_sales,
total_sales - LAG(total_sales) OVER (ORDER BY year, month) as sales_growth,
FORMAT((total_sales - LAG(total_sales) OVER (ORDER BY year, month)) /
LAG(total_sales) OVER (ORDER BY year, month), 'P') as growth_rate
FROM monthly_sales;
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)