跳至主要內容

数据库面试习题(中)

CodeShouhu大约 14 分钟使用指南Markdown

数据库面试习题(中)

1,将一张表的部分数据更新到另一张表,该如何操作呢?

将一张表的部分数据更新到另一张表,可以使用SQL的UPDATE语句和INNER JOIN子句来实现。具体步骤如下:

  1. 假设有两张表,表A和表B,需要将表A的部分数据更新到表B中。首先,确保两张表中有共同的字段或主键,以便建立关联。
  2. 使用INNER JOIN子句将两张表连接起来。例如,如果两张表都有一个名为"ID"的主键字段,可以使用以下语句进行连接:
UPDATE table_a
INNER JOIN table_b ON table_a.ID = table_b.ID

这将根据"ID"字段将表A和表B关联起来。
3. 在UPDATE语句中指定需要更新的字段和更新后的值。例如,如果需要将表A中的"Name"字段更新到表B中,可以使用以下语句:

UPDATE table_a
INNER JOIN table_b ON table_a.ID = table_b.ID
SET table_b.Name = table_a.Name;

这将把表A中"Name"字段的值更新到表B中相应的记录。
4. 如果只想更新表B中特定的记录,可以在UPDATE语句中添加WHERE子句进行筛选。例如,如果只想更新表B中"Age"字段大于30的记录,可以使用以下语句:

UPDATE table_a
INNER JOIN table_b ON table_a.ID = table_b.ID
SET table_b.Name = table_a.Name
WHERE table_b.Age > 30;

这将只更新表B中"Age"字段大于30的记录的"Name"字段。

请注意,在执行UPDATE语句之前,最好先备份数据或进行事务处理,以防止意外修改或丢失数据。

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

DropDeleteTruncate 都是用于处理数据库中表的数据操作,但它们之间有一些共同点和区别。

共同点:

  • DropDeleteTruncate 都可以用于删除表中的数据。

区别:

  • 操作性质Drop 是数据库定义语言(DDL)操作,而 DeleteTruncate 是数据库操作语言(DML)操作。
  • 可逆性Delete 操作可以通过提交(commit)或回滚(rollback)来执行删除或撤销删除,而 TruncateDrop 操作一旦执行,就无法回滚。
  • 触发器Delete 操作会触发表上的所有 delete 触发器,而 TruncateDrop 操作不会触发触发器。
  • 空间释放Drop 命令将删除表及其所有相关数据、索引和权限,并释放表所占用的空间。Truncate 命令将删除表中的所有数据,并释放表所占用的空间,但保留表结构、索引和权限。Delete 命令仅删除指定条件下的数据行,不会释放表所占用的空间。
  • 性能:在速度上,一般来说,Drop > Truncate > Delete,但这也取决于具体情况。

综上所述,DropDeleteTruncate 都可以用于删除表中的数据,但在 操作性质可逆性触发器空间释放性能 等方面有所不同。在选择使用哪种操作时,需要根据具体需求和情况来进行决定。

速记

Drop Delete Truncate,删表数据各不同。
三者相同能删数,差异之处要记清。
Drop 属于 DDL,Delete DML 同 Truncate。
Delete 可逆能回滚,Truncate Drop 没法返。
Delete 触发触发器,二者无触要注意。
Drop 全删空间放,Truncate 留表也释放。
Delete 仅删条件行,空间保留不解放。
速度一般有排序,Drop 最快别怀疑,
Truncate 居中 Delete 尾,具体情况看实际。

3,WHERE和HAVING有什么区别?

WHEREHAVING 都是 SQL 语句中的子句,用于筛选数据,但它们之间有以下区别:

  1. 使用场景WHERE 子句用于 SELECTUPDATEDELETEINSERT...INTO 语句中,而 HAVING 子句只能用于 SELECT 语句中。
  2. 执行顺序WHERE 子句的过滤条件是在执行语句进行分组之前应用的,而 HAVING 子句的过滤条件是在分组之后应用的。也就是说,如果 WHEREHAVING 同时存在于一个查询语句中,那么 WHERE 会先执行,HAVING 后执行。
  3. 子句功能WHERE 子句用于过滤表中的记录,基于表中已有的字段进行条件筛选。HAVING 子句则用于过滤由 GROUP BY 子句生成的分组记录,基于这些分组记录的聚合结果进行条件筛选。因此,HAVING 子句可以使用聚合函数(如 SUMCOUNTAVGMAXMIN),而 WHERE 子句则不能。

