SQL查询的解决方法有哪些

52次阅读
没有评论

共计 2958 个字符,预计需要花费 8 分钟才能阅读完成。

本篇内容介绍了“SQL 查询的解决方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

查询 1

下列表格由名字和职业两列组成。需要查询所有姓名,且使其后紧跟一个括号,括住“职业”列中对应的首字母。

本文解决方案

SELECT CONCAT(Name,  rsquo;( lsquo;, SUBSTR(Profession, 1, 1),  rsquo;) rsquo;) FROM table;

由于需要把名字和职业结合起来,可以使用 CONCAT。而且因为括号内只需要一个字母,可以使用 SUBSTR 来传递列名、开始索引和结束索引。因为只需要首字母,所以我们将传递 1,1(开始索引包括在内,结束索引不包括在内)。

查询 2

蒂娜需要从她创建的 EMPLOYEES 表中计算所有员工的平均工资,但结果显示的平均值很低,这可能是键盘上的回零键失效了。她希望我们帮助找出错误计算的平均值和实际平均值之间的差异。我们须编写一个查找错误的查询 (实际平均值 - 计算平均值)。

本文解决方案

SELECT AVG(Salary) - AVG(REPLACE(Salary, 0,  rsquo; rsquo;)) FROM table;

需要注意,只有一个表包含了实际工资值。为了创建错误场景,使用 REPLACE 替换 0。接着传递列名、替换值以及用于替换 REPLACE 方法的值。然后,使用聚集函数 AVG 来求平均值的差。

查询 3

给定一个表,它是由节点和父节点两列组成的二元搜索树。需要编写一个查询,以返回按节点值进行升序排序的节点类型。有 3 种类型:

根 (Root) mdash; mdash; 如果节点是根

叶 (Leaf) mdash; mdash; 如果节点是叶

内部 (Inner) mdash; mdash; 如果节点既不是根也不是叶

本文解决方案

经过初步分析,可以得出结论:如果给定节点 N 的相应 P 值为 NULL(空),则它是根。而如果给定节点 N 存在于 P 列中,则它不是内部节点。基于此想法编写一个查询。

SELECT CASE WHEN P IS NULL THENCONCAT(N,   Root) WHEN N IN (SELECTDISTINCT P from BST) THEN CONCAT(N,   Inner) ELSE CONCAT(N,   Leaf) ENDFROM BSTORDER BY N asc;

可使用 CASE 作为开关函数。正如前文提到的,如果对于给定节点 N,P 为空值,则 N 是根。因此,我们使用 CONCAT 来组合节点值和标签。

类似地,如果给定节点 N 存在于 P 列中,则它是内部节点。为了获得 P 列中的所有节点,我们编写了一个返回 P 列中所有不同节点的子查询。由于要求按节点值升序对输出进行排序,因此要使用 ORDER  BY 子句。

查询 4

该事务表由 transaction_id, user_id, transaction_date,product_id, and  quantity(交易 ID,用户 ID,交易日期,产品 ID 和数量) 组成。需要查询多天来购买产品的用户数量 (注意,给定用户可以在一天内购买多个产品)。

本文解决方案

为了解决该查询,不能直接计算 user_id 的出现次数,由于给定用户在一天中可以多次购买,user_id 或许会有多次返回。因此,只有当存在多个不同日期与给定的 user_id 相关联时,才意味着该用户多天购买了产品。按照相同方法,进行查询编写。(内部查询)

SELECT COUNT(user_id) FROM (SELECT user_id FROM orders GROUP BY user_id HAVING COUNT(DISTINCT DATE(date))  1 ) t1

由于问题询问的是 user_id 的数量,而不是 user_id 本身,因此在外部查询中使用 COUNT。

查询 5

给定一个订阅表,其中包含每个用户订阅的开始和结束日期。需要编写一个查询,根据与其他用户的日期重叠情况,为每个用户返回 true/false。例如,如果 user1 的订阅周期与其他任何用户重叠,则查询必须为 user1 返回 true。

本文解决方案

经过初步分析,我们可以知道必须将每项订阅与其他订阅进行比较。将 userA 的开始和结束日期视为 startA   和 endA,类似地,userB 也依此设为 startB 和 endB。如果 startA endB 且 endA startB,则可以说这两个日期范围重叠。我们来举两个例子,先比较一下 U1 和 U3:

startA = 2020 ndash;01 ndash;01 endA = 2020 ndash;01 ndash;31 startB = 2020 ndash;01 ndash;16 endB = 2020 ndash;01 ndash;26

这里可以看出,startA(2020 ndash;01 ndash;01) 小于 endB(2020 ndash;01 ndash;26),那么同样,endA(2020 ndash;01 ndash;31) 大于  startB(2020 ndash;01 ndash;16),因此可以得出结论,日期重叠。类似地,如果比较 U1 和 U4,上述条件就不成立,于是返回 FALSE。

这里还必须确保不会将用户与其自己的订阅进行比较。同时希望运行一个左连接,能够自行将用户与满足条件的其他用户进行匹配。现在,我们将创建同一表的两个副本 S1 和 S2。

SELECT * FROM subscriptions AS s1 LEFT JOIN subscriptions AS s2 ON s1.user_id != s2.user_id AND s1.start_date  =s2.end_date AND s1.end_date  =s2.start_date

给定条件连接,在日期之间存在重叠的情况下,对于 S1 中的每个 user_id,应该存在来自 S2 的 user_id。

输出

可以看到,以防日期重叠,每个用户都有一个对应用户。对于 user1,有 2 行显示其与 2 个用户相匹配。对于用户 4,对应的 ID 为空,表示他与其他任何用户都不匹配。现在,将其全部组合在一起,按照 s1.user_ID 字段进行分组,并检查 s2.user_ID 不为空的用户的值是否为真。

最终查询

SELECT s1.user_id , (CASE WHEN s2.user_idIS NOT NULL THEN 1 ELSE 0 END) AS overlap FROM subscriptions AS s1 LEFT JOIN subscriptions AS s2 ON s1.user_id != s2.user_id AND s1.start_date  =s2.end_date AND s1.end_date  =s2.start_date GROUP BY s1.user_id

使用 CASE 子句根据给定用户的 s2.user_id 值来标记 1 和 0。最终输出如下:

“SQL 查询的解决方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计2958字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)