mysql入门笔记-3

用户操作

Mysql用户

mysql用户在mysql库下面的user表中

SELECT * FROM mysql.user

身份验证字段

#身份验证字段
#host	访问地址,user	用户名,plugin	密码加密插件,t.authentication_string	经过加密后的密码,password_expired	密码过期,password_last_changed	密码上次修改时间,password_lifetime	密码有效期
SELECT host, user, t.`plugin`, t.authentication_string, t.password_expired
	, t.password_last_changed, t.password_lifetime
FROM mysql.user t;

资源限制字段

#资源限制字段
#max_questions:保存每小时允许用户执行查询操作的最多次数。max_updates:保存每小时允许用户执行更新操作的最多次数。max_connections:保存每小时允许用户建立连接的最多次数。max_user_connections:保存允许单个用户同时建立连接的最多数量。
SELECT host, user, t.max_questions, t.max_updates, t.max_connections
	, t.max_user_connections
FROM mysql.user t;

权限字段

#权限字段
#Select_priv查询权限、Insert_priv插入权限,Update_priv更新权限,Delete_priv删除权限
SELECT host, user, t.Select_priv, t.Insert_priv, t.Update_priv
	, t.Delete_priv
FROM mysql.user t;

账户锁定字段

#账户锁定字段
SELECT host, user, t.account_locked
FROM mysql.user t;

用户操作

#用户操作
#创建用户jhl
create user 'jhl'@'*' identified by '123456';
#创建用户jhl2,每小时最大更新次数是10
create user 'jhl2'@'localhost' identified by '123456'
WITH MAX_UPDATES_PER_HOUR 10;
#创建用户jhl3,密码有效期为180天
create user 'jhl3'@'localhost' identified by '123456'
PASSWORD expire INTERVAL 180 DAY;
#创建用户jhl4,状态为锁定
create user 'jhl4'@'localhost' identified by '123456'
PASSWORD expire account lock;
#更改密码
ALTER user 'jhl2'@'localhost' IDENTIFIED BY '111111';
#更改用户锁定状态
ALTER USER 'jhl4'@'localhost' account UNLOCK;
#更改用户名
RENAME user 'jhl4'@'localhost' TO 'new_jhl'@'localhost';
#删除用户
DROP user if EXISTS 'new_jhl'@'localhost';

用户权限

#查看权限
show grants for 'jhl2'@'localhost';
#默认的:grant 权限 on 数据库.数据表 to 用户名
GRANT usage ON *.* TO 'jhl2'@'localhost';
#设置权限,给jhl2设置查看student表,并且更新name和age字段的权限。
grant all on test03.student to 'jhl2'@'localhost';
#回收权限
#grant授权 all PRIVILEGES代表全部权限
revoke all PRIVILEGES ON test03.student from 'jhl2'@'localhost';
#刷新权限
flush privileges;

视图

视图就是经过保存的临时表

# 创建视图
create view student_view as
select t.*, s.name
from room t
         left join student3 s on t.id = s.room_id;
# 替换已有视图,更新视图
create or replace view student_view as
select t.id, s.name
from room t
         left join student3 s on t.id = s.room_id;
#更改视图,DEFINER:所属用户,sql SECURITY:指定所属用户使用还是调用用户使用视图
create
or
replace definer = CURRENT_USER () sql SECURITY definer view student_view as
select t.id, s.name
from room t
         left join student3 s on t.id = s.room_id;
#在test04库中,创建test01库的student03_view视图
create or REPLACE view test01.student03_view as
SELECT *
from student3;
#查询视图
SELECT *
from student_view;
#修改视图
    ALTER VIEW student_view as SELECT *
                               from room;
#删除视图
drop VIEW student_view;
#视图可以分页
SELECT *
from student_view
LIMIT 3;
#查看视图结构
desc student_view;
#查看视图的状态
show table STATUS like 'student_view';
#查看创建视图的语句
show create view student_view;

事务

事务入门

#2020年04月22日17:01:54
#视图事务
#开启事务
START TRANSACTION;
insert into student3
VALUES (3, '小王', 3);
#事务提交
COMMIT;

START TRANSACTION;
INSERT INTO student3
VALUES (25, '小磊', 4);
#事务回滚
rollback;

