【MySQL】内置函数

这篇具有很好参考价值的文章主要介绍了【MySQL】内置函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

👉函数👈

日期函数

【MySQL】内置函数,零基础入门MySQL,数据库,MySQL

  • 获得年月日:
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2023-05-16     |
+----------------+
1 row in set (0.00 sec)
  • 获得时分秒:
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 19:13:44       |
+----------------+
1 row in set (0.00 sec
  • 获得时间戳:
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2023-05-16 19:14:25 |
+---------------------+
1 row in set (0.01 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2023-05-16 19:38:20 |
+---------------------+
1 row in set (0.00 sec)

同时使用 current_date 和 current_time 就相当于 current_timestamp

mysql> select current_date() 日期, current_time() 时间;
+------------+----------+
| 日期       | 时间     |
+------------+----------+
| 2023-05-16 | 19:16:12 |
+------------+----------+
1 row in set (0.00 sec)
  • 在日期的基础上加日期:
-- 加上十天
mysql> select date_add('2023-5-16', interval 10 day);
+----------------------------------------+
| date_add('2023-5-16', interval 10 day) |
+----------------------------------------+
| 2023-05-26                             |
+----------------------------------------+
1 row in set (0.00 sec)

-- 加上一年
mysql> select date_add('2023-5-16', interval 1 year);
+----------------------------------------+
| date_add('2023-5-16', interval 1 year) |
+----------------------------------------+
| 2024-05-16                             |
+----------------------------------------+
1 row in set (0.00 sec)

-- 加上一秒
mysql> select date_add('2023-5-16', interval 1 second);
+------------------------------------------+
| date_add('2023-5-16', interval 1 second) |
+------------------------------------------+
| 2023-05-16 00:00:01                      |
+------------------------------------------+
1 row in set (0.00 sec)
  • 在日期的基础上减去时间:
-- 减去十天
mysql> select date_sub('2023-5-16', interval 10 day);
+----------------------------------------+
| date_sub('2023-5-16', interval 10 day) |
+----------------------------------------+
| 2023-05-06                             |
+----------------------------------------+
1 row in set (0.00 sec)

-- 减去一年
mysql> select date_sub('2023-5-16', interval 1 year);
+----------------------------------------+
| date_sub('2023-5-16', interval 1 year) |
+----------------------------------------+
| 2022-05-16                             |
+----------------------------------------+
1 row in set (0.00 sec)

-- 减去一秒
mysql> select date_sub('2023-5-16', interval 1 second);
+------------------------------------------+
| date_sub('2023-5-16', interval 1 second) |
+------------------------------------------+
| 2023-05-15 23:59:59                      |
+------------------------------------------+
1 row in set (0.00 sec)
  • 计算两个日期之间相差多少天:
mysql> select datediff('2023-5-26', '2023-05-06');
+-------------------------------------+
| datediff('2023-5-26', '2023-05-06') |
+-------------------------------------+
|                                  20 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> select datediff(now(), '1949-10-01');
+-------------------------------+
| datediff(now(), '1949-10-01') |
+-------------------------------+
|                         26890 |
+-------------------------------+
1 row in set (0.00 sec)
  • 获取时间戳中的日期
mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2023-05-16  |
+-------------+
1 row in set (0.00 sec)

mysql> select date(current_timestamp());
+---------------------------+
| date(current_timestamp()) |
+---------------------------+
| 2023-05-16                |
+---------------------------+
1 row in set (0.00 sec)

创建生日表

mysql> create table birthday(
    -> id int primary key auto_increment,
    -> d date not null,
    -> t timestamp);

mysql> desc birthday;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id    | int(11)   | NO   | PRI | NULL              | auto_increment              |
| d     | date      | NO   |     | NULL              |                             |
| t     | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)

mysql> insert into birthday (d) values('1949-10-01');
Query OK, 1 row affected (0.00 sec)

mysql> insert into birthday (d) values(current_date());
Query OK, 1 row affected (0.01 sec)

-- 插入数据时,timestamp类型会默认更新为当前的最新时间
mysql> select * from birthday;
+----+------------+---------------------+
| id | d          | t                   |
+----+------------+---------------------+
|  1 | 1949-10-01 | 2023-05-16 19:30:43 |
|  2 | 2023-05-16 | 2023-05-16 19:30:54 |
+----+------------+---------------------+
2 rows in set (0.00 sec)

-- 将t字段的类型更改为datetime类型
mysql> alter table birthday modify t datetime;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> desc birthday;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| d     | date     | NO   |     | NULL    |                |
| t     | datetime | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> select * from birthday;
+----+------------+---------------------+
| id | d          | t                   |
+----+------------+---------------------+
|  1 | 1949-10-01 | 2023-05-16 19:30:43 |
|  2 | 2023-05-16 | 2023-05-16 19:30:54 |
+----+------------+---------------------+
2 rows in set (0.00 sec)

mysql> insert into birthday (d, t) values(current_date(), current_timestamp());
Query OK, 1 row affected (0.01 sec)

mysql> select * from birthday;
+----+------------+---------------------+
| id | d          | t                   |
+----+------------+---------------------+
|  1 | 1949-10-01 | 2023-05-16 19:30:43 |
|  2 | 2023-05-16 | 2023-05-16 19:30:54 |
|  3 | 2023-05-16 | 2023-05-16 19:37:02 |
+----+------------+---------------------+
3 rows in set (0.00 sec)

创建留言表

mysql> create table msg(
    -> id int unsigned primary key auto_increment,
    -> content varchar(100) not null,
    -> sendtime datetime
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> desc msg;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| content  | varchar(100)     | NO   |     | NULL    |                |
| sendtime | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

-- 插入数据
mysql> insert into msg (content, sendtime) values('莫道桑榆晚,为霞尚漫天', now());
Query OK, 1 row affected (0.01 sec)

mysql> insert into msg (content, sendtime) values('须知少年凌云志,曾许人间第一流', now());
Query OK, 1 row affected (0.00 sec)

-- 显示所有留言及留言的时间
mysql> select * from msg;
+----+-----------------------------------------------+---------------------+
| id | content                                       | sendtime            |
+----+-----------------------------------------------+---------------------+
|  1 | 莫道桑榆晚,为霞尚漫天                        | 2023-05-16 19:58:10 |
|  2 | 须知少年凌云志,曾许人间第一流                | 2023-05-16 19:59:30 |
+----+-----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

-- 查询在两分钟内发布的帖子
mysql> insert into msg (content, sendtime) values('仰天长笑出门去,我辈岂是蓬蒿人', now());
Query OK, 1 row affected (0.01 sec)

mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
+----+-----------------------------------------------+---------------------+
| id | content                                       | sendtime            |
+----+-----------------------------------------------+---------------------+
|  3 | 仰天长笑出门去,我辈岂是蓬蒿人                | 2023-05-16 20:03:37 |
+----+-----------------------------------------------+---------------------+
1 row in set (0.00 sec)

-- 理解:
------------------------------|-----------|-------------|------------------
                            初始时间     now()       初始时间+2min

字符串函数

【MySQL】内置函数,零基础入门MySQL,数据库,MySQL

  • 查看字符串的字符集
-- 此处字符串的字符集与配置文件的默认字符集有关
mysql> select charset('hello world!');
+-------------------------+
| charset('hello world!') |
+-------------------------+
| utf8                    |
+-------------------------+
1 row in set (0.00 sec)

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
  • 获取 emp 表的 ename 和 deptno 列的字符集
mysql> select charset(ename) from emp;
+----------------+
| charset(ename) |
+----------------+
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
+----------------+
14 rows in set (0.00 sec)

mysql> select charset(deptno) from emp;
+-----------------+
| charset(deptno) |
+-----------------+
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
| binary          |
+-----------------+
14 rows in set (0.00 sec)
  • 数字能够直接使用二进制来表示,不需要再进行编码,所以数字的 charset 为 binary,而字符串可能需要进行编码,其 charset 与配置文件中的 charset 和建表时指定的 charset 有关。

  • 当出现乱码问题时,可能是因为存储数据的编码和取出数据的编码是不一样的。出现乱码问题时,可能查看 charset 是否一致。

  • 字符串拼接

mysql> select concat('hello ', 'world!');
+----------------------------+
| concat('hello ', 'world!') |
+----------------------------+
| hello world!               |
+----------------------------+
1 row in set (0.00 sec)

-- 尽管是数字也能够直接拼接
mysql> select concat('hello ', 123, ' ', '3.1415926');
+-----------------------------------------+
| concat('hello ', 123, ' ', '3.1415926') |
+-----------------------------------------+
| hello 123 3.1415926                     |
+-----------------------------------------+
1 row in set (0.00 sec)
  • 显示 exam_result 表中的信息,显示格式:“XXX的语文XXX分,数学XXX分,英语XXX分
mysql> select concat(name, '的语文', chinese, '分,数学', math, '分,英语', english, '分') 全班成绩 from exam_result;
+-------------------------------------------------+
| 全班成绩                                        |
+-------------------------------------------------+
| 唐三藏的语文67,数学98,英语56|
| 孙悟空的语文87,数学78,英语77|
| 猪悟能的语文88,数学98,英语90|
| 曹孟德的语文82,数学84,英语67|
| 刘玄德的语文55,数学85,英语45|
| 孙权的语文70,数学73,英语78|
| 宋公明的语文75,数学65,英语30|
+-------------------------------------------------+
7 rows in set (0.00 sec)
  • 求字符串的长度
mysql> select length('hello world!');
+------------------------+
| length('hello world!') |
+------------------------+
|                     12 |
+------------------------+
1 row in set (0.00 sec)

mysql> select length(3.1415926);
+-------------------+
| length(3.1415926) |
+-------------------+
|                 9 |
+-------------------+
1 row in set (0.00 sec)

-- 求出月薪超过两千的人的名字的长度
mysql> select ename, sal, length(ename) len from emp where sal>2000;
+-------+---------+------+
| ename | sal     | len  |
+-------+---------+------+
| JONES | 2975.00 |    5 |
| BLAKE | 2850.00 |    5 |
| CLARK | 2450.00 |    5 |
| SCOTT | 3000.00 |    5 |
| KING  | 5000.00 |    4 |
| FORD  | 3000.00 |    4 |
+-------+---------+------+
6 rows in set (0.00 sec)

length 函数返回的是字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)。

-- utf-8编码的一个汉字占三个字节
mysql> select length('你好');
+------------------+
| length('你好')   |
+------------------+
|                6 |
+------------------+
1 row in set (0.00 sec)
  • 获取字符串的子串
mysql> select substring('123456', 3);
+------------------------+
| substring('123456', 3) |
+------------------------+
| 3456                   |
+------------------------+
1 row in set (0.00 sec)

mysql> select substring('123456', 0);
+------------------------+
| substring('123456', 0) |
+------------------------+
|                        |
+------------------------+
1 row in set (0.00 sec)

mysql> select substring('123456', 3, 4);
+---------------------------+
| substring('123456', 3, 4) |
+---------------------------+
| 3456                      |
+---------------------------+
1 row in set (0.00 sec)

mysql> select substring('你好,世界', 1, 2);
+------------------------------------+
| substring('你好,世界', 1, 2)      |
+------------------------------------+
| 你好                               |
+------------------------------------+
1 row in set (0.00 sec)

mysql> select substring('你好,世界', 1, 4);
+------------------------------------+
| substring('你好,世界', 1, 4)      |
+------------------------------------+
| 你好,世                           |
+------------------------------------+
1 row in set (0.00 sec)
  • 数据库的字符串下标是从 1 开始的,原因是使用数据库的人可能不是程序员,只是普通用户。
  • substring 截取子串就是按照一个个字符来截取的,而不是按照字节来截取的。
  • substring 的第一个参数是要截取的字符串,第二个参数是截取的起始位置,第三个参数是截取多少个字符。如果省略第三个参数,默认截取到字符串的最后一个字符。
  • 字符串替换
-- 'xyz'是要被替换的字符串,'XYZ'是用来替换的字符串
-- 如果原字符串中没有要被替换的字符串,则无法完成替换
mysql> select replace('abcdxyz1234', 'xyz', 'XYZ');
+--------------------------------------+
| replace('abcdxyz1234', 'xyz', 'XYZ') |
+--------------------------------------+
| abcdXYZ1234                          |
+--------------------------------------+
1 row in set (0.00 sec)

-- replace是全部替换,而不是部分替换
mysql> select replace('abcdxyz1234xyz', 'xyz', 'XYZ');
+-----------------------------------------+
| replace('abcdxyz1234xyz', 'xyz', 'XYZ') |
+-----------------------------------------+
| abcdXYZ1234XYZ                          |
+-----------------------------------------+
1 row in set (0.00 sec)
  • 大小写转换
mysql> select lcase('ABCD');
+---------------+
| lcase('ABCD') |
+---------------+
| abcd          |
+---------------+
1 row in set (0.00 sec)

mysql> select ucase('abcd');
+---------------+
| ucase('abcd') |
+---------------+
| ABCD          |
+---------------+
1 row in set (0.00 sec)

以首字母大写的方式显示所有员工的姓名

mysql> select concat(ucase(substring(ename, 1, 1)), lcase(substring(ename, 2))) name from emp;
+--------+
| name   |
+--------+
| Smith  |
| Allen  |
| Ward   |
| Jones  |
| Martin |
| Blake  |
| Clark  |
| Scott  |
| King   |
| Turner |
| Adams  |
| James  |
| Ford   |
| Miller |
+--------+
14 rows in set (0.00 sec)
  • 查找子串
-- instr返回的是子串第一次出现的位置,没有出现则返回零
-- instr查找子串也是以字符为单位的,而不是以字节为单位
mysql> select instr('abcd1234', 'b');
+------------------------+
| instr('abcd1234', 'b') |
+------------------------+
|                      2 |
+------------------------+
1 row in set (0.00 sec)

mysql> select instr('abcd1234', 4);
+----------------------+
| instr('abcd1234', 4) |
+----------------------+
|                    8 |
+----------------------+
1 row in set (0.00 sec)

mysql> select instr('abcd1234', 'e');
+------------------------+
| instr('abcd1234', 'e') |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)

