一、什么是SQL?

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。

作用:用于存取数据、查询、更新和管理关系数据库系统。

二、几种主要引擎的选择

nnodb引擎:提供了对数据库ACID事务的支持,并且实现了sql标准的四种隔离级别,事务安全的,支持行级锁,不支持全文索引。

MyIASM引擎:mysql的默认引擎,没有提供对数据库事务的支持,非事务安全的,锁的粒度是表级的,支持全文索引类型,相对简单性能优。

MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。

总结:

MYIASM管理非事务表,提供高速存储和检索,以及全文搜索能力,如果在应用中执行大量的select操作,应选择MYIASM引擎

Innodb用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量的insert和update操作,应选择innodb引擎。

三、索引

3.1   什么是索引?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

3.2   索引的优缺点

索引的优点

1.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

2.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点

1.时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;

2.空间方面:索引需要占物理空间。

四、常见SQL语句

4.1、数据库SQL语句的分类

1.数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER

主要用于定义数据库对象的SQL语句,其中包括表结构,视图和索引。

2.数据查询语言DQL(Data Query Language)SELECT

这个较为好理解 即查询操作,以select关键字。各种简单查询,连接查询等 都属于DQL。

3.数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE,DELETE

主要用于数据变更进行操作的,对应上面所说的查询操作 DQL与DML共同构建了多数初级程序员常用的增删改查操作。而查询是较为特殊的一种 被划分到DQL中。

4.数据控制功能DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK

主要为以上操作 即对数据库安全性完整性等有操作的,可以简单的理解事务控制语句。

4.2、 超键、候选键、主键、外键分别是什么?

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

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

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

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

4.3、SQL的约束有哪几种:约束即表中对输入数据的限制,用来保证数据录入的准确性

NOT NULL(非空约束): 用于控制字段的内容一定不能为空(NULL)。只有列级约束

UNIQUE(唯一约束):被唯一约束修饰的列的数据内容不能重复,一个表允许有多个 Unique 约束,且与主键约束不同的是该约束允许有空值。

PRIMARY KEY(主键约束):被主键约束修饰的列,具有唯一性,可以代表一行数据。被主键约束修饰的列数据不能为空且一张表只能有一个主键约束

FOREIGN KEY(外键约束): 一张表的某一数据来源于另一张表,这就形成了一种外键关系。用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

CHECK(检查约束): 用于控制字段的值范围。(MYSQL不支持该约束,ORACLE支持)

4.4、六种关联查询

交叉连接(CROSS JOIN)

内连接(INNER JOIN)

外连接(LEFT JOIN/RIGHT JOIN)

联合查询(UNION与UNION ALL)

全连接(FULL JOIN)

交叉连接(CROSS JOIN)

内连接分为三类

等值连接:ON A.id=B.id

不等值连接:ON A.id > B.id

自连接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid

外连接(LEFT JOIN/RIGHT JOIN)

左外连接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,可以简写成LEFT JOIN

右外连接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,可以简写成RIGHT JOIN

内连接与外连接的区别:

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。

外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。

左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。

右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。

全外连接:左外连接 union 右外连接。

4.5、什么是子查询

条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果

嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询。

4.6、子查询的三种情况

1.子查询是单行单列的情况:结果集是一个值,父查询使用:=、 等运算符

例:查询出工资最高的员工是谁?

select * from employee where salary=(select max(salary) from employee);

2.子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符

3.子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中做为子表

五、事务

5.1什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。(一般指要做的所有事情,他是一个执行的单元)在数据库中,默认的是数据自动提交,在使用增删改的时候无需使用commit

事务最经典也经常被拿出来说例子就是转账了。

假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

5.2事务的四大特性(ACID)

1.原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

2.一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

3.隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

4.持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

5.3 脏读、幻读、不可重复读

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

5.4 事务的隔离级别

1.READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

2.READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

3.REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

4.SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

注意:Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别

事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。

InnoDB 存储引擎在 分布式事务 的情况下一般会用到**SERIALIZABLE(可串行化)**隔离级别。

六、锁

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

就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。

6.2 隔离级别与锁的关系

在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突

在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

6.3 行级锁、表级锁以及页级锁的区别

行级锁 :行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。

特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁 :表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁 : 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

6.4 死锁及其解决方法

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法(找到进程号,kill进程):

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;

3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

如果业务处理不好可以用分布式事务锁或者使用乐观锁

6.5 乐观锁与悲观锁

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

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制

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

两种锁的使用场景:

从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

七、视图

7.1 为什么要使用视图?什么是视图?

为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。

视图使开发者只关心感兴趣的某些特定数据和所负责的特定任务,只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。

7.2 视图的特点

1.视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。

2.视图是由基本表(实表)产生的表(虚表)。

3.视图的建立和删除不影响基本表。

4.对视图内容的更新(添加,删除和修改)直接影响基本表。

5.当视图来自多个基本表时,不允许添加和删除数据。

视图的操作包括创建视图,查看视图,删除视图和修改视图。

7.3 视图的使用场景

视图根本用途:简化sql查询,提高开发效率。如果说还有另外一个用途那就是兼容老的表结构。

***下面是视图的常见使用场景***:

1.重用SQL语句;

2.简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;

3.使用表的组成部分而不是整个表;

4.保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;

5.更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据

7.4 视图的优点与缺点

优点:

1.查询简单化。视图能简化用户的操作

2.数据安全性。视图使用户能以多种角度看待同一数据,能够对机密数据提供安全保护

3.逻辑数据独立性。视图对重构数据库提供了一定程度的逻辑独立性

缺点:

1.性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也把它变成一个复杂的结合体,需要花费一定的时间。

