MySQL面试核心25问(附答案),心有猛虎,细嗅蔷薇

MYSQL——美团面试题 2023/3/27 美团二面。 阅读详情

篇幅所限本文只写了MySQL25题,像其他的Redis,SSM框架,算法,计网等技术栈的面试题后面会持续更新,个人整理的1000余道面试八股文会放在文末给大家白嫖,最近有面试需要刷题的同学可以直接翻到文末领取。

1、为什么使用索引?

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

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

  • 帮助服务器避免排序和临时表

  • 将随机IO变为顺序IO。

  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

2、Innodb为什么要用自增id作为主键?

如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。

3、MyISAM和InnoDB实现B树索引方式的区别是什么?

  • MyISAM,B+Tree叶节点的data域存放的是数据记录的地址,在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录,这被称为“非聚簇索引”

  • InnoDB,其数据文件本身就是索引文件,相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,这被称为“聚簇索引”或者聚集索引,而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。因此,在设计表的时候,不建议使用过长的字段为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

4、说一下MySQL是如何执行一条SQL的?具体步骤有哪些?

SQL执行的全部过程

Server层按顺序执行sql的步骤为:

  1. 客户端请求->

  2. 连接器(验证用户身份,给予权限) ->

  3. 查询缓存(存在缓存则直接返回,不存在则执行后续操作)->

  4. 分析器(对SQL进行词法分析和语法分析操作) ->

  5. 优化器(主要对执行的sql优化选择最优的执行方案方法) ->

  6. 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)->

  7. 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)

简单概括:

  • 连接器:管理连接、权限验证;

  • 查询缓存:命中缓存则直接返回结果;

  • 分析器:对SQL进行词法分析、语法分析;(判断查询的SQL字段是否存在也是在这步)

  • 优化器:执行计划生成、选择索引;

  • 执行器:操作引擎、返回结果;

  • 存储引擎:存储数据、提供读写接口。

5、你了解MySQL的内部构造吗?一般可以分为哪两个部分?

可以分为服务层和存储引擎层两部分,其中:

服务层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认的存储引擎。

6、说一说Drop、Delete与Truncate的共同点和区别

第一种回答

Drop、Delete、Truncate都表示删除,但是三者有一些差别:

Delete用来删除表的全部或者一部分数据行,执行Delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。

Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比Delete更快,占用的空间更小。

Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

因此,在不再需要一张表的时候,用Drop;在想删除部分数据行时候,用Delete;在保留表而删除所有数据的时候用Truncate。

第二种回答

  • Drop直接删掉表;

  • Truncate删除表中数据,再插入时自增长id又从1开始 ;

  • Delete删除表中数据,可以加where字句。

具体解析

  1. DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

  2. 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

  3. 一般而言,drop > truncate > delete

  4. 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view

  5. TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

  6. truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

  7. delete语句为DML(Data Manipulation Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。

  8. truncate、drop是DDL(Data Define Language),操作立即生效,原数据不放到 rollback segment中,不能回滚

  9. 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果与事务无关,用truncate即可实现。如果和事务有关,或老是想触发trigger,还是用delete。

  10. Truncate table 表名 速度快,而且效率高,因为: truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

  11. TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

  12. 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

7、MySQL优化了解吗?说一下从哪些方面可以做到性能优化?

  • 为搜索字段创建索引

  • 避免使用 Select *,列出需要查询的字段

  • 垂直分割分表

  • 选择正确的存储引擎

8、数据库隔离级别

  • 未提交读,事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100.可能会导致脏读、幻读或不可重复读

  • 提交读,对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取的A是50,刚读取完,A就被修改成100,这个时候另一个事务再进行读取发现A就突然变成100了;可以阻止脏读,但是幻读或不可重复读仍有可能发生

  • 重复读,就是对一个记录读取多次的记录是相同的,比如对于一个数A读取的话一直是A,前后两次读取的A是一致的;可以阻止脏读和不可重复读,但幻读仍有可能发生

  • 可串行化读,在并发情况下,和串行化的读取的结果是一致的,没有什么不同,比如不会发生脏读和幻读;该级别可以防止脏读、不可重复读以及幻读

隔离级别脏读不可重复读幻影读READ-UNCOMMITTED 未提交读√√√READ-COMMITTED 提交读×√√REPEATABLE-READ 重复读××√SERIALIZABLE 可串行化读×××

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)