找出名字中包含 TH 的员工

-- 使用通配符
mysql> select * from emp where ename like '%TH%';
+--------+-------+-------+------+---------------------+--------+------+--------+
| empno  | ename | job   | mgr  | hiredate            | sal    | comm | deptno |
+--------+-------+-------+------+---------------------+--------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL |     20 |
+--------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)

-- 内置函数也可以出现在where子句中
mysql> select * from emp where instr(ename, 'TH');
+--------+-------+-------+------+---------------------+--------+------+--------+
| empno  | ename | job   | mgr  | hiredate            | sal    | comm | deptno |
+--------+-------+-------+------+---------------------+--------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL |     20 |
+--------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)
  • 字符串比较
-- 和C语言的strcmp函数一直,一直比较两个字符串中
-- 的字符直到比较出结果或者直到对方到字符串的末尾
-- 字符的大小是按照ASCII码进行比较的
mysql> select strcmp('abc', 'abcd');
+-----------------------+
| strcmp('abc', 'abcd') |
+-----------------------+
|                    -1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select strcmp('abcd', 'abcd');
+------------------------+
| strcmp('abcd', 'abcd') |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)

mysql> select strcmp('abce', 'abcd');
+------------------------+
| strcmp('abce', 'abcd') |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

-- 找出岗位是CLERK的所有员工
mysql> select * from emp where strcmp(job, 'CLERK') = 0;
+--------+--------+-------+------+---------------------+---------+------+--------+
| empno  | ename  | job   | mgr  | hiredate            | sal     | comm | deptno |
+--------+--------+-------+------+---------------------+---------+------+--------+
| 007369 | SMITH  | CLERK | 7902 | 1980-12-17 00:00:00 |  800.00 | NULL |     20 |
| 007876 | ADAMS  | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL |     20 |
| 007900 | JAMES  | CLERK | 7698 | 1981-12-03 00:00:00 |  950.00 | NULL |     30 |
| 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL |     10 |
+--------+--------+-------+------+---------------------+---------+------+--------+
4 rows in set (0.00 sec)
  • 从左右截取字符串
