高频 SQL 50 题(基础版)
2023-06-07 21:50:47 0 举报
AI智能生成
高频 SQL 50 题(基础版),数据分析、数据仓库手写必备
作者其他创作
大纲/内容
查询
1757. 可回收且低脂的产品
select<br>product_id <br>from Products <br>where low_fats = 'y' and recyclable ='Y'<br>
584. 寻找用户推荐人
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;
SELECT name FROM customer WHERE referee_id != 2 OR referee_id IS NULL;
select name <br>from customer <br>where ifnull(referee_id,0) != 2<br>-- 不等于还可以这么写:<><br>
595. 大的国家
way1:or
SELECT<br> name, population, area<br>FROM<br> world<br>WHERE<br> area >= 3000000 OR population >= 25000000<br>;<br><br>
way2:union
SELECT<br> name, population, area<br>FROM<br> world<br>WHERE<br> area >= 3000000<br><br>UNION<br><br>SELECT<br> name, population, area<br>FROM<br> world<br>WHERE<br> population >= 25000000<br>;<br><br>
1148. 文章浏览 I<br>
way1:DISTINCT 和 ORDER BY
# Write your MySQL query statement below<br>select <br>distinct author_id as id <br>from Views where author_id = viewer_id <br>order by author_id<br>
1683. 无效的推文
# Write your MySQL query statement below<br>SELECT <br> tweet_id<br>FROM <br> tweets<br>WHERE <br> LENGTH(content) > 15;<br><br>
连接
1378. 使用唯一标识码替换员工ID<br>
# Write your MySQL query statement below<br>select <br>unique_id <br>,name <br>from Employees a left join EmployeeUNI b using(id)<br>
# Write your MySQL query statement below<br>select <br>ifnull(unique_id,null) unique_id <br>,name <br>from Employees a left join EmployeeUNI b using(id)<br>
1068. 产品销售分析 I
way1:left join
select <br> p.product_name,<br> s.year,<br> s.price<br>from Sales s <br>left join Product p<br>on s.product_id=p.product_id<br><br>
1581. 进店却未进行过交易的顾客
way1:left join
SELECT customer_id, count(customer_id) count_no_trans<br>FROM Visits v<br>LEFT JOIN transactions t <br>ON v.visit_id = t.visit_id<br>WHERE transaction_id IS NULL<br>GROUP BY customer_id;<br><br>
way2:not in
SELECT customer_id,count(visit_id) as count_no_trans<br>FROM Visits<br>WHERE visit_id not in (SELECT DISTINCT visit_id FROM Transactions)<br>GROUP BY customer_id<br><br>
197. 上升的温度
方法一:lag()+datediff()
select id<br>from<br> (select <br> id,<br> temperature,<br> recordDate,<br> lag(recordDate,1) over(order by recordDate) as last_date,<br> lag(temperature,1) over(order by recordDate) as last_temperature<br> from Weather) a<br>where temperature > last_temperature and datediff(recordDate, last_date) = 1<br><br>
方法二:笛卡尔积
select <br> b.Id <br>from <br> weather a <br>inner join <br> weather b <br>where <br> DATEDIFF(b.recordDate,a.recordDate)=1 <br>and b.Temperature > a.Temperature;<br><br>
方法三:TIMESTAMPDIFF()<br>
select w1.Id<br>from Weather as w1, Weather as w2<br>where TIMESTAMPDIFF(DAY, w2.RecordDate, w1.RecordDate) = 1 <br>AND w1.Temperature > w2.Temperature<br><br>
方法四:adddate()函数<br>
select a.id <br> from weather a join weather b <br> on (a.recorddate = adddate(b.recorddate,INTERVAL 1 day))<br>where a.temperature > b.temperature<br><br>
方法五:外连接+子查询+Date_ADD()函数
select <br> w.Id<br>from Weather w<br>join (<br> select <br> RecordDate,Temperature<br> from <br> Weather<br>) t1<br>on w.RecordDate = DATE_ADD(t1.RecordDate,INTERVAL 1 day)<br>where w.Temperature > t1.Temperature;<br><br>
1661. 每台机器的进程平均运行时间
way1
select<br> machine_id,<br> round(avg(if(activity_type='start', -timestamp, timestamp))*2, 3) processing_time <br>from Activity <br>group by machine_id<br><br>
way2
# Write your MySQL query statement below<br><br>select <br> machine_id<br>,round(sum((case when activity_type ='end' then timestamp else 0 end) - (case when activity_type ='start' then timestamp else 0 end))/count(distinct process_id ),3) as processing_time <br>from Activity <br>group by machine_id<br>
577. 员工奖金
way1
# Write your MySQL query statement below<br>select<br>name,bonus<br>from Employee e left join Bonus b using(empId)<br>where bonus < 1000 or bonus is null;
1280. 学生们参加各科测试的次数
way1:自连接构建临时表
# Write your MySQL query statement below<br>with aa as (<br> select * from Students,Subjects<br>)<br>select<br> aa.student_id<br>,aa.student_name<br>,aa.subject_name<br>,ifnull(count(s.subject_name),0) as attended_exams<br>from aa <br>left join Examinations s using(student_id,subject_name)<br>group by<br> aa.student_id<br>,aa.student_name<br>,aa.subject_name<br>order by aa.student_id,aa.student_name
# 自连接<br>with cte1 as<br>(<br> select *<br> from students,subjects<br>)<br><br><br>select <br> a.student_id,<br> a.student_name,<br> a.subject_name,<br> ifnull(count(b.subject_name),0) as attended_exams <br>from cte1 a<br>left join Examinations b<br>using(student_id,subject_name)<br>group by 1,2,3<br>order by 1,2,3<br><br>作者:zg104<br>链接:https://leetcode.cn/problems/students-and-examinations/solution/by-zg104-0sww/<br>来源:力扣(LeetCode)<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
570. 至少有5名直接下属的经理
way1:使用临时表进行连接
SELECT<br> Name<br>FROM<br> Employee AS t1 JOIN<br> (SELECT<br> ManagerId<br> FROM<br> Employee<br> GROUP BY ManagerId<br> HAVING COUNT(ManagerId) >= 5) AS t2<br> ON t1.Id = t2.ManagerId<br>;<br>
way2:managerid中出现至少5次的是哪些(group by+having 聚合函数) in<br>
select Name <br>from Employee<br>where Id in<br>(<br> select distinct ManagerId<br> from Employee<br> group by ManagerID<br> having count(ManagerID)>=5<br>)<br><br>
1934. 确认率
way1
# Write your MySQL query statement below<br><br><br>select <br>s.user_id<br>,round(<br> sum(if(c.action = 'confirmed',1,0)) /<br> count(s.user_id)<br> ,2) as confirmation_rate<br>from Signups s left join Confirmations c using(user_id)<br>group by 1
聚合函数
620. 有趣的电影
way1:使用 MOD() 函数
select *<br>from cinema<br>where mod(id, 2) = 1 and description != 'boring'<br>order by rating DESC<br>;<br><br>
way2:(id % 2) = 1来确定奇数
# Write your MySQL query statement below<br>select <br>id,movie,description,rating<br>from cinema<br>where description != 'boring'<br>and (id%2) = 1<br>order by rating desc;
1251. 平均售价
way1
select<br> p.product_id<br>,round((sum(units*price)/sum(units)),2) as average_price<br>from Prices p left join UnitsSold u on p.product_id = u.product_id<br> and purchase_date >= start_date <br> and purchase_date <= end_date<br>group by p.product_id
1075. 项目员工 I
way1:avg
# Write your MySQL query statement below<br>select p.project_id, ROUND(AVG(e.experience_years), 2) as average_years <br>from Project p, Employee e <br>where p.employee_id = e.employee_id <br>group by p.project_id;<br><br>
way2:sum/count
# Write your MySQL query statement below<br>select <br> project_id<br> ,round((sum(experience_years)/count(p.employee_id)),2) as average_years<br>from Project p<br>left join Employee e using(employee_id)<br>group by project_id<br>
1633. 各赛事的用户注册率
way1
# Write your MySQL query statement below<br>select<br>contest_id<br>,round((100*count(user_id)/(select count(1) from Users))<br> ,2) as percentage<br>from Register<br>group by contest_id<br>order by 2 desc,1 asc<br>
1211. 查询结果的质量和占比
way1:
# Write your MySQL query statement below<br><br>select <br>query_name<br>,round((avg(rating/position)),2) as quality<br>,round((sum(if(rating < 3,1,0 ))/count(*)) *100,2) as poor_query_percentage<br>from Queries<br>group by query_name
1193. 每月交易 I
way1
# Write your MySQL query statement below<br>select <br>date_format(trans_date,'%Y-%m') as month<br>,country<br>,count(id) as trans_count<br>,sum(if(state='approved',1,0)) as approved_count<br>,sum(amount) as trans_total_amount<br>,sum(if(state='approved',amount,0)) as approved_total_amount<br>from Transactions<br>group by date_format(trans_date,'%Y-%m'),country
way2
# Write your MySQL query statement below<br>select <br>substr(trans_date,1,7) as month<br>,country<br>,count(id) as trans_count<br>,sum(if(state='approved',1,0)) as approved_count<br>,sum(amount) as trans_total_amount<br>,sum(if(state='approved',amount,0)) as approved_total_amount<br>from Transactions<br>group by substr(trans_date,1,7),country
1174. 即时食物配送 II
way1:子查询
# Write your MySQL query statement below<br><br>select<br> round(sum(if(order_date=customer_pref_delivery_date,1,0))/<br> count(*)<br> *100,2) as immediate_percentage<br>from Delivery where (customer_id,order_date) in (<br> select customer_id,min(order_date) as order_date from Delivery <br> group by customer_id<br>)
550. 游戏玩法分析 IV
way1:子查询,分别确定分子分母
select<br>ifnull(round(<br> count(distinct player_id)/<br> (select count(distinct player_id) from Activity)<br> ,2)<br> ,0) as fraction<br>from Activity<br>where (player_id,event_date) in <br>(<br> select player_id,date(min(event_date)+1) from Activity<br> group by player_id<br>)
way2:inner join ,分别确定分子分母
select <br> round(<br> sum(if((datediff(a.event_date,b.first_date)=1),1,0)<br> )/(select count(distinct player_id) from Activity)<br> ,2<br> ) as fraction<br>from Activity a , (<br> select player_id,min(event_date) as first_date from Activity <br> group by player_id<br>) b where a.player_id = b.player_id
<b>way3:又学到了,配合布尔表达式<br>,把日期变为0或1,avg就可以对日期求平均值<br>b.event_date is not null此时已经是布尔值,<br>b.event_date != null 则为1,为null则为0,avg是对0或1求平均值<br>select</b><br>
select <br>round(avg(b.event_date is not null),2) as fraction<br>from (select <br>player_id,min(event_date) as first_date<br>from Activity <br>group by player_id) a left join Activity b <br>on a.player_id=b.player_id and datediff(b.event_date,a.first_date)=1;<br>
排序和分组
2356. 每位教师所教授的科目种类的数量
way1:
# Write your MySQL query statement below<br>select <br>teacher_id<br>,count(distinct subject_id) as cnt<br>from Teacher<br>group by 1
1141. 查询近30天活跃用户数
way1:
# Write your MySQL query statement below<br>select <br>activity_date as day<br>,count(distinct user_id) as active_users<br>from <br>Activity<br>where datediff('2019-07-27',activity_date) < 30 and activity_date<='2019-07-27'<br>group by activity_date
way2
# Write your MySQL query statement below<br>select activity_date day, count(distinct user_id) active_users<br>from Activity<br>where date_add(activity_date, interval 29 day)>='2019-07-27' and activity_date<='2019-07-27'<br>group by activity_date;<br><br>
1084. 销售分析III
way1
# Write your MySQL query statement below<br><br># 其实题目要求“仅在2019-01-01至2019-03-31之间出售的商品”翻译过来就是“所有售出日期都在这个时间内”,也就是“在这个时间内售出的商品数量等于总商品数量”,这样就不难写出这个语句<br><br><br>select <br>distinct <br> s.product_id<br>,p.product_name<br>from Sales s inner join Product p on s.product_id = p.product_id<br>and s.product_id not in (<br> select product_id from Sales where sale_date not between '2019-01-01' and '2019-03-31'<br>)<br>;
way2
# Write your MySQL query statement below<br><br>select<br>p.product_id,p.product_name<br>from Sales s,Product p <br>where s.product_id = p.product_id<br>group by p.product_id<br>having min(s.sale_date) >= '2019-01-01'<br>and max(s.sale_date) <= '2019-03-31';<br>
596. 超过5名学生的课
way1
# Write your MySQL query statement below<br>select class<br>from (select <br>class<br>,count(distinct student) as num<br>from Courses<br>group by class) as class<br>where num >=5<br><br>
way2
# Write your MySQL query statement below<br>select <br>class<br>from Courses<br>group by class<br>having count(distinct student) >= 5
1729. 求关注者的数量
way1
# Write your MySQL query statement below<br>select <br>user_id<br>,count(distinct follower_id) as followers_count<br>from Followers<br>group by user_id
619. 只出现一次的最大数字
way1
# Write your MySQL query statement below<br>select<br>max(num) as num <br>from (select <br>num as num<br>from MyNumbers<br>group by num<br>having count(num) =1) a<br>
1045. 买下所有产品的客户
思路:因为product table的产品数目固定, 所以只要 groupby customer_id 后只要他们中<br>having count distinct product_key= product table的产品数目,<br>相当于购买了全部的产品<br>
select <br>customer_id<br>from Customer c<br>group by customer_id <br>having count(distinct product_key) =<br>(select count(distinct product_key) from Product)
高级查询和连接
1731. 每位经理的下属员工数量
way1:自连接
select <br> t2.employee_id,<br> t2.name,<br> count(1) as reports_count,<br> round(avg(t1.age)) as average_age<br>from Employees t1, Employees t2<br>where t1.reports_to = t2.employee_id<br>group by 1 <br>order by 1<br><br><br>
1789. 员工的直属部门
way1:union all
# Write your MySQL query statement below<br>SELECT employee_id AS 'employee_id', <br> department_id AS 'department_id'<br>FROM Employee <br>WHERE primary_flag = 'Y'<br>UNION #联合查询,自动去重<br>SELECT employee_id AS 'employee_id', <br> department_id AS 'department_id'<br>FROM Employee<br>GROUP BY employee_id<br>HAVING COUNT(department_id) = 1<br>;<br><br>
way2
# Write your MySQL query statement below<br><br>SELECT<br> employee_id<br> ,IF(<br> COUNT(department_id)=1<br> ,department_id<br> ,MAX(<br> IF(primary_flag="Y",department_id,NULL)<br> )<br> ) AS department_id<br>FROM<br> Employee<br>GROUP BY<br> employee_id<br><br>
way3
/* Write your T-SQL query statement below */<br>select employee_id, department_id from<br>(<br> select <br> *,<br> count(*) over(partition by employee_id) as cnt<br> from Employee<br>) a <br>where primary_flag='Y' or cnt=1<br><br>
way4
# Write your MySQL query statement below<br>select <br>employee_id,department_id<br>from Employee<br>where primary_flag ='Y'<br>or employee_id in (<br>select distinct employee_id from Employee <br>group by employee_id<br>having count(employee_id) = 1<br>)<br><br> <br><br>
# Write your MySQL query statement below<br>select <br>employee_id,department_id<br>from Employee<br>where primary_flag ='Y'<br>or employee_id not in (<br>select distinct employee_id from Employee <br>group by employee_id<br>having count(employee_id) >1<br>)<br><br> <br><br>
610. 判断三角形
way1
# Write your MySQL query statement below<br>select<br>x,y,z<br>,case when <br> x+y >z and x+z >y and y+z >x then 'Yes'<br>else 'No' end as triangle<br><br>from Triangle
select<br> x,y,z,if(x+y>z and x+z>y and y+z >x,'Yes','No') as triangle<br>from Triangle
180. 连续出现的数字
way1:自关联
# Write your MySQL query statement below<br>select<br><br>distinct a.Num ConsecutiveNums<br>from Logs a,Logs b,Logs c<br>where a.id = b.id -1 and b.id = c.id -1<br>and a.Num = b.Num and b.Num = c.Num
way2:考点:窗口函数lag, lead, row_number
select <br> distinct t.num as ConsecutiveNums <br>from<br>(<br> select<br> num,<br> lag(num, 1) over(order by id) as num1,<br> lag(num, 2) over(order by id) as num2<br> from Logs <br>) t<br>where t.num = t.num1 and t.num1 = t.num2<br>;<br><br>
select <br> distinct t.num as ConsecutiveNums <br>from<br>(<br> select<br> num, <br> lag(num, 1, null) over(order by id) as lag_num, <br> lead(num, 1, null) over(order by id) as lead_num<br> from Logs<br>) t<br>where t.num = t.lag_num and t.num = t.lead_num<br>;<br><br>
select<br> distinct t.num as ConsecutiveNums <br>from<br>(<br> select <br> id,<br> num,<br> row_number() over(order by id) as rn,<br> row_number() over(partition by num order by id) as id_rn<br> from Logs <br>) t<br>group by t.num, (t.rn - t.id_rn)<br>having count(1) >= 3<br>;<br><br><br>
1164. 指定日期的产品价格
way1:子查询
select p1.product_id, ifnull(p2.new_price, 10) as price<br>from (<br> select distinct product_id<br> from products<br>) as p1 -- 所有的产品<br>left join (<br> select product_id, new_price <br> from products<br> where (product_id, change_date) in (<br> select product_id, max(change_date)<br> from products<br> where change_date <= '2019-08-16'<br> group by product_id<br> )<br>) as p2 -- 在 2019-08-16 之前有过修改的产品和最新的价格<br>on p1.product_id = p2.product_id<br><br>
way2:union
分成2部分。把第一次change_date在2019-08-16之后的单独分出来,这部分的price肯定是10,因为初始值是10。<br>剩下的作为另外一部分,然后两部分做union。 另外一部分中,选出在2019-08-16之前最大的那天的price作为最终price就行了。<br><br>(select product_id as product_id,10 as price <br>from Products <br>group by product_id<br>having min(change_date)>'2019-08-16')<br>union<br>(select product_id,new_price as price <br>from Products <br>where (product_id,change_date) in<br> (select product_id,max(change_date) as max_date<br> from Products<br> where change_date<='2019-08-16'<br> group by product_id))<br>
1204. 最后一个能进入电梯的人
way1:累加,开窗函数
# Write your MySQL query statement below<br>select <br>person_name<br>from (select <br> turn<br>,person_name<br>,sum(weight) over(order by turn) as total<br>from Queue) a where total <= 1000 order by turn desc limit 1<br>
way2:自关联
SELECT a.person_name<br>FROM Queue a, Queue b<br>WHERE a.turn >= b.turn<br>GROUP BY a.person_id HAVING SUM(b.weight) <= 1000<br>ORDER BY a.turn DESC<br>LIMIT 1<br><br>
1907. 按分类统计薪水
way1:数据缺失 、创建临时表,关联
with aa as (<br> SELECT 'Low Salary' as category<br> union all<br> SELECT 'Average Salary' as category<br> union all<br> SELECT 'High Salary' as category<br>),bb as (SELECT<br>case when income < 20000 then 'Low Salary'<br> when income >= 20000 and income <= 50000 then 'Average Salary' <br> when income > 50000 then 'High Salary' <br> end as category<br> ,count(account_id) as accounts_count<br>from Accounts b<br><br>group by <br>case when income < 20000 then 'Low Salary'<br> when income >= 20000 and income <= 50000 then 'Average Salary' <br> when income > 50000 then 'High Salary' <br> end<br> ) <br> select aa.category,ifnull(bb.accounts_count,0) as accounts_count from aa left join bb using(category)<br>
## 拼接临时表<br><br>select <br> a.category<br> ,ifnull(b.cnt,0) as accounts_count<br>from (select <br> 'Low Salary' as category<br>union all<br>select <br> 'Average Salary' as category<br>union all<br>select <br> 'High Salary' as category) a left join (<br> select <br> case when income < 20000 then 'Low Salary'<br> when income > 50000 then 'High Salary'<br> else 'Average Salary'<br> end as category<br> ,count(1) as cnt<br> from Accounts<br> group by case when income < 20000 then 'Low Salary'<br> when income > 50000 then 'High Salary'<br> else 'Average Salary'<br> end<br> ) b<br> on a.category = b.category
子查询
1978. 上级经理已离职的公司员工
# Write your MySQL query statement below<br><br>select <br>employee_id<br>from Employees<br>where manager_id not in (select distinct employee_id from Employees)<br>and salary < 30000<br>order by employee_id
子主题
626. 换座位
SELECT<br> (CASE<br> WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1<br> WHEN MOD(id, 2) != 0 AND counts = id THEN id<br> ELSE id - 1<br> END) AS id,<br> student<br>FROM<br> seat,<br> (SELECT<br> COUNT(*) AS counts<br> FROM<br> seat) AS seat_counts<br>ORDER BY id ASC;<br><br>
select <br> if(id%2=0,<br> id-1,<br> if(id=(select count(distinct id) from seat),<br> id,<br> id+1)) <br> as id,student <br>from seat <br>order by id;
方法二:使用位操作和 COALESCE()【通过】<br>
SELECT<br> s1.id, COALESCE(s2.student, s1.student) AS student<br>FROM<br> seat s1<br> LEFT JOIN<br> seat s2 ON ((s1.id + 1) ^ 1) - 1 = s2.id<br>ORDER BY s1.id;<br><br>
1341. 电影评分
way1:union all
# 1.查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。<br> select <br> a1.name as results<br> from ( select <br> u.name,count(user_id) as num<br> from MovieRating m left join Users u using(user_id)<br> group by u.name<br> order by count(user_id) desc,u.name asc limit 1) a1<br> union all<br><br>## 2.查找在 February 2020 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称<br> select <br> a2.title as results<br> from ( select <br> title,avg(rating) as avg_num<br> from MovieRating m left join Movies mo using(movie_id)<br> where date_format(created_at,'%Y-%m') = '2020-02'<br> group by title<br> order by avg(rating) desc,title asc limit 1) a2<br>
## union all 拼接<br>select results from (select <br> name as results<br>from MovieRating left join Users using(user_id)<br>group by name<br>order by count(movie_id) desc,name limit 1) a<br><br>union all select results from (<br> select <br> title as results<br>from MovieRating left join Movies using(movie_id)<br>where year(created_at) = '2020' and month(created_at) = '02'<br>group by title <br>order by avg(rating) desc,title limit 1<br>) b<br><br>
1321. 餐馆营业额变化增长
way1:子查询
不使用窗口(自连接) 注意细节! ①取distinct(日期):小细节,因为一天有多次消费 ②自连接的条件:0<=datediff(被减数,减数)<=6 ;也可以这样写”between 0 and 6“ ③group by (distinct日期) ④求平均时不能使用avg!因为有的天有多笔消费<br>select<br>distinct a.visited_on,sum(b.amount) as amount,round(sum(b.amount)/7,2) as average_amount<br>from Customer a join Customer b <br>on datediff(a.visited_on,b.visited_on) between 0 and 6<br>group by a.visited_on,a.customer_id<br>having count(distinct b.visited_on) >=7<br>order by a.visited_on;<br>
# Write your MySQL query statement below<br>SELECT<br> a.visited_on,<br> sum( b.amount ) AS amount,<br> round(sum( b.amount ) / 7, 2 ) AS average_amount <br>FROM<br> ( SELECT DISTINCT visited_on FROM customer ) a JOIN customer b <br> ON datediff( a.visited_on, b.visited_on ) BETWEEN 0 AND 6 <br>WHERE<br> a.visited_on >= (SELECT min( visited_on ) FROM customer ) + 6 <br>GROUP BY<br> a.visited_on<br>
way2:开窗函数、优秀的解法。
select <br> a2.visited_on,a2.amount,a2.average_amount<br>from (<br>select <br> visited_on<br> ,row_number() over(order by visited_on) as rn <br> ,sum(amount) over(order by visited_on rows 6 preceding) as amount <br> ,round((avg(amount) over(order by visited_on rows 6 preceding) ),2) as average_amount<br>from (select<br>visited_on,sum(amount) as amount<br>from Customer <br>group by visited_on<br>order by visited_on) a1<br>) a2 where a2.rn >=7<br><br>
select <br> distinct a2.visited_on,a2.amount,a2.average_amount<br>from (<br>select <br> visited_on<br> ,sum(amount) over(order by visited_on rows 6 preceding) as amount <br> ,round((avg(amount) over(order by visited_on rows 6 preceding) ),2) as average_amount<br>from (select<br>visited_on,sum(amount) as amount<br>from Customer <br>group by visited_on<br>order by visited_on) a1<br>) a2 where datediff(a2.visited_on,(select min(visited_on) from Customer)) >= 6<br><br>
602. 好友申请 II :谁有最多的好友
成为朋友是一个双向的过程,所以如果一个人接受了另一个人的请求,他们两个都会多拥有一个朋友。<br>所以我们可以将 requester_id 和 accepter_id 联合起来,然后统计每个人出现的次数。<br>
select <br>aa.id,count(aa.id) as num<br>from (select<br>requester_id as id<br>from RequestAccepted a <br>union all<br>select<br>accepter_id as id<br>from RequestAccepted b ) aa<br>group by id order by num desc limit 1<br>
585. 2016年的投资
官方解法
## 1. 他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2015 年的投保额相同<br><br>select <br>round(sum(TIV_2016),2) as TIV_2016<br>from insurance where TIV_2015 in (select<br>TIV_2015<br>from insurance <br>group by TIV_2015<br>having count(TIV_2015) >1<br>)<br>and CONCAT(LAT, LON) in (<br> select<br>CONCAT(LAT, LON)<br>from insurance <br>group by LAT, LON<br>having count(*) = 1<br>)<br>
select <br> round(sum(TIV_2016),2) as TIV_2016<br>from insurance where TIV_2015 in (<br> select <br>distinct TIV_2015<br>from insurance<br>group by TIV_2015 having count(TIV_2015) >1<br>)<br>and concat(',',LAT,LON) not in (<br> select <br> concat(',',LAT,LON)<br> from insurance<br> group by concat(',',LAT,LON) <br> having count(*) >1<br>)<br>
185. 部门工资前三高的所有员工
way1
# Write your MySQL query statement below<br><br>select <br> d.name as 'Department',e1.name as Employee,e1.salary as Salary<br>from Employee e1<br> join Department d on e1.departmentId = d.id<br>where 3 > (<br> select <br> count(distinct e2.salary) <br> from Employee e2 <br> where e2.salary > e1.salary<br> and e1.departmentId = e2.DepartmentId<br>)<br>
way2
# Write your MySQL query statement below<br>select <br>a.name as Department,a.Employee,a.Salary<br>from (select<br> d.name<br> ,e.name as Employee<br> ,e.salary as Salary<br>,dense_rank() over(partition by e.departmentId order by e.salary desc ) as rn<br>from Employee e left join Department d on e.departmentId = d.id<br>group by e.id,e.name,e.salary) a where a.rn <= 3;<br>
高级字符串函数 / 正则表达式 / 子句
1667. 修复表中的名字
way1
# Write your MySQL query statement below<br>select user_id,<br>CONCAT(Upper(left(name,1)),Lower(substring(name,2))) name <br>from users <br>order by user_id
1527. 患某种疾病的患者
way1
# Write your MySQL query statement below<br><br>select<br>*<br>from Patients<br>where conditions like '% DIAB1%' or conditions like 'DIAB1%'
way2
# Write your MySQL query statement below<br><br><br>SELECT<br> *<br>FROM<br> PATIENTS<br>WHERE<br> CONDITIONS REGEXP '^DIAB1|\\sDIAB1';
196. 删除重复的电子邮箱
way1:not in
DELETE FROM Person<br>WHERE id NOT IN(<br> SELECT<br> id<br> FROM (<br> SELECT<br> MIN(id) as id<br> FROM Person<br> Group by email<br> )t<br>)<br><br>
way2:自关联
DELETE p1 FROM Person p1,<br> Person p2<br>WHERE<br> p1.Email = p2.Email AND p1.Id > p2.Id<br><br>
176. 第二高的薪水
way1
SELECT<br> IFNULL(<br> (SELECT DISTINCT Salary<br> FROM Employee<br> ORDER BY Salary DESC<br> LIMIT 1 OFFSET 1),<br> NULL) AS SecondHighestSalary<br><br>
way2:子查询
# Write your MySQL query statement below<br><br>select <br>max(salary) as SecondHighestSalary <br>from Employee where salary < (select <br>max(salary) as salary<br>from Employee)<br>
way3:开窗+rank
select(<br> select<br> salary<br> from (<br> select<br> distinct(salary),<br> rank() over(order by salary desc) rk<br> from Employee<br> ) a where rk = 2<br>) as SecondHighestSalary
1484. 按日期分组销售产品<br>
way1:gruop_concat
select<br>sell_date,count(distinct product) as num_sold<br>,group_concat(<br> distinct product <br> order by product separator ','<br>) products<br>from Activities<br>group by sell_date<br>order by sell_date
1327. 列出指定时间段内所有的下单产品
way1:with as
# Write your MySQL query statement below<br>with aa as(<br> select <br> product_id,sum(unit) as units<br> from Orders <br> where date_format(order_date,'%Y-%m') = '2020-02'<br> group by product_id<br> having units >=100<br>)<br>select<br>bb.product_name<br>,aa.units as unit<br><br>from aa left join Products bb using(product_id)
way2:
select<br> product_name,<br> sum(unit) unit<br>from Orders O<br>left join Products P using(product_id)<br>where order_date like '2020-02%'<br>group by product_name<br>having unit >= 100
1517. 查找拥有有效邮箱的用户
way1:正则
<br><br># Write your MySQL query statement below<br>SELECT <br> user_id AS 'user_id',<br> name AS 'name',<br> mail AS 'mail'<br>FROM<br> Users<br>WHERE mail regexp '^[a-zA-Z][a-zA-Z0-9/\\_\\.\\-]*@leetcode\\.com'<br>;<br><br>
题型
简单: 33 道
中等: 16 道
困难: 1 道
谓词下推
面试 on 和 where 区别
需要二刷、多刷复习的题目
0 条评论
下一页