这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别 下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以 说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要 求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。

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

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

9、都知道数据库索引采用B+树而不是B树,原因也有很多,主要原因是什么?

主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

10、文件索引和数据库索引为什么使用B+树?(第9个问题的详细回答)

文件与数据库都是需要较大的存储,也就是说,它们都不可能全部存储在内存中,故需要存储到磁盘上。而所谓索引,则为了数据的快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。数据库系统巧妙利用了局部性原理与磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,而红黑树这种结构,高度明显要深的多,并且由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。

最重要的是,B+树还有一个最大的好处:方便扫库。

B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持,这是数据库选用B+树的最主要原因。

B+树查找效率更加稳定,B树有可能在中间节点找到数据,稳定性不够。

B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针(红色部分),因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一块盘中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;

B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

11、听说过视图吗?那游标呢?

视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能 游标是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

12、MySQL中为什么要有事务回滚机制?

而在 MySQL 中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。当事务已经被提交之后,就无法再次回滚了。

回滚日志作用:1)能够在发生错误或者用户执行 ROLLBACK 时提供回滚相关的信息 2) 在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。

13、数据库引擎InnoDB与MyISAM的区别

InnoDB

  • 是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。

  • 实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读。

  • 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。

  • 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。

  • 支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。

MyISAM

  • 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。

  • 提供了大量的特性,包括压缩表、空间数据索引等。

  • 不支持事务。

  • 不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。

总结

  • 事务: InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句。

  • 并发: MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。

  • 外键: InnoDB 支持外键。

  • 备份: InnoDB 支持在线热备份。

  • 崩溃恢复: MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。

  • 其它特性: MyISAM 支持压缩表和空间数据索引。

14、数据库并发事务会带来哪些问题?

数据库并发会带来脏读、幻读、丢弃更改、不可重复读这四个常见问题,其中:

脏读:在第一个修改事务和读取事务进行的时候,读取事务读到的数据为100,这是修改之后的数据,但是之后该事务满足一致性等特性而做了回滚操作,那么读取事务得到的结果就是脏数据了。

幻读:一般是T1在某个范围内进行修改操作(增加或者删除),而T2读取该范围导致读到的数据是修改之间的了,强调范围。

丢弃修改:两个写事务T1 T2同时对A=0进行递增操作,结果T2覆盖T1,导致最终结果是1 而不是2,事务被覆盖

不可重复读:T2 读取一个数据,然后T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

脏读

脏读

第一个事务首先读取var变量为50,接着准备更新为100的时,并未提交,第二个事务已经读取var为100,此时第一个事务做了回滚。最终第二个事务读取的var和数据库的var不一样。

幻读(幻影读)

幻读

T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

丢弃修改

丢弃修改

T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。例如:事务1读取某表中的数据A=50,事务2也读取A=50,事务1修改A=A+50,事务2也修改A=A+50,最终结果A=100,事务1的修改被丢失。

不可重复读

不可重复读

T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

15、数据库悲观锁和乐观锁的原理和应用场景分别有什么?

悲观锁,先获取锁,再进行业务操作,一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。当数据库执行SELECT … FOR UPDATE时会获取被select中的数据行的行锁,select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

乐观锁,先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过。Java 并发包中的 AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。

16、MySQL索引主要使用的两种数据结构是什么?

  • 哈希索引,对于哈希索引来说,底层的数据结构肯定是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引

  • BTree索引,Mysql的BTree索引使用的是B树中的B+Tree,BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。但对于主要的两种存储引擎(MyISAM和InnoDB)的实现方式是不同的。

17、数据库为什么要进行分库和分表呢?都放在一个库或者一张表中不可以吗?

分库与分表的目的在于,减小数据库的单库单表负担,提高查询性能,缩短查询时间。

通过分表,可以减少数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量少了,起到提高查询性能,缩短查询时间的作用,此外,可以很大的缓解表锁的问题。分表策略可以归纳为垂直拆分和水平拆分:

水平分表:取模分表就属于随机分表,而时间维度分表则属于连续分表。如何设计好垂直拆分,我的建议:将不常用的字段单独拆分到另外一张扩展表. 将大文本的字段单独拆分到另外一张扩展表, 将不经常修改的字段放在同一张表中,将经常改变的字段放在另一张表中。对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈。