mysql> select left('abcd', 1);
+-----------------+
| left('abcd', 1) |
+-----------------+
| a               |
+-----------------+
1 row in set (0.00 sec)

mysql> select left('abcd', 3);
+-----------------+
| left('abcd', 3) |
+-----------------+
| abc             |
+-----------------+
1 row in set (0.00 sec)

mysql> select right('abcd', 3);
+------------------+
| right('abcd', 3) |
+------------------+
| bcd              |
+------------------+
1 row in set (0.00 sec)

mysql> select right('abcd', 1);
+------------------+
| right('abcd', 1) |
+------------------+
| d                |
+------------------+
1 row in set (0.00 sec)
  • 去重空格
-- trim不会去除字符串中间的空格
mysql> select trim('abcd 1234') ret;
+-----------+
| ret       |
+-----------+
| abcd 1234 |
+-----------+
1 row in set (0.00 sec)

-- trim会去除左右两边的空格
mysql> select trim('   abcd 1234  ') ret;
+-----------+
| ret       |
+-----------+
| abcd 1234 |
+-----------+
1 row in set (0.00 sec)

-- ltrim只会去除字符串左边的空格
mysql> select ltrim('   abcd 1234  ') ret;
+-------------+
| ret         |
+-------------+
| abcd 1234   |
+-------------+
1 row in set (0.00 sec)