#自动提交(也就是默认方式)
SELECT @@autocommit;
#关闭自动提交
set autocommit = 0;
# 类似于版本控制(不过是临时的,就是一个状态)
#创建保存点u2----
SAVEPOINT u2;
UPDATE student3
set room_id=1
WHERE student3.id = 3;
ROLLBACK TO SAVEPOINT u2;
# 保存点在提交后就没了
COMMIT;


事务的隔离级别

#2020年04月24日20:23:13
# 目的:学习事务的隔离级别

# READ UNCOMMITTED(读未提交)
# 设置当前隔离级别为读未提交
SET @@session.transaction_isolation = 'READ-UNCOMMITTED';
begin;
update shop
set shop.price=price - 100
where shop.id = 1;
commit;
select *
from shop;


# READ COMMITTED(读提交)
# 设置当前隔离级别为读提交
SET @@session.transaction_isolation = 'READ-COMMITTED';
begin;
update shop
set shop.price=price - 100
where shop.id = 1;
commit;
select *
from shop;


# REPEATABLE READ(可重复读)
# 设置当前隔离级别为可重复读
SET @@session.transaction_isolation = 'REPEATABLE-READ';
begin;
insert into shop
values (3, 'jhl', '123456', '焦浩亮', 300);
commit;
select *
from shop;


# SERIALIZABLE(序列化)
# 设置当前隔离级别为序列化
SET @@session.transaction_isolation = 'SERIALIZABLE';
begin;
update shop
set shop.price=price - 100
where shop.id = 1;
commit;
select *
from shop;
/*
SQL 标准定义的四种隔离级别被 ANSI(美国国家标准学会)和 ISO/IEC(国际标准)采用,每种级别对事务的处理能力会有不同程度的影响。
四种隔离级别从并发程度由高到低进行描述
READ UNCOMMITTED(读未提交)
该隔离级别的事务会读到其它未提交事务的数据,此现象也称之为脏读。
READ COMMITTED(读提交)
一个事务可以读取另一个已提交的事务,多次读取会造成不一样的结果,此现象称为不可重复读问题,Oracle 和 SQL Server 的默认隔离级别。
REPEATABLE READ(可重复读)
该隔离级别是 MySQL 默认的隔离级别,在同一个事务里,select 的结果是事务开始时时间点的状态,因此,同样的 select 操作读到的结果会是一致的,但是,会有幻读现象。MySQL 的 InnoDB 引擎可以通过 next-key locks 机制(参考下文"行锁的算法"一节)来避免幻读。
SERIALIZABLE(序列化)
在该隔离级别下事务都是串行顺序执行的,MySQL 数据库的 InnoDB 引擎会给读操作隐式加一把读共享锁,从而避免了脏读、不可重读复读和幻读问题。
*/

# 查看全局隔离级别
select @@global.transaction_isolation;
# 查看当前会话的隔离级别
select @@session.transaction_isolation;
# 查看下一个事务的隔离级别
select @@transaction_isolation;

数据库编程

函数

内置函数:也称为系统函数,MySQL提供的函数,无需定义、直接使用即可。

从功能方面划分:大致可以分为数学函数、数据类型转换函数、字符串函数、日期和时间函数、加密函数、系统信息函数、JSON函数以及其他常用函数。

