0


【力扣10天SQL入门】Day5+6 合并表

175.组合两个表

  1. 表: Person
  2. +-------------+---------+
  3. | 列名 | 类型 |
  4. +-------------+---------+
  5. | PersonId | int |
  6. | FirstName | varchar |
  7. | LastName | varchar |
  8. +-------------+---------+
  9. personId 是该表的主键列。
  10. 该表包含一些人的 ID 和他们的姓和名的信息。
  11. +-------------+---------+
  12. | 列名 | 类型 |
  13. +-------------+---------+
  14. | AddressId | int |
  15. | PersonId | int |
  16. | City | varchar |
  17. | State | varchar |
  18. +-------------+---------+
  19. addressId 是该表的主键列。该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。
  20. 编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null
  21. 输入:
  22. Person表:
  23. +----------+----------+-----------+
  24. | personId | lastName | firstName |
  25. +----------+----------+-----------+
  26. | 1 | Wang | Allen |
  27. | 2 | Alice | Bob |
  28. +----------+----------+-----------+
  29. Address表:
  30. +-----------+----------+---------------+------------+
  31. | addressId | personId | city | state |
  32. +-----------+----------+---------------+------------+
  33. | 1 | 2 | New York City | New York |
  34. | 2 | 3 | Leetcode | California |
  35. +-----------+----------+---------------+------------+
  36. 输出:
  37. +-----------+----------+---------------+----------+
  38. | firstName | lastName | city | state |
  39. +-----------+----------+---------------+----------+
  40. | Allen | Wang | Null | Null |
  41. | Bob | Alice | New York City | New York |
  42. +-----------+----------+---------------+----------+

答案解析

左连接, personId 相同的连接在一块

  1. SELECT A.firstName, A.lastName, B.city, B.state
  2. FROM person A LEFTJOIN address B ON A.personId = B.personId

1581.进店却未进行过交易的顾客

  1. 表:Visits
  2. +-------------+---------+
  3. | Column Name | Type |
  4. +-------------+---------+
  5. | visit_id | int |
  6. | customer_id | int |
  7. +-------------+---------+
  8. visit_id 是该表的主键。该表包含有关光临过购物中心的顾客的信息。
  9. 表:Transactions
  10. +----------------+---------+
  11. | Column Name | Type |
  12. +----------------+---------+
  13. | transaction_id | int |
  14. | visit_id | int |
  15. | amount | int |
  16. +----------------+---------+
  17. transaction_id 是此表的主键。此表包含 visit_id 期间进行的交易的信息。
  18. 有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个 SQL 查询,来查找这些顾客的 ID ,以及他们只光顾不交易的次数。
  19. 返回以 任何顺序 排序的结果表。
  20. +-------------+----------------+
  21. | customer_id | count_no_trans |
  22. +-------------+----------------+
  23. | 54 | 2 |
  24. | 30 | 1 |
  25. | 96 | 1 |
  26. +-------------+----------------+

答案解析

先通过联表查出来没有进行发生过交易的visit,
然后对这些查询结果按照customer_id分组,统计customer_id 和每组的数目

  1. SELECT customer_id,count(visit_id) count_no_trans
  2. FROM(SELECTdistinct A.visit_id, A.customer_id
  3. FROM visits A LEFTJOINtransactions B ON A.visit_id = B.visit_id
  4. WHERE B.amount ISNULL) C
  5. GROUPBY C.customer_id

