数据库学习笔记

139 阅读3分钟

数据库学习2024/3/16

聚合函数

1.常见的聚合函数

1.1 AVG / SUM:只适用于数值类型的字段(或变量),对字符串和日期是无意义的

SELECT AVG(salary),SUM(salary), AVG(salary) *107

FROM employees;

1.2 MAX / MIN:适用数值类型、字符串类型、时间日期类型的字段(或变量)

SELECT MAX(salary),MIN(salary),MAX(last_name),MIN(last_name),MAX(hire_date),MIN(hire_date)

FROM employees;

1.3COUNT:

①作用:计算指定字段在查询结构中出现的个数(不包含NULL)

SELECT COUNT(employee_id),COUNT(1),COUNT(*)

FROM employees;

案例:如果要计算表中有多少条记录,如何实现?

方式1:count(*)     方式2:count(常数)

方式1:count(具体字段):不一定对的!!!

SELECT COUNT(employee_id),COUNT(1),COUNT(*)

FROM employees;

②注意:计算指定字段出现的个数时,是不计算NULL值的

SELECT COUNT(commission_pct),COUNT(department_id)

FROM employees;

③ AVG = SUM / COUNT(自动过滤NULL)

SELECT AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),

SUM(commission_pct)/ 107

FROM employees;

案例:查询公司中平均奖金率

错误的

SELECT AVG(commission_pct) FROM employees;

正确的

SELECT SUM(commission_pct)/COUNT(IFNULL(commission_pct,0)),AVG(IFNULL(commission_pct,0)) FROM employees;

案例:如果要计算表中有多少条记录那个效率高?

如果是MyISAM的存储引擎,则三者效率相同

如果是InnoDB的存储引擎,则count(*)=count(数值)>count(具体字段)

其他:方差、标准差、中位数

2.GROUP BY的使用

单组

案例:查询各个部门的平均工资:

SELECT department_id,AVG(salary)

FROM employees

GROUP BY department_id;

多组

案例:查询各个部门和job_id的平均工资:

SELECT department_id,job_id,AVG(salary)

FROM employees

GROUP BY department_id,job_id;

#或

SELECT job_id,department_id,AVG(salary)

FROM employees

GROUP BY job_id,department_id;

#错误的!!

SELECT job_id,department_id,AVG(salary)

FROM employees

GROUP BY job_id;

结论1:SELECT中出现的非组函数的字段必须出现在GROUP BY中。

 反之,GROUP BY中声明的字段可以不出现在SELECT中。

结论2:GROUP BY 声明在FROM和WHERE后面,在ORDER BY 和LIMIT前面

结论3:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序, 即ROLLUP和ORDER BY是互相排斥的。

SELECT job_id,department_id,AVG(salary)

FROM employees

GROUP BY job_id,department_id WITH ROLLUP

ORDER BY AVG(salary);

3.HAVING的使用(过滤数据)

结论1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE,否则会报错

结论2:HAVING声明必须在GROUP BY后面

结论3:开发中我们使用HAVING的全前提是使用了GROUP BY

结论4:当过滤条件中有聚合函数,则必须使用HAVING

 当过滤条件中没有聚合函数,则可以使用HAVINGWHERE,
 建议使用WHERE,因为效率高

HAVING与WHERE的对比:

1.从适用范围:HAVING比WHERE适用范围更广

2.如果过滤条件中没有聚合函数,WHERE比HAVING效率更高

4.SQL的底层执行原理

SQL的基本语法

sql92语法

SELECT ....,...,...(包含聚合函数)

FROM ...,...

WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件

GROUP BY ...,...,...

HAVING 包含聚合函数的过滤条件

ORDER BY ...,...(ASC / DESC)

LIMIT ...,...

sql99语法

SELECT ....,...,...(包含聚合函数)

FROM ... (LEFT / RIGHT)JOIN ...ON 多表连接条件

(LEFT / RIGHT)JOIN... ON 多表连接条件

WHERE 不包含聚合函数的过滤条件

GROUP BY ...,...,...

HAVING 包含聚合函数的过滤条件

ORDER BY ...,...(ASC / DESC)

LIMIT ...,...

SQL语句的执行过程()中是可能有的

FROM...,...-> (ON) ->(LEFT/RIGHT JOIN) -> WHERE ->GROUP BY ->HAVING ->SELECT ->DISTINCT(去重)->ORDER BY ->LIMIT