SQL刷题记录
明天考数据库概论,今天晚上刷几道常考的连接题巩固一下
以下皆出自力扣高频SQL50题

文章目录
25.12.23
1378
"展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充"由此可知:
需要用到左外连接,左表是Employees
sql
select unique_id,name
from Employees a
left join EmployeeUNI b
on a.id = b.id;
1068
简答的内连接
sql
select p.product_name,s.year,s.price
from Sales s
join Product p
on s.product_id = p.product_id;
要给列名加前缀,不加可能会超时
| 方面 | 不加前缀(如 product_name) |
加前缀(如 p.product_name) |
|---|---|---|
| 正确性 | 可能出错(字段重名时) | 安全明确 |
| 可读性 | 较差 | 清晰直观 |
| 执行效率 | 几乎无差别 | 几乎无差别(解析阶段略优) |
| 工程规范 | 不推荐 | 强烈推荐 |
1581
- 先用左外连接,得到
vistits表中每个customer_id对应的transaction_id,连接条件是两表的visit_id相等 - 用
where transaction_id is null筛选出没有进行交易的 - 给筛选后的表用
group by按照customer_id进行分组,并用count求出每组的个数
sql
select customer_id,count(*) as count_no_trans
from Visits
left join Transactions
on Visits.visit_id = Transactions.visit_id
where transaction_id is null
group by customer_id;
197
sql
select w1.id as id
from Weather w1,Weather w2
where datediff(w1.recordDate,w2.recordDate) = 1
and w1.Temperature > w2.Temperature;
from Weather w1,Weather w2
- 将
Weather表和自己做笛卡尔积(隐式连接),生成所有可能的(w1, w2)记录对。 w1代表"当前天",w2代表"对比的另一天"
datediff(w1.recordDate,w2.recordDate) = 1筛选"相邻两天
DATEDIFF是 SQL 中用于计算两个日期之间相差天数的函数返回
date1 - date2的整数天数差(只考虑日期部分,忽略时间)
w1.Temperature > w2.Temperature筛选温度升高
1661
sql
select a1.machine_id as 'machine_id',
ROUND(AVG(a2.timestamp - a1.timestamp)
,3) as 'processing_time'
from Activity as a1
join Activity as a2
on a1.machine_id = a2.machine_id
and a1.process_id = a2.process_id
and a1.activity_type = 'start'
and a2.activity_type = 'end'
group by a1.machine_id;
1 .FROM Activity AS a1 JOIN Activity AS a2自连接
- 将
Activity表与自身连接,生成所有可能的记录对(a1, a2)。
2.连接条件
sql
a1.machine_id = a2.machine_id
and a1.process_id = a2.process_id
and a1.activity_type = 'start'
and a2.activity_type = 'end'
这四个条件确保:
- 同一台机器 (
machine_id相同) - 同一个任务 (
process_id相同) - a1 是开始事件 (
activity_type = 'start') - a2 是结束事件 (
activity_type = 'end')
3.计算处理时间
a2.timestamp - a1.timestamp
4.按机器分组并求平均
sql
GROUP BY a1.machine_id
- 将同一台机器的所有任务处理时间聚合在一起。
AVG(...)计算该机器所有任务的平均处理时间。
5.保留三位小数
sql
ROUND(AVG(...), 3)