一、运算符
1、非符号类型运算符
null
- null参与运算时,会因为无法计算,返回null,不会报错;
least和greatest
- least(参数1,参数2,...):返回多个参数中的最小值。select * from table where least(A,B,C,...)
- greast(参数1,参数2,...):返回多个参数中的最大值。select * from table where greast(A,B,C,...)
regexp和rlike
- regexp:判断一个值是否符合正则表达式的规则
用法:select * from table where a regexp b
想要完全匹配时:regexp '^[0-9][0-9]$'数字开头数字结尾 '^[0-9]*$'纯数字
a或b开头:regexp '^(a|b)' - rlike:判断一个值是否符合正则表达式的规则
用法:select * from table where a rlike b
exists
- where exists()筛选存在性条件
escape
- escape:回避特殊符号,用途同转义符\。相当于自定义一个转义符
用法:select '_%1' like '\_%%' 等于1
select '_%1' like '^_%%' escape '^';等于1
2、逻辑运算符
xor逻辑异或,A XOR B
- 当给定的值中有任意一个为null时,结果为null
- 当给定的值,都为0或者都为1时,返回0
- 当给定的值,一个值为0,另一个值不为0时,返回1
- 总结:给定的两个值的逻辑值不等时,结果才为1
and和or一起使用
- and优先级大于or,类似于乘和加的优先级
3、位运算符
- 位运算符会将操作数先转换成二进制,然后进行位运算,最后将结果转换成十进制
位运算符种类
- &:按位与
- | :按位或
- ^ :按位异或
- ~ :按位非
-
:按位右移
- <<:按位左移
二、函数
1、数值函数
基本函数
- celi(x),celing(x):返回大于或等于某个值的最小整数
select ceil(-3.9); - -3 - floor(x):返回小于或等于某个值的最大整数
- round(x):对x的绝对值进行四舍五入,结果正负性和x一致
- truncate(x,y):返回数字x截断为y位小数的结果
truncate(-3.1) = -3
机制转换
- bin(x):返回x的二进制编码
- hex(x):返回x的十六进制编码
- oct(x):返回x的八进制编码
- conv(x,f1,f2):返回f1进制数变成f2进制数
2、字符串函数
基本函数
- char_length():返回字符数;length():返回字节数,和字符集有关
char_length('中') = 1
lenght('中') = 3 - concat_ws(x, s1, s2, ...):字符串拼接,但是字符串之间插入一个x
concat_ws(',', 'a', 'b', 'c') = 'a,b,c'
四、窗口函数
1、窗口函数和聚合函数组合使用
- 只能先group by聚合之后再对聚合后的数据使用窗口函数
max(sum(当天新增用户数)) over (order by month1) ...group by month1 :截止当月,最大月新增用户数
2、窗口函数范围控制
- 行数表达式
unbounded preceding 前面所有行
unbounded following 后面所有行
current row 当前行
n preceding 前面n行
n following 后面n行 - 使用方法
rows between 行数表达式1 and 行数表达式2 :窗口范围为表达式1到表达式2
range between 行数表达式1 and 行数表达式2 :窗口范围为表达式1到表达式2
rows n preceding:窗口范围为前面n行到当前行(一共n + 1行)
rows n following:窗口范围为当前行到后面n行(一共n + 1行)
3、注意事项
- 开窗函数和where一起使用时,是先过滤再开窗
五、性能优化
1、SQL优化
不同语句用法的性能问题
-
count(*), count(1), cuont(列名)
对于myisam引擎的表没有区别,这种引擎内部有一个计数器在维护着行数
innodb引擎的表用count(*),count(1)直接读行数,复杂度为O(n),但好于具体的count(列名)注意: count(列名)不会统计列值为null的行,count(*)会统计
六、杂项
- sql语句执行顺序
from -> where -> group by -> having -> select的字段 -> distinct -> order by -> limit