SQL刷题记录
今天上午考完了数据库概论,以后会继续更完力扣上的
以下皆出自力扣高频SQL50题

文章目录
25.12.24
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
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' 消息的数量除以请求的确认消息的总数
c.action = 'confirmed'- 在 MySQL 中,布尔表达式会返回
1(真)或0(假) - 所以当
action是'confirmed'时,结果为1;否则为0
- 在 MySQL 中,布尔表达式会返回
AVG(c.action='confirmed')- 对每个用户的所有确认记录,计算
'confirmed'的平均值 - 例如:如果有 3 条记录,其中 2 条是
'confirmed',则AVG = (1+1+0)/3 = 0.666...
- 对每个用户的所有确认记录,计算
IFNULL(..., 0)- 如果某个用户在
Confirmations表中没有任何记录 ,那么AVG(...)的结果会是NULL IFNULL将NULL替换为0,表示确认率为 0。
- 如果某个用户在
ROUND(..., 2)- 将结果四舍五入保留 2 位小数
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
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
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交集部分数据
外连接:左外连接:查询左表所有数据以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
-
子查询
-