
SQL学习
用于记录SQL刷题~
-Helslie
这个作者很懒,什么都没留下…
展开
-
牛客SQL二刷(31-36)
写在前面好几天没有看sql了,原因是上次讨论班废了一段时间,最近上半学期要结课了,很多东西都在搞。哎!春招实习上岸好难呀!继续努力吧!31、获取select * from employees对应的执行计划这道题真的是让人摸不着头脑哈!在SQLite数据库中,可以用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语,用于描述表的细节EXPLAIN S...原创 2020-04-22 17:52:32 · 229 阅读 · 0 评论 -
牛客SQL二刷(25-30)
25、获取员工其当前的薪水比其manager当前薪水还高的相关信息这道题有三张表,员工表、经理表、工资表,首先是需要把几张表联结,然后获取员工和经理对应,再根据薪水条件过滤。说的轻巧,那么应该怎么去写这个语句呢。本题主要思想是创建两张表(一张记录当前所有员工的工资,另一张只记录部门经理的工资)进行比较,具体思路如下:1、先用INNER JOIN连接salaries和demp_emp,建立...原创 2020-04-16 16:11:34 · 228 阅读 · 0 评论 -
牛客SQL二刷(19-24)
19、查找所有员工的last_name和first_name以及对应的dept_name这道题的话主要是在几个表里面找到你想要的字段,然后联结起来。SELECT e.last_name, e.first_name, dp.dept_name FROM employees AS eLEFT JOIN dept_emp AS deON e.emp_no = de.emp_noLEFT JO...原创 2020-04-15 11:17:52 · 189 阅读 · 0 评论 -
牛客SQL二刷(13-18)
13、从titles表获取按照title进行分组要求:每组个数大于等于2,给出title以及对应的数目t这道题的话主要是用到一个点 group by havingSELECT title, COUNT(*) AS tFROM titlesGROUP BY title HAVING COUNT(*) >= 214、查找employees表要求:所有emp_no为奇数,且last...原创 2020-04-14 13:31:46 · 163 阅读 · 0 评论 -
牛客SQL二刷(7-12)
7、查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t这道题其实是有难点的,因为要求第二次薪水比第一次薪水高才能算是涨幅,而 AC 答案却没有考虑这一点,所以牛客也是奇奇怪怪的…,主要目标还是要解决一下如何展现这个涨幅。一般这种要找前一个和后一个关系的比如两个连座啊,连续几天这种,都会用到一个小 trick 就是一张表用两次。这里的联结条件需要注意:a.emp_no = b.e...原创 2020-04-13 10:10:53 · 177 阅读 · 0 评论 -
牛客SQL二刷(1-6)
写在前面正式开始牛客61题二刷的工作,计划是一天六道题,十天整理完所有的题解思路~最近状态起起伏伏,课程作业也到了忙碌的阶段,暑期实习也没个着落,但是学习不能停下来。信息爆炸带来的焦虑几乎人人都有吧,大量的信息带来的peer pressure真的是无法想象。前几天看了Devon学长的公众号,自己还是需要沉下心,磨好刀。慢慢来比较快嘛。告诉自己,准备最好的时间是过去,其次就是现在。1、查找...原创 2020-04-12 10:57:02 · 253 阅读 · 0 评论 -
1341. 电影评分
请你编写一组 SQL 查询:查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。查找在 2020 年 2 月 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。题意就是查找两个结果,然后都用result显示即可,那么我们想到用UNION。第一部分 查找评论电影数量最多的用户名SELECT u.name AS resultsFROM Movie_Ra...原创 2020-03-28 09:06:43 · 746 阅读 · 0 评论 -
1204. 最后一个能进入电梯的人
写一条 SQL 查询语句查找最后一个能进入电梯且不超过重量限制的 person_name这条题目就是考察累加,然后找到最后一个人。SELECT person_nameFROM Queue AS q1WHERE ( SELECT SUM(weight) FROM Queue WHERE turn <= q1.turn) <= 1000ORDER...原创 2020-03-27 09:38:19 · 297 阅读 · 0 评论 -
1193. 每月交易 I
题目我就不写了,给出代码下次看的时候应该就知道什么题目了。SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month, country, COUNT(country) AS trans_count, SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) AS a...原创 2020-03-27 09:18:16 · 210 阅读 · 0 评论 -
1174. 即时食物配送 II
如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。写一条 SQL 查询语句获取即时订单在所有用户的首次订单中的比例。保留两位小数。这个题的点在于要首先求出首次订单的临时表,然后在这张表上找出即时订单。SELECT ROUND(100 * SUM(CASE WHEN order_...原创 2020-03-26 10:00:15 · 369 阅读 · 0 评论 -
1164. 指定日期的产品价格
产品数据表: ProductsColumn NameTypeproduct_idintnew_priceintchange_datedate这张表的主键是 (product_id, change_date)。这张表的每一行分别记录了某产品在某个日期更改后的新价格。这道题的话就是在于对不同类型的商品做不同的处理,如果在8月16日之前就已经做过修...原创 2020-03-26 09:48:33 · 446 阅读 · 0 评论 -
1132. 报告的记录 II
在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位。首先给出亮眼的答案!SELECT ROUND(AVG(IFNULL(b.remove, 0) / a.spam) * 100, 2) AS average_daily_percentFROM( SELECT action_date, COUNT(DISTINCT po...原创 2020-03-25 09:29:29 · 274 阅读 · 0 评论 -
1126. 查询活跃业务
Events table:business_idevent_typeoccurences1reviews73reviews31ads112ads73ads61page views32page views12来源:力扣(LeetCode)链接:https://leetcode-cn.com/problem...原创 2020-03-25 09:09:47 · 214 阅读 · 0 评论 -
1107. 每日新用户统计
Traffic 表:Column NameTypeuser_idintactivityenumactivity_datedate该表没有主键,它可能有重复的行。activity 列是 ENUM 类型,可能取 (‘login’, ‘logout’, ‘jobs’, ‘groups’, ‘homepage’) 几个值之一。查询从今天起最多 90 天内...原创 2020-03-25 08:49:40 · 437 阅读 · 0 评论 -
1098. 小众书籍
你需要写一段 SQL 命令,筛选出过去一年中订单总量 少于10本 的 书籍 。注意:不考虑 上架(available from)距今 不满一个月 的书籍。并且 假设今天是 2019-06-23 。SELECT b.book_id, name FROM Books AS b LEFT JOIN Orders AS o ON b.book_id = o.book_idWHERE avai...原创 2020-03-23 08:59:40 · 332 阅读 · 0 评论 -
1070. 产品销售分析 III
编写一个 SQL 查询,选出每个销售产品的 第一年 的 产品 id、年份、数量 和 价格。这道题乍一看很简单啊,group by order by之后limit 1美滋滋一看解答错误,这是为啥呢,原来我自己认为首年只能有一次订单了,不能用group bySELECT product_id, year AS first_year, quantity, priceFROM SalesWHE...原创 2020-03-23 08:31:21 · 293 阅读 · 0 评论 -
1045. 买下所有产品的客户
从 Customer 表中查询购买了 Product 表中所有产品的客户的 id这道题关键点在于对每个顾客所购买的东西进行检索,即用count(distinct product_key)查出每个顾客购买的种类数,然后对应商品列表中有多少种类数。SELECT customer_id FROM customer GROUP BY customer_id HAVING COUNT(DIS...原创 2020-03-23 08:22:50 · 388 阅读 · 0 评论 -
626. 换座位
改变学生座位,原理就是左右互换,最后落单的不变,在题解区看到的非常好的思路,用IF或者CASE WHEN都可以解决,这里写出IF的解法。SELECT IF(id % 2 = 0, id-1, -- 偶数座位就往前一个 IF(id = (SELECT COUNT(DISTINCT id) FROM seat), id, -- 除此之外最后一个不变,这里...原创 2020-03-22 09:38:48 · 182 阅读 · 0 评论 -
612. 平面上的最近距离
近日有感太想要得到反而不是什么好的事情,这几天情绪总是不太好,感觉又回到了考研前那一个月,平白无故给自己太多的压力,被push的有点喘不过气来,快要对很多东西失去了兴趣。你要明白你为了什么而努力你要知道你完成的每一项任务都会内化成什么而不是说你加速倍速2倍速甚至跳过就能代表这些都是你的了重新出发吧不为了什么这道题自己的思路竟然很好,击败了94点多的人哈哈,还是很开心的。题目要求...原创 2020-03-22 09:35:44 · 243 阅读 · 0 评论 -
608. 树节点
树中每个节点属于以下三种类型之一:叶子:如果这个节点没有任何孩子节点。根:如果这个节点是整棵树的根,即没有父节点。内部节点:如果这个节点既不是叶子节点也不是根节点。按类型分类,用到case whenSELECT id, (CASE WHEN p_id IS NULL THEN 'Root' WHEN id IN (SELECT p_id FROM tree)...原创 2020-03-21 09:17:02 · 411 阅读 · 0 评论 -
602. 好友申请 II :谁有最多的好友
写一个查询语句,求出谁拥有最多的好友和他拥有的好友数目。就是求出两个字段中最多的那个id这里用到了union allSELECT id, COUNT(*) AS num FROM (( SELECT requester_id AS id FROM request_accepted)UNION ALL (SELECT accepter_id AS id FROM re...原创 2020-03-21 09:04:41 · 333 阅读 · 0 评论 -
585. 2016年的投资
写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数。对于一个投保人,他在 2016 年成功投资的条件是:他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2015 年的投保额相同。他所在的城市必须与其他投保人都不同(也就是说维度和经度不能跟其他任何一个投保人完全相同)。题意很清楚,满足这两个条件就可以。其实抛开其他思路...原创 2020-03-21 08:54:57 · 222 阅读 · 0 评论 -
578. 查询回答率最高的问题
即一个问题show之后,可能是被answer了,也可能是被skip了,所以求回答率。其实思路都是一致的,求出回答次数/出现次数即可题解一SELECT question_id as survey_logFROM(SELECT question_id, SUM(CASE WHEN action = 'answer' THEN 1 ELSE 0 END) AS num_answ...原创 2020-03-20 09:10:41 · 252 阅读 · 0 评论 -
570. 至少有5名直接下属的经理
Employee 表包含所有员工和他们的经理。每个员工都有一个 Id,并且还有一列是经理的 Id。IdNameDepartmentManagerId101JohnAnull102DanA101103JamesA101104AmyA101105AnneA101106RonB101请编写一个SQL查询来查...原创 2020-03-20 08:51:16 · 231 阅读 · 0 评论 -
550. 游戏玩法分析 IV
这道题是编写SQL,报告在首次登录的第二天再次登录的玩家的分数,四舍五入到小数点后两位。首先思路很流畅,用复表找出第二天也登陆的player_id两个统计量相除即可最后四舍五入但是我漏了最重要的一点首次,最后还要加一个过滤条件SELECT ROUND(COUNT(DISTINCT a1.player_id) / (SELECT COUNT(DISTINCT player_id) F...原创 2020-03-20 08:35:16 · 179 阅读 · 0 评论 -
534. 游戏玩法分析 III
本题题点在于累加到目前为止玩过的次数,应该用表自联结,和以前的一道题思路类似,但是自己没想到!害,小白打怪升级任重道远啊……给出代码:SELECT B.player_id, B.event_date, SUM(A.games_played) AS games_played_so_farFROM Activity AS A JOIN Activity AS B...原创 2020-03-19 09:09:41 · 169 阅读 · 0 评论 -
1294. 不同国家的天气类型
这道题主要的点在于1、所需要判别类别的天气是在固定月份2、要用case when来进行分组3、有的国家没有数据,如果用left join就会出现null,如果不连接用两个表查询,在where中连接就可以给出答案SELECT country_name, CASE WHEN AVG(weather_state) <= 15 THEN 'Cold'...原创 2020-03-19 08:34:20 · 236 阅读 · 0 评论 -
1280. 学生们参加各科测试的次数
这道题关键在于不是所有学生都参加所有科目的考试,我们也不能很快速的知道选了哪些科目。这里用了一个CROSS JOIN,即笛卡尔积,不需要内联结既可以联结两张表。SELECT s1.student_id, s1.student_name, s2.subject_name, COUNT(e.subject_name) AS attended_exam...原创 2020-03-17 10:39:28 · 343 阅读 · 0 评论 -
1251. 平均售价
Table: PricesColumn NameTypeproduct_idintstart_datedateend_datedatepriceint(product_id,start_date,end_date) 是 Prices 表的主键。Prices 表的每一行表示的是某个产品在一段时期内的价格。每个产品的对应时间段是不会重叠的,这也...原创 2020-03-17 10:19:30 · 526 阅读 · 0 评论 -
1142. 过去30天的用户活动 II
这道题我要写一下自己原本的思路和题解的新思路。Activity table:user_idsession_idactivity_dateactivity_type112019-07-20open_session112019-07-20scroll_down112019-07-20end_session242019-07-20op...原创 2020-03-16 09:44:55 · 338 阅读 · 0 评论 -
1141. 查询近30天活跃用户数
这道题记下来是感觉似乎在之前的面经看到过。。主要的几个点就是使用datediff函数以及去重了。SELECT activity_date AS day, COUNT(DISTINCT user_id) AS active_usersFROM ActivityGROUP BY activity_date HAVING DATEDIFF('2019-07-27', activity_date)...原创 2020-03-16 09:28:52 · 1060 阅读 · 0 评论 -
1084. 销售分析III
编写一个SQL查询,报告2019年春季才售出的产品。即仅在2019-01-01至2019-03-31(含)之间出售的商品。SELECT s.product_id, product_nameFROM Sales AS sJOIN Product AS pON s.product_id = p.product_idGROUP BY s.product_idHAVING MIN(sale_d...原创 2020-03-15 10:09:14 · 447 阅读 · 0 评论 -
1050. 合作过至少三次的演员和导演
找出演员导演对大于3次的值这一题也是接触到了新的知识点,奇奇怪怪的知识增加了!(最近在刷题的时候不断觉得自己很多地方都很欠缺,然而想去实习却也没敢投简历,怕自己投了简历之后在等电话的一段时间都会寝食难安哈哈哈,还不如先做好这些事情,投简历就初定月底投吧!)好了回到题目,先给出代码:SELECT actor_id, director_idFROM ActorDirectorGROUP ...原创 2020-03-14 09:53:59 · 235 阅读 · 0 评论 -
627. 交换工资
这道题来源于leetcode ,正好对应我昨天写过的给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。...原创 2020-03-14 09:41:55 · 167 阅读 · 0 评论 -
610. 判断三角形
用这道题来记录一下case when的用法思路很简单,判断三角形成立的条件,三个条件都满足就可以了。想到用case when,有两种语法格式第一种case 列名when 条件值1 then 选项1when 条件值2 then 选项2…else 默认值 end第二种casewhen 列名= 条件值1 then 选项1when ...原创 2020-03-13 09:20:19 · 237 阅读 · 0 评论 -
603. 连续空余座位
这题就是找到至少连续两个空位(布尔值为true)这种题目一看到要养成条件反射,一个是id差为1,一个就是复表的使用,最后要去重。给出代码:SELECT DISTINCT a.seat_idFROM cinema AS a JOIN cinema AS b ON a.free = TRUE AND b.free = TRUEAND abs(a.seat_id - b.seat_id)...原创 2020-03-13 09:04:06 · 304 阅读 · 0 评论 -
597. 好友申请 I :总体通过率
这道题是给出两张表,计算好友申请的总体通过率主要注意以下几点,一个同样的好友申请可能会被发送几次,所以需要去重操作对于通过的好友申请不一定都是在好友请求中,这里我的思路有点混乱,只需要记录通过的个数占申请的个数的比例就可以了如果没有通过,那要填写为0这里还有对小数点后几位的要求以上的要求我们要一一满足SELECT ROUND(IFNULL( (SELEC...原创 2020-03-12 09:28:57 · 260 阅读 · 0 评论 -
196. 删除重复的电子邮箱
刚刚那道题是困难也就算了,为什么这道简单题也做了这么久。。。。编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。这道题其实思路很清晰啊,如下,#找出重复的email#对于重复的email选出id最小#删除除了刚刚选出id外其余id的记录首先前两个要求很好写语句SELECT MIN(Id) AS Id, EmailFROM ...原创 2020-03-11 10:33:49 · 607 阅读 · 0 评论 -
185. 部门工资前三高的所有员工(重要)
气死爷了,一道题做了这么久。经典的topn问题,编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。就是又分组又排序,而且不是找前三个人,而是找前三个工资所对应的人,不一定每个部门只有三个人。(ps觉得leetcode写代码界面没有牛客那么友好但是题解部分很棒哈哈!)第一种思路的话虽然不知道是版本问题还是什么,又分组又排序我们可以想到著名的窗口函数,求出每个工资所对应的排名,然后...原创 2020-03-11 09:54:04 · 313 阅读 · 0 评论 -
197. 上升的温度
这题主要记录一下datediff和date_add的用法DATEDIFF() 函数返回两个日期(date1-date2)之间间隔的天数/年数等,如:DateDiff(timeinterval,date1,date2)SELECT w2.IdFROM Weather AS w1INNER JOIN Weather AS w2ON DATEDIFF(w2.RecordDate, w1.Re...原创 2020-03-11 11:46:07 · 158 阅读 · 0 评论