MySQL入门指南6(视图,用户管理,存储引擎,数据类型)
前期回顾:
MySQL入门指南1(进入命令行,数据库,数据表操作)
MySQL入门指南2(SQLyog使用,增删改查)
MySQL入门指南3(常用函数)
MySQL入门指南4(查询进阶,外连接)
MySQL入门指南5(索引,约束,事务)
目录
一、视图
1. 基本概念
2. 视图的基本使用
3. 视图细节
4. 视图最佳实践
二、用户管理
1. MySQL用户
2. MySQL权限
三、数据类型
1. 数值类型
2. 字符串类型
3. 日期类型
四、存储引擎
1. 基本介绍
2. 四种主要存储引擎及特点
3. 细节说明
4. 如何选择表的存储引擎
5. 修改存储引擎
五、最后的话
一、视图
一个表的列信息很多,有些信息是个人重要信息,如果我们希望用户只能查询到一个表的普通信息,有什么办法呢?这里就引出了视图。
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 = 存储引擎;五、最后的话
✨ 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!