文章目录
4.区分SQL语句的书写和执行顺序
注意:SQL 语句的书写顺序与执行顺序不是一致的
4.1书写顺序
sql
SELECT <字段名>
FROM <表名>
JOIN <表名>
ON <连接条件>
WHERE <筛选条件>
GROUP BY <字段名>
HAVING <筛选条件> #根据group by选择的字段,进行条件筛选
UNION
ORDER BY <字段名>
LIMIT <限制行数>;
4.2执行顺序
- FORM:选择from后面跟的表,产生虚拟表1。
- ON:ON是JOIN的连接条件,符合连接条件的行会被记录在虚拟表2中。
- JOIN:如果指定了LEFT JOIN,那么保留表中未匹配的行就会作为外部行添加到虚拟表2中,产生虚拟表3。如果有多个JOIN链接,会重复执行步骤1~3,直到处理完所有表。
- WHERE:对虚拟表3进行WHERE条件过滤,符合条件的记录会被插入到虚拟表4中。
- GROUP BY:根据GROUP BY子句中的列,对虚拟表2中的记录进行分组操作,产生虚拟表5。
- HAVING:对虚拟表5进行HAVING过滤,符合条件的记录会被插入到虚拟表6中。
- SELECT:SELECT到一步才执行,选择指定的列,插入到虚拟表7中。
- UNION:UNION连接的两个SELECT查询语句,会重复执行步骤1~7,产生两个虚拟表7,UNION会将这些记录合并到虚拟表8中。
- ORDER BY: 将虚拟表8中的记录进行排序,虚拟表9。
- LIMIT:取出指定行的记录,返回结果集。
4.3总结
书写顺序:SELECT -> FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> UNION -> ORDER BY ->LIMIT
执行顺序:FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> UNION -> ORDER BY ->LIMIT
4.4扩充:辨别having与where的异同?
- 相同:两者都是用作筛选条件
- 不同:
- 书写和执行顺序不同:
- having:书写在、执行在分组操作之后,对分组后的数据进行过滤.(临时数据表进行过滤)
- where:分组操作执行前, 对分组前的数据 只能使用表原始列进行条件过滤(真实数据表进行过滤)
- 使用聚合函数不同:
- having:后面可以使用聚合函数
- where:后面不可以使用聚合函数
- 书写和执行顺序不同:
分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件
- 举例:
sql
#统计各个分类商品的个数
select category_id,count(pid) from product group by category_id;
#统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id,count(pid) from product GROUP BY category_id HAVING count(*)>1;
#统计价格>200元的 各个分类商品的个数,且只显示个数大于1的信息
select category_id,count(pid) from product where price>200 group by category_id HAVING count(pid)>1;
4.5聚合查询
-
常用的五个聚合函数
-
count(列名):统计指定列不为NULL的记录行数;
-
sum(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
-
max(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
-
min(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
-
avg(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
-