MySQL 基础知识(三)

10 篇文章 1 订阅
5 篇文章 0 订阅


主要分享一些数据库相关的知识
参考资料


索引

一种高效获取数据的存储结构,包含了对数据表里所有记录的引用指针
数据库索引,是一种数据结构,用来协助快速查询、高效获取数据和更新数据库表中数据。它是基于一列或多列数据值的排序和快速查找技术。
数据库的索引实现基于B+Tree


B+树的两种索引实现方式:
第一种:非聚集索引实现方式-MyISAM

MyISAM的索引文件和数据文件是分离的,索引文件仅仅存储的是保存数据记录的地址;
B+树叶子节点的data域保存的是数据记录的地址,然后这些地址和表中的行列数据是一一对应的。

MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址,读取相应的数据;
在这里插入图片描述


第二种:聚集索引的实现方式-InooDB
InooDB的数据文件本身就是索引文件;
在InnoDB中,表数据文件本身就是B+树组织的一个索引结构,这棵树的叶子节点data域保存了完整的数据记录
在这里插入图片描述


索引的优缺点

使用索引查询不一定能提高查询的性能
优点:索引可以加快数据的检索速度
缺点:创建和维护索引都会消耗时间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率


百万级别或以上的数据如何删除
关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的

1、所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)
2、然后删除其中无用数据(此过程需要不到两分钟)
3、删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。
4、与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。


索引的几种类型

主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键;
唯一索引:数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引;
普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值;
全文索引: 目前搜索引擎中使用的一种关键技术;


索引的底层数据结构 BTree Hash

在Mysql中使用较多的索引有Hash索引、B+树索引; 索引算法:BTree算法和Hash算法;
我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表;

B Tree 索引

在Mysql中,索引属于存储引擎级别的概念。mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)

查询方式
主键索引区:PI(关联保存的时数据的地址)按主键查询,
普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快


B+tree性质叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引
2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。
5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。


B+树的实现

B+树的定义 : B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,其他各层的子节点作为索引使用

一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素

B+tree性质

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引
2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.)所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。
5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。


B树和B+树的区别

在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值
B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
在这里插入图片描述


使用B树和B+树各自有什么好处

使用B树的好处
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。
这种特性使得B树在特定数据重复多次查询的场景中更加高效。

使用B+树的好处
由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。
B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间


关于B树和B+树总结

为了便于说明,我们先定义一条数据记录为一个二元组[key,data],key为记录的键值,key唯一;data为数据记录除key外的数据。

B树
每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。
在这里插入图片描述


B+树
只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针
在这里插入图片描述


为什么选择B+树而不是B树作为数据库索引的数据结构?

1、原因有很多,最主要的是这棵树矮胖
一般来说,索引很大,往往以索引文件的形式存储在磁盘上,索引查找时产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的时间复杂度树高度越小,I/O次数越少

2、因为它中间节点不存储data,只存储key,这样一个节点就可以存储更多的key;叶子节点同时存储 key 和 value
3、后来,在B+树上增加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针(B+树的叶子节点是一个链式结构),这样一棵B+树成了数据库系统实现索引的首选数据结构


红黑树

红黑树是一种平衡二叉搜索树
Linux主要的平衡二叉树数据结构就是红黑树。红黑树具有特殊的着色属性,或红色或黑色

红黑树因遵循下面六个属性,所以能维持半平衡结构:
1.所有的节点要么着红色,要么着黑色
2.叶子节点都是黑色
3.叶子节点不包含数据
4.所有非叶子结点都有两个子节点
5.如果一个节点是红色,则它的子节点都是黑色
6.在一个节点到其叶子节点的路径中,如果总是包含同样数目的黑色节点,则该路径相比其他路径是最短的


红黑树为什么是半平衡的?
上述条件,保证了最深的叶子节点的深度不会大于两倍的最浅叶子节点的深度。所以,红黑树总是半平衡的

首先,第五个属性,一个红节点不能是其他红色节点的子节点或者父节点
第六个属性保证了,从树的任何节点到其叶子节点的路径都具有相同数目的黑色节点,树里的最长路径则是红黑交替节点路径,所以最短路径必然是具有相同数量黑色节点的——只包含黑色节点的路径
于是从根节点到叶子节点的的最长路径不会超过最短路径的两倍


在MySQL中,最常用的两个存储引擎是MyISAM和InnoDB,它们对索引的实现方式是不同的。

MyISAM—非聚集索引
data域存的是数据的地址。索引是索引,数据是数据。索引和数据是分开存放的索引放在XX.MYI文件中,数据放在XX.MYD文件中,所以也叫非聚集索引
在这里插入图片描述
InnoDB — 聚集索引

