内容概览
本文介绍的面试题包括以下内容。
-
SQL 基础知识,包括 SQL 应用程序、SQL 语句、SQL 命令和 SQL 查询的类型等。
-
SQL 中的函数。包括聚合函数和标量函数,以及 SQL 内置函数和用户定义函数。
-
高级命令。包括 Join、主键和外键、索引和关联等主题。
-
数据库设计。包括范式、反范式,以及 DELETE、TRUNCATE、DROP 等 SQL 语句。
-
高级查询。包括子查询(嵌套子查询和相关子查询)等。
通用问题
在考察你的 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 语句包括 SELECT
、CREATE
、DELETE
、DROP
和 REVOKE
等。
5. 有哪些类型的 SQL 命令(或 SQL 子集)?
-
数据定义语言 (DDL) – 定义和修改数据库的结构。
-
数据操作语言 (DML) – 访问、操作和修改数据库中的数据。
-
数据控制语言 (DCL) – 控制用户对数据库中数据的访问,并授予或撤销特定用户或一组用户的权限。
-
事务控制语言 (TCL) – 控制数据库中的事务。
-
数据查询语言 (DQL) – 对数据库中的数据执行查询以从中检索必要的信息。
6. 请给出一些常见 SQL 命令。
-
DDL:
CREATE
、ALTER
、TABLE
、DROP
、TRUNCATE
、ADD COLUMN
-
DML:
UPDATE
、DELETE
、INSERT
-
DCL:
GRANT
、REVOKE
-
TCL:
COMMIT
、SET TRANSACTION
、ROLLBACK
、SAVEPOINT
-
DQL:
SELECT
7.什么是数据库?
数据库是一种结构化的存储空间,数据保存在表中,可供提取、操作和汇总数据信息。
8. 什么是 DBMS?你知道哪些类型的 DBMS?
DBMS 是数据库管理系统,可以对数据执行各种操作,如访问、更新、整理、插入和删除数据。
DBMS 有多种类型,如关系型、层次型、网络型、图型和面向对象型。这些类型的划分基于数据在系统中的组织、结构与存储方式。
9.什么是关系型数据库管理系统?举一些 RDBMS 的例子。
RDBMS,即关系型数据库管理系统。它是最常见的数据库管理系统,用于处理存储表中的数据。SQL 是专门用于与关系型数据库交互的语言。主流的关系型数据库包括 MySQL、PostgreSQL、Oracle、MariaDB 等。
10. SQL中的表和字段是什么?
表是以表格形式存储的有组织的数据。字段是列的别称。
11. 什么是 SQL 查询,你知道哪些类型的查询?
SQL 查询是用于查询或修改数据库中数据的 SQL 代码。
SQL 查询有两种:选择查询和操作查询。第一种用于检索数据(包括限制、分组、排序数据,以及从多个表中提取数据等)。第二种 SQL 查询用于创建、添加、删除、更新、重命名数据等。
12.什么是子查询?
子查询也称为内部查询,是在一个查询或外部查询中的查询。子查询可能出现在 SELECT
、FROM
、WHERE
和 UPDATE
等子句中。
子查询中还可以包含子查询。最里面的子查询首先运行,并将结果传递给它的外部查询。
13.你知道哪些类型的 SQL 子查询?
-
单行子查询 – 最多返回一行。
-
多行子查询 – 返回至少两行。
-
多列子查询 – 返回至少两列。
-
相关子查询 - 与外部查询的信息相关的子查询。
-
嵌套子查询 – 子查询嵌套在另一个子查询中。
14.什么是约束,为什么使用约束?
定义表中列的数据类型的条件。约束可确保表中数据的完整性,并阻止不需要的操作。
15.你知道哪些 SQL 约束?
-
DEFAULT
– 为列提供默认值。 -
UNIQUE
– 只允许唯一值。 -
NOT NULL
– 只允许非空值。 -
PRIMARY KEY
– 必须是唯一值,且必须是非空值(NOT NULL
和UNIQUE
)。 -
FOREIGN KEY
– 实现两个或多个表之间共享的键。
16. 什么是 join?
用于从多个表中提取数据记录的语句。SQL 表可以根据表之间的关系进行连接。
17. join 的类型都有哪些?
-
(INNER) JOIN
– 只返回满足两个(或所有)表中定义的 join 条件的记录。这是默认的 SQL 连接。 -
LEFT (OUTER) JOIN
– 返回左表中的所有记录及右表中满足定义的 join 条件的记录。 -
RIGHT (OUTER) JOIN
– 返回右表中的所有记录及左表中满足定义的 join 条件的记录。 -
FULL (OUTER) JOIN
– 返回两个(或所有)表中的所有记录。它是左连接和右连接的组合。
18.什么是主键?
把表的一列或多列设置为主键可以约束该列中的值是唯一值,而且必须是非空值。主键是 NOT NULL
和 UNIQUE
约束的组合。主键确保表中的每条记录都是唯一的,每个表都应该包含主键,但不能包含多个主键。
19. 什么是唯一键?
把表的一列或多列设置为 UNIQUE
可以约束该列中的值是唯一值,即便 NULL
值也只能是唯一的。
20.什么是外键?
把表的一列或多列设置为 FOREIGN KEY
可以将该列与另一个表(或多个表)中的主键相关联。外键用于把数据库的多个表连接起来。
21.什么是索引?
索引用于实现更快的数据检索。索引可以显著提高大型数据库的查询性能。
22. 你知道哪些类型的索引?
-
唯一索引 – 不允许表的列中存在重复项,便于维护数据完整性。
-
聚合索引 – 定义数据库表中记录的物理顺序,并根据键值进行数据搜索。一张表只能有一个聚合索引。
-
非聚合索引 – 表的记录顺序与磁盘数据的物理顺序不匹配。这意味着数据存储在一个位置,非聚合索引存储在另一个位置。一个表可以有多个非聚合索引。
23.什么是 schema?
schema 是表、存储过程、索引、函数和触发器等数据库结构元素的集合,是数据库的总体架构,指定了数据库中对象之间的关系,并为它们定义不同的访问权限。
24.什么是 SQL 注释?
SQL 代码注释可以是单行注释(--
),也可以是多行注释(/*comment_text*/
)。SQL 引擎运行时会忽略代码注释。注释是为了让人更方便地阅读代码。
25.什么是 SQL 运算符?
用于执行特定操作的保留字符或关键字。SQL 运算符通常与 WHERE
子句一起使用,以设置过滤数据的条件。
26. 你知道哪些类型的 SQL 运算符?
-
算术运算符:
+
、-
、*
、/
-
比较运算符:
>
、<`、`=`、`>=
-
复合运算符:
+=
、-=
、*=
、/=
-
逻辑运算符:
AND
、OR
、NOT
、BETWEEN
-
字符串运算符:
%
、_
、+
、^
-
集合运算符:
UNION
、UNION ALL
、INTERSECT
、MINUS
或EXCEPT
27. 什么是别名?
执行 SQL 查询时为表(或表中的列)指定的临时名称。使用别名是为了提高代码的可读性,使代码更加简洁。别名的关键字是 AS
:
1SELECT col_1 AS column
2FROM table_name;
28. 什么是子句?
SQL 查询的条件,用于过滤数据以获得查询的结果。如,WHERE
、LIMIT
、HAVING
、LIKE
、AND
、OR
、ORDER BY
等。
29. SELECT 查询中常用的语句有哪些?
主要有 FROM
、GROUP BY
、JOIN
、WHERE
、ORDER BY
、LIMIT
、HAVING
等。
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 查询中常见语句的出现顺序是什么?
SELECT
– FROM
– JOIN
– ON
– WHERE
– GROUP BY
– HAVING
– ORDER BY
- LIMIT
54.解释器执行 SELECT 查询语句的顺序是什么?
FROM
– JOIN
– ON
– WHERE
– GROUP BY
– HAVING
– SELECT
– ORDER BY
– LIMIT
55.什么是视图,为什么要使用视图?
视图一种虚拟表,包含从一个或多个数据库表(或其他视图)中提取的数据。
视图占用的空间很少,还可以简化复杂的查询,限制对数据的访问以确保安全,实现数据独立性,并汇总多个表中的数据。
56. 可以基于一个视图再创建一个视图吗?
可以。这也叫嵌套视图。但要避免嵌套多个视图,因为代码会变得难以理解,调试也更加困难。
57. 原表删除后还可以使用视图吗?
不可以。删除基表后,任何基于该表的视图都将失效。使用这样的视图时,将收到错误消息。
58. 你知道哪些类型的 SQL 关系?
-
一对一 — 一个表中的每条记录仅对应于另一个表中的一条记录。
-
一对多 — 一个表中的每条记录对应另一个表中的多条记录。
-
多对多 — 两个表中的每条记录都对应于另一个表中的多条记录。
59. BOOLEAN 数据字段的值有哪些?
在 PostgreSQL 中,BOOLEAN 类型的值包括 TRUE
、FALSE
和 NULL
。在其他 SQL 方言中,如 SQL Server,BIT 类型用于将布尔值存储为整数 1
(true
)或 0
(false
)。
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
则核查每一行的数据。
如果两个语句都出现在查询中,优先级为 WHERE
– GROUP BY
– HAVING
。
SQL 引擎按此顺序进行解析。
69. 如何向表中添加记录?
INSERT INTO
与 VALUES
结合使用。
1 INSERT INTO table_name
2 VALUES (value_1, value_2, ...);
70.如何删除表中的记录?
使用 DELETE
语句删除记录,可以搭配 WHERE
一起使用。
1 DELETE FROM table_name
2 WHERE condition;
可以删除符合条件的多条记录。
71.如何向表格添加列?
ALTER TABLE
与 ADD
结合在一起使用。
1 ALTER TABLE table_name
2 ADD column_name datatype;
72. 如何重命名表的列?
ALTER TABLE
与 RENAME COLUMN ... TO ...
一起使用,示例如下。
1 ALTER TABLE table_name
2 RENAME COLUMN old_column_name TO new_column_name;
73. 如何从表中删除列?
ALTER TABLE
与 DROP 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 INTO
与 VALUES
,示例如下。
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 BY
、LIMIT
中使用 RAND()
函数。在 PostgreSQL 中,使用 RANDOM()
。
从 MySQL 的表中返回 5 个随机行的示例如下。
1SELECT * FROM table_name
2ORDER BY RAND()
3LIMIT 5;
结论
本文介绍了 80 个常见的 SQL 面试问题及其答案,希望能够帮助你为面试做好准备。