FangLin Game Dev Engineer

SQL基础

2023-09-21
FangLin
SQL

distinct

  • 对结果去重
  • select 
      distinct column1[, column2...] 
    from 
      tables 
    [where conditions];
    
  • 往往用distinct来返回不重复字段的条数(count(distinct column)),因为distinct只能返回它的目标字段,而无法返回其他字段
  • distinct要放在所有字段的前面;如果去重的字段大于一个,则会进行组合去重,只有多个字段组合起来相同时才会被去重

order by

  • 对结果排序
  • order by column1[, column2...] ASC|DESC

group by

  • 分组统计:结合聚合函数,根据一个或多个列对结果集进行分组
  • 执行流程:select city ,count(*) as num from staff group by city;
    • 创建内存临时表,表里有两个字段city和num
    • 全表扫描staff的记录,依次取出city=’X’的记录
    • 判断临时表中是否有city=’X’的行,没有就插入一个记录(X,1);如果临时表中有city=’X’的行,就将x这一行的num值加1
    • 遍历完成后,再根据字段city做排序,得到结果集返回给客户端
  • group by使用不当,很容易就会产生慢SQL 问题。因为它既用到临时表,又默认用到排序。有时候还可能用到磁盘临时表。如果执行过程中,会发现内存临时表大小到达了上限(控制这个上限的参数就是tmp_table_size),会把内存临时表转成磁盘临时表。
    • group by后面的字段加索引,保证group by后面的字段数值一开始就是有序是优化group by最简单有效的优化方式:alter table staff add index idx_age_city(age,city);
    • order by null不用排序
    • 尽量只使用内存临时表:适当调大tmp_table_size参数,来避免用到磁盘临时表
    • 使用SQL_BIG_RESULT:使用SQL_BIG_RESULT这个提示直接用磁盘临时表。MySQl优化器发现,磁盘临时表是B+树存储,存储效率不如数组来得高。因此会直接用数组来存

having

  • SQL中增加HAVING子句原因是,WHERE关键字无法与聚合函数一起使用
  • HAVING 子句可以让我们筛选分组后的各组数据
  • where & having 区别总结:
    • having子句用于分组后筛选,where子句用于行条件筛选
    • having一般都是配合group by和聚合函数一起出现如(count(),sum(),avg(),max(),min())
    • where条件子句中不能使用聚集函数,而having子句就可以。
    • having只能用在group by之后,where执行在group by之前

where 1=1 / where 1<>1

  • 表示条件永远成立/永远不成立
  • 可用于动态查询,后面拼凑and condition
  • 用于SQL注入,在查询语句中注入or 1=1

explain

  • explain expression
  • 对输入的语句进行分析

聚合(Aggregate)函数

count

  • 计数

sum

  • 对字段求和

上一篇 垃圾回收机制

Comments

Content