数学函数
分类 函数名称 描述
三角函数 PI() 计算圆周率
三角函数 RADIANS(x) 用于将角度x转换为弧度
三角函数 DEGREES(x) 用于将弧度x转换为角度
三角函数 SIN(x) 正弦函数
三角函数 COS(x) 余弦函数
三角函数 TAN(x) 正切函数
三角函数 COT(x) 余切函数
三角函数 ASIN(x) 反正弦函数
分类 函数名称 描述
三角函数 ACOS(x) 反余弦函数
三角函数 ATAN(x) 反正切函数
指数函数 SQRT(x) 求x的平方根
指数函数 POW(x,y)或POWER(x,y) 幂运算函数(计算x的y次方)
指数函数 EXP(x) 计算e(自然对数的底约为2.71828)的x次方
对数函数 LOG(x) 计算x的自然对数
对数函数 LOG10(x) 计算以10为底的对数
求近似值函数 ROUND(x,[y]) 计算离x最近的整数;若设置参数y,与FORMAT(x,y)功能相同
分类 函数名称 描述
求近似值函数 TRUNCATE(x,y) 返回小数点后保留y位的x(舍弃多余小数位,不进行四舍五入)
求近似值函数 FORMAT(x,y) 返回小数点后保留y位的x(进行四舍五入)
求近似值函数 CEIL(x)或CEILING(x) 返回大于等于x的最小整数
求近似值函数 FLOOR(x) 返回小于等于x的最大整数
进制函数 BIN(x) 返回x的二进制数
进制函数 OCT(x) 返回x的八进制数
进制函数 HEX(x) 返回x的十六进制数
进制函数 ASCII(c) 返回字符c的ASCII码(ASCII码介于0~255);
分类 函数名称 描述
进制函数 CHAR(c1,c2,c3,…) 将c1、c2、c3、…的ASCII码转换为字符,然后返回这些字符组成的字符串
进制函数 CONV(x,code1,code2) 将code1进制的x变为code2进制数
其他函数 RAND() 默认返回[0,1]之间的随机数
其他函数 ABS(x) 获取x的绝对值
其他函数 MOD(x,y) 求模运算,与x%y的功能相同
数据类型转换函数
函数名称 描述
CONVERT(x,type) 以type类型返回x
CONVERT(xUSING字符集) 以指定字符集返回x数据
CAST(xAStype) 以type类型返回x
UNHEX(x) 将x转为十六进制数字,然后再转为由数字表示的字符

nCONVERT()和CAST()函数的参数x可以是任何类型的表达式。

n参数type的可选值为BINARAY、CHAR、DATE、DATETIME、DECIMAL、JSON、SIGNED[INTEGER]、TIME、和UNSIGNED[INTEGER]。

字符串函数
函数名称 描述
CHAR_LENGTH() 获取字符串的长度
LENGTH() 获取字符串占用的字节数
REPEAT() 重复指定次数的字符串,并保存到一个新字符串中
SPACE() 重复指定次数的空格,并保存到一个新字符串中
UPPER() 将字符串全部转为大写字母,与UCASE()函数等价
LOWER() 将字符串全部转为小写字母,与LCASE()函数等价
STRCMP() 比较两个字符串的大小
REVERSE() 颠倒字符串的顺序
函数名称 描述
SUBSTRING() 从字符串的指定位置开始获取指定长度的字符串。与MID()函数等价
LEFT() 截取并返回字符串的左侧指定个字符
RIGHT() 截取并返回字符串的右侧指定个字符
LPAD() 按照限定长度从左到右截取字符串,当字符串的长度小于限定长度时在左侧填充指定的字符
RPAD() 按照限定长度从左到右截取字符串,当字符串的长度小于限定长度时在右侧填充指定的字符
INSTR() 返回子串在一个字符串中第一次出现的位置。与LOCATE()和POSITION(…IN…)函数等价,但参数顺序不同。
FIND_IN_SET() 获取子串在含有英文逗号分割的字符串中的开始位置
函数名称 描述
LTRIM() 删除字符串左侧的空格,并返回删除后的结果
RTRIM() 删除字符串右侧的空格,并返回删除后的结果
TRIM() 删除字符串左右两侧的空格,并返回删除后的结果
INSERT() 从字符串的指定位置开始使用子串替换指定长度的字符串
REPLACE() 使用指定的子串替换字符串中出现的所有指定字符
CONCAT() 将参数连接成一个新字符串
CONCAT_WS() 使用指定分隔符将参数连接成一个新字符串
函数 截取开始位置 限定长度 填充字符
SUBSTRING() 自定义 自定义 不支持
LEFT() 不支持自定义,只能从左侧开始 自定义 不支持
RIGHT() 不支持自定义,只能从右侧开始 自定义 不支持
LPAD() 不支持自定义,只能从左侧开始 自定义 自定义
RPAD() 不支持自定义,只能从左侧开始 自定义 自定义
日期和时间函数
函数名称 描述
CURDATE() 用于获取MySQL服务器当前日期,与CURRENT_DATE()等价
CURTIME() 用于获取MySQL服务器当前时间,与CURRENT_TIME()等价
NOW() 用于获取MySQL服务器当前日期和时间,与LOCALTIME()、CURRENT_TIMESTAMP()和LOCALTIMESTAMP()都等价
UNIX_TIMESTAMP() 用于获取MySQL服务器当前UNIX时间戳
UNIX_TIMESTAMP(date) 将指定日期时间date转换为UNIX时间戳并返回
DATEDIFF() 判断两个日期之间的天数差距,参数日期必须使用字符串格式
函数名称 描述
DATE() 获取日期或日期时间表达式中的日期部分
TIME() 获取指定日期事件表达式中的时间部分
WEEK() 返回指定日期的周数
DAYNAME() 返回日期对应的星期名称(英文全称)
DAYOFMONTH() 返回指定日期中的天(1~31),与DAY()等价
DAYOFYEAR() 返回指定日期的天数
DAYOFWEEK() 返回日期对应的星期几(1=周日,2=周一,....7=周六)
FROM_UNIXTIME() 将指定的时间戳转成对应的日期时间格式
函数名称 描述
EXTRACT() 按照指定参数提取日期中的数据
DATE_SUB() 从日期中减去时间值(时间间隔)
DATE_ADD() 在指定的日期上添加日期时间

