MySQL基础_04单行函数、聚合函数(多行函数)

312 阅读4分钟

♥单行函数

1.数值函数

image.png

image.png image.png

image.png

进制转换

image.png

2.字符串函数

image.png

3.日期和时间函数

3.1 获取日期、时间

image.png

3.2 日期与时间戳的转换

image.png

3.3 获取月份、星期、星期数、天数等函数

image.png

3.4 日期的操作函数

image.png

3.5 时间和秒钟转换的函数

image.png

3.6 计算日期和时间的函数

image.png

image.png

3.7 日期的格式化与解析

image.png

image.png

# 格式化:日期 ---> 字符串
# 解析:  字符串 ----> 日期

#此时我们谈的是日期的显式格式化和解析

#之前,我们接触过隐式的格式化或解析
SELECT *
FROM employees
WHERE hire_date = '1993-01-13';

#格式化:
SELECT DATE_FORMAT(CURDATE(),'%Y-%M-%D'),
DATE_FORMAT(NOW(),'%Y-%m-%d'),TIME_FORMAT(CURTIME(),'%h:%i:%S'),
DATE_FORMAT(NOW(),'%Y-%M-%D %h:%i:%S %W %w %T %r')
FROM DUAL;

#解析:格式化的逆过程
SELECT STR_TO_DATE('2021-October-25th 11:37:30 Monday 1','%Y-%M-%D %h:%i:%S %W %w')
FROM DUAL;

SELECT GET_FORMAT(DATE,'USA')
FROM DUAL;

SELECT DATE_FORMAT(CURDATE(),GET_FORMAT(DATE,'USA'))
FROM DUAL;

4.流程控制函数

image.png

5. 加密与解密的函数

image.png

6. MySQL信息函数

image.png

7. 其他函数

MySQL中有些函数无法对其进行具体的分类,但是这些函数在MySQL的开发和运维过程中也是不容忽视的。

image.png

♥聚合函数(多行函数)

1. 常见的几个聚合函数

1.1 AVG / SUM :只适用于数值类型的字段(或变量)

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

1.3 COUNT:

  • 作用:计算指定字段在查询结构中出现的个数(不包含NULL值的)
  • 注意:计算指定字段出现的个数时,是不计算NULL值的。
  • 公式:AVG = SUM / COUNT
#如果计算表中有多少条记录,如何实现?
#方式1COUNT(*)
#方式2COUNT(1)
#方式3COUNT(具体字段) : 不一定对!

# 如何需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段) 哪个效率更高呢?
# 如果使用的是MyISAM 存储引擎,则三者效率相同,都是O(1)
# 如果使用的是InnoDB 存储引擎,则三者效率:COUNT(*) = COUNT(1)> COUNT(字段)

2. GROUP BY 的使用

  • 1:SELECT中出现的非组函数的字段必须声明在GROUP BY 中。反之,GROUP BY中声明的字段可以不出现在SELECT中。
  • 2:GROUP BY 声明在FROM后面、WHERE后面,ORDER BY 前面、LIMIT前面
  • 3:MySQL中GROUP BY中使用WITH ROLLUP

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

  • 要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
  • 要求2:HAVING 必须声明在 GROUP BY 的后面。
  • 要求3:开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。 结论:当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。
/*
  WHERE 与 HAVING 的对比
1. 从适用范围上来讲,HAVING的适用范围更广。 
2. 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
*/

4.SQL底层执行原理

4.1 SELECT 语句的完整结构

/*

#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 ...,....


*/

4.2 SQL语句的执行过程:

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



课后练习



#1.where子句可否使用组函数进行过滤?  No!

#2.查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary) max_sal ,MIN(salary) mim_sal,AVG(salary) avg_sal,SUM(salary) sum_sal
FROM employees;

#3.查询各job_id的员工工资的最大值,最小值,平均值,总和

SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id;

#4.选择具有各个job_id的员工人数
SELECT job_id,COUNT(*)
FROM employees
GROUP BY job_id;

# 5.查询员工最高工资和最低工资的差距(DIFFERENCE)  #DATEDIFF
SELECT MAX(salary) - MIN(salary) "DIFFERENCE"
FROM employees;


# 6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

SELECT manager_id,MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary) >= 6000;


# 7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序 

SELECT d.department_name,d.location_id,COUNT(employee_id),AVG(salary)
FROM departments d LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY department_name,location_id


# 8.查询每个工种、每个部门的部门名、工种名和最低工资 

SELECT d.department_name,e.job_id,MIN(salary)
FROM departments d LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY department_name,job_id