80 个常见的 SQL 面试问题与答案

 

内容概览

本文介绍的面试题包括以下内容。

  1. SQL 基础知识,包括 SQL 应用程序、SQL 语句、SQL 命令和 SQL 查询的类型等。
  2. SQL 中的函数。包括聚合函数和标量函数,以及 SQL 内置函数和用户定义函数。
  3. 高级命令。包括 Join、主键和外键、索引和关联等主题。
  4. 数据库设计。包括范式、反范式,以及 DELETE、TRUNCATE、DROP 等 SQL 语句。
  5. 高级查询。包括子查询(嵌套子查询和相关子查询)等。

通用问题

在考察你的 SQL 技术前,面试官可能会问一些有关 SQL 的通用问题。例如:

  • 你对哪些 SQL 方言比较熟悉?
  • 你如何评价自己对 SQL 的熟练程度?
  • 你从事 SQL 的工作多久了?

虽然在你的简历中会提及这些信息,但你也要做好介绍这些信息的准备。当然,这类问题并没有所谓的正确答案,但切忌在回答时胡编乱造。

就算你的 SQL 工作经验有限,也不必要担心,面试官看简历的时候就知道这一点了。但既然他们还有兴趣面试你,就说明他们认为你有与他们公司需求相契合的点。

另外,哪怕你只使用过一种 SQL 方言,也没关系。记住,各个 SQL 方言的相似度非常高,只熟悉其中一种也是可以的。

40 个初级 SQL 面试题

1.什么是SQL?

SQL 的全称是 Structured Query Language,即结构化查询语言,它是用来与关系型数据库管理系统(RDBMS)交互的语言,包括从表中获取、更新、插入和删除数据,也就是我们常说的增删改查

2. 什么是 SQL 方言?

SQL 包括多种免费或付费的版本,这些不同的版本都被称为 SQL 方言。各种 SQL 方言的语法非常相似,只是功能有些差别。如 Microsoft SQL Server、PostgreSQL、MySQL、SQLite、T-SQL、Oracle 等。

3. SQL的主要应用有哪些?

使用 SQL,可以实现以下功能。

  • 创建、删除和更新数据库中的表。
  • 访问、操作和修改表中的数据。
  • 从一个或多个表中提取和总结的信息。
  • 在表中添加或删除某些行或列。

总之,SQL 允许以多种方式查询数据库,还可以轻松地与 Python 或 R 等编程语言集成。

4.什么是 SQL 语句?举一些例子。

SQL语句也叫 SQL 命令,由 SQL 引擎解释并执行。SQL 语句包括 SELECTCREATEDELETEDROPREVOKE等。

5. 有哪些类型的 SQL 命令(或 SQL 子集)?

  • 数据定义语言 (DDL) – 定义和修改数据库的结构。
  • 数据操作语言 (DML) – 访问、操作和修改数据库中的数据。
  • 数据控制语言 (DCL) – 控制用户对数据库中数据的访问,并授予或撤销特定用户或一组用户的权限。
  • 事务控制语言 (TCL) – 控制数据库中的事务。
  • 数据查询语言 (DQL) – 对数据库中的数据执行查询以从中检索必要的信息。

6. 请给出一些常见 SQL 命令。

  • DDLCREATEALTERTABLEDROPTRUNCATEADD COLUMN
  • DMLUPDATEDELETEINSERT
  • DCLGRANTREVOKE
  • TCLCOMMITSET TRANSACTIONROLLBACKSAVEPOINT
  • DQLSELECT

7.什么是数据库?

数据库是一种结构化的存储空间,数据保存在表中,可供提取、操作和汇总数据信息。

8. 什么是 DBMS?你知道哪些类型的 DBMS?

DBMS 是数据库管理系统,可以对数据执行各种操作,如访问、更新、整理、插入和删除数据。

DBMS 有多种类型,如关系型、层次型、网络型、图型和面向对象型。这些类型的划分基于数据在系统中的组织、结构与存储方式。

9.什么是关系型数据库管理系统?举一些 RDBMS 的例子。

RDBMS,即关系型数据库管理系统。它是最常见的数据库管理系统,用于处理存储表中的数据。SQL 是专门用于与关系型数据库交互的语言。主流的关系型数据库包括 MySQL、PostgreSQL、Oracle、MariaDB 等。

10. SQL中的表和字段是什么?

表是以表格形式存储的有组织的数据。字段是列的别称。

11. 什么是 SQL 查询,你知道哪些类型的查询?

SQL 查询是用于查询或修改数据库中数据的 SQL 代码。

