聚合函数
-- 聚合函数示例
SELECT COUNT(*) AS total_rows FROM your_table; -- 计算行数
SELECT SUM(column_name) AS total_sum FROM your_table; -- 计算总和
SELECT AVG(column_name) AS average_value FROM your_table; -- 计算平均值
SELECT MIN(column_name) AS min_value FROM your_table; -- 找出最小值
SELECT MAX(column_name) AS max_value FROM your_table; -- 找出最大值
-- 使用聚合函数进行条件统计
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department; -- 按部门统计员工数量
-- 使用聚合函数计算百分比
SELECT department, COUNT(*) AS total_employees,
COUNT(*) / (SELECT COUNT(*) FROM employees) * 100 AS percentage
FROM employees
GROUP BY department; -- 计算每个部门的员工百分比
-- 使用聚合函数处理NULL值
SELECT AVG(IFNULL(salary, 0)) AS average_salary
FROM employees; -- 计算平均工资,将NULL值视为0
-- 使用HAVING子句进行条件过滤
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000; -- 仅显示平均工资超过50000的部门
-- 使用GROUP_CONCAT聚合字符串
SELECT department, GROUP_CONCAT(employee_name) AS employee_list
FROM employees
GROUP BY department; -- 列举每个部门的所有员工名单
-- 使用聚合函数计算中位数
SELECT department,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary
FROM employees
GROUP BY department; -- 计算每个部门的工资中位数
-- 使用聚合函数计算标准差和方差
SELECT department,
STDDEV(salary) AS salary_stddev,
VARIANCE(salary) AS salary_variance
FROM employees
GROUP BY department; -- 计算每个部门的工资标准差和方差
-- 使用聚合函数进行分组拼接
SELECT department,
GROUP_CONCAT(employee_name ORDER BY salary DESC SEPARATOR ', ') AS top_employees
FROM employees
GROUP BY department; -- 列举每个部门的工资最高的员工
-- 使用聚合函数进行数据去重
SELECT DISTINCT department,
GROUP_CONCAT(DISTINCT employee_name ORDER BY employee_name) AS unique_employees
FROM employees
GROUP BY department; -- 列举每个部门的唯一员工列表
-- 使用聚合函数计算累计和
SELECT date,
amount,
SUM(amount) OVER (ORDER BY date) AS cumulative_amount
FROM sales; -- 计算每天销售额的累计和
-- 使用聚合函数进行数据透视
SELECT product,
SUM(CASE WHEN year = 2023 THEN revenue END) AS revenue_2023,
SUM(CASE WHEN year = 2024 THEN revenue END) AS revenue_2024
FROM sales
GROUP BY product; -- 按产品透视每年的销售额
-- 使用聚合函数计算排名
SELECT employee_id,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees; -- 计算每个员工的工资排名
-- 使用聚合函数计算百分位数
SELECT department,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY salary) AS salary_75th_percentile
FROM employees
GROUP BY department; -- 计算每个部门的工资第75百分位数
数学函数
-- 常用数学函数示例
SELECT ABS(-10) AS absolute_value; -- 返回绝对值,结果为 10
SELECT ROUND(15.567, 1) AS rounded_value; -- 四舍五入到一位小数,结果为 15.6
SELECT CEIL(8.45) AS ceil_value; -- 返回不小于 8.45 的最小整数,结果为 9
SELECT FLOOR(8.45) AS floor_value; -- 返回不大于 8.45 的最大整数,结果为 8
SELECT RAND() AS random_number; -- 返回一个随机数
-- 对数学运算的一些示例
SELECT SQRT(25) AS square_root; -- 返回 25 的平方根,结果为 5
SELECT POWER(2, 3) AS power_result; -- 返回 2 的 3 次方,结果为 8
SELECT EXP(2) AS exponential_result; -- 返回 e 的 2 次方,e 为自然对数的底,结果为 7.389
SELECT LOG(10) AS logarithm_result; -- 返回以 e 为底的 10 的对数,结果为 2.303
SELECT SIN(PI()/2) AS sine_result; -- 返回正弦函数的值,参数为 π/2,结果为 1
SELECT COS(PI()) AS cosine_result; -- 返回余弦函数的值,参数为 π,结果为 -1
SELECT TAN(PI()/4) AS tangent_result; -- 返回正切函数的值,参数为 π/4,结果为 1
-- 角度和弧度转换的示例
SELECT DEGREES(PI()) AS radians_to_degrees; -- 将 π 弧度转换为度,结果为 180
SELECT RADIANS(90) AS degrees_to_radians; -- 将 90 度转换为弧度,结果为 π/2
-- 数学运算和常量的示例
SELECT MOD(17, 5) AS modulo_result; -- 返回 17 除以 5 的余数,结果为 2
SELECT PI() AS pi_value; -- 返回圆周率 π,结果为 3.141592653589793
SELECT RAND() * 100 AS random_percentage; -- 生成一个 0 到 100 之间的随机百分比
SELECT SIGN(-15) AS sign_value; -- 返回 -15 的符号,结果为 -1
SELECT TRUNCATE(15.789, 1) AS truncated_value; -- 截断小数位,结果为 15.7
-- 数学函数的复杂运算
SELECT SQRT(POWER(2, 3) + POWER(4, 2)) AS complex_math; -- 复杂的数学运算,结果为 5
-- 使用数学函数进行条件计算
SELECT CASE
WHEN ABS(-20) > 10 THEN 'Greater than 10'
ELSE 'Not greater than 10'
END AS abs_comparison; -- 判断绝对值是否大于 10
-- 使用数学函数进行比较
SELECT GREATEST(5, 8, 2) AS max_value; -- 返回最大值,结果为 8
SELECT LEAST(5, 8, 2) AS min_value; -- 返回最小值,结果为 2
-- 数字格式化的示例
SELECT FORMAT(1234567.89, 2) AS formatted_number; -- 格式化数字,结果为 1,234,567.89
-- 使用数学函数进行位运算
SELECT BIT_AND(5, 3) AS bitwise_and; -- 返回 5 和 3 的按位与,结果为 1
SELECT BIT_OR(5, 3) AS bitwise_or; -- 返回 5 和 3 的按位或,结果为 7
SELECT BIT_XOR(5, 3) AS bitwise_xor; -- 返回 5 和 3 的按位异或,结果为 6
字符串函数
-- 字符串连接和截取的示例
SELECT CONCAT('Hello', ' ', 'World') AS concatenated_string; -- 连接字符串,结果为 'Hello World'
SELECT SUBSTRING('MySQL Functions', 1, 5) AS substring_result; -- 提取子串,结果为 'MySQL'
SELECT LEFT('MySQL Functions', 5) AS left_result; -- 返回左边的子串,结果为 'MySQL'
SELECT RIGHT('MySQL Functions', 8) AS right_result; -- 返回右边的子串,结果为 'Functions'
-- 字符串长度和去除空格的示例
SELECT LENGTH('MySQL') AS string_length; -- 返回字符串长度,结果为 5
SELECT CHAR_LENGTH('中文字符') AS chinese_string_length; -- 返回中文字符串长度,结果为 4
SELECT TRIM(BOTH ' ' FROM ' Trim Example ') AS trimmed_string; -- 移除两端的空格,结果为 'Trim Example'
SELECT REPLACE('Hello World', 'Hello', 'Hi') AS replaced_string; -- 替换字符串,结果为 'Hi World'
-- 字符串大小写转换的示例
SELECT UPPER('hello') AS upper_case; -- 转换为大写,结果为 'HELLO'
SELECT LOWER('WORLD') AS lower_case; -- 转换为小写,结果为 'world'
-- 字符串查找和比较的示例
SELECT POSITION('lo' IN 'Hello') AS position_result; -- 查找子串的位置,结果为 4
SELECT LOCATE('lo', 'Hello') AS locate_result; -- 查找子串的位置,结果为 4
SELECT INSTR('Hello', 'e') AS instr_result; -- 查找字符的位置,结果为 2
SELECT CONCAT('abc', 'def') = 'abcdef' AS string_comparison; -- 字符串比较,结果为 1 (TRUE)
-- 字符串分割和连接的示例
SELECT SUBSTRING_INDEX('apple,orange,banana', ',', 2) AS substring_index_result; -- 按分隔符提取子串,结果为 'apple,orange'
SELECT GROUP_CONCAT(employee_name SEPARATOR ', ') AS employee_list
FROM employees; -- 以逗号和空格连接员工名单
-- 字符串格式化的示例
SELECT FORMAT(1234567.89, 2) AS formatted_number; -- 格式化数字,结果为 '1,234,567.89'
-- 使用 CONCAT_WS 进行更复杂的字符串连接
SELECT CONCAT_WS(', ', first_name, last_name) AS full_name
FROM employees; -- 以逗号和空格连接名和姓
-- 使用 REPEAT 复制字符串
SELECT REPEAT('Na', 3) AS repeated_string; -- 复制字符串 'Na',结果为 'NaNaNa'
-- 使用 LPAD 和 RPAD 进行字符串填充
SELECT LPAD('123', 5, '0') AS left_padded_string; -- 在左侧用 '0' 填充,结果为 '00123'
SELECT RPAD('ABC', 6, '_') AS right_padded_string; -- 在右侧用 '_' 填充,结果为 'ABC___'
-- 使用 CONCAT 和 CASE 进行条件字符串拼接
SELECT employee_id,
CONCAT('Employee ',
CASE
WHEN salary > 50000 THEN 'with high salary'
ELSE 'with normal salary'
END) AS employee_status
FROM employees;
-- 使用 SUBSTRING_INDEX 进行字符串分割
SELECT SUBSTRING_INDEX('apple,orange,banana', ',', -1) AS last_item; -- 提取最后一个子串,结果为 'banana'
-- 使用 REGEXP 进行正则表达式匹配
SELECT employee_name
FROM employees
WHERE employee_name REGEXP '^A'; -- 匹配以 'A' 开头的员工名字
-- 使用 JSON 函数处理 JSON 字符串
SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name') AS extracted_name; -- 提取 JSON 字符串中的字段值,结果为 'John'
日期和时间函数
-- 当前日期和时间的示例
SELECT NOW() AS current_datetime; -- 返回当前日期和时间
SELECT CURDATE() AS current_date; -- 返回当前日期
SELECT CURTIME() AS current_time; -- 返回当前时间
-- 格式化日期的示例
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_datetime; -- 格式化日期和时间
-- 日期和时间的计算示例
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS tomorrow; -- 计算明天的日期
SELECT DATE_SUB(NOW(), INTERVAL 1 WEEK) AS one_week_ago; -- 计算一周前的日期
-- 日期差异的计算示例
SELECT DATEDIFF('2024-01-10', '2024-01-04') AS date_difference; -- 计算两个日期之间的天数差异
SELECT TIMESTAMPDIFF(MONTH, '2023-01-01', '2024-01-01') AS month_difference; -- 计算两个日期之间的月数差异
-- UNIX 时间戳的示例
SELECT UNIX_TIMESTAMP(NOW()) AS current_unix_timestamp; -- 返回当前的 UNIX 时间戳
SELECT FROM_UNIXTIME(1641347100) AS from_unix_timestamp; -- 将 UNIX 时间戳转换为日期和时间
-- 时区相关的示例
SELECT CONVERT_TZ(NOW(), '+00:00', '+05:00') AS converted_datetime; -- 转换时区
-- 使用 EXTRACT 获取日期和时间部分
SELECT EXTRACT(YEAR FROM NOW()) AS current_year; -- 提取当前年份
SELECT EXTRACT(MONTH FROM NOW()) AS current_month; -- 提取当前月份
-- 日期和时间的比较示例
SELECT '2024-01-10' > '2024-01-04' AS date_comparison; -- 比较两个日期
-- 使用 INTERVAL 和 CASE 进行条件日期计算
SELECT order_date,
CASE
WHEN DATEDIFF(NOW(), order_date) <= 30 THEN 'Recent'
WHEN DATEDIFF(NOW(), order_date) <= 90 THEN 'Within 3 months'
ELSE 'More than 3 months ago'
END AS order_status
FROM orders;
-- 使用 WEEK 函数获取周信息
SELECT WEEK('2024-01-10') AS week_number; -- 获取日期所在的周数
-- 使用 DAYOFWEEK 获取星期几
SELECT DAYOFWEEK('2024-01-10') AS day_of_week; -- 获取日期所在的星期几,返回 6 (星期六)
-- 使用 MONTHNAME 获取月份名称
SELECT MONTHNAME('2024-01-10') AS month_name; -- 获取日期所在的月份名称,返回 'January'
-- 使用 STR_TO_DATE 进行日期字符串转换
SELECT STR_TO_DATE('2024-01-10', '%Y-%m-%d') AS converted_date; -- 将字符串转换为日期格式
-- 使用 MAKEDATE 生成日期
SELECT MAKEDATE(2024, 32) AS generated_date; -- 根据年份和年内天数生成日期,结果为 '2024-02-01'
-- 使用 TIME_FORMAT 格式化时间
SELECT TIME_FORMAT('14:30:45', '%h:%i %p') AS formatted_time; -- 格式化时间,结果为 '02:30 PM'
-- 使用 ADDTIME 进行时间计算
SELECT ADDTIME('12:30:00', '04:15:30') AS total_time; -- 计算两个时间的总和,结果为 '16:45:30'
-- 使用 SEC_TO_TIME 进行秒数转换
SELECT SEC_TO_TIME(3665) AS seconds_to_time; -- 将秒数转换为时间格式,结果为 '01:01:05'
-- 使用 TIMEDIFF 计算时间差
SELECT TIMEDIFF('18:30:00', '12:15:45') AS time_difference; -- 计算两个时间的差异,结果为 '06:14:15'
-- 使用 ADDDATE 进行日期计算
SELECT ADDDATE('2024-01-10', INTERVAL 3 MONTH) AS future_date; -- 计算三个月后的日期
-- 使用 LAST_DAY 获取月份的最后一天
SELECT LAST_DAY('2024-04-15') AS last_day_of_month; -- 获取月份的最后一天,结果为 '2024-04-30'
-- 使用 DATE_FORMAT 输出自定义日期格式
SELECT DATE_FORMAT(NOW(), '%W, %M %e, %Y') AS custom_formatted_date; -- 输出自定义日期格式
-- 使用 DATE_ADD 和 CASE 进行条件日期计算
SELECT order_date,
CASE
WHEN DATEDIFF(NOW(), order_date) <= 30 THEN 'Recent'
WHEN DATEDIFF(NOW(), order_date) <= 90 THEN 'Within 3 months'
ELSE 'More than 3 months ago'
END AS order_status
FROM orders;