以下是SQL 面试中可能会问到的一些最常见的 SQL 面试问题,以及我认为如何回答这些问题的建议。
文章目录
-
- 什么是SQL,它的主要特点是什么?
- 最常用的 SQL 命令有哪些?
- 如何使用SQL分析数据?
- 写SQL查询时会出现哪些常见错误?
- 主键和外键有什么区别?
- 什么是子查询,它是如何使用的?
- 什么是SQL窗口函数,它是如何使用的?
- 最重要的 SQL 数据类型有哪些?
- 什么是索引,它是如何使用的?
- WHERE 和 HAVING 子句有什么区别?
- ORDER BY 关键字有什么作用?
- 什么是主键?
- 什么是外键?
- 内连接和外连接有什么区别?
- 编写SQL查询选择工程部门薪水第二高的
- 什么是SQL聚合函数,它是如何使用的?
- 如何找到销售额排名前 5 位的客户?
- SQL中有哪些常用的日期函数?
- 什么是规范化和非规范化?
- 有哪些不同类型的索引?
- ACID属性有哪些?
- 如何从表中选择唯一记录?
- 什么是实体和关系?
什么是SQL,它的主要特点是什么?
SQL 或结构化查询语言是用于访问和操作数据库的标准编程语言。SQL 以其简单而强大的语法而闻名,这使得以各种方式查询数据变得容易。SQL 还支持范围广泛的数据类型,包括数字、文本和日期/时间值。
最常用的 SQL 命令有哪些?
一些最常见的 SQL 命令是 CREATE TABLE、INSERT INTO、UPDATE、DELETE 和 SELECT。
- CREATE TABLE 用于在数据库中创建新表。
- INSERT INTO 用于向表中插入数据。
- UPDATE 用于更新表中的数据。
- DELETE 用于从表中删除数据。
- SELECT 用于从表中选择数据。
如何使用SQL分析数据?
SQL 提供了许多内置函数,可用于执行各种类型的数据分析。例如, COUNT 函数可用于计算表中的记录数,而 SUM 函数可用于计算列中数值的总和。通过使用这些和其他 SQL 函数,数据分析师可以快速轻松地执行复杂的数据分析任务。
例如,数据分析师可能使用 SQL 来计算每天在网站上下达的订单数量。以下 SQL 查询将返回数据集中每天的订单总数:
SELECT COUNT(*) AS “Total Orders”
FROM orders
GROUP BY order_date
写SQL查询时会出现哪些常见错误?
编写 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窗口函数,它是如何使用的?
SQL 窗口函数是对一组值执行计算并返回单个值的函数。与每组返回一个结果的聚合函数不同,窗口函数每行返回一个结果。常见的窗口函数包括 RANK、DENSE_RANK 和 NTILE。
窗口函数通常与 ORDER BY 子句一起使用,以计算每一行的值。
最重要的 SQL 数据类型有哪些?
SQL 支持多种不同的数据类型,包括数字、文本、日期/时间和布尔值。数值包括整数和浮点数,而文本值包括字符串,日期/时间值包括日期、时间和时间戳值。布尔值可以是 TRUE 或 FALSE。
什么是索引,它是如何使用的?
索引是一种用于提高 SQL 查询性能的数据库结构。可以在表中的列上创建索引,它们通常用于加快对这些列中特定值的搜索。执行查询时,数据库引擎将首先检查正在搜索的列是否存在索引;如果存在索引,引擎会使用索引快速定位到想要的数据,这样可以提高查询性能。
WHERE 和 HAVING 子句有什么区别?
WHERE 子句用于根据指定条件过滤表中的行;例如,您可以使用 WHERE 子句查找居住在特定城市的所有客户。HAVING 子句用于根据聚合值过滤表中的行;例如,您可以使用 HAVING 子句来查找下订单超过 10 个的所有客户。
ORDER BY 关键字有什么作用?
ORDER BY 关键字用于按升序或降序对 SQL 查询的结果进行排序。默认情况下,ORDER BY 会按升序对结果进行排序;要按降序对结果进行排序,可以使用 DESC 关键字。
什么是主键?
主键是唯一标识表中行的一列或一组列。主键必须包含唯一值,并且不能为 NULL。
什么是外键?
外键是一列或一组列,其中包含与另一个表中的主键值匹配的值。外键用于创建表之间的关系;例如,“customer”表中的外键可以引用“orders”表中的主键,将每个客户与其各自的订单联系起来
内连接和外连接有什么区别?
内连接只返回在两个表中具有匹配值的行;例如,如果您将“customer”表与“orders”表内部连接,则只会返回已下订单的客户。另一方面,外连接返回连接表中匹配到的数据,匹配不到的也会保留,其值为NULL
编写SQL查询选择工程部门薪水第二高的
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聚合函数,它是如何使用的?
SQL 聚合函数是对一组值执行计算并返回单个值的函数。常见的聚合函数包括 COUNT、SUM、MAX 和 MIN。聚合函数通常与 GROUP BY 子句一起使用,以每组返回一个结果;例如,您可以使用 COUNT() 函数来查找每个城市的客户数量。
例如,考虑以下客户表:
假设我们要查找每个城市的客户数量。我们可以使用以下 SQL 查询:
SELECT city, COUNT(*) AS “Number of Customers”
FROM customers
GROUP BY city
它将返回如下:
如何找到销售额排名前 5 位的客户?
有几种不同的方法可以找到销售额排名前 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中有哪些常用的日期函数?
SQL 中一些常见的日期函数是:
-
- CURRENT_DATE:返回当前日期。
CURRENT_TIME:返回当前时间。
CURRENT_TIMESTAMP:返回当前日期和时间。
DATE_ADD:将指定的天数、月数或年数添加到日期。
DATE_SUB:从日期减去指定的天数、月数或年数。
DAY:返回给定日期的月份日期。
MONTH:返回给定日期的月份。
YEAR:返回给定日期的年份。
什么是规范化和非规范化?
- 规范化是指用于消除数据库中的冗余和不一致的方法。
- 非规范化是指用于提高查询性能的方法。
- 规范化为数据库引入了更多表,而非规范化减少了表的数量。
有哪些不同类型的索引?
- 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空;
- 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表最多只能有一个;
- 非聚集索引(NonClustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个。
- 哈希索引是数组,使用哈希函数F(K, N),其中K很关键,N是包含指针和行的槽数。
- 唯一索引(UNIQUE):唯一索引不允许两行具有相同的索引值;
ACID属性有哪些?
ACID 属性是指为了使数据库管理系统中的事务保持一致而必须遵循的属性。
- 原子性(Atomicity):整个事务一次发生或根本不发生。
- 一致性(Consistency):数据库必须在事务发生之前和之后保持一致。
- 隔离性(Isolation):事务独立发生,可以与其他事务同时运行。
- 持久性(Durability):对数据库的更新必须存储在磁盘中并写入磁盘,以便在系统发生故障时事务记录可以保持不变。
如何从表中选择唯一记录?
SELECT DISTINCT子句只会从表中返回唯一值。
什么是实体和关系?
实体可以是真实世界的对象,可以通过相关属性或属性的集合来识别。动物园数据库中的实体示例可能包括动物园管理员、兽医、不同的公共宣传计划或动物种类。
关系是相互关联的实体之间的连接。
实体之间的逻辑关系创建了一个数据库。