当前位置: 首页 > news >正文

[MySQL基础3] 数据控制语言DCL和MySQL中的常用函数

DCL,即Data Control Language,用来管理数据库的用户和其访问权限


1. 用户管理

  • 用户查询:

    用户都在MySQL自带的user数据库中

    mysql> use mysql;mysql> select User from user;
    +------------------+
    | User             |
    +------------------+
    | mysql.infoschema |
    | mysql.session    |
    | mysql.sys        |
    | root             |
    +------------------+
    4 rows in set (0.00 sec)
    
  • 创建用户:

    一个用户由用户名和主机名(localhost)定义

    create user 用户名@主机名 identified by 密码;
    
    mysql> create user jack@localhost identified by '123';
    Query OK, 0 rows affected (0.01 sec)mysql> select User from user;
    +------------------+
    | User             |
    +------------------+
    | jack             |
    | mysql.infoschema |
    | mysql.session    |
    | mysql.sys        |
    | root             |
    +------------------+
    5 rows in set (0.00 sec)mysql> -- 在任意主机访问数据库
    mysql> create user amy@'%' identified by '123';
    Query OK, 0 rows affected (0.01 sec)mysql> select User from user;
    +------------------+
    | User             |
    +------------------+
    | amy              |
    | jack             |
    | mysql.infoschema |
    | mysql.session    |
    | mysql.sys        |
    | root             |
    +------------------+
    6 rows in set (0.00 sec)
    
  • 修改用户密码

    alter user 用户名@主机名 identified with mysql_native_password by 新密码
    

    其中mysql_native_password意为MySQL的本地密码

    mysql> alter user amy identified with mysql_native_password by 'abc';
    Query OK, 0 rows affected (0.01 sec)
    
  • 删除用户

    drop user 用户名@主机名
    
    mysql> drop user jack@localhost;
    Query OK, 0 rows affected (0.00 sec)mysql> drop user amy@'%';
    Query OK, 0 rows affected (0.00 sec)mysql> select User from user;
    +------------------+
    | User             |
    +------------------+
    | mysql.infoschema |
    | mysql.session    |
    | mysql.sys        |
    | root             |
    +------------------+
    4 rows in set (0.00 sec)
    

2. 权限控制

常用的权限有以下几种:

名称说明
all, all privileges所有权限
select查询数据
insert插入数据
update修改数据
delete删除数据
alter修改表
drop删除数据库/表/视图
create创建数据库/表

基本的常用命令:

  • 查询权限:

    show grants for 用户名@主机名
    
  • 授予权限:

    grant 权限列表 on 数据库名.表名 to 用户名@主机名
    

    注意, 授予和撤销都是要指定哪个数据库的哪个表数据库名.表名

  • 撤销权限:

    revoke 权限列表 on 数据库名.表名 from 用户名@主机名
    

例子:

