MySQL入门指南6(视图,用户管理,存储引擎,数据类型)
Posted 爱笑的钮布尼茨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL入门指南6(视图,用户管理,存储引擎,数据类型)相关的知识,希望对你有一定的参考价值。
前期回顾:
目录
一、视图
一个表的列信息很多,有些信息是个人重要信息,如果我们希望用户只能查询到一个表的普通信息,有什么办法呢?这里就引出了视图。
1. 基本概念
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真是表(基表)。
视图与基表关系示意图
2. 视图的基本使用
1. 创建视图
CREATE VIEW 视图名 AS SELECT 语句;-- 视图创建好之后可以当作一个表使用
2. 更新视图
ALTER VIEW 视图名 AS SELECT 语句;
3. 删除视图
DROP VIEW 视图名1,视图名2;
4. 查看视图信息
SHOW CREATE VIEW 视图名;
代码演示:
-- 创建视图
CREATE VIEW emp1 AS SELECT ename,sal,deptno FROM emp;
-- 展示视图信息
SHOW CREATE VIEW emp1;
-- 查找视图
-- 视图创建好之后可以当成一个表使用
SELECT * FROM emp1;
-- 更新视图中的列
ALTER VIEW emp1 AS SELECT ename,sal FROM emp;
-- 删除视图
DROP VIEW emp1;
3. 视图细节
1. 创建视图后,到数据库文件里去看,对应视图的只有一个视图结构文件(视图名.frm)
2. 视图的数据变化会影响到基表,基表的数据变化也会影响视图。
3. 视图中可以再使用视图,但数据仍来自于基表。
代码演示:
-- 视图中的数据变化会影响到基表,基表的数据变化也会影响视图
-- 更改基表中的数据,视图中的数据会发生变化
UPDATE emp
SET sal = 1000
WHERE ename = 'BLAKE';
-- 更改视图中的数据,基表中的数据会发生变化
UPDATE emp1
SET sal = 5000
WHERE ename='BLAKE';
-- 视图这种可以再使用视图,但数据仍来自于基表
-- 以emp创建视图emp1
CREATE VIEW emp1 AS SELECT ename,sal,deptno FROM emp;
-- 以emp1创建视图emp2
CREATE VIEW emp2 AS SELECT ename,sal FROM emp1;
SELECT * FROM emp;
SELECT * FROM emp1;
SELECT * FROM emp2;
4. 视图最佳实践
1. 安全
一些数据表有着重要的信息,有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
2. 性能
关系数据库的数据常常会分表存储,使用外键建立这些表之间的关系。这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,而且效率也相对比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
3. 灵活
如果系统中有一张旧的表,这张表由于设计的问题,即将被丢弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。
二、用户管理
1. mysql用户
用户概述
MySQL中的用户都存储再mysql数据库的user表中
其中user表的重要字段说明:
1. host :允许登录的”位置“,localhost 表示该用户只允许本机登录,也可以指定ip地址,比如:192.168.1.100 ;
2. user :用户名;
3. authentication string :密码,时通过mysql的password()加密函数加密后的密码;
用户管理
1. 创建用户
-- 创建用户同时指定密码 CREATE USER `用户名`@`允许登录位置` -- 用反引号 IDENTIFIED BY '密码'; -- 密码包含在单引号里
2. 删除用户
DROP USER `用户名`@`允许登录位置`; -- 用反引号
3. 用户修改密码
-- 修改自己的密码 SET PASSWORD = PASSWORD('密码'); -- 修改他人的密码(当前登录用户有该权限) SET PASSWORD FOR `用户名`@`允许登录位置` = PASSWORD('密码');
细节说明:
1.在创建用户的时候,如果没有指定“允许登录位置”,则默认为%,即表示所有ip都有连接权限。 CREATE USER 用户名;
2. 也可以这样指定 CREATE USER `用户名`@`192.168.1.%` 表示该用户192.168.1.*的ip都可以登录mysql服务。
3. 在删除用户的时候,如果“允许登录位置”不是%,则需要明确指定 `用户`@`允许登入位置`
代码演示:
-- 创建用户同时指定密码
CREATE USER `newbniz`@`localhost`
IDENTIFIED BY '125656556';
CREATE USER `haohao`@`localhost`
IDENTIFIED BY '123456';
-- 操作mysql数据库
USE mysql;
-- 查询user表中的user
SELECT `user` FROM `user`;
-- 删除用户
DROP USER `haohao`@`localhost`;
-- 用户修改密码
-- 修改自己的密码
SET PASSWORD = PASSWORD('123456');
-- 修改他人的密码(当前登录用户有该权限)
SET PASSWORD FOR `newbniz`@`localhost` = PASSWORD('123456');
2. MySQL权限
权限介绍
权限管理
1.给用户授权
基本用法:
GRANT 权限列表 ON 库.对象名 TO `用户名`@`登录位置` IDENTIFIED BY '密码';
说明:
a. 权限列表,多个权限用逗号隔开。
-- 赋予单个权限 GRANT SELECT ON ... -- 赋予多个权限 GRANT SELECT,DELETE,CREATE ON ... -- 赋予除GRANT OPTION之外的所有简单权限 GRANT ALL ON ...
b. IDENTIFIED BY 可以省略,也可以写出
i. 如果该用户存在,就是修改该用户的密码。
ii. 如果该用户不存在,就是创建该用户。
c. 特别说明
i. *.* 表示本系统中的所有数据库的所有对象(表,视图,存储过程等)
ii. 库.* 表示某个数据库中的所有数据对象(表,视图,存储过程等)
2. 回收用户授权
基本语法
REVOKE 权限列表 ON 库.对象名 FROM `用户名`@`登录位置`;
3. 权限生效指令
基本语法
-- 如果权限没有生效,可以执行下面的命令 FLUSH PRIVILEGES;
代码演示:
-- 权限管理
-- 给用户授权 -- IDENTIFIED BY '密码' 若加上这一句则修改密码为该密码
-- 赋予单项权限
GRANT SELECT ON test.* TO `newbniz`@`localhost` ;
-- 赋予多项权限
GRANT SELECT,DELETE,INSERT ON test.* TO `newbniz`@`localhost`;
-- 赋予除GRANT OPTION 外所有简单权限
GRANT ALL ON test.* TO `newbniz`@`localhost` IDENTIFIED BY '123456';
-- 回收用户授权
-- 回收指定权限
REVOKE SELECT ON test.* FROM `newbniz`@`localhost`;
-- 回收所有权限
REVOKE ALL ON test.* FROM `newbniz`@`localhost`;
-- 权限生效指令
FLUSH PRIVILEGES;
三、数据类型
MySQL数据库的常用数据类型大致可以分为三类,分别是 数值类型,字符串类型,日期类型。
具体如下图所示:
1. 数值类型
数值类型分为两类,小数和整数。整数根据数值范围的不同,又可分为TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 等。小数根据精确度的不同,又可分为FLOAT,DOUBLE,DECIMAL 。详细说明见上表。
整数
根据数据范围需求,在满足需求的情况下,尽可能地选择占用空间小的整数数据类型。
一般地,若没有指定UNSIGNED类型,则对应的整数类型就是有符号的;反之就是无符号的。以TINYINT为例,未指定 UNSIGNED则可存放整数范围为 -128 到 127,指定UNSIGNED类型可存放整数范围为 0 到 255 。
-- 设置为无符号类型只需要在后面加上 UNSIGNED 即可
CREATE TABLE test17(
num1 TINYINT NOT NULL DEFAULT 0, -- 未指定UNSIGNED
num2 TINYINT UNSIGNED NOT NULL DEFAULT 0); -- 指定UNSIGNED
INSERT INTO test17(num1)
VALUES(127);
INSERT INTO test17(num2)
VALUES(255);
SELECT * FROM test17;
小数
1. FLOAT/DOUBLE [ UNSIGNED ] , FLOAT 单精度,DOUBLE 双精度。
2. DECIMAL [ M,D ] [ UNSIGNED ]
a. 可以支持更加精确的小数位。M是小数总位数(小数点前+小数点后),D是小数点后面的位数。
b. 如果D是0,则值没有小数点或分数部分。M最大65。D最大30。如果D被省略,则默认是0。若M被省略,则默认是10 。
建议:如果希望小数精度高,推荐使用decimal。
代码演示:
--- 小数
-- M 是小数总位数(小数点前+小数点后)
-- D是小数点后的位数
-- 当小数点后的位数多于D时,会自动四舍五入
-- 小数点前的位数不得大于 M-D,否则会报错
CREATE TABLE test15(
num1 FLOAT,
num2 DOUBLE,
num3 DECIMAL(6,5));
INSERT INTO test15
VALUES(111111111111.1111111,4111111115151.6548545454545,3.141595654545);
INSERT INTO test15
VALUES(11111.1111111111,111111111111.1111111111111111,2.666666);
SELECT * FROM test15;
CREATE TABLE test16(
num1 FLOAT,
num2 DOUBLE,
num3 DECIMAL); -- 此时M D省略,M默认为10,D默认为0
-- 小数点后有小数时,会自动四舍五入
INSERT INTO test16
VALUES(1.2222222,25.5455,11111112111.52850);
SELECT * FROM test16;
2. 字符串类型
字符串类型中常用的有两种。
1. char 固定长度字符串,最大255字符串
2. varchar 可变长度字符串,最大65532字节(utf8编码最大21844字符,1-3个用于记录大小)
细节一:
1. char(size) 这个size表示字符数(最大255),不是字节数,不管是中文还是字母都只能放 size 个,按字符个数计算。
2. varchar(size) 这个size也是表示字符数,不管中文还是字母都以定义好的表的编码来存放数据。 最多只能存放size个,按字符个数计算。若表的编码是UTF8 则 size 最大值为(65535-3)/ 3 = 21844;若表的编码是GBK,则size的最大值为(65535 - 3)/ 3 = 32766;
细节二:
1. char(size) 是定长(固定大小),即:即使你插入了一个小于size的字符,也会占用(分配)size个字符的空间。
2. varchar(size) 是变长(变化大小),即:如果你插入了一个小于size的字符,实际占用空间并不是size个字符,而是按照实际占用空间来分配;此外varchar本身还需要1-3个字节用来记录存放内容长度。
3. 若未指定char的字符串长度size,则size默认为1;若varchar未指定字符串长度size,则会报错。
细节三:
什么时候使用 char,什么时候使用 varchar?
1. 如果数据是定长,推荐使用 char,比如:MD5密码,手机号,性别等。
2. 如果数据长度不确定,推荐使用 varchar,比如:留言,文章等。
查询速度:char > varchar
细节四:
在存放文本时,也可以使用 TEXT 数据类型。可以将 TEXT 列视为 VARCHAR 列,注意 TEXT 不能有默认值,大小 0 - 2^16 字节。
若希望存放更多字符,可以选择 MEDIUMTEXT 0 - 2 ^ 24 字节 或者 LONGTEXT 0 - 2 ^ 32字节。
3. 日期类型
日期类型有三种。
1. date 用于存储 年月日 这样的日期
2. datetime 用于存储 年月日时分秒 这样的日期
3. timestamp 时间戳 ,获取系统当前时间 用于自动记录insert update的时间
代码如下:
-- 日期类型有三种
-- 1. date 用于存储 年月日 这样的日期
-- 2. datetime 用于存储 年月日时分秒 这样的日期
-- 3. timestamp 时间戳 ,获取系统当前时间 用于自动记录insert update的时间
-- 我们以这三种日期类型创建一个测试表
CREATE TABLE test11(
t1 DATE,
t2 DATETIME,
t3 TIMESTAMP);
SELECT * FROM test11;
-- 按照不同日期类型对应的格式传入数据
INSERT INTO test11
VALUES('2011-11-11','2011-11-11 12:45:32',NULL);
-- 由于date只能存储年月日,所以当你传入年月日时分秒时会自动取前面的年月日
-- 而detetime能存储年月日时分秒,当我们只传入年月日时,后面的时分秒会自动补为00:00:00
-- timestamp 传入null时,会自动获取当前系统时间
INSERT INTO test11
VALUES('2011-01-10 14:45:32','2011-11-11',NULL);
DROP TABLE test11;
四、存储引擎
1. 基本介绍
1. MySQL的表类型由存储引擎(Strorage Engines)决定,主要包括MYISAM、INNODB、MEMORY 等。
2. MySQL数据表主要支持六种类型,分别是:CSV、MEMORY、ARCHIVE、MRG_MYISAM、MYISAM、INNOD。
3. 这六种又分为两大类,一类是“事务安全型”,比如:INNODB;其余都属于第二类,称为“非事务安全型”。
2. 四种主要存储引擎及特点
3. 细节说明
1. MYISAM不支持事务,也不支持外键,但其访问速度快,对事务完整性没有要求。
2. INNODB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全。但是比起MYISAM存储引擎,INNODB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
3. MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦MySQL服务关闭,表中的数据就会丢失掉,表的结构还在。
温馨提示:可以通过SHOW ENGINES;指令,来获得一些各种引擎的信息。
4.如何选择表的存储引擎
1. 如果你的应用不需要事务,处理的只是基本的CRUD操作,那么MYISAM是不二选择,速度快。
2. 如果需要支持事务,选择INNODB
3. MEMORY存储引擎就是将数据存储再内存中,由于没有磁盘IO等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。
5. 修改存储引擎
ALTER TABLE 表名 ENGINE = 存储引擎;
五、最后的话
✨ 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
以上是关于MySQL入门指南6(视图,用户管理,存储引擎,数据类型)的主要内容,如果未能解决你的问题,请参考以下文章