首页 > 数据库 >mysql表类型和存储引擎和视图

mysql表类型和存储引擎和视图

时间:2023-05-26 12:34:02浏览次数:45  
标签:存储 基表 -- 视图 emp mysql SELECT

1. mysql表类型和存储引擎  803

1.1 基本介绍

1. MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。

2. MySQL数据表主要支持六种类型,分别是: CSV、 Memory、ARCHIVE、MRG_MYISAM、MYISAM、 InnoBDB.

3.这六种又分为两类,一类是”事务安全型”(transaction-safe), 比如:InnoDB;其余都属于第类,称为”非事务安全型" (non-transaction-safe)[mysiam和memory].

mysql表类型和存储引擎和视图_存储引擎

显示当前数据库支持的存储引擎:  show engines;

1.2 主要的存储引擎/表类型特点  803

mysql表类型和存储引擎和视图_mysql_02

1.3 细节说明  803

我这里重点给大家介绍三种: MyISAM、InnoDB、MEMORY

1. MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求

2. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

3. MEMORY存储引擎使用存在内存中的内容来创建表。 每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦MySQL服务关闭,表中的数据就会丢失掉,表的结构还在。

2. 三种存储引擎表使用案例  804

对前面我们提到的三种存储引擎,我们举例说明:

代码在E:\java学习\初级\course164\db_

engines

# mysql表类型和存储引擎  803
-- 查看所有的存储引擎
SHOW ENGINES

--  三种存储引擎表使用案例  804
-- innodb,存储引擎,是前面使用过. 
-- 1. 支持事务 2. 支持外键 3. 支持行级锁

-- myisam 存储引擎
CREATE TABLE t28(
	id INT,
	`name` VARCHAR(32)) ENGINE MYISAM
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁
START TRANSACTION;-- 开启事务
SAVEPOINT t1
INSERT INTO t28 VALUES(1,'jack');
SELECT * FROM t28
ROLLBACK TO t1-- 虽然显示回滚成功,但是爆出警告,而且数据并没有回滚成功
SELECT * FROM t28


-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了 Mysql 服务,数据丢失, 但是表结构还在]
-- 2. 执行速度很快(没有 IO 读写) 3. 默认支持索引(hash 表)
CREATE TABLE t29(
	id INT,
	`name` VARCHAR(32)) ENGINE MEMORY
INSERT INTO t29
	VALUES(1,'tom'),(2,'jack'),(3,'lzl')
DESC t29-- 关闭了 Mysql 服务,数据丢失, 但是表结构还在
SELECT * FROM t29-- 数据没了

3. 如何选择表的存储引擎  804

1.如果你的应用不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择,速度快

2.如果需要支持事务,选择InnoDB。

3. Memory存储引擎就是将数据存储在内存中,由于没有磁盘I./0的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。(经典用法用户的在线状态().)

3.1 修改存储引擎  804

mysql表类型和存储引擎和视图_数据_03

代码在E:\java学习\初级\course164\db_

engines
-- 修改存储引擎  804
ALTER TABLE `t29` ENGINE = INNODB

4. 视图(view)  805

4.1 看一个需求

emp表的列信息很多,有些信息是个人重要信息(比如sal, comm,mgr, hiredate) ,如果我们希望某个用户只能查询emp表的(empno、ename、 job和deptno)信息,有什么办法? =>视图

mysql表类型和存储引擎和视图_数据_04

4.2 基本概念  805

1.视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)

2.视图和基表关系的示意图

mysql表类型和存储引擎和视图_存储引擎_05

4.3 视图的基本使用  806

1. create view 视图名 as select语句(创建视图)

2. alter view 视图名 as select语句----(修改视图相当于,更新成新的视图)

3. SHOW CREATE VIEW 视图名(查看创建视图的指令)

4. drop view 视图名1,视图名2(删除视图)

4.4 完成前面提出的需求

创建一个视图emp view01, 只能查询emp表的(empno、ename、 job和deptno )信息

4.3和4.4代码在E:\java学习\初级\course164\db_

view

#视图的使用  806
-- 创建一个视图emp view01, 只能查询emp表的(empno、ename、 job和deptno )信息
-- 创建视图
CREATE VIEW emp_view01
	AS
	SELECT empno,ename,job,deptno FROM emp;
-- 查看视图
DESC emp_view01
SELECT *FROM emp_view01
-- 查看视图的部分信息
SELECT empno,job FROM emp_view01

-- 3. SHOW CREATE VIEW 视图名(查看创建视图的指令)
SHOW CREATE VIEW emp_view01
-- 删除视图
DROP VIEW emp_view01

4.5 视图细节讨论  806

1.创建视图后,到数据库去看,对应视图只有一个视图结构文件,并没有数据文件(因为视图数据来自基表)(形式:视图名.frm)

2.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]

------针对前面的雇员管理系统----

mysql> create view myview as select empno ,ename,job, 

comm from emp;

mysql> select * from myview;

mysql> update myview set comm= 200 where empno= 7369; //修改视图,对基表都有变化

mysql> update emp set comm= 100 where empno=7369; //修改基表,对视频也有变化

3.视图中可以再使用视图,数据仍然来自基表.. [案例演示] 

代码在E:\java学习\初级\course164\db_

view

-- 视图细节讨论  806
-- 1.创建视图后,到数据库去看,对应视图只有一个视图结构文件,
-- 并没有数据文件(因为视图数据来自基表)(形式:视图名.frm)
-- 2.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]

--  通过修改视图,验证2观点
UPDATE emp_view01
	SET job = 'MANAGER'
	WHERE empno=7369
SELECT * FROM emp-- 查询基表
SELECT * FROM emp_view01-- 查询视图