库内分表,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻 MySQL 服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括 CPU、内存、磁盘 IO、网络带宽等。

分库与分表带来的分布式困境与应对之策数据迁移与扩容问题----一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中。分页与排序问题----需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。

18、不可重复读和幻读区别是什么?可以举个例子吗?

不可重复读的重点是修改,幻读的重点在于新增或者删除。

  • 例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导致A再读自己的工资时工资变为 2000;这就是不可重复读。

  • 例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记 录就变为了5条,这样就导致了幻读。

19、MySQL中有四种索引类型,可以简单说说吗?

  • FULLTEXT :即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。

  • HASH :由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

  • BTREE :BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

  • RTREE :RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找。

20、视图的作用是什么?可以更改吗?

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的 sql 操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。

视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。

创建视图:create view xxx as xxxx

对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。

21、为什么说B+tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?

B+tree的磁盘读写代价更低,B+tree的查询效率更加稳定 数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

B+树的特点

  • 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

  • 不可能在非叶子结点命中;

  • 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

22、一道场景题:假如你所在的公司选择MySQL数据库作数据存储,一天五万条以上的增量,预计运维三年,你有哪些优化手段?

  • 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。

  • 选择合适的表字段数据类型和存储引擎,适当的添加索引。

  • MySQL库主从读写分离。

  • 找规律分表,减少单表中的数据量提高查询速度。

  • 添加缓存机制,比如Memcached,Apc等。

  • 不经常改动的页面,生成静态页面。

  • 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE。

23、什么时候需要建立数据库索引呢?

在最频繁使用的、用以缩小查询范围的字段,需要排序的字段上建立索引。不宜:1)对于查询中很少涉及的列或者重复值比较多的列 2)对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。

24、覆盖索引是什么?

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称 之为“覆盖索引”。

我们知道在InnoDB存储引 擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次,这样就 会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!

25、数据库中的主键、超键、候选键、外键是什么?(很棒)

  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键

  • 候选键:不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!

  • 主键:用户选作元组标识的一个候选键程序主键

  • 外键:如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。

举例:

学号姓名性别年龄系别专业20020612李辉男20计算机软件开发20060613张明男18计算机软件开发20060614王小玉女19物理力学20060615李淑华女17生物动物学20060616赵静男21化学食品化学20060617赵静女20生物植物学

  1. 超键:于是我们从例子中可以发现 学号是标识学生实体的唯一标识。那么该元组的超键就为学号。除此之外我们还可以把它跟其他属性组合起来,比如:(学号,性别),(学号,年龄)

  2. 候选键:根据例子可知,学号是一个可以唯一标识元组的唯一标识,因此学号是一个候选键,实际上,候选键是超键的子集,比如 (学号,年龄)是超键,但是它不是候选键。因为它还有了额外的属性。

  3. 主键:简单的说,例子中的元组的候选键为学号,但是我们选定他作为该元组的唯一标识,那么学号就为主键。

  4. 外键是相对于主键的,比如在学生记录里,主键为学号,在成绩单表中也有学号字段,因此学号为成绩单表的外键,为学生表的主键。

主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。

对面试资料感兴趣的朋友关注+私信【学习】或vx公众号【小马的后端宇宙】即可获取哦

3.25 美团面试SQL题 查询占比 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。函数用于根据一个条件返回不同的值,比如这一条里面,如果结果为TRUE,返回1,反之则为0.最后加起来就是符合条件的条数。Dog 查询结果的质量为 ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50。Cat 查询结果的质量为 ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66。评分小于 3 的查询结果占全部查询结果的百分比。编写解决方案,找出每次的。 阅读详情

相关推荐

InterviewGuide:计算机校招,社招面试八股文整理,也是《逆袭进大厂》唯一仓库,目前已收录CC ++,操作系统,数据结构,计算机网络,MySQL,Redis等面试资料,未来打算继续收录Java,Python ,Go等面试常见问题,坚持进行仓库维护下去

