文章目录
- 1. 插入记录后删除再重启数据库的情况下,新记录的 ID
- 2. MySQL 的技术特点
- 3. Heap 表
- 4. MySQL 服务器默认端口
- 5. MySQL 相对于 Oracle 的优势
- 6. 区分 FLOAT 和 DOUBLE
- 7. 区分 CHAR_LENGTH 和 LENGTH
- 8. InnoDB 支持的四种事务隔离级别及区别
- 9. ENUM 的用法
- 10. 定义 REGEXP
- 11. CHAR 和 VARCHAR 的区别
- 12. 字符串类型的列可以是
- 13. 获取当前 MySQL 版本
- 14. MySQL 中使用的存储引擎
- 15. MySQL 驱动程序
- 16. TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上的作用
- 17. 主键和候选键的区别
- 18. 使用 Unix shell 登录 MySQL
- 19. myisamchk 的作用
- 20. MySQL 数据库服务器性能分析的方法命令
- 21. 控制 HEAP 表的最大尺寸
- 22. MyISAM Static 和 MyISAM Dynamic 的区别
- 23. federated 表
- 24. TIMESTAMP 类型列的作用
- 25. AUTO_INCREMENT 列达到最大值时的情况
- 26. 找出最后一次插入时分配的自动增量值
- 27. 查看为表定义的所有索引
- 28. LIKE 声明中的 `%` 和 `_`
- 29. 在 Unix 时间戳和 MySQL 时间戳之间进行转换
- 30. 列比较运算符
- 31. 获取受查询影响的行数
- 32. MySQL 查询是否区分大小写
- 33. LIKE 和 REGEXP 操作的区别
- 34. BLOB 和 TEXT 的区别
- 35. mysql_fetch_array 和 mysql_fetch_object 的区别
- 36. 在 MySQL 中运行批处理模式
- 37. MyISAM 表的存储和存储格式
- 38. MySQL 中的不同类型的表
- 39. ISAM 是什么
- 40. InnoDB 是什么
- 41. 优化 DISTINCT
- 42. 输入十六进制数字
- 43. 显示前 50 行
- 44. 可以使用多少列创建索引
- 45. NOW() 和 CURRENT_DATE() 的区别
- 46. 使用 CREATE 语句创建哪些对象
- 47. MySQL 表中允许多少个 TRIGGERS
- 48. 非标准字符串类型是什么
- 49. 通用 SQL 函数
- 50. 解释访问控制列表
- 51. MySQL 是否支持事务
- 52. 记录货币使用的字段类型
- 53. MySQL 数据表容易损坏的情况
- 54. 关于权限的表
- 55. MySQL 中的锁类型
- 56.数据库三范式是什么?
- 57.简述常用的索引有哪些种类?
- 58.mysql支持的复制类型?
- 59.[SELECT *] 和[SELECT 全部字段]的2种写法有何优缺点?
- 60.HAVNG 子句 和 WHERE的异同点?
- 61.MySQL当记录不存在时insert,当记录存在时update,语句怎么写?
- 62.MySQL的insert和update的select语句语法
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 支持的四种事务隔离级别及区别
- READ UNCOMMITTED(读取未提交数据): 允许一个事务读取另一个事务尚未提交的数据。
- READ COMMITTED(读取已提交数据): 一个事务只能读取已提交的数据,避免了脏读,但可能会出现不可重复读。
- REPEATABLE READ(可重复读): 保证在事务执行期间查询结果是一致的,即使有其他事务对数据进行了修改。
- 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 语句的列比较中,可以使用 =
、<>
、<=
、<
、>=
、>
、<<
、>>
、<=>
、AND
、OR
或 LIKE
运算符。
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 种类型的表:
- MyISAM
- Heap
- Merge
- InnoDB
- 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.数据库三范式是什么?
第一范式(1NF): 要求数据库中的每个列都是原子性的,即不可再分。每一列都包含唯一的数据项,而且没有重复的列。
第二范式(2NF): 在第一范式的基础上,要求每张表都有一个主键,并且非主键列完全依赖于主键,而不是依赖于主键的一部分。这样可以消除部分依赖关系,保证数据的唯一性。
第三范式(3NF): 在第二范式的基础上,要求每个非主键列都与主键列直接相关,而不是与其他非主键列相关。这样可以消除传递依赖,进一步减少数据冗余,保证数据的完整性和一致性。
三范式是关系数据库设计的基本原则,但在某些情况下可能会因为性能等方面的考虑而放宽范式要求,例如允许部分冗余数据或者非关键数据存在于表中。
57.简述常用的索引有哪些种类?
全文索引(Full-Text Index): 用于全文搜索,可以在文本列上进行高效的全文搜索操作,而不是简单的匹配。
空间索引(Spatial Index): 用于在地理信息系统(GIS)中存储空间数据,并支持空间数据的查询操作,如点、线、多边形等。
哈希索引(Hash Index): 使用哈希算法将索引键转换为哈希码,快速定位数据。但是哈希索引只支持等值查询,并且不支持范围查询。
位图索引(Bitmap Index): 将索引键映射为位图,每个位表示一个索引键值的存在或缺失。适用于低基数列(列中唯一值较少)的索引。
覆盖索引(Covering Index): 通过包含了查询所需的所有列的索引来避免回表操作,从而提高查询性能。
前缀索引(Prefix Index): 只索引列值的前缀部分,而不是整个列值。适用于较长的列值,可以节省索引空间。
58.mysql支持的复制类型?
基于语句的复制(Statement-Based Replication): 主服务器上执行的SQL语句会在从服务器上执行相同的语句。这是MySQL的默认复制类型,通常效率较高。
基于行的复制(Row-Based Replication): 只将更改的数据行复制到从服务器,而不是复制SQL语句。从MySQL 5.0开始支持,适用于某些无法精确复制的情况。
混合类型的复制(Mixed-Based Replication): 默认采用基于语句的复制,但一旦发现基于语句的复制无法精确复制数据时,会自动切换到基于行的复制。这种方式结合了基于语句和基于行的优点。
59.[SELECT *] 和[SELECT 全部字段]的2种写法有何优缺点?
优点:
简洁性:
[SELECT *]
简洁明了,无需列出具体的字段名,适用于快速查看表的内容。便捷性: 对于小型表或者只需要查看所有字段的情况,使用
[SELECT *]
更加方便,不需要逐个列出所有字段。适应性: 当表结构发生变化时,
[SELECT *]
不需要修改,仍然可以查询所有字段的数据。
缺点:
性能问题:
[SELECT *]
需要解析数据字典,可能会造成性能上的一定损耗,尤其是对于大型表。维护困难: 当表的字段顺序发生变化或者需要更改字段名时,使用
[SELECT *]
可能会导致结果的顺序不一致,增加维护的难度。可读性差:
[SELECT *]
不明确显示所查询的字段,可读性较差,不利于他人理解查询的意图。
60.HAVNG 子句 和 WHERE的异同点?
相同点:
- 筛选数据: 无论是WHERE子句还是HAVING子句,都用于筛选出满足条件的数据行。
不同点:
作用范围: WHERE子句在数据行级别进行筛选,即在数据源中进行条件过滤,而HAVING子句在分组后的结果集上进行筛选。
使用位置: WHERE子句出现在SELECT语句中的FROM子句之后,而HAVING子句出现在GROUP BY子句之后。
使用条件: WHERE子句可以使用表中的列名或者表达式作为条件,而HAVING子句一般用于过滤聚合函数的结果,因此可以使用聚合函数或者SELECT列表中的别名作为条件。
聚合函数: WHERE子句不允许使用聚合函数,而HAVING子句专门用于对聚合函数进行条件过滤。
索引使用: 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
的值。