Mysql数据库笔记分享系列--下(内附免费课设报告)

索引和视图

索引
索引类别
  1. 普通索引
  2. 唯一性索引
  3. 主键索引
  4. 全文索引
  5. 空间索引
创建索引

1.ALTER TABLE创建索引

#ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。 
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)

2.CREATE INDEX

CREATE INDEX可对表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
删除索引
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
查看索引
show index from tblname;
什么情况下使用索引
什么情况下使用索引
1.表的主关键字
自动建立唯一索引
如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)
2.表的字段唯一约束
ORACLE利用索引来保证数据的完整性
如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)
3.直接条件查询的字段
在SQL中用于条件约束的字段
如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)
select * from zl_yhjbqk where qc_bh=’7001’
4.查询中与其它表关联的字段
字段常常建立了外键关系
如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’

5.查询中排序的字段
排序的字段如果通过索引去访问那将大大提高排序速度
select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)
select * from zl_yhjbqk where qc_bh=’7001’ order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包括qc_bh和cb_sx字段)

6.查询中统计或分组统计的字段
select max(hbs_bh) from zl_yhjbqk
select qc_bh,count(*) from zl_yhjbqk group by qc_bh
视图
创建视图

结果为一个表,就可以对这个表格进行操作

基于表单

drop view view_book_borrower;
create view view_name as select ... from ...
#查看视图
select * from view_name

基于多表

//类似单表,只是变成多表的
create view view_name as select ... from 
a join b on a.id=b.id

视图管理

修改视图

1/
create view
replace view 
2/
alter view
3/删除视图
drop view
视图操作数据
事务
事务

一件事儿分为几个步骤,所有步骤完成,这个事儿才叫完成了

开启事务

start transaction;
rollback;#回滚

经典案例–转账

start transaction;
update sh_user set money=money-100 where name='alex';
update sh_user set money=money+100 where name='bill';
commit;
事务处理

事件处理

  • 原子性:事务是一个不可分割的工作单位(要么成功,要么失败回到最开始)
  • 一致性:事务前后数据的完整性必须保持一致
  • 隔离性:一个事务的执行不能有其他事务的干扰
  • 持久性:一个事务一旦提交,对数据库中数据的改变就是永久性的

事务无法嵌套,下一个事务开始之后上一个会隐式提交

自动提交事务

  • 值为 0 和值为 OFF:关闭事务自动提交。如果关闭自动提交,用户将会一直处于某个事务中,只有提交或回滚后才会结束当前事务,重新开始一个新事务。
  • 值为 1 和值为 ON:开启事务自动提交。如果开启自动提交,则每执行一条 SQL 语句,事务都会提交一次。
SET autocommit = 0|1|ON|OFF;

事物的保存点

保存事务的某个节点状态

savepoint 保存点名;
#指定回滚保存点-回滚到保存点,保存点之后的操作都会被撤回
rollback savepoint 保存点名;
#释放保存点
release savepoint 保存点名;
事务隔离级别

查看隔离级别

事务隔离级别

多用户共享资源,mysql允许多线程并发访问,用户可以通过不同的线程执行事务
  • 全局隔离级别
select @@
  • 当前会话隔离级

  • 下一个事物的隔离级

四种隔离级别
  • Read uncommitted(读未提交)

解决了更新丢失,但还是可能会出现脏读

  • Read committed(读提交)

解决了更新丢失和脏读问题

  • Repeatable read(可重复读取)

解决了更新丢失、脏读、不可重复读、但是还会出现幻读

  • Serializable(可序化)–上锁

解决了更新丢失、脏读、不可重复读、幻读(虚读)

数据库编程

函数

1.内置函数
数学–类似于math库

数据类型转换
convert(x,type)#y以type类型返回x
convert(x USING字符集)#已制定字符集返回x
cast(x as type)
unhex();
字符串
sub
concat()#连接多个字符
trim()#去除两边的空格
ltrim()#去除左边的空格
rtrim()#去除右边的空格
left('hello',3)#从左边取三个
right()#右边开始
lapd(0,6,"*")#0开始,截取6个,不足补*
rpad#右边开始

insert("sdfdg",3,4,"ha")#3开始,提取4个,换成ha
replace("welcome","e","E")#把谁替换成谁
时间日期函数
TIMEDIFF#时间差值
data_sub()
data_add()
select now()#获取当前程序时间(),括号里面可以加一个数字:精度(秒后面的数字)
select sysdate()#获取当前语句时间
sleep()#休眠两秒

#时间格式函数
from_unixtime(unix_timestamp(),'%w')#按周
from_unixtime(unix_timestamp(),'%y%m%d')#按日期
from_unixtime(unix_timestamp(),'%H:%i:%s')#按周

