【MySql】第五章

文章目录

    • 一、常用的系统函数
      • [1.1 数学函数](#1.1 数学函数)
      • [1.2 字符串函数](#1.2 字符串函数)
        • [1.2.1 计算字符串字符数的函数和计算字符串长度的函数](#1.2.1 计算字符串字符数的函数和计算字符串长度的函数)
        • [1.2.2 字符串合并函数](#1.2.2 字符串合并函数)
        • [1.2.3 字符串大小写转换函数](#1.2.3 字符串大小写转换函数)
        • [1.2.4 删除空格函数](#1.2.4 删除空格函数)
        • [1.2.5 取子串函数](#1.2.5 取子串函数)
        • [1.2.6 其他字符串函数](#1.2.6 其他字符串函数)
      • [1.3 日期和时间函数](#1.3 日期和时间函数)
        • [1.3.1 获取当前系统日期及指定日期年、月、日的函数](#1.3.1 获取当前系统日期及指定日期年、月、日的函数)
        • [1.3.2 获取当前系统日期时间的函数](#1.3.2 获取当前系统日期时间的函数)
        • [1.3.3 其他日期和时间函数](#1.3.3 其他日期和时间函数)
      • [1.4 系统信息函数](#1.4 系统信息函数)
        • [1.4.1 获取MySQL服务器版本号、用户名和数据库名的函数](#1.4.1 获取MySQL服务器版本号、用户名和数据库名的函数)
        • [1.4.2 其他系统信息函数](#1.4.2 其他系统信息函数)
      • [1.5 条件判断函数](#1.5 条件判断函数)
        • [1.5.1 IF函数](#1.5.1 IF函数)
        • [1.5.2 IFNULL()函数](#1.5.2 IFNULL()函数)
        • [1.5.3 CASE函数](#1.5.3 CASE函数)
      • [1.6 加密函数](#1.6 加密函数)

一、常用的系统函数

1.1 数学函数

当然可以,下面是MySQL中一些常用的数学函数,按照不同的类别进行分类,并提供了简单的案例。每个函数的介绍和用法都在表格中,而示例则单独列出并换行。

函数名称 描述 用法
ABS(x) 返回x的绝对值 SELECT ABS(x);
CEILING(x) 返回大于或等于x的最小整数 SELECT CEILING(x);
FLOOR(x) 返回小于或等于x的最大整数 SELECT FLOOR(x);
MOD(x, y) 返回x除以y的余数 SELECT MOD(x, y);
ROUND(x, y) 返回x四舍五入到小数点后y位的结果 SELECT ROUND(x, y);
RAND() 返回一个0到1之间的随机浮点数 SELECT RAND();
POW(x, y) 返回x的y次幂 SELECT POW(x, y);

示例:

sql 复制代码
SELECT ABS(-10); -- 结果为10
SELECT CEILING(3.14); -- 结果为4
SELECT FLOOR(3.14); -- 结果为3
SELECT MOD(10, 3); -- 结果为1
SELECT ROUND(3.145, 2); -- 结果为3.15
SELECT RAND(); -- 结果可能是0.12345
SELECT POW(2, 3); -- 结果为8

1.2 字符串函数

1.2.1 计算字符串字符数的函数和计算字符串长度的函数
  • CHAR_LENGTH(str)CHARACTER_LENGTH(str): 返回字符串str的字符数。
  • LENGTH(str): 返回字符串str的长度,以字节为单位。

示例:

sql 复制代码
SELECT CHAR_LENGTH('Hello World');  -- 返回11
SELECT LENGTH('Hello World');  -- 返回11(如果字符编码为单字节)
1.2.2 字符串合并函数
  • CONCAT(str1, str2, ...): 将多个字符串参数首尾相连。

示例:

sql 复制代码
SELECT CONCAT('Hello', ' ', 'World');  -- 返回Hello World
1.2.3 字符串大小写转换函数
  • LOWER(str)LCASE(str): 将字符串str转换为小写。
  • UPPER(str)UCASE(str): 将字符串str转换为大写。

示例:

sql 复制代码
SELECT LOWER('Hello World');  -- 返回hello world
SELECT UPPER('Hello World');  -- 返回HELLO WORLD
1.2.4 删除空格函数
  • TRIM(str): 去除字符串str两端的空格。
  • LTRIM(str): 去除字符串str左端的空格。
  • RTRIM(str): 去除字符串str右端的空格。

示例:

sql 复制代码
SELECT TRIM('   Hello World   ');  -- 返回Hello World
SELECT LTRIM('   Hello World   ');  -- 返回Hello World   
SELECT RTRIM('   Hello World   ');  -- 返回   Hello World
1.2.5 取子串函数
  • SUBSTRING(str, pos)SUBSTR(str, pos): 从字符串str中提取从位置pos开始到字符串末尾的子串。
  • SUBSTRING(str, pos, len): 从字符串str中提取从位置pos开始长度为len的子串。

示例:

sql 复制代码
SELECT SUBSTRING('Hello World', 1);  -- 返回Hello World(从第一个字符开始)
SELECT SUBSTRING('Hello World', 1, 5);  -- 返回Hello(从第一个字符开始提取5个字符)
1.2.6 其他字符串函数
  • REPLACE(str, search_str, replace_str): 在字符串str中替换search_strreplace_str
  • POSITION(search_str IN str)INSTR(str, search_str): 返回search_strstr中的位置。
  • LTRIM(str, char_set): 去除字符串str左端的指定字符集char_set中的字符。
  • RTRIM(str, char_set): 去除字符串str右端的指定字符集char_set中的字符。
  • REVERSE(str): 返回字符串str的反转字符串。

示例:

sql 复制代码
SELECT REPLACE('Hello World', 'World', 'MySQL');  -- 返回Hello MySQL
SELECT POSITION('World' IN 'Hello World');  -- 返回7(World在Hello World中的位置)
SELECT LTRIM('xxxHello World', 'x');  -- 返回Hello World
SELECT RTRIM('Hello Worldxxx', 'x');  -- 返回Hello World
SELECT REVERSE('Hello World');  -- 返回dlroW olleH

1.3 日期和时间函数

1.3.1 获取当前系统日期及指定日期年、月、日的函数
  • CURDATE()CURRENT_DATE(): 返回当前的日期,格式为YYYY-MM-DD。
  • YEAR(date): 返回指定日期的年份。
  • MONTH(date): 返回指定日期的月份(1到12)。
  • DAY(date)DAYOFMONTH(date): 返回指定日期的天数(1到31)。

示例:

sql 复制代码
SELECT CURDATE();  -- 返回当前日期,例如2024-10-28
SELECT YEAR('2024-10-28');  -- 返回2024
SELECT MONTH('2024-10-28');  -- 返回10
SELECT DAY('2024-10-28');  -- 返回28
1.3.2 获取当前系统日期时间的函数
  • NOW(): 返回当前的日期和时间,格式为YYYY-MM-DD HH:MM:SS。
  • CURRENT_TIME(): 返回当前的时间,格式为HH:MM:SS。
  • UTC_TIMESTAMP(): 返回当前的UTC日期和时间。

示例:

sql 复制代码
SELECT NOW();  -- 返回当前日期和时间,例如2024-10-28 14:30:00
SELECT CURRENT_TIME();  -- 返回当前时间,例如14:30:00
SELECT UTC_TIMESTAMP();  -- 返回当前UTC时间,例如2024-10-28 06:30:00
1.3.3 其他日期和时间函数
  • DATEDIFF(date1, date2): 返回两个日期之间的天数差。
  • DATE_ADD(date, INTERVAL expr type): 在指定日期上加上一个时间间隔。
  • DATE_SUB(date, INTERVAL expr type): 从指定日期减去一个时间间隔。
  • LAST_DAY(date): 返回指定日期所在月份的最后一天。
  • WEEKDAY(date): 返回指定日期是星期几(0表示星期一,6表示星期日)。

示例:

sql 复制代码
SELECT DATEDIFF('2024-10-28', '2024-10-01');  -- 返回27(两个日期之间的天数差)
SELECT DATE_ADD('2024-10-28', INTERVAL 10 DAY);  -- 返回2024-11-07(在当前日期上加10天)
SELECT DATE_SUB('2024-10-28', INTERVAL 10 DAY);  -- 返回2024-10-18(从当前日期减去10天)
SELECT LAST_DAY('2024-10-15');  -- 返回2024-10-31(2024年10月的最后一天)
SELECT WEEKDAY('2024-10-28');  -- 返回0(表示2024年10月28日是星期一)

1.4 系统信息函数

1.4.1 获取MySQL服务器版本号、用户名和数据库名的函数
  • VERSION()VERSION(): 返回MySQL服务器的版本号。

    sql 复制代码
    SELECT VERSION();  -- 返回版本号,如8.0.32
  • CONNECTION_ID(): 返回当前连接的唯一ID。

    sql 复制代码
    SELECT CONNECTION_ID();  -- 返回连接ID,如487032
  • DATABASE()SCHEMA(): 返回当前选择的数据库名。

    sql 复制代码
    SELECT DATABASE();  -- 返回当前数据库名
  • USER(), CURRENT_USER(), SYSTEM_USER(), SESSION_USER(): 返回当前用户名称。

    sql 复制代码
    SELECT USER();  -- 返回当前用户名称,如'username'@'host'
1.4.2 其他系统信息函数
  • CHARSET(str)CHARACTER_SET(str): 返回字符串str的字符集。

    sql 复制代码
    SELECT CHARSET('text');  -- 返回字符串的字符集
  • COLLATION(str): 返回字符串str的排序规则。

    sql 复制代码
    SELECT COLLATION('text');  -- 返回字符串的排序规则
  • FOUND_ROWS(): 返回上一条SELECT语句符合条件的行数(受LIMIT语句影响)。

    sql 复制代码
    SELECT FOUND_ROWS();  -- 返回上一条查询符合条件的行数
  • LAST_INSERT_ID(): 返回最后生成的AUTO_INCREMENT值。

    sql 复制代码
    SELECT LAST_INSERT_ID();  -- 返回最后插入行的自增ID

1.5 条件判断函数

1.5.1 IF函数

IF(expr, val1, val2): 如果expr为真(非0,非NULL,非FALSE),则返回val1,否则返回val2

示例:

sql 复制代码
SELECT IF(10 > 5, '真', '假');  -- 返回真
1.5.2 IFNULL()函数

IFNULL(val1, val2): 如果val1不为NULL,则返回val1,否则返回val2

示例:

sql 复制代码
SELECT IFNULL(NULL, '默认值');  -- 返回默认值
SELECT IFNULL('非NULL值', '默认值');  -- 返回非NULL值
1.5.3 CASE函数

CASE expr WHEN condition THEN result [WHEN ... THEN ...] [ELSE result] END: 根据expr的值和condition的条件,返回相应的result。如果没有匹配的条件,且存在ELSE子句,则返回ELSE子句的结果。

示例:

sql 复制代码
SELECT CASE
    WHEN age < 18 THEN '儿童'
    WHEN age BETWEEN 18 AND 64 THEN '成人'
    ELSE '老年'
END
FROM users;  -- 根据年龄返回儿童、成人或老年

1.6 加密函数

要创建一个用户表并对其密码字段进行加密,你可以按照以下步骤操作:

  • 创建用户表(user):
sql 复制代码
CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    u_pass VARCHAR(255) NOT NULL
);
  • 插入数据时,对密码进行加密。这里我们可以使用SHA2()函数来进行加密,因为它提供了较强的安全性。以下是插入数据的示例:
sql 复制代码
-- 插入新用户
INSERT INTO user (username, u_pass)
VALUES ('newuser', SHA2('plainTextPassword', 256));

在这个例子中,'plainTextPassword'是你想要存储的明文密码,SHA2('plainTextPassword', 256)会生成一个SHA-256散列值,然后将这个散列值存储在u_pass字段中。

如果你想要使用MySQL的PASSWORD()函数来生成一个随机的、加盐的密码散列值,你需要确保你的MySQL版本支持这个函数(MySQL 5.7.6及以后版本)。以下是使用PASSWORD()函数的示例:

sql 复制代码
-- 插入新用户
INSERT INTO user (username, u_pass)
VALUES ('newuser', PASSWORD('plainTextPassword'));

请注意,PASSWORD()函数在不同版本的MySQL中可能有不同的行为,因此在实际应用中,你可能需要根据你的MySQL版本选择合适的加密方法。

在实际应用中,你还可能需要在用户登录时验证密码。这通常涉及到对用户输入的密码进行相同的散列处理,然后与数据库中存储的散列值进行比较。例如:

sql 复制代码
-- 验证用户登录
SELECT * FROM user
WHERE username = 'newuser' AND u_pass = SHA2('inputPassword', 256);

在这个例子中,'inputPassword'是用户输入的密码,SHA2('inputPassword', 256)会生成一个SHA-256散列值,然后与数据库中存储的散列值进行比较。

相关推荐
MrJson-架构师33 分钟前
4.银河麒麟V10(ARM) 离线安装 MySQL
arm开发·mysql
中草药z1 小时前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
地球资源数据云1 小时前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
Ahern_1 小时前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
夜半被帅醒2 小时前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
不爱学习的啊Biao2 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
破 风2 小时前
SpringBoot 集成 MongoDB
数据库·mongodb
Rverdoser2 小时前
MySQL-MVCC(多版本并发控制)
数据库·mysql
醒了就刷牙2 小时前
黑马Java面试教程_P9_MySQL
java·mysql·面试
m0_748233642 小时前
SQL数组常用函数记录(Map篇)
java·数据库·sql