MySQL中提供了FROM_UNIXTIME()函数实现自定义格式化后日期的显示样式

分类 格式字符 说明
%Y 4位数字表示的完整年份,如1949、2018
%y 2位数字表示的年份,如99、03
%m 两位数字表示的月份,有前导零,返回值00~12
%c 数字表示的月份,无前导零,返回值0~12
%M 月份,完整的文本格式,如January、March
%d 月份中的第几天,有前导零,返回值00~31
%e 月份中的第几天,无前导零,返回值0~31
分类 格式字符 说明
时间 %h或%I 小时,12小时格式,有前导零,返回值01~12
时间 %H 小时,24小时格式,有前导零,返回值00~23
时间 %i 有前导零的分钟数,返回值00~59
时间 %s或%S 有前导零的秒数,返回值00~59
星期 %w 星期几,返回值0(表示星期日)~6(表示星期六)
星期 %W 星期几,完整的文本格式,如Sunday、Saturday
加密函数

加密函数主要用于对数据进行加密。相对明文存储,经过算法计算后的字符串不会被人直接看出保存的是什么数据,在一定程度上能够保证数据的安全性

散列函数又称为哈希(Hash)函数,用于通过散列算法计算数据的散列值。

函数名称 作用
MD5() 使用MD5计算并返回一个32位的字符串
AES_ENCRYPT() 使用密钥对字符串进行加密,默认返回一个128位的二进制数
AES_DECRYPT() 使用密钥对密码进行解密
SHA1()或SHA() 利用安全散列算法SHA-1字符串,返回40个十六进制数字组成的字符串
SHA2() 利用安全散列算法SHA-2字符串
ENCODE() 使用密钥对字符串进行编码,默认返回一个二进制数
DECODE() 使用密钥对密码进行解码
PASSWORD() 计算并返回一个41位的密码字符串

nMD5()返回的是32个十六进制数字组成的字符串。

nSHA1()也可称为SHA(),它采用的是160位长度的安全散列算法,返回的是40个十六进制数字组成的字符串。

nSHA2()函数需要通过第2个参数设置采用多少位长度的安全散列算法,它的可选值为224、256、384、512或0(相当于256)。

n当参数为NULL时,MD5()、SHA1()、SHA2()的返回值均为NULL。

•MD5()和SHA()函数经常用于密码的非明文存储,也就是计算正确密码的散列值后保存,然后计算给定密码的散列值,判断两个散列值是否相同。

•对于敏感信息,建议在客户端就考虑使用加密密钥进行加密,在传输时建议尽量采用SSL连接,从多方位的角度尽量保证数据的安全。