SQL 查询有两种:选择查询和操作查询。第一种用于检索数据(包括限制、分组、排序数据,以及从多个表中提取数据等)。第二种 SQL 查询用于创建、添加、删除、更新、重命名数据等。

12.什么是子查询?

子查询也称为内部查询,是在一个查询或外部查询中的查询。子查询可能出现在 SELECTFROMWHEREUPDATE 等子句中。

子查询中还可以包含子查询。最里面的子查询首先运行,并将结果传递给它的外部查询。

13.你知道哪些类型的 SQL 子查询?

  • 单行子查询 – 最多返回一行。
  • 多行子查询 – 返回至少两行。
  • 多列子查询 – 返回至少两列。
  • 相关子查询 – 与外部查询的信息相关的子查询。
  • 嵌套子查询 – 子查询嵌套在另一个子查询中。

14.什么是约束,为什么使用约束?

定义表中列的数据类型的条件。约束可确保表中数据的完整性,并阻止不需要的操作。

15.你知道哪些 SQL 约束?

  • DEFAULT – 为列提供默认值。
  • UNIQUE – 只允许唯一值。
  • NOT NULL – 只允许非空值。
  • PRIMARY KEY – 必须是唯一值,且必须是非空值(NOT NULLUNIQUE)。
  • FOREIGN KEY – 实现两个或多个表之间共享的键。

16. 什么是 join?

用于从多个表中提取数据记录的语句。SQL 表可以根据表之间的关系进行连接。

17. join 的类型都有哪些?

  • (INNER) JOIN – 只返回满足两个(或所有)表中定义的 join 条件的记录。这是默认的 SQL 连接。
  • LEFT (OUTER) JOIN – 返回左表中的所有记录及右表中满足定义的 join 条件的记录。
  • RIGHT (OUTER) JOIN – 返回右表中的所有记录及左表中满足定义的 join 条件的记录。
  • FULL (OUTER) JOIN – 返回两个(或所有)表中的所有记录。它是左连接和右连接的组合。

18.什么是主键?

把表的一列或多列设置为主键可以约束该列中的值是唯一值,而且必须是非空值。主键是 NOT NULLUNIQUE 约束的组合。主键确保表中的每条记录都是唯一的,每个表都应该包含主键,但不能包含多个主键。

19. 什么是唯一键?

把表的一列或多列设置为 UNIQUE 可以约束该列中的值是唯一值,即便 NULL 值也只能是唯一的。

20.什么是外键?

把表的一列或多列设置为 FOREIGN KEY 可以将该列与另一个表(或多个表)中的主键相关联。外键用于把数据库的多个表连接起来。

21.什么是索引?

索引用于实现更快的数据检索。索引可以显著提高大型数据库的查询性能。

22. 你知道哪些类型的索引?

  • 唯一索引 – 不允许表的列中存在重复项,便于维护数据完整性。
  • 聚合索引 – 定义数据库表中记录的物理顺序,并根据键值进行数据搜索。一张表只能有一个聚合索引。
  • 非聚合索引 – 表的记录顺序与磁盘数据的物理顺序不匹配。这意味着数据存储在一个位置,非聚合索引存储在另一个位置。一个表可以有多个非聚合索引。

23.什么是 schema?

schema 是表、存储过程、索引、函数和触发器等数据库结构元素的集合,是数据库的总体架构,指定了数据库中对象之间的关系,并为它们定义不同的访问权限。

24.什么是 SQL 注释?

SQL 代码注释可以是单行注释(--),也可以是多行注释(/*comment_text*/)。SQL 引擎运行时会忽略代码注释。注释是为了让人更方便地阅读代码。

25.什么是 SQL 运算符?

用于执行特定操作的保留字符或关键字。SQL 运算符通常与 WHERE 子句一起使用,以设置过滤数据的条件。

26. 你知道哪些类型的 SQL 运算符?

  • 算术运算符+-*/
  • 比较运算符&gt;<`、`=`、`>=
  • 复合运算符+=-=*=/=
  • 逻辑运算符ANDORNOTBETWEEN
  • 字符串运算符%_+^
  • 集合运算符UNIONUNION ALLINTERSECTMINUSEXCEPT

27. 什么是别名?

执行 SQL 查询时为表(或表中的列)指定的临时名称。使用别名是为了提高代码的可读性,使代码更加简洁。别名的关键字是 AS

1SELECT col_1 AS column
2FROM table_name;

28. 什么是子句?

SQL 查询的条件,用于过滤数据以获得查询的结果。如,WHERELIMITHAVINGLIKEANDORORDER BY 等。

29. SELECT 查询中常用的语句有哪些?

主要有 FROMGROUP BYJOINWHEREORDER BYLIMITHAVING 等。

