数据库面试常用知识点补充

1.数据库存储过程的特点?

MySQL数据库在5.0版本后开始支持存储过程,那么什么是存储过程呢?怎么创建、查看和删除存储过程呢?存储过程有什么优点?这些是本章节要探讨的问题:
什么是存储过程:
简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。
创建存储过程:
存储过程的创建非常简单,其创建结构为:

CREATE PROCEDURE proc_name ([proc_parameter[,...]])  
[characteristic] 
routine_body

说明:
proc_name代表存储过程名称;
proc_parameter代表存储过程参数列表。该列表中的每个参数由3部分组成,即输入输出类型、参数名称和参数类型。其形式如下: [ IN | OUT | INOUT ] param_name type ,其中[ IN | OUT | INOUT ]表示输出类型(IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出。输入输出类型也可以去掉,默认为in); param_name表示参数名称(注意:MySQL数据库存储过程的参数名前不允许“@”,SQL Server数据库中可以);type表示参数类型,该类型可以是MySQL数据库的任意数据类型。

注意:MySQL数据库存储过程不需要在参数列表括号后面“as”关键字,但SQL Server数据库中的存储过程必须加“as”关键字。

characteristic指定存储过程的特性;该参数有多个值:
1.LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,数据库系统默认值。
2.[NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的,这时当每次执行存储过程时相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,这时相同的输入可能得到不同的输出。默认为非确定。
3. { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认为CONTAINS SQL。
4.SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认为DEFINER。
5.COMMENT ‘string’:存储过程注释信息。
6. routine_body参数为存储过程体,BEGIN…END标志存储过程体的开始和结束。存储过程体可以是SELECT、UPDATE、INSERT、DELETE、CREATE TABLE等SQL语句,也可以嵌入调用其它存储过程的代码,还可以是其它代码(参见博客:《数据库中的控制语句》)。

注意:不能在 MySQL 存储过程中使用 “return” 关键字。

存储过程优点
1、存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
2、减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行;
3、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
4、系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

存储过程可参考:存储过程详解

2.数据库的三级模式

数据库的三级模式结构是指:数据库系统是由外模式、模式和内模式三级构成,如下所示:
在这里插入图片描述

  • 1.模式(Schema)
    模式也称为:逻辑模式,它是DB中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。模式层是数据库模式结构的中间层,既不涉及到数据的物理存储细节和硬件环境,也与具体的应用程序、应用开发工具以及高级程序设计语言无关(C、C++、JAVA等)。
    模式就是数据库数据在逻辑上的视图,且一个数据库只有一个模式。实际工作中,模式就等同于程序员创建一个具体的数据库的全部操作,如:这是一个MySQL数据库,有2张表,每个表的名字,属性的名字、类型、取值范围,主键,外键,索引,其他完整性约束等等。
    DBMS提供模式描述语言(模式DDL)来严格地定义模式。
  • 2.外模式
    外模式也称为:子模式(subschema)/用户模式,它是数据库用户(应用程序员、最终用户)能够看到的使用的局部数据的逻辑结构和特征的描述,是数据库的数据视图,是与某一个应用有关的数据的逻辑表示
    外模式通常是模式的子集。一个数据库可以有多个外模式。同一个外模式可以为某一用户的多个应用系统所使用,但一个应用系统只能使用一个外模式。
    外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据是不可见的。
    DBMS提供子模式描述语言(子模式DDL)来严格地定义子模式。
  • 3.内模式
    内模式也称为:存储模式(Storage schema),一个数据库只有一个内模式。它是数据库物理结构和存储方式的描述,是数据在数据库内部的表示方式。如:记录的存储方式是堆存储,还是按照某些属性值的升(降)存储,还是按照属性值聚簇(cluster)存储;索引按照什么方式组织,是B+树索引,还是hash索引等等。
    DBMS提供内模式描述语言(内模式DDL/存储模式DDL)来严格定义内模式。

二级映像功能和数据的独立性
数据库的3级模式是对数据的3个抽象级别。它使得用户能够逻辑地抽象地处理数据,而不必再去关心数据在计算机中的具体表示方式与存储方式。实际上,为了能够实现在这3个抽象层次之间的联系和转换,DBMS在这三级模式之间设计了两层映像:
外模式/模式映像
模式/内模式映像
这两层映像保证了数据库中的数据能够具有较高的逻辑独立性和物理独立性。
1. 外模式/模式映像
由上可知:一个DB只有一个模式,但可以有多个外模式。
所以,对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了这个外模式与模式的对应关系。外模式的描述中通常包含了这些映像的定义。
当模式改变时(增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式映像作相应的改变,可以使得外模式保持不变。而又由于应用程序应该是依据外模式编写的,从而应用程序不必修改,这就保证了数据与程序的逻辑独立性。
总结:外模式/模式映像保证了当模式改变时,外模式不用变 — 逻辑独立性。
2. 模式/内模式映像
由上可知:一个DB只有一个模式,也只有一个内模式,所有模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。
当数据库的存储结构改变时(例如选用了另一个存储结构),由数据库管理员对模式/内模式映像作出相应的改变,可以使得模式保持不变,从而应用程序也不必改变。这就保证了数据和程序的物理独立性。
总结:模式/内模式映像保证了当内模式改变时,模式不用变 — 物理独立性。

3.在mysql中,字段类型中的char,varchar,blob,text的区别?

它们的存储方式和数据的检索方式都不一样。

  • char:存储定长数据很方便(最多不可以超过255字符),CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格。
  • varchar:存储变长数据(最多不可以超过65535字节),但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。
  • BLOB被视为二进制字符串,BLOB列没有字符集,并且排序和比较基于列值字节的数值值,在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列
  • text:存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。

结论
(1)经常变化的字段用varchar;
(2)知道固定长度的用char;
(3)尽量用varchar;
(4)超过255字节的只能用varchar或者text;
(5)能用varchar的地方不用text;
(6)能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够;
(7)如果是要存储二进制流的内容(比如图片),那么可以采取用Blob;

4.什么情况下应该对字段建立索引?

1.经常查询的字段;
2.唯一性强的字段,比如像性别字段,区分度不大,所以不适合建立;
3.出现在where条件查询的字段,因为如果不会出现在where字段之后,那么建立索引也就没有必要了;出现在where条件查询的字段,因为如果不会出现在where字段之后,那么建立索引也就没有必要了;
4.不经常修改的字段,因为对于经常修改的字段,那么还要进行索引的维护,这是需要消耗时间和空间;不经常修改的字段,因为对于经常修改的字段,那么还要进行索引的维护,这是需要消耗时间和空间;
5.不会出现null值的字段;

5.字段存在索引但是会发现无效的情况有哪些?

1.进行了模糊匹配,使用"%Like"
2.使用了or查询,两端的字段某个不存在索引
3.进行了函数操作字段,比如abs()函数进行了函数操作字段,比如abs()函数
4.对字段进行了运算,比如使用!= 或者< ,>等对字段进行了运算,比如使用!= 或者< ,>等
5.对于Bolb和text字段,只能使用前缀索引对于Bolb和text字段,只能使用前缀索引
6.join条件字段类型不一致的时候join条件字段类型不一致的时候
7.对于字段出现null的情况,并且这种字段是不适合建立索引对于字段出现null的情况,并且这种字段是不适合建立索引

6.数据库中的内连接,外连接,交叉连接?

答:内连接:内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。(下面三种)

  • 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
  • 2.不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
  • 3.自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

内连接sql语句具体实现可使用下面两种方式,其中第二种方式的inner可以省略。

select * from book as a,stu as b where a.sutid = b.stuid

select * from book as a inner join stu as b on a.sutid = b.stuid

外链接

  • 4.左联接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL左联接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL
select * from book as a left join stu as b on a.sutid = b.stuid
  • 5.右连接:是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL右连接:是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL
select * from book as a right join stu as b on a.sutid = b.stuid
  • 6.全连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值;(注意:在mysql中是不支持这种方式的,而只能通过先左连接,然后使用union all 再与右连接的方式)
select * from book as a full outer join stu as b on a.sutid = b.stuid

交叉连接

  • 7.交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
select * from book as a full outer join stu as b on a.sutid = b.stuid

具体的例子:https://www.cnblogs.com/zxlovenet/p/4005256.html
在这里插入图片描述

7.数据库的安全性如何保证?

设置用户的权限:保证非法用户的非法侵入;
定义视图:通过这样把不同权限用户所能看到的数据和操作的数据进行隔离;
数据加密:保证数据的保密性;数据加密:保证数据的保密性;
启动事务管理和故障恢复:防止意外情况的发生,保证数据的一致性和完整性,主要的措施是日志记录和数据复制;启动事务管理和故障恢复:防止意外情况的发生,保证数据的一致性和完整性,主要的措施是日志记录和数据复制;
数据库备份和恢复:防止数据非法丢失和意外情况发现,保证数据可进行一定恢复;数据库备份和恢复:防止数据非法丢失和意外情况发现,保证数据可进行一定恢复;
审计追踪机制:主要是对于数据的更新,删除操作进行日志记录,方便后续的审查;审计追踪机制:主要是对于数据的更新,删除操作进行日志记录,方便后续的审查;
加强服务器的安全:因为数据库都是存放在服务器中的,所以需要保证服务器的安全;加强服务器的安全:因为数据库都是存放在服务器中的,所以需要保证服务器的安全;

8.说说聚集索引和非聚集索引的理解?

1.聚集索引
聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。叶子节点存储真实的数据行,不再有另外单独的数据页。在一张表上只能创建一个聚集索引,因为真实数据的物理顺序只能有一种,若一张表没有聚集索引,则它被称为堆集,这样表的数据行无特定的顺序,所有新行将被添加到表的末尾。聚集索引可以是一列(单索引的时候)或者是多列(组合索引的时候)。但是,聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。

2.非聚集索引
非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排。

用例子对比两种索引:
聚集索引就类似新华字典中的拼音排序索引,都是按顺序进行,例如找到字典中的“爱”,就里面顺序执行找到“癌”。而非聚集索引则类似于笔画排序,索引顺序和物理顺序并不是按顺序存放的。还可以类比,聚集索引就是电话薄是根据字母顺序进行排列,而非聚集索引可以类比为书的目录,虽然页的索引的在一起,但是索引带有指针才是真正指向数据的存储位置。

非聚集索引和聚集索引的区别
(1)叶子节点并非数据节点
(2)叶子节点为每一个真正的数据行存储一个"键-指针"对
(3)叶子节点中还存储了一个指针偏移量,根据页指针及指针偏移可以定位到具体的数据行
(4)在除叶子节点外的其他索引节点,存储的是类似内容,只不过是指向下一级索引页

8.请说说对于分页操作你是如何做的?

比如,我现在需要找到产品表中的第800000条数据后面的20条数据。
(1)直接通过limit start count分页语句,形如 select * from product limit start, count
比如:select * from product limit 800000 , 20
缺点:通过通过这样的方法的话,当数据表的数据非常多的时候,效率非常慢
总结:
1:limit语句的查询时间与起始记录的位置成正比。start越大,速度越慢。
2:mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用。

(2)利用表的覆盖索引来加速分页查询
我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。
所以,有两种方法进行优化。
方法一:通过id >= 的形式。
原因:因为,在每个表中,列表项id基本都是主键,所以,这是符合覆盖索引查询的加速优化的条件的。
SELECT * FROM product WHERE ID > =(select id from product limit 800000 ,1) limit 20
方法二:通过join操作
SELECT * FROM product a JOIN (select id from product limit 800000 , 20) b ON a.ID = b.id

9.数据库select语句的完整执行顺序是什么?(重要)

(1)from子句组装来自不同数据源的数据
(2)where子句基于指定的条件对记录进行筛选
(3)group by 子句将数据划分为多个分组
(4)使用聚集函数进行计算
(5)使用having子句筛选分组
(6)计算所有的表达式
(7)select的字段
(8)使用order by 对结果集进行排序
(9)limit进行筛选对应的条目数量

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入,这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

10.Mysql数据库架构中各个模块的作用是什么?(重要)

在这里插入图片描述
1.连接管理与安全验证
每个客户端都会建立一个与服务器连接的线程,服务器会有一个线程池来管理这些连接,如果客户端需要连接到mysql数据库还需要进行验证,包括用户名,密码,主机信息等

2.解析器
解析器的作用主要是分析查询语句,最终生成解析树;首先解析器会对查询语句的语法进行分析,分析语法是否有问题。还有解析器会查询缓存,如果在缓存中有对应的语句,就返回查询结果不进行接下来的优化执行操作。前提是缓存中的数据没有被修改,当然如果被修改了也会被清出缓存。

3.优化器
优化器的作用主要是对查询语句进行优化操作,包括选择合适的索引,数据的读取方式,包括获取查询的开销信息,统计信息等,这也是为什么图中会有优化器指向存储引擎的箭头。个人感觉,因为又花钱需要通过存储引擎获取查询的大致数据和统计信息。

4.执行器
执行器包括执行查询语句,返回查询结果,生成执行计划包括与存储引擎的一些处理操作。

参考资料:
https://blog.csdn.net/cs_hnu_scw/article/details/82900559#_282

猜你喜欢

转载自blog.csdn.net/weixin_38073885/article/details/88372704