1、数据库范式

第一范式:列不可分,eg:【联系人】(姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF;

第二范式:有主键,保证完全依赖。eg:订单明细表【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName),Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID,不符合2NF;

第三范式:无传递依赖(非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况),eg:订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID),CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。

2、什么是反模式

范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。

然而,通过数据库范式化设计,将导致数据库业务涉及的表变多,并且可能需要将涉及的业务表进行多表连接查询,这样将导致性能变差,且不利于分库分表。因此,出于性能优先的考量,可能在数据库的结构中需要使用反模式的设计,即空间换取时间,采取数据冗余的方式避免表之间的关联查询。至于数据一致性问题,因为难以满足数据强一致性,一般情况下,使存储数据尽可能达到用户一致,保证系统经过一段较短的时间的自我恢复和修正,数据最终达到一致。

需要谨慎使用反模式设计数据库。一般情况下,尽可能使用范式化的数据库设计,因为范式化的数据库设计能让产品更加灵活,并且能在数据库层保持数据完整性。

有的时候,提升性能最好的方法是在同一表中保存冗余数据,如果能容许少量的脏数据,创建一张完全独立的汇总表或缓存表是非常好的方法。举个例子,设计一张“下载次数表”来缓存下载次数信息,可使在海量数据的情况下,提高查询总数信息的速度。

另外一个比较典型的场景,出于扩展性考虑,可能会使用 BLOB 和 TEXT 类型的列存储 JSON 结构的数据,这样的好处在于可以在任何时候,将新的属性添加到这个字段中,而不需要更改表结构。但是,这个设计的缺点也比较明显,就是需要获取整个字段内容进行解码来获取指定的属性,并且无法进行索引、排序、聚合等操作。因此,如果需要考虑更加复杂的使用场景,更加建议使用 MongoDB 这样的文档型数据库。

3、数据库事务

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

(1). 事务的特征

原子性(Atomicity):事务所包含的一系列数据库操作要么全部成功执行,要么全部回滚;

一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态;

隔离性(Isolation):并发执行的事务之间不能相互影响;

持久性(Durability):事务一旦提交,对数据库中数据的改变是永久性的。

(2). 事务并发带来的问题

脏读:一个事务读取了另一个事务未提交的数据;

不可重复读:不可重复读的重点是修改,同样条件下两次读取结果不同,也就是说,被读取的数据可以被其它事务修改;

幻读:幻读的重点在于新增或者删除,同样条件下两次读出来的记录数不一样。

(3). 隔离级别

隔离级别决定了一个session中的事务可能对另一个session中的事务的影响。

ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持,分别是:

READ UNCOMMITTED(未提交读):最低级别的隔离,通常又称为dirty read,它允许一个事务读取另一个事务还没commit的数据,这样可能会提高性能,但是会导致脏读问题;

READ COMMITTED(提交读):在一个事务中只允许对其它事务已经commit的记录可见,该隔离级别不能避免不可重复读问题;

REPEATABLE READ(可重复读):在一个事务开始后,其他事务对数据库的修改在本事务中不可见,直到本事务commit或rollback。但是,其他事务的insert/delete操作对该事务是可见的,也就是说,该隔离级别并不能避免幻读问题。在一个事务中重复select的结果一样,除非本事务中update数据库。

SERIALIZABLE(可串行化):最高级别的隔离,只允许事务串行执行。

MySQL默认的隔离级别是REPEATABLE READ。

4、什么是存储过程?有哪些优缺点?

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。进一步地说,存储过程是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。存储过程具有以下特点:

4.1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行效率;

4.2、当SQL语句有变动时,可以只修改数据库中的存储过程而不必修改代码;

4.3、减少网络传输,在客户端调用一个存储过程当然比执行一串SQL传输的数据量要小;

4.4、通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

5、简单说一下drop、delete、truncate的区别

SQL中的drop、delete、truncate都表示删除,但是三者有一些差别:

Delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除, delete命令会触发这个表上所有的delete触发器;

Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小;

Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。

6、什么叫视图?游标是什么?

视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能,可以对视图进行增,删,改,查等操作。特别地,对视图的修改不影响基本表。相比多表查询,它使得我们获取数据更容易。

游标是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

在操作mysql的时候,我们知道MySQL检索操作返回一组称为结果集的行。这组返回的行都是与 SQL语句相匹配的行(零行或多行)。使用简单的 SELECT语句,例如,没有办法得到第一行、下一行或前 10行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们)。有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条 SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。

7、什么是触发器?

触发器是与表相关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据库的完整性。

8、超键、候选键、主键、外键

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

候选键:是最小超键,即没有冗余元素的超键。

主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键:在一个表中存在的另一个表的主键称此表的外键。

9、什么是事务?什么是锁?

事务:就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。

锁:在所以的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

10、数据库锁机制

数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问,访问变得有序所设计的一种规则。MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。