速记

WHERE HAVING 筛选棒,二者区别要细想。
使用场景不一样,WHERE 多用范围广。
增删改查都能上,HAVING 仅在查询亮。
执行顺序有前后,WHERE 先把记录篩。
分组之后 HAVING 到,条件过滤才生效。
子句功能各所长,WHERE 字段来筛详。
HAVING 聚合把关强,函数可用更闪亮。

4,CHAR 和 VARCHAR 的区别?

SQL 中,CHARVARCHAR 都是用于存储 字符数据数据类型,但它们之间存在一些 区别

  1. 长度CHAR固定长度 的,而 VARCHAR可变长度 的。CHAR 定义了一个 固定字符数,无论实际存储的 字符数 是多少,都会占用 指定长度空间。而 VARCHAR 会根据实际存储的 字符数 动态分配空间最大长度 可以指定,但实际占用 空间 取决于存储的 数据
  2. 性能:由于 CHAR固定长度 的,因此在某些情况下,读取 CHAR 类型的 可能会比读取 VARCHAR 类型的 更快。这是因为 数据库 可以更快地定位到 CHAR 类型的 ,而不需要计算实际存储的 字符数
  3. 空格处理CHAR 会自动去除 字段值 右侧的 空格,而 VARCHAR 则不会。如果需要在 字段值 中保留 空格,应该使用 VARCHAR
  4. 存储需求:由于 CHAR固定长度 的,所以在存储 CHAR 类型的 时,会占用更多的 空间,尤其是当实际存储的 字符数 少于 指定长度 时。而 VARCHAR 则会根据实际存储的 字符数 动态分配空间,因此可以更有效地利用 存储空间

综上所述,在选择使用 CHARVARCHAR 时,需要根据 具体需求情况 来进行决定。如果需要存储 固定长度字符数据,可以使用 CHAR;如果需要存储 可变长度字符数据,可以使用 VARCHAR

速记

SQL 里有俩类型,CHAR VARCHAR 要分清。
CHAR 定长占空间,不论存少或存全。
VARCHAR 它可变,按需分配更灵便。
读取性能有差异,CHAR 有时更给力。
空格处理不一样,CHAR 右空会去掉。
VARCHAR 能留空格妙,存储需求也有招。
CHAR 定长占得多,VARCHAR 灵活省心窝。

5,MyISAM Static 是用来做什么的

MyISAM StaticMySQL 中的一种 存储引擎类型,它的特点是 固定大小固定结构数据文件。这意味着必须在 创建表 时指定每个 的大小,并为每个 分配一个 固定大小 的空间来保存 数据。因此,MyISAM Static 存储引擎 非常适合于具有 固定数据模式,且不需要 高度动态更改操作应用程序MyISAM Static 通常用于 只读很少修改大型静态表

速记

MySQL 里引擎妙,MyISAM Static 来报道。
固定大小结构牢,建表列宽要定好。
每列空间早分配,数据存储有依靠。
固定模式它偏好,动态更改不需要。
只读少改大静表,选它没错效果好。

6,MyISAM Static 和 MyISAM Dynamic 有什么区别?

MyISAM StaticMyISAM Dynamic 的区别主要体现在 数据文件特性适用场景恢复难易程度 上。

  1. 数据文件特性MyISAM Static 具有 固定大小固定结构数据文件,每个 的大小在 创建表 时需要指定,并且每个 分配一个 固定大小 的空间来保存 数据。相比之下,MyISAM Dynamic数据文件动态变化大小结构 的,可以将 数据 存储为 变长数据类型,不必为每个 分配 固定 的空间。
  2. 适用场景MyISAM Static 适用于具有 固定数据模式,且不需要 高度动态更改操作应用程序,特别是 只读很少修改大型静态表。而 MyISAM Dynamic 则更适合于需要 频繁插入更新删除数据 的场景,因为它支持这些操作。
  3. 恢复难易程度:在 受损 情况下,MyISAM Static 更容易 恢复,因为它使用 固定大小数据块 来存储 数据