系统信息函数
函数名称 作用
VERSION() 用于获取当前MySQL服务实例使用的MySQL版本号
DATABASE() 用于获取当前操作的数据库,与SCHEMA()函数等价
USER() 用于获取登录服务器的主机地址及用户名,与SYSTEM_USER()和SESSION_USER()函数等价
CURRENT_USER() 用于获取该账户名允许通过哪些登录主机连接MySQL服务器
CONNECTION_ID() 用于获取当前MySQL服务器的连接ID
BENCHMARK() 重复执行一个表达式
LAST_INSERT_ID() 获取当前会话中最后一个插入的AUTO_INCREMENT列的值
JSON函数
函数名称 作用
JSON_ARRAY() 创建JSON数组
JSON_OBJECT() 创建JSON对象
JSON_CONTAINS() JSON文档中是否包含路径中指定对象
JSON_CONTAINS_PATH() JSON文档中是否包含路径中的任意数据
JSON_EXTRACT() 从JSON文档返回数据
JSON_KEYS() 从JSON文档中获取数组中的键
JSON_SEARCH() 获取JSON文档中值的路径
函数名称 作用
JSON_ARRAY_APPEND() 将数据追加到JSON文档的指定路径中
JSON_ARRAY_INSERT() 将数据插入到JSON数组指定路径前
JSON_DEPTH() 获取JSON文档的最大深度
JSON_INSERT() 将数据插入JSON文档
JSON_LENGTH() 获取JSON文档中元素的数量
JSON_MERGE_PATCH() 合并JSON文档,替换重复键的值
JSON_MERGE_PRESERVE() 合并JSON文档,保留重复的键
JSON_PRETTY() 以友好的格式打印JSON文档
函数名称 作用
JSON_REMOVE() 从JSON文档中删除数据
JSON_REPLACE() 替换JSON文档中的值
JSON_SET() 向JSON文档中插入数据
JSON_TYPE() 获取JSON值的类型
JSON_VALID() JSON值是否有效
其他函数
# 转换ip地址与数据
select INET_ATON('192.168.1.1');
# 获取uuid
select uuid();
自定义函数
# 防止报错
set global log_bin_trust_function_creators = 1;
# 自定义函数
delimiter $$
create function test1(change_id int, pwd varchar(20)) returns varchar(20)
begin
    update test03.student t set t.password=pwd WHERE t.id = change_id;
    return concat(change_id, '修改成功');
end;
$$
delimiter ;

# 运行函数
select test1(1, 33333);
#查看函数的创建语句
SHOW create function test1;

#删除函数
DROP FUNCTION IF EXISTS test1;
存储过程

存储过程是数据中的一个重要的对象,它是在大型数据库系统中一组为了完成特定功能的SQL语句集,在第一次使用经过编译后,再次调用就不需要重复编译,因此执行效率比较高

#创建存储过程pro1
CREATE procedure pro1(in sid INT)
BEGIN
    SELECT * from student WHERE id > sid;
END;

#删除存储过程pro1
drop PROCEDURE pro1;


#调用存储过程
CALL pro1(3);


#修改存储过程
# ALTER PROCEDURE


# 查看存储过程的创建语句
SHOW CREATE PROCEDURE pro1;

条件判断

if判断

#2020年05月11日17:36:42

# 编程1班-韦成成

#条件判断
#if判断语句
#在select中的应用
select t.name, if(t.age < 18, '未成年', '成年') 年龄, r.no
from student3 t
         left join room r on t.room_id = r.id;
#if在存储过程中的使用
create procedure printNull(in str varchar(255))
begin
    if str is null
    then
        select '输入的变量不能为空';
    else
        select concat('输入的变量不为空,是:', str);
#         end if结束if流程控制
    end if;
end;
call printNull('你好');

case then

#条件判断
# case then
select t.name                  姓名,
       (case
            when t.age > 0 and t.age <= 10 then '0-10'
            when t.age > 10 and t.age <= 20 then '11-20'
            when t.age > 20 and t.age <= 30 then '21-30'
            else '>30' end) as 年龄段
from student3 t
         left join room r on t.room_id = r.id;

循环

loop循环

# loop循环
# 1-9之间数字的乘积
create procedure proc_loop()
begin
    #     定义局部变量i和sum
    declare i int default 1;
    declare sum int default 1;
#     别名为a的loop循环
    a:
    loop
        if
            i > 9 then
            leave a;
        else
            select concat(i, '*', sum, '=', (i * sum));
            set i = i + 1;
        end if;
    end loop a;
end;
call proc_loop();

repeat循环

# repeat循环
# 输出1-10的数字
create procedure proc_repeat()
begin
    declare i int default 1;
