目录
MySQL中默认四张表(user,db,tables_priv、columns_priv)
前言:学习任何知识,都应该了解它该用在哪,MySQL作为目前较流行的数据库之一,有着独有的优势。让我们来学习它。
一,Mysql是什么?
- MySQL是一种轻量级数据库管理系统,专注于提供高性能、可靠性和易用性,适用于中小型应用和简单的数据管理需求。
在学会了SQL server,Oracle的基础上我们来深入学习MySQL。
MySQL下载安装我已在前面分享过了,大家可以参考以前的博客:
二,MySQL数据库引擎
2.1数据库引擎是什么?
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。MySQL的核心就是存储引擎。
2.2数据库引擎分类:
MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、(这两个最常见)Memory、Merge、Archive、CSV、BLACKHOLE 等,可分别根据各个引擎的功能和特性为不同的数据库处理任务提供各自不同的适应性和灵活性。
2.3InnoDB(MySQL默认引擎)
InnoDB是事务型存储引擎,提供了对数据库ACID事务的支持,并实现了SQL标准的四种隔离级别,具有行级锁定(这一点说明锁的粒度小,在写数据时,不需要锁住整个表,因此适用于高并发情形)及外键支持(所有数据库引擎中独一份,仅有它支持外键)该引擎的设计目标便是处理大容量数据的数据库系统,MySQL在运行时InnoDB会在内存中建立缓冲池,用于缓存数据及索引。
我的理解是:我们如果是使用InnoDB存储方式,根据它的特点行级锁定我们就能有多个用户去访问这个数据库,多个用户互不影响。
2.4MyISAM
相比起InnoDB,没有提供对数据库事务的支持,不支持细粒度的锁(行锁)及外键,当表Insert与update时需要锁定整个表,因此效率会低一些。
比较InnoDB(MySQL默认引擎)与MyISAM区别:
注:
事务安全表(ACID)
原子性(Atomicity):事务是一个原子性质的操作单元,事务里面的对数据库的操作要么都执行,要么都不执行。(。。。。)
一致性(Consistency):在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。也就是说,数据必须符合数据库的规则。(个人理解:比如我们要将数据插入表中,我们不可能只是传一个名称,编号不传)
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):持久性也成为永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久的。
区分脏读,幻读,不可重复读?
脏读
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读
不可重复读,有时候也会说成“读已提交”。什么意思呢,就是在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务间隔读取数据的期间,有其他事务对这段数据进行了修改,并且已经提交,就会发生不可重复读事故。
幻读
幻读是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。举个例子,某事务在检查表中的数据数count时,是10,过一段时间之后再查是11,这就发生了幻读,之前的检测获取到的数据如同幻觉一样。(理解:比如我们充值一样,当又有人给我们的账号打¥,我们上一秒没有收到,我们刷新却可以收到了)
出现幻读和不可重复读的原因很像,都是在多次操作数据的时候发现结果和原来的不一样了,出现了其他事务干扰的现象。但是,幻读的偏重点是添加和删除数据,多次操作数据得到的记录数不一样;不可重复读的偏重点是修改数据,多次读取数据发现数据的值不一样了。
三,存储引擎
查询存储引擎(显示可用的数据库引擎和默认引擎 )
show engines;
Support列的值表示某种引擎是否能使用
YES 表示可以使用
NO 表示不能使用
DEFAULT 表示该引擎为当前默认的存储引擎
-
查看默认引擎(默认是事务型引擎)
SHOW VARIABLES LIKE 'default_storage_engine';
四、用户管理(三种权限,三个环境)
我们一般的在公司中公司会根据不同的职务来给与不同的权限:我将分为三个不同的角色来演示:1、项目经理对数据库具有的权限:增删改查,创建表、删除表等权限。
2、项目组长对数据库具有的权限:只具备增删改查权限。
3、开发人员对数据库具有的权限:只有查询权限。
一般来说会分为这三种开发人员分为三种不同的操作权限
五,通过MySQL建库,表
MySQL中默认四张表(user,db,tables_priv、columns_priv)
1.user表:
登陆的时候验证locahost,账号,密码是否正确,如果正确就会进入下一级,该表存储MySQL数据库中的用户账户信息。它包含了用户的用户名、密码、权限和其他相关属性。这张表用于认证和授权用户对数据库的访问权限。
2.db表:
Y表示拥有该权力,该表描述了数据库中的权限信息。它存储了用户对每个数据库的权限设置,如用户是否具有读取、写入和管理数据库的权限。
3.tables_priv表(表层权限)
该表存储了数据库中的表级别权限信息。它记录了用户对每个表的权限,如用户是否可以查询、插入、更新或删除表中的数据。
4.columns_priv表(字段层权限)
该表用于存储数据库中的列级别权限信息。它记录了用户对每个表中列的权限设置,如用户是否可以查询、更新或插入表中特定列的数据。
相关的SQL语句(为相关的人员设置权限)
0.查询用户
SELECT * from user;
1.创建用户并设置登录密码
#MySQL5.7
#命令:create user 用户名 identified by '密码';
#注:identified by会将纯文本密码加密作为散列值存储
create user ls identified by '123456';
#MySQL8
#用户名密码创建需要分开
#命令:create user 用户名;
create user ls;
2.查看用户信息
#MySQL5.7
select host,user,password from user;
#MySQL8
select host,user,authentication_string from user;
3.删除用户(慎用)
#命令:drop user 用户名;
#drop user ls;
4.修改用户密码
4.1 修改密码
#MySQL5.7
#命令:set password for 用户名=password('新密码');
set password for zs=password('123456');
#MySQL8
#ALTER USER 用户 IDENTIFIED WITH mysql_native_password BY '密码';
ALTER USER 'ls'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
4.2 刷新配置
#命令:flush privileges;
#MySQL5.7与MySQL8关于权限操作没有差异性
5.设置权限(Grant)
#语法:grant privileges on databasename.tablename to username@'host';
#给 zs用户 赋予 数据库db_zq中的表t_p1_user 查询权限
grant SELECT on db_zq.t_p1_user to zs@'%';
#给 zs用户 赋予 数据库db_zq中的表t_p1_user 修改权限
grant UPDATE on db_zq.t_p1_user to zs@'%';
#给 zs用户 赋予 数据库db_zq中所有表 查询权限
grant SELECT on db_zq.* to zs@'%';
#给 zs用户 赋予 数据库db_zq中所有表 所有权限
grant ALL on db_zq.* to zs@'%';
6.撤销权限(Revoke)
#语法:revoke privileges on databasename.tablename from username@'host';
#啥也不能回收,不会对GRANT ALL PRIVILEGES ON `db_zq`.* TO `zs`@`%`有任何影响
revoke DELETE on db_zq.t_p1_user from zs@'%';
#可以回收GRANT SELECT, UPDATE ON `db_zq`.`t_p1_user` TO `zs`@`%`这条权限语句
revoke all on db_zq.t_p1_user from zs@'%';
#可以回收GRANT ALL PRIVILEGES ON `db_zq`.* TO `zs`@`%`这条赋权语句带来的权限
revoke all on db_zq.* from zs@'%';
#注:revoke只能回收grants列表中更小的权限;
设置权限(Grant)和撤销权限(Revoke)的参数说明:
1) privileges: 用户的操作权限,如SELECT,INSERT,UPDATE,DELETE等,如果要授予所有权限直接使用:all;
2) databasename:数据库名;
3) tablename: 表名,如果要授予用户对所有数据库和表的操作权限直接使用:*.*;
7.查看用户权限
#命令:show grants for 用户名;
show grants for 'zs'@'%';
user表中host列的值的意义
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
创建表的sql语句:
#1.表的创建 ★
/*
语法:
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
...
列名 列的类型【(长度) 约束】
)
*/
#案例:创建表Book
CREATE TABLE book(
id INT,#编号
bName VARCHAR(20),#图书名
price DOUBLE,#价格
authorId INT,#作者编号
publishDate DATETIME#出版日期
);
DESC book;
#案例:创建表author
CREATE TABLE IF NOT EXISTS author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
)
DESC author;
#2.表的修改
/*
语法
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
*/
#①修改列名
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
#②修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
#③添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
#④删除列
ALTER TABLE book_author DROP COLUMN annual;
#⑤修改表名
ALTER TABLE author RENAME TO book_author;
DESC book;
#3.表的删除
DROP TABLE IF EXISTS book_author;
SHOW TABLES;
#通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();
#4.表的复制
INSERT INTO author VALUES
(1,'村上春树','日本'),
(2,'莫言','中国'),
(3,'冯唐','中国'),
(4,'金庸','中国');
SELECT * FROM Author;
SELECT * FROM copy2;
#1.仅仅复制表的结构
CREATE TABLE copy LIKE author;
#2.复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM author;
#只复制部分数据
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中国';
#仅仅复制某些字段
CREATE TABLE copy4
SELECT id,au_name
FROM author
WHERE 0;
六:总结:
学习MySQL需要了解基础概念、学习SQL语言、掌握MySQL命令行工具、创建和管理数据库、进行数据查询和操作、优化数据库性能、处理安全和权限管理等方面。持续学习和实践是提高MySQL技能的关键。
希望这篇博客能够帮助到您!!!