-- rtrim只会去除字符串右边的空格
mysql> select rtrim('   abcd 1234  ') ret;
+--------------+
| ret          |
+--------------+
|    abcd 1234 |
+--------------+
1 row in set (0.00 sec)

数学函数

【MySQL】内置函数,零基础入门MySQL,数据库,MySQL

  • 绝对值
mysql> select abs(-10);
+----------+
| abs(-10) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)

mysql> select abs(-3.14);
+------------+
| abs(-3.14) |
+------------+
|       3.14 |
+------------+
1 row in set (0.00 sec)
  • 十进制转二进制
mysql> select bin(10);
+---------+
| bin(10) |
+---------+
| 1010    |
+---------+
1 row in set (0.00 sec)

mysql> select bin(-1);
+------------------------------------------------------------------+
| bin(-1)                                                          |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111111 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 十进制转十六进制
mysql> select hex(10);
+---------+
| hex(10) |
+---------+
| A       |
+---------+
1 row in set (0.00 sec)

mysql> select hex(32);
+---------+
| hex(32) |
+---------+
| 20      |
+---------+
1 row in set (0.00 sec)
  • 进制转换
-- 将十进制的10转成二进制
mysql> select conv(10, 10, 2);
+-----------------+
| conv(10, 10, 2) |
+-----------------+
| 1010            |
+-----------------+
1 row in set (0.00 sec)

