数据库学习(MySQL)【四】【DML、约束、索引、视图、三范式...】

文章目录

      • 1、DML
      • 2、约束
      • 3、存储引擎
      • 4、事务
      • 5、索引
      • 6、视图
      • 7、三范式

1、DML

1、插入数据:insert
	语法格式:
		insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)
		要求:字段的数量和值的数量相同,并且数据类型要对应相同。
		
	 字段可以省略不写,但是后面的value对数量和顺序都有要求。
		insert into t_student values(1,'jack','0','gaosan2ban','1986-10-23');
		
	一次插入多行数据
        insert into t_student
            (no,name,sex,classno,birth) 
        values
            (3,'rose','1','gaosi2ban','1952-12-14'),(4,'laotie','1','gaosi2ban','1955-12-14');
            
2、修改数据:update
	语法格式:
		update 表名 set 字段名1=值1,字段名2=值2... where 条件;
		注意:没有条件整张表数据全部更新。

3、删除数据:delete
	语法格式:
		delete from 表名 where 条件;	
	注意:没有条件全部删除。	

2、约束

什么是约束?常见的约束有哪些呢?
	在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的
	合法性、有效性、完整性。
	常见的约束有哪些呢?
		非空约束(not null):约束的字段不能为NULL
		唯一约束(unique):约束的字段不能重复,但可以为NULL
		主键约束(primary key):约束的字段既不能为NULL,也不能重复,一张表的主键约束只能有1个。
		外键约束(foreign key):...(简称FK)

主键(pk)约束的作用?

主键有什么作用?

  • 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键
  • 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)
  • 主键值自增:primary key auto_increment,从 1 开始

外键(Fk)约束的作用?

      请设计数据库表,用来维护学生和班级的信息?
  	第一种方案:一张表存储所有数据
  	no(pk)			name			classno			classname

​ 1 zs1 101 北京大兴区经济技术开发区亦庄二中高三1班
​ 2 zs2 101 北京大兴区经济技术开发区亦庄二中高三1班
​ 3 zs3 102 北京大兴区经济技术开发区亦庄二中高三2班
​ 4 zs4 102 北京大兴区经济技术开发区亦庄二中高三2班
​ 5 zs5 102 北京大兴区经济技术开发区亦庄二中高三2班
缺点:冗余。【不推荐】

​ 第二种方案:两张表(班级表和学生表)
t_class 班级表
​ cno(pk) cname


​ 101 北京大兴区经济技术开发区亦庄二中高三1班
​ 102 北京大兴区经济技术开发区亦庄二中高三2班

t_student 学生表

​ sno(pk) sname classno(该字段添加外键约束fk)–加上外键就不能乱写了必须是上边表有的值

​ 1 zs1 101
​ 2 zs2 101
​ 3 zs3 102
​ 4 zs4 102
​ 5 zs5 102

将以上表的建表语句写出来:

t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。

	顺序要求:
		删除数据的时候,先删除子表,再删除父表。
		添加数据的时候,先添加父表,在添加子表。
		创建表的时候,先创建父表,再创建子表。
		删除表的时候,先删除子表,在删除父表。
	
	drop table if exists t_student;
	drop table if exists t_class;

	create table t_class(
		cno int,
		cname varchar(255),
		primary key(cno)
	);

	create table t_student(
		sno int,
		sname varchar(255),
		classno int,
		primary key(sno),
		foreign key(classno) references(引用) t_class(cno)
	);

​ 外键可以为NULL。

被引用的字段不一定是主键,但至少具有unique约束。


3、存储引擎

创建表的完整语句

