数据处理函数
函数 | 功能 | Oracle | Mysql | Microsoft SQL Server | PostgreSQL | SQLite |
---|---|---|---|---|---|---|
ABS(x) | 计算x的绝对值 | √ | √ | √ | √ | √ |
CEIL(x) CEILING(x) | 大于等于x的最小整数 | CEIL(x) | √ | CEILING(x) | √ | CEIL(x) |
FLOOR(x) | 小于等于x的最大整数 | √ | √ | √ | √ | √ |
MOD(x) | x除以y的余数(x%y) | √ | √ | x % y | √ | x % y |
ROUND(x,n) | x四舍五入到n位小数 | √ | √ | √ | √ | √ |
RANDOM(x) | 返回伪随机数(0~1区间) | DBMS_RANDOM | RAND() | RAND() | √ | √ |
随机计算:
- ORACLE的随机计算语法:
SELECT DBMS_RANDOM.VALUE
FROM table_name
WHERE c1="xxxx"
- 对Mysql/SQL Server数据库,多次执行Random()获取到的随机数一般是不重复的; 可以通过入参指定种子,来使多次执行获取同一随机数
SELECT RAND(1)
FROM table_name
WHERE c1="xxxx"
- 对PostgreSQL数据库, 可以通过SETSEED()函数指定种子,来使多次执行获取同一随机数
SELECT SETSEED(0); --设置种子
SELECT RANDOM();
统计聚合
1. COUNT()、SUM()、AVG()等聚合函数,不会统计NULL的值
如果指定COUNT()内统计某个字段,则不会统计此字段为NULL的数据
对AVG()来说,NULL的忽略会作用在分母上,使得总数量也变少
如果要把NULL当零来处理,需要用CASE进行转换
SELECT AVG(CASE WHEN score IS NULL THEN 0 ELSE score END)
FROM student
2. 将统计出的结果,拼接成一条数据返回
- Oracle:
LISTADD
SELECT LISTADD(name, ",")
FROM student
WHERE score > 80
- Mysql:
GROUP_CONCAT
SELECT GROUP_CONCAT(name ORDER BY name SEPARATOR ";")
FROM student
WHERE score > 80
- Microsoft SQL Server:
STRING_ADD
SELECT STRING_ADD(name, ',') WITHIN GROUP (ORDER BY name)
FROM student
WHERE score > 80
- PostgreSQL:
STRING_ADD
SELECT STRING_ADD(name, ',' ORDER BY name)
FROM student
WHERE score > 80
字符处理函数
函数 | 功能 | Oracle | Mysql | Microsoft SQL Server | PostgreSQL | SQLite |
---|---|---|---|---|---|---|
CHAR_LENGTH(s) | 字符串s包含的字符数量 | LENGTH(s) | √ | LEN(s) | √ | LENGTH(s) |
OCTET_LENGTH(s) | 字符串s包含的字节数量 | LENGTHB(s) | √ | DATALENGTH(s) | √ | × |
CONCAT(s1,s2,…) | 连接子字符串,拼成更长的字符串 | √ | √ | √ | √ | 连接运算符(双竖线) |
CONCAT_WS(spe, s1,s2,…) | 用spe连接各子字符串 | × | √ | √ | √ | × |
INSTR(s, s1) | s中首次出现s1的位置 | √ | √ | PATINDEX(s1, s) | POSITION(s1 in s) | √ |
LOWER(s) | s转小写字母 | √ | √ | √ | √ | √ |
UPPER(s) | s转大写字母 | √ | √ | √ | √ | √ |
REPLACE(s, old, new) | 替换s中的字符串到新的字符串 | √ | √ | √ | √ | √ |
SUBSTRING(s, n, m) | 截取s中n开始的m个字符 | SUBSTR(s, n, m) | √ | √ | √ | √ |
LEFT(s, n) RIGHT(s, n) | 返回开头或结尾n个字符 | × | √ | √ | √ | × |
TRIM(s1 FROM s) | 删除字符串开头和结尾的子串 | √ | √ | √ | √ | TRIM(s, s1) |
细节:
- Mysql的LENGTH(s), 返回的是字节数量; PostgreSQL的LENGTH(s), 返回的是字符数量
- Oracle 的CONCAT(),一次只能连接两个字符串;如果需要连接多个,可以嵌套:
SELECT CONCAT(CONCAT('S', 'Q'), 'L')
- MYSQL、PostgreSQL、SQLite的SUBSTR(s, n, m)的起始位置n,可以为负数,表示从字符串结尾向前数n个位置,此处为起始index,再向后数m个字符串截取
- TRIM(s, s1)如省略s1,则表示去除开头结尾的空格;
- 此外还有两个函数:LTRIM(s)和RTRIM(s),可以分别去除开头及结尾的空格
NULL对字符函数的影响
- Oracle/Microsoft SQL Server 及 PostgreSQL中CONCAT()函数将NULL空值当做空字符串’'处理,因此合并时会忽略
- Mysql中不会当做空字符串,而是NULL与任何值合并后还是NULL,因此最后结果为NULL
日期处理函数(变量)
函数 | 功能 | Oracle | Mysql | Microsoft SQL Server | PostgreSQL | SQLite |
---|---|---|---|---|---|---|
CURRENT_DATE | 当前日期 | √ | √ | GETDATE() | √ | √ |
CURRENT_TIME | 当前时间 | × | √ | GETDATE() | √ | √ |
CURRENT_TIMESTAMP | 当前日期及时间 | √ | √ | √ | √ | √ |
EXTRACT(p FROM dt) | 提取日期中的部分信息 | √ | √ | DATEPART(p, dt) | √ | STRRFTIME |
dt1-dt2 | 计算两个日期之间的天数 | √ | DATEDIFF(dt2, dt1) | DATEDIFF(p, dt1, dt2) | √ | STRRFTIME |
dt1-INTERVAL | 日期加上一个时间间隔 | √ | √ | DATEADD(p, n, dt) | √ | STRRFTIME |
以上部分为变量,使用方式如下:
SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP;
提取日期:
EXTRACT()用法
SELECT EXTRACT(YEAR FROM CURRENT_DATE);
FROM前的关键字有:
YEAR
、MONTH
、DAY
、HOUR
、MINUTE
、SECOND
等
SQLite 的使用方式:
SELECT STRFTIME('%Y', h_date);
FROM前的关键字有:
%Y
、%m
、%d
、%H
、%M
、%S
等
日期加减计算:
-- Oracle和PostgreSQL使用方式
SELECT DATE '2023-10-08' - DATE '2023-10-01', -- 两个时间的差值
DATE '2023-10-01' + INTERVAL '3' DAY -- 日期加3天
-- Mysql使用方式
SELECT DATEDIFF('2023-10-08', DATE '2023-10-01') , -- 两个时间的差值
DATE '2023-10-01' + INTERVAL '3' MONTH; -- 日期加3个月
-- SQL Server使用方式
SELECT DATEDIFF(DAY, '2023-10-08','2023-10-01') , -- 两个时间的差值
DATE DATEADD(MONTH, 1, '2023-10-01'); -- 日期加1个月
类型转换函数
CAST(expr AS type) 用于将数据转换为其他类型
SELECT CAST('123' AS INTEGER); -- 转换为数字123
类型转换可能会导致精度丢失
-- 隐式类型转换
SELECT '234' + 123; -- 最后可能得到357
条件表达式
CASE
功能:
根据某个表达的执行结果,匹配对应的值
语法:
CASE expressionWHEN value1 THEN c1WHEN value2 THEN c2...ELSE default_value
END
具体例子:
SELECT c1,CASE c2WHEN 'a' THEN 1WHEN 'b' THEN 2ELSE 0END
FROM table_name;
还可用在WHERE、ORDER BY等子句中:
SELECT c1,CASE c2WHEN 'a' THEN 1WHEN 'b' THEN 2ELSE 0END
FROM table_name
WHERE c1="xxx"
ORDER BY CASEWHEN c2 IS NULL THEN 0ESLE c2END;
IF函数
MYSQL提供了一个IF(expr1, val1, val2)函数,类似于java的 expr1?val1:val2
三目表达式
IF(3<2, '3<2', '3>=2')
SQL Server、SQLite没有提供IF函数,提供的是的IIF函数,用法与Mysql的IF函数一样
空值处理
COALESCE函数
COALESCE(exp1, exp2, exp3, …)接收一个输入列表,返回第一个非NULL的参数;若都为空,则返回NULL
SELECT COALESCE(yuwen_score, shuxue_score, yingyu_score)
FROM student
可以用COALESCE将NULL转换为别的默认值,类似于CASE WHEN
SELECT COALESCE(yuwen_score, 0) -- 若语文成绩为NULL, 则记为0分
FROM student