#     repeat 循环
    repeat
        select i;
        set i = i + 1;
#         循环条件,为false的话,执行代码,为true结束,和java相反
    until i > 10 end repeat;
end;
call proc_repeat();

while循环

# while循环
# 输出1-10的数字
create procedure proc_while()
begin
    #     定义变量i
    declare i int default 0;
# 别名为a的循环
    a:
    while i < 20
        do
            set i = i + 1;
            if i = 5
            then
#             iterate 相当于continue跳转
                iterate a;
            elseif i = 9 then
#                 leave 相当于break结束
                leave a;
            else
                select i;
            end if;
        end while a;

end;
# 调用存储过程proc_while
call proc_while();

变量

#系统变量
show variables;
show variables like 'auto_inc%';
# 设置临时系统变量
set auto_increment_offset = 5;
show variables like 'auto_increment_offset';

# 会话变量
# 定义session级别的变量@age
select @age := age
from student3
where id = 1;
# 查看变量
select @age;
# 定义session级别的变量@str;
set @str = '你好';
select @str;

# 局部变量
set global log_bin_trust_function_creators = 1;
# 创建testVar函数来测试变量
create function testVar() returns varchar(255)
begin
    #     定义局部变量str2
    declare str2 varchar(32) default '洛职';
    return str2;
end;
select testVar();

游标

create procedure simplecursor3()
begin
    declare done boolean default 0; -- 定义一个循环标记默认值为false
    declare tmp int ; -- 定义局部变量
    declare youbiao3 cursor for select name from student3;
    -- 定义游标
    -- 当出现02000错误时把局部变量的值设为true
    declare continue handler for sqlstate '02000' set done = 1;

    open youbiao3;

    REPEAT
        fetch youbiao3 into tmp;
    until done end REPEAT; -- 当done为true时结束repeat,

    close youbiao3;
end;
call simplecursor3();

触发器

# 2020年05月19日09:26:29
# 编程1班-韦成成
# 触发器学习
# 创建触发器trigl在删除class数据前触发
# create trigger创建触发器
# BEFORE DELETE在删除前触发
# on student3在student3表
# for each row 每行受影响,触发器都执行,叫行级触发器。
create trigger trig1
    before DELETE
    on student3
    for each row
begin
    #     当我进行删除操作的时候,在另外一张表记录
    insert into student3_log values (0, '删除了一条数据');

end;

# 查看test04库中的触发器
show triggers in test04;
# 删除触发器
drop trigger trig1;

事件

# 2020年05月20日22:04:42
# 编程1班韦成成

# 查有事件调度器状态
show variables like 'event_scheduler';
# 开启事件调度器
set GLOBAL event_scheduler = ON;
# 定时每隔3秒向表test2中插入数据
create event event_insert_t2
    on schedule every 3 second
    on completion preserve
    do insert into test2(department, time_v) value ('1', now());
# 创建一个10分钟后清空test表数据的事件
CREATE EVENT IF NOT EXISTS event_truncate_test2
    ON SCHEDULE
        AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
    DO TRUNCATE TABLE test2;
# 创建一个在2015-04-17 14:42:00时刻清空test表数据的事件
DROP EVENT IF EXISTS event_truncate_test2;
CREATE EVENT event_truncate_test2
    ON SCHEDULE
        AT TIMESTAMP '2015-04-17 14:42:00'
    DO TRUNCATE TABLE test2;
# 5天后开启每天定时3秒向表test2中插入数据,一个月后停止执行
CREATE EVENT IF NOT EXISTS event_truncate_test2
    ON SCHEDULE EVERY 3 SECOND
        STARTS CURRENT_TIMESTAMP + INTERVAL 5 day
        ENDS CURRENT_TIMESTAMP + INTERVAL 1 month
    ON COMPLETION PRESERVE
    DO INSERT INTO test2(department, time_v)
       VALUES ('1', NOW());


# create event event1 on schedule every 3 second on completion PRESERVE do insert into student3_log (log) value (now());
#查看所有事件的相关信息
show events;
#查看事件创建语句
show create event event1;
# 临时关闭事件
alter event event1 disable;
# 删除事件
DROP EVENT IF EXISTS event1;

猜你喜欢

转载自www.cnblogs.com/qisexin/p/12935393.html