• SQL语句的执行顺序
  1. MySQL的语句共分为11步,如下所示,()中数字代表执行的顺序
    (8)select (9)distinct<去重的字段>
    (1)from<左表>
    (3)<join的类型>join <右表>
    (2)on<分组前的筛选条件>
    (4)where<分组前的筛选条件>
    (5)group by<分组的字段>
    (6)with{CUBE|ROLLUP}
    (7)having<分组后的筛选条件>
    (10)order by<排序的字段>
    (11)limit<限定取出的记录>
  2. where后面的一些关键字顺序
    书写顺序:select … from … where … group by … having … Limit
    注:其中select 和 from是必须的,其他可选。
    执行顺序:from … where … group by … having … select … limit
    a. select子句:少用*号,尽量取字段名称,因为使用时会依次转换成所有的列名,消耗时间。
    b. from子句:执行顺序为从后往前,从右到左,数据量少的尽量放在后面。
    c. where子句:执行顺序为自下而上,从右到左,将能过滤掉最大数量的记录条件写在where子句的最右边。
    d. group by子句:执行顺序为从左往右分组,最好在group by前使用where将不需要的记录过滤掉。
    e. having子句:消耗资源,尽量避免使用,having会在检索出所有的记录之后才对结果进行过滤,需要排序等操作
    f. order by子句:执行顺序从左往右排序,消耗资源。默认是 asc 升序排序
  • 注:
  1. with不常用,其实就是把一堆重复用到的sql语句放到with as里面,取一个别名,后面的查询可以使用
  2. order by 多个字段时,用逗号分隔每一个字段,如果字段不指明排序方式,默认是增序。排序的方法是首先按照第一个字段排序,如果第一个字段相同的,再按照第二个字段来再次排序。
  3. 用法如下:
--给查询的表取别名为a 
with a as(select * from test) 
--使用别名a进行查询 
select *from a
  • having和where的区别:
  1. SQL标准要求HAVING必须引用GROUP BY子句中的列或用于聚合函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING涉及SELECT清单中的列和外部子查询中的列。
  2. SQL要求最好使用where,having会先把检索出来的数据加载进来才进行排序、总计等操作,消耗资源,如果能使用where或者group by限制记录的数目,那就能减少这方面的开销。
  3. 区别:主要是作用的对象不同。
    ①WHERE 子句作用于表和视图 ,HAVING 子句作用于组。
    ②WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)
  • drop、truncate、delete作用于区别
  1. drop:清空数据又删除表,直接删除数据页,不支持事务回滚,运行速度最快
  2. truncate:清空数据保留表,直接删除数据页,不支持事务回滚,运行速度快
  3. delete:清空数据保留表,逐行删除数据行并记录日志,支持事务回滚,运行速度慢
    注意:truncate删除时不会触发任何delete触发器,也不能删除带外键的表