mysql基础小结二

聚合函数

五种常用函数
COUNT : 计算表中的记录数(行数)
SUM : 计算表中总值
AVG : 计算数据平均值
MAX : 求最大值
MIN :求最小值

COUNT函数的结果根据参数的不同而不同,COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数
聚合函数会将NULL排除在外。但COUNT(*)例外,并不会排除NULL。(四则运算中如果存在NULL,那么结果一定是NULL)

我们也可以使用聚合函数删除重复值(关键字DISTINCT)
DISTINCT写在括号内,意思就是在计算行数之前删除重复数据,如果放在括号外的话,就没有意义了!
例: SELECT COUNT(DISTINCT <列名>) FROM <表名> ; 其他函数语法也相同!
GROUP BY 子句就是将其分组的意思
语法格式:SELECT <列名> FROM <表名> GROUP BY <列名>; 多列使用逗号隔开!
GROUP BY子句就是切分表的一把刀,根据你GROUP BY 后面的列名来分几个小块类型,GROUP BY 书写要求一定要写在FROM后面
(如果有WHERE子句的话需要写在WHERE子句之后)。 一般情况下书写顺序 SELECT -- FROM -- WHERE --GROUP BY
SQL子句的顺序不能改变,也不能互相替换!

当聚合键(GROUP BY中指定的列名)包含NULL的情况下,他也也会将NULL作为一组特定的数据!结果会以“不确定”行(空行)的形式表现出来!

如果使用WHERE子句和GROUP BY子句的话,如果是SELECT 语句首先使用WHERE子句对记录进行过滤!
GROUP BY 和 WHERE 并用时 SELECT 语句执行顺序!FROM -- WHERE -- GROUP BY -- SELECT

聚合函数和GROUP BY子句有关的常见错误
1.使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列名
2.前面学习在SELECT里面通过AS写别名,但是使用GROUP BY 的时候时不能使用别名的!虽然不会出现错误,但是还是不支持这样的写法!
3.GROUP BY 子句的结果不能进行排序
4.不能在WHERE子句中使用聚合函数!只有在SELECT子句和HAVING子句(以及GROUP BY 子句) 中能够使用聚合函数!

HAVING子句为聚合结果指定条件!
聚合函数可以在SELECT子句、 HAVING子句和ORDER BY子句中使用。
HAVING子句要写在GROUP BY子句之后。
WHERE子句用来指定数据行的条件, HAVING子句用来指定分组的条件。
HAVING语法:SELECT <列名> FROM <表名> GROUP BY <列名> HAVING < 分组结果对应条件> 可以用聚合函数

使用HAVING子句时SELECT语句顺序
SELECT-FROM-WHERE-GROUP BY-HAVING (HAVING子句要写在GROUP BY 子句后面)

不正确写法 SELECT product_type ,CONUNT(*) FROM Product GROUP BY product_type HAVING product_name ='aaa'
如果当某列不包含在GROUP BY子句中,因此不允许写在HAVING子句中,
相对于HAVING子句更适合写在WHERE子句中的条件,聚合键所对应的条件,既可以写在HAVING子句中又可以写在WHERE子句中!
WHERE子句=指定行所对应的条件
HAVING子句=指定组所对应的条件
聚合键推荐能写在WHERE中就写在WHERE中,一方面WHERE子句指定条件的时候,由于排序之前就对数据进行了过滤,因此能够减少排序的数据量,
另一方面可以对WHERE子句指定条件所对应的列创建索引,也是可以提高处理速度的!创建索引时一种非常普遍的提高DBMS性能的方法!

ORDER BY 子句可以对查询结果进行排序,在ORDER BY 子句中列名的后面使用关键字ASC升序排序,DESC降序排序!
ASC(ascendent 上升的) DESC (descendent 下降的)
ORDER BY子句可以指定多个排序键,排序键包含NULL时,会在开头或末尾进行汇总!
它可以使用SELECT子句中定义的列的别名!也可以使用未出现的列或者聚合函数!但是不能使用列的编号!
SELECT子句执行顺序在GROUP BY子句之后,ORDER BY子句之前,因此,在执行GROUP BY子句时,SELECT 语句中定义的别名无法识别!
对于在SELECT之后执行的ORDER BY子句来说,就没有这个问题了!
具体语法格式:
SELECT <列名> FROM <表名> ORDER BY <排序基准列> (列名+升降序 根据指定列名升降序!)多列使用逗号隔开!
书写顺序: SELECT -FROM-WHERE-GROUP BY -HAVING-ORDER BY
ORDER BY 通常写在SELECT语句末尾!未指定ORDER BY 子句中排序顺序时会默认使用升序排序!

如果想对顺序商品进行更细致的排序,就在添加一个排序键!用逗号隔开!规则优先级时从左到右,如果左边的列存在相同值,在接着参考右边!也可以使用三个以上的!

猜你喜欢

转载自www.cnblogs.com/yeapy/p/11578088.html