面试指南 优质计算机校招,社招面试常见面试题整理,也是《面试指南》的唯一仓库,它还有一个名字叫做《逆袭进大厂》 。目前已收录C / C ++,操作系统,数据结构,计算机网络,MySQL,Redis等面试资料,未来打算继续收录Java,Python,Go等面试常见问题,坚持进行仓库维护下去。 :open_book:仓库建议 :folded_hands:本仓库脱胎于阿秀2021年秋招时期总结的面试笔记,我自己也是伴随这份笔记成功经验到一份要约收割机的快乐,阿秀秋招总结可看总结,现将个人笔记整理开源出来,造福每位像我这样的渣渣〜 由于本人水平有限,仓库内容如有错误,欢迎提交问题,虚心接受每一位好心人的建议与意见。 另仓库中的全部知识点均来自本人学习的总结,读书笔记,经典书籍,网络博文等,阿秀已经尽自己最大的能力发现当时搜集面试题时的出处并注明了。如有遗漏与价值,请问题提出,感激不尽。 转载请注明出处,不得用于商业目的。 :books:目录 面试

2022 【美团】面试真题

2022 【美团】面试真题

qq_45818776的博客 613

Type-C快充移动电源芯片避坑指南:IP5356配置全流程(支持PD3.0)

本文详细解析了英集芯IP5356芯片在Type-C快充移动电源中的应用,提供了从芯片选型、原理图设计、PCB布局到PD协议调试的全流程实战指南。文章重点剖析了如何避免散热、EMI及协议握手等常见设计陷阱,并分享了量产前的关键测试验证方法,旨在帮助硬件开发者高效打造稳定可靠的快充产品。

weixin_29235525的博客 850

美团优选大数据开发岗面试真题-附答案详细解析

公众号(五分钟学大数据)已推出大数据面试系列文章—五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 此面试题来自牛客网友分享的美团优选一面,面试时长一小时。网友情况:海外水本,在某三线中厂工作2年。 参考答案由本公众号提供。如有错误,欢迎指正! 以下为面试过程中提问,岗位为大数据开发,根据提问内容看出,主要偏数仓方向 自我介绍 到北京工作的意愿 SQL题,给一张城市和交易额表,一张城市对应省份表, 取.

yuan_more的博客 9150

如何在Proteus中模拟Arduino

进一步的Proteus可用于设计任何与Arduino相关的项目,它将在进入硬件级别之前提供更好的理解。由于其广泛的库集合,它是Arduino社区中最受欢迎的工具之一,不仅如此,Proteus还可以为Arduino项目设计定制的PCB。就像上一步一样,现在搜索Arduino UNO板,选择Arduino板并单击“确定”以添加到项目中,或者双击以在Proteus项目中添加Arduino。一旦在Proteus中成功创建了一个新项目,现在我们将设计一个用于Proteus中闪烁LED的Arduino电路。

acktomas的博客 1万+

图信号处理中的多尺度分析:图小波变换与图傅里叶变换的对比与应用

本文深入探讨了图信号处理中的多尺度分析方法,重点对比了图小波变换(GWT)与图傅里叶变换(GFT)的技术特点与应用场景。通过分析图的拓扑结构,GWT展现出强大的局部洞察力,适用于异常检测和社区发现;而GFT则擅长全局频率分析,适合趋势分析和信号去噪。文章结合实战案例,为读者提供了方法选型指南和前沿进展,帮助开发者在生物信息学、社交网络分析等领域高效应用这些技术。

weixin_30369041的博客 406

美团SQL面试题-查询2023年每个月,连续2天都有登陆的用户名单

美团面试SQL题,每个月连续登录2天的用户名单

haj6468的博客 578

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源)

本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。

weixin_42638178的博客 397

美团大咖分享:20道高频数据库面试题及21条MySQL性能调优经验

进了互联网公司,整天也就是搬砖,等到了面试的时候,发现数据库方面,忘得一塌糊涂,这是我从一位大佬那里要来的一些数据库方面的问题。欢迎大家向我推荐你在面试过程中遇到的问题,我会把大家推荐的问题添加到下面的常用面试题清单中供大家参考。这20道高频常见数据库问题解析.pdf和21条MySQL性能调优经验实践.pdf在这免费分享给那些有需要的朋友,同时整理也花费了蛮多时间,由于篇幅原因,在这答案就不做文字展示了,这些题我已经整理成pdf文档免费分享给那些有需要的朋友,同时整理也花费了蛮多时间,

