数据库面试习题(中)
数据库面试习题(中)
1,将一张表的部分数据更新到另一张表,该如何操作呢?
将一张表的部分数据更新到另一张表,可以使用SQL的UPDATE语句和INNER JOIN子句来实现。具体步骤如下:
- 假设有两张表,表A和表B,需要将表A的部分数据更新到表B中。首先,确保两张表中有共同的字段或主键,以便建立关联。
- 使用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的共同点和区别
Drop、Delete 和 Truncate 都是用于处理数据库中表的数据操作,但它们之间有一些共同点和区别。
共同点:
- Drop、Delete 和 Truncate 都可以用于删除表中的数据。
区别:
- 操作性质:Drop 是数据库定义语言(DDL)操作,而 Delete 和 Truncate 是数据库操作语言(DML)操作。
- 可逆性:Delete 操作可以通过提交(commit)或回滚(rollback)来执行删除或撤销删除,而 Truncate 和 Drop 操作一旦执行,就无法回滚。
- 触发器:Delete 操作会触发表上的所有 delete 触发器,而 Truncate 和 Drop 操作不会触发触发器。
- 空间释放:Drop 命令将删除表及其所有相关数据、索引和权限,并释放表所占用的空间。Truncate 命令将删除表中的所有数据,并释放表所占用的空间,但保留表结构、索引和权限。Delete 命令仅删除指定条件下的数据行,不会释放表所占用的空间。
- 性能:在速度上,一般来说,Drop > Truncate > Delete,但这也取决于具体情况。
综上所述,Drop、Delete 和 Truncate 都可以用于删除表中的数据,但在 操作性质、可逆性、触发器、空间释放 和 性能 等方面有所不同。在选择使用哪种操作时,需要根据具体需求和情况来进行决定。
速记
Drop Delete Truncate,删表数据各不同。
三者相同能删数,差异之处要记清。
Drop 属于 DDL,Delete DML 同 Truncate。
Delete 可逆能回滚,Truncate Drop 没法返。
Delete 触发触发器,二者无触要注意。
Drop 全删空间放,Truncate 留表也释放。
Delete 仅删条件行,空间保留不解放。
速度一般有排序,Drop 最快别怀疑,
Truncate 居中 Delete 尾,具体情况看实际。
3,WHERE和HAVING有什么区别?
WHERE 和 HAVING 都是 SQL 语句中的子句,用于筛选数据,但它们之间有以下区别:
- 使用场景:WHERE 子句用于 SELECT、UPDATE、DELETE 和 INSERT...INTO 语句中,而 HAVING 子句只能用于 SELECT 语句中。
- 执行顺序:WHERE 子句的过滤条件是在执行语句进行分组之前应用的,而 HAVING 子句的过滤条件是在分组之后应用的。也就是说,如果 WHERE 和 HAVING 同时存在于一个查询语句中,那么 WHERE 会先执行,HAVING 后执行。
- 子句功能:WHERE 子句用于过滤表中的记录,基于表中已有的字段进行条件筛选。HAVING 子句则用于过滤由 GROUP BY 子句生成的分组记录,基于这些分组记录的聚合结果进行条件筛选。因此,HAVING 子句可以使用聚合函数(如 SUM、COUNT、AVG、MAX 和 MIN),而 WHERE 子句则不能。
速记
WHERE HAVING 筛选棒,二者区别要细想。
使用场景不一样,WHERE 多用范围广。
增删改查都能上,HAVING 仅在查询亮。
执行顺序有前后,WHERE 先把记录篩。
分组之后 HAVING 到,条件过滤才生效。
子句功能各所长,WHERE 字段来筛详。
HAVING 聚合把关强,函数可用更闪亮。
4,CHAR 和 VARCHAR 的区别?
在 SQL 中,CHAR 和 VARCHAR 都是用于存储 字符数据 的 数据类型,但它们之间存在一些 区别。
- 长度:CHAR 是 固定长度 的,而 VARCHAR 是 可变长度 的。CHAR 定义了一个 固定 的 字符数,无论实际存储的 字符数 是多少,都会占用 指定长度 的 空间。而 VARCHAR 会根据实际存储的 字符数 动态分配空间,最大长度 可以指定,但实际占用 空间 取决于存储的 数据。
- 性能:由于 CHAR 是 固定长度 的,因此在某些情况下,读取 CHAR 类型的 列 可能会比读取 VARCHAR 类型的 列 更快。这是因为 数据库 可以更快地定位到 CHAR 类型的 列,而不需要计算实际存储的 字符数。
- 空格处理:CHAR 会自动去除 字段值 右侧的 空格,而 VARCHAR 则不会。如果需要在 字段值 中保留 空格,应该使用 VARCHAR。
- 存储需求:由于 CHAR 是 固定长度 的,所以在存储 CHAR 类型的 列 时,会占用更多的 空间,尤其是当实际存储的 字符数 少于 指定长度 时。而 VARCHAR 则会根据实际存储的 字符数 动态分配空间,因此可以更有效地利用 存储空间。
综上所述,在选择使用 CHAR 或 VARCHAR 时,需要根据 具体需求 和 情况 来进行决定。如果需要存储 固定长度 的 字符数据,可以使用 CHAR;如果需要存储 可变长度 的 字符数据,可以使用 VARCHAR。
速记
SQL 里有俩类型,CHAR VARCHAR 要分清。
CHAR 定长占空间,不论存少或存全。
VARCHAR 它可变,按需分配更灵便。
读取性能有差异,CHAR 有时更给力。
空格处理不一样,CHAR 右空会去掉。
VARCHAR 能留空格妙,存储需求也有招。
CHAR 定长占得多,VARCHAR 灵活省心窝。
5,MyISAM Static 是用来做什么的
MyISAM Static 是 MySQL 中的一种 存储引擎类型,它的特点是 固定大小 和 固定结构 的 数据文件。这意味着必须在 创建表 时指定每个 列 的大小,并为每个 列 分配一个 固定大小 的空间来保存 数据。因此,MyISAM Static 存储引擎 非常适合于具有 固定数据模式,且不需要 高度动态 的 更改操作 的 应用程序。MyISAM Static 通常用于 只读 或 很少修改 的 大型静态表。
速记
MySQL 里引擎妙,MyISAM Static 来报道。
固定大小结构牢,建表列宽要定好。
每列空间早分配,数据存储有依靠。
固定模式它偏好,动态更改不需要。
只读少改大静表,选它没错效果好。
6,MyISAM Static 和 MyISAM Dynamic 有什么区别?
MyISAM Static 和 MyISAM Dynamic 的区别主要体现在 数据文件 的 特性、适用场景 和 恢复难易程度 上。
- 数据文件特性:MyISAM Static 具有 固定大小 和 固定结构 的 数据文件,每个 列 的大小在 创建表 时需要指定,并且每个 列 分配一个 固定大小 的空间来保存 数据。相比之下,MyISAM Dynamic 的 数据文件 是 动态变化大小 和 结构 的,可以将 数据 存储为 变长数据类型,不必为每个 列 分配 固定 的空间。
- 适用场景:MyISAM Static 适用于具有 固定数据模式,且不需要 高度动态 的 更改操作 的 应用程序,特别是 只读 或 很少修改 的 大型静态表。而 MyISAM Dynamic 则更适合于需要 频繁插入、更新 或 删除数据 的场景,因为它支持这些操作。
- 恢复难易程度:在 受损 情况下,MyISAM Static 更容易 恢复,因为它使用 固定大小 的 数据块 来存储 数据。
总的来说,MyISAM Static 和 MyISAM Dynamic 都有各自的 优点 和 适用场景,需要根据 具体需求 和 数据特性 来选择。
速记
MyISAM 俩引擎,Static Dynamic 要辨清。
Static 文件定大小,建表列宽得明了。
每列空间早分配,数据存储稳又牢。
Dynamic 就不一样,大小结构可变样。
变长类型能存储,列分空间不勉强。
适用场景各不同,Static 静表它称雄。
固定模式少改动,只读少改乐无穷。
Dynamic 则更灵活,增删改查都能做。
数据受损要恢复,Static 容易有把握。
固定块儿来存储,恢复起来不犯怵。
7,LIKE 声明中的%和_是什么意思?
%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。
8,BLOB 和 TEXT 有什么区别?
BLOB 是一个 二进制对象,可以容纳 可变数量 的 数据。TEXT 是一个 不区分大小写 的 BLOB。
BLOB 和 TEXT 类型之间的 唯一区别 在于对 BLOB 值 进行 排序 和 比较 时 区分大小写,对 TEXT 值 不区分大小写。
9,MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?
MySQL_fetch_array() – 将 结果行 作为 关联数组 或来自 数据库 的 常规数组 返回。
MySQL_fetch_object()– 从 数据库 返回 结果行 作为 对象。
10,MyISAM 表格将在哪里存储,并且还提供其存储格式?
MyISAM 表格在 MySQL 数据库中的 存储位置 和 数据存储格式 如下:
- 存储位置:MyISAM 表格存储在 MySQL 数据目录下的三个文件中,它们分别是 表定义文件(
.frm文件)、数据文件(.MYD文件)和 索引文件(.MYI文件)。 - 存储格式:
.frm文件:存储 表 的 结构 和 定义信息,包括 列名、数据类型、索引信息 等。.MYD文件:存储 表 的 实际数据,按照 记录 的 插入顺序 存储。.MYI文件:存储 表 的 索引信息,用于加快 数据查询速度。
需要注意的是,在 MySQL 8.0 版本 之后,.frm 文件的 存储方式 发生了变化,新增了一个 .sdi 文件来替代部分 .frm 文件的功能。但是,.MYD 和 .MYI 文件的 存储方式 仍然保持不变。
速记
MyISAM 表存三处,数据目录有归属。
表定义存 .frm 处,结构信息它记录。
.MYD 存真实数,插入顺序来排布。
.MYI 把索引住,查询加速不含糊。
11,MySQL 如何优化 DISTINCT?
DISTINCT 用于返回 唯一不同的值,但在 大数据集 上使用时可能会导致 查询性能下降。以下是一些优化 DISTINCT 的方法:
- 建立索引:为需要使用 DISTINCT 的 列 建立 索引,这样可以加快 查询速度 并减少 排序操作 的 开销。
- 减少查询范围:尽可能地限制 查询范围,可以减少需要处理的 数据量。例如,可以使用 WHERE 子句 来限制 查询范围。
- 使用 GROUP BY 代替 DISTINCT:GROUP BY 也可以返回 唯一不同的值,而且可以利用 索引 进行优化。如果需要对 多列 进行 去重,可以使用 GROUP BY 和 多个列的组合。
- 使用子查询:将 DISTINCT 查询 作为 子查询,然后在 外部查询 中进行其他操作。这样可以减少需要处理的 数据量,并且可以利用 索引 进行优化。
- 缓存结果:如果 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 中,创建 索引 的 列数限制 取决于 存储引擎 的类型。对于常见的 存储引擎 InnoDB 和 MyISAM,以下是它们的 列数限制:
InnoDB存储引擎:InnoDB支持最多 16 个 列 的 组合索引。此外,InnoDB还支持 全文索引 和 空间索引。MyISAM存储引擎:MyISAM支持最多 16 个 列 的 组合索引。但是,如果 表 中使用了很多 列,创建 索引 可能会导致 性能下降。
需要注意的是,过多的 索引列 可能导致 索引 变得过大且复杂,从而影响 查询性能。因此,在设计 数据库 时,应该仔细考虑哪些 列 需要创建 索引,并尽量将 索引列数 控制在合理的范围内。
速记
MySQL 里建索引,引擎不同有差异。
InnoDB 它很行,组合十六可搞定。
全文空间也能行,索引功能挺丰富。
MyISAM 也不差,十六列数顶呱呱。
列多索引性能差,设计时候要慎抓。
索引列数别贪大,合理范围才最佳。
14,NOW()和 CURRENT_DATE()有什么区别?
NOW() 和 CURRENT_DATE() 都是 MySQL 中的 日期和时间函数,它们用于 获取 当前的 日期 和 时间信息,但它们的 返回值 有所不同。
- NOW()函数 返回当前的 日期 和 时间,包括 年、月、日、小时、分钟、秒 和 微秒。它返回一个表示当前 时间 的 时间戳。
- CURRENT_DATE()函数 只返回当前的 日期,包括 年、月、日,但不包括 时、分、秒 和 微秒。它返回一个表示当前 日期 的 时间戳。
速记
MySQL 里两函数,获取时间有区分。
NOW()全面本领强,年月时分秒微详。
时间戳里全呈现,当前时刻都包含。
CURRENT_DATE()稍简单,仅把日期来展现。
年月日期它涵盖,时分秒微不沾边。
两函数,用途辨,按需选择才灵验。
15,什么是通用 SQL 函数?
1、CONCAT(A, B) – 连接 两个 字符串值 以创建单个 字符串输出。通常用于将两个或多个 字段 合并为一个 字段。
2、FORMAT(X, D) - 格式化 数字 X 到 D 有效数字。
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