data域存的是数据本身。索引也是数据。数据和索引存在一个XX.IDB文件中,所以也叫聚集索引
在这里插入图片描述
另加两种存储引擎的区别
1、MyISAM是非事务安全的,而InnoDB是事务安全的
2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁
3、MyISAM支持全文类型索引,而InnoDB不支持全文索引
4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM
5、MyISAM表保存成文件形式,跨平台使用更加方便
6、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量select操作可选择
7、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,可选择。


哈希索引

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字指向了同一个Hash值),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。

在这里插入图片描述


Hash索引和B+树索引各自有什么特点

首先要知道Hash索引和B+树索引的底层实现原理:
hash索引底层就是hash表, 实现查找数据的思路是:进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。
B+树底层实现是多路平衡查找树实现查找数据的思路是:对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。

那么可以看出他们有以下的不同:

hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。
而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
hash索引不支持使用索引进行排序,原理同上。
hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为hash函数的不可预测。AAAA和AAAAB的索引没有相关性。
hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。
hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。
因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。


数据库为什么使用B+树而不是B树

1、B树只适合随机检索,而B+树同时支持随机检索和顺序检索
2、B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具体信息的指针,只是作为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;
3、B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
4、B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。
5、增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。


B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,
在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。 在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。


聚簇索引和非聚簇索引

聚簇索引:将数据 存储与索引放到了一起,找到索引也就找到了数据;
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因


索引的基本原理

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理很简单,就是把无序的数据变成有序的查询

把创建了索引的列的内容进行排序
对排序结果生成倒排表
在倒排表内容上拼上数据地址链
在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

创建索引的基本原则

索引虽好,但也不是无限制的使用,最好符合一下几个原则

1) 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2)较频繁作为查询条件的字段才去创建索引
3)更新频繁字段不适合创建索引
4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)
5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
6)定义有外键的数据列一定要建立索引。
7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8)对于定义为text、image和bit的数据类型的列不要建立索引。


事务

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。

事 务 :事务是一个或一组sql语句组成的一个执行单元,这个执行单元要么都执行,要么都不执行,每个sql语句之间是相互依赖的

一个数据库事务通常包含对数据库进行读或写的一个操作序列。
它的存在包含有以下两个目的:
1、为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰


ACID属性【重点】

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性
原子性(Atomicity):事务是一个不可分割的执行单元,这个执行单元要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致性状态转变到另一个一致性状态。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。
在这里插入图片描述


数据库的4种隔离级别以及脏读、幻读、不可重复读

Mysql的默认隔离级别为可重复读

1,读未提交,Read Uncommited
指的是一个事务读取到另外一个事务还没有提交的内容 ,这种情况是必须要避免的。因为其他事务未提交的数据,是随时有可能进行回滚的。所以任何时候,都不应该允许程序读取到某个事务还未提交的数据。如果读取到了别的事务未提交的数据,这种情况称为脏读。
要想解决脏读的问题,可以提高数据库的事务隔离级别,把事务隔离级别设置为读已提交。


2,读已提交,Read Committed
在同一个事务中,两次select出来的值不相同的问题称为不可重复读问题。这个隔离级别可以解决脏读的问题。
在该隔离级别下,不允许2个未提交的事务之间并行执行,但它允许在一个事务执行的过程中,另外一个事务得到执行并提交。
这样,会出现一种情况,第一个事务前后两次select出来的某行数据,值可能不一样。值改变的原因是,穿插执行的事务2对该行数据进行了update操作
要想解决不可重复读问题,需要把数据的隔离级别设置为可重复读。


3,可重复读。Repeatable Read
在这个隔离级别下,可以解决不可重复读的问题。
在该隔离级别下,在一个事务使用某行的数据的过程中,不允许别的事务再对该行数据进行操作。可重复读是给数据库的行加上了锁。这种隔离级别下,依旧允许别的事务在该表中插入和删除数据,于是就会出现,在事务1执行的过程中,如果先后两次select出符合某个条件的行,如果在这两次select之间另一个事务得到了执行,insert或delete了某些行,就会出现先后两次select出来的符合同一个条件的结果不一样,第一次select好像出现了幻觉一样,因此,这个问题也被成为幻读。
要想解决幻读问题,需要将数据库的隔离级别设置为串行化。


4, 串行化,Serialization
串行化可以解决幻读的问题。
它要求事务的执行完全串行执行。所以失去了并发的效率。


总结而言,数据的事务隔离级别分为4种,从低到高依次为读未提交,读已提交,可重复读,串行化
与数据库事务隔离级别相关的问题有3个,分别是脏读,不可重复读,幻读
脏读问题需要用读已提交来解决,但读已提交会存在不可重复读问题。
不可重复读问题需要用可重复读来解决,但可重复读会存在幻读问题。
幻读问题需要用串行化来解决。


MySql的锁

锁机制:当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。

数据库死锁

数据库死锁是指两个资源互相等待,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性
简单理解 进程A等待进程B释放它的资源,B又等待A释放它的资源,这样互相等待就形成了死锁;

