函数
单行函数
数值函数
| 函数 | 功能 |
|---|---|
| ABS(x) | 求绝对值 |
| MOD(x) | 求余数 |
| CEIL(x), CEILING(x) | 向上取整 |
| FLOOR(x) | 向下取整 |
| RAND | 生成一个0~1之间的随机数 |
| ROUND(x) | 四舍五入x |
指数与对数
| 函数 | 功能 |
|---|---|
| POW(x,y) | x的y次方 |
| XP(x) | e的x次方 |
| LN(x) | ln(x) |
| LOG2(x) | log2(x) |
进制转换
| 函数 | 功能 |
|---|---|
| BIN(x) | 二进制 |
| OCT(x) | 八进制 |
| HEX(x) | 十六进制 |
| CONV(x,f1,f2) | x由f1进制的数变为f2进制 |
字符串
| 函数 | 功能 |
|---|---|
| ASCII(s) | 第一个字符的ASCII码 |
| CHAR_LENGTH(s) | s的字符数 |
| LENGTH(s) | s的字节数,与字符集有关 |
| CONCAT(s1, …sn) | 拼接 |
| CONCAT_WS(x, s1, …sn) | 拼接,每个字符串间+x |
| REPLACE(str,a,b) | 用b替换str中所有a |
| UPPER(s) | 转换为大写 |
| LOWER(s) | 转换为小写 |
| STRCMP(s1,s2) | 比较s1,s2的ASCII码 |
日期与时间
流程控制
| 函数 | 功能 |
|---|---|
| IF(v,v1,v2) | (三元运算符)v为真,返回v1,否则返回v2 |
| IFNULL(v1,v2) | v1不为NULL,返回v1,否则返回v2 |
| CASE WHEN c1 THEN v1 WHEN c2 THEN v2…ELSE vn END | 相当于if(c1) v1 else if(c2) v2… |
| CASE expr WHEN c1 THEN v1 WHEN c2 THEN v2…ELSE vn END | 相当于switch |
加密解密
| 函数 | 功能 |
|---|---|
| MD5(s) | md5加密 |
| SHA(s) | sha加密,比md5更安全 |
信息
| 函数 | 功能 |
|---|---|
| VERSION() | 当前mysql版本号 |
| CONNECTION_ID() | 当前mysql服务器连接数 |
| DATABASE() | 当前数据库 |
| USER() | 当前连接的用户名 |
| CHARSET(s) | s的字符集 |
| COLLATION(s) | s的比较规则 |
聚合函数
AVG / SUM
AVG(table): 平均数
SUM(table): 求和
只对数值有效
NULL不参与运算,需要将NULL考虑为0的情况,用
SUM(x) / COUNT(IFNULL(x,0))
MAX / MIN
MAX(table), MIN(table)
求最值
对于字符串,字典序排序
对于日期,时间先后排序
COUNT
COUNT(table)
指定字段出现的次数
计算表中有多少条纪录:
COUNT(*)
GROUP BY
分组
1 | #eg.查询不同的department_id的平均工资 |
使用多个列分组
1 | #eg.查询不同的department_id, job_id的平均工资 |
注意:SELECET中非组函数的字段必须声明在GROUP BY中
GROUP BY声明在FROM, WHERE后面,ORDER BY前面
1 | SELECT department_id,job_id AVG(salary) |
GROUP BY ... WITH ROLLUP:最后一行加上对所有数据的操作
HAVING
1 | #eg |
要求:
如果过滤条件中使用了聚合函数,就必须使用
HAVING替换WHERE
HAVING放在GROUP BY后面一般和
GROUP BY一起使用
HAVING和WHRER对比
HAVING适用范围更广WHRER效率更高,HAVING先连接后筛选,WHRER先筛选再连接
SQL语句执行顺序
1 | SELECT DISTINCT xxx #5 |