文章目录
- 一、常用的系统函数
- 1.1 数学函数
- 1.2 字符串函数
- 1.2.1 计算字符串字符数的函数和计算字符串长度的函数
- 1.2.2 字符串合并函数
- 1.2.3 字符串大小写转换函数
- 1.2.4 删除空格函数
- 1.2.5 取子串函数
- 1.2.6 其他字符串函数
- 1.3 日期和时间函数
- 1.3.1 获取当前系统日期及指定日期年、月、日的函数
- 1.3.2 获取当前系统日期时间的函数
- 1.3.3 其他日期和时间函数
- 1.4 系统信息函数
- 1.4.1 获取MySQL服务器版本号、用户名和数据库名的函数
- 1.4.2 其他系统信息函数
- 1.5 条件判断函数
- 1.5.1 IF函数
- 1.5.2 IFNULL()函数
- 1.5.3 CASE函数
- 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); |
示例:
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
的长度,以字节为单位。
示例:
SELECT CHAR_LENGTH('Hello World'); -- 返回11
SELECT LENGTH('Hello World'); -- 返回11(如果字符编码为单字节)
1.2.2 字符串合并函数
CONCAT(str1, str2, ...)
: 将多个字符串参数首尾相连。
示例:
SELECT CONCAT('Hello', ' ', 'World'); -- 返回Hello World
1.2.3 字符串大小写转换函数
LOWER(str)
或LCASE(str)
: 将字符串str
转换为小写。UPPER(str)
或UCASE(str)
: 将字符串str
转换为大写。
示例:
SELECT LOWER('Hello World'); -- 返回hello world
SELECT UPPER('Hello World'); -- 返回HELLO WORLD
1.2.4 删除空格函数
TRIM(str)
: 去除字符串str
两端的空格。LTRIM(str)
: 去除字符串str
左端的空格。RTRIM(str)
: 去除字符串str
右端的空格。
示例:
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
的子串。
示例:
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_str
为replace_str
。POSITION(search_str IN str)
或INSTR(str, search_str)
: 返回search_str
在str
中的位置。LTRIM(str, char_set)
: 去除字符串str
左端的指定字符集char_set
中的字符。RTRIM(str, char_set)
: 去除字符串str
右端的指定字符集char_set
中的字符。REVERSE(str)
: 返回字符串str
的反转字符串。
示例:
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)。
示例:
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日期和时间。
示例:
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表示星期日)。
示例:
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服务器的版本号。SELECT VERSION(); -- 返回版本号,如8.0.32
-
CONNECTION_ID()
: 返回当前连接的唯一ID。SELECT CONNECTION_ID(); -- 返回连接ID,如487032
-
DATABASE()
或SCHEMA()
: 返回当前选择的数据库名。SELECT DATABASE(); -- 返回当前数据库名
-
USER()
,CURRENT_USER()
,SYSTEM_USER()
,SESSION_USER()
: 返回当前用户名称。SELECT USER(); -- 返回当前用户名称,如'username'@'host'
1.4.2 其他系统信息函数
-
CHARSET(str)
或CHARACTER_SET(str)
: 返回字符串str
的字符集。SELECT CHARSET('text'); -- 返回字符串的字符集
-
COLLATION(str)
: 返回字符串str
的排序规则。SELECT COLLATION('text'); -- 返回字符串的排序规则
-
FOUND_ROWS()
: 返回上一条SELECT语句符合条件的行数(受LIMIT语句影响)。SELECT FOUND_ROWS(); -- 返回上一条查询符合条件的行数
-
LAST_INSERT_ID()
: 返回最后生成的AUTO_INCREMENT值。SELECT LAST_INSERT_ID(); -- 返回最后插入行的自增ID
1.5 条件判断函数
1.5.1 IF函数
IF(expr, val1, val2)
: 如果expr
为真(非0,非NULL,非FALSE),则返回val1
,否则返回val2
。
示例:
SELECT IF(10 > 5, '真', '假'); -- 返回真
1.5.2 IFNULL()函数
IFNULL(val1, val2)
: 如果val1
不为NULL,则返回val1
,否则返回val2
。
示例:
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
子句的结果。
示例:
SELECT CASEWHEN age < 18 THEN '儿童'WHEN age BETWEEN 18 AND 64 THEN '成人'ELSE '老年'
END
FROM users; -- 根据年龄返回儿童、成人或老年
1.6 加密函数
要创建一个用户表并对其密码字段进行加密,你可以按照以下步骤操作:
- 创建用户表(user):
CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,u_pass VARCHAR(255) NOT NULL
);
- 插入数据时,对密码进行加密。这里我们可以使用
SHA2()
函数来进行加密,因为它提供了较强的安全性。以下是插入数据的示例:
-- 插入新用户
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()
函数的示例:
-- 插入新用户
INSERT INTO user (username, u_pass)
VALUES ('newuser', PASSWORD('plainTextPassword'));
请注意,PASSWORD()
函数在不同版本的MySQL中可能有不同的行为,因此在实际应用中,你可能需要根据你的MySQL版本选择合适的加密方法。
在实际应用中,你还可能需要在用户登录时验证密码。这通常涉及到对用户输入的密码进行相同的散列处理,然后与数据库中存储的散列值进行比较。例如:
-- 验证用户登录
SELECT * FROM user
WHERE username = 'newuser' AND u_pass = SHA2('inputPassword', 256);
在这个例子中,'inputPassword'
是用户输入的密码,SHA2('inputPassword', 256)
会生成一个SHA-256散列值,然后与数据库中存储的散列值进行比较。