mysql-sql逻辑查询顺序

1、sql逻辑执行顺序(物理执行顺序可能会因索引而不同)

     SELECT  7  DISTINCT 8

     FROM  1

    JOIN     2

      ON      3

    WHERE  4

   GROUP BY 5

   HAVING  6

   ORDER BY  9

   LIMIT  10

   表t1 join t2 产生虚拟表VT1

   VT1通过on过滤笛卡尔积产生VT2

   VT2通过where过滤产生VT3

   VT3通过group by 分组产生VT4

   VT4通过having过滤产生VT5

   VT5通过select选择指定列产生VT6

   VT6通过distinct过滤重复列产生VT7

   VT7通过order by 排序产生VT8

   VT8通过limit n,m 产生VT9

2、由于逻辑处理顺序如上述1,则写sql时需要注意以前事项:

(1)、对null值的情况

     on  null = null :视为false

    group by null :视为相同值

    order by null  :视为相同值,默认为最小值。

(2) on、where、having区别

   on:

   当存在外连接时,on不能过滤掉保留表中的数据(指定条件过滤保留表中数据后,外连接会将保留表中数据重新添加)

   当不存在外连接时,on能过滤掉指定条件数据

   where:

    无论是否存在外连接,where都能过滤掉指定条件数据

    不能使用聚合函数,因为执行顺序在group by前

    不能使用列的别名,因为执行顺序在select前

   having: 

   不能使用count(1)或者count(*)进行统计,这样可能会将非保留表中的空值字段统计在内导致与预期统计结果不一致

(3)使用了group by,再使用distinct则没意义

(4)  limit n,m n:起始行,m:每页行数  

    

原文地址:https://www.cnblogs.com/yuefeng123/p/11941004.html