Mysql面试题以及答案

发布于:2024-03-21 ⋅ 阅读:(70) ⋅ 点赞:(0)

文章目录


1. 插入记录后删除再重启数据库的情况下,新记录的 ID

MyISAM 表类型: 18
因为 MyISAM 表会将自增主键的最大 ID 记录到数据文件里,重启 MySQL 后自增主键的最大 ID 不会丢失。

InnoDB 表类型: 15
InnoDB 表只会将自增主键的最大 ID 记录到内存中,所以重启数据库或者对表进行 OPTIMIZE 操作都会导致最大 ID 丢失。

2. MySQL 的技术特点

MySQL 是一个客户端/服务器系统,包括多线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。其技术特点包括但不限于:可伸缩性、高性能、支持多种存储引擎、跨平台、开源等。

3. Heap 表

Heap 表是存在于内存中的临时高速存储表。它的特点包括:

  • 不支持 BLOB 或 TEXT 字段;
  • 只能使用比较运算符(=,<,>,=>,= <)进行比较;
  • 不支持 AUTO_INCREMENT;
  • 索引字段不允许为 NULL。

4. MySQL 服务器默认端口

MySQL 服务器的默认端口是 3306

5. MySQL 相对于 Oracle 的优势

相比 Oracle,MySQL 有以下优势:

  • 开源免费:MySQL 是开源软件,可以随时免费使用,而不需要支付高额的许可费用。
  • 轻量级和便携性:MySQL 是一种轻量级的数据库管理系统,易于安装和部署,且可以在各种操作系统上运行,具有较好的跨平台性。
  • 简单易用的管理工具:MySQL 提供了许多管理工具,如命令行工具、图形用户界面(GUI)工具等,使得管理和维护数据库变得更加简单和高效。
  • 社区支持和活跃度:MySQL 拥有庞大的用户社区和开发者社区,可以获得丰富的技术支持和资源,而且其发展活跃度较高,不断有新功能和改进推出。

6. 区分 FLOAT 和 DOUBLE

  • FLOAT: 以 8 位精度存储,占用 4 个字节。
  • DOUBLE: 以 18 位精度存储,占用 8 个字节。

7. 区分 CHAR_LENGTH 和 LENGTH

  • CHAR_LENGTH: 返回字符串中的字符数。
  • LENGTH: 返回字符串的字节数。对于 Latin 字符,它们相同;但对于 Unicode 和其他编码,可能不同。

8. InnoDB 支持的四种事务隔离级别及区别

  1. READ UNCOMMITTED(读取未提交数据): 允许一个事务读取另一个事务尚未提交的数据。
  2. READ COMMITTED(读取已提交数据): 一个事务只能读取已提交的数据,避免了脏读,但可能会出现不可重复读。
  3. REPEATABLE READ(可重复读): 保证在事务执行期间查询结果是一致的,即使有其他事务对数据进行了修改。
  4. SERIALIZABLE(串行化): 最高的隔离级别,确保事务顺序执行,避免了所有并发问题,但可能导致性能下降。

9. ENUM 的用法

ENUM 是用于指定一组预定义值的字符串对象,可用于创建表时的列定义。

CREATE TABLE size (
    name ENUM('Small', 'Medium', 'Large')
);

10. 定义 REGEXP

REGEXP 是用于模式匹配的操作符,可以在搜索值的任何位置进行匹配。

11. CHAR 和 VARCHAR 的区别

  • CHAR: 固定长度的字符串,存储时会用空格填充到指定长度。
  • VARCHAR: 可变长度的字符串,存储时只占用实际长度的空间。

12. 字符串类型的列可以是

字符串类型包括:SET、BLOB、ENUM、CHAR、TEXT、VARCHAR。

13. 获取当前 MySQL 版本

使用以下 SQL 查询可以获取当前 MySQL 的版本:

SELECT VERSION();

14. MySQL 中使用的存储引擎

MySQL 中常用的存储引擎有:

  • InnoDB: 支持事务处理,行级锁定和外键约束,用于事务处理要求较高的应用。
  • MyISAM: 不支持事务处理和行级锁定,但具有较高的性能,适用于读密集型应用。
  • Memory: 将表中的数据存储在内存中,适用于对速度要求较高,但数据可以丢失的临时表。
  • Archive: 压缩存储数据,适用于存储大量历史数据并且不需要频繁更新的情况。

15. MySQL 驱动程序

