函数和SQL语句执行顺序

函数

单行函数

数值函数

函数 功能
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
2
3
4
#eg.查询不同的department_id的平均工资
SELECT department_id AVG(salary)
FROM employees
GROUP BY department_id;

使用多个列分组

1
2
3
4
#eg.查询不同的department_id, job_id的平均工资
SELECT department_id,job_id AVG(salary)
FROM employees
GROUP BY department_id,job_id;

注意:SELECET中非组函数的字段必须声明在GROUP BY中

GROUP BY声明在FROM, WHERE后面,ORDER BY前面

1
2
3
SELECT department_id,job_id AVG(salary)
FROM employees
GROUP BY department_id; #错误!

GROUP BY ... WITH ROLLUP:最后一行加上对所有数据的操作

HAVING

1
2
3
4
5
#eg
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;

要求:

如果过滤条件中使用了聚合函数,就必须使用HAVING替换WHERE

HAVING放在GROUP BY后面

一般和GROUP BY一起使用

HAVINGWHRER对比

  • HAVING适用范围更广
  • WHRER效率更高,HAVING先连接后筛选,WHRER先筛选再连接

SQL语句执行顺序

1
2
3
4
5
6
7
8
9
SELECT DISTINCT xxx      #5
#----------------
FROM xxx JOIN xxx ON ccc #1
WHERE ccc #2
GROUP BY xxx #3
HAVING xxx #4
#----------------
ORDER BY xxx DESC #6
LIMIT xxx #7