死锁产生的条件(在操作系统里死锁发生的对象是进程 / 在数据库里死锁发生的对象是事务

1互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用完释放。
2请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放
3不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。


隔离级别与锁的关系

在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。


乐观锁和悲观锁

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:乐一般会使用版本号机制或CAS算法实现。

两种锁的使用场景
从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。
但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。


MYSQL的两种存储引擎区别,各自适应的场景
MYISAM 不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描
INNODB 支持外键、行锁、查表总行数、全表扫描


索引B+索引和hash索引
Hash hash索引,等值查询效率高,不能排序,不能进行范围查询
B+ :数据有序,范围查询


聚集索引和非聚集索引
聚集索引:数据按索引顺序存储、中子结点存储真实的物理数据
非聚集索引:存储指向真正数据行的指针

索引的优缺点:
优点:提高查询速度
缺点:更新数据效率低,因为要同时更新索引
对数据进行频繁查询时使用索引,需要频繁更改数据时不建议使用索引。

InnoDB索引和MyISAM索引的区别
存储结构区别:
1.主索引的区别,InnoDB的数据文件就是索引文件,而MyISAM的索引和数据是分开的
2.二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址,而MyISAM的辅助索引和主索引没有多大区别


【字节】索引的底层实现(B+树,为什么不采用红黑树,B树)
红黑树:增加、删除、红黑树会进行频繁的调整,来保证红黑树的性质、浪费时间
B树:查询性能不稳定,查询结果高度
**B+**树相比较于另外两种树,显得更矮更宽,查询层次更浅


【重点】数据库设计的三范式

第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。


DDL(Data Definition Language): 数据定义语言
用来定义数据库对象:数据库,表,列等。
关键字:create,drop, alter等。
DML(Data Manipulation Language): 数据操作语言
用来对数据库中的表进行增删改操作。
关键字:insert,delete,update等。
DQL(Data Query Language): 数据查询语言
用来查询数据库中表的记录(数据)。
关键字:select, where等
DCL(Data Control Language): 数据控制语言
用来定义数据库的访问控制权限和安全级别,及创建用户。
关键字: grant, revoke等


SQL顺序:
写法顺序:select--from--where--group by--having--order by
执行顺序:from--where--group by--having--select--order by

一个完整的数据库设计一般分为以下六个阶段。
1、需求分析:分析用户的需求,包括数据、功能和性能需求
2、概念结构设计:主要采用E-R模型进行设计,包括画E-R图
3、逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换
4、数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存取路径
5、数据库的实施:包括编程、测试和试运行
6、数据库运行与维护:系统的运行与数据库的日常维护


数据库领域公认的标准结构是三级模式结构,它包括外模式、概念模式、内模式,有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。
全外连接:任意一边有值就会显示。
内连接:只返回满足连接条件的数据(两边都有的才显示)。对应等值连接。
左外连接:只要左边有值就会显示。
右外连接:只要右边有值就会显示。

关系数据模型的三个组成部分
1.关系数据模型的数据结构
2.关系数据模型的操作集合
3.关系数据模型的完整性约束

关系完备的系统支持:关系数据结构、所有的关系代数操作

数据库保护又叫做数据库控制,是通过四方面实现的,即安全性控制,完整性控制,并发性控制和数据恢复。

1、处理效率:drop>trustcate>delete
2、drop删除整个表;trustcate删除全部记录,但不删除表;delete删除部分记录
3、delete不影响所用extent,高水线保持原位置不动;trustcate会将高水线复位。


连接方式
自然连接(natural join)
自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。
sql语句:Select …… from 表1 natural join 表2
结果:
在这里插入图片描述


内连接(inner join)
内连接基本与自然连接相同,不同之处在于自然连接要求是同名属性列的比较,而内连接则不要求两属性列同名,可以用using或on来指定某两列字段相同的连接条件。
sql语句:Select …… from 表1 inner join 表 2 on 表1.A=表2.E
结果:
在这里插入图片描述


外连接(outer join):
外连接分为左外连接、右外连接、全外连接
外连接必须用using或on指定连接条件

左外连接(left outer join)
左外连接是在两表进行自然连接,只把左表要舍弃的保留在结果集中,右表对应的列上填null。
sql语句:Select …… from 表1 left outer join 表2 on 表1.C=表2.C
结果:
在这里插入图片描述
右外连接(rignt outer join)
右外连接是在两表进行自然连接,只把右表要舍弃的保留在结果集中,左表对应的列上填null。
Select …… from 表1 rignt outer join 表2 on 表1.C=表2.C ;
结果:
在这里插入图片描述
全外连接(full join)
全外连接是在两表进行自然连接,只把左表和右表要舍弃的都保留在结果集中,相对应的列上填null。
Select …… from 表1 full join 表2 on 表1.C=表2.C
结果
在这里插入图片描述


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.liang呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值