SQL学习笔记:Leetcode刷题
1873. 计算特殊奖金
写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0。
- 难点:
返回的列带筛选条件
`if ( 条件,若条件正确则返回,若条件错误则返回`)
判断奇偶
employee_id%2=1
--or
mod(id,2) --=1 是指id是奇数, =0 是指id是偶数
627. 变更性别
编写一个 SQL 查询来交换所有的 ‘f’ 和 ‘m’ (即,将所有 ‘f’ 变为 ‘m’ ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。
- 难点:
update语句
update 表名
set 列名 = 修改后的值
case when
case 列名
when 1 then 2 #将1换为2
when 2 then 3
else 3
end
196. 删除重复的电子邮箱
编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
- 难点:
DELETE
将该表分为两份判断
DELETE p1.*
FROM Person as p1, Person as p2
WHERE p1.email = p2.email AND p1.id>p2.id
1667. 修复表中的名字
编写一个 SQL 查询来修复名字,使得只有第一个字符是大写的,其余都是小写的。
CONCAT
CONCAT(' A','B','C')
UPPER, LOWER
LEFT, SUBSTRING
LEFT('123456789',3)
返回左边3项
SUBSTRING('123456789',3)
从第3位开始返回
1484. 按日期分组销售产品
编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。
每个日期的销售产品名称应按词典序排列。
COUNT 计数
DISTINCT 去重
GROUP CONCAT 多个拼接
连接group by的结果集时,可以指定自定义的分隔符,不指定的情况下,默认是 ‘,’
GROUP_CONCAT(DISTINCT product
ORDER BY product ASC
SEPARATOR ',')
解法
SELECT sell_date,
COUNT(DISTINCT product) as num_sold,
GROUP_CONCAT(DISTINCT product
ORDER BY product ASC
SEPARATOR ',') as products
FROM Activities
GROUP BY sell_date #需要将同一销售日期的并在一起
ORDER BY sell_date
1527. 患某种疾病的患者
写一条 SQL 语句,查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。
近似查询
SELECT sell_date,
COUNT(DISTINCT product) as num_sold,
GROUP_CONCAT(DISTINCT product
ORDER BY product ASC
SEPARATOR ',') as products
FROM Activities
GROUP BY sell_date #需要将同一销售日期的并在一起
ORDER BY sell_date
1965. 丢失信息的雇员
写出一个查询语句,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:
雇员的 姓名 丢失了,或者
雇员的 薪水信息 丢失了,
- 思路 :
将salary空白的join到Employees表
left join
A left join B on 关键key条件 WHERE 条件 #将B加到A中
union
1795. 每个产品在不同商店的价格
重构 Products 表,查询每个产品在不同商店的价格,使得输出的格式变为(product_id, store, price) 。如果这一产品在商店里没有出售,则不输出这一行。
SELECT product_id, 'store1' as store, store1 as price FROM Products WHERE store1 is not NULL
UNION
SELECT product_id, 'store2' as store, store2