30.如何创建表?

使用 CREATE TABLE。例如,要创建一个包含 3 列预定义数据类型的表。

1CREATE TABLE table_name (col_1 datatype,
2                         col_2 datatype,
3                         col_3 datatype);

31.如何更新表?

使用 UPDATE 语句。

1UPDATE table_name
2SET col_1 = value_1, column_2 = value_2
3WHERE condition;

32. 如何从数据库中删除表?

使用 DROP TABLE 声明。语法是:DROP TABLE table_name;

33. 如何获取表中的记录数?

使用聚合函数 COUNT()SELECT COUNT(*) FROM table_name;

34.如何排序表中的记录?

使用 ORDER BY 语句。

1SELECT * FROM table_name
2ORDER BY col_1;

默认排序为升序,使用关键字 DESC 可以指定降序的列。还可以实现多列排序,分别指定每一列是升序还降序。例如:

1SELECT * FROM table_name
2ORDER BY col_1 DESC, col_3, col_6 DESC;

35. 如何选择表中的所有列?

SELECT 语句中使用星号 *。语法是:SELECT * FROM table_name;

36、如何从两个表中选取共同的记录?

使用 INTERSECT语句,示例如下。

1    SELECT * FROM table_1
2    INTERSECT
3    SELECT * FROM table_1;

37. 什么是 DISTINCT 语句,如何使用?

DISTINCT 可以与 SELECT 一起使用,以过滤掉重复项,并仅返回表中列的唯一值。示例如下。

1    SELECT DISTINCT col_1
2    FROM table_name;

38.什么是实体?举一些例子。

实体是可以收集并存储到数据库表中的现实世界中的对象数据。每个实体对应于表中的一行,表的列描述其属性。实体的示例包括银行交易、学校学生、销售的汽车等。

39.什么是关系?举一些例子。

关系是实体之间的连接,是指数据库中的多个表如何相互关联。例如,可以在销售数据表和客户表中找到同一客户的 ID。

40.什么是 NULL?它与 0 或空格有什么不同?

NULL 表示表格中的某个单元格不存在数据。

0 是有效的数值,空字符串是长度为 0 的合法字符串。

 

40 个中级 SQL 面试题

41. SQL 中什么是函数,为什么要使用函数?

函数是执行特定任务的一组 SQL 语句。函数接收输入参数,对它们执行计算或其他操作,然后返回结果。函数有助于提高代码可读性,并避免重复相同的代码片段。

42.你知道哪些类型的 SQL 函数?

  • 聚合函数 – 针对处理分组表中列的记录,并返回单个值(通常按组)。
  • 标量函数 – 处理每个单独的值,并返回单个值。

另一方面,SQL 函数可以是内置的,或用户定义的(由用户根据其特定需求创建)。

43.你知道哪些聚合函数?

  • AVG() – 返回平均值。
  • SUM() – 返回值的和。
  • MIN() – 返回最小值。
  • MAX() – 返回最大值。
  • COUNT() – 返回行数,包括具有空值的行数。
  • FIRST() – 返回列中的第一个值。
  • LAST() – 返回列中的最后一个值。

44.你知道哪些标量函数?

  • LEN()(或LENGTH()) – 返回字符串的长度,包括空格。
  • UCASE()(或 UPPER()) – 返回转换为大写的字符串。
  • LCASE()(或 LOWER()) – 返回转换为小写的字符串。
  • INITCAP() – 返回转换为首字母大写的字符串。
  • MID()(或 SUBSTR()) – 从字符串中提取子字符串。
  • ROUND() – 返回四舍五入到指定小数位数的数值。
  • NOW() – 返回当前日期和时间。

45. 什么是大小写处理函数?举一些例子。

大小写处理函数是文本函数,用于更改文本数据的大小写,可以将数据转换为大写、小写或首字母大写。

  • UCASE()(或 UPPER()) – 返回转换为大写的字符串。
  • LCASE()(或 LOWER()) – 返回转换为小写的字符串。
  • INITCAP()– 返回转换为首字母大写的字符串。

46. 什么是字符操作函数?举一些例子。

字符操作函数代表字符函数的子集,它们用于修改文本数据。

  • CONCAT() – 连接多个字符串值,将后一个字符串附加到前一个字符串的末尾。
  • SUBSTR() – 返回满足所提供的起点和终点的字符串的一部分。
  • LENGTH()(或 LEN()) – 返回字符串的长度,包括空格。
  • REPLACE() – 用一个子字符串替换提供的字符串中所有出现的已定义子字符串。
  • INSTR() – 返回给定字符串中定义的子字符串的数字位置。
  • LPAD()/RPAD() – 返回右对齐/左对齐值的左侧/右侧字符的填充。
  • TRIM() – 从提供的字符串的左侧、右侧或两端删除所有定义的字符及空格。

