• webqwe-资源分享和开发经验
AD
AD

Home / 开发 / SQL初级到高级常见案例和答案以及SQL概念

SQL初级到高级常见案例和答案以及SQL概念

2024-03-23 09:23:03
403 阅读

概述

结构化查询语言或 SQL 是一种功能强大的编程语言,用于许多不同的技术领域和行业。如果您想成为数据分析师、数据工程师或数据科学家,那么您需要学习并掌握 SQL。


本文进行了广泛的研究,记录一些从初级到高级的最常见 SQL 问题,以帮助读者学习、练习和理解 SQL。此外,还可以了解最常见 SQL 概念和 SQL 常见问题和答案。


首先介绍初学者 SQL 概念,例如如何使用 SELECT、WHERE 和 HAVING 正确查询和过滤数据。接下来,我们将继续讨论更中级的 SQL 问题,聚涵盖子查询和合函数。最后,我们将通过高级SQL 问题来测试您的能力,这些问题要求您解决复杂的数学和多表操作问题。

每个问题都将包含深入的解释,引导您逐步完成解决方案,以便可以从本文中获得知识。


初级 SQL 问题及解答

在本节中,我们将介绍结构化查询语言 (SQL) 问题和答案的基础知识,包括如何编写简单的 SELECT 语句、使用 WHERE 子句筛选结果以及使用基本 SQL 函数和联接。


Q1:人力资源经理想知道春假需要多少个礼品篮,为此需要统计员工人数。请编写一个查询来查找员工总数。

表:employee(员工)

解决方案

步骤1:我们需要熟悉员工表,它包含我们所有关于员工的数据。这包括他们的 ID、名字、姓氏、经理 ID、工资、部门、开始日期和建筑物ID。这是一个关系数据库表,对于编写 SQL 查询很有用。

步骤 2:要在 SQL 查询中获取员工总数,我们将使用 SELECT 语句从员工表中检索此信息,并简单地使用 SQL 关键字 COUNT 来计算员工表中与我们的匹配的行数。

在此示例中,我们使用 COUNT 来获取 SQL 查询中的员工总数。此外,我们将使用 DISTINCT 子句仅计算唯一行。

SQL查询

第三步:然后我们可以简单地运行查询来获得最终结果

输出


Q2:您的投资组合经理想知道哪些初创公司需要关注,并要求您编写一个SQL语句,查询出美国地区没有销售额的初创公司。

表:orders(订单)

表:catalog(目录)

解决方案

第 1 步:要识别在美国没有销售额的初创公司,我们首先需要使用 LEFT JOIN 连接订单和目录表。

LEFT JOIN用于从左表(订单)返回关系数据库中的所有行,即使右表(目录)中没有匹配的值。

在这种情况下,订单表将位于查询的左侧,目录表将位于查询的右侧。您可以通过在 c.item_id = o.item_id 上使用 order o 来加入它们。

第 2 步:接下来,我们将使用 WHERE 语句仅查找位于美国的初创公司。我们可以使用等号“ ”来完成此操作,因为该列是一个字符串。

步骤 3:最后,我们将通过从结果表中删除值为null的行来检索最终输出。

我们将使用 o.order_id is NULL,因为如果 SQL 语句成功,SQL 查询将返回order_id 为null的数据,因此我们可以使用它来过滤掉订单表中没有销售的任何结果。

这将确保我们的 SQL 查询中只返回没有销售额的初创公司。之后,我们的 SQL 查询结构正确,并且可以简单地运行它来获取美国尚未进行任何销售的初创公司的列表。

输出


Q3:编写一个查询来查找按部门的平均工资。将结果四舍五入至小数点后两位。

表:employee(员工)

解决方案

步骤 1:要计算按部门的平均工资,我们需要首先运行一个 SQL 查询,从关系数据库的员工表中选择部门列。

步骤 2:接下来,我们可以通过简单的计算,求出各个部门的平均工资。在 SQL 中,这是使用 AVG() 函数并将其分配给 SQL 查询中的相应列来完成的。因为我们要按部门查找平均值,所以需要使用 GROUP BY 按部门对结果进行分组。

步骤 3:最后,我们可以运行 SQL 查询并将结果四舍五入到小数点后两位以确保准确性。这将为我们提供表中每个部门的平均工资的输出。

