Leetcode SQL题目全解析

  • 越前须知(雾)
  • 题目Q & A
    • 175 组合两个表
    • 181 超过经理收入的员工
    • 182 查找重复电子邮箱
    • 183 从不订购的用户
    • 197 上升的温度
    • 511 & 512 游戏玩法分析
    • 577 员工奖金
    • 584 查询用户推荐人
    • 586 订单最多的客户
    • 595 超过5名学生的课
    • 597 好友申请通过率
    • 603 连续空余座位
    • 607 没有向某公司销售产品的销售员
    • 610 判断三角形
    • 613 两点间最近的距离
    • 619 只出现一次的最大数
    • 1050 合作过至少3次的演员和导演
    • 1068 & 1069 产品销售
    • 1075 & 1076 项目员工
    • 1082 & 1083 & 1084 销售分析
    • 1113 报告的记录
    • 1141 查询近30天活跃用户数
    • 1148 浏览文章
    • 1173 即时食物配送
    • 1211 查询结果质量和占比
    • 1241 每个帖子评论人数
    • 1251 查询售出单品平均售价
    • 1270 向公司CEO汇报的人
    • 1280 学生们参加各科测试的次数
    • 1294 不同国家的天气类型
    • 1303 查询团队人数

越前须知(雾)

  • 本系列将详解Leetcode的SQL题库(附建表语句),采用DBMS为MySQL。
  • 本系列仅提供博主个人解法,均经过MySQL检验,且解法有对应注意点,请放心食用。
  • 本系列适合从入门到进阶选手;若希望系统学习SQL进阶知识,请移步博主主页。

题目Q & A

175 组合两个表

  • 创表
create table Person
(personid int,firstname varchar(255), lastname varchar(255));create table Address
(addressid int,personid int, city varchar(255), state varchar(255));insert into Person values (1, 'San', 'Zhang');
insert into Person values (2, 'Si',  'Li') ;insert into Address values ('291', 1, 'New York City', 'New York');

Q:查询Person表中成员的名、姓、城市、州
A:以Person表为主,外连接

select firstname, lastname, city, statefrom Person left outer join Addresson Person.personid = Address.personid;

181 超过经理收入的员工

  • 创表
Create table If Not Exists Employee
(Id int, Name varchar(255), Salary int, ManagerId int);Truncate table Employee;
insert into Employee (Id, Name, Salary, ManagerId) values ('1', 'Joe', '70000', '3');
insert into Employee (Id, Name, Salary, ManagerId) values ('2', 'Henry', '80000', '4');
insert into Employee (Id, Name, Salary, ManagerId) values ('3', 'Sam', '60000', null);
insert into Employee (Id, Name, Salary, ManagerId) values ('4', 'Max', '90000', null);

Q:查询工资超过其对应经理的员工名字
A:不是每个员工都有对应经理,内连接,匹配字段分别为经理id和员工id

select E1.namefrom Employee E1, Employee E2where E1.managerid = E2.id  -- 经理也是员工and E1.salary > E2.salary;

182 查找重复电子邮箱

  • 创表
create table Email
(id char(4),email varchar(50));truncate table Email;
insert into Email values ('1', 'a@b.com');
insert into Email values ('2', 'c@d.com');
insert into Email values ('3', 'a@b.com');

Q:查询重复的电子邮箱
A:COUNT(*)>1 / 自连接

  • COUNT(*)
select emailfrom Emailgroup by emailhaving count(*) > 1;
  • 自连接,相当于查询邮箱相同但ID不同的“错填”信息
select distinct E1.emailfrom Email E1, Email E2where E1.email = E2.emailand E1.id <> E2.id;

183 从不订购的用户

  • 创表
create table Customers
(id char(4),name varchar(10));create table Orders
(id char(4),customerid char(4));insert into Customers values ('1', 'Joe');
insert into Customers values ('2', 'Henry');
insert into Customers values ('3', 'Sam');
insert into Customers values ('4', 'Max');insert into Orders values ('1', '3');
insert into Orders values ('2', '1');

Q:查询用户总表中没有订购记录的用户
A:从不订购 = 用户总表 - 订购过用户,NOT EXISTS

select id, namefrom Customers Cwhere not exists (select *    from Orders Owhere C.id = O.customerid);

197 上升的温度

  • 创表
create table Weather(id int,recorddate date,temperature int);insert into Weather values (1, '2015-01-01', 10);
insert into Weather values (2, '2015-01-02', 25);
insert into Weather values (3, '2015-01-03', 20);
insert into Weather values (4, '2015-01-04', 30);

Q:查询与昨天/过去最近一天相比,温度升高的日期
A:对应时间轴连续时间轴不连续解法

  1. 时间轴连续
  • EXISTS
select W1.idfrom Weather W1where exists (select *from Weather W2where W1.recorddate = W2.recorddate + 1and W1.temperature > W2.temperature);
  • 自连接
