select语句中的列(非聚合函数列),必须出现在group by子句中。
group by子句中的列,不一定要出现在select语句中。
聚合函数只能出现select语句中或者having语句中,一定不能出现在where语句中。
where语句中的条件只能是数据库中已经存在的字段。
SQL语句的执行顺序:
示例SQL:
SELECT * FROM user LEFT JOIN order ON user.id = order.uid
WHERE order.price > 5000
GROUP BY user.name
HAVING count(1) > 8
ORDER BY user.name
LIMIT 0,10
执行顺序:
- FROM(将最近的两张表,进行笛卡尔积)---VT1(VT--->virtual table 虚表)
- ON(将VT1按照它的条件进行过滤)---VT2
- LEFT JOIN(保留左表的记录)---VT3
- WHERE(过滤VT3中的记录)--VT4…VTn (根据where的条件个数来看 一个条件产生一个虚表)
- GROUP BY(对VT4的记录进行分组)---VT5
- HAVING(对VT5中的记录进行过滤)---VT6
- SELECT(对VT6中的记录,选取指定的列)--VT7
- ORDER BY(对VT7的记录进行排序)--游标
- LIMIT(对排序之后的值进行分页)
WHERE条件执行顺序(影响性能)
不同数据库where条件的执行顺序不同:
1.MySQL:从左到右的执行WHERE条件
2.Oracle:从右到左的执行 WHERE条件
3.postgreSQL:从左到右的执行WHERE条件
因此:
写WHERE条件的时候,优先级高的部分要去编写过滤力度最大的条件语句。