Leetcode SQL基础50题

发布于:2025-08-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

1148. 文章浏览 I

在这里插入图片描述
在这里插入图片描述

用distinct函数去重

select distinct viewer_id as id 
from Views 
where author_id=viewer_id  
order by id asc;

先用group函数再用order函数

select   viewer_id as id
from Views
where author_id=viewer_id
group by author_id
order by author_id asc;

1378. 使用唯一标识码替换员工ID

在这里插入图片描述
在这里插入图片描述

select unique_id,name 
from Employees left join EmployeeUNI 
on Employees.id=EmployeeUNI.id;
连接类型 官方名称 核心规则 未匹配数据的处理
JOIN 内连接(INNER) 只保留表A和表B中完全匹配(满足 ON 条件)的记录。 两边未匹配的记录全部丢弃
LEFT JOIN 左外连接 保留表A的全部记录,再匹配表B中符合条件的记录。 表B未匹配的字段显示 NULL
RIGHT JOIN 右外连接 保留表B的全部记录,再匹配表A中符合条件的记录。 表A未匹配的字段显示 NULL

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

在这里插入图片描述
在这里插入图片描述

SELECT 
    v.customer_id, 
    COUNT(v.visit_id) AS count_no_trans  -- 统计该客户没有交易的访问次数
FROM 
    Visits v 
LEFT JOIN 
    Transactions t ON v.visit_id = t.visit_id
WHERE 
    t.transaction_id IS NULL  -- 筛选没有交易的访问记录
GROUP BY 
    v.customer_id;

197. 上升的温度

在这里插入图片描述
在这里插入图片描述
在只有一张表的情况下找表内数据的对应关系,可以通过连接方式将一张表变成两张表进行解题(JOIN),题干中要求找比前一天温度高的ID,两表对应关系可以通过日期 recordDate 建立连接等式,今天=昨天+1(时间日期函数DATEADD)或者今天-昨天=1(时间日期函数DATEDIFF),最后通过WHERE限制语句,比较连接表中temperature(int型数据)的大小。

SELECT a.id AS id
FROM Weather a
JOIN Weather b
ON a.recordDate = DATE_ADD(b.recordDate,INTERVAL 1 DAY)
WHERE a.temperature > b.temperature;

1661. 每台机器的进程平均运行时间

在这里插入图片描述
在这里插入图片描述

在这里插入代码片
select a.machine_id AS 'machine_id',
       ROUND(AVG(b.timestamp - a.timestamp) ,3) AS  'processing_time'
from Activity a join Activity b 
on a.machine_id=b.machine_id and 
   a.process_id =b.process_id and 
   a.activity_type = 'start' AND b.activity_type = 'end'
group by a.machine_id;

如果不用join怎么只用一张表来做

# Write your MySQL query statement below
SELECT machine_id AS 'machine_id',
    ROUND(
        SUM(IF(activity_type = 'start', -timestamp, timestamp))
        / COUNT(*) 
        * 2
        ,3) AS 'processing_time'
FROM Activity
GROUP BY machine_id
;

或者用distinct,用不用*2了

# Write your MySQL query statement below
SELECT machine_id AS 'machine_id',
    ROUND(
        SUM(IF(activity_type = 'start', -timestamp, timestamp))
        / COUNT(DISTINCT process_id) 
        ,3) AS 'processing_time'
FROM Activity
GROUP BY machine_id
;

也可以用case when then else end来判断

# Write your MySQL query statement below
SELECT machine_id AS 'machine_id',
    ROUND(
        SUM(
            CASE
                WHEN activity_type = 'start' THEN -timestamp
                ELSE timestamp
            END
        )
        / COUNT(DISTINCT process_id) 
    , 3) AS 'processing_time'
FROM Activity
GROUP BY machine_id
;

1280. 学生们参加各科测试的次数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

https://leetcode.cn/problems/students-and-examinations/solutions/3747647/mei-ge-bu-zou-xiang-jie-xiao-bai-ye-neng-m6le/?envType=study-plan-v2&envId=sql-free-50

CROSS JOIN:交叉连接,对表中每一行进行两两连接,即每个ID都将对应上所有的科目subject_name,不需要匹配条件

SELECT SS.student_id, SS.student_name,  SU.subject_name, COUNT(ES.subject_name) AS attended_exams
FROM Students SS
CROSS JOIN Subjects SU
LEFT JOIN Examinations ES
ON SS.student_id = ES.student_id
   AND SU.subject_name = ES.subject_name
GROUP BY student_id, subject_name
ORDER BY student_id, subject_name ;

网站公告

今日签到

点亮在社区的每一天
去签到