index
-
175. 组合两个表 (语法题)
-
176. 第二高的薪水 (查询出第一高的, 再查询出比第一高小的)
select MAX(salary) as SecondHighestSalary from Employee where Employee.salary < (select MAX(salary) from Employee);
-
177. 第N高的薪水 (分组(去重) + 排序 + 分页)
-
178. 分数排名 (窗口函数 / count+子查询)
select s1.score,
(
select count(distinct score) from Scores s2 where s1.score <= s2.score
) as `rank`
from Scores s1
order by s1.score desc;
-- 或
select score, dense_rank() over (ORDER BY score desc) as `rank` from Scores; -
181. 超过经理收入的员工 (最好使用子查询, 而不是
select e1.name Employee from Employee as e1
where (select e2.salary from Employee as e2
where e1.managerId = e2.id) < e1.salary;
-- 更快:
select e1.name Employee from Employee as e1
join Employee as e2
where e1.managerId = e2.id AND e1.salary > e2.salary;)
-
180. 连续出现的数字 (太坏了, 这类题: 拼多多面试题:如何找出连续出现N次的内容?)
-
182. 查找重复的电子邮箱 (分组再按条件查询)
-
select c.name as Customers from Customers as c
LEFT join Orders as o
on c.id = o.customerId
where o.id is null; -
-- 查询每个组的最高工资, 先查询每个组(部门)的最高工资, 然后匹对
select b.name as Department,
a.name as Employee,
a.salary as Salary
from Employee as a
join Department as b
on a.departmentId = b.id
join (select MAX(c.salary) as qian, c.departmentId from Employee as c
group by c.departmentId) as d
on d.departmentId = a.departmentId
where a.salary = d.qian; -
185. 部门工资前三高的所有员工 (困难!)
-
197. 上升的温度 (内连接+日期函数)
-
262. 行程和用户(复杂的关系)
-
550. 游戏玩法分析 IV(avg的妙用)
-
584. 寻找用户推荐人 (简单但又有坑)
<=> 操作符和 = 操作符类似,不过 <=> 可以用来判断 NULL 值,具体语法规则为: 当两个操作数均为 NULL 时,其返回值为 1 而不为 NULL; 而当一个操作数为 NULL 时,其返回值为 0 而不为 NULL。
-- select name from Customer where referee_id != 2 or referee_id is null;
select name from Customer where NOT referee_id <=> 2; -
585. 2016年的投资 (添加略复杂, 使用窗口函数更好)
-- tiv_2016 所有满足下述条件金额 之和
-- 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
-- 他所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)。
-- tiv_2016 四舍五入的 两位小数
select
ROUND(SUM(a.tiv_2016), 2) as tiv_2016
from
Insurance as a
where (
select
COUNT(b.tiv_2015)
from
Insurance as b
where
a.pid != b.pid
AND a.tiv_2015 = b.tiv_2015
) >= 1
AND (
select
COUNT(c.pid)
from
Insurance as c
where
a.pid != c.pid
AND a.lat = c.lat
AND a.lon = c.lon
) = 0; -
586. 订单最多的客户 (我觉得这个不是简单题qwq, 首先是语文要仔细看题...)
-- 查找下了 最多订单 的客户的 customer_number 。
-- 测试用例生成后, 恰好有一个客户 比任何其他客户下了更多的订单。
select
c.num as customer_number -- 一开始有输出null但是题目要求不能这样输出, 所以专门判断一次... (但是实际上现在可以去掉这层了, 因为没事了qwq)
from (
select -- 查找点订单的最大值
a.m as mm,
a.num as num
from
(
select -- 查找订单数量
COUNT(b.customer_number) as m,
b.customer_number as num
from
Orders as b
group by
b.customer_number
) as a
group by a.num
ORDER BY a.m DESC
LIMIT 0, 1
) as c
where c.mm is not null; -
601. 体育馆的人流量(能过!=可移植!=最优)
-
602. 好友申请 II :谁有最多的好友(合并: 行转列)
-
607. 销售员(<<简单>>
(誰家簡單題三個表啊?)) -
1070. 产品销售分析 III (真坑, 同一年有多条数据, 也要输出)
-
1084. 销售分析III (having夹逼)
-
1141. 查询近30天活跃用户数 (日期区间)
-
1158. 市场分析 I(略有小坑)
-
1211. 查询结果的质量和占比 (怎么会有人的名字叫
null
) -
1179. 重新格式化部门表 ((列转行)最需要英语的一集)
-
1193. 每月交易 I (mysql的
group by
可以分类字段的别名) -
1204. 最后一个能进入巴士的人 (窗口函数/自定义变量/自连接)
-
1251. 平均售价 (这?简单题)
-
1280. 学生们参加各科测试的次数 (笛卡尔积, 这tm简单题?)
-
1321. 餐馆营业额变化增长 (窗口)
-
1341. 电影评分 (十分综合! 注: 评分要avg求..)
-
1393. 股票的资本损益 (sum(if(,,)))
-
1407. 排名靠前的旅行者 (排序)
-
1484. 按日期分组销售产品 (
GROUP_CONCAT()
需要api: mysql 字符串拼接的几种方式) -
1517. 查找拥有有效邮箱的用户 (正则表达式)
-
1527. 患某种疾病的患者 (正则表达式/like)
-
1581. 进店却未进行过交易的顾客 (纯纯tm的阅读理解)
-
1667. 修复表中的名字 (首字母大写(考察字符串函数))
-
1683. 无效的推文(字符个数
CHAR_LENGTH
, 字节个数LENGTH
) -
1789. 员工的直属部门 (可以窗口函数,但是我看不懂, 也可以
union
, 但是我直接left join + if
) -
1795. 每个产品在不同商店的价格 (
UNION all
) -
1907. 按分类统计薪水 (
UNION all
) -
1965. 丢失信息的雇员 (
left join + union / 数学计数
)