47. 局部变量和全局变量有什么区别?

局部变量只能在声明该变量的函数内部访问。
在函数外部声明的全局变量存储在内存结构中,可以在整个程序中使用。

48. ORDER BY 语句的默认排序是什么??如何更改?

ORDER BY 语句的默认排序是升序。要改为降序,需要添加 DESC 关键字,示例如下。

1SELECT * FROM table_name
2ORDER BY col_1 DESC;

49. 你知道哪些集合运算符?

  • UNION – 返回多个查询语句的结果合并后的唯一记录集(不包括重复项)。
  • UNION ALL – 返回多个查询语句的结果合并后的记录集(包括重复项)。
  • INTERSECT – 返回多个查询语句的结果交集的记录集。
  • EXCEPT(MySQL 和 Oracle 中为 MINUS) – 仅返回第一个语句查询的结果,不返回第二个查询的结果。

50. 查询中使用什么运算符进行模式匹配?

LIKE 运算符与 %_ 通配符结合使用。通配符 % 代表任意数量的字符,包括 0 个字符;_ 严格来说是一个字符。

51. 主键和唯一键有什么区别?

两种类型的键都确保列中的值唯一,但主键唯一标识表中的每个记录,唯一键则防止该列中出现重复项。

52.什么是复合主键?

表的主键,基于多个列。

53. SELECT 查询中常见语句的出现顺序是什么?

SELECTFROMJOINONWHEREGROUP BYHAVINGORDER BYLIMIT

54.解释器执行 SELECT 查询语句的顺序是什么?

FROMJOINONWHEREGROUP BYHAVINGSELECTORDER BYLIMIT

55.什么是视图,为什么要使用视图?

视图一种虚拟表,包含从一个或多个数据库表(或其他视图)中提取的数据。

视图占用的空间很少,还可以简化复杂的查询,限制对数据的访问以确保安全,实现数据独立性,并汇总多个表中的数据。

56. 可以基于一个视图再创建一个视图吗?

可以。这也叫嵌套视图。但要避免嵌套多个视图,因为代码会变得难以理解,调试也更加困难。

57. 原表删除后还可以使用视图吗?

不可以。删除基表后,任何基于该表的视图都将失效。使用这样的视图时,将收到错误消息。

58. 你知道哪些类型的 SQL 关系?

  • 一对一 — 一个表中的每条记录仅对应于另一个表中的一条记录。
  • 一对多 — 一个表中的每条记录对应另一个表中的多条记录。
  • 多对多 — 两个表中的每条记录都对应于另一个表中的多条记录。

59. BOOLEAN 数据字段的值有哪些?

在 PostgreSQL 中,BOOLEAN 类型的值包括 TRUEFALSENULL。在其他 SQL 方言中,如 SQL Server,BIT 类型用于将布尔值存储为整数 1true)或 0false)。

60. SQL 中的范式(normalization )是什么,为什么要使用范式?

范式是数据库的设计过程,旨在减少数据冗余、提高数据一致性和完整性,让查询效率更高,也更灵活,常用的范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

61. SQL 中的非范式(denormalization )是什么,为什么要使用非范式?

非范式是与范式相反的过程:它引入数据冗余,并组合来自多个表的数据。在读操作比写操作更重要的情况下,非范式可以优化数据库基础设施的性能,有助于避免复杂的连接,并减少查询运行的时间。

62. 重命名列与列的别名有什么区别?

重命名列意味着永久更改其在原始表中的实际名称。
为列指定别名意味着在执行 SQL 查询时为其指定一个临时名称,使代码更易读,更简洁。

63. 嵌套子查询和相关子查询(correlated subquery)有什么区别?

相关子查询是嵌套在外部查询中的内部查询,该查询引用外部查询中的值来执行,这意味着相关子查询依赖于其外部查询。相反,非相关子查询不依赖于外部查询的数据,并且可以独立于外部查询运行。

64. 聚合索引和非聚合索引的区别是什么?

聚合索引定义表中记录的物理顺序,并根据键值执行数据搜索,而非聚合索引的记录顺序与磁盘上实际数据的物理顺序不匹配。一张表只能有一个聚合索引,但可以有多个非聚合索引。

65. CASE() 函数是什么?

SQL 中 if-then-else 逻辑的实现方式。CASE() 函数按顺序检查 WHEN 子句中的条件,在满足第一个条件时返回 THEN 子句中的值。如果没有满足任何条件,则该函数将返回 ELSE 子句中的值(如果已提供),否则返回 NULL

