MySQL学习

MySQL入门操作

1、连接MySQL

-- 格式
mysql [-h主机名 -P端口号] -u用户名 -p

mysql -h主机名 -P端口号 -u用户名 -p
注意,-P端口号,中的P是大写的,要跟密码前面的p(小写)区分开

-- 示例
mysql -uroot -p
mysql -hlocalhost -P3306 -uroot -p

-h主机名,-P端口号,-u用户名 之间是可分开的,看个人使用习惯

即可以 -uroot,也可 -u root

2、一些基础操作

-- 查看MySQL版本
SELECT version();

-- 查看全部数据库
SHOW DATABASES;

-- 使用数据库
USE 数据库名;

-- 查看当前数据库下的全部表
SHOW TABLES;

-- 退出MySQL
EXIT

1、SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. SQL语句可以使用空格/缩进来增强语句的可读性。
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
  4. 注释:

    单行注释: -- 注释内容 或 # 注释内容(MySQL特有)

    多行注释: /*注释内容*/

2、SQL分类

分类全称说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语言,用来创建数据库用户、控制数据库的访问权限

2.1、数据类型

2.2、DDL 数据定义语言

Data Definition Language
数据定义语言,用来定义数据库对象(数据库,表,字段)

2.2.1、操作数据库

1、创建数据库

-- 语法
CREATE DATABASE 数据库名;
# 或
CREATE SCHEMA 数据库名;
-- ---------------------
-- 实例
CREATE DATABASE mydb;
CREATE SCHEMA mydb;

2、使用数据库

-- 语法
USE 数据库名;

-- 实例
USE mydb;

3、查看数据库

-- 语法
SHOW DATABASES;

4、删除数据库

-- 语法
DROP DATABASE 数据库名;
# 或
DROP SCHEMA 数据库名;
-- -------------------
-- 实例
DROP DATABASE mydb;
DROP SCHEMA mydb;

5、查看建库语句

-- 语法
SHOW CREATE DATABASE 数据库名;
-- 实例
SHOW CREATE DATABASE mydb;

2.2.2、操作表

1、创建表

-- 语法
CREATE TABLE 表名(
	 字段名 列类型 [属性] [索引] [注释],
     字段名 列类型 [属性] [索引] [注释],
     .....
     字段名 列类型 [属性] [索引] [注释]
)[表的类型][字符集设置][注释]
-- ---------------------------------------
-- 实例
CREATE TABLE student(
    id   char(10) PRIMARY KEY COMMENT '学号',
    name varchar(50) NOT NULL COMMENT '姓名',
    age  smallint UNSIGNED COMMENT '年龄',
    sex  char(1) COMMENT '性别'
) COMMENT '学生表';

2、查看表

-- 语法
SHOW TABLES;

3、修改表名

-- 语法
ALTER TABLE 旧表名 RENAME TO 新表名;
# 或
ALTER TABLE 旧表名 RENAME AS 新表名;
-- --------------------------------
-- 实例
ALTER TABLE t1 RENAME TO t2;
ALTER TABLE t1 RENAME AS t2;

4、删除表

-- 语法
DROP TABLE 数据库名;
-- ----------------
-- 实例
DROP TABLE student;

5、查看建表语句

-- 语法
SHOW CREATE TABLE 表名;
-- 实例
SHOW CREATE TABLE student;

6、修改表结构

6.1、字段设置

1、添加字段

-- 格式
ALTER TABLE 表名 ADD 字段名 类型(长度) 约束;

-- 示例 
ALTER TABLE student ADD Sname varchar(20) NOT NULL;

将字段添加到某个字段后面

-- 格式
ALTER TABLE 表名 ADD 字段名 类型(长度) 约束 AFTER 某个字段;

-- 示例
ALTER TABLE student ADD Sage smallint unsigned AFTER Sname;

将字段添加为第一个字段

-- 格式
ALTER TABLE 表名 ADD 字段名 类型(长度) 约束 FIRST;

-- 示例
ALTER TABLE student ADD Sno char(10) PRIMARY KEY FIRST;

2、修改字段

(1)修改字段的类型长度及约束

-- 格式
ALTER TABLE 表名 MODIFY 字段名 类型(长度) 约束;

-- 示例
ALTER TABLE student MODIFY Sname varchar(50) NULL;

(2)修改字段名和字段的类型长度及约束

-- 格式
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) 约束;

