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


    175.组合两个表

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

    答案解析

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

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

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

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

    答案解析

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

    SELECT customer_id, count(visit_id) count_no_trans
    FROM (
        SELECT distinct A.visit_id, A.customer_id 
        FROM visits A LEFT JOIN transactions B ON A.visit_id = B.visit_id
        WHERE B.amount IS NULL) C
    GROUP BY C.customer_id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    SELECT customer_id, count(visit_id) count_no_trans 
    FROM visits
    WHERE visit_id NOT IN (SELECT distinct visit_id FROM transactions)
    GROUP BY customer_id```
    
    • 1
    • 2
    • 3
    • 4

    1148.文章浏览 I

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

    答案解析

    查询author_id 和 viewer_id 相等

    SELECT distinct author_id id 
    FROM views
    WHERE author_id = viewer_id
    ORDER BY id
    
    • 1
    • 2
    • 3
    • 4

    197.上升的温度

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

    答案解析

    DATEDIFF在MySQL中的用法

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

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

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

    607.销售员

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

    答案解析

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

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

    总结

    1. 联表查询,左连接
    2. GROUP BY 和 count
    3. DATEDIFF(date1,date2) # 返回date1 - date2 相差的天数
    4. 经典子查询
  • 相关阅读:
    文本检测之DBNet,DBNet++
    android 9 adb安装过程学习(一)
    IEC60068-2-5太阳辐射模拟试验测试
    你在MySQL中加了什么锁,导致死锁的?
    爬虫过程和反爬
    纷享销客连接型CRM怎么样?
    [当前就业]2023年8月25日-计算机视觉就业现状分析
    Java项目:ssm药品管理系统
    CSDN-1044204713-记事本
    前端 diy 功能模块原来如此强大和简单,我这小白也轻松学会了【带附件】
  • 原文地址:https://blog.csdn.net/weixin_44179010/article/details/125479513