sql 查询同一个表中一个字段值不相等的数据_数据库常见的面试题

本文详细探讨了MySQL中的存储过程优缺点、数据库范式、索引原理及类型、事务处理及其并发问题、隔离级别、视图、DML操作的区别、锁机制以及MyISAM与InnoDB存储引擎的差异。内容涵盖了数据库设计的基础知识,如三大范式、事务处理的重要性及其实现,以及索引在提升查询效率中的作用。此外,还讨论了存储引擎的选择,如InnoDB支持事务处理和行级锁,而MyISAM则更适合读取密集型应用。最后,文章介绍了如何在实践中优化MySQL,包括SQL语句、索引、表结构和系统配置的优化策略。
摘要由CSDN通过智能技术生成
3a872b958722e99d799d06615ed9ddf9.png   文本公众号来源: 我没有三颗心脏 作者: 我没有三颗心脏

1)什么是存储过程?有哪些优缺点?

存储过程就像是编程语言中的函数一样,封装了我们的代码(PLSQL,T-SQL)

例如:

-------------创建名为GetUserAccount的存储过程----------------
create Procedure GetUserAccount
as
select * from UserAccount
go

-------------执行上面的存储过程----------------
exec GetUserAccount

存储过程的优点:

  • 能够将代码封装起来

  • 保存在数据库之中

  • 让编程语言进行调用

  • 存储过程是一个预编译的代码块,执行效率比较高

  • 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率

存储过程的缺点:

  • 每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用)

  • 业务逻辑放在数据库上,难以迭代


2)三大范式

 
  • 思考这样的一个例子:

我们现在需要建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)和成绩(Grade),假设我们使用单一的关系模式 Student 来表示,那么根据现实世界已知的信息,会描述成以下这个样子:

8f6618a8bcd64603906fd70076a5e9a5.png

但是,这个关系模式存在以下问题:

(1) 数据冗余
比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同,这将浪费大量的存储空间。(2)更新异常(update anomalies)
由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。(3)插入异常(insertion anomalies)
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。(4)删除异常(deletion anomalies)
如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及其系主任的信息也丢失了。

  • 总结: 所以,我们在设计数据库的时候,就需要满足一定的规范要求,而满足不同程度要求的就是不同的范式。

 
  • 第一范式: 列不可分

1NF(第一范式)是对属性具有原子性的要求,不可再分,例如:

cdf3bcb4c7ba4aef84b958b99ce7bf53.png

如果认为最后一列还可以再分成出生年,出生月,出生日,则它就不满足第一范式的要求。

 
  • 第二范式: 消除非主属性对码的部分函数依赖

2NF(第二范式)是对记录有唯一性的要求,即实体的唯一性,不存在部分依赖,每一列与主键都相关,例如:

4f897781da6e31162c1e6b982a48d3f5.png

该表明显说明了两个事物:学生信息和课程信息;正常的依赖应该是:学分依赖课程号,姓名依赖学号,但这里存在非主键字段对码的部分依赖,即与主键不相关,不满足第二范式的要求。

可能存在的问题:

  • 数据冗余:每条记录都含有相同信息;

  • 删除异常:删除所有学生成绩,就把课程信息全删除了;

  • 插入异常:学生未选课,无法记录进数据库;

  • 更新异常:调整课程学分,所有行都调整。

正确的做法:

e48ddbf43f326fa97560a3298a4ef15f.png
 
  • 第三范式: 消除非主属性对码的传递函数依赖

3NF(第三范式)对字段有冗余性的要求,任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在依赖传递,例如:

19d9f11c2ddaaac1440efb7b74fc2f12.png

很明显,学院电话是一个冗余字段,因为存在依赖传递:(学号)→(学生)→(学院)→(学院电话)

可能会存在的问题:

  • 数据冗余:有重复值;

  • 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 。

正确的做法:

93d546b51127a5aaf3215bcbb7617b6a.png

3)数据库索引

 
  • 什么是索引?

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。

你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

 
  • 底层数据结构是什么,为什么使用这种数据结构?

(1)底层数据结构是B+树:
在数据结构中,我们最为常见的搜索结构就是二叉搜索树和AVL树(高度平衡的二叉搜索树,为了提高二叉搜索树的效率,减少树的平均搜索长度)了。然而,无论二叉搜索树还是AVL树,当数据量比较大时,都会由于树的深度过大而造成I/O读写过于频繁,进而导致查询效率低下,因此对于索引而言,多叉树结构成为不二选择。特别地࿰

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值