MySQL 中常用的驱动程序包括:

  • PHP 驱动程序
  • JDBC 驱动程序
  • ODBC 驱动程序
  • Python 驱动程序
  • Perl 驱动程序
  • Ruby 驱动程序
  • ADO.NET 驱动程序
  • mxj 驱动程序等

16. TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上的作用

当指定了 ON UPDATE CURRENT_TIMESTAMP 属性的 TIMESTAMP 列的值将会在该行更新时自动更新为当前时间。

17. 主键和候选键的区别

  • 主键(Primary Key): 表中唯一标识每一行的列,一个表只能有一个主键,可以通过主键进行其他表的引用。

  • 候选键(Candidate Key): 可以作为主键的备选项,即候选键也具有唯一性,但表可以有多个候选键。

18. 使用 Unix shell 登录 MySQL

可以使用以下命令登录 MySQL:

mysql -h hostname -u username -p

19. myisamchk 的作用

myisamchk 用于检查、维护和修复 MyISAM 表。它还可以用来压缩表以减少磁盘空间的使用。

20. MySQL 数据库服务器性能分析的方法命令

MySQL 数据库服务器性能分析的方法命令包括:

  • SHOW STATUS;
  • SHOW VARIABLES;
  • EXPLAIN SELECT ...;
  • mysqlslap(压力测试工具)
  • mysqldumpslow(慢查询日志分析工具)等。

21. 控制 HEAP 表的最大尺寸

可以通过设置 MySQL 配置变量 max_heap_table_size 来控制 HEAP 表的最大尺寸。

22. MyISAM Static 和 MyISAM Dynamic 的区别

  • MyISAM Static: 所有字段都有固定宽度,表文件大小不会动态变化,容易恢复。

  • MyISAM Dynamic: 表的字段可以是可变宽度的,例如 TEXT、BLOB 等,表文件大小可以动态变化,但在受损情况下恢复较困难。

23. federated 表

Federated 表允许访问位于其他服务器数据库上的表,使得可以在一个 MySQL 服务器上查询和操作另一个 MySQL 服务器上的表数据。

24. TIMESTAMP 类型列的作用

当表中的行发生更改时,TIMESTAMP 类型列会自动更新为当前时间戳。

25. AUTO_INCREMENT 列达到最大值时的情况

当 AUTO_INCREMENT 列达到最大值时,进一步的插入操作将会失败,因为该值已经被使用,系统会停止递增并产生错误。

26. 找出最后一次插入时分配的自动增量值

可以使用 LAST_INSERT_ID() 函数来获取最后一次插入时分配的自动增量值,而不需要指定表名。

27. 查看为表定义的所有索引

可以使用 SHOW INDEX FROM table_name; 命令来查看表定义的所有索引。

28. LIKE 声明中的 %_

  • % 匹配 0 个或多个字符。
  • _ 匹配一个字符。

29. 在 Unix 时间戳和 MySQL 时间戳之间进行转换

  • 从 MySQL 时间戳转换为 Unix 时间戳:使用 UNIX_TIMESTAMP() 函数。
  • 从 Unix 时间戳转换为 MySQL 时间戳:使用 FROM_UNIXTIME() 函数。

30. 列比较运算符

在 SELECT 语句的列比较中,可以使用 =<><=<>=><<>><=>ANDORLIKE 运算符。

31. 获取受查询影响的行数

可以使用 SELECT COUNT(column_name) FROM table_name; 来获取受查询影响的行数。

32. MySQL 查询是否区分大小写

MySQL 查询不区分大小写。

33. LIKE 和 REGEXP 操作的区别

  • LIKE: 用于模式匹配,% 匹配 0 个或多个字符,_ 匹配一个字符。
  • REGEXP: 使用正则表达式进行模式匹配,支持更复杂的模式匹配需求。

34. BLOB 和 TEXT 的区别

  • BLOB: 用于存储二进制数据,有四种类型,分别是 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
  • TEXT: 用于存储文本数据,有四种类型,分别是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。与 BLOB 不同的是,对 TEXT 类型的值进行排序和比较时不区分大小写。

35. mysql_fetch_array 和 mysql_fetch_object 的区别

  • mysql_fetch_array(): 返回结果行作为关联数组或索引数组。
  • mysql_fetch_object(): 返回结果行作为对象。

36. 在 MySQL 中运行批处理模式

可以通过以下命令来在批处理模式下运行 MySQL:

mysql

或者将输出重定向到一个文件中:

