0


MySQL入门指南6(视图,用户管理,存储引擎,数据类型)

前期回顾:

    MySQL入门指南1(进入命令行,数据库,数据表操作)

    MySQL入门指南2(SQLyog使用,增删改查)

    MySQL入门指南3(常用函数)

    MySQL入门指南4(查询进阶,外连接)

    MySQL入门指南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 = 存储引擎;

五、最后的话

✨ 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

标签: mysql 数据库 java

本文转载自: https://blog.csdn.net/qq_64449257/article/details/126824714
版权归原作者 爱笑的钮布尼茨 所有, 如有侵权,请联系我们删除。

“MySQL入门指南6(视图,用户管理,存储引擎,数据类型)”的评论:

还没有评论