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个实例 |

相关推荐
希忘auto25 分钟前
详解MySQL安装
java·mysql
运维佬33 分钟前
在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题
mysql·adb·ssl
Leo.yuan38 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
Runing_WoNiu1 小时前
MySQL与Oracle对比及区别
数据库·mysql·oracle
天道有情战天下1 小时前
mysql锁机制详解
数据库·mysql
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙0011 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
CodingBrother1 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
精进攻城狮@1 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
小酋仍在学习1 小时前
光驱验证 MD5 校验和
数据库·postgresql