#时间加减运算
'2022-10-20 12:10:03' + interval 1 day;#加一天 -同理
data_sub('2022-10-20 12:10:03' interval '1' 'day');
data_add()#同减法
加密函数
#MD5函数,sha加密函数
select MD5("123456"),SHA1("123456"),SHA1("123456",256)
系统信息函数
version()
JSON函数–JSON数据操作
  • 创建json数组
 JSON_ARRAY()#创建JSOn数组
 JSON_OBJECT("id","1","name","wu")#创建键值对
  • 添加json数据
 JSON_SET('{"id":1}','$.emile',"[email protected]")#可以当replace用--替换原有的值,$代表当前字典
  • 删除json数据
 JSON_REMOVE("['1','2','3']",'$[0]')
  • 合并json数据
select JSON_MERGE_PATCH('{"a":1,"b":2}','{"a":["one",1],"b":44}')#相同替换掉
select JSON_MERGE_PRESERVE('{"a":1,"b":2}','{"a":["one",1],"b":44}')#相同键合并为数组
  • 搜索json值和路径
JSON_SEARCH("['cookie':12,'23']",'all',"cookie")#查询有所有的值
JSON_SEARCH("['cookie':12,'23']",'$[1]',"$[0]")#查询第一个和第0个
其他
INET_ATON('192.168.0.1')#转化ip地址
uuid()#每一行一个

自定义函数
delimiter $$#新结束符
CREATE FUNCTION(参数类型 参数 returns 返回值类型)
begin
return concat("")#这里是函数体
end
DELIMITER ; 
create function 函数名([])returns 返回值类型
[begin]
函数体
retuen 返回值数据#数据必须和结构中定义的返回值类型一致
[end]

存储过程

创建存储过程

in表示传入数据,out表示传出数据,

delimiter $$#新结束符
create procedure 过程名([in|out|inout] [参数类型 参数])
[begin]
函数体
retuen 返回值数据#数据必须和结构中定义的返回值类型一致
[end]
$$
查看创建过程的条件语句
SHOW CREATE PROCEDURE 过程名;
#查看符合条件的过程语句
SHOW PROCEDURE STATUS [LIKE 匹配模式];
SHOW PROCEDURE STATUS LIKE 'proc'\G
执行创建过程
  • 要想存储过程发挥作用,必须使用MySQL提供的CALL语句调用。

  • 由于存储过程和数据库相关,如果要执行其他数据库中的存储过程,则调用时需要指定数据库名称

  • CALL 数据库名.存储过程名称([实参列表]);

    SELECT * FROM information_schema.triggers WHERE trigger_name= 'trig_book';
    
存储过程的修改和删除
alter procedure 过程名([in|out|inout] [参数类型 参数])
#删除
DROP PROCEDURE [IF EXISTS] 存储过程名称

delimiter $$
create procedure proc_2()
begin
select distinct name_book,price_book,upload_time from book_2061105204 b
 join record_2061105204 r on  b.id!=r.book_id 
 join user_2061105204 u on u.id!=r.borrow_id;
end
$$
DELIMITER ;
call proc_2;
存储过程的错误处理
delimiter $$
create procedure 过程名()
begin
declare continue handler for sqltate '2300'

变量

  1. 系统变量

​ @@

show [global|session] variables [like %]#查找变量
set 变量名 = 5;#修改变量
set global 变量名 = 5;#修改全局变量
  1. 会话变量

    也叫用户变量,用户自定义的变量,用@开头

set @name = 'sa';
select @name;
select id,name,price from sh_goods limit
select @price:=price from sh——goods limit2;#给一个变量赋值多个,默认赋值最后一个
select id,name,price
into @ids,@names,@prices;
select @ids,@names,@prices;
  1. 局部变量

    只在begin和end之间,不用@

CREATE FUNCTION(参数类型 参数 returns 返回值类型)
begin
declare age int default 10;
return age
end
DELIMITER ; 

流程控制

if
begin
if(score=5,score,0)
if a>b than a
[else if x than][else than]
end if;
end
$$
case when
case [条件] when 条件 than 结果

循环

游标

不需要交互直接存储过程结合游标一次性完成

delimiter $$
create FUNCTION  func_2(bname char(20))
RETURNS  char(20)
begin
DECLARE blevel VARCHAR(10);
    DECLARE bprice decimal(6, 2);#定义数据的格式,可以不要
    SELECT price_book INTO bprice FROM book_2061105204 WHERE name_book=bname;#选出来的数据
    IF bprice>60#if判断
        THEN SET blevel='高价格';#判断结果``
    ELSEIF bprice<=60 AND bprice>40
        THEN SET blevel='主流价格';
    ELSEIF empsal<=40
        THEN SET blevel='平民价格';
    END IF;
   RETURN blevel;
end $$
DELIMITER ;

触发器

概述
  1. 特殊类型的存储过程–预先设定的条件发生触发

  2. 优缺点

    1. 优点:隐式操作
    2. 缺点:不知道的情况下会有意外情况