输出


中级 SQL 题及答案

好吧,初级 SQL 语句部分你做得怎么样?如果您有信心,那么让我们继续讨论一些中级 SQL 问题!

在这个中级 SQL 问题和答案部分中,我们将扩展初级 SQL 部分中已经介绍的内容,并纳入更多中级 SQL 主题,包括 CTE 或公用表表达式、DATE_PART 和窗口函数。


Q1:财务总监想要削减成本,并要求您编写一个查询以返回没有员工的建筑物列表。没有员工的建筑物

表:employee(员工)

表:building(建筑物)


解决方案

第 1 步:要查找没有员工的建筑物,我们需要首先编写一个 SQL 查询,从建筑物表中选择building_id 和building_name 列。

第 2 步:接下来,我们需要在查询中使用 NOT IN 子句来过滤掉有员工的任何建筑物。为此,我们需要使用一个子查询从员工表中选择building_id 列。子查询是嵌套在另一个 SQL 查询中的 SQL 查询。您需要很好地理解 SQL 语法才能编写子查询。

步骤 3:最后,我们可以运行 SQL 查询并返回没有员工的建筑物列表。这将为我们提供没有员工在场的任何建筑物的building_id 和building_name 列的输出。

输出


Q2:编写一个查询,显示自 2022 年 6 月 4 日起的过去 7 天内有多少用户进行了 5 次以上搜索。

表:searches(搜索量)

解决方案

步骤 1:首先,我们将获取 user_id 的总搜索次数。为此,我们需要使用 GROUP BY 子句。 GROUP BY 是一个 SQL 子句,它允许我们根据指定的列将数据分组在一起。

步骤 2:接下来,我们要过滤过去 7 天的数据。我们可以将 WHERE 子句与 DATE - INTERVAL“6 天”一起使用,因为它将包含 2022 年 6 月 6 日。

步骤 3:最后,我们要使用 HAVING 子句来获取搜索次数超过 5 次的用户。 HAVING 是 SQL 语法,它允许我们根据特定条件过滤 SQL 查询结果。

输出


Q3:编写一个查询来查找在两天内发出两个不同订单的客户。按 user_id ASC 返回结果。

表:orders(订单)

解决方案

步骤1:首先,我们需要找到每个客户之前的订单,以衡量订单之间的时间间隔。我们将使用LAG函数按 order_date 进行分区以查找之前的订单。 LAG 是一种窗口函数,它返回分区中前一行的值。对于我们的查询,我们需要 LAG(order_date) OVER (PARTITION BY user_id ORDER BY order_date ASC) AS last_order。通过这样做,我们将能够计算两个日期之间的差异。我们将使用如下代码所示的查询。

步骤 2:接下来,我们要创建一个名为“base”的 CTE,然后编写一个 SQL 查询来查找所有唯一用户的最后一个订单在当前订单后 2 天内的所有记录。 CTE 或公用表表达式是一种 SQL 构造,可用于写入临时结果集。我们需要使用 DATE_PART 函数来获取当前订单之间的天数差异。 DATE_PART 是一个 SQL 函数,它返回指定日期中的某天。语法为 date_part('day',order_date-last_order)<=2,因为我们希望识别在两天窗口内发出两个不同订单的所有客户。

步骤 3:最后,现在我们的查询返回所有唯一用户,我们可以轻松地按 user_id 排序并按升序返回结果。

输出


高级 SQL 问题

干得好,如果您已经阅读了本文,那么您已经涵盖了一些最常见的初级到中级 SQL 问题!

在最后一节中,我们将在初级和中级 SQL 问题中介绍的内容的基础上,提出更复杂的 SQL 问题,测试您使用函数和子句的组合检索正确解决方案的能力。


Q1:编写一个查询,查找每个客户在同一天提出 2 个或多个出价的当天的第二个最早出价。请返回客户 ID、订单日期和第二次出价 ID。

表:bids(出价)

解决方案

步骤 1:首先,我们需要找到所有订单按下单当天(不包括时间)的订单顺序。我们将 order_datetime 转换为 ::DATE,因为这是输出中请求的返回值。我们按客户 ID 和订单日期时间对所有订单进行 RANK(),并将其转换为 ::DATE,以便我们生成的序列将为每个客户和每一天重新启动排名,无论订单的时间如何。

