当前位置: 首页 > news >正文

MySQL 面经

1、什么是 MySQL?

MySQL 是一个开源的关系型数据库,现在隶属于 Oracle 公司。是我们国内使用频率最高的一种数据库,我本地安装的是比较新的 8.0 版本。

1.1 怎么删除/创建一张表?

可以使用 DROP TABLE 来删除表,使用 CREATE TABLE 来创建表。创建表的时候,可以通过 PRIMARY KEY 设定主键。

CREATE TABLE users (
    id INT AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100),
    PRIMARY KEY (id)
);

1.2 请写一个升序/降序的 SQL 语句?

在 SQL 中,可以使用 ORDER BY 子句来对查询结果进行升序或者降序。默认情况下,查询结果是升序的,如果需要降序,可以通过 DESC 关键字来实现。如果需对多个字段进行排序,例如按工资降序,按名字升序,就可以 ORDER BY salary DESC, name ASC 来完成:

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, name ASC;

1.3 MySQL出现性能差的原因有哪些?

可能是 SQL 查询使用了全表扫描,也可能是查询语句过于复杂,如多表 JOIN 或嵌套子查询。也有可能是单表数据量过大。通常情况下,添加索引就能解决大部分性能问题。对于一些热点数据,还可以通过增加 Redis 缓存,来减轻数据库的访问压力。

2、两张表怎么进行连接?

可以通过内连接 inner join、外连接 outer join、交叉连接 cross join 来合并多个表的查询结果。

2.1 什么是内连接?

内连接用于返回两个表中有匹配关系的行。假设有两张表:用户表和订单表,想查询有订单的用户就可以使用内连接 users INNER JOIN orders,按照用户 ID 关联就行了。

SELECT users.name, orders.order_id
FROM users
INNER JOIN orders ON users.id = orders.user_id;

只有那些在两个表中都存在 user_id 的记录才会出现在查询结果中。

2.2 什么是外连接?

和内连接不同,外连接不仅返回两个表中匹配的行,还返回没有匹配的行,用 null 来填充。外连接又分为左外连接 left join 和右外连接 right join。left join 会保留左表中符合条件的所有记录,如果右表中有匹配的记录,就返回匹配记录,否则就用 null 填充,常用于某表中有,但另外一张表中可能没有的数据的查询场景。假设要查询所有用户以及他们的订单,即使用户没有下单,就可以使用左连接:

SELECT users.id, users.name, orders.order_id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

右连接就是左连接的镜像,right join 会保留右表中符合条件的所有记录。

2.3 什么是交叉连接?

交叉连接会返回两张表的笛卡尔积,将左表的每一行与右表的每一行进行组合,返回的行数是两张表行数的乘积。

SELECT A.id, B.id
FROM A
CROSS JOIN B;

3、内连接、左连接、右连接有什么区别?

MySQL 的连接主要分为内连接和外连接,外连接又可以分为左连接和右连接。
在这里插入图片描述
内连接可以用来找出两个表中共同的记录,相当于两个数据集的交集。左连接和右连接可以用来找出两个表中不同的记录,相当于两个数据集的并集。两者的区别是,左连接会保留左表中符合条件的所有记录,右连接则刚好相反。

4、说一下数据库的三大范式?

在这里插入图片描述

  1. 第一范式:表的每一列都是不可分割的基本数据单元:在这里插入图片描述
  2. 第二范式:在满足1NF的基础上,非主键字段必须完全依赖于整个主键。
    在这里插入图片描述
  3. 第三范式:在满足2NF的基础上,非主键字段不能间接依赖其他非主键字段(消除传递依赖)。
    在这里插入图片描述

4.1 建表的时候需要考虑哪些问题?

首先需要考虑表是否符合数据库的三大范式,确保字段不可再分,消除非主键依赖,确保字段仅依赖于主键等。然后在选择字段类型时,应该尽量选择合适的数据类型。在字符集上,尽量选择 utf8mb4,不仅可以支持中文和英文,还可以支持表情符号等。当数据量较大时,比如上千万行数据,需要考虑分表。比如订单表,可以采用水平分表的方式来分散单表存储压力。

5、varchar 与 char 的区别?

  1. varchar 是可变长度的字符类型,理论上最多可以容纳 65535 个字符,但考虑到字符集,以及 MySQL 需要 1 到 2 个字节来表示字符串长度,所以实际上最大可以容纳到 65533。
  2. char 是固定长度的字符类型,当定义一个 CHAR(10) 字段时,不管实际存储的字符长度是多少,都只会占用 10 个字符的空间。如果插入的数据小于 10 个字符,剩余的部分会用空格填充。(GBK 中文占 2 字节,UTF-8 占 3 字节)

