MySQL用户管理和高级SQL语句

一、用户管理

1.新建用户

复制代码
mysql> create user 'zhangsan'@'localhost' identified by 'pwd123';
Query OK, 0 rows affected (0.00 sec)

mysql> create user 'lisi'@localhost identified by 'pwd123';
Query OK, 0 rows affected (0.00 sec)

mysql> create user 'wangwu'@'localhost' identified by 'pwd123';
Query OK, 0 rows affected (0.00 sec)

备注:

localhost:本地主机,可以使用IP地址,网段,主机名形式。用户可以从任意远程主机登录可以使用%。

创建的用户在MySQL数据库user里,使用查询语句可以查询创建的用户。

复制代码
mysql> use mysql;
Database changed

mysql> select * from user\G
或
mysql> select  user,authentication_string from user;
+---------------+-------------------------------------------+
| user          | authentication_string                     |
+---------------+-------------------------------------------+
| root          | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| zhangsan      | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| lisi          | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| wangwu        | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
+---------------+-------------------------------------------+
6 rows in set (0.00 sec)

2.删除用户

复制代码
mysql> drop user 'wangwu'@localhost;
Query OK, 0 rows affected (0.01 sec)

mysql> select  user,authentication_string from user;
+---------------+-------------------------------------------+
| user          | authentication_string                     |
+---------------+-------------------------------------------+
| root          | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| zhangsan      | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| lisi          | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
+---------------+-------------------------------------------+
5 rows in set (0.00 sec)
或
mysql> delete from mysql.user where user='zhangsan';
Query OK, 1 row affected (0.01 sec)

备注:

直接使用delete也可以进行删除。drop不仅删除了用户,而且还对相关权限也进行删除;delete只删除用户,权限依旧保留存在。

如果是同一个名称,多个账户。权限,登陆方式不同,需要在之后+and

mysql> delete from mysql.user where user='zhangsan' and host='localhost'

语法解读:删除本地登陆的zhangsan。

3.重命名用户

复制代码
mysql> rename user'zhangsan'@localhost to 'zhaoliu'@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> select  user,authentication_string from user;
+---------------+-------------------------------------------+
| user          | authentication_string                     |
+---------------+-------------------------------------------+
| root          | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| zhaoliu       | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
| lisi          | *353C33BC20A4B4B2281F3DAAE901DBD0A5224E24 |
+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

4.修改密码

(1)修改root登陆密码

方法一:当前登录者的密码

复制代码
mysql> set password=password('pwd321');
Query OK, 0 rows affected, 1 warning (0.00 sec)

方法二:

复制代码
[root@localhost ~]# mysqladmin -uroot -ppwd123 password '123456'
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

备注:

-ppwd123 旧密码;password '123456' 新密码。

会存在警告信息:提醒您在命令行 输入密码会不安全。

(2)root修改普通用户密码

方法一:

复制代码
mysql> set password for 'lisi'@'localhost'=password('pwd321');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set password for 'zhaoliu'@'localhost'=password('pwd123');
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

方法二:

复制代码
mysql> update mysql.user set authentication_string=password('pwd123') where user='zhangsan';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 1

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

备注:password('pwd123') 是一个函数,将括号内的明文密码生成为加密密码。

(3)忘记密码

方法一:

复制代码
[root@localhost ~]# vim /etc/my.cnf
[client]
skip-grant-tables  (跳过密码)
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot

mysql> update mysql.user set authentication_string='pwd123' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

方法二:

复制代码
[root@localhost ~]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
[root@localhost ~]# mysql -uroot
mysql> update mysql.user set authentication_string='pwd123' where user='root';

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

5.权限管理

(1)给予权限

复制代码
mysql> grant select on *.* to 'zhangsan'@'localhost' identified by 'pwd123';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

备注:

*.*: 前一个*表示所有库;后一个*表示所有表。

语法解读:给予zhangsan在所有库,所有表中select的权限。

复制代码
mysql> grant all on *.* to 'zhangsan'@'localhost' identified by 'pwd123';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> show grants for 'lisi'@'localhost';
或
mysql> select * from mysql.user\G;

备注:

语法解读:给予zhangsan所有库,所有表中所有权限。

(2)收回权限

复制代码
mysql> revoke update on *.* from 'zhangsan'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)

6.远程登陆

101服务器端

复制代码
mysql> grant all on *.* to 'aaa'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

备注:

% : 任意一个IP地址,但不包括local host。

192.168.10.%: 可以登录192.168.10.0的网段。

102客户端

复制代码
[root@localhost ~]# yum -y install mysql
[root@localhost ~]# mysql -uaaa -p123456 -h 192.168.10.101 -P 3306

备注:

-h 192.168.10.101 :允许主机登陆的主机

-P 3306 : 端口

二、MySQL 高级语句

1.select

(1)按关键字排序

复制代码
mysql> select name,level from t1 where level>=30 order by level desc;

语法解读:

根据t1表中level中大于等于30的等级用户进行降序排列

备注:

dese 降序;asc升序(默认升序)

order by A,B desc : A升序,B降序

order by A desc,B desc : A降序,B降序

order by A asc,B desc :A升序,B降序

(2)对结果进行分组

