MySQL面试题

    科技2025-03-12  20

    1.数据库三范式

    第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解;(只要是关系型数据库都满足1NF)

    第二范式:2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键;解决:消除复合主键就可避免出现部分以来,可增加单列关键字。

    第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖。解决:将一个实体信息的数据放在一个表内实现。

    2.delete、drop、truncate区别

    truncate 和 delete只删除数据,不删除表结构 ,drop删除表结构,并且释放所占的空间。

    删除数据的速度,drop> truncate > delete

    delete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。

    使用场合:

    当你不再需要该表时, 用 drop;

    当你仍要保留该表,但要删除所有记录时, 用 truncate;

    当你要删除部分记录时(always with a where clause), 用 delete.

    3.MySQL常见的两种存储引擎

    MyISAM与InnoDB

    4.说几个mysql中你常用的函数

    sum、count 、avg、min、max

    5.索引的作用?它的优点缺点是什么?

    1)索引作用: 协助快速查询、更新数据库表中数据。 为表设置索引要付出代价的: 一是增加了数据库的存储空间 二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

    2)创建索引可以大大提高系统的性能(优点): 1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

    3)增加索引也有许多不利的方面(缺点):

    1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    6.什么是事务?

    事务是对数据库中一系列操作进行统一的回滚或者提交的操作,主要用来保证数据的完整性和一致性。

    7.事务四大特性(ACID)

    原子性、一致性、隔离性、持久性

    原子性(Atomicity): 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。 隔离性(Isolation): 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。 持久性(Durability): 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    8.列举几种表连接方式,有什么区别

    内连接、自连接、外连接(左、右、全)、交叉连接 

    内连接:只有两个元素表相匹配的才能在结果集中显示。 

    左外连接: 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 

    右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 

    全外连接:连接的表中不匹配的数据全部会显示出来。 

    交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。

    自连接:同一张表进行连接查询

    9.主键和外键的区别

    主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键

    10.在数据库中查询语句速度很慢,如何优化?

    1.建索引 

    2.减少表之间的关联 

    3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面

    4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 

    11.union和union all有什么不同?

    1)UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。

    2)UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

    3)从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

    12.16.优化WHERE子句

    对于此类考题,先说明如何定位低效SQL语句,然后根据SQL语句可能低效的原因做排查,先从索引着手,如果索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题还是一些特定类型优化的问题,逐一回答。 SQL语句优化的一些方法? 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描 4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描 5.in 和 not in 也要慎用,否则会导致全表扫描 6.下面的查询也将导致全表扫描:select id from t where name like ‘%李%’若要提高效率,可以考虑全文检索。 7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。 8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描 9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描 10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

     

    13.数据库隔离级别

    脏读:事务B读取事务A换没有提交的数据 不可重复读:俩次事务读的数据不一致 幻读:事务A修改了数据,事务B也修改了数据,这时事务A看来,明明修改了数据,咋不一样

     

    14.MySQL数据库的四类索引

    index  ----  普通索引,数据可以重复,没有任何限制。unique   ---- 唯一索引,要求索引列的值必须唯一,但允许有空值;如果是组合索引,那么列值的组合必须唯一。

    primary key ---- 主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的同时创建主键索引。

    组合索引 ----  在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。

    15.SQL语句分类

    DDL:数据定义语言(create drop

    DML:数据操作语句(insert update delete

    DQL:数据查询语句(select )

    DCL:数据控制语句,进行授权和权限回收(grant revoke)

    16.CHAR和VARCHAR的区别

    CHAR和VARCHAR类型在存储和检索方面有所不同

    CHAR列长度固定为创建表时声明的长度,长度值范围是1到255

    当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。

    17.like %和-的区别

    通配符的分类:

    %百分号通配符:表示任何字符出现任意次数(可以是0次).

    _下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.

    like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.

    18.count(*)、count(1)、count(column)的区别

    count(*)对行的数目进行计算,包含NULL count(column)对特定的列的值具有的行数进行计算,不包含NULL值。 count()还有一种使用方式,count(1)这个用法和count(*)的结果是一样的。

     

     

     

    Processed: 0.012, SQL: 8