6、blob 和 text 有什么区别?

blob 用于存储二进制数据,比如图片、音频、视频、文件等;但实际开发中,我们都会把这些文件存储到 OSS 或者文件服务器上,然后在数据库中存储文件的 URL。text 用于存储文本数据,比如文章、评论、日志等。

7、DATETIME 和 TIMESTAMP 有什么区别?

  1. DATETIME 直接存储日期和时间的完整值,与时区无关。
  2. TIMESTAMP 存储的是 Unix 时间戳,1970-01-01 00:00:01 UTC 以来的秒数,受时区影响。
    另外,DATETIME 的默认值为 null,占用 8 个字节;TIMESTAMP 的默认值为当前时间 CURRENT_TIMESTAMP,占 4 个字节,实际开发中更常用,因为可以自动更新。

8、in 和 exists 的区别?

使用 IN 时,MySQL 会首先执行子查询,然后将子查询的结果集用于外部查询的条件。这意味着子查询的结果集需要全部加载到内存中。而 EXISTS 会对外部查询的每一行,执行一次子查询。如果子查询返回任何行,则 EXISTS 条件为真。EXISTS 关注的是子查询是否返回行,而不是返回的具体值。

-- IN 的临时表可能成为性能瓶颈
SELECT * FROM users 
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

-- EXISTS 可以利用关联索引
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o 
            WHERE o.user_id = u.id AND o.amount > 100);

IN 适用于子查询结果集较小的情况。如果子查询返回大量数据,IN 的性能可能会下降,因为它需要将整个结果集加载到内存。而 EXISTS 适用于子查询结果集可能很大的情况。由于 EXISTS 只需要判断子查询是否返回行,不需要加载整个结果集,因此在某些情况下性能更好,特别是当子查询可以使用索引时。

8.1 NULL 值陷阱了解吗?

  1. IN: 如果子查询的结果集中包含 NULL 值,可能会导致意外的结果。例如,WHERE column IN (subquery),如果 subquery 返回 NULL,则 column IN (subquery) 永远不会为真,除非 column 本身也为 NULL。
  2. EXISTS: 对 NULL 值的处理更加直接。EXISTS 只是检查子查询是否返回行,不关心行的具体值,因此不受 NULL 值的影响。

9、记录货币用什么字段类型比较好?

货币在数据库中 MySQL 常用 Decimal 和 Numeric 类型表示,这两种类型被 MySQL 实现为同样的类型。他们被用于保存与货币有关的数据。例如 salary DECIMAL(9,2),9 (precision) 代表将被用于存储值的总的小数位数,而 2 (scale) 代表将被用于存储小数点后的位数。存储在 salary 列中的值的范围是从-9999999.99 到 9999999.99。DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。之所以不使用 float 或者 double 是为了避免二进制误差。

10、怎么存储 emoji?

MySQL 的 utf8 字符集仅支持最多 3 个字节的 UTF-8 字符,但是 emoji 表情(😊)是 4 个字节的 UTF-8 字符,所以在 MySQL 中存储 emoji 表情时,需要使用 utf8mb4 字符集。MySQL 8.0 已经默认支持 utf8mb4 字符集。

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

11、

12、

13、

14、

15、

16、

17、

18、

19、

20、

相关文章:

  • 十七、TCP编程
  • 在 Lua 中实现 JSON 与 Table 的相互转换的详细使用方法
  • 《人件》第二章 办公环境
  • CLIP中的Zero-Shot Learning原理
  • `offset_mapping` 是什么
  • C语言—程序的编译和链接
  • 【项目管理】第11章 项目成本管理-- 知识点整理
  • JVM 字节码是如何存储信息的?
  • 开源项目Syncthing-Android环境搭建与编译
  • PostgreSQL内幕探索—基础知识
  • CesiumForUnreal 本地矢量文件的加载,支持 shp/geojson 等常用格式
  • leetcode 2787. Ways to Express an Integer as Sum of Powers
  • 【MQTT-协议原理】
  • [ARC196A] Adjacent Delete 题解
  • 具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制(3)
  • 【学习笔记】两个类之间的数据交互方式
  • 01-libVLC的视频播放器:环境搭建以及介绍
  • 智能资源管理机制-重传机制
  • 使用DaemonSet部署集群守护进程集
  • 用链表、信号,实现简易MP3项目
  • 怎样做自己网站robots/seo快速排名软件首页
  • 怎样搭建一个企业网站/南昌seo全网营销
  • 做网站去哪推广好/365优化大师软件下载
  • flash网站cms/晋江怎么交换友情链接
  • 国家工商网官网登录入口/seo怎么刷关键词排名
  • 做网站销售电话术语/网站推广app软件