1.truncate、delete、drop的区别

用法:truncate 表名;delete from 表名 where...;drop table 表名;

区别:

truncate、drop是不可以rollback的,但是delete是可以rollback的;原因是:delete删除是一行一行的删除,会触发触发器,删除可以返回行数,每删除一行会进行一次日志记录,所以可回滚;而truncate删除是删除表的所有数据,通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,所以不能回滚,可以重置自增字段的计数器;Drop语句将删除表的结构、被依赖的约束(constrain)、触发器 (trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。

注意:drop、truncate不能删除有外键约束的表。

2.数据库三范式

  • 第一范式(1NF):是指数据库表的每一列都是不可分割,即列不可分。
  • 第二范式(2NF):非主属性必须完全依赖主键,不能部分依赖主键,即不能部分依赖。
  • 第三范式(3NF):属性不依赖于其它非主属性,即不能传递依赖。

3.数据库事务四大特性ACID

  • 原子性:一个事务是一个不可分割的最小工作单元,其操作要么全部成功,要么全部失败。
  • 一致性:数据库总是从一个一致性状态转换为另一个一致性状态。所谓一致性状态,就是数据库的所有完整性约束(尤其注意用户定义约束)都被遵守,以银行转账为例,“转账操作必然导致一个账户减少金额,另一个账户增加金额,且这两个账户总金额之和不变”就是一个完整性约束。
  • 持久性:一旦事务提交,则其所作的修改就会永久保存到数据库中。
  • 隔离性:隔离性用于定义事务之间的相互隔离程度,存在四个隔离级别。

首先需要解释一下几个跟隔离性相关的概念定义:

(1)脏读:指事务读到脏数据,所谓脏数据,指的是不正确的数据,例如事务执行过程中修改了某记录,然后回滚,如果其他事务读到了该记录的中间修改值,则为脏读。

(2)不可重复读:事务在执行过程中,多次对同一个已经存在的记录进行读取,各次读取的值不同。读提交隔离级别存在不可重复读的问题,事务1、2并发执行,事务2首先读取记录1,然后事务1修改记录1并提交,事务2继续读取记录1,则事务2两次读取到的值不同。

(3)幻读:幻读是指使用某个条件读取一批记录时,可能读到的记录数不同。幻读与脏读、不可重复读的区别在于,脏读、不可重复读都是针对某个确定的已经存在的记录出现的值不要求(读到脏数据或多次读的值不同),而幻读则是多次使用同一个条件查询一批记录,多次读到的记录数不同,也就是说,脏读、不可重复读是由于多个事务并行执行update引起的,而幻读则是由于多个事务并行执行insert引起的(并发delete引起的问题看起来算哪个都行……)。

四个隔离级别

(1)Read Uncommited:读未提交,其含义为多个并发事务,任何一个事务可以读到其他事务尚未提交的修改:

    存在脏读、不可重复读、幻读可能性。

(2)Read Commited:读已提交,含义为多个并发事务,任何一个事务只可以读到其他事务已经提交的修改:

    解决脏读,存在不可重复读、幻读可能性。

(3)Repeatable Read:可重复读,含义为多个事务并发执行时,任何一个事务反复读取已存在的记录,每次读到的值都是相同的

    解决脏读、不可重复读,存在幻读可能性。

(4)Serializable:串行化,含义为所有事务串行执行,因此不存在事务并发执行的情况。

    解决脏读、不可重复读、幻读。

多版本并发控制MVCC

上述四个隔离级别中,读未提交隔离性最差,且相对于读已提交,性能并没有多少提升,几乎不会使用;串行化隔离性最好,可是性能太差,也几乎不会使用。一般数据库的默认隔离级别要么是读已提交,要么是可重复读(例如MySQL的InnoDB引擎),要么是读已提交(例如Oracle )。

如果使用行级读锁、写锁来实现读已提交或可重复读,应当是以下的步骤:

1、事务1会修改行1,则会在行1加上写锁,开始事务;

2、事务2为纯读取操作,需要读取行1,试图在行1上加上读锁,由于事务1已加写锁,因此事务2等待直到事务1完成。

3、如果事务2先开始,则事务1也需要等到事务2完成并释放读锁后才可以开始执行。

也即使说,对某行的写操作会阻塞所有对该行的读取操作,对某行的读操作会阻塞所有对该行的写操作,在系统存在读、写并发时,不论系统IO能力有多高,会受限于锁而导致性能低下。

MVCC用于解决这个问题来提高系统性能,MVCC并没有统一的标准,各个数据库实现均采用不同方式来实现MVCC,InnoDB的实现方式如下:

准备工作:

(1)对每行记录增加行标志和删除标志两个字段;

(2)维护一个全局的系统版本号,每开始一个事务(注意select也是事务,读事务),将该系统版本号加1并作为事务的版本号

插入记录的行标志设置为本事务版本号,删除标志为空;

删除记录的删除标志设置为本事务版本号;

修改的处理过程:将原记录的删除版本号修改为本事务版本号;新插入一条记录,包含原记录数据及本次修改,行记录标志设置为本事务版本号,删除标志为空;

读取的处理过程:

仅读取同时满足以下条件的记录行:

(1)行标志小于或等于本事务版本号(等于用于保证能够读取到本事务内提交的增加);

(2)删除标志为空或者大于本事务版本号(不包括等于以保证不会读取到本事务删除的记录);

相当于在读事务开始的时刻点,建立了一个系统的快照,该事务读取的所有数据,均是从快照中读取的,因此满足可重复读的条件,并且可解决幻读的问题,并且也不会读到产生“同样查询条件,事务中第一次读到的记录数大于第二次读到的记录数的问题“(由并发删除引起)

从上可知,使用MVCC后,大部分读都不再需要加读锁,因此读不再阻塞写,写也不再阻塞读。读操作只再受限于系统IO能力。

MySQL中myisam与innodb的区别

  1. InnoDB支持事务,而MyISAM不支持事务
  2. InnoDB支持行级锁,而MyISAM支持表级锁
  3. InnoDB支持MVCC, 而MyISAM不支持
  4. InnoDB支持外键,而MyISAM不支持
  5. InnoDB不支持全文索引,而MyISAM支持。

InnoDB提供提交、回滚、崩溃恢复能力的事务安全(ASID)能力,实现并发控制。

MyISAM提供较高的插入和查询记录的效率,主要用于插入和查询。

memory用于临时存放数据,数据量不大并且不需要较高数据安全性。

archive:如果只有插入和查询可以用,支持高并发的插入操作,但本身不是事务安全。

2者select count(*)哪个更快,为什么

MyISAM更快,因为MyISAM内部维护了一个计数器,可以直接调取。

mysql中四个存储引擎

innodb、myisam、memory、archive

MySQL语句总结:

查询语句:select* from 表名;

插入数据:insert into 表名 (clus...) values(values...);

更新语句:update 表名 set clu=value where 条件;

删除语句:delete from 表名 where..;truncate 表名;drop table 表名;

存储过程:存储过程体中可以使用自定义函数(UDF)中使用的复合结构/流程控制/SQL语句/自定义变量等等内容

CREATE procedure sp_add(a int, b int,out c int)
begin
DELETE FROM son WHERE id = a;
end

函数定义:

CREATE FUNCTION 函数名称(参数列表)
RETURNS 返回值类型
BEGIN
DELETE FROM son WHERE id = uid;
RETURN (SELECT COUNT(id) FROM son);
END

存储过程与函数区别

  • 存储过程实现的过程要复杂一些,而函数的针对性较强;
  • 存储过程可以有多个返回值,而自定义函数只有一个返回值;
  • 存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用;

存储过程说白了就是把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要的时候从数据库中直接调用,省去了编译的过程. 提高了运行速度;同时降低网络数据传输量(你觉得传一堆SQL代码快,还是传一个存储过程名字和几个参数快???),在程序端可以直接调用存储过程,而函数不能独立运行。

外连接分为内连接、左连接、右连接

内连接是根据某个条件连接两个表共有的数据所有字段;

左连接是根据某个条件以及左边的表连接数据,右边的表没数据的话则填null;

右连接是根据某个条件以及右边的表连接数据,左边的表没数据的话则填null;

例如,有两个表学生表student和成绩表grade,如图

学生表                     成绩表

内连接也就是等值连接:SELECT * FROM student , grade WHERE student.`id`=grade.`studentId`;

左连接:SELECT * FROM student LEFT JOIN grade ON student.`id`=grade.`studentId`;

右连接:SELECT * FROM student RIGHT JOIN grade ON student.`id`=grade.`studentId`;

【MySQL数据库】笔试题总结相关推荐

  1. mysql数据库笔试题库和答案mysql语句(后端面试必备)

    数据库笔试题库(入门基础篇) 一.入门基础题 `基础查询` `条件查询` `高级查询` `多表查询`

  2. mysql数据库 笔试题

    Mysql1. 事务的基本要素2. 事务隔离级别(必考)3. 如何解决事务的并发问题(脏读,幻读)(必考)4. MVCC多版本并发控制(必考)5. binlog,redolog,undolog都是什么 ...

  3. 数据库mysql数据库笔试题_MySql数据库笔试题总结

    1,设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号.姓名.工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号 ...

  4. 数据库周刊59丨GaussDB(for openGauss)开放商用;人大金仓保障冬奥会演练顺利完成;MDL锁导致的MySQL问题分析;PG日志使用手册;达梦表空间查询;数据库笔试题面试题集……

    热门资讯 1.openGauss 上线华为云正式商用 - GaussDB(for openGauss) [摘要]近日,GaussDB(for openGauss)已于华为云官网全面开放商用.该产品是华 ...

  5. java与mysql笔试题_JAVA和数据库笔试题

    java部分: 选择:1.下面的执行结果: Java代码 public class Test3 { public static void main(String args[]){ int a=222; ...

  6. 100道MySQL数据库面试题解析

    1. MySQL索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效 查询条件包含or,可能导致索引失效如何字段类型是字符串,w ...

  7. 教你急速快速批量插入1000万条数据到mysql数据库表面试题

    急速快速批量插入1000万条数据到mysql数据库表面试题 教你急速快速批量插入1000万条数据到mysql数据库表&面试题 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好 ...

  8. mysql数据库二级_全国计算机二级mysql数据库模拟试题及答案

    全国计算机二级mysql数据库模拟试题及答案 很多人都想拿到二级mysql证,那么在参考二级mysql考试前,可要做好充分的准备,下面小编为大家带来了全国计算机二级mysql数据库模拟试题及答案,欢迎 ...

  9. 计算机二级数据库mysql题库_全国计算机二级mysql数据库模拟试题

    考生们在备考计算机考试科目时,除了复习教材以外,还要结合试题加深对知识点的理解和巩固,接下来应届毕业生小编为大家精心准备了全国计算机二级mysql数据库模拟试题,希望能够给大家带来帮助! 1) 函数 ...

  10. php mysql技术笔试题_PHP面试笔试题--选择题部分(最新整理)

    <PHP面试笔试题--选择题部分(最新整理)>由会员分享,可在线阅读,更多相关<PHP面试笔试题--选择题部分(最新整理)(7页珍藏版)>请在人人文库网上搜索. 1.1. 以下 ...

最新文章

  1. oracle链接字符串java,java连Oracle连接字符串写法
  2. C# 中的委托和事件(转载)
  3. Windows Phone APP中禁用截图
  4. linux变量赋值用中括号,Shell脚本定义变量和重新赋值
  5. java gui 连接mysql数据库
  6. 深入解析final关键字的用法
  7. python中dlib库_python 基于dlib库的人脸检测的实现
  8. PHP--金额数字转换成英文
  9. redis插槽(slot)分配详解(集群动态新增或删除结点)
  10. 【好玩的代码雨(附源代码)】
  11. Kafka权威指南 —— 读书笔记
  12. Java面经总结(1)
  13. kuka机器人程序是c语言吗,KUKA机器人示教器编程问题讲解——KUKA机器人
  14. 禁止微信中长按出现 复制文本和在浏览器中打开
  15. 分享几个免费IP地址查询接口(API)
  16. 我从冯·诺依曼计算机体系,追溯到了JVM,一切原来如此
  17. 凡人修c传(四)翻牌子(POJ - 3279 - Fliptile每日一水)
  18. %d %ld %lld
  19. bugku_逆向_游戏过关
  20. 无线网络安全测试软件

热门文章

  1. 谷歌翻译无法使用/翻译页面无法使用/右键翻译成中文无法使用问题解决方法。
  2. Java编程思想之对象入门
  3. iphone阅读模式翻页_iPad的safari浏览器阅读模式如何翻页
  4. 思考(七十四):一个游戏后端分布式事务架构介绍
  5. 基础篇:String字符串之截取、分割、替换
  6. 傻瓜式制作纯净版win10启动盘
  7. 安卓内存监控工具,2021年Android面试心得,系列教学
  8. Pytorch——如何创建一个tensor与索引和切片(一)
  9. JavaSE学习笔记(一)基础知识
  10. BCD码优先编码设计