mysql> show grants for jack@localhost;
+------------------------------------------+
| Grants for jack@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `jack`@`localhost` |
+------------------------------------------+-- 上面的意思是没有任何权限 仅能登录-- 授予jack对info.user表格的所有权限
mysql> grant all on info.user to jack@localhost;
Query OK, 0 rows affected (0.01 sec)-- 查看权限
mysql> show grants for jack@localhost;
+-------------------------------------------------------------+
| Grants for jack@localhost                                   |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jack`@`localhost`                    |
| GRANT ALL PRIVILEGES ON `info`.`user` TO `jack`@`localhost` |
+-------------------------------------------------------------+-- 登录jack用户后 可以查看到info数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| info               |
| information_schema |
| performance_schema |
+--------------------+-- 撤销jack用户权限(在root下)
mysql> revoke all on info.user from jack@localhost;
Query OK, 0 rows affected (0.01 sec)-- 这时jack能看到的数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.00 sec)-- 授予jack特定的权限
mysql> grant select, insert, update on info.user to jack@localhost;
Query OK, 0 rows affected (0.01 sec)-- 从jack登录,可以插入,查询,更改表的数据
mysql> use info;
Database changedmysql> insert into user values (1, 'aaa', 'F'), (2, 'bbb', 'M');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from user where gender='F';
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | aaa  | F      |
+------+------+--------+mysql> update user set name='qwe' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from user;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | qwe  | F      |
|    2 | bbb  | M      |
+------+------+--------+
2 rows in set (0.00 sec)-- 但是没有删除表的权限
mysql> drop table user;
ERROR 1142 (42000): DROP command denied to user 'jack'@'localhost' for table 'user'

介绍一下MySQL中的函数,主要分为四大类:字符串函数、数值函数、日期函数和流程函数


1. 字符串函数

MySQL中常用的内置字符串函数如下:

函数功能
concat(str1, ..., strn)拼接字符串, 相当于Java StringBuilder的append()
lower(str)转换为小写, 相当于python的lower()
upper(str)转换为大写, 相当于python的upper()
lpad(str, n, pad)用pad左填充至长度n, 相当于格式化字符串'%{pad}{n}s'.format(str)
rpad(str, n, pad)用pad右填充至长度n
trim(str)去掉字符串头尾空格, 相当于python的strip()
substring(str, st, len)去从下标st开始长度为len的子串, 相当于C++的substr(). 注意索引从1开始!

例子:

-- 用select做到打印内容
mysql> select concat('ab', 'cd');
+--------------------+
| concat('ab', 'cd') |
+--------------------+
| abcd               |
+--------------------+mysql> select lower('asda'), upper('fdf');
+---------------+--------------+
| lower('asda') | upper('fdf') |
+---------------+--------------+
| asda          | FDF          |
+---------------+--------------+mysql> select lpad('123', 10, '-'), rpad('123', 10, '*');
+----------------------+----------------------+
| lpad('123', 10, '-') | rpad('123', 10, '*') |
+----------------------+----------------------+
| -------123           | 123*******           |
+----------------------+----------------------+mysql> select trim('  asdsd3  ');
+--------------------+
| trim('  asdsd3  ') |
+--------------------+
| asdsd3             |
+--------------------+mysql> select substring('qwerty', 2, 3);
+---------------------------+
| substring('qwerty', 2, 3) |
+---------------------------+
| wer                       |
+---------------------------+

一个小案例:将user表中name的前面补0,至10位数。

mysql> select * from user;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | qwe  | F      |
|    2 | bbb  | M      |
+------+------+--------+mysql> update user set name=lpad(name, 5, '0');
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0mysql> select * from user;
+------+-------+--------+
| id   | name  | gender |
+------+-------+--------+
|    1 | 00qwe | F      |
|    2 | 00bbb | M      |
+------+-------+--------+

2. 数值函数

MySQL中常用的内置数值函数如下,跟绝大多数语言的用法都是一样的:

函数功能
ceil(x)向上取整,Java: Math.ceil(), Python: math.ceil()
floor(str)向下取整,Java: Math.floor(), Python: math.floor(),
mod(x, y)计算x % y
rand()0~1内随机数
round(x, y)四舍五入x, 保留y位小数
mysql> select ceil(1.3), floor(3.3), round(1/3, 3);
+-----------+------------+---------------+
| ceil(1.3) | floor(3.3) | round(1/3, 3) |
+-----------+------------+---------------+
|         2 |          3 |         0.333 |
+-----------+------------+---------------+
1 row in set (0.01 sec)mysql> select mod(5, 2), rand();
+-----------+--------------------+
| mod(5, 2) | rand()             |
+-----------+--------------------+
|         1 | 0.5711282347991394 |
+-----------+--------------------+
1 row in set (0.01 sec)

3. 日期函数

MySQL中常用的日期函数如下:

函数功能
curdate()当前日期
curtime()当前时间
now()当前日期和时间
year(date), month(date), day(date)获取指定date的年份,月份,日
date_add(date, interval expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
datediff(date1, date2)返回date1和date2之间的天数
mysql> select curdate(), curtime(), now();
+------------+-----------+---------------------+
| curdate()  | curtime() | now()               |
+------------+-----------+---------------------+
| 2025-07-19 | 15:31:28  | 2025-07-19 15:31:28 |
+------------+-----------+---------------------+mysql> select year('2024-3-3'), month('2025-04-21'), day(now());
+------------------+---------------------+------------+
| year('2024-3-3') | month('2025-04-21') | day(now()) |
+------------------+---------------------+------------+
|             2024 |                   4 |         19 |
+------------------+---------------------+------------+mysql> select date_add(now(), interval 2 day), date_add(curdate(), interval 3 month), date_add(now(), interval 1 year);
+---------------------------------+---------------------------------------+----------------------------------+
| date_add(now(), interval 2 day) | date_add(curdate(), interval 3 month) | date_add(now(), interval 1 year) |
+---------------------------------+---------------------------------------+----------------------------------+
| 2025-07-21 15:34:59             | 2025-10-19                            | 2026-07-19 15:34:59              |
+---------------------------------+---------------------------------------+----------------------------------+mysql> select date_add(now(), interval 2 second);
+------------------------------------+
| date_add(now(), interval 2 second) |
+------------------------------------+
| 2025-07-19 15:39:36                |
+------------------------------------+
1 row in set (0.00 sec)mysql> select date_add(now(), interval 2 week);
+----------------------------------+
| date_add(now(), interval 2 week) |
+----------------------------------+
| 2025-08-02 15:39:37              |
+----------------------------------+
1 row in set (0.00 sec)mysql> select datediff('2025-3-2 13:32:19', now());
+--------------------------------------+
| datediff('2025-3-2 13:32:19', now()) |
+--------------------------------------+
|                                 -139 |
+--------------------------------------+

案例:为user表格中增加日期列,并按照日期从早到晚排序查询

mysql> alter table user add column entrydate date;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0-- 设定数据的时间,并且再增加一列
mysql> update user set entrydate='2025-01-01' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> update user set entrydate=curdate() where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> insert into user values (3, 'asdasd', 'F', '2020-4-2');
Query OK, 1 row affected (0.01 sec)-- 查看一下
mysql> select * from user;
+------+--------+--------+------------+
| id   | name   | gender | entrydate  |
+------+--------+--------+------------+
|    1 | qwe    | F      | 2025-01-01 |
|    2 | bbb    | M      | 2025-07-19 |
|    3 | asdasd | F      | 2020-04-02 |
+------+--------+--------+------------+
3 rows in set (0.00 sec)-- 排序查询 日期从早到晚也就是距离今天从大到小
mysql> select name, datediff(curdate(), entrydate) as d from user order by d desc;
+--------+------+
| name   | d    |
+--------+------+
| asdasd | 1934 |
| qwe    |  199 |
| bbb    |    0 |
+--------+------+
3 rows in set (0.00 sec)

4. 流程控制函数

MySQL中常用的流程控制函数如下:

函数功能
if(value, t, f)如果value是true,返回t,否则f,相当于Java/C++三元运算符value ? t : f;
ifnull(v1, v2)如果v1不是null返回v1,否则返回v2,相当于Java/C++v1 == null ? v2 : v1;
case when [val1] then [ret1]...else [defalut] end如果val1为true则返回ret1,以此类推,最终返回default
case [expr] when [val1] then [ret1]...else [defalut] end如果expr的值为val1则返回ret1,以此类推,最终返回default. 相当于Java/C++的switch...case...default
mysql> select if(datediff(now(), '2024-3-4') > 0, 'yes', 'no');
+--------------------------------------------------+
| if(datediff(now(), '2024-3-4') > 0, 'yes', 'no') |
+--------------------------------------------------+
| yes                                              |
+--------------------------------------------------+mysql> select ifnull(null, '123');
+---------------------+
| ifnull(null, '123') |
+---------------------+
| 123                 |
+---------------------+-- 实现需求:查询表user,如果性别是F,就显示'女',性别是M,就显示'男'
mysql> select name,-> (case gender when 'F' then '女' when 'M' then '男' else '不男不女' end) as gen-> from user;
+--------+-----+
| name   | gen |
+--------+-----+
| qwe    | 女  |
| bbb    | 男  |
| asdasd | 女  |
+--------+-----+
3 rows in set (0.01 sec)
http://www.lryc.cn/news/593422.html

相关文章:

  • 一个基于阿里云的C端Java服务的整体项目架构
  • 阿里云ssl证书自动安装及续订(acme)
  • NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化
  • LRU算法及优化
  • SpringBoot五分钟快速入门指南
  • Java行为型模式---访问者模式
  • Nestjs框架: 理解 RxJS响应式编程的核心概念与实践
  • 如何构建未来的人-AI-环境智能教育生态系统
  • OpenCV 官翻 3 - 特征检测 Feature Detection
  • Vue 3 中导出 Excel 文件
  • 【Web APIs】JavaScript 自定义属性操作 ② ( H5 自定义属性 )
  • 光纤收发器上的指示灯各代表的含义
  • 【ChatOpenAI】常用方法详解
  • 如何设计一个软件项目管理系统:架构设计合集(六)
  • min_25筛学习笔记+牛客多校02E
  • AWS Partner: Sales Accreditation (Business)
  • C++命名空间深度解析:避免命名冲突的终极解决方案
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析
  • 【数据结构初阶】--双向链表(二)
  • 明细列表,明细grid中的默认按钮失效,配置按钮失效
  • windows wsl2-06-docker hello world
  • windows wsl ubuntu 如何安装 open-jdk8
  • rustdesk客户端编译
  • NX二次开发常用函数坐标转化UF_MTX4_csys_to_csys和UF_MTX4_vec3_multipl
  • 【REACT18.x】creat-react-app在添加eslint时报错Environment key “jest/globals“ is unknown
  • 【橘子分布式】gRPC(编程篇-中)
  • Vue3生命周期函数
  • SQL基础操作指南:约束、表设计与复杂查询
  • Oracle RU19.28补丁发布,一键升级稳
  • 在摄像机视图中想像在普通 3D 视口里那样随意移动