以下是SQL 面试中可能会问到的一些最常见的 SQL 面试问题,以及我认为如何回答这些问题的建议。
SQL 或结构化查询语言是用于访问和操作数据库的标准编程语言。SQL 以其简单而强大的语法而闻名,这使得以各种方式查询数据变得容易。SQL 还支持范围广泛的数据类型,包括数字、文本和日期/时间值。
一些最常见的 SQL 命令是 CREATE TABLE、INSERT INTO、UPDATE、DELETE 和 SELECT。
SQL 提供了许多内置函数,可用于执行各种类型的数据分析。例如, COUNT 函数可用于计算表中的记录数,而 SUM 函数可用于计算列中数值的总和。通过使用这些和其他 SQL 函数,数据分析师可以快速轻松地执行复杂的数据分析任务。
例如,数据分析师可能使用 SQL 来计算每天在网站上下达的订单数量。以下 SQL 查询将返回数据集中每天的订单总数:
SELECT COUNT(*) AS “Total Orders”
FROM orders
GROUP BY order_date
编写 SQL 查询时发生的一个常见错误是忘记包含 WHERE 子句。如果没有 WHERE 子句,您的查询将返回您正在查询的表中的所有行,这会使您难以找到您要查找的特定信息。另一个常见错误是使用不正确的语法,这可能会在执行查询时导致意外结果或错误。最后,确保您的 SQL 查询格式正确且易于阅读,这一点很重要。否则,如果出现问题,其他人可能难以理解或调试它们。
例如,以下 SQL 查询将返回 orders 表中的所有行,而不考虑 order_date:
SELECT *
FROM orders
这将返回一个很难处理的非常大的数据集。为了解决这个问题,我们可以添加一个 WHERE 子句来按 order_date 过滤数据:
SELECT *
FROM orders
WHERE order_date = ‘2018–01–01’
主键是数据库表中的一列(或一组列),它唯一地标识表中的每一行。外键是一个表中的一列(或一组列),其中包含与另一个表中的主键值匹配的值。外键用于创建表之间的关系;例如,“customer”表中的外键可以引用“orders”表中的主键,从而将每个客户与其各自的订单联系起来。
子查询是嵌入在另一个 SQL 查询中的 SQL 查询。子查询常用于查找满足一定条件的数据;例如,您可以使用子查询来查找与特定客户居住在同一城市的所有客户。子查询可以与各种 SQL 命令一起使用,包括 SELECT、FROM、WHERE 和 ORDER BY。
例如,考虑以下客户表:

假设我们要查找与 id=1 的客户居住在同一城市的所有客户。我们可以使用以下 SQL 查询:
SELECT * FROM customers
WHERE city IN
(SELECT city FROM customers WHERE id = 1)
这将返回客户表中的所有行,包括 id=1 的行。要排除这一行,我们可以在子查询中添加一个条件来排除customer_id != 1:
SELECT * FROM customers WHERE city IN (SELECT city FROM customers WHERE id = 1 AND id != 1)
SQL 窗口函数是对一组值执行计算并返回单个值的函数。与每组返回一个结果的聚合函数不同,窗口函数每行返回一个结果。常见的窗口函数包括 RANK、DENSE_RANK 和 NTILE。
窗口函数通常与 ORDER BY 子句一起使用,以计算每一行的值。
SQL 支持多种不同的数据类型,包括数字、文本、日期/时间和布尔值。数值包括整数和浮点数,而文本值包括字符串,日期/时间值包括日期、时间和时间戳值。布尔值可以是 TRUE 或 FALSE。
索引是一种用于提高 SQL 查询性能的数据库结构。可以在表中的列上创建索引,它们通常用于加快对这些列中特定值的搜索。执行查询时,数据库引擎将首先检查正在搜索的列是否存在索引;如果存在索引,引擎会使用索引快速定位到想要的数据,这样可以提高查询性能。
WHERE 子句用于根据指定条件过滤表中的行;例如,您可以使用 WHERE 子句查找居住在特定城市的所有客户。HAVING 子句用于根据聚合值过滤表中的行;例如,您可以使用 HAVING 子句来查找下订单超过 10 个的所有客户。
ORDER BY 关键字用于按升序或降序对 SQL 查询的结果进行排序。默认情况下,ORDER BY 会按升序对结果进行排序;要按降序对结果进行排序,可以使用 DESC 关键字。
主键是唯一标识表中行的一列或一组列。主键必须包含唯一值,并且不能为 NULL。
外键是一列或一组列,其中包含与另一个表中的主键值匹配的值。外键用于创建表之间的关系;例如,“customer”表中的外键可以引用“orders”表中的主键,将每个客户与其各自的订单联系起来
内连接只返回在两个表中具有匹配值的行;例如,如果您将“customer”表与“orders”表内部连接,则只会返回已下订单的客户。另一方面,外连接返回连接表中匹配到的数据,匹配不到的也会保留,其值为NULL
SELECT DISTINCT salary
FROM employee
WHERE department = ‘engineering’
ORDER BY salary DESC LIMIT 1 OFFSET 1;
OFFSET语句是设置开始取数的位置,位置从 0 算起,一般可以省略写成上例纯 limit 形式:
-- 取3条,从第 5 个开始
select name from students limit 3 offset 4
-- 取4条,从第 4 个开始
select name from students limit 3, 4
此 SQL 查询将从工程部门中选择第二高的薪水,首先选择工程部门员工的所有不同薪水,然后按降序排列,最后选择前 2 名薪水。
SQL 聚合函数是对一组值执行计算并返回单个值的函数。常见的聚合函数包括 COUNT、SUM、MAX 和 MIN。聚合函数通常与 GROUP BY 子句一起使用,以每组返回一个结果;例如,您可以使用 COUNT() 函数来查找每个城市的客户数量。
例如,考虑以下客户表:

假设我们要查找每个城市的客户数量。我们可以使用以下 SQL 查询:
SELECT city, COUNT(*) AS “Number of Customers”
FROM customers
GROUP BY city
它将返回如下:

有几种不同的方法可以找到销售额排名前 5% 的客户。一种方法是使用 GROUP BY 子句将您感兴趣的列中具有相同值的行组合在一起。例如,假设我们有一个包含以下数据的客户订单表:

如果我们想按销售额查找前 5 名客户,我们可以使用以下 SQL 查询:
SELECT name, city, SUM(sales) AS “Total Sales”
FROM customer_orders
GROUP BY name, city
ORDER BY “Total Sales” DESC
LIMIT 5
返回如下:

SQL 中一些常见的日期函数是:
CURRENT_TIME:返回当前时间。
CURRENT_TIMESTAMP:返回当前日期和时间。
DATE_ADD:将指定的天数、月数或年数添加到日期。
DATE_SUB:从日期减去指定的天数、月数或年数。
DAY:返回给定日期的月份日期。
MONTH:返回给定日期的月份。
YEAR:返回给定日期的年份。
ACID 属性是指为了使数据库管理系统中的事务保持一致而必须遵循的属性。
SELECT DISTINCT子句只会从表中返回唯一值。
实体可以是真实世界的对象,可以通过相关属性或属性的集合来识别。动物园数据库中的实体示例可能包括动物园管理员、兽医、不同的公共宣传计划或动物种类。
关系是相互关联的实体之间的连接。
实体之间的逻辑关系创建了一个数据库。
