一、关于函数
1.1 简介
MySQL提供了许多内置的函数以帮助用户进行数据操作和分析。这些函数可以分为几类,包括聚合函数、字符串函数、数值函数、日期和时间函数、控制流函数等。
1.2 发展
早期版本(MySQL 3.x 和 4.x) :
- MySQL 最初的版本对函数的支持较为简单,主要提供基本的字符串和数学函数。
MySQL 5.x:
- 引入了更丰富的内置函数和聚合函数,同时支持存储过程和触发器的功能,这使得函数在数据处理中的应用更加灵活。
MySQL 5.7:
- 增强了 JSON 数据类型的支持,增加了许多与 JSON 相关的函数,如
JSON_EXTRACT()
、JSON_ARRAY()
等。
- 增强了 JSON 数据类型的支持,增加了许多与 JSON 相关的函数,如
MySQL 8.0:
- 进一步扩展了函数的功能,引入了窗口函数和通用表表达式(CTE),大大增强了数据分析的能力。
- 增加了更丰富的字符串、日期和时间处理函数,提高了性能和用户体验。
1.3 特点
多样性:
- MySQL 提供多种内置函数,主要包括字符串函数、日期和时间函数、数学函数、聚合函数和控制流函数等。用户也可以创建自定义函数(UDF)。
简洁性:
- 函数的使用使 SQL 查询更简洁。通过使用函数,可以避免在查询中写复杂的逻辑。
性能优化:
- 函数可以减少客户端和服务器之间的通信量,因为在数据库服务器上进行数据处理比在应用层处理数据更高效。
可重用性:
- 函数可以被多个查询复用,提高了代码的可维护性。
类型安全:
- 函数可以强制执行输入参数的类型,减少了运行时错误的可能性。
扩展性:
- 用户可以通过创建自定义函数来扩展 MySQL 的功能,以满足特定需求。
执行环境:
- MySQL 函数在数据库服务器上运行,与数据更接近,因此可以提高执行效率,尤其是在处理大量数据时。
1.4 分类
- 字符串函数: 用于操作字符串,如
CONCAT()
、SUBSTRING()
、TRIM()
等。 - 日期和时间函数: 用于处理日期和时间数据,如
NOW()
、CURDATE()
、DATEDIFF()
等。 - 数学函数: 用于数学计算,如
ROUND()
、FLOOR()
、CEIL()
等。 - 聚合函数: 用于对数据进行汇总计算,如
SUM()
、AVG()
、COUNT()
等。 - 控制流函数: 用于条件判断和逻辑控制,如
IF()
、CASE
等。
二、聚合函数
聚合函数用于对一组数据进行计算,返回单个值。通常与 GROUP BY
语句结合使用。
2.1 COUNT()
描述: 返回结果集中行的数量。
用法:
SELECT COUNT(column_name) FROM table_name;
示例:
SELECT COUNT(*) FROM employees; -- 计算所有员工的数量
select count(*) as count_id
from city;
select count(district) as count_name
from city;
2.2 SUM()
描述: 返回数值列的总和。
用法:
SELECT SUM(column_name) FROM table_name;
示例:
SELECT SUM(salary) FROM employees; -- 计算所有员工薪资的总和
SUM()用来返回指定列值的和(总计)。
select sum(id) as sum_id
from city;
2.3 AVG()
描述: 返回数值列的平均值。
用法:
SELECT AVG(column_name) FROM table_name;
示例:
SELECT AVG(salary) FROM employees; -- 计算员工的平均薪资
select avg(id) as avg_id
from city;
select id,name, avg(id) as avg_id
from city
where name regexp '.sh.' ;
2.4 MAX()
描述: 返回数值列的最大值。
用法:
SELECT MAX(column_name) FROM table_name;
示例:
SELECT MAX(salary) FROM employees; -- 查找最高薪资
select max(name)
from city;
2.5 MIN()
描述: 返回数值列的最小值。
用法:
SELECT MIN(column_name) FROM table_name;
示例:
SELECT MIN(salary) FROM employees; -- 查找最低薪资
select min(population)
from city;
三、字符串函数
字符串函数用于处理和操作字符串数据。
3.1 CONCAT()
描述: 连接两个或多个字符串。
用法:
SELECT CONCAT(string1, string2, ...) AS alias_name FROM table_name;
示例:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; -- 合并姓和名
3.2 LENGTH()
描述: 返回字符串的长度(字符数)。
用法:
SELECT LENGTH(string) FROM table_name;
示例:
SELECT LENGTH(first_name) FROM employees; -- 返回名字的字符数
3.3 SUBSTRING()
描述: 提取字符串的一部分。
用法:
SELECT SUBSTRING(string, start_position, length) FROM table_name;
示例:
SELECT SUBSTRING(first_name, 1, 3) FROM employees; -- 提取名字的前三个字符
3.4 UPPER() / LOWER()
描述: 将字符串转换为大写或小写。
用法:
SELECT UPPER(string) FROM table_name; -- 转为大写
SELECT LOWER(string) FROM table_name; -- 转为小写
示例:
SELECT UPPER(first_name) FROM employees; -- 将名字转为大写
3.5 TRIM()
描述: 删除字符串开头和结尾的空格。
用法:
SELECT TRIM(string) FROM table_name;
示例:
SELECT TRIM(' John Doe '); -- 返回 'John Doe'
四、数值函数
数值函数用于执行数值计算。
4.1 ROUND()
描述: 对数字进行四舍五入。
用法:
SELECT ROUND(number, decimals) FROM table_name;
示例:
SELECT ROUND(salary, 2) FROM employees; -- 四舍五入到小数点后两位
4.2 FLOOR()
描述: 返回小于或等于指定数字的最大整数。
用法:
SELECT FLOOR(number) FROM table_name;
示例:
SELECT FLOOR(salary) FROM employees; -- 获取薪资的下限整数
4.3 CEIL()
描述: 返回大于或等于指定数字的最小整数。
用法:
SELECT CEIL(number) FROM table_name;
示例:
SELECT CEIL(salary) FROM employees; -- 获取薪资的上限整数
4.4 ABS()
描述: 返回数字的绝对值。
用法:
SELECT ABS(number) FROM table_name;
示例:
SELECT ABS(-100) AS absolute_value; -- 返回 100
五、日期和时间函数
这些函数用于处理日期和时间数据。
5.1 NOW()
描述: 返回当前的日期和时间。
用法:
SELECT NOW();
示例:
SELECT NOW(); -- 返回当前日期和时间
5.2 CURDATE()
描述: 返回当前日期。
用法:
SELECT CURDATE();
示例:
SELECT CURDATE(); -- 返回当前日期
5.3 DATE_ADD()
描述: 向日期添加指定的时间间隔。
用法:
SELECT DATE_ADD(date, INTERVAL expr unit);
示例:
SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY); -- 当前日期加一天
5.4 DATEDIFF()
描述: 计算两个日期之间的差异,返回天数。
用法:
SELECT DATEDIFF(date1, date2);
示例:
SELECT DATEDIFF('2024-01-01', '2023-12-31'); -- 返回 1
5.5 YEAR(), MONTH(), DAY()
描述: 提取日期中的年份、月份或日期。
用法:
SELECT YEAR(date), MONTH(date), DAY(date) FROM table_name;
示例:
SELECT YEAR(CURDATE()), MONTH(CURDATE()), DAY(CURDATE()); -- 返回当前年份、月份和日期
六、控制流函数
控制流函数用于在查询中进行条件判断和逻辑控制。
6.1 IF()
描述: 根据条件返回不同的值。
用法:
SELECT IF(condition, true_value, false_value) FROM table_name;
示例:
SELECT IF(salary > 50000, 'High', 'Low') AS salary_level FROM employees; -- 根据薪资等级分类
6.2 CASE
描述: 提供条件分支。
用法:
SELECT
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END AS alias_name
FROM table_name;
示例:
SELECT
CASE
WHEN salary > 50000 THEN 'High'
WHEN salary BETWEEN 30000 AND 50000 THEN 'Medium'
ELSE 'Low'
END AS salary_level
FROM employees; -- 根据薪资水平分类