-- 将二进制的10转成十进制
mysql> select conv(10, 2, 10);
+-----------------+
| conv(10, 2, 10) |
+-----------------+
| 2               |
+-----------------+
1 row in set (0.00 sec)
  • 向上取整
mysql> select ceiling(3.14);
+---------------+
| ceiling(3.14) |
+---------------+
|             4 |
+---------------+
1 row in set (0.00 sec)

mysql> select ceiling(-3.14);
+----------------+
| ceiling(-3.14) |
+----------------+
|             -3 |
+----------------+
1 row in set (0.00 sec)
  • 向下取整
mysql> select floor(3.14);
+-------------+
| floor(3.14) |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)

mysql> select floor(-3.14);
+--------------+
| floor(-3.14) |
+--------------+
|           -4 |
+--------------+
1 row in set (0.00 sec)
  • 格式化
-- 保留2位小数位数(小数四舍五入)
mysql> select format(12.3456, 2);
+--------------------+
| format(12.3456, 2) |
+--------------------+
| 12.35              |
+--------------------+
1 row in set (0.00 sec)

mysql> select format(100, 2);
+----------------+
| format(100, 2) |
+----------------+
| 100.00         |
+----------------+
1 row in set (0.00 sec)
  • 随机数
-- rand函数随机产生[0.0, 1.0)之间的数
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.6638928788377837 |
+--------------------+
1 row in set (0.00 sec)

mysql> select rand();
+---------------------+
| rand()              |
+---------------------+
| 0.21991669872767916 |
+---------------------+
1 row in set (0.00 sec)

-- 对rand函数进行加减乘除就可以拼出任意区间的随机数
mysql> select rand()-rand();
+---------------------+
| rand()-rand()       |
+---------------------+
| -0.7718694859853661 |
+---------------------+
1 row in set (0.00 sec)

-- 产生[0, 100)之间的随机数
mysql> select 100*rand();
+------------------+
| 100*rand()       |
+------------------+
| 45.6843777053844 |
+------------------+
1 row in set (0.00 sec)

rand 函数可以配合 format 函数随机出整数。

  • 取模
mysql> select mod(1, 3);
+-----------+
| mod(1, 3) |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

mysql> select mod(-1, 3);
+------------+
| mod(-1, 3) |
+------------+
|         -1 |
+------------+
1 row in set (0.00 sec)

mysql> select mod(3.14, 2);
+--------------+
| mod(3.14, 2) |
+--------------+
|         1.14 |
+--------------+
1 row in set (0.00 sec)

注:有关负数取模的原则,可以自行查询,本人就不赘述了。

其它函数

  • 查询当前用户
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

【MySQL】内置函数,零基础入门MySQL,数据库,MySQL