jjc4261的博客 368

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1549

Vue3 - Arco Design Vue 表格组件 table 隐藏鼠标移入时 hover 高亮背景色,el-table 组件去除鼠标悬停在表格行的 hover 高亮效果(改变鼠标移入时的背景色)

vue3,arcodesignvue,arcodesign,表格,a-table,hover,表格hover的class类名是什么,class,hover,在arcodesignvue项目中,表格组件如何去掉鼠标移入时的hover效果,vue3arco.design表格组件修改鼠标移入行的背景颜色,table表格,取消表格行row移入高亮效果,去掉鼠标移入行时的hover效果,取消a-table的hover状态,取消高亮显示,隐藏表格鼠标hover效果,去除鼠标触摸变色效果,如何取消arco表

🏆 前端领域优质创作者 3772

美团面试(一面)

给位小伙伴好,这里呢,分享一下最近一次美团的面试的面经,自己把面试的大多数内容通过博客的形式记录了下来,希望对各位有所帮助哦~

qq_51933234的博客 6972

YOLOv11 改进 - 即插即用 | PST金字塔稀疏Transformer:粗粒度到细粒度推理优化特征提取,提升复杂场景适应性

本文介绍了金字塔稀疏 Transformer(PST)与 YOLOv11 的结合。主流基于注意力的特征融合方法计算复杂度高、实现难度大,作者提出 PST 模块,融合粗到细令牌选择与共享注意力参数机制,在保留空间细节的同时降低计算量。该模块通过层级化注意力机制、动态令牌选择与参数共享,实现高效多尺度特征融合

魔改工程师的博客 830

《逆袭进大厂》第十一弹之MySQL25问25答

大家好,我是鸽秀。嗯,鸽子的鸽...咕咕咕咕咕《逆袭进大厂》系列貌似鸽很久了,都有粉丝跑来给我留言催更....这段时间阿秀也是一直在忙自己毕业的事,研究生大论文搞得我脑壳都要大了,艾玛昨天...

博客 977

《网络摄像机实战11:flutter_webrtc支持 AWS Kinesis Video Streams信令服务器》

本文介绍了如何在Flutter项目中集成WebRTC实现网络摄像头的实时视频和音频对讲功能。通过使用flutter_webrtc插件,开发者可以快速构建跨平台的视频通信应用。文章详细说明了集成步骤:1)安装flutter_webrtc插件;2)配置信令服务器和KVS服务;3)初始化本地/远程视频渲染器;4)建立WebRTC连接并进行设备呼叫。最后展示了实际应用效果图,证明该方案能有效实现移动端与摄像头的实时音视频交互。该方案为开发智能家居监控等应用提供了技术参考。

lvj_158的专栏 356

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

揭秘2024美团春招:最全MySQL面试题大全,必看必收藏!

因此,我们精心设计了一系列面试题,旨在深入探索应聘者对MySQL的掌握程度,从基本概念到高级应用,从性能优化到安全保护,再到实际场景的应用,无不体现了我们对技术精湛和创新思维的高度重视。欢迎来到2024美团春季校园招聘!我们相信,技术的力量可以开启无限可能,改变人们的生活方式,而数据库作为技术革新的基石,对于支持我们广泛的服务和高效的运营至关重要。这不仅是一次面试,更是一次展现你的技术才华和解决问题能力的机会,也是一次加入引领未来的团队,共同成长和创造影响力的旅程。

Von_016's Blog 780

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

美团面试题:慢SQL有遇到过吗?是怎么解决的?

大家好,我是田维常,可以叫我老田,也可以叫我田哥。2017年的时候,我刚去上海,朋友内推我去美团面试,之前我也写过一个一篇文章,也是在美团面试中遇到的:美团面试题:String s = n...

田维常 788

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

最新美团面试集合(一面+二面+三面+重点技术面试题)附面试解析

4.数据库MySQL相关的,这个也是每次必问,毕竟是平时工作中使用最多的,考察数据库基本功:存储引擎、SQL查询优化、常见索引的使用和区别、事务的使用,表范式设计,以及分库分表的策略和实际应用等。1.Java容器的问题:hashmap、currenthashmap等,建议面试前把这几个问到最多的类的原理、到底层数据结构、再到数据扩容,以及算法复杂度,都需要重点掌握。3.JVM不用说了,每次都考,如果对内存的回收,垃圾回收器的种类区别,回收算法机制这个必须要掌握。3. 分布式锁的实现你知道的有哪些?

