【SQL题解】力扣高频 SQL 50题|DAY5

SQL刷题记录

今天上午考完了数据库概论,以后会继续更完力扣上的

以下皆出自力扣高频SQL50题

文章目录

25.12.24

577

577. 员工奖金

sql 复制代码
select name, bonus
from Employee left join Bonus
on Employee.EmpId = Bonus.EmpId
where bonus is null or bonus < 1000;

先进行左外查询,Employee为左表

然后筛选出bonus为空或者小于1000的

1934

1934. 确认率

sql 复制代码
# Write your MySQL query statement below
SELECT
    s.user_id,
    ROUND(IFNULL(AVG(c.action='confirmed'), 0), 2) AS confirmation_rate
FROM
    Signups AS s
LEFT JOIN
    Confirmations AS c
ON
    s.user_id = c.user_id
GROUP BY
    s.user_id;

确认率 是 'confirmed' 消息的数量除以请求的确认消息的总数

  1. c.action = 'confirmed'
    • 在 MySQL 中,布尔表达式会返回 1(真)或 0(假)
    • 所以当 action 是 'confirmed' 时,结果为 1;否则为 0
  2. AVG(c.action='confirmed')
    • 对每个用户的所有确认记录,计算 'confirmed' 的平均值
    • 例如:如果有 3 条记录,其中 2 条是 'confirmed',则 AVG = (1+1+0)/3 = 0.666...
  3. IFNULL(..., 0)
    • 如果某个用户在 Confirmations 表中没有任何记录 ,那么 AVG(...) 的结果会是 NULL
    • IFNULL 将 NULL 替换为 0,表示确认率为 0。
  4. ROUND(..., 2)
    • 将结果四舍五入保留 2 位小数

1251

1251. 平均售价

查找每种产品的平均售价,average_price 应该 四舍五入到小数点后两位。如果产品没有任何售出,则假设其平均售价为 0。

sql 复制代码
select p.product_id, 
ifnull( round(sum(price*units)/sum(units),2) ,0) 
as average_price 
from prices p 
left join UnitsSold u 
on p.product_id=u.product_id 
and purchase_date between start_date and end_date 
group by p.product_id;

1075

1075. 项目员工 I

sql 复制代码
SELECT
    a.project_id,
    ROUND(AVG(b.experience_years), 2) AS average_years
FROM
    Project a
JOIN
    Employee b
ON
    a.employee_id = b.employee_id
GROUP BY
    a.project_id;

以id相同为条件连接两个表,按照id分组,分别计算平均年限

1141

1141. 查询近30天活跃用户数

sql 复制代码
SELECT 
    activity_date as day, count(DISTINCT user_id) AS active_users
FROM
    Activity
WHERE activity_date BETWEEN 
    "2019-06-28" AND "2019-07-27"
GROUP BY
    activity_date;

在 MySQL 中,BETWEEN ... AND ... 确实可以用于字符串(VARCHAR、CHAR 等)类型的比较 ,包括日期字符串(如 "2019-07-01"),前提是这些字符串具有可排序的格式 (比如 ISO 8601 格式的 YYYY-MM-DD)

** 多表查询**

  • 概述:从多张表中查询数据

  • 笛卡尔积:笛卡尔积是指在数学中,两个集合A和B的所有组合情况(在多表查询时需要消除无用的笛卡尔积)

    select * from emp,dept where emp.dept_id = dept.id;

  • 分类

    • 连接查询

      内连接:相当于查询A、B交集部分数据

      外连接:左外连接:查询左表所有数据以及两张表交集部分数据

      ​ 右外连接:查询右表所有数据,以及两张表交集部分数据

      自连接:当前表与自身的连接查询,自连接必须使用表别名

    • 子查询

相关推荐
考虑考虑11 小时前
JDK26中的Map.ofLazy
java·后端·java ee
云浪12 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
苏三的开发日记13 小时前
Docker 启动顺序优化(CentOS / Ubuntu)
后端
高频因子挖掘机14 小时前
同一交易日出现重复 K 线:去重前先确认时间、来源和粒度
后端·github·api
feely020815 小时前
《我写了 31 个静态扫描插件,踩了 7 个「假绿」》
后端
橙子家16 小时前
参数校验类异常(Argument Exception)【C# Exception 详解系列一】
后端
掘金挖土16 小时前
前端手摸手跑路之 AI 应用开发(九)
前端·后端
这个DBA有点耶17 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范
全栈弄潮儿17 小时前
Python实战第8期:函数
后端·python·编程语言