【MySQL】内置函数,零基础入门MySQL,数据库,MySQL

查看 user 表

mysql> use mysql;
mysql> select * from user;
-- 查看user表结构
mysql> desc user;

【MySQL】内置函数,零基础入门MySQL,数据库,MySQL
【MySQL】内置函数,零基础入门MySQL,数据库,MySQL
user 函数的实现原理

-- user函数可以通过select加concat函数来实现
mysql> select concat(User, '@', Host) `user()` from user where User='root';
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
  • md5 函数
mysql> select md5('a');
+----------------------------------+
| md5('a')                         |
+----------------------------------+
| 0cc175b9c0f1b6a831c399e269772661 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select md5('ab');
+----------------------------------+
| md5('ab')                        |
+----------------------------------+
| 187ef4436122d1cc2f40dc2b92f0eba0 |
+----------------------------------+
1 row in set (0.00 sec)
  • md5 算法对一个字符串进行 md5 摘要,摘要后等到一个 32 位的字符串,不管原字符串是多长。
  • 尽管两个字符串只相差一个字符,md5 算法形成的两个摘要相差也很大。
  • md5 算法可以对秘密进行摘要,从而起到用户的密码,因为很难通过 md5 算法形成的摘要破解出原密码。
-- authentication_string 是密码通过md5算法形成的摘要
mysql> select user, host, authentication_string from user;
mysql> select user, host, authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

模拟用户注册的场景文章来源地址https://www.toymoban.com/news/detail-613054.html

-- 在自己的数据库中进行模拟
mysql> select database();
+------------+
| database() |
+------------+
| my_db      |
+------------+
1 row in set (0.00 sec)

