中7个查询命令的优先级:
FROM --> WHERE --> GROUP BY --> HAVING -->SELECT --> ORDER BY --> LIMIT
=======================================================================
在MySQL中执行查询命令时会自动创建临时表
什么是临时表,及特点:
- 由[查询命令]在中生成虚拟表,被称为临时表
- 当前查询命令执行完毕后,MySQL服务器自动的将上一个查询命令生成的临时表自动销毁处理
- 每一个查询命令操作的是上一个查询命令生成的临时表,除了[FROM] 命令 (因为它永远第一个执行)
- 临时报名称就是上表文件名
- 在一个查询语句结束后,用户看到的临时表只能是查询语句中最后一个查询命令生成的临时表
=======================================================================
FROM查询命令:
- FROM命令作用,将硬盘上的表文件加载到内存中生成一个临时表
- MySQL服务器存在7个查询命令,在一个查询语句执行时,永远第一个执行的查询命令是FROM {FROM SELECT }
=======================================================================
WHERE命令:
-----循环遍历临时表中每一个数据行,遍历时每次只会取得一个数据行来判断当前数据行是否满足定位条件.在循环遍历结束后,WHERE命令将所有满足条件的数据行读取出来生成一个全新的临时表
-----WHERE命令在FROM命令只会执行,因此操作的是FROM生成的临时表1
循环遍历临时表的所有数据行,每次读取一个数据行判断是否满足定位条件
在循环结束后,WHERE命令将所有满足定位条件的数据行读取出来保存到一个全新的临时表
=======================================================================
GROUP BY 查询命令:
- GROUP BY查询命令被称为[分组查询命令]
- 执行优先级:FROM --->WHERE ----> GROUP BY------>SELECT
- 书写格式:
SELECT 字段名 , 聚合函数
FROM 表名
WHERE 数据行定位条件
GROUP BY 分组字段
作用:
首先根据[分组字段]内容对临时表数据进行分类.
然后将具有相同特征的数据行保存到一个临时表中.
七个查询命令中,只有GROUP BY在执行完毕后才有可能生成多个临时表.
=======================================================================
HAVING 查询命令
- 执行的优先级: FROM --> WHERE --> GROUP BY --> HAVING --> SELECT
- 书写规则:
HAVING 就是GROUP BY 跟班小弟
①只有GROUP BY出现的时候,HAVING 才有机会出现,他不会独立出现在查询语句
②出现的时候,必须出现在GROUP BY 后面
作用:
对GROUP BY生成的临时表进行[统计分析],将不满足条件的临时表从内存中进行销毁。HAVING任务是销毁掉内存中临时表.
HAVING通常与聚合函数共同使用;
=======================================================================
WHERE 与 HAVING的区别:
WHERE 命令执行完毕后,将满足条件数据行读取出来生成一个全新的临时表
HAVING命令执行时,负责将GROUP BY生成的临时表中不满足条件的临时表进行销毁
-----------------------------------------------------------------------------------------------------------------
WHERE每次操作一个数据行,因此WHERE后边的判断条件不能使用聚合函数
HAVING每次操作的是一个临时表,因此HAVING后面应该使用聚合函数作为判断条件
-----------------------------------------------------------------------------------------------------------------
WHERE命令必须声明在GROUP BY 前方
HAVING命令必须生命在GROUP BY后方
=======================================================================
SELECT行为特征:
- 如果SELECT操作的临时表由(FROM或者WHERE)提供,此时SELECT像切蛋糕一样将制定字段所有的内容读取出来,组成一个全新的临时表
- 如果SELECT操作的临时表由(GROUP BY 或者 HAVING)提供,此时SELECT可能面对多个临时表,SELECT将会一次操作每一个临时表.在操作某一个临时表时,只会读取指定字段的[第一行数据],然后将从多个临时表读取内容组成一个全新的临时表.
SELECT 操作的是GROUP BY 提供的临时表,此时读取的字段内容应该能表示当前临时表所有数据共同特征,因此此时SELECT读取字段一般都是GROUP BY所采用分组字段
=======================================================================
ORDER BY 查询命令
- 执行优先级: FROM --> WHERE --> GROUP BY -->HAVING --> SELECT -->ORDER BY
- 作用:
对[SELECT生成临时表]中数据进行排序,将排序后的数据行组成一个全新的临时表展示出来;
=======================================================================
LIMIT 查询命令
执行优先级:
FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY --> LIMIT
书写规则 :
SELECT 字段名,聚合函数
FROM 表名
WHERE 对数据进行定位判断条件
GROUP BY 分组字段1 ,分组字段2….
HAVING 使用聚合函数统计当前临时表是否可以被删除
ORDER BY 根据SELECT提供的临时表字段进行排序
LIMIT 起始数据行位置,截取行数
作用:
对临时表数据进行截取 ,将截取到的数据保存到全新的临时表中
=======================================================================
多字段分组规则:
- 分组字段执行顺序对于最终结果没有任何影响,GROUP BY SEX,HOME与GROUP BY HOME,SEX得到的结果完全一样
- GROUP BY一次只能根据一个分组字段进行临时表拆分
- 从第二个分组字段开始,每一个分组字段操作的临时表时上一个分组字段生成的临时表
=======================================================================
七个查询命令的总结:
书写格式
SELECT 字段名,聚合函数
FROM 表名
WHERE 对数据进行定位判断条件
GROUP BY 分组字段1 ,分组字段2….
HAVING 使用聚合函数统计当前临时表是否可以被删除
ORDER BY 根据SELECT提供的临时表字段进行排序
LIMIT 起始数据行位置,截取行数
执行优先级:
FROM ---> WHERE ---> GROUP BY ---> HAVING ---> SELECT ---> ORDER BY ---> LIMIT
- 查询语句找那个最先执行的永远都是FROM
- 七个查询命令中,只有FROM读取硬盘上临时表,剩余的查询命令操作的只能是上一个查询命令生成的临时表.
- 七个查询命令中,只有GROUP BY 执行完毕后,有可能生成多个临时表
- 七个查询命令中,只有HAVING执行完毕后不会生成新的临时表
- 查询命令执行过程中,当前查询命令执行完毕后,MySQL服务器将上一个查询命令生成的临时表进行销毁,所以用户最终看到的临时表只能是最后一个查询命令生成的临时表
- SELECT执行行为与操作的临时表的提供方不同