SQL备忘--函数

数据处理函数

函数 功能 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前的关键字有:YEARMONTHDAYHOURMINUTESECOND

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 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;
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

你可能感兴趣的:(sql,sql,数据库)