表级锁定(table-level):表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。表级锁分为读锁和写锁。页级锁定(page-level):页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。行级锁定(row-level):行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。InnoDB的行级锁同样分为两种,共享锁和排他锁,同样InnoDB也引入了意向锁(表级锁)的概念,所以也就有了意向共享锁和意向排他锁,所以InnoDB实际上有四种锁,即共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX);

在MySQL数据库中,使用表级锁定的主要是MyISAM,Memory,CSV等一些非事务性存储引擎,而使用行级锁定的主要是Innodb存储引擎和NDBCluster存储引擎,页级锁定主要是BerkeleyDB存储引擎的锁定方式。

而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个

意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。

想了解更多相关内容请访问:mysql视频教程

使用t-sql语句修改表中的某些数据及数据类型。_数据库基本理论详细介绍相关推荐

  1. 使用t-sql语句修改表中的某些数据及数据类型。_测试开发工程师数据库篇(一)...

    点击蓝字之后,我们就是好朋友了啦 15    数据库篇(一)  01事务概念及应用场景 事务是一组不可分割的mysql语句组,这些语句组要么全部执行成功,要么全部执行失败.事务的提出主要是为了解决并发 ...

  2. 使用t-sql语句修改表中的某些数据及数据类型。_Java面试——数据库知识点

    微信公众号:猿的夜场 关注可了解更多的技术文档.问题或建议,请公众号留言! MySQL 1.建 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的 ...

  3. 用MS SQL 语句修改表中字段类型

    [问题]用SQL 语句判断表中是否存在password字段,不存在则新增字段,若存在password字段,把字段的类型由int 类型改为text类型. [实现方法] if exists( select ...

  4. MySQL使用SQL语句修改表名

    MySQL中可以使用rename table这个SQL语句来修改表名. rename table这个SQL语句来修改表名的基本语法是: RENAME TABLE <旧表名> TO < ...

  5. 使用SQL语句修改表数据

    使用SQL语句修改表数据 文章目录 使用SQL语句修改表数据 利用INSERT语句输入数据 利用UPDATE语句更新表数据 利用DELETE语句删除表中数据 利用Truncate Table语句删除表 ...

  6. 使用SQL语句修改表结构(SQL Server)

    使用SQL语句修改表结构(SQL Server) 文章目录 使用SQL语句修改表结构(SQL Server) ALTER TABLE的语法格式如下: 添加列 删除列 修改表的列数据类型和名称 ALTE ...

  7. 用一条sql语句删除表中所相同记录

    用一条sql语句删除表中所相同记录如下一.具有主键的情况 a.具有唯一性的字段id(为唯一主键) delete table where id not in ( select max(id) from ...

  8. 【SQL】 使用SQL语句在表中添加数据(一条 / 多条)

    [SQL] 使用SQL语句在表中添加数据(一条 / 多条) 1.单条数据 insert into 表名(字段名1,字段名2)value(值1,值2); 例如: insert into tablenam ...

  9. SQL如何修改表中的结构

    通过一个表的操作,来感受如何修改表中的结构.都是用到了alter 首先创建一个Person表 里面有属性cname列,cage列 create table Person(cname varchar2( ...

最新文章

  1. Linux那些事儿 之 戏说USB(6)好戏开始了
  2. 思科同时匹配源和目标地址进行策略路由配置测试
  3. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)
  4. MySQL InnoDB Cluster安装
  5. 48-如何实现unix2dos功能
  6. ASP.NET Core on K8S深入学习(3)Deployment
  7. HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST
  8. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
  9. CenOs6.3下博通BCM4313无线网卡驱动
  10. 一套代码在不同的电脑执行快慢_设计师需要的电脑配置
  11. easyUI不同版本的combotree控件clear方法的区别
  12. codeigniter_MY_Model
  13. JAVA CRC16校验码计算
  14. [深度学习] fast-reid入门教程
  15. 阿里云ACA试题-云安全典型题19道
  16. 提高网站关键词排名优化技巧!
  17. 火爆到把服务器搞瘫痪,一款小游戏,合成大西瓜
  18. 洛谷题目--P1008三连击--正难则反、模拟、枚举、暴力<每日一题>
  19. 医疗行业大数据应用的三个案例
  20. 准确率、召回率、F值

热门文章

  1. 使用Spring Security进行简单身份验证
  2. c#中overlord实例_具有Overlord的WildFly 8.1中的API管理
  3. 如何在Java中将String转换为int
  4. Java:ChronicleMap第3部分,快速微服务
  5. guava的正确引入方式_使用Guava的AbstractInvocationHandler正确完成代理
  6. 只需5分钟即可启动并运行分层架构:: Spring Boot第1部分
  7. java ee空指针_Java EE 7是最终版本。 思想,见解和进一步的指针。
  8. 如何在Java 8中将Lambda表达式转换为方法引用?
  9. GC解释:收集器概述
  10. Java中特质模式的定义