select W1.idfrom Weather W1, Weather W2where W1.recorddate = W2.recorddate + 1and W1.temperature > W2.temperature;
  • DATEDIFF()
select W1.idfrom Weather W1, Weather W2where W1.temperature > W2.temperatureand datediff(W1.recorddate, W2.recorddate) = 1;
  1. 时间轴不连续
  • EXISTS,引入W3.recorddate与W1.recorddate的关系
select W1.idfrom Weather W1where exists (select * from Weather W2where W1.temperature > W2.temperatureand W2.recorddate = (select max(W3.recorddate)from Weather W3where W1.recorddate > W3.recorddate));
  • 自连接
select W1.idfrom Weather W1, Weather W2where W1.temperature > W2.temperatureand W2.recorddate = (select max(W3.recorddate)from Weather W3where W1.recorddate > W3.recorddate);

511 & 512 游戏玩法分析

  • 创表
create table Activity
(player_id int,device_id int,event_date date,games_played int,primary key (player_id, event_date));insert into Activity values (1, 2, '2016-03-01', 5);
insert into Activity values (1, 2, '2016-05-02', 6);
insert into Activity values (2, 3, '2017-06-25', 1);
insert into Activity values (3, 1, '2016-03-02', 0);
insert into Activity values (3, 4, '2018-07-03', 5);

Q:查询每个用户最早登陆时间
A:MIN()

select player_id, min(event_date) as first_loginfrom Activitygroup by player_id;

Q:查询每个用户最早“打开游戏”的时间
A:需要筛选 games_played 大于0

select player_id, min(event_date) as first_loginfrom Activitywhere games_played > 0group by player_id;

Q:查询每个玩家首次登陆的设备名称
A:子查询 / 视图

  • 子查询,筛选 event_date
select player_id, device_idfrom Activity A1where event_date = (select min(event_date)from Activity A2where A1.player_id = A2.player_idgroup by A2.player_id);
  • 临时表
select A1.player_id, A1.device_idfrom Activity A1 inner join (select player_id, min(event_date) as first_datefrom Activitygroup by player_id) A2on A1.player_id = A2.player_idand A1.event_date = A2.first_date;

577 员工奖金

  • 创表
create table Employee
(empId int,name varchar(20),supervisor int,salary int,primary key (empId));create table Bonus
(empId int,bonus int);insert into Employee values (1, 'John', 3, 1000);
insert into Employee values (2, 'Dan',  3, 2000);
insert into Employee values (3, 'Brad', null, 4000);
insert into Employee values (4, 'Thomas', 3, 4000);insert into Bonus values (2, 500);
insert into Bonus values (4, 2000);

Q:查询奖金不为 2000 的员工
A:需要包含 Bonus 表中未提及的员工1、3,以 Employee 为主表左连接

select name, bonusfrom Employee E left outer join Bonus Bon B.empId = E.empIdwhere B.bonus < 1000or B.bonus is null;   -- NULL无法用运算符比较

584 查询用户推荐人

  • 创表
create table Customer
(id int,name varchar(10),referee_id int);insert into Customer values (1, 'Will', null);
insert into Customer values (2, 'Jane', null);
insert into Customer values (3, 'Alex', 2);
insert into Customer values (4, 'Bill', null);
insert into Customer values (5, 'Zack', 1);
insert into Customer values (6, 'Mark', 2);

Q:查询推荐人不是 2 的客户
A:注意 IS NULL 的记录

select name from Customer where referee_id <>2 or referee_id is null;  -- IS NULL

586 订单最多的客户

  • 创表
create table Orders
(order_number int,customer_number int,order_date date,required_date date,shipped_date date,status char(15),comment varchar(200),primary key (order_number));insert into Orders values (1, 1, '2017-04-09', '2017-04-13', '2017-04-12', 'Closed', null);
insert into Orders values (2, 2, '2017-04-15', '2017-04-20', '2017-04-18', 'Closed', null);
insert into Orders values (3, 3, '2017-04-16', '2017-04-25', '2017-04-20', 'Closed', null);
insert into Orders values (4, 3, '2017-04-18', '2017-04-28', '2017-04-25', 'Closed', null);

Q:查询订单最多的客户
A:极值函数 / ORDER BY + LIMIT(仅用于无并列情况)

  • 极值函数
select customer_numberfrom Ordersgroup by customer_numberhaving count(*) >= all (select count(*)from Ordersgroup by customer_number);
  • ORDER BY + LIMIT,存在缺陷,即并列情况不能全部显示
select customer_numberfrom Ordersgroup by customer_numberorder by count(*) desclimit 1;

595 超过5名学生的课

  • 创表