总的来说,MyISAM StaticMyISAM Dynamic 都有各自的 优点适用场景,需要根据 具体需求数据特性 来选择。

速记

MyISAM 俩引擎,Static Dynamic 要辨清。
Static 文件定大小,建表列宽得明了。
每列空间早分配,数据存储稳又牢。
Dynamic 就不一样,大小结构可变样。
变长类型能存储,列分空间不勉强。
适用场景各不同,Static 静表它称雄。
固定模式少改动,只读少改乐无穷。
Dynamic 则更灵活,增删改查都能做。
数据受损要恢复,Static 容易有把握。
固定块儿来存储,恢复起来不犯怵。

7,LIKE 声明中的%和_是什么意思?

%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。

8,BLOB 和 TEXT 有什么区别?

BLOB 是一个 二进制对象,可以容纳 可变数量数据TEXT 是一个 不区分大小写BLOB

BLOBTEXT 类型之间的 唯一区别 在于对 BLOB 值 进行 排序比较区分大小写,对 TEXT 值 不区分大小写

9,MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?

MySQL_fetch_array() – 将 结果行 作为 关联数组 或来自 数据库常规数组 返回。

MySQL_fetch_object()– 从 数据库 返回 结果行 作为 对象

10,MyISAM 表格将在哪里存储,并且还提供其存储格式?

MyISAM 表格在 MySQL 数据库中的 存储位置数据存储格式 如下:

  1. 存储位置MyISAM 表格存储在 MySQL 数据目录下的三个文件中,它们分别是 表定义文件.frm 文件)、数据文件.MYD 文件)和 索引文件.MYI 文件)。
  2. 存储格式
  • .frm 文件:存储 结构定义信息,包括 列名数据类型索引信息 等。
  • .MYD 文件:存储 实际数据,按照 记录插入顺序 存储。
  • .MYI 文件:存储 索引信息,用于加快 数据查询速度

需要注意的是,在 MySQL 8.0 版本 之后,.frm 文件的 存储方式 发生了变化,新增了一个 .sdi 文件来替代部分 .frm 文件的功能。但是,.MYD.MYI 文件的 存储方式 仍然保持不变。

速记

MyISAM 表存三处,数据目录有归属。
表定义存 .frm 处,结构信息它记录。
.MYD 存真实数,插入顺序来排布。
.MYI 把索引住,查询加速不含糊。

11,MySQL 如何优化 DISTINCT?

DISTINCT 用于返回 唯一不同的值,但在 大数据集 上使用时可能会导致 查询性能下降。以下是一些优化 DISTINCT 的方法:

  1. 建立索引:为需要使用 DISTINCT 建立 索引,这样可以加快 查询速度 并减少 排序操作开销
  2. 减少查询范围:尽可能地限制 查询范围,可以减少需要处理的 数据量。例如,可以使用 WHERE 子句 来限制 查询范围
  3. 使用 GROUP BY 代替 DISTINCTGROUP BY 也可以返回 唯一不同的值,而且可以利用 索引 进行优化。如果需要对 多列 进行 去重,可以使用 GROUP BY多个列的组合
  4. 使用子查询:将 DISTINCT 查询 作为 子查询,然后在 外部查询 中进行其他操作。这样可以减少需要处理的 数据量,并且可以利用 索引 进行优化。
  5. 缓存结果:如果 DISTINCT 查询结果 不经常变化,可以将 结果 缓存起来,避免 重复查询开销

需要根据 具体情况 选择最适合的 优化方法,可以结合 EXPLAIN 分析 查询计划,找出 性能瓶颈 并进行针对性的优化。

速记

DISTINCT 去重有招,大数据用性能糟。
优化方法要记牢,五条策略很有效。
建立索引速度高,排序开销能减少。
查询范围要缩小,WHERE 子句来帮忙。
GROUP BY 替代妙,索引优化不可少。
子查询里把活搞,数据处理量减少。
结果缓存别忘掉,重复查询开销抛。

12,如何显示前 50 行?

