SQL刷题笔记(一)-----零碎知识点

67 阅读3分钟

一、运算符

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