步骤 2:然后我们将步骤 1 转化为 CTE(称为“排名”)。我们可以简单的查询每天的第二个订单。 CTE 代表公共表表达式,可用于简化 SQL 中的查询。然后,我们使用WITH子句来命名CTE(称为“排名”)并在SQL查询本身中引用它。

步骤3:最后,我们使用WHERE子句过滤掉除第二次出价的order_datetime之外的所有结果。

输出


Q2:编写一个查询来查找所有在公司工作时间超过一年的二级和三级经理。请按任职时间从长到短的顺序对经理进行排序。

表:employee(员工)

解决方案

步骤 1:首先,我们需要获取高层管理人员名单;没有经理的员工是顶级员工,我们分配级别 1。我们可以通过查询员工表并使用 WHERE 子句来实现此目的,managerid 为 NULL 。

步骤 2:接下来,我们需要在第一步中使用 CTE 来查询具有第一个结果中列出的经理的下属的相同数据。我们可以通过仅查询拥有 1 级经理(如 CTE 结果所示)的员工来识别 2 级。

步骤 3:现在我们有了二级候选人的列表,让我们使用RECURSIVE CTE 来获取所有级别的员工。

CTE 的 RECURSIVE 命令指示查询首先运行非递归项(UNION ALL 之前的查询),然后根据返回结果运行递归项(UNION ALL 之后的查询)。

使用 UNION ALL 组合了所有可能结果集中的数据,而不删除重复项,以便我们获得完整的员工名册。我们将递归项 INNER JOIN 到非递归项,以便将结果限制为仅包含前一个结果集中有经理的员工。

步骤 4:由于我们不需要所有结果和所有列,因此更新最终的 SELECT 语句以仅提供请求的数据。 WHERE 子句使用 BETWEEN 语句来指定我们只需要第二级和第三级管理器,具体取决于我们在 CTE 中分配的级别。

我们按 date_joined 升序排序,将经理按请求的顺序排列(最旧的日期在有序列表中较高)。

输出


Q3:您需要查看自 2022 年 6 月 1 日开始的 14 天日志,以查找缺失的数据。确定哪些用户丢失了数据以及丢失的日期。

表:log entries(日志数据)

解决方案

步骤 1:首先,我们需要生成应出现在日志数据中的日期列表。我们使用 RECURSIVE CTE 循环遍历日志范围中的可能日期。 RECURSIVE CTE 是一种 SQL 函数,它允许我们在自己的 SQL 查询中引用自身。

我们将使用此 CTE 来迭代每个可能的日期。为了开始序列,我们找到最早的 (MIN()) 进入日期。我们通过选择第二天(+ INTERVAL '1 天')继续递归,直到到达日志末尾。

WHERE 子句使用子查询查找日志中的最后一个 (MAX()) 日期并在那里结束递归。我们使用此递归来循环遍历该范围内的所有可能的日期。如果我们要选择不同的数据日期,并且数据集中完全缺少一个日期(即对于所有用户),我们将无法返回该日期作为应该存在的结果。

步骤 2:接下来,我们将找到数据集中应包含的所有用户的列表,以便将其与数据集中应包含的所有日期连接起来,并创建总预期值的列表。

步骤 3:最后,我们将现有数据连接到预期数据并检查是否有丢失的信息。我们左连接我们的用户 CTE,以创建用户和 dtrng 之间可能的组合列表。交叉连接也可能是合适的。

条件 ON 1=1 只是允许将一个表中的所有行连接到另一表中的所有行,从而创建所有可能组合的列表。我们再次 LEFT JOIN 日志数据来提取所有实际数据并尝试将其与预期数据进行匹配。

日志数据中缺少的任何应与可能结果匹配的记录将为这些字段返回 NULL。 WHERE 标准搜索这些 NULL 记录,为我们提供预期但未收到的返回结果。

输出


最常见的 SQL 概念

1. 规范化和非规范化有什么区别?

答:规范化是在数据库中组织数据的过程,以最大限度地减少冗余并确保数据完整性。非规范化涉及通过添加冗余数据来打破这种结构以提高性能,同时可能会牺牲一定程度的准确性和一致性。