-- 示例
ALTER TABLE student CHANGE Sname stuName varchar(50) UNIQUE;

区别:modify只能修改字段的类型长度及约束,而change可以修改字段名和字段的类型长度及约束

3、删除字段

-- 格式
ALTER TABLE 表名 DROP 字段名;

-- 示例
ALTER TABLE student DROP Sage;

6.2、约束

1、主码(Primary Fey)

1.1、添加主码

-- 格式
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名);
#    或
ALTER TABLE 表名 ADD PRIMARY KEY (字段名);

-- 示例
ALTER TABLE student ADD CONSTRAINT Sno_pKey PRIMARY KEY (Sno);

ALTER TABLE student ADD PRIMARY KEY (Sno);

1.2、修改主码

1、添加约束

-- 格式
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型;

(1)添加主码(Primary Fey)

(2)添加外码(Foreign Key)

-- 格式
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (字段名) REFERENCES 被参照表 (主码);
#    或
ALTER TABLE 表名 ADD FOREIGN KEY (字段名) REFERENCES 被参照表 (主码);

-- 示例
ALTER TABLE sc ADD CONSTRAINT Sno_fKey FOREIGN KEY (Sno) REFERENCES student (Sno);
ALTER TABLE sc ADD FOREIGN KEY (Sno) REFERENCES student (Sno);

(3)添加唯一键(Unique或Unique Key)

-- 格式
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名);
ALTER TABLE 表名 ADD UNIQUE (字段名);

-- 示例
ALTER TABLE student ADD CONSTRAINT Sname_unique UNIQUE (Sname);
ALTER TABLE student ADD UNIQUE (Sname);

(4)添加非空约束(NOT NULL)

-- 格式
ALTER TABLE 表名 MODIFY 字段名 字段类型(长度) NOT NULL;

-- 示例
ALTER TABLE student MODIFY Sname varchar(20) NOT NULL;

(5)添加检查约束(Check)

-- 格式
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK ( 约束条件 );

-- 示例
#年龄大于0
ALTER TABLE student ADD CONSTRAINT c1 CHECK ( Sage > 0 );
#性别只能为男或女
ALTER TABLE student ADD CONSTRAINT c2 CHECK ( Ssex IN ('男','女') );
#成绩在0~100之间
ALTER TABLE sc ADD CONSTRAINT c3 CHECK ( grade BETWEEN 0 AND 100);

2.3、DML 数据操作语言

Data Manipulation Language
数据操作语言,用来对数据库表中的数据进行增删改

2.3.1、插入数据
-- 语法
-- 插入单条记录
Insert into 表名 [(字段1,字段2,......)] values (值1,值2,......); 
-- 插入多条记录
INSERT INTO 表名 [(字段1,字段2,......)]
VALUES (值1, 值2, ......),
        ......
       (值1, 值2, ......);

-- 实例
-- 插入单条记录
INSERT INTO student VALUES ('201215121', '李勇', '男', 20, 'CS');
-- 插入多条记录
INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept)
VALUES ('201215121', '李勇', '男', 20, 'CS'),
       ('201215122', '刘晨', '女', 19, 'CS'),
       ('201215123', '王敏', '女', 18, 'MA'),
       ('201215125', '张立', '男', 19, 'IS');

2.3.2、修改数据
-- 语法
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2, ......
[WHERE 条件1 ......]
[ORDER BY ......]
[LIMIT ......];

-- 实例
-- 将所有人成绩改为 95 分
UPDATE SC SET grade = 95;
-- 将学号为 1520220001 的学生成绩修改为 100 分
UPDATE SC SET grade = 100
WHERE Sno = '1520220001';
-- 将成绩前 5 名的学生成绩都改为 95 分
UPDATE SC SET grade = 95
ORDER BY grade DESC
LIMIT 5;

2.3.3、删除数据
-- 语法
DELETE [IGNORE] FROM 表名
[WHERE 条件1, 条件2, ...]
[ORDER BY ...]
[LIMIT ...];

-- 实例
-- 将 SC 表中数据全部清空
DELETE FROM SC;
-- 将成绩不及格的学生信息从 SC 表中删除
DELETE FROM SC
WHERE grade < 60;
-- 将成绩倒数前 5 的学生信息从 SC 表中删除
DELETE FROM SC
ORDER BY grade ASC
LIMIT 5;

2.4、DQL 数据查询语言

Data Query Language
数据查询语言,用来查询数据库中表的记录