1    CASE
2        WHEN condition_1 THEN value_1
3        WHEN condition_2 THEN value_2
4        WHEN condition_3 THEN value_3
5        ...
6        ELSE value
7    END;

66. DELETE 和 TRUNCATE 的区别是什么?

DELETE 根据 WHERE 子句中的条件从表中删除一行或多行记录。

TRUNCATE 是用于删除表中的所有行,但包含外键的表不能使用 TRUNCATE 语句。

DELETE 的速度比 TRUNCATE 慢。

67. DROP 和 TRUNCATE 的区别是什么?

DROP 从数据库中完全删除表,包括表结构、约束条件、多表关系及访问权限。

TRUNCATE 删除表中的所有行的数据,但不涉及表的结构和约束条件。

DROP 的速度比 TRUNCATE 慢。

两者都是不可逆的。

68. HAVING 和 WHERE 语句有什么区别?

HAVING 对分组后的数据进行聚合处理。

WHERE 则核查每一行的数据。

如果两个语句都出现在查询中,优先级为 WHEREGROUP BYHAVING

SQL 引擎按此顺序进行解析。

69. 如何向表中添加记录?

INSERT INTOVALUES 结合使用。

1    INSERT INTO table_name
2    VALUES (value_1, value_2, ...);

70.如何删除表中的记录?

使用 DELETE 语句删除记录,可以搭配 WHERE 一起使用。

1    DELETE FROM table_name
2    WHERE condition;

可以删除符合条件的多条记录。

71.如何向表格添加列?

ALTER TABLEADD 结合在一起使用。

1    ALTER TABLE table_name
2    ADD column_name datatype;

72. 如何重命名表的列?

ALTER TABLERENAME COLUMN ... TO ... 一起使用,示例如下。

1    ALTER TABLE table_name
2    RENAME COLUMN old_column_name TO new_column_name;

73. 如何从表中删除列?

ALTER TABLEDROP COLUMN一起使用,示例如下。

1    ALTER TABLE table_name
2    DROP COLUMN column_name;

34. 如何选择表中的所有偶数或奇数的记录?

通过计算除以 2 的余数,实现这个操作。

在 PostgreSQL 或 My SQL 中,可以使用 MOD 函数;在 SQL Server 和 SQLite 中使用 % 运算符。

使用 MOD 选择所有偶数记录的示例代码如下。

1SELECT * FROM table_name
2WHERE MOD(ID_column, 2) = 0;

使用 % 选择所有偶数记录的示例代码如下。

1SELECT * FROM table_name 
2WHERE ID_column % 2 = 0;

选择所有奇数记录时,其他的内容不变,用 <> 运算符替代 = 即可。

75、查询时如何防止重复记录?

SELECT 语句中使用 DISTINCT,或为该表创建唯一键。

76. 如何在表中插入多行数据?

使用 INSERT INTOVALUES,示例如下。

1INSERT INTO table_name
2VALUES (value_1, value_2, ...),
3      (value_3, value_4, ...),
4      (value_5, value_6, ...),
5      ...;

77. 如何找到表中某一列的第 n 个最高值?

使用 OFFSET 子句。查找某列中的第 6 个最高值的示例如下。

1SELECT * FROM table_name
2ORDER BY column_name DESC
3LIMIT 1
4OFFSET 5;

78. 如何查找表格文本列中以某个字母开头的值?

使用 LIKE 运算符和 %_ 通配符。查找表中所有以 A 开头的姓的示例如下。

1SELECT * FROM table_name
2WHERE surname LIKE 'A_';

假设姓里必须包含至少两个字母。如果没有这个假设则代表姓可以只是 A,示例如下。

1SELECT * FROM table_name
2WHERE surname LIKE 'A%';

79. 如何查找表中最后一个 id?

使用 MAX() 函数。在大部分 SQL 方言中的示例如下。

1SELECT id
2FROM table_name
3ORDER BY id DESC
4LIMIT 1;

在 SQL Server 中的示例如下。

1SELECT TOP 1 id
2FROM table_name
3ORDER BY id DESC

80. 如何从表中随机选择行?

ORDER BYLIMIT 中使用 RAND() 函数。在 PostgreSQL 中,使用 RANDOM()

从 MySQL 的表中返回 5 个随机行的示例如下。

1SELECT * FROM table_name
2ORDER BY RAND()
3LIMIT 5;

结论

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/80983.html

(0)
guozi's avatarguozi
上一篇 2024年5月31日 上午11:06
下一篇 2024年5月31日 上午11:09

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注