create table if not exists Courses
(student char(4),class varchar(10));insert into Courses values ('A', 'Math');
insert into Courses values ('B', 'English');
insert into Courses values ('C', 'Math');
insert into Courses values ('D', 'Biology');
insert into Courses values ('E', 'Math');
insert into Courses values ('F', 'Computer');
insert into Courses values ('G', 'Math');
insert into Courses values ('H', 'Math');
insert into Courses values ('I', 'Math');

Q:查询选课学生5人及以上的课程名
A:COUNT()但存在陷阱,感谢网友提醒

【持续更新】Leetcode SQL题目全解析(附建表sql)相关推荐

  1. 超全的数据库建表/SQL/索引规范,适合贴在工位上!

    背景 ​ 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本,规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建 ...

  2. sql datetime 排序_超全的数据库建表/SQL/索引规范,建议贴在工位上!

    作者:浮雷来源:juejin.im/post/6871969929365553165 「背景」 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成 ...

  3. datetime 索引_超全的数据库建表/SQL/索引规范,适合贴在工位上!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:又一程序员进了ICU:压垮一个家庭,一张结算单就够 个人原创100W+访问量博客:点击前往,查看更多 来源:ht ...

  4. PowerDesigner生成数据库建表sql脚本

    PowerDesigner生成数据库建表sql脚本 一.生成sql server 2000或oracle建表sql脚本 1.新建一个物理模型,通过database菜单下的change current ...

  5. 全国省市区建表sql

    全国省市区建表sql 一.建表 DROP TABLE IF EXISTS `area_info`; CREATE TABLE `area_info` (`id` int(11) NOT NULL AU ...

  6. 自动生成小工具(二):根据建表sql自动生成增删改查sql语句文件

    Mybatis自动生成插件虽然功能强大,但是也略显笨重.我自己开发了一个自动生成的小工具,更加简单,更加轻量级. 一共只有几百行代码,想改的话,直接修改即可.根据自己的实际情况,可以进行灵活的二次开发 ...

  7. 利用python编写exe应用,实现excel文件输出建表sql文件。

    目录 一.excel文件内容如下: 二.生成如下sql: 三. 思路: 1.设计界面 2.界面分模块设计 2.1 模块一(数据库选择) 点击选择按钮会触发command后面的函数,同时会相应的返回va ...

  8. mysql查询建表SQL语句

    前言 mysql 5.7.26 查询建表SQL语句 SHOW CREATE TABLE <表名> 示例1: shell> mysql -uroot -p Enter password ...

  9. PDM和建表sql,PDM和EXCEL互转操作。

    一.PDM与建表sql互转 1.PDM转建表sql 选中表格,可以多选操作,然后按快捷键ctrl+g,复制Preview内容即可,最后会在桌面生成一个文件,用记事本打开即可. 2.建表sql转PDM ...

最新文章

  1. SpringBoot b2b2c 多用户商城系统(十五)Springboot整合RabbitMQ...
  2. TensorFlow练习23: “恶作剧”
  3. 关于年终奖励的扣税算法BUG
  4. .NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
  5. 【Laravel-海贼王系列】第七章,Pipeline 类解析
  6. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS
  7. QT绘制水平百分比条形图。
  8. 工业4.0时代,工业交换机在智能电网建设中有什么作用?
  9. 简单的Session案例 —— 一次性验证码
  10. java数据结构_概述Java中的数据结构是什么及其内部实现原理
  11. oracle表结构迁移麻不麻烦_干货分享 | 手把手教你get数据库迁移的正确姿势
  12. 【操作系统原理-陈渝老师】第七章 进程与线程
  13. 彻底解决2440/2410触摸屏跳点以及抖动问题
  14. 信号完整性与电源完整性分析 第三版 pdf_电源完整性,信号完整性,你说哪个更重要一点?...
  15. 第四章案例研究--------------------- 基于业务驱动的企业安全架构(翻译,原作者John Sherwood ;Andrew Clark; David Lynas)---仅学习使用
  16. 2023年中南财经政法大学西方经济学考研上岸前辈初复试备考经验
  17. 公司官网前端开发经验分享
  18. iOS 图片剪裁(附demo下载)
  19. B站小姐姐分享--“含羞草“一只小短短OwO
  20. Spring boot配置logback日志打印到指定路径文件

热门文章

  1. 基于深度学习场景分类算法
  2. 三十五、Fluent阻力系数问题
  3. python代码有for循环时没有报错但是不能运行
  4. element-ui手风琴自定义html,element-ui中el-table expand 手风琴效果,展开里面的内容或者ta...
  5. debian 安装php7_Ubuntu/Debian安装PHP 7.2教程
  6. win10任务栏怎么还原到下面_Win10如何快速显示桌面?
  7. Pose Estimation 入门理解
  8. 解决VS编译生成的exe文件不能在其他电脑上运行的问题
  9. 宏观经济笔记--社会消费品零售总额
  10. 【进阶数据挖掘技术】进阶数据挖掘技术介绍