2. 什么是 SQL 连接,它们如何工作?

答:SQL 连接用于根据数据库中两个或多个表之间的公共字段组合数据。 SQL 连接有多种不同类型,包括内连接、左连接、右连接和外连接。每种类型的工作方式略有不同,以根据正在执行的查询类型来实现所需的结果集。

例如,SQL 内联接将仅返回与指定字段具有匹配值的记录,而 SQL 左联接将返回一个表中的所有记录以及另一表中的所有匹配记录。一般来说,SQL 连接用于高效、准确地组合多个表中的数据,以回答复杂的业务问题或执行分析任务。


3.表和数据库有什么区别?

答:表通常是数据库中数据的集合,组织为行和列。另一方面,数据库是一个或多个相关表以及其他 SQL 对象(如视图和存储过程)的集合。一般来说,数据库用于存储和组织大量数据,而表用于存储和操作数据库内的较小数据集。


4. 你能解释一下不同类型的SQL命令吗?

答:SQL 命令通常可分为两类:数据操作命令(用于从 SQL 数据库更新或检索数据)和 SQL 语句(用于各种不同的管理和分析目的)。

数据操作命令包括:​​SELECT、INSERT、UPDATE 和 DELETE。

SQL 命令包括:​​CREATE TABLE、ALTER TABLE、TRUNCATE TABLE 和 DROP TABLE。


5.什么是SQL子查询,如何使用它们来执行复杂查询?

答:SQL 子查询用于查询 SQL 数据库中的数据。它们允许您利用 SQL 强大的 JOIN 运算符和其他 SQL 函数来执行更复杂和更强大的查询。

例如,您可以使用 SQL 子查询根据主 SQL 查询中不可用的条件来过滤数据。子查询还可用于执行更高级的 SQL 操作,例如组合多个表中的数据、执行自联接或从相关 SQL 表中检索数据。


6. 主键的示例是什么?它是如何运作的?

答案:主键是表中的一列或一组列,用于唯一标识表中的每条记录。它通常由一个或多个包含唯一值且绝不能为 null 或空的字段组成。 SQL 使用主键通过确保表中的每条记录都具有唯一标识符来强制数据完整性,并且可以通过消除不具有匹配主键值的记录来更有效地执行联接。


7. 唯一键是什么?它是如何运作的?

答:唯一键是标识 SQL 表中记录的一列或一组列,但不一定是主键。与主键不同,唯一键可以包含 null 或空值,并且在表中是唯一的。 SQL 使用唯一键通过确保表中没有重复记录来强制数据一致性。


8. 外键的示例是什么?它是如何运作的?

答:SQL 外键是关系数据库管理系统下一个 SQL 表中引用另一个表的主键的一列或一组列。换句话说,外键充当两个表之间的关系或链接。在查询中使用时,外键允许您一次组合和查询多个表中的数据,并且还可以用于强制引用完整性。


9. 表和字段如何工作?

答:表是SQL数据存储和组织的基本单位。每个表包含一个或多个字段,用于在记录中存储数据。 SQL 表可以包含任何类型的 SQL 数据,包括文本、数字、日期和二进制数据。每个字段通常对应一列,每个表中存储一条或多条记录。


10. 什么时候你想使用 HAVING() 而不是 WHERE 子句?

答:HAVING子句用于对数据进行过滤或聚合,类似于WHERE子句。但是,HAVING 子句通常用于基于聚合函数过滤数据,例如 SUM()、AVG()、MAX()、MIN() 等。这允许您对聚合数据而不是原始数据执行过滤。例如,您可以使用 HAVING 子句根据表中所有记录的平均价格来过滤数据,或者根据符合特定条件的记录总数来过滤数据。


11.什么是SQL运算符?它是如何运作的?

答:SQL 运算符是用于执行特定数据库操作的命令,例如过滤数据、执行联接和子查询、从表中选择以及执行 SQL 分组和聚合。运算符可以单独或组合使用来执行多种操作,例如过滤、分组、排序、聚合和 SQL 统计计算。




uuid怎么下载(免费) | 求资源
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。 如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
标签
sql
author
pings

每天都在打酱油~

评论
登录后评论