对查询结果进行分组,可以通过group by 实现,常见的聚合函数:计数(count)、求和(sum)、平均数(avg)、最大值(max)、最小值(min)。

复制代码
mysql> select count(name),level from t1 where level>=40 group by level;

语法解读:

统计在t1表中等级在40以上进行分组,每个等级有多少人。

复制代码
mysql> select count(name),level from t1 where level>=40 group by 
level order by count(name) desc;

语法解读:

等级在40以上,按照等级进行排序,并将每个等进行降序。

(3)限制结果条目

复制代码
mysql> select * from t1  order by level desc limit 5;

语法解读: 查询t1表中等级按照降序排列,取五条记录。

(4)设置别名

复制代码
mysql> select count(name) 人数,level 等级 from t1 where level>=45 group by level;
+--------+--------+
| 人数   | 等级   |
+--------+--------+
|      1 |     45 |
|      1 |     47 |
|      2 |     48 |
|      3 |     52 |
|      2 |     58 |
+--------+--------+
5 rows in set (0.00 sec)

(5)通配符

查询以l开头的名字记录.

复制代码
mysql> select * from t1 where name like 'l%';  
+------+---------+-------+
| id   | name    | level |
+------+---------+-------+
|  298 | leslieF |    40 |
|  271 | lisi    |    52 |
+------+---------+-------+

替换结尾的一个字符

复制代码
mysql> select * from t1 where name like 'lis_';
+------+------+-------+
| id   | name | level |
+------+------+-------+
|  271 | lisi |    52 |
+------+------+-------+
1 row in set (0.00 sec)

备注:

% : 表示零个,一个或多个字符。

_:表示单个字符。

(6)子查询

子查询又称内查询或者嵌套查询,指在一个查询语句中还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

复制代码
mysql> select name,level from t1 where id in (select id from t1 where
 level>=45);

语法解读:

先查出等级大于等于45的id,在判断t1表中id是否在内。

2.Null 值

复制代码
(创建表)
mysql> create table test (
    -> id int(10) not null auto_increment,
    -> name char(20),
    -> pass char(50),
    -> primary key (id)) engine=innodb charset=utf8;
Query OK, 0 rows affected (0.01 sec)

(在该表中输入信息)
mysql> insert into test(name,pass) values('aaa',password('pwd123'));
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;  (查询表内容)

备注1:

mysql> create table test ( (创建名为test的表)

-> id int(10) not null auto_increment, (id不允许为空且自动增长)

-> name char(20), (name字符长度)

-> pass char(50), (pass字符长度)

-> primary key (id)) engine=innodb charset=utf8; (主键是id,引擎,字符集)

Query OK, 0 rows affected (0.01 sec)

备注2:

NULL值和空值有什么区别:

  • 空值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
  • IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是空值的。
  • 空值的判断使用=''或者<>''来处理。
  • 在通过 count()计算有多少记录数时,如果遇到 NULL 值会自动忽略掉,遇到空值会加入到记录中进行计算。

3.正则表达式

复制代码
mysql> select * from t1 where name regexp '^zhang';
+------+----------+-------+
| id   | name     | level |
+------+----------+-------+
|  190 | zhangsan |    48 |
+------+----------+-------+
1 row in set (0.00 sec)

语法解读:

在t1表中查询以zhang开头的name字段。

备注:

|------------|-----------------|
| ^ | 以什么开始 |
| $ | 以什么结尾 |
| . | 匹配任何单个字符包括回车换行 |
| [a-z] | 匹配在方阔内的任意字符列表 |
| ^[a-z] | 匹配以什么字符开头的 |
| [^a-z] | 匹配不包含方阔内的任意字符列表 |
| p1|p2|p3 | 匹配任何模式p1,p2,p3 |
| * | 0个或多个前面的元素 |
| + | 1个或多个前面的元素 |
| ? | 0个或1个前面的元素 |
| {n} | 前面元素连续出现的n个实例 |
| .{n} | 前面元素出现的n个实例 |
| {m,n} | 匹配前面元素m到n个实例 |

相关推荐
whn19773 分钟前
达梦有多少个模式
数据库
王柏龙18 分钟前
Entity Framework Core (EF Core) 中Database
数据库·microsoft
时序数据说22 分钟前
时序数据库IoTDB的优势场景分析
大数据·数据库·物联网·时序数据库·iotdb
MacroZheng33 分钟前
换掉Navicat!一款集成AI功能的数据库管理工具,功能真心强大!
java·后端·mysql
是阿建吖!35 分钟前
【Redis】初识Redis(定义、特征、使用场景)
数据库·redis·缓存
Leo.yuan36 分钟前
数据处理工具是做什么的?常见数据处理方法介绍
大数据·数据库·人工智能·python·信息可视化
旧时光巷1 小时前
SQL基础⑫ | 视图篇
数据库·sql·学习·mysql·oracle·视图
阿里云大数据AI技术1 小时前
[VLDB 2025]面向云计算平台的多模态慢查询根因排序
大数据·数据库·人工智能
二向箔reverse2 小时前
在 CentOS 中安装 MySQL 的过程与问题解决方案
linux·mysql·centos
WJ.Polar2 小时前
Python与Mysql
开发语言·数据库·python·mysql