-- 修改基表,会影响视图
UPDATE emp
	SET job = 'SALESMA'
	WHERE empno = 7369
SELECT * FROM emp-- 查询基表
SELECT * FROM emp_view01-- 查询视图

-- 3.视图中可以再使用视图,数据仍然来自基表.. [案例演示] 
-- 比如从 emp_view01 视图中,选出 empno,和 ename 做出新视图
DESC emp_view01

CREATE VIEW emp_view02
	AS
	SELECT empno,ename FROM emp_view01
DESC emp_view02
SELECT * FROM emp_view02

4.6 视图最佳实践  807

1. 安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。

2. 性能。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接JOIN)。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。

3. 灵活。如果系统中有-张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。

4.7 视图课堂练习  807

针对emp , dept, 和salgrade 张表.创建一个视图emp_view03,可以显示雇员编号,雇员名,雇员部门名称和薪水级别[即使用三张表,构建一个视图] 

代码在E:\java学习\初级\course164\db_

view02

-- 视图课堂练习   807
-- 针对emp , dept, 和salgrade 张表.创建一个视图emp_view03,可以显示雇员编号
-- ,雇员名,雇员部门名称和薪水级别[即使用三张表,构建一个视图] 
/*
分析: 使用三表联合查询,得到结果
将得到的结果,构建成视图
*/
-- 先查询得到 雇员编号,雇员名,雇员部门名称 和 薪水级别
SELECT empno,ename,dname,grade
	FROM emp,dept,salgrade
	WHERE emp.deptno = dept.deptno AND 
	(sal BETWEEN losal AND hisal)#员工编号和部门中的编号保持一致,员工薪水要在工资级别最低和最高之间
-- 将得到的结果,构建成视图
CREATE VIEW emp_view03
	AS
	SELECT empno,ename,dname,grade
	FROM emp,dept,salgrade
	WHERE emp.deptno = dept.deptno AND 
	(sal BETWEEN losal AND hisal)
DESC emp_view03
SELECT * FROM emp_view03

标签:存储,基表,--,视图,emp,mysql,SELECT
From: https://blog.51cto.com/u_15784725/6354960

相关文章

  • mysql用户管理
    1. Mysql 用户  808其中user表的重要字段说明:1. host: 允许登录的"位置”, localhost表示该用户只允许本机登录,也可以指定ip地址,比如:192.168.1.1002. user: 用户名;3. authentication string:密码,是通过mysql的password()函数加密之后的密码。1.1 创建用户  808cre......
  • 数据库系列-MYSQL篇之-主从同步
    1主从同步概述mysql主从同步,即MySQLReplication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Sla......
  • MySQL中--skip-password参数作用
     MySQL中--skip-password参数探究 本篇使用客户端:mysql版本:MySQL8认证插件:mysql_native_password对于初始化数据库时,若是使用了--initialize-inscure选项,则对于用户root@localhost会使用空密码。2023-05-26T09:20:21.205673+08:006[Warning][MY-010453][Server]roo......
  • mysql创建用户及分配操作权限
    MySQL在安装时,会默认创建一个名为root的用户,该用户拥有超级权限,可以控制整个MySQL服务器,所以如果滥用root账户,对于系统来说是很不安全的。MySQL提供了以下3种方法创建用户。使用GRANT语句创建用户使用CREATEUSER语句创建用户在mysql.user表中添加用户1.使......
  • 关于MySQL的JDBC Driver加载过程详解
    在使用JDBC时,都需要提前加载对应数据库的Driver类,MySQL为例:Class.forName("com.mysql.jdbc.Driver")但是不写这句代码也可以让 com.mysql.jdbc.Driver类成功加载,这就涉及到java.sql.DriverManager类了,先看一下代码:publicclassDriverManager{//注册驱动的集合priva......
  • 5分钟搞定Linux安装Mysql5.7(简单快捷,建议收藏)
    本文记录下我近期在Linux环境下安装Mysql5.7的实践经历。服务器版本Mysql版本Centos7.65.7.321.下载Mysql下载地址:https://downloads.mysql.com/archives/community/进入页面后选择你需要的版本进行下载,这里提供了2种格式:tar.gz和tar。如果下载不方便,可以直接从我的网盘里面下......
  • MySQL常用命令
    #安装mysql后查看初始密码cat/var/log/mysqld.log#登录mysqlmysql-u[user]-p[密码]-h[远程主机ip]#本地登录可以简写为mysql-uroot-p#设置密码长度#【8.0】setglobalvalidate_password.length=6;#【5.7】setglobalvalidate_password_length=6;#设置......
  • MySQL安装
    1、检查是否已经安装了mysql和mariadbrpm-qa|grepmysqlrpm-qa|grepmariadb#如果已经安装,就先卸载:rpm-e--nodeps软件名2、安装mysql按顺序安装:8.0.28-1.el7版本rpm-ivhmysql-community-common-8.0.28-1.el7.aarch64.rpmrpm-ivhmysql-community-cli......
  • 【转载】Sqlserver存储过程中使用Select和Set给变量赋值
    @@sqlserverselect赋值  Sqlserver存储过程是时常使用到的一个数据库对象,在存储过程中会使用到Declare来定义存储过程变量,定义的存储过程变量可以通过Set或者Select等关键字方法来进行赋值操作,使用Set对存储过程变量赋值为直接赋值,使用Select则一般从数据表中查找出符合条......
  • MySQL-DQL
    准备测试表,先跟着执行下面的SQL#1.登录MySQL后#2.创建test_database数据库,不存在则创建createdatabaseifnotexiststest_database;#2.1.如果test_database库存在,可以根据自己意愿删除或换个名称dropdatabasetest_database;#删除test_database数据库#3.进入刚创建的库......