也可以直接查 visits 中没有在 transactions 中出现过的数据,然后分组计算customer_id相同的数目

  1. SELECT customer_id,count(visit_id) count_no_trans
  2. FROM visits
  3. WHERE visit_id NOTIN(SELECTdistinct visit_id FROMtransactions)GROUPBY customer_id```

1148.文章浏览 I

  1. Views 表:
  2. +---------------+---------+
  3. | Column Name | Type |
  4. +---------------+---------+
  5. | article_id | int |
  6. | author_id | int |
  7. | viewer_id | int |
  8. | view_date | date |
  9. +---------------+---------+
  10. 此表无主键,因此可能会存在重复行。
  11. 此表的每一行都表示某人在某天浏览了某位作者的某篇文章。
  12. 请注意,同一人的 author_id viewer_id 是相同的。
  13. 请编写一条 SQL 查询以找出所有浏览过自己文章的作者,结果按照 id 升序排列。
  14. Views 表:
  15. +------------+-----------+-----------+------------+
  16. | article_id | author_id | viewer_id | view_date |
  17. +------------+-----------+-----------+------------+
  18. | 1 | 3 | 5 | 2019-08-01 |
  19. | 1 | 3 | 6 | 2019-08-02 |
  20. | 2 | 7 | 7 | 2019-08-01 |
  21. | 2 | 7 | 6 | 2019-08-02 |
  22. | 4 | 7 | 1 | 2019-07-22 |
  23. | 3 | 4 | 4 | 2019-07-21 |
  24. | 3 | 4 | 4 | 2019-07-21 |
  25. +------------+-----------+-----------+------------+
  26. 结果表:
  27. +------+
  28. | id |
  29. +------+
  30. | 4 |
  31. | 7 |
  32. +------+

答案解析

查询author_id 和 viewer_id 相等

  1. SELECTdistinct author_id id
  2. FROM views
  3. WHERE author_id = viewer_id
  4. ORDERBY id

197.上升的温度

  1. 表: Weather
  2. +---------------+---------+
  3. | Column Name | Type |
  4. +---------------+---------+
  5. | id | int |
  6. | recordDate | date |
  7. | temperature | int |
  8. +---------------+---------+
  9. id 是这个表的主键,该表包含特定日期的温度信息
  10. 编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id
  11. 返回结果 不要求顺序
  12. 输入:
  13. Weather 表:
  14. +----+------------+-------------+
  15. | id | recordDate | Temperature |
  16. +----+------------+-------------+
  17. | 1 | 2015-01-01 | 10 |
  18. | 2 | 2015-01-02 | 25 |
  19. | 3 | 2015-01-03 | 20 |
  20. | 4 | 2015-01-04 | 30 |
  21. +----+------------+-------------+
  22. 输出:
  23. +----+
  24. | id |
  25. +----+
  26. | 2 |
  27. | 4 |
  28. +----+
  29. 解释:
  30. 2015-01-02 的温度比前一天高(10 -> 25
  31. 2015-01-04 的温度比前一天高(20 -> 30

答案解析

DATEDIFF在MySQL中的用法

  1. DATEDIFF(date1,date2)# 返回date1 - date2 相差的天数

自连接, 查询后一天且温度大的

  1. SELECT A.id
  2. FROM weather A, Weather B
  3. WHERE A.Temperature > B.Temperature AND DATEDIFF(A.recordDate, B.recordDate)=1

607.销售员

  1. 表: SalesPerson
  2. +-----------------+---------+
  3. | Column Name | Type |
  4. +-----------------+---------+
  5. | sales_id | int |
  6. | name | varchar |
  7. | salary | int |
  8. | commission_rate | int |
  9. | hire_date | date |
  10. +-----------------+---------+
  11. sales_id 是该表的主键列。该表的每一行都显示了销售人员的姓名和 ID ,以及他们的工资、佣金率和雇佣日期。
  12. 表: Company
  13. +-------------+---------+
  14. | Column Name | Type |
  15. +-------------+---------+
  16. | com_id | int |
  17. | name | varchar |
  18. | city | varchar |
  19. +-------------+---------+
  20. com_id 是该表的主键列。该表的每一行都表示公司的名称和 ID ,以及公司所在的城市。
  21. 表: Orders
  22. +-------------+------+
  23. | Column Name | Type |
  24. +-------------+------+
  25. | order_id | int |
  26. | order_date | date |
  27. | com_id | int |
  28. | sales_id | int |
  29. | amount | int |
  30. +-------------+------+
  31. order_id 是该表的主键列。
  32. com_id Company 表中 com_id 的外键。
  33. sales_id 是来自销售员表 sales_id 的外键。
  34. 该表的每一行包含一个订单的信息。这包括公司的 ID 、销售人员的 ID 、订单日期和支付的金额。
  35. 编写一个SQL查询,报告没有任何与名为 RED 的公司相关的订单的所有销售人员的姓名。
  36. 输入:
  37. SalesPerson 表:
  38. +----------+------+--------+-----------------+------------+
  39. | sales_id | name | salary | commission_rate | hire_date |
  40. +----------+------+--------+-----------------+------------+
  41. | 1 | John | 100000 | 6 | 4/1/2006 |
  42. | 2 | Amy | 12000 | 5 | 5/1/2010 |
  43. | 3 | Mark | 65000 | 12 | 12/25/2008 |
  44. | 4 | Pam | 25000 | 25 | 1/1/2005 |
  45. | 5 | Alex | 5000 | 10 | 2/3/2007 |
  46. +----------+------+--------+-----------------+------------+
  47. Company 表:
  48. +--------+--------+----------+
  49. | com_id | name | city |
  50. +--------+--------+----------+
  51. | 1 | RED | Boston |
  52. | 2 | ORANGE | New York |
  53. | 3 | YELLOW | Boston |
  54. | 4 | GREEN | Austin |
  55. +--------+--------+----------+
  56. Orders 表:
  57. +----------+------------+--------+----------+--------+
  58. | order_id | order_date | com_id | sales_id | amount |
  59. +----------+------------+--------+----------+--------+
  60. | 1 | 1/1/2014 | 3 | 4 | 10000 |
  61. | 2 | 2/1/2014 | 4 | 5 | 5000 |
  62. | 3 | 3/1/2014 | 1 | 1 | 50000 |
  63. | 4 | 4/1/2014 | 1 | 4 | 25000 |
  64. +----------+------------+--------+----------+--------+
  65. 输出:
  66. +------+
  67. | name |
  68. +------+
  69. | Amy |
  70. | Mark |
  71. | Alex |
  72. +------+
  73. 根据表 orders 中的订单 '3' '4' ,容易看出只有 'John' 'Pam' 两个销售员曾经向公司 'RED' 销售过。
  74. 所以我们需要输出表 salesperson 中所有其他人的名字。

答案解析

先在Company 表中查出公司RED的公司ID
再在Orders 表中查出这个公司的订单涉及的 sales_id
最后查询SalesPerson 表中 查询不在涉及名单中的人名

  1. SELECT A.name
  2. FROM salesperson A
  3. WHERE A.sales_id NOTIN(SELECT C.sales_id as id
  4. FROM orders C
  5. WHERE C.com_id IN(SELECT B.com_id
  6. FROM Company B
  7. WHERE B.name ='RED'))

总结

  1. 联表查询,左连接
  2. GROUP BY 和 count
  3. DATEDIFF(date1,date2) # 返回date1 - date2 相差的天数
  4. 经典子查询
标签: leetcode sql 算法

本文转载自: https://blog.csdn.net/weixin_44179010/article/details/125479513
版权归原作者 ly甲烷 所有, 如有侵权,请联系我们删除。

“【力扣10天SQL入门】Day5+6 合并表”的评论:

还没有评论