无答案版
基础任务
-
mysql中char和varchar的区别,varchar(100)中的一百的含义,能存放多少汉字?
-
Mysql:左查询的特点,左右查询的区别?
-
mysql的约束有哪些?分别有什么作用?
-
where和having的区别?
-
mysql中分页如何实现?
-
数据库中, drop、delete与truncate的区别?
-
数据库索引是什么,有什么作用?
-
如何判断一个sql有没有做索引?
-
数据库事务是什么,事务的四大特征有哪些?
-
事务并发操作会产生什么问题,事务的隔离级别是什么,mysql默认的隔离级别是?
-
请阐述数据库设计的范式是什么,有哪些范式,我们日常开发中要,这些范式是否都要遵循?
-
表和表存在哪些关联关系,针对这些关系,我们如何设计表?
-
Mysql的存储过程是什么,有什么作用?
-
写sql语句,查询班里170以上男生的人数大于5的班级及其人数
-
场景题:游戏背包的里面的物品,设计数据库表格
进阶任务
-
说一下InnDB 的索引结构?
-
索引的数据结构是什么?
-
什么时候索引失效,为什么失效?
-
什么是索引回表,如何避免?
-
数据库优化方式?
有答案版
基础任务
-
mysql中char和varchar的区别,varchar(100)中的一百的含义,能存放多少汉字?
char 和 varchar 是 MySQL 中用于存储字符数据的两种数据类型。它们的区别在于: char 用于存储固定长度的字符,如果存储的字符长度小于定义的长度,则会在右侧填充空格使其达到定义的长度。 varchar 用于存储可变长度的字符,它只会占用实际存储的字符长度加上一定的额外长度用于记录实际长度。因此,对于存储空间的利用上,varchar 通常比 char 更高效。 在 varchar(100) 中的 "100" 表示该字段最多能存放 100 个字符,但需要注意的是,MySQL 中的字符长度是以字节为单位的,不同字符的字节长度可能不同。对于汉字,通常一个汉字占用 3 个字节,因此 varchar(100) 可以存放大约 33 个汉字。
-
Mysql:左查询的特点,左右查询的区别?
MySQL 中的左查询指的是使用 LEFT JOIN 进行查询,它的特点是以左表为主进行匹配,即使右表中没有匹配的数据,左表的数据也会全部显示出来。左右查询的区别在于: 左查询(LEFT JOIN):左查询会返回左表中的所有记录,无论是否在右表中有匹配的记录。 右查询(RIGHT JOIN):右查询则是以右表为主,返回右表的所有记录,无论是否在左表中有匹配的记录。
-
mysql的约束有哪些?分别有什么作用?
主键约束(PRIMARY KEY):用于唯一标识表中的每一行数据。 外键约束(FOREIGN KEY):用于建立表与表之间的关联关系。 唯一约束(UNIQUE):用于保证字段中的值唯一。 非空约束(NOT NULL):用于保证字段中的值不为空。
-
where和having的区别?
WHERE 子句用于在检索数据时指定条件,它作用于行级数据。 而 HAVING 子句用于在对检索出的数据进行分组后进行过滤,它作用于分组后的结果集。
-
mysql中分页如何实现?
在 MySQL 中实现分页可以使用 LIMIT 子句 需要起始索引和每页条数进行展示
-
数据库中, drop、delete与truncate的区别?
DROP 用于删除表的结构及其数据,是一种 DDL(数据定义语言)操作。 DELETE 用于删除表中的数据,但保留表的结构。 TRUNCATE 用于删除表中的所有数据,但保留表的结构。相比于 DELETE,TRUNCATE 的效率更高,因为它是一次性删除所有数据而不是逐行删除。
-
数据库索引是什么,有什么作用?
数据库索引是一种数据结构,用于提高数据库查询性能的技术。索引可以类比于书籍的目录,它提供了一种快速访问数据的方法,允许数据库系统快速地定位到符合查询条件的数据行,而不需要进行全表扫描。 数据库索引的作用包括: 加速数据检索:通过索引,数据库系统可以快速定位到符合查询条件的数据行,从而加速数据检索操作。相比于全表扫描,使用索引可以大大降低查询的时间复杂度,尤其是在大型数据集合中查询时,效果更加显著。 优化排序和分组:当查询需要排序或者分组时,索引可以帮助数据库系统快速地获取需要排序或分组的数据,从而提高排序和分组操作的效率。 加速连接操作:在连接多个表时,如果连接字段上存在索引,可以大大减少连接操作的时间,提高查询效率。 提高数据完整性:数据库索引可以通过唯一索引或主键索引来确保数据的完整性和一致性。唯一索引确保列中的值是唯一的,而主键索引不仅确保唯一性,还将该列设置为表的主键,从而保证了表中每行数据的唯一性。 支持快速定位和范围查询:对于范围查询,如大于、小于或者介于某个值之间的查询条件,索引可以帮助数据库系统快速定位到符合条件的数据,而不需要遍历整个表格。 综上所述,数据库索引是提高数据库性能的重要手段,通过合理创建和使用索引,可以加速数据检索、优化查询操作,并提高数据库系统的响应速度和整体性能。
-
如何判断一个sql有没有做索引?
执行EXPLAIN命令:在MySQL中,可以使用EXPLAIN命令来分析查询的执行计划。执行EXPLAIN命令后,MySQL会返回一个描述查询执行计划的结果集,包括了MySQL在执行查询时使用的索引信息。如果查询使用了索引,则在结果集中会显示出相应的索引名称;如果没有使用索引,则会在结果集中显示为"NULL"。 EXPLAIN SELECT * FROM table_name WHERE condition;
-
数据库事务是什么,事务的四大特征有哪些?
数据库事务是一组数据库操作,要么全部成功执行,要么全部失败回滚的操作单元。事务的四大特征是:原子性、一致性、隔离性和持久性。
-
事务并发操作会产生什么问题,事务的隔离级别是什么,mysql默认的隔离级别是?
事务并发操作可能会产生以下问题:脏读、不可重复读、幻读。 事务的隔离级别包括:读未提交、读已提交、可重复读和串行化。 MySQL 默认的隔离级别是可重复读。
-
请阐述数据库设计的范式是什么,有哪些范式,我们日常开发中要,这些范式是否都要遵循?
数据库设计的范式是用来规范化数据库表结构的一组设计原则,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。 在日常开发中,通常应该尽量遵循这些范式,以确保数据库的结构合理化、数据一致性和减少数据冗余。
-
表和表存在哪些关联关系,针对这些关系,我们如何设计表?
表与表之间存在的关联关系包括一对一、一对多和多对多关系。设计表时,应根据实际业务需求合理地选择合适的关系,并使用外键等手段进行关联。
-
Mysql的存储过程是什么,有什么作用?
MySQL 的存储过程是一组预编译的 SQL 语句,它们被命名并存储在数据库中,以便在需要时调用执行。存储过程可以提高数据库性能、简化复杂操作以及实现数据库逻辑的封装等作用。
-
写sql语句,查询班里170以上男生的人数大于5的班级及其人数
SELECT class_id, COUNT(student_id) AS num_students FROM students WHERE gender = 'male' AND height > 170 GROUP BY class_id HAVING COUNT(student_id) > 5;
-
场景题:游戏背包的里面的物品,设计数据库表格
-- 创建用户表 CREATE TABLE Users ( user_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255) NOT NULL, password_hash VARCHAR(255) NOT NULL, email VARCHAR(255), created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 创建背包表 CREATE TABLE Inventory ( inventory_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, FOREIGN KEY (user_id) REFERENCES Users(user_id) ); -- 创建物品表 CREATE TABLE Items ( item_id INT PRIMARY KEY AUTO_INCREMENT, item_name VARCHAR(255) NOT NULL, item_type VARCHAR(255) NOT NULL, item_description TEXT, weight DECIMAL(10,2), value INT ); -- 创建用户背包物品关联表 CREATE TABLE User_Inventory_Items ( user_inventory_id INT PRIMARY KEY AUTO_INCREMENT, inventory_id INT, item_id INT, quantity INT, FOREIGN KEY (inventory_id) REFERENCES Inventory(inventory_id), FOREIGN KEY (item_id) REFERENCES Items(item_id) );
以下是每个表的中文名及其列的设计,包括数据类型:
表: 用户
列名 数据类型 描述 user_id 整数(INT) 用户的唯一标识符 用户名 字符串(VARCHAR) 用户名 密码哈希值 字符串(VARCHAR) 密码哈希值(用于验证用户登录) 电子邮件地址 字符串(VARCHAR) 电子邮件地址(可选) 创建时间 日期时间(DATETIME) 用户创建时间 表: 背包
列名 数据类型 描述 inventory_id 整数(INT) 背包的唯一标识符 user_id 整数(INT) 用户的唯一标识符 表: 物品
列名 数据类型 描述 item_id 整数(INT) 物品的唯一标识符 物品名称 字符串(VARCHAR) 物品的名称 物品类型 字符串(VARCHAR) 物品的类型(武器、防具、药品等) 物品描述 文本(TEXT) 物品的描述 重量 十进制数(DECIMAL) 物品的重量(可选,如果游戏有重量限制的话) 价值 整数(INT) 物品的价值(可选,用于买卖交易) 表: 用户_背包_物品
列名 数据类型 描述 user_inventory_id 整数(INT) 用户背包与物品的关联唯一标识符 item_id 整数(INT) 物品的唯一标识符 数量 整数(INT) 物品的数量
进阶任务
-
说一下InnDB 的索引结构?
InnoDB 使用 B+ 树作为其索引结构。 B+ 树是一种平衡树,它的特点是每个节点包含多个键值,这些键值分别指向下一级节点。 叶子节点是按照键值大小顺序连接的双向链表,这种结构使得在范围查询和顺序遍历时效率更高。
-
索引的数据结构是什么?
索引是一种数据结构,用于提高数据库中数据的检索速度。它类似于书籍的目录,可以帮助数据库系统快速定位到特定数据的位置,而不需要扫描整个数据库。索引可以根据不同的数据结构来实现,最常见的索引数据结构包括: B-树(B-tree):B-树是一种多路平衡查找树,常用于数据库系统中实现索引。B-树具有良好的平衡性,能够在动态数据集合上高效地进行插入、删除和查找操作。在B-树中,每个节点可以包含多个关键字,并且每个节点的子节点数目是固定的,这使得B-树的高度相对较低,从而提高了检索效率。 B+树(B+ tree):B+树是B-树的一种变体,也是一种多路平衡查找树。与B-树不同的是,B+树只在叶子节点存储数据,而非叶子节点只存储索引。这种结构使得B+树更适合于范围查询操作,同时也提高了磁盘I/O性能。 哈希索引(Hash Index):哈希索引使用哈希函数将关键字映射到一个固定长度的哈希值,然后将哈希值与索引表中的桶(Bucket)关联起来。哈希索引适用于等值查询,能够实现O(1)时间复杂度的检索操作。然而,哈希索引并不支持范围查询,而且在某些情况下可能会发生哈希冲突,需要解决冲突问题。 这些索引数据结构都有各自的优缺点,选择适合特定应用场景的索引结构可以提高数据库的性能和效率。
-
什么时候索引失效,为什么失效?
在查询条件中使用了函数或者类型转换,例如 WHERE YEAR(date_column) = 2022。 对字段进行了运算,例如 WHERE column + 10 = 20。 使用了不满足索引前缀的查询,例如对于索引 (last_name, first_name),如果查询条件只包含 last_name 则索引可能会失效。 对于 OR 条件,如果其中一个条件无法使用索引,则整个查询可能会失效。 对于 LIKE 查询,如果模式以 % 开头,则索引可能会失效。
-
什么是索引回表,如何避免?
索引回表是指在使用索引进行查询时,如果索引无法满足查询的所有条件,就需要回表去主键索引中再次查找数据,这会增加额外的IO开销。 避免索引回表的方式包括: 覆盖索引:通过创建包含所有需要查询的字段的索引,避免了回表操作。 联合索引:合理设计索引,使得查询可以充分利用已有的索引而不需要回表。 使用 EXPLAIN 分析查询计划,查看是否有使用到索引。 优化查询语句,尽量避免不必要的函数、运算等操作,以充分利用索引。
-
数据库优化方式?
合理设计数据库结构:遵循范式规范,减少数据冗余。
建立合适的索引:根据实际查询需求创建合适的索引,提高查询效率。
优化 SQL 查询语句:避免全表扫描、不必要的计算等,通过合理的 SQL 编写提高查询效率。
分区分表:将大表分割成多个小表,减少单个表的数据量,提高查询效率。
使用缓存:使用缓存技术缓存频繁查询的结果,减少对数据库的访问压力。
定期清理无用数据:清理过期数据和无效数据,减少数据存储空间,提高查询效率。