函数 | 功能 | 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() | √ | √ |
SELECT DBMS_RANDOM.VALUE
FROM table_name
WHERE c1="xxxx"
SELECT RAND(1)
FROM table_name
WHERE c1="xxxx"
SELECT SETSEED(0); --设置种子
SELECT RANDOM();
如果指定COUNT()内统计某个字段,则不会统计此字段为NULL的数据
对AVG()来说,NULL的忽略会作用在分母上,使得总数量也变少
如果要把NULL当零来处理,需要用CASE进行转换
SELECT AVG(CASE WHEN score IS NULL THEN 0 ELSE score END)
FROM student
LISTADD
SELECT LISTADD(name, ",")
FROM student
WHERE score > 80
GROUP_CONCAT
SELECT GROUP_CONCAT(name ORDER BY name SEPARATOR ";")
FROM student
WHERE score > 80
STRING_ADD
SELECT STRING_ADD(name, ',') WITHIN GROUP (ORDER BY name)
FROM student
WHERE score > 80
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) |
SELECT CONCAT(CONCAT('S', 'Q'), 'L')
函数 | 功能 | 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 expression
WHEN value1 THEN c1
WHEN value2 THEN c2
...
ELSE default_value
END
具体例子:
SELECT c1,
CASE c2
WHEN 'a' THEN 1
WHEN 'b' THEN 2
ELSE 0
END
FROM table_name;
还可用在WHERE、ORDER BY等子句中:
SELECT c1,
CASE c2
WHEN 'a' THEN 1
WHEN 'b' THEN 2
ELSE 0
END
FROM table_name
WHERE c1="xxx"
ORDER BY CASE
WHEN c2 IS NULL THEN 0
ESLE c2
END;
MYSQL提供了一个IF(expr1, val1, val2)函数,类似于java的 expr1?val1:val2
三目表达式
IF(3<2, '3<2', '3>=2')
SQL Server、SQLite没有提供IF函数,提供的是的IIF函数,用法与Mysql的IF函数一样
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