2025 年 50 个 SQL 面试问题及答案
应届生 SQL 面试问题
1. 什么是 DBMS?
数据库管理系统(DBMS)是一种控制数据库的创建、维护和使用的程序。DBMS 可以称为文件管理器,它管理数据库中的数据,而不是将其保存在文件系统中。
2. 什么是 RDBMS?
RDBMS 代表关系数据库管理系统。RDBMS 将数据存储在表中,这些表通过表列之间的公共字段进行关联。它还提供关系运算符来操作表中存储的数据。
例如:SQL Server。
3. 什么是 SQL?
SQL 代表结构化查询语言,用于与数据库通信。它是一种用于从数据库中检索、更新、插入和删除数据的标准语言。
标准 SQL 命令是 Select。
4. 什么是数据库?
数据库就是便于访问、存储、检索和管理数据的有组织的数据形式。它也被称为结构化数据形式,可以通过多种方式访问。
例如:学校管理数据库、银行管理数据库。
5. 什么是表和字段?
表是数据集合,它以列和行的模型组织。列可以归类为垂直的,行是水平的。表有指定数量的列称为字段,但可以有任意数量的行,称为记录。
例如:
表:Employee(员工)。
字段:Emp ID(员工 ID)、Emp Name(员工姓名)、Date of Birth(出生日期)。
数据:201456、David、11/15/1960。
6. 什么是主键?
主键是唯一标识一行的字段组合。这是一种特殊的唯一键,它具有隐式的 NOT NULL 约束。这意味着主键值不能为 NULL。
7. 什么是唯一键?
唯一键约束唯一标识数据库中的每个记录。它为列或一组列提供唯一性。
主键约束自动具有唯一约束。但唯一键不是这样。
每个表可以定义多个唯一约束,但每个表只能定义一个主键约束。
8. 什么是外键?
外键是表中的一个字段,它可以引用另一个表的主键。通过引用外键和另一个表的主键,可以在两个表之间创建关系。
9. 什么是 JOIN?
这是一个关键字,用于基于表字段之间的关系从多个表中查询数据。JOIN 使用时,键起着重要作用。
10. JOIN 有哪些类型?请解释每一种。
有 各种类型的 JOIN 可以用于检索数据,这取决于表之间的关系。
- 内连接 (Inner Join)。
内连接返回表中至少有一行匹配的行。
- 右连接 (Right Join)。
右连接返回表中的公共行以及右侧表的所有行。简单来说,即使左侧表中没有匹配项,它也会返回右侧表中的所有行。
- 左连接 (Left Join)。
左连接返回表中的公共行以及左侧表的所有行。简单来说,即使右侧表中没有匹配项,它也会返回左侧表中的所有行。
- 全连接 (Full Join)。
全连接返回任一表中存在匹配行的行。这意味着它会返回左侧表的所有行以及右侧表的所有行。
三年工作经验 SQL 面试问题
11. 什么是范式(Normalization)?
范式是通过组织数据库的字段和表来最小化冗余和依赖性的过程。范式的目的是在单个表中添加、删除或修改字段。
12. 什么是反范式(Denormalization)?
反范式是一种用于从数据库的更高范式访问数据的技术。它也是通过合并相关表中的数据来引入表冗余的过程。
13. 有哪些不同的范式?
数据库范式可以通过案例研究轻松理解。范式可以分为 6 种,如下所述——。
- 第一范式 (1NF):
应该删除表中所有重复的列。为相关数据创建表并识别唯一列。
- 第二范式 (2NF):
满足第一范式的所有要求。将数据子集放在单独的表中,并使用主键在表之间创建关系。
- 第三范式 (3NF):
应满足第二范式的所有要求。删除不依赖于主键约束的列。
- 第四范式 (4NF):
如果数据库表中不存在描述相关实体的两个或多个独立的多值数据,则该表符合第四范式。
- 第五范式 (5NF):
仅当表符合第四范式且在不丢失数据的情况下无法分解为任何数量的更小表时,该表才符合第五范式。
- 第六范式 (6NF):
第六范式尚未标准化,尽管数据库专家已经讨论了它一段时间。希望在不久的将来,我们会对第六范式有一个清晰且标准化的定义……
14. 什么是视图(View)?
视图是一个虚拟表,它包含表中数据的一个子集。视图不是物理存在的,它占用更少的存储空间。视图可以包含一个或多个表的组合数据,具体取决于它们之间的关系。
15. 什么是索引(Index)?
索引是一种性能调优方法,它允许从表中更快地检索记录。索引为每个值创建一个条目,从而可以更快地检索数据。
16. 有哪些不同类型的索引?
有三种类型的索引——。
- 唯一索引 (Unique Index)。
此索引不允许字段具有重复值,如果列被唯一索引。在定义主键时可以自动应用唯一索引。
- 聚集索引 (Clustered Index)。
此索引类型会重新排序表的物理顺序,并根据键值进行搜索。每个表只能有一个聚集索引。
- 非聚集索引 (NonClustered Index)。
非聚集索引不改变表的物理顺序,并保持数据的逻辑顺序。每个表可以有 999 个非聚集索引。
17. 什么是游标(Cursor)?
数据库游标是一种控制机制,它能够遍历表中的行或记录。这可以看作是指向一组行中的某一行。游标在遍历(如检索、添加和删除数据库记录)方面非常有用。
18. 什么是关系(Relationship)?它们是什么?
数据库关系被定义为数据库中表之间的连接。有各种数据库关系,它们如下:
- 一对一关系 (One to One Relationship)。
- 一对多关系 (One to Many Relationship)。
- 多对一关系 (Many to One Relationship)。
- 自引用关系 (Self-Referencing Relationship)。
19. 什么是查询(Query)?
数据库查询是一种用于从数据库中获取信息的代码。查询的设计可以使其与我们期望的结果集匹配。简单来说,就是向数据库提问。
20. 什么是子查询(Subquery)?
子查询是嵌套在另一个查询中的查询。外部查询称为主查询,内部查询称为子查询。子查询总是先执行,子查询的结果会传递给主查询。
让我们看一下子查询的语法——
MyFlix 视频库的一个常见客户投诉是电影数量太少。管理层希望为拥有最少数量电影的类别购买电影。
您可以使用如下查询:
SELECT category_name FROM categories WHERE category_id =( SELECT MIN(category_id) from movies);
五年工作经验 SQL 面试问题
21. 有哪些类型的子查询?
有两种类型的子查询——相关子查询和非相关子查询。
相关子查询不能被视为独立查询,但它可以引用主查询 FROM 子句中列出的表中的列。
非相关子查询可以被视为独立查询,子查询的输出会替代到主查询中。
22. 什么是存储过程(Stored Procedure)?
存储过程是一个函数,它包含许多 SQL 语句来访问数据库系统。将多个 SQL 语句合并到一个存储过程中,并在需要时在任何地方执行它们。
23. 什么是触发器(Trigger)?
数据库触发器是一种代码或程序,它响应数据库中表或视图上的某个事件而自动执行。触发器主要有助于维护数据库的完整性。
例如:当一个新学生添加到学生数据库时,应该在考试、分数和出勤表等相关表中创建新记录。
24. DELETE 和 TRUNCATE 命令之间有什么区别?
DELETE 命令用于从表中删除行,可以使用 WHERE 子句进行条件参数设置。在 delete 语句之后可以执行 commit 和 rollback。
TRUNCATE 会删除表中的所有行。TRUNCATE 操作不能回滚。
25. 什么是局部变量和全局变量?它们之间有什么区别?
局部变量是可以在函数内部使用或存在的变量。其他函数不知道它们,也无法引用或使用这些变量。变量可以在每次调用该函数时创建。
全局变量是在整个程序中都可以使用或存在的变量。在全局声明的相同变量不能在函数中使用。全局变量不能在每次调用该函数时创建。
26. 什么是约束(Constraint)?
约束可用于指定表数据类型的限制。可以在创建或修改表语句时指定约束。约束示例包括:
- 非空 (NOT NULL)。
- 检查 (CHECK)。
- 默认 (DEFAULT)。
- 唯一 (UNIQUE)。
- 主键 (PRIMARY KEY)。
- 外键 (FOREIGN KEY)。
27. 什么是数据完整性(Data Integrity)?
数据完整性定义了数据库中存储的数据的准确性和一致性。它还可以定义完整性约束,在数据输入应用程序或数据库时强制执行业务规则。
28. 什么是自增 (Auto Increment)?
自增关键字允许用户在将新记录插入表时生成唯一编号。在 Oracle 中可以使用 AUTO_INCREMENT 关键字,在 SQL SERVER 中可以使用 IDENTITY 关键字。
大多数情况下,此关键字与 PRIMARY KEY 一起使用。
29. 集群索引和非集群索引有什么区别?
聚集索引通过改变记录的存储方式来方便地从数据库中检索数据。数据库根据被设置为聚集索引的列对行进行排序。
非聚集索引不改变存储方式,而是在表内创建一个完全独立的对象。搜索后,它会指向原始表行。
30. 什么是数据仓库(Datawarehouse)?
数据仓库是来自多个信息源的数据的中央存储库。这些数据被整合、转换并可用于挖掘和在线处理。数据仓库有称为数据市场(Data Marts)的数据子集。
31. 什么是自连接(Self-Join)?
自连接是指用于将一个查询与其自身进行比较的查询。它用于将列中的值与同一表中的同一列中的其他值进行比较。可以使用别名(ALIAS)进行相同的表比较。
32. 什么是交叉连接(Cross-Join)?
交叉连接定义为笛卡尔积,即第一个表的行数乘以第二个表的行数。如果交叉连接中使用了 WHERE 子句,则查询的执行方式类似于 INNER JOIN。
33. 什么是用户定义函数(User Defined Functions)?
用户定义函数是编写的用于在需要时使用该逻辑的函数。不必多次编写相同的逻辑。而是可以在需要时调用或执行函数。
34. 有哪些用户定义函数类型?
用户定义函数有三种类型:
- 标量函数 (Scalar Functions)。
- 内联表值函数 (Inline Table valued functions)。
- 多语句表值函数 (Multi statement valued functions)。
标量函数返回单个值,变体定义返回子句。另外两种类型返回表。
35. 什么是排序规则(Collation)?
排序规则被定义为一组规则,用于确定字符数据如何排序和比较。它可以用于比较 A 和 a,以及其他语言字符,并且还取决于字符的宽度。
ASCII 值可用于比较这些字符数据。
36. 有哪些不同类型的排序规则敏感性?
以下是不同类型的排序规则敏感性——。
- 区分大小写 (Case Sensitivity) – A 和 a,B 和 b。
- 区分重音符 (Accent Sensitivity)。
- 区分假名 (Kana Sensitivity) – 日语假名字符。
- 区分宽度 (Width Sensitivity) – 单字节字符和双字节字符。
37. 存储过程的优缺点?
存储过程可以作为模块化编程使用 – 意味着一次创建、存储并在需要时多次调用。这比执行多个查询支持更快的执行。它减少了网络流量并为数据提供了更好的安全性。
缺点是它只能在数据库中执行,并且会占用数据库服务器更多的内存。
38. 什么是联机事务处理(OLTP)?
联机事务处理 (OLTP) 管理事务处理应用程序,可用于数据录入、数据检索和数据处理。OLTP 使数据管理简单高效。与 OLAP 系统不同,OLTP 系统的目标是处理实时事务。
例如 – 日常银行交易。
39. 什么是子句(CLAUSE)?
SQL 子句用于通过为查询提供条件来限制结果集。这通常会从整个记录集中过滤掉一些行。
例如 – 具有 WHERE 条件的查询
具有 HAVING 条件的查询。
40. 什么是递归存储过程(recursive stored procedure)?
一个存储过程,它调用自身,直到达到某个边界条件。这种递归函数或过程可以帮助程序员多次使用同一组代码。
十年以上工作经验 SQL 面试问题
41. UNION、MINUS 和 INTERSECT 命令是什么?
UNION 操作符用于合并两个表的查询结果,并从中消除重复的行。
MINUS 操作符用于返回第一个查询中的行,但不返回第二个查询中的行。将第一个查询和第二个查询的匹配记录以及第一个查询中的其他行显示为结果集。
INTERSECT 操作符用于返回两个查询都返回的行。
42. 什么是别名命令(ALIAS command)?
可以为表或列指定别名。该别名可以在 WHERE 子句中引用,以标识表或列。
例如-。
Select st.StudentID, Ex.Result from student st, Exam as Ex where st.studentID = Ex. StudentID
这里,st 代表 student 表的别名,Ex 代表 exam 表的别名。
43. TRUNCATE 和 DROP 语句有什么区别?
TRUNCATE 删除表中的所有行,并且不能回滚。DROP 命令从数据库中删除一个表,该操作也不能回滚。
44. 什么是聚合函数和标量函数?
聚合函数用于评估数学计算并返回单个值。这些值可以从表中的列计算得出。标量函数根据输入值返回单个值。
例如 -。
聚合函数 – max()、count – 相对于数字计算。
标量函数 – UCASE()、NOW() – 相对于字符串计算。
45. 如何从现有表中创建空表?
示例为 -。
Select * into studentcopy from student where 1=2
这里,我们将 student 表复制到另一个结构相同的表中,但没有复制任何行。
46. 如何从两个表中获取公共记录?
可以通过以下方式获得公共记录结果集 -。
Select studentID from student INTERSECT Select StudentID from Exam
47. 如何从表中获取间隔记录?
可以为奇数和偶数行号获取记录 -。
显示偶数行 -。
Select studentId from (Select rowno, studentId from student) where mod(rowno,2)=0
显示奇数行 -。
Select studentId from (Select rowno, studentId from student) where mod(rowno,2)=1
from (Select rowno, studentId from student) where mod(rowno,2)=1.[/sql]
48. 如何从表中选择唯一记录?
使用 DISTINCT 关键字从表中选择唯一记录。
Select DISTINCT StudentID, StudentName from Student.
49. 用于获取字符串前 5 个字符的命令是什么?
获取字符串前 5 个字符有很多方法 -。
Select SUBSTRING(StudentName,1,5) as studentname from student
Select LEFT(Studentname,5) as studentname from student
50. 查询中使用哪个操作符进行模式匹配?
LIKE 操作符用于模式匹配,可以这样使用 -。
- % – 匹配零个或多个字符。
- _ (下划线) – 匹配一个字符。
例如 -。
Select * from Student where studentname like 'a%'
Select * from Student where studentname like 'ami_'
这些面试问题也将有助于您的口试