目录
前言
这里介绍MySQL中不得不记却经常被我们遗忘的重要知识点。
WHERE
- where条件中不能使用聚合函数,如:sum、max等,而针对分组而言,采用
having
设置分组条件,在having
中可使用聚合函数。 - 必须在GROUP BY 子句之前指定 WHERE 子句。(如果存在的话)
DISTINCT
在MySQL中提供关键字distinct
来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重复记录的所有值。其原因是除distinct
目标字段外还查询其他字段,则distinct
无法根据目标字段进行记录去重的操作。
GROUP BY
group by
语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。- group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素:
- 在
select
子句中查询的列名必须为分组列或列函数。列函数对于group by
子句定义的每个组各返回一个结果。 - 如果需要筛选结果,则可以先使用
where
再用group by
或者先用group by
再用having
。当然如果可以使用的话,具体场景具体分析。
- 在
- 对于标准SQL而言,使用
group by
子句必须满足上述提到的第一个要素,即select
子句中查询的列名必须为分组列或列函数。但是在MySQL中扩展了 GROUP BY 的功能:
- 不加聚合函数的情况下,返回的结果是 GROUP BY 结果集中第一行;
select
子句中选择的字段不必在 GROUP BY 中存在。- 但在版本5.7以上(包括5.7)的MySQL会标准一些,也就是上面的不标准使用不再被兼容。参考
group by
的常见错误-SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况。在这种情况下,如果使用group by
不遵循上述提到的两个要素,就将会发生错误。
SELECT语句完整的执行顺序
- from子句组装来自不同数据源的数据;
- where子句基于指定的条件对记录行进行筛选;
- group by子句将数据划分为多个分组;
- 使用聚集函数进行计算;
- 使用having子句筛选分组;
- 计算所有的表达式;
- 使用order by对结果集进行排序;
- select 集合输出。
NOT NULL、NULL和default默认值
当前MySQL环境是5.6.7。
字段设置为NOT NULL,当向该表插入一条记录,而记录没有包含该字段的数据时,并不会因为NOT NULL的字段而插入失败。针对字段类型,MySQL会自动插入值,如字符串类型的字段,此时会插入空字符串;int类型的字段会插入0;decimal 如 decimal(8,2) 的字段会插入 0.00,而 decimal(8,3) 的字段会插入 0.000。(这一点跟我以前认为的不太一样,可能是因为MySQL版本的问题。)当向该表插入一条记录时,NOT NULL的字段不能被插入 NULL 值。
字段设置为NULL,当向该表插入一条记录,而记录没有包含该字段的数据时,该字段的值会被设置为NULL。
字段设置为NOT NULL或NULL 并设置了default默认值,当向该表插入一条记录,而记录没有包含该字段的数据时,则该字段的值会被默认值。
MySQL中文字节问题
MySQL 4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节) ;
MySQL 5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。