SELECT * FROM user LEFT JOIN order ON user.id = order.uid
WHERE order.price > 1000
GROUP BY user.name
HAVING count(1) > 5
ORDER BY user.name
LIMIT 0,10;
执行顺序:
1. FROM : 如果FROM 后面是1张表,那么直接返回该表的全体。如果是2张表及其以上,返回的则是这几张表的。 最终形成的结果暂存到一张虚拟表 virtualTable1中。
2. ON: 按照ON所对应的条件,对virtualTable1表中的内容进行过滤。生成另外一张虚拟表 virtualTable2中。
3. LEFT JOIN: 在virtualTable2中,已左表为模板,保留左表的记录。 生成另外一张虚拟表 virtualTable3。
4. WHERE: 在virtualTable3的基础上,执行where条件的过滤条件{condition_1, condition_2, ... , condition_n}。每个condition_i的过滤,都会在前一张表的基础上生成一张新的虚拟表virtualTable_i。 最终过滤完成后的虚拟表我们表示为virtualTable4。
5. GROUP BY:对virtualTable4按照对应的条件进行分组操作,结果存放在virtualTable5中。
6. HAVING: 对virtualTable5中的记录进行过滤,结果存放在virtualTable6中。
// 以上6步对行记录的筛选进行完毕。以下对列记录进行筛选。
7. SELECT: 对virtualTable6记录进行选取,形成virtualTable7。
8. 如果SELECT语句中有DISTINCT等条件,还会根据该条件过滤掉virtualTable7中重复的行后生成virtualTable8。
9. ORDER BY: 对virtualTable8的记录进行排序(注意这一步并不会额外创建一张虚拟表),它排序的结果会生成一个cursor(游标)。
10. LIMIT: cursor会按照limit的取值范围选取virtualTable8中对应的行生成virtualTable9返回。