MySQL用户管理和高级SQL语句

发布于:2024-06-26 ⋅ 阅读:(24) ⋅ 点赞:(0)

 一、用户管理

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