mysql > mysql.out

37. MyISAM 表的存储和存储格式

MyISAM 表以三种格式存储在磁盘上:

  • .frm 文件存储表定义。
  • 数据文件具有 .MYD(MYData)扩展名。
  • 索引文件具有 .MYI(MYIndex)扩展名。

38. MySQL 中的不同类型的表

MySQL 中共有 5 种类型的表:

  1. MyISAM
  2. Heap
  3. Merge
  4. InnoDB
  5. ISAM

39. ISAM 是什么

ISAM 是索引顺序访问方法,是由 IBM 开发的用于在磁带等辅助存储系统上存储和检索数据的技术。

40. InnoDB 是什么

InnoDB 是一个由 Oracle 公司开发的事务安全存储引擎。

41. 优化 DISTINCT

在 MySQL 中,可以将 DISTINCT 转换为 GROUP BY 并与 ORDER BY 子句结合使用来优化查询。

42. 输入十六进制数字

在 MySQL 中,可以使用带有单引号的十六进制数字和前缀(X),或者只使用前缀(0x)来输入十六进制数字。例如:0x0A

43. 显示前 50 行

在 MySQL 中,可以使用 LIMIT 关键字来显示前 50 行:

SELECT * FROM table_name LIMIT 0, 50;

44. 可以使用多少列创建索引

在标准表中,最多可以创建 16 个索引列。

45. NOW() 和 CURRENT_DATE() 的区别

  • NOW() 返回当前日期和时间。
  • CURRENT_DATE() 返回当前日期。

46. 使用 CREATE 语句创建哪些对象

可以使用 CREATE 语句创建以下对象:

  • DATABASE
  • EVENT
  • FUNCTION
  • INDEX
  • PROCEDURE
  • TABLE
  • TRIGGER
  • USER
  • VIEW

47. MySQL 表中允许多少个 TRIGGERS

MySQL 表中允许有六个触发器:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE

48. 非标准字符串类型是什么

非标准字符串类型包括:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。

49. 通用 SQL 函数

通用 SQL 函数包括:CONCAT、FORMAT、CURRDATE、CURRTIME、NOW、MONTH、DAY、YEAR、WEEK、WEEKDAY、HOUR、MINUTE、SECOND、DATEDIFF、SUBTIMES、FROMDAYS 等。

50. 解释访问控制列表

ACL(访问控制列表)是与对象关联的权限列表,用于控制用户对数据库的访问。

51. MySQL 是否支持事务

MySQL 支持事务,但默认情况下处于 autocommit 模式。

52. 记录货币使用的字段类型

记录货币使用 NUMERIC 或 DECIMAL 类型。

53. MySQL 数据表容易损坏的情况

MySQL 数据表容易损坏的情况包括:服务器突然断电、强制关机等。

54. 关于权限的表

MySQL 中关于权限的表包括:user、db、table_priv、columns_priv 和 host。

55. MySQL 中的锁类型

MySQL 中的锁类型包括表级锁和行级锁,其中 MyISAM 支持表级锁,InnoDB 支持表级锁和行级锁。

56.数据库三范式是什么?

  1. 第一范式(1NF): 要求数据库中的每个列都是原子性的,即不可再分。每一列都包含唯一的数据项,而且没有重复的列。

  2. 第二范式(2NF): 在第一范式的基础上,要求每张表都有一个主键,并且非主键列完全依赖于主键,而不是依赖于主键的一部分。这样可以消除部分依赖关系,保证数据的唯一性。

  3. 第三范式(3NF): 在第二范式的基础上,要求每个非主键列都与主键列直接相关,而不是与其他非主键列相关。这样可以消除传递依赖,进一步减少数据冗余,保证数据的完整性和一致性。

三范式是关系数据库设计的基本原则,但在某些情况下可能会因为性能等方面的考虑而放宽范式要求,例如允许部分冗余数据或者非关键数据存在于表中。

57.简述常用的索引有哪些种类?

  1. 全文索引(Full-Text Index): 用于全文搜索,可以在文本列上进行高效的全文搜索操作,而不是简单的匹配。

  2. 空间索引(Spatial Index): 用于在地理信息系统(GIS)中存储空间数据,并支持空间数据的查询操作,如点、线、多边形等。

  3. 哈希索引(Hash Index): 使用哈希算法将索引键转换为哈希码,快速定位数据。但是哈希索引只支持等值查询,并且不支持范围查询。

  4. 位图索引(Bitmap Index): 将索引键映射为位图,每个位表示一个索引键值的存在或缺失。适用于低基数列(列中唯一值较少)的索引。

  5. 覆盖索引(Covering Index): 通过包含了查询所需的所有列的索引来避免回表操作,从而提高查询性能。

  6. 前缀索引(Prefix Index): 只索引列值的前缀部分,而不是整个列值。适用于较长的列值,可以节省索引空间。