-- 创建用户表
mysql> create table if not exists user(
    -> id bigint unsigned primary key auto_increment,
    -> name varchar(32) not null,
    -> password char(64) not null,
    -> reg_time datetime not null
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into user (name, password, reg_time) values('张三', md5('123456'), now());
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+--------+----------------------------------+---------------------+
| id | name   | password                         | reg_time            |
+----+--------+----------------------------------+---------------------+
|  1 | 张三   | e10adc3949ba59abbe56e057f20f883e | 2023-05-16 23:17:41 |
+----+--------+----------------------------------+---------------------+
1 row in set (0.00 sec)

mysql> select * from user where md5('123456') = password;
+----+--------+----------------------------------+---------------------+
| id | name   | password                         | reg_time            |
+----+--------+----------------------------------+---------------------+
|  1 | 张三   | e10adc3949ba59abbe56e057f20f883e | 2023-05-16 23:17:41 |
+----+--------+----------------------------------+---------------------+
1 row in set (0.00 sec)
  • 用户表中储存的密码都不是真正用户的密码,都是摘要来的,因此后端进行用户认证比较的都是摘要。
  • 涉及到 md5 算法和密码等私密的信息,无法通过上翻来找到历史输过的 SQL 语句。

  • password 函数
-- MySQL数据库使用password函数对用户加密
mysql> select password('123456');
+-------------------------------------------+
| password('123456')                        |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select length(password('123456'));
+----------------------------+
| length(password('123456')) |
+----------------------------+
|                         41 |
+----------------------------+
1 row in set, 1 warning (0.00 sec)
  • ifnull 函数
-- ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
-- ifnull就相当于是三目运算符

mysql> select ifnull('a', 'b');
+------------------+
| ifnull('a', 'b') |
+------------------+
| a                |
+------------------+
1 row in set (0.00 sec)

mysql> select ifnull(null, 'b');
+-------------------+
| ifnull(null, 'b') |
+-------------------+
| b                 |
+-------------------+
1 row in set (0.00 sec)

mysql> select ifnull('a', null);
+-------------------+
| ifnull('a', null) |
+-------------------+
| a                 |
+-------------------+
1 row in set (0.00 sec)

到了这里,关于【MySQL】内置函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库入门到精通1--基础篇(MySQL概述,SQL)

    目前主流的关系型数据库管理系统: Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。 MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收购了Sun公司。 目前Oracle推出了收费版本的MySQL,也提供了免费的社区版本。 SQL Server:Microsoft 公司推出的收费的中

    2024年02月07日
    浏览(50)
  • 【Mysql数据库从0到1】-入门基础篇--mysql基本使用

    mysql5.7和之前版本,默认字符集为latin1,插入中文字符会出现乱码。在使用5.7及之前的版本时候需要将字符编码修改为utf8字符集,utf8字符集指的是utf8mb3。 从mysql8.0开始,数据库默认字符编码改为utf8mb4。 Mysql 5.7 默认身份插件是 mysql_native_password Mysql 8.0 默认的身份插件是 cac

    2024年02月07日
    浏览(54)
  • 零基础学MySQL(五)-- 详细讲解数据库中的常用函数

    提供 student 表 1️⃣count 函数 count 表示返回行的总数 (1)基本语法 (2)基本练习 统计一个班级共有多少学生? 统计数学成绩大于 90 的学生有多少个? 统计总分大于 250 的人数有多少? (3)注意细节 count(*) 和 count(列) 的区别: count(*) 返回满足条件的记录的行数 count(列

    2024年01月19日
    浏览(60)
  • 【Mysql数据库从0到1】-入门基础篇--用户与权限管理

    Mysql 用户分为root用户和普通用户,其中root用户是数据库超级管理员,拥有所有权限(创建、删除、修改密码、授权等管理权限),普通用户只拥有被授予的权限。 Mysql数据库的安全性通过账户管理来保障。 1.1 🍃 Mysql服务器登录 🍀 简单使用 🍀 复杂使用 1.2 🍃 用户创建

    2024年02月07日
    浏览(70)
  • HarmonyOS云开发基础认证题目记录——包括第一期:Serverless基础、第二期:快速构建用户认证系统、第三期:云函数入门指南、第四期:云数据库入门指南、第五期:云存储入门指南。

    1. 【判断题】  应用架构的演进依次经历了微服务架构、单体架构、Serverless架构等阶段。 错误 2. 【判断题】  认证服务手机号码登录需要填写国家码。 正确 3. 【判断题】  认证服务在绑定微信账号后就不能再绑定QQ账号了。 错误 4. 【判断题】  云函数可以根据函数的实际

    2024年02月05日
    浏览(117)
  • MYSQL数据库基础(数据库)

    用户在客户端输入SQL语句 客户端会把SQL通过网络发送给服务器 服务器会执行这个SQL,把结果返回给客户端 客户端接收到结果后,显示到界面上 1.创建数据库 1.1 语法 1.2 解析 已经有了数据库,为何还要创建 计算机中,不同的词有不同的含义,如一门学科、一类软件、某个具

    2024年02月07日
    浏览(53)
  • 数据库基础——8.单行函数

    这篇文章我们来讲一下数据库里面的单行函数 目录 1. 函数的理解 1.1 什么是函数 1.2 不同DBMS函数的差异 1.3 MySQL的内置函数及分类 2. 数值函数 2.1 基本函数 2.2 角度与弧度互换函数 2.3 三角函数  2.4 指数与对数  2.5 进制间的转换  3. 字符串函数  4. 日期和时间函数  4.1 获取日

    2024年02月06日
    浏览(43)
  • 完全从零Java自学系列【入门篇】(第四课:Mysql服务端安装&使用客户端操作数据库&初识SQL基础操作&Java中使用第三方包&Java数据库操作&初步理解面相对象真正的意义之桥接设计模式)

      数据库是专门用来存储一系列集合数据的地方。所有的文件都可以被称之为库,当应用场景没那么复杂的时候,简单的应用程序用文本就可以了。数据库的意义是为了设计更好的保障数据安全(如多线程操作)、数据一致、索引(如何在庞大的数据中快速查找)等等一系

    2024年02月21日
    浏览(62)
  • MySQL8.0数据库开窗函数

          数据库开窗函数是一种在SQL中使用的函数,它可以用来对结果集中的数据进行分组和排序,以便更好地分析和处理数据。开窗函数与聚合函数不同,它不会将多行数据聚合成一行,而是保留每一行数据,并对其进行分组和排序。 常见的开窗函数包括ROW_NUMBER()、RANK()、

    2024年02月08日
    浏览(65)
  • GaussDB数据库基础函数介绍-上

    目录 一、函数在数据库中的作用 二、GaussDB常用基础函数介绍与示例 1、数字操作函数 2、时间和日期处理函数 3、类型转换函数 4、数组函数 5、范围函数 6、窗口函数 7、聚集函数 8、安全函数 9、系统信息函数 10、动态脱敏函数. Tip: 由于篇幅缘故,“5.范围函数、6.窗口函数

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包