CREATE TABLE `t_x` (
	`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

建表的时候可以指定存储引擎,也可以指定字符集。
mysql默认使用的存储引擎是InnoDB方式。默认采用的字符集是UTF8.

什么是存储引擎呢?

  • 存储引擎这个名字只有在mysql中存在。(Oracle中有对应的机制,但是不叫做存储引擎。Oracle中没有特殊的名字,就是“表的存储方式”)
  • mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。 每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎。

几种常见的存储引擎

MyISAM:
			这种存储引擎不支持事务。
			MyISAM是mysql最常用的存储引擎,但是这种引擎不是默认的。
			MyISAM采用三个文件组织一张表:
				xxx.frm(存储格式的文件)
				xxx.MYD(存储表中数据的文件)
				xxx.MYI(存储表中索引的文件)
			优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。
			缺点:不支持事务。
InnoDB:
			优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。
			表的结构存储在xxx.frm文件中
			数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
			这种InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。
			InnoDB支持级联删除和级联更新。
MEMORY:
			缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。
			优点:查询速度最快。
			以前叫做HEPA引擎。

4、事务

什么是事务?

(rollback,commit)【rollbac回滚到上一个提交点】
一个事务是一个完整的业务逻辑单元,不可再分。

比如:银行账户转账,从A账户向B账户转账10000.需要执行两条update语句:
			update t_act set balance = balance - 10000 where actno = 'act-001';
			update t_act set balance = balance + 10000 where actno = 'act-002';
		
以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。
要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”。
和事务相关的语句只有:DML语句。(insert delete update)

事务的特性

事务包括四大特性:ACID
		A: 原子性:事务是最小的工作单元,不可再分。
		C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
		I:隔离性:事务A与事务B之间具有隔离。
		D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

关于事务之间的隔离性

事务隔离性存在隔离级别,理论上隔离级别包括4个:
			第一级别:读未提交(read uncommitted)
				对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
				读未提交存在【脏读】(Dirty Read)现象:表示读到了脏的数据。
			第二级别:读已提交(read committed)
				对方事务提交之后的数据我方可以读取到。
				这种隔离级别解决了: 脏读现象没有了。
				读已提交存在的问题是:【不可重复读】。
			第三级别:可重复读(repeatable read)
				这种隔离级别解决了:不可重复读问题。
				这种隔离级别存在的问题是:读取到的数据是【幻象】。
			第四级别:序列化读/串行化读(serializable) 
				解决了所有问题。
				效率低。需要事务排队。
			
oracle数据库默认的隔离级别是:读已提交。
mysql数据库默认的隔离级别是:可重复读。
  • mysql事务默认情况下是自动提交的。

  • 什么是自动提交?

只要执行任意一条DML语句则提交一次。这样不可以控制多条DML语句一起提交事务

  • 怎么关闭自动提交?

start transaction


5、索引

什么是索引?有什么用?

索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。
在数据库方面,查询一张表的时候有两种检索方式:
			第一种方式:全表扫描
			第二种方式:根据索引检索(效率很高)
			
索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。

select ename,sal from emp where ename = 'SMITH';
		当ename字段上没有添加索引的时候,以上sql语句会进行全表扫描,扫描ename字段中所有的值。
		当ename字段上添加索引的时候,以上sql语句会根据索引扫描,快速定位。

怎么创建索引对象?怎么删除索引对象?

创建索引对象:
			create index 索引名称 on 表名(字段名);
删除索引对象:
			drop index 索引名称 on 表名;

什么时候考虑给字段添加索引?(满足什么条件)

1. 数据量庞大。(根据客户的需求,根据线上的环境)
2. 该字段很少的DML操作。(因为字段进行修改操作,索引也需要维护)
3. 该字段经常出现在where子句中。(经常根据哪个字段查询)
  • 注意:主键和具有unique约束的字段自动会添加索引。
  • 所以,根据主键查询效率较高。尽量根据主键检索。

索引底层采用的数据结构是:B + Tree

模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的

6、视图

什么是视图?

站在不同的角度去看到数据。(同一张表的数据,通过不同的角度去看待)。
相当于以原表中的某些字段,“复制”了一张表,但是操作视图会影响到原表。

怎么创建视图?怎么删除视图?

create view myview as select empno,ename from emp;
drop view myview;

注意:只有DQL语句才能以视图对象的方式创建出来。

视图的作用?

视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。

7、三范式

什么是设计范式?

设计表的依据。按照这个三范式设计的表不会出现数据冗余。

三范式都是哪些?

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。(例如联系方式可以分为电话、邮箱)
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。

你可能感兴趣的:(MySql)