58.mysql支持的复制类型?

  1. 基于语句的复制(Statement-Based Replication): 主服务器上执行的SQL语句会在从服务器上执行相同的语句。这是MySQL的默认复制类型,通常效率较高。

  2. 基于行的复制(Row-Based Replication): 只将更改的数据行复制到从服务器,而不是复制SQL语句。从MySQL 5.0开始支持,适用于某些无法精确复制的情况。

  3. 混合类型的复制(Mixed-Based Replication): 默认采用基于语句的复制,但一旦发现基于语句的复制无法精确复制数据时,会自动切换到基于行的复制。这种方式结合了基于语句和基于行的优点。

59.[SELECT *] 和[SELECT 全部字段]的2种写法有何优缺点?

优点:

  1. 简洁性: [SELECT *] 简洁明了,无需列出具体的字段名,适用于快速查看表的内容。

  2. 便捷性: 对于小型表或者只需要查看所有字段的情况,使用 [SELECT *] 更加方便,不需要逐个列出所有字段。

  3. 适应性: 当表结构发生变化时,[SELECT *] 不需要修改,仍然可以查询所有字段的数据。

缺点:

  1. 性能问题: [SELECT *] 需要解析数据字典,可能会造成性能上的一定损耗,尤其是对于大型表。

  2. 维护困难: 当表的字段顺序发生变化或者需要更改字段名时,使用 [SELECT *] 可能会导致结果的顺序不一致,增加维护的难度。

  3. 可读性差: [SELECT *] 不明确显示所查询的字段,可读性较差,不利于他人理解查询的意图。

60.HAVNG 子句 和 WHERE的异同点?

相同点:

  1. 筛选数据: 无论是WHERE子句还是HAVING子句,都用于筛选出满足条件的数据行。

不同点:

  1. 作用范围: WHERE子句在数据行级别进行筛选,即在数据源中进行条件过滤,而HAVING子句在分组后的结果集上进行筛选。

  2. 使用位置: WHERE子句出现在SELECT语句中的FROM子句之后,而HAVING子句出现在GROUP BY子句之后。

  3. 使用条件: WHERE子句可以使用表中的列名或者表达式作为条件,而HAVING子句一般用于过滤聚合函数的结果,因此可以使用聚合函数或者SELECT列表中的别名作为条件。

  4. 聚合函数: WHERE子句不允许使用聚合函数,而HAVING子句专门用于对聚合函数进行条件过滤。

  5. 索引使用: WHERE子句可以利用索引进行优化,而HAVING子句一般无法利用索引,因为它是在分组后的结果集上进行过滤的,而不是在原始数据表上进行的。

61.MySQL当记录不存在时insert,当记录存在时update,语句怎么写?

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
  • INSERT INTO table (a,b,c) VALUES (1,2,3): 这部分是插入语句,将数据插入到表中。
  • ON DUPLICATE KEY UPDATE c=c+1: 这部分是关键,它告诉 MySQL,如果插入导致键冲突(比如唯一键或主键冲突),则执行更新操作。在这里,如果 (a,b) 组成的键已经存在,就会执行 c=c+1 的更新操作,即将 c 字段的值加1。

62.MySQL的insert和update的select语句语法

INSERT INTO SELECT 语法:

INSERT INTO student (stuid, stuname, deptid) 
SELECT 10, 'xzm', 3 
FROM student 
WHERE stuid > 8;

这个语句的作用是从 student 表中选择 stuid > 8 的记录,然后将选定的记录插入到 student 表中,新插入的记录的 stuid 字段值为 10,stuname 字段值为 ‘xzm’,deptid 字段值为 3。

UPDATE JOIN 语法:

UPDATE student a 
INNER JOIN student b ON b.stuID = 10 
SET a.stuname = CONCAT(b.stuname, b.stuID) 
WHERE a.stuID = 10;

这个语句的作用是将 student 表中 stuID 为 10 的记录的 stuname 字段的值更新为原值加上该记录的 stuID 的值。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到