💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
前言
小郑最近在准备Go语言的面试题,通过github和b站等各种学习网站上学习go语言的八股文,并且整理出自己觉得面试可能会问到的知识点,希望通过做笔记的方式来巩固自己的知识点,并且也希望可以帮助到大家在面试的时候更加得心应手一些,那么从现在开始,和我一起加入八股学习之旅吧!
1. 数据库的三范式是什么?
- 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
- 第二范式:要求实体的属性完全依赖于主关键字。(不能出现部分依赖)
不符合第二范式:
|--------|----------|----------|----------|
| 学号 | 课程ID | 课程名称 | 学生姓名 |
| 1 | C001 | 数学 | 张三 |
| 1 | C002 | 物理 | 张三 |
| 2 | C001 | 数学 | 李四 |
在上述表格中,学号和课程ID共同构成主键,但学生姓名(张三、李四)只依赖于学号而非整个主键。因此,学生姓名没有完全依赖于主键,是部分依赖。
- 第三范式:任何非主属性不依赖于其它非主属性。 (不能出现传递依赖)
2. MySQL 支持哪些存储引擎?
MySQL 支持多种存储引擎,比如 InnoDB,MyISAM,Memory,Archive 等等.在大多数的情况下,直接选择使用 InnoDB 引擎都是最合适的,InnoDB 也是 MySQL 的默认存储引擎。 MyISAM 和 InnoDB 的区别有哪些:
- InnoDB 支持事务,MyISAM 不支持
- InnoDB 支持外键,而 MyISAM 不支持
- InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
- Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;
- InnoDB 不保存表的具体行数,MyISAM 用一个变量保存了整个表的行数。
- MyISAM 采用表级锁(table-level locking);InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。
3.超键、候选键、主键、外键分别是什么?
超键: 是一个属性集,只有能唯一标识每一行,就被认为是超键 (超键可以有冗余信息)
学号 | 姓名 | 电话号码 |
---|---|---|
1 | 张三 | 1234 |
2 | 李四 | 5678 |
在这个表中,学号 是超键,因为它可以唯一标识每一行。实际上,学号 + 姓名 、学号 + 电话号码等也都是超键,但它们包含了冗余信息。
候选键:是超键的子集,能够标识表中每一行的最小属性集,也就是说候选码没有冗余属性的超键,一个表可以有多个候选键
主键:从候选键中选一个出来,要满足唯一性和非空性。
外键: 是一个表中的一个或多个字段,用来建立与其他表之间的关联
4. SQL 约束有哪几种?
- NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
- UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
- PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
- FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
- CHECK: 用于控制字段的值范围。
5.MySQL 中的 varchar 和 char 有什么区别?
char 是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用 10 个字符
varchar 是变长的 ,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.
在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用 char,否则应该尽量使用 varchar.
6. 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要快。
7. drop、delete与truncate的区别
三者都表示删除,但是三者有一些差别:

8. 什么是存储过程?有哪些优缺点?
存储过程是一些预编译的 SQL 语句。存储过程类似于一个方法集,里面用很多写好的方法,它是由T-SQL语句组成的代码块,像方法一样实现一些功能(对单表或者多表的增删改查),在用到的时候调用他即可
优点:可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全
缺点:在互联网项目中,迭代太快,项目的生命周期也比较短,人员流动相比于传统的项目也更加频繁,在这样的情况下,存储过程的管理确实是没有那么方便,同时,复用性也没有写在服务层那么好。
9. MySQL 执行查询的过程
- 客户端通过 TCP 连接发送连接请求到 MySQL 连接器,连接器会对该请求进行权限验证及连接资源分配
- 查缓存。(当判断缓存是否命中时,MySQL 不会进行解析查询语句,而是直接使用 SQL 语句和客户端发送过来的其他原始信息。所以,任何字符上的不同,例如空格、注解等都会导致缓存的不命中。)
- 语法分析(SQL 语法是否写错了)。 如何把语句给到预处理器,检查数据表和数据列是否存在,解析别名看是否存在歧义。
- 优化。是否使用索引,生成执行计划。
- 交给执行器,将数据保存到结果集中,同时会逐步将数据缓存到查询缓存中,最终将结果集返回给客户端。
注:此文借鉴于github地址
❤️❤️❤️小郑是普通学生水平,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