2.修改限制。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的

这些视图有如下特征:1.有UNIQUE等集合操作符的视图。2.有GROUP BY子句的视图。3.有诸如AVG\SUM\MAX等聚合函数的视图。 4.使用DISTINCT关键字的视图。5.连接表的视图(其中有些例外)

八、MYSQL中一些关键字的区别

8.1  mysql中 "in" 和 "exists" 区别

mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。

如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。

not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

8.2  varchar与char的区别

char的特点

1.char表示定长字符串,长度是固定的;

2.如果插入数据的长度小于char的固定长度时,则用空格填充;

3.因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;

4.对于char来说,最多能存放的字符个数为255,和编码无关

varchar的特点

1.varchar表示可变长字符串,长度是可变的;

2.插入的数据是多长,就按照多长来存储;

3.varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;

4.对于varchar来说,最多能存放的字符个数为65532

8.3 FLOAT和DOUBLE的区别是什么?

FLOAT类型数据可以存储至多8位十进制数,并在内存中占4字节。

DOUBLE类型数据可以存储至多18位十进制数,并在内存中占8字节。

8.4 drop、delete与truncate的区别

三者都表示删除,但是有区别

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

九、SQL的优化问题

如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。 我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。

十、数据库优化

为什么要优化

1.系统的吞吐量瓶颈往往出现在数据库的访问速度上

2.随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢

3.数据是存放在磁盘上的,读写速度无法和内存相比

优化原则:减少系统瓶颈,减少资源占用,增加系统的反应速度。

以上均为个人摘抄,完整版连接奉上!٩( 'ω' )و 蟹蟹!2020MYSQL数据库面试题

mysql 面试题笔记_MYSQL面试题(摘抄/个人笔记)相关推荐

  1. mysql mvcc 读写阻塞_mysql面试题MVCC原理事务隔离级别_aiailingfei的博客-CSDN博客

    原文作者:小小一只鸟 原文标题:mysql面试题MVCC原理事务隔离级别 发布时间:2021-01-19 19:43:38 mysql事务隔离级别可重复读面试题 熊大 话说今天漂亮的妹子给我发过一张图 ...

  2. 初学者mysql上机试题工_MySQL上机试题.docx

    MySQL上机试题 MySQL上机试题创建数据库,名称为考生的学号:(10分)创建数据表customer(客户).deposite(存款).bank(银行),表结构如下:(10分)customer的表 ...

  3. mysql期末考试试卷_MySQL考试试题及答案

    <MySql高级数据分析>期末测试 一.选择题(总分50分,每题2分) 1.使用SQL语句进行分组检索时,为了去掉不满足条件的分组,应当(B) A)使用WHERE子句 B)在GROUP B ...

  4. mysql查询日期胜负_MySQL面试题:查询每个日期的胜负次数

    record表结构如下: 请用SQL实现以下结果 create table record( time0 datetime, shengfu varchar(10)); insert into reco ...

  5. mysql时间戳转日期_MYSQL时间戳和日期相互转换 笔记整理

    相关函数: date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to_date(str, fo ...

  6. 全网最火Java面试题大全1000+面试题附答案详解面试官说,看完稳了

    进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里.美团.滴滴.头条等大厂面试大全,其中概括的知识点有:Java.MyBatis.ZooKeeper.Dubbo.Elast ...

  7. mysql查询解析过程_MySQL查询执行过程详解

    查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...

  8. mysql or 创建索引_Mysql索引优化

    1.单表索引优化 单表索引优化分析 创建表 建表 SQL CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMAR ...

  9. java 知乎面试题_2019最新Java面试题,常见面试题及答案汇总(208道)

    1.面试题模块汇总 面试题包括以下十九个模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/S ...

最新文章

  1. [解决方案]SystemError: Parent module ‘‘ not loaded, cannot perform relative import的解决方案
  2. 超有趣的几个Linux小命令
  3. 语法转换_语法 | 句型转换之肯定句变否定句
  4. linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)
  5. 论文学习16-Going out on a limb: without Dependency Trees(联合实体关系抽取2017)
  6. Spring Boot 前后端分离解决跨越问题
  7. Oracle Warehouse Builder 自动化ETL处置处罚历程(1)
  8. 支付宝”向他付款”,定额付款收款链接生成
  9. 宇视监控摄像头使用什么工具批量修改IP地址
  10. python爬虫设计背景_Python网络爬虫(增量式爬虫)
  11. js验证组织机构代码
  12. catti二级笔译综合能力真题_2017年5月英语二级笔译综合能力试题回忆
  13. 【尚硅谷_java基础】十五、网络编程
  14. Win11删除资源管理器中的图片、文档等文件夹
  15. TypeScript-多态篇
  16. 网站在线压力测试工具Load Impact
  17. 谈谈交换机三种端口模式Access、Hybrid和Trunk
  18. 开源智慧党建小程序源码系统+搭建教程
  19. Linux top
  20. 图文:eclipse中SVN分支合并到主干

热门文章

  1. ACdream群赛(4)总结
  2. Flex4 Skinning 1: 自定义一个简单按钮的皮肤
  3. Python GStreamer Tutorial
  4. 【Python】读取 txt 文件
  5. 服务器端文件名,挑战服务端各文件名中文含义及详细说明
  6. 抖音新特效:蚂蚁呀嘿安卓教程
  7. VS Code 如何运行.html文件(VS Code 如何安装插件)(open with live serve和open in default browser)
  8. webRTC之Mesh/MCU/SFU通信架构区别(九)
  9. Android.mk转换到Android.bp方法
  10. Android增量更新——bsdiffbspatch