在MySQL中,可以使用LIMIT子句来限制查询结果的数量。要显示前50行,可以在查询语句的末尾添加LIMIT 50。例如,以下是一个查询语句,它将返回表中前50行的数据:

SELECT * FROM table_name
LIMIT 50;

你可以将table_name替换为你要查询的表的实际名称。执行上述查询后,将返回表中前50行的数据。

13,可以使用多少列创建索引?

MySQL 中,创建 索引列数限制 取决于 存储引擎 的类型。对于常见的 存储引擎 InnoDBMyISAM,以下是它们的 列数限制

  1. InnoDB 存储引擎InnoDB 支持最多 16 个 组合索引。此外,InnoDB 还支持 全文索引空间索引
  2. MyISAM 存储引擎MyISAM 支持最多 16 个 组合索引。但是,如果 中使用了很多 ,创建 索引 可能会导致 性能下降

需要注意的是,过多的 索引列 可能导致 索引 变得过大且复杂,从而影响 查询性能。因此,在设计 数据库 时,应该仔细考虑哪些 需要创建 索引,并尽量将 索引列数 控制在合理的范围内。

速记

MySQL 里建索引,引擎不同有差异。
InnoDB 它很行,组合十六可搞定。
全文空间也能行,索引功能挺丰富。
MyISAM 也不差,十六列数顶呱呱。
列多索引性能差,设计时候要慎抓。
索引列数别贪大,合理范围才最佳。

14,NOW()和 CURRENT_DATE()有什么区别?

NOW()CURRENT_DATE() 都是 MySQL 中的 日期和时间函数,它们用于 获取 当前的 日期时间信息,但它们的 返回值 有所不同。

  1. NOW()函数 返回当前的 日期时间,包括 小时分钟微秒。它返回一个表示当前 时间时间戳
  2. CURRENT_DATE()函数 只返回当前的 日期,包括 ,但不包括 微秒。它返回一个表示当前 日期时间戳

速记

MySQL 里两函数,获取时间有区分。
NOW()全面本领强,年月时分秒微详。
时间戳里全呈现,当前时刻都包含。
CURRENT_DATE()稍简单,仅把日期来展现。
年月日期它涵盖,时分秒微不沾边。
两函数,用途辨,按需选择才灵验。

15,什么是通用 SQL 函数?

1、CONCAT(A, B)连接 两个 字符串值 以创建单个 字符串输出。通常用于将两个或多个 字段 合并为一个 字段

2、FORMAT(X, D) - 格式化 数字 XD 有效数字

3、CURRDATE(), CURRTIME() - 返回 当前 日期时间

4、NOW() – 将当前 日期时间 作为一个 返回。

5、MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从 日期值提取 给定 数据

6、HOUR(),MINUTE(),SECOND() – 从 时间值提取 给定 数据

7、DATEDIFF(A,B)确定 两个 日期 之间的 差异,通常用于 计算年龄

8、SUBTIMES(A,B)确定 两次之间的 差异

9、FROMDAYS(INT) – 将 整数天数 转换为 日期值

速记

MySQL 函数真不少,听我来把诀窍表。
CONCAT 本领高,字符连接没烦恼。
FORMAT 很奇妙,数字格式化有一套。
CURRDATE 和 CURRTIME,当前日期时间现。
NOW 更全面,日期时间都呈现。
MONTH DAY 等一堆,日期数据能提取。
HOUR MINUTE 别嫌累,时间数据也能追。
DATEDIFF 算日期差,计算年龄全靠它。
SUBTIMES 算时差,时间差异就用它。
FROMDAYS 也不差,天数转日期顶呱呱。

16,列的字符串类型可以是什么?

字符串类型是:1,SET 2、BLOB 3、ENUM 4、CHAR 5、TEXT

17,SQL 语言包括哪几部分?每部分都有哪些操作关键字?

SQL 语言 包括 数据定义(DDL)、数据操纵(DML)、数据控制(DCL) 和 数据查询(DQL)

四个部分。

数据定义Create Table, Alter Table, Drop Table, Create/Drop Index

数据操纵Select, insert, update, delete,

数据控制grant, revoke

数据查询select