触发器的基本操作
create trigger 触发器名字 

  • 触发时机
    • before表中数据改变前
    • after之后
  • 触发事件
  • 触发顺序

事件

概述

特定时间自动完成的时间

时间基本操作

create event [if not exists] 事件名称
on schedule at current_timestamp+ interval 1 minute
+interval 20 scecond
do insert into 
数据预处理语句

数据库备份

备份指定数据库

image-20221007083422047

mysqldump

备份全部数据库

image-20221007083513682

指定文件目录

image-20221007083536396

source还原数据

source filename.sql

用户与权限

概述

  • mysql通过用户的设置来控制数据库的操作人员的访问与操作范围

  • 权限管理在mysql这个数据库里面,所有用户保存在mysql.user数据表

  • host是可以访问的主机域名,user是数据库

  • plugin是加密方式,authenticiation_string是密文

  • 安全连接字段

    • 查看ssl安全连接:
    • image-20221007085526701
    • image-20221007085556387
  • 资源限制字段

    • max_开头的是资源限制
    • 避免浪费
  • 权限字段

    • _priv结尾,Select_priv查询权限,Insert_priv插入权限,Update_priv,更新权限
  • 客户锁定字段

用户管理

  1. 创建用户

    create user[if not exists] 
    用户名[用户身份验证选项][,账户名[用户身份验证选项]]
    
    • 可以一次创建多个用户,用,间隔

    • 账户名由用户名@主机地址组成

    • Mysql数据库笔记分享系列--下(内附免费课设报告)_第1张图片

    • 修改加密方式

      • image-20221007092252823
    • Mysql数据库笔记分享系列--下(内附免费课设报告)_第2张图片

    • Mysql数据库笔记分享系列--下(内附免费课设报告)_第3张图片

  2. 设置密码

    • USER()函数可以获取客户端提供的用户和主机地址
  3. 12

  4. 删除用户

    1. 省略主机地址,

权限管理

1,授予权限

Mysql数据库笔记分享系列--下(内附免费课设报告)_第4张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第5张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第6张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第7张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第8张图片

引擎

1.1引擎

默认使用InnoDB

查看引擎

show engines

引擎选择

aechive:存储海量数据

blackhole:黑洞引擎

performance_schema:性能架构

federated:

InnoDB是默认存储引擎

Mysql数据库笔记分享系列--下(内附免费课设报告)_第9张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第10张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第11张图片

performance_schema

Mysql数据库笔记分享系列--下(内附免费课设报告)_第12张图片

InnoDB使用最多

Mysql数据库笔记分享系列--下(内附免费课设报告)_第13张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第14张图片

查看是否独立空间文件,on为独立

Mysql数据库笔记分享系列--下(内附免费课设报告)_第15张图片

image-20221011201129404

my.ini是mysql配置文件

数据库数据默认存放地址

Mysql数据库笔记分享系列--下(内附免费课设报告)_第16张图片

11.3锁机制

认识锁机制

Mysql数据库笔记分享系列--下(内附免费课设报告)_第17张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第18张图片

表级锁

Mysql数据库笔记分享系列--下(内附免费课设报告)_第19张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第20张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第21张图片

读锁—读操作

Mysql数据库笔记分享系列--下(内附免费课设报告)_第22张图片

写锁–写操作

Mysql数据库笔记分享系列--下(内附免费课设报告)_第23张图片

隐式表·

Mysql数据库笔记分享系列--下(内附免费课设报告)_第24张图片

优先级顺序–优先处理写锁

Mysql数据库笔记分享系列--下(内附免费课设报告)_第25张图片

lock table 数据表名 read [local] |write,...

Mysql数据库笔记分享系列--下(内附免费课设报告)_第26张图片

image-20221011204819508

create table mydb.table_lock (id int)engine=MyISAM

授权给a,b

Mysql数据库笔记分享系列--下(内附免费课设报告)_第27张图片

给a加一个读锁(只能读,不能改,其他表甚至不能读)

Mysql数据库笔记分享系列--下(内附免费课设报告)_第28张图片

锁分类

  1. image-20221012193439686

  2. image-20221012193711798

锁等待

Mysql数据库笔记分享系列--下(内附免费课设报告)_第29张图片

2、表级锁

写锁

读锁

隐式读

Mysql数据库笔记分享系列--下(内附免费课设报告)_第30张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第31张图片

3、行级锁

#排他锁
for update



4、分表技术

  1. 水平分表

Mysql数据库笔记分享系列--下(内附免费课设报告)_第32张图片

Mysql数据库笔记分享系列--下(内附免费课设报告)_第33张图片

  1. 垂直分表

11.5分区技术

Mysql数据库笔记分享系列--下(内附免费课设报告)_第34张图片

课设报告链接

你可能感兴趣的:(数据库,数据库,mysql,oracle)