jjc4261的博客 4285

美团sql面试题,订单表orders,商品表produts,品牌表brands

1、订单表orders包含字段:订单ID.下单时间,订单金额,用户ID,商品ID。商品类目,品牌ID。2、商品表produts,包含字段:商品ID,商品名称,3、品牌表brands,包含字段:品牌ID,品牌名称。

qq_21277357的博客 304

今天来分享一道美团高频面试题,5 分钟搞懂“为什么 MySQL 不建议使用 NULL 作为列默认值?”

今天来分享一道美团高频面试题,5 分钟搞懂“为什么 MySQL 不建议使用 NULL 作为列默认值?”。

weixin_44749255的博客 274

【面试】美团面试真题和答案

问题来源于某客,如下图所示:问题链接:https://www.nowcoder.com/feed/main/detail/b12f8ece42f6485d8e462ab872c4f8d8答案解析。

DreamSun的博客 3639

美团三面,我被面试官的MySQL夺命25连问整麻了,特此归纳总结一下面试中常问的MySQL面试题

朋友前一段时间去了美团面试,回来就跟我吐槽,这哪是去面试java的,面试官就抓住MySQL一直问,头皮都问的发麻了。想了想确实近几年MySQL在面试中的占比是比较高,结合朋友的面试和自己的整理我归纳了一下面试中出现的比较频繁的MySQL面试题,大家可以对照一下自己,查漏补缺,看自己能答出来多少。本文就先写到这里,面试中常问的一些题目我都有整理的,后面会持续更新,有需要完整PDF文档的可以移步公众号:前程有光,免费领取全部©著作权归作者所有,转载或内容合作请联系作者。

qq_24428851的博客 1055

美团面试:MySQL中有哪些锁?当时我就懵逼了!

大家好,我是田维常,江湖人称老田,今天给大家分享美团面试第六个技术点:MySQL中的锁。之前,我已经分享给五个美团面试的技术点:美团面试:讲清楚MySQL结构体系,立马发offer美团面试...

田维常 595

避免幻读 : next-key锁与MVCC

文章目录引言next-key锁多版本并发控制(MVCC)两者的区别总结 引言 在隔离级别为RR时,MySQL已经可以避免脏读和重复读,但还是无法避免幻读,MySQL采用next-key锁与MVCC(多版本并发控制)来避免幻读. next-key锁 next-key 锁是索引 record 上的 record 锁和 index record 之前的间隙上的间隙锁的组合。 InnoDB以这样的方式执...

李兆龙的博客 3454

美团面试准备之数据库

美团重点就是数据库、linux、java上,感觉只要你的java和数据库好就能进,恰巧,我是搞C++的,数据库不咋熟悉。 数据库的事务,具体在代码里怎么实现事务。比如:我往一个表里插入一个a再插入一个b再插入一个 redis数据库跟本地数据库有什么区别吗 redis实际工作中有用到过吗? 数据清洗是怎么清洗的 什么情境下会用到redis? 数据库熟悉吗?(不熟悉啊,没关系,我问几个问题...

qq_36415932的博客 1160

MySql进阶(一)

MySql进阶(一) 1、存储引擎 1.1 概念 ​ 存储引擎又叫做表类型,主要用来决定如何存储数据库的信息、如何检索信息。存储引擎是基于表的,本质上就是处理sql操作。注意:只有mysql才有存储引擎的概念,例如oracle数据库是没有存储引擎的概念。 1.2 特点 ​ 在使用MySql的时候用户可以选择不同的存储引擎来提高应用的效率,甚至可以定制自己的存储引擎。在 MySql 5.5 之前默认的存储引擎是 MyISAM ,而在这之后使用的是 InnoDB 。在Mysql的诸多存储引擎中,只有I

weixin_44331613的博客 1001
上一篇: 一次 MySQL 误操作导致的事故,「高可用」都顶不住了
下一篇: Java岗最全面试攻略,吃透25个技术栈,Offer拿到手软,直捣秋招
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值