MySQL中常用函数举例

聚合函数

-- 聚合函数示例
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;

你可能感兴趣的:(MySQL,mysql)