2.4.1、基本语法
-- 语法
SELECT [ALL | DISTINCT] * | 字段1 , 字段2 , ......
FROM 表1 [as 别名]
    [left | right | inner join 表2]  -- 联合查询
    [WHERE ...]  -- 指定结果需满足的条件
    [GROUP BY ...]  -- 指定结果按照哪几个字段来分组
    [HAVING]  -- 过滤分组的记录必须满足的次要条件
    [ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
    [LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查询的记录从哪条至哪条

2.4.2、基本查询
-- 查看全部数据
SELECT * FROM student;

2.4.3、条件查询
-- 条件查询
SELECT * 
FROM student
WHERE Sno = '152022001';

2.4.4、聚合函数

只能用在select、group by和having语句中,不能用在where语句中,这与几个关键字的执行顺序有关。

COUNT() -- 统计个数
MAX() -- 最大值
MIN() -- 最小值
SUM() -- 求和
AVG() -- 平均值
2.4.5、分组查询
-- 分组查询
SELECT Sdept
FROM student
GROUP BY Sdept
HAVING count(*) >= 10;

2.4.6、连接查询

2.4.7、排序和分页
-- 排序展示
SELECT *
FROM student
WHERE Ssex = '男'
ORDER BY Sno
LIMIT 10;

2.4.8、子查询

一条select查询语句中包含另外一条select查询语句

2.4.8.1、WHERE子查询

子查询出现where条件中,跟在where语句后面充当查询条件,每执行一次where条件筛选,就会进行一次子查询,效率低下。像这种反复子查询就属于相关子查询,where语句的子查询都属于相关子查询

2.4.8.2、FROM子查询

子查询跟在from之后,通常这种子查询的结果集作为一个临时表,from子查询只会执行一次,不是相关子查询,所以查询效率高

2.4.8.3、SELECT子查询

子查询跟在SELECT之后,SELECT子查询也是相关子查询,不推荐

2.4.9、select语句中各关键字执行顺序
  1. from [on , join]
  2. where (可以使用表的别名)
  3. group by (可以开始使用select中字段的别名(不是表的别名)后面的语句中都可以使用)
  4. having [聚合函数]
  5. select
  6. distinct
  7. order by
  8. limit

1 ~ 1 选择表

2 ~ 4 筛选条件

5 ~ 8 展示

2.5、DCL 数据控制语言

Data Control Language
数据控制语言,用来创建数据库用户、控制数据库的访问权限

2.5.1、用户操作

1、查看用户

-- 查看当前用户
SELECT user();
# 或
SELECT current_user();

-- 查看全部用户
SELECT User,Host FROM mysql.user; -- 查看用户名和ip
SELECT * FROM mysql.user; -- 查看用户全部信息

创建的用户都在 mysql 数据库中的 user 表中。

2、创建用户

2.1、普通创建

-- 格式:
CREATE USER '用户名'@'登录IP或者域名' IDENTIFIED BY '密码';

--示例:
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'lisi'@'%' IDENTIFIED BY '123456';
  1. %是指任何IP地址都可以访问你的数据库。
  2. localhost是指只有你本机可以访问你的数据库。

2.2、创建密码每隔一段时间会过期的用户

-- 设置u1账号密码每90天过期
CREATE USER '用户名'@'登录IP或者域名' IDENTIFIED BY '密码' PASSWORD EXPIRE INTERVAL 90 DAY;

3、修改用户名

在root用户下进行修改操作

-- 格式
RENAME USER '用户名1'@'登录IP或者域名1' TO '用户名2'@'登录IP或者域名2';
# 或
UPDATE mysql.user SET User = '用户名2',Host = '用户名2''@''登录IP或者域名2' WHERE User = '用户名1';

FLUSH PRIVILEGES; -- 刷新MySQL的系统权限相关表

-- 示例
RENAME USER 'u1'@'localhost' TO 'u2'@'%'; -- 直接重命名

UPDATE mysql.user SET User = 'u2',Host = '%' -- 直接修改mysql.user表
WHERE User = 'u1' AND Host = 'localhost';

FLUSH PRIVILEGES;

mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问,还有一种方法,就是重新启动mysql服务器,来使新设置生效。

4、修改密码

1、修改当前用户密码

1.1、 使用ALTER USER命令来修改当前用户密码

ALTER USER USER() IDENTIFIED BY 'new_password';

FLUSH PRIVILEGES;

1.2、 使用SET语句来修改当前用户密码 

SET PASSWORD='new_password';

FLUSH PRIVILEGES;

2、修改其它用户密码

2.1、使用ALTER语句来修改普通用户的密码

ALTER USER user [IDENTIFIED BY '新密码']
[,user[IDENTIFIED BY '新密码']]…;

FLUSH PRIVILEGES;

2.2、 使用SET命令来修改普通用户的密码

SET PASSWORD FOR 'username'@'hostname' = 'new_password';

FLUSH PRIVILEGES;

2.3、使用UPDATE语句修改普通用户的密码(不推荐)

UPDATE mysql.user SET authentication_string = PASSWORD("123456")
WHERE User = "username" AND Host = "hostname";

FLUSH PRIVILEGES;

5、删除用户

方式1:使用DROP方式删除(推荐)

-- 格式
DROP USER '用户名'@'登录IP或者域名';

-- 示例
DROP USER 'zhangsan'@'localhost';

FLUSH PRIVILEGES;

方式2:使用DELETE方式删除 (不推荐)

DELETE FROM mysql.user WHERE Host = 'hostname' AND User = 'username';

FLUSH PRIVILEGES; -- 使用FLUSH命令来使用户生效

不推荐通过DELETE FROM USER u WHERE USER='zhangsan' 进行删除,系统会有残留信息保留。而DROP USER命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表的相应记录都消失了。

2.5.2、权限控制
2.5.2.1、权限列表
-- 查看权限列表
SHOW PRIVILEGES;
-- 常见权限
| Select                       | Tables                                | To retrieve rows from table

| Create                       | Databases,Tables,Indexes              | To create new databases and tables
| Create view                  | Tables                                | To create new views
| Create temporary tables      | Databases                             | To use CREATE TEMPORARY TABLE
| Create routine               | Databases                             | To use CREATE FUNCTION/PROCEDURE
       
| Alter                        | Tables                                | To alter the table
| Alter routine                | Functions,Procedures                  | To alter or drop stored functions/procedures    

| Insert                       | Tables                                | To insert data into tables

| Update                       | Tables                                | To update existing rows

| Delete                       | Tables                                | To delete existing rows

| Drop                         | Databases,Tables                      | To drop databases, tables, and views 
       
| Show view                    | Tables                                | To see views with SHOW CREATE VIEW
| Execute                      | Functions,Procedures                  | To execute stored routines
| File                         | File access on server                 | To read and write files on the server
| Grant option                 | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess  
| Index                        | Tables                                | To create or drop indexes
| Lock tables                  | Databases                             | To use LOCK TABLES (together with SELECT privilege)  
| References                   | Databases,Tables                      | To have references on tables
| Trigger                      | Tables                                | To use triggers

2.5.2.2、权限授予

1、基本格式:

-- 格式
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO '用户名'@'用户地址' [WITH GRANT OPTION];

FLUSH PRIVILEGES; -- 刷新系统权限相关表

/*
ON:表示这些权限可以作用于哪些数据库和哪些表,*.*表示作用于所有数据库和所有表,格式为 数据库名.表名。
比如有一个test库,想让admin拥有查看test库所有表的权限,那么可以这样写:GRANT SELECT ON test.* TO 'admin'@'%';
TO:将权限授予哪个用户。
IDENTIFIED BY:指定用户的登录密码。
WITH GRANT OPTION:表示允许用户将自己的权限授权给其它用户。
*/

注意:8.0版本以后需要将创建用户和授权分步进行,否则会报错

错误示例:

GRANT ALL ON mydb.* TO 'u1'@'localhost' IDENTIFIED BY '123456';

上述语句在授予权限的同时创建用户的方式是错误的,会报错,应该先创建用户,再进行授权。

2、全局级别

全局权限为拥有一个给定服务器中的所有数据库的全部操作权限。

-- 格式:
GRANT ALL [PRIVILEGES] ON *.* TO '用户名'@'登录IP或者域名' [WITH GRANT OPTION];

FLUSH PRIVILEGES; -- 刷新系统权限相关表

-- ALL PRIVILEGES: 表示授权用户全部权限
-- *.*:表示授予所有数据库和所有表

3、数据库层次

数据库权限为拥有一个给定数据库中的所有表

GRANT ALL [PRIVILEGES] ON database_name.* TO '用户名'@'登录IP或者域名' [WITH GRANT OPTION];

FLUSH PRIVILEGES; -- 刷新系统权限相关表

-- ALL PRIVILEGES: 表示授权用户全部权限
-- database_name.*:表示授予database_name数据库的所有表

4、表层次

表权限为拥有一个给定表中的所有列

GRANT ALL [PRIVILEGES] ON database_name.table_name TO '用户名'@'登录IP或者域名' [WITH GRANT OPTION];

FLUSH PRIVILEGES; -- 刷新系统权限相关表

-- ALL PRIVILEGES: 表示授权用户全部权限
-- database_name.table_name:表示授予database_name数据库的table_name表

2.5.2.3、权限撤销

收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性。MySQL中使用REVOKE语句取消用户的某些权限。使用REVOKE收回权之后,用户账户的记录将从db、host、tables_priv和columns_priv表中删除,但是用户账户录仍然在user表中保存(删除user表中的账户记录使用DROP USER语句)。
注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。

收回权限

-- 格式
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名 FROM '用户名'@'用户地址';

FLUSH PRIVILEGES; -- 刷新系统权限相关表

收回用户的with grant option权限

-- 格
REVOKE GRANT OPTION,权限2,权限3,…权限n ON 数据库名.表名 FROM '用户名'@'用户地址';

-- 示例
-- 撤销u1用户的SELECT和GRANT OPTION的权限
REVOKE GRANT OPTION,SELECT ON mydb.table1 FROM 'u1'@'localhost';

2.5.2.4、查看权限

1、查看当前用户权限

SHOW GRANTS;
# 或
SHOW GRANTS FOR CURRENT_USER;
# 或
SHOW GRANTS FOR CURRENT_USER();

2、查看其他用户权限

SHOW GRANTS FOR '用户名'@'用户地址';

2.5.3、角色管理
2.5.3.1、角色的理解

引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定,可以确保数据的安全性,这是至关重要的。

2.5.3.2、创建角色

创建角色使用CREATE ROLE语句,语法如下:

-- 格式
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...

-- 示例
CREATE ROLE 'role1'@'localhost';

角色名称的命名规则和用户名类似。如果host_name省略,默认为% , role_name不可省略,不可为空。

2.5.3.3、给角色赋予权限

创建角色之后,默认这个角色是没有任何权限的,我们需要给角色授权。给角色授权的语法是:

-- 格式
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO '角色名'@'用户地址' [WITH GRANT OPTION];

-- 示例
GRANT SELECT ON mydb.table1 TO 'role1'@'localhost';

2.5.3.4、查看角色权限
-- 格式
SHOW GRANTS FOR '角色名'@'用户地址';

-- 示例
SHOW GRANTS FOR 'role1'@'localhost';

使用SHOW语句查询权限:

只要你创建了一个角色,系统就会自动给你一个“ USAGE ”权限,意思是连接登录数据库的权限

2.5.3.5、撤销角色权限
-- 格
REVOKE 权限1, 权限2,权限3,…权限n ON 数据库名.表名 FROM '用户名'@'用户地址';

-- 示例
-- 撤销role1角色的SELECT和GRANT OPTION的权限
REVOKE GRANT OPTION,SELECT ON mydb.table1 FROM 'role1'@'localhost';

注意:修改了角色的权限,会影响拥有该角色的账户的权限。

2.5.3.6、删除角色
-- 格式
DROP ROLE '角色'@'用户地址' [,'角色2'@'用户地址']...

-- 示例
DROP ROLE 'role1'@'localhost';

注意: 如果删除了角色,那么用户也就失去了通过该角色所获得的所有权限。

2.5.3.7、给用户赋予角色
角色创建并授权后,要赋给用户并处于激活状态才能发挥作用。给用户添加角色可使用GRANT语句,语法形式如下:
-- 格式
GRANT '角色'@'用户地址' [,'角色2'@'用户地址',...] TO '用户'@'用户地址' [,'用户2'@'用户地址',...];

-- 示例
GRANT 'role1'@'localhost','role2'@'%' TO 'u3'@'localhost';

(1)查看用户u3权限:

(2)使用u3用户登录,然后查询当前角色激活状态,如果角色未激活,结果将显示NONE

2.5.3.8、激活角色(作用于用户)

方式1:使用set default role 命令激活角色

           -- 在待激活的用户下执行该语句

-- 格式
#将赋给该用户的全部角色都激活
SET DEFAULT ROLE ALL TO '用户名'@'用户地址';
#只激活指定角色
SET DEFAULT ROLE '角色'@'角色地址' [,'角色2'@'角色地址', ...] TO '用户名'@'用户地址';

-- 示例
#将赋给该用户的全部角色都激活
SET DEFAULT ROLE ALL TO 'u3'@'localhost';
#只激活指定角色
SET DEFAULT ROLE 'role1'@'localhost' TO 'u3'@'localhost';

注意:若此时立即再使用命令select current_role(),还是会显示NONE。我们应该先退出该用户,再重新登录该用户即可成功激活。

方式2:通过设置系统变量activate_all_roles_on_login的值进行激活

默认值:

设置:

SET GLOBAL activate_all_roles_on_login=ON;
  1. ON表示用户连接到服务器时自动激活授予的全部角色。
  2. OFF表示用户连接到服务器时,仅激活“SET DEFAULT ROLE”指定的角色。

这条 SQL 语句的意思是,对所有角色永久激活。运行这条语句之后,用户才真正拥有了赋予角色的所有权限。

2.5.3.9、撤销用户的角色

撤销用户角色的SQL语法如下:

-- 格式
REVOKE '角色名'@'角色地址' FROM '用户名'@'用户地址';

-- 示例
REVOKE 'role1'@'localhost' FROM 'u3'@'localhost';

2.5.3.10、设置强制角色(mandatory role)

使用强制性角色,服务器会为全部的账户默认赋予该角色,而不需要显示执行赋予角色。强制角色无法被revoke 或者 drop 。

方式1:服务启动前设置

即在配置文件my.ini中设置

-- 在my.ini中找到[mysqld],在其下面设置该语句
[mysqld]
mandatory_roles='role1,role2@localhost'

保存之后,重新启动mysql80服务

方式2:运行时设置

 #系统重启后仍然有效
SET PERSIST mandatory_roles = 'role1,role2@localhost';

 #系统重启后失效
SET GLOBAL mandatory_roles = 'role1,role2@localhost';

2.5.4、数据库MD5加密

MD5信息摘要算法(MD5 Message-Digest Algorithm)

-- 创建示例表
CREATE TABLE user(
    id int AUTO_INCREMENT COMMENT '编号' ,
    name varchar(50) UNIQUE NOT NULL COMMENT '用户名',
    pwd varchar(50) NOT NULL COMMENT '密码',
    PRIMARY KEY (id)
)COMMENT '用户表';

-- 插入明文密码
INSERT INTO user (name,pwd)
VALUES ('小明','123456');

-- 插入密文密码
INSERT INTO user (name,pwd)
VALUES ('小红',MD5('123456'));

-- 给所有用户加密
UPDATE user SET pwd = MD5(pwd);

-- 用户登录校验:将用户传递进来的密码,进行MD5加密,然后对比加密后的值
SELECT * FROM user
WHERE name = '小明' AND pwd = MD5('123456');

3、常见函数

3.1、字符串函数

常见字符串函数
函数描述
char_length(s)返回字符串 s 的字符数
concat(s1,s2...sn)将字符串 s1,s2 等多个字符串合并为一个字符串

concat_ws(x,s1,s2...sn)

同 CONCAT(s1,s2,...) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
lower(s) / lcase(s)将字符串 s 的所有字母变成小写字母
upper(s) / ucase(s)将字符串转换为大写
replace(s,s1,s2)将字符串 s2 替代字符串 s 中的字符串 s1
reverse(s)将字符串s反转
strcmp(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
substr(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串
trim(s)去掉字符串 s 开始和结尾处的空格
left(s,n)返回字符串 s 的前 n 个字符
right(s,n)返回字符串 s 的后 n 个字符

3.2、数字函数

常见数字函数
函数描述
abs(x)返回 x 的绝对值
ceil(s)返回大于或等于 x 的最小整数
floor(x)返回小于或等于 x 的最大整数
exp(x)返回 e 的 x 次方
pow(x,y)返回 x 的 y 次方
rand()返回 0 到 1 的随机数
sqrt(x)返回x的平方根
round(x [,y])

返回离 x 最近的整数,可选参数 y 表示要四舍五入的小数位数,

如果省略,则返回整数。

greatest(expr1, expr2, expr3, ...)返回列表中的最大值(数字列表或字符串列表)
least(expr1, expr2, expr3, ...)返回列表中的最小值(数字列表或字符串列表)
LOG(x) 或 LOG(base, x)

返回自然对数(以 e 为底的对数)

如果带有 base 参数,则 base 为指定带底数。

3.3、日期函数

常见日期函数
函数描述
curdate()返回当前日期
curtime()返回当前时间
now()返回当前日期和时间
sysdate()返回当前日期和时间
date_add(d,INTERVAL expr type)

d:日期 ,interval:时间值 ,type:类型

DATEDIFF(d1,d2)计算日期 d1 -> d2 之间相隔的天数:d1 - d2
timediff(time1, time2)计算时间差值
timestampdiff(unit,datetime_expr1,datetime_expr2)unit为单位(如年月日),计算时间差,返回 datetime_expr2 − datetime_expr1 的时间差
year(d)返回年份
month(d)返回月份
day(d)返回天数
hour(d)返回小时
minute(d)返回分钟
second(d)返回秒钟

3.4、高级函数

DATABASE()

返回当前数据库名

SELECT DATABASE();

USER() / CURRENT_USER()

返回当前用户

SELECT USER();
SELECT CURRENT_USER()

IF(expr,v1,v2)

如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2

SELECT IF(6 % 2 = 0,'偶数','奇数');

IFNULL(v1,v2)

如果 v1 的值不为 NULL,则返回 v1,否则返回 v2

SELECT IFNULL(NULL,'not null');

VERSION()

返回数据库的版本号

SELECT VERSION();

CONNECTION_ID()

返回当前连接的唯一连接 ID

SELECT CONNECTION_ID();

LAST_INSERT_ID()

返回表中已插入或更新的最后一行的 AUTO_INCREMENT id

SELECT LAST_INSERT_ID();

3.5、流程控制函数(语句)

3.5.1、分支结构
3.5.1.1、IF语句

IF 语句的语法结构是:

IF 表达式1 THEN 操作1 
    [ELSEIF 表达式2 THEN 操作2]
    ...
    [ELSE 操作N] 
END IF;
3.5.1.2、CASE语句

CASE语句的语法结构1:

#情况一:类似于switch 
CASE 表达式 
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
... 
ELSE 结果n或语句n(如果是语句,需要加分号) 
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

CASE语句的语法结构2:

#情况二:类似于多重if 
CASE 
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号) 
... 
ELSE 结果n或语句n(如果是语句,需要加分号) 
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

3.5.2、循环结构
3.5.2.1、LOOP语句

LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。

LOOP语句的基本格式如下:

[loop_label:] LOOP 
 循环执行的语句 
END LOOP [loop_label]

其中,loop_label表示LOOP语句的标注名称,该参数可以省略。

3.5.2.2、WHILE语句

WHILE语句创建一个带条件判断的循环过程。WHILE在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。

WHILE语句的基本格式如下:

[while_label:] WHILE 循环条件 DO 
 循环体 
END WHILE [while_label];

while_label为WHILE语句的标注名称;如果循环条件结果为真,WHILE语句内的语句或语句群被执行,直至循环条件为假,退出循环。

3.5.2.3、REPEAT语句

REPEAT语句创建一个带条件判断的循环过程。与WHILE循环不同的是,REPEAT 循环首先会执行一次循环,然后在 UNTIL 中进行表达式的判断,如果满足条件就退出,即 END REPEAT;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。

REPEAT语句的基本格式如下:

[repeat_label:] REPEAT 
 循环体的语句 
UNTIL 结束循环的条件表达式 
END REPEAT [repeat_label]

repeat_label为REPEAT语句的标注名称,该参数可以省略;REPEAT语句内的语句或语句群被重复,直至expr_condition为真。

3.5.2.4、三种循环结构对比
  1. 这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
  2. LOOP:一般用于实现简单的"死"循环
    WHILE:先判断后执行
    REPEAT:先执行后判断,无条件至少执行一次。

3.5.3、跳转语句
3.5.3.1、LEAVE语句

LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。如果你有面向过程的编程语言的使用经验,你可以把 LEAVE 理解为 break。

基本格式如下:

LEAVE 标记名

其中,label参数表示循环的标志。LEAVE和BEGIN ... END或循环一起被使用。

3.5.3.2、ITERATER语句

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为continue,意思为“再次循环”。

基本格式如下:

ITERATE label

label参数表示循环的标志。ITERATE语句必须跟在循环标志前面。

参考文章——MySQL高级篇-流程控制语句icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/473261002

---------------------------------------------------------------------------------------------------------------------------------

未完待续......

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值