Mysql练习 暑假篇
Mysql练习 暑假篇
mengnankkzhouMysql练习
基础题
1.
从INS_SPR中选择SPR_FNM1 、SPR_SURN,其中SPR_CODE = ‘50200100’
1 | SELECT SPR_FNM1 , SPR_SURN FROM INS_SPR WHERE SPR_CODE = 50200100; |
return:
SPR_FNM1 | SPR_SURN |
---|---|
Tom | Cotton |
2.
显示学生编号为 50200100 的学生在 2016/7 TR1 学期学习的模块代码和模块名称
1 | SELECT CAM_SMO.MOD_CODE,INS_MOD.MOD_NAME |
修改代码 | 模组名称 |
---|---|
CSN08101 | 系统和服务 |
信息08104 | 数据库系统 |
SET08108 | 软件开发 2 |
3.
显示学生编号为 50200100 的学生在 2016/7 TR1 学期学习的模块代码、模块名称和模块负责人的详细信息
1 | SELECT CAM_SMO.MOD_CODE, INS_MOD.MOD_NAME, |
return:
修改代码 | 模组名称 | PRS 代码 | PRS_FNM1 | PRS 查询 |
---|---|---|---|---|
CSN08101 | 系统和服务 | 40000008 | 詹姆士 | 杰克逊 |
信息08104 | 数据库系统 | 40000036 | 安德鲁 | 卡明 |
SET08108 | 软件开发 2 | 40000408 | 尼尔 | 厄克特 |
4.力扣sql 175组合两个表
1 | select FirstName, LastName, City, State |
5.leetcode 超过经理收入的员工
表:Employee
1 | +-------------+---------+ |
编写解决方案,找出收入比经理高的员工。
以 任意顺序 返回结果表。
结果格式如下所示。
1 | 输入: |
1 | 题解: |
这是表的自连接,通过同一张表的不同列的对比
首先的条件是
a.ManagerId = b.Id这个表明这个员工归属这个经理,然后a.Salary > b.Salary;这个条件表明这个员工的工资大于他的经理
6.leetcode 查找重复的电子邮箱
1 | 表: Person |
题解:
第一种思路,通过条件筛选
1 | SELECT DISTINCT a.email AS 'Email' |
DISTINCT
关键字用于选择不同的(不重复的)值。
使用了自连接 Person a, Person b
。
条件 a.email = b.email
用于匹配相同的电子邮件。
条件 a.id < b.id
确保每对重复的电子邮件只记录一次,避免重复。
第二种思路,使用分组
1 | SELECT |
使用分组直接显示出email大于一的邮箱的次数
7.leetcode 删除重复的电子邮箱
1 | 表: Person |
题解:
1 | DELETE p1 FROM Person p1, |
8.leetcode 上升的温度
1 | 表: Weather |
题解:
一开始犯了个错误,直接用+1是显然不行的
去查了一遍日期函数,发现还是有不少函数可以用
索引可以得到
1 | SELECT nw.id |
思路扩展:
1 | SELECT w1.id |
w1.recordDate = DATE_ADD(w2.recordDate, INTERVAL 1 DAY)
使用日期函数来显示这个条件
9.leetcode 游戏玩法分析 I
1 | 活动表 Activity: |
题解:
首先我是想直接多表查询,然后用id相等来确定是同一个人,然后直接a1.event_date < a2.event_date就行了,但是发现这样并不能完全正确。因为这样的话就会缺少一个id=2的人,发现他只有一次
然后我就改了一版
1 | select a1.player_id ,a1.event_date first_login from Activity a1 ,Activity a2 |
发现这样还是缺了一部分
然后看了看题解
发现了这样一种思路
1 | select player_id, min(event_date) as first_login |
发现是我想多了哈哈,这个题根本不用那么难的/(ㄒoㄒ)/~~
直接检索最小值,然后根据id分组就行了
10.lintcode 整合成绩单
描述
现在有两张结构相同的成绩表 course1_score
和 course2_score
,请编写 SQL 语句,找出两张表中都存在的学生姓名,在结果表格中通过 score1
列和 score2
列分别展示这些学生的两门课程成绩,并按照姓名的字典序进行升序排序。
表定义1:course1_score
(课程1的成绩表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
name | varchar | 学生姓名 |
score | int | 课程1的成绩 |
表定义2:course2_score
(课程2的成绩表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
name | varchar | 学生姓名 |
score | int | 课程2的成绩 |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
样例
样例一:
表内容1:course1_score
id | name | score |
---|---|---|
1 | Alice | 100 |
2 | Bob | 90 |
3 | Chalice | 95 |
4 | David | 90 |
5 | Edward | 85 |
表内容2:course2_score
id | name | score |
---|---|---|
1 | Chalice | 98 |
2 | Bill | 90 |
3 | Alice | 95 |
4 | Ethan | 85 |
在运行你的 SQL 语句之后,表应返回:
name | score1 | score2 |
---|---|---|
Alice | 100 | 95 |
Chalice | 95 | 98 |
样例二:
表内容1:course1_score
id | name | score |
---|---|---|
1 | Alice | 100 |
2 | Bob | 90 |
3 | Chalice | 95 |
4 | David | 90 |
5 | Edward | 85 |
表内容2:course2_score
id | name | score |
---|---|---|
1 | Carl | 98 |
2 | Bill | 90 |
3 | Ali | 95 |
4 | Ethan | 85 |
在运行你的 SQL 语句之后,表应返回:
name | score1 | score2 |
---|---|---|
题解:
因为他用加粗标出来了,需要按照name字段进行升序,所以要使用order by 。然后进行多表查询,通过筛选条件
1 | c1.name , c1.score c2.score from course1_score c1 , course2_score c2 |
一开始我是这样,基本正确,但是不能通过🤯
因为一开始的话就要声明🤦
1 | SELECT c1.name, c1.score AS score1, c2.score AS score2 |
11 lintcode 耗时前三的任务
描述
在本题中,你需要根据 Tasks
表:
column | type |
---|---|
id | int |
start_date | date |
end_date | date |
找到任务耗时排名前三的任务(三条以下的记录只返回前 n 条)。你可以在样例中查看输出需要的格式。
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
- 如果存在多个消耗时间相同的任务,优先返回
id
较小的任务
样例
样例 1
输入:
id | start_date | end_date |
---|---|---|
0 | 2019-01-06 | 2019-04-16 |
1 | 2022-09-28 | 2022-12-29 |
2 | 2020-07-25 | 2020-09-29 |
3 | 2018-02-12 | 2018-02-27 |
4 | 2022-08-20 | 2022-11-18 |
输出:
id | diff |
---|---|
0 | 100 |
1 | 92 |
4 | 90 |
样例 2
输入:
id | start_date | end_date |
---|---|---|
0 | 2019-01-06 | 2019-04-16 |
1 | 2022-09-28 | 2022-12-29 |
输出:
id | diff |
---|---|
0 | 100 |
1 | 92 |
题解:
1 | select id,datediff(end_date, start_date) as diff |
这个题目主要是用了排序的提交,还有分页,最重要的是日期函数datediff计算两个日期之间间隔的日子
一开始我没看到题目要求,忘了limit了提交不成功🤯
12 lintcode 查询客户的推荐人
描述
给定表 customer
,里面存储了所有客户信息和他们的推荐人,具体如下所示。
列名 | 类型 | 说明 |
---|---|---|
id | INT | 客户的 id,主键 |
name | VARCHAR | 客户的名称 |
referrer_id | INT | 推荐人的 id |
现需要你写一个查询语句,返回一个只包含 name
字段的客户列表,要求列表中客户的推荐人编号都不是 1。
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
referrer_id
可能会是 null,该情况也不是 1。
样例
样例一
输入数据
id | name | referrer_id |
---|---|---|
1 | Joanne Ferry | null |
2 | Roberta Nader Sr. | 2 |
3 | Dr. Gwen Jacobson | 1 |
4 | Geraldine Kiehn III | 2 |
5 | Gwendolyn Howe IV | 2 |
输出结果
name |
---|
Joanne Ferry |
Roberta Nader Sr. |
Geraldine Kiehn III |
Gwendolyn Howe IV |
样例二
输入数据
id | name | referrer_id |
---|---|---|
1 | Joanne Ferry | null |
2 | Roberta Nader Sr. | 1 |
3 | Dr. Gwen Jacobson | 2 |
输出结果
name |
---|
Joanne Ferry |
Dr. Gwen Jacobson |
题解:
1 | select name from customer |
直接筛选就行,他这个题目好像出bug了,我的东西都是正确的但是他给我输出错误😊
-
lintcode · 查询成绩排名在第二到第五的学生
描述
请编写 SQL 语句,从成绩表 score
中查询所有学生的三门课程的总分排名,并返回排名 score_rank
在第二到第五的学生学号 sno
以及这名学生的总分 total_score
,排名不设置并列排名,当总分相同时,学号 sno
小的学生排在前面。
表定义:score
(成绩表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
sno | varchar | 学生学号 |
course1 | int | 课程1的分数 |
course2 | int | 课程2的分数 |
course3 | int | 课程3的分数 |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
当学生数量不足 5 人时,返回包括第 2 名之后的剩余学生的成绩排名表格。
样例
样例一:
表内容:score
id | sno | course1 | course2 | course3 |
---|---|---|---|---|
1 | 001 | 80 | 90 | 70 |
2 | 002 | 90 | 85 | 80 |
3 | 003 | 85 | 70 | 95 |
4 | 004 | 80 | 90 | 85 |
5 | 005 | 60 | 80 | 75 |
6 | 006 | 90 | 75 | 70 |
在运行你的 SQL 语句之后,表应返回:
score_rank | sno | total_score |
---|---|---|
2 | 004 | 255 |
3 | 003 | 250 |
4 | 001 | 240 |
5 | 006 | 235 |
学号为 002
和 004
的学生总分都为 255
,但学号 002
较小,因此排在第一,而学号为 004
的学生排在第二。
样例二:
表内容:score
id | sno | course1 | course2 | course3 |
---|---|---|---|---|
1 | 001 | 80 | 90 | 70 |
在运行你的 SQL 语句之后,表应返回:
score_rank | sno | total_score |
---|---|---|
没有排名从第二到第五的学生,返回空表。
样例三:
表内容:score
id | sno | course1 | course2 | course3 |
---|---|---|---|---|
1 | 001 | 80 | 90 | 70 |
2 | 002 | 85 | 70 | 95 |
3 | 003 | 80 | 90 | 85 |
在运行你的 SQL 语句之后,表应返回:
score_rank | sno | total_score |
---|---|---|
2 | 002 | 245 |
3 | 001 | 240 |
只有三名学生,返回第二到第三的学生。
题解:
1 | SELECT row_number() over() as score_rank, sno, (course1 + course2 + course3) as total_score |
使用ROW_NUMBER()
函数来计算排名,
补充:在 SQL 中,OVER
子句与窗口函数一起使用,用于定义窗口或集合,窗口函数在该窗口或集合上执行计算。常见的窗口函数包括 ROW_NUMBER()
, RANK()
, DENSE_RANK()
, 和 SUM()
等。
**RANK()
:会为相同值的行分配相同的排名,并在不同值之间留出空缺。DENSE_RANK()
:会为相同值的行分配相同的排名,但不会在不同值之间留出空缺。
选择使用哪一个函数取决于你的需求:如果需要连续的排名(无空缺),使用 DENSE_RANK()
;如果允许空缺,使用 RANK()
。
最后通过limit来限制出现2-5名即可
-
lintcode 所有学生都选修的课程
描述
请编写 SQL 语句,从选课表 courses
中,查询选课表里存在的学生中,所有学生都选修的课程编号 course_id
,并将结果 course_id
进行升序排序。
表定义:courses
(选课表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
student_id | int | 学生学号 |
course_id | varchar | 课程编号 |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
样例
样例一:
表内容:courses
id | student_id | course_id |
---|---|---|
1 | 1 | 101 |
2 | 1 | 102 |
3 | 1 | 103 |
4 | 2 | 101 |
5 | 2 | 103 |
6 | 4 | 103 |
在运行你的 SQL 语句之后,表应返回:
course_id |
---|
103 |
解释:表中记录了学号为 1、2、4 的学生的选课情况,这三名学生都选修了课程编号为 103
的课程。
样例二:
表内容:courses
id | student_id | course_id |
---|---|---|
1 | 1 | 101 |
2 | 2 | 101 |
3 | 1 | 102 |
4 | 2 | 102 |
5 | 3 | 103 |
在运行你的 SQL 语句之后,表应返回:
course_id |
---|
解释:表中记录了学号为 1、2、3 的学生的选课情况,没有一门课程是这三名学生都选修的,故返回空表。
1 | select course_id |
having count(distinct student_id) = (select count(distinct student_id) from courses)这个选出学生id数量和课程数量相同的
然后进行分组,就可以选出其所有学生都选的课
-
lintcode 考试通过的人数
描述
请编写 SQL 语句,从学生表 students
和成绩表 score
中查询各个班级 class
中,三个课程都大于等于 60 分的学生数量 pass_count
。
表定义1:students
(学生表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
sno | varchar | 学生学号 |
name | varchar | 学生姓名 |
class | varchar | 学生班级 |
表定义2:score
(成绩表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
sno | varchar | 学生学号 |
course1 | int | 课程1的分数 |
course2 | int | 课程2的分数 |
course3 | int | 课程3的分数 |
total | int | 总分 |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
需要返回 students
表中出现过的所有班级的 pass_count
,若该班级没有符合条件的学生,则 pass_count
为 0 。
样例
样例一:
表内容 1:students
id | sno | name | class |
---|---|---|---|
1 | 001 | Martin Torphy | CS01 |
2 | 002 | Eleanor Cummings | CS01 |
3 | 003 | Franklin Upton | CS02 |
4 | 004 | Toby Hudson | CS02 |
表内容 2:score
id | sno | course1 | course2 | course3 | total |
---|---|---|---|---|---|
1 | 003 | 100 | 100 | 100 | 300 |
2 | 002 | 90 | 90 | 100 | 280 |
3 | 004 | 80 | 60 | 70 | 210 |
4 | 001 | 59 | 60 | 60 | 179 |
在运行你的 SQL 语句之后,表应返回:
class | pass_count |
---|---|
CS01 | 1 |
CS02 | 2 |
样例二:
表内容 1:students
id | sno | name | class |
---|---|---|---|
1 | 001 | Martin Torphy | CS02 |
2 | 002 | Eleanor Cummings | CS02 |
3 | 003 | Franklin Upton | CS02 |
4 | 004 | Toby Hudson | CS02 |
5 | 005 | Marco Funk | CS02 |
表内容 2:score
id | sno | course1 | course2 | course3 | total |
---|---|---|---|---|---|
1 | 005 | 100 | 100 | 100 | 300 |
2 | 002 | 90 | 90 | 100 | 280 |
3 | 004 | 90 | 90 | 90 | 270 |
4 | 003 | 100 | 100 | 59 | 259 |
5 | 001 | 59 | 59 | 59 | 177 |
在运行你的 SQL 语句之后,表应返回:
class | pass_count |
---|---|
CS02 | 3 |
题解:
1 | select s1.class as class ,count(s1.class) as pass_count |
首先先要确定这是要进行多表查询,而且连接的条件是s1.sno = s2.sno这是两张表的连接条件
然后根据要求写where 语句都大于等于60分
然后根据班级分组
最后再写return返回的列表值
16.lintcode 最棒的销售
请你编写 SQL 语句,查询表 sales
表中销售额最高的销售 id
。
表定义:sales(销售表)
id | sales_sum | satisfaction |
---|---|---|
id | int | 主键 |
sales_sum | int | 销售额 |
satisfaction | float | 客户满意度 |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
如果存在多个 id
的销售额相同且都为最大值,则返回符合条件的所有 id
样例
样例一
表内容:sales
id | sales_sum | satisfaction |
---|---|---|
1 | 50000 | 2.2 |
2 | 25000 | 2.5 |
3 | 60000 | 3.2 |
在运行你的 SQL
语句后,表应返回:
id |
---|
3 |
样例二:
表内容:sales
id | sales_sum | satisfaction |
---|---|---|
1 | 34560 | 2.3 |
2 | 12345 | 3.4 |
3 | 55000 | 0.9 |
4 | 45000 | 5 |
在运行你的 SQL
语句后,表应返回:
id |
---|
3 |
题解:
1 | select id from sales order by sales_sum desc limit 1; |
17.lintcode 视图处理算法 Merge
请创建一个视图 v_teachers
查看 teachers
表中年龄大于25岁的教师信息,并使用 Merge
的视图算法
表定义 : teachers (教师表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
name | varchar | 讲师姓名 |
varchar | 讲师邮箱 | |
age | int | 讲师年龄 |
country | varchar | 讲师国籍 |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
样例
输入数据:
teachers
表:
id | name | age | country | |
---|---|---|---|---|
1 | ‘Eastern heretic’ | ‘eastern.heretic@gmail.com’ | 20 | ‘UK’ |
2 | ‘Northern Beggar’ | ‘northern.beggar@qq.com’ | 21 | ‘CN’ |
3 | ‘Western Venom’ | ‘western.venom@163.com’ | 28 | ‘USA’ |
4 | ‘Southern Emperor’ | ‘southern.emperor@qq.com’ | 21 | ‘JP’ |
返回结果:
id | name | age | country | |
---|---|---|---|---|
3 | ‘Western Venom’ | ‘western.venom@163.com’ | 28 |
题解:
1 | create algorithm = Merge view v_teachers |
主要是algorithm = Merge创建merge的视图
18.lintcode 创建批量插入数据的存储过程
我们需要向 teachers
表中插入 30000
条测试数据,包含教师姓名 name = 'teacher' + 测试 id
,(测试 id 从 1 增加到 30000
),教师邮箱 email = name + '@chapter.com'
,教师年龄 age = 26 + (id%20)
请利用 SQl
的存储过程来实现,请将存储过程命名为 addTeachers
。
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
样例
输入数据:
teachers
表:
id | name | age | country | |
---|---|---|---|---|
返回结果:
id | name | age | country | |
---|---|---|---|---|
1 | ‘teacher1’ | ‘teacher1@chapter.com’ | 27 | ‘’ |
2 | ‘teacher2’ | ‘teacher2@chapter.com’ | 28 | ‘’ |
3 | ‘teacher3’ | ‘teacher3@chapter.com’ | 29 | ‘’ |
4 | ‘teacher4’ | ‘teacher4@chapter.com’ | 30 | ‘’ |
5 | ‘teacher5’ | ‘teacher5@chapter.com’ | 31 | ‘’ |
6 | ‘teacher6’ | ‘teacher6@chapter.com’ | 32 | ‘’ |
7 | ‘teacher7’ | ‘teacher7@chapter.com’ | 33 | ‘’ |
‘…’ | ‘…’ | ‘…’ | ‘…’ | ‘…’ |
题解:
1 | CREATE PROCEDURE addTeachers() |
18.lintcode 更换连续两个人的座位
现有一表 seat
存储了每个座位的信息,具体如下所示。
列名 | 类型 | 说明 |
---|---|---|
id | INT | 座位的编号,主键 |
name | VARCHAR | 使用该座位的人名 |
请编写 SQL 查询来交换每两个连续的人的座位号。如果总体的数量是奇数,则最后一个人的座位不进行交换。
最终的结果需要包含 id
和 name
两个字段,并按 id
升序返回结果表。
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
样例
样例一
输入数据
id | name |
---|---|
1 | Armando Homenick |
2 | Jesus Runolfsdottir |
3 | Jody Hackett |
4 | Brendan Legros MD |
5 | Tina Cormier |
输出结果
id | name |
---|---|
1 | Jesus Runolfsdottir |
2 | Armando Homenick |
3 | Brendan Legros MD |
4 | Jody Hackett |
5 | Tina Cormier |
解释
输入数据包含 5 个座位信息,则对编号 [1 <-> 2]、[3 <-> 4] 四个座位对应的人进行更换座位,id
为 5 的不进行更换。
样例二
输入数据
id | name |
---|---|
1 | Armando Homenick |
2 | Jesus Runolfsdottir |
3 | Jody Hackett |
4 | Brendan Legros MD |
5 | Tina Cormier |
6 | Raymond Metz |
输出结果
id | name |
---|---|
1 | Jesus Runolfsdottir |
2 | Armando Homenick |
3 | Brendan Legros MD |
4 | Jody Hackett |
5 | Raymond Metz |
6 | Tina Cormier |
解释
输入数据包含 6 个座位信息,则对编号 [1 <-> 2]、[3 <-> 4] 以及 [5 <-> 6] 六个座位对应的人都进行更换座位。
题解:
使用了case语句
1 | SELECT |
19.lintcode 查询国籍为 ‘USA’ 的所有教师所授课程名称
请编写 SQL 语句, 联合课程表(courses)和教师表(teachers)查询课程表中,国籍为 USA 的所有教师所授课程名称(name)。
表定义:teachers(教师表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
name | varchar | 讲师姓名 |
varchar | 讲师邮箱 | |
age | int | 讲师年龄 |
country | varchar | 讲师国籍 |
表定义:courses(课程表)
列名 | 类型 | 注释 |
---|---|---|
id | int unsigned | 主键 |
name | varchar | 课程名称 |
student_count | int | 学生总数 |
created_at | datetime | 课程创建时间 |
teacher_id | int unsigned | 讲师 id |
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
- 如果 teachers 中列 country 为 null,则返回的数据也为 null
- 如果 courses 中列 teacher id 为 null,则返回的数据也为 null
样例
样例一:
表内容 : teachers
id | name | age | country | |
---|---|---|---|---|
1 | Eastern Heretic | eastern.heretic@gmail.com | 20 | UK |
2 | Northern Beggar | northern.beggar@qq.com | 21 | CN |
3 | Western Venom | western.venom@163.com | 28 | USA |
4 | Southern Emperor | southern.emperor@qq.com | 21 | JP |
5 | Linghu Chong | NULL | 18 | CN |
表内容:courses
id | name | student_count | created_at | teacher_id |
---|---|---|---|---|
1 | Senior Algorithm | 880 | 2020-6-1 09:03:12 | 4 |
2 | System Design | 1350 | 2020-7-18 10:03:12 | 3 |
3 | Django | 780 | 2020-2-29 12:03:12 | 3 |
4 | Web | 340 | 2020-4-22 13:03:12 | 4 |
5 | Big Data | 700 | 2020-9-11 16:03:12 | 1 |
6 | Artificial Intelligence | 1660 | 2018-5-13 18:03:12 | 3 |
7 | Java P6+ | 780 | 2019-1-19 13:03:12 | 3 |
8 | Data Analysis | 500 | 2019-7-12 13:03:12 | 1 |
10 | Object Oriented Design | 300 | 2020-8-8 13:03:12 | 4 |
12 | Dynamic Programming | 2000 | 2018-8-18 20:03:12 | 1 |
在运行你的 SQL 语句之后,表应返回:
name |
---|
System Design |
Django |
Artificial Intelligence |
Java P6+ |
样例二:
表内容 : teachers
id | name | age | country | |
---|---|---|---|---|
1 | Eastern Heretic | eastern.heretic@gmail.com | 20 | UK |
2 | Northern Beggar | northern.beggar@qq.com | 21 | CN |
3 | Western Venom | western.venom@163.com | 28 | USA |
4 | Southern Emperor | southern.emperor@qq.com | 21 | JP |
5 | Linghu Chong | NULL | 18 | CN |
表内容:courses
id | name | student_count | created_at | teacher_id |
---|---|---|---|---|
1 | Senior Algorithm | 880 | 2020-6-1 09:03:12 | 4 |
4 | Web | 340 | 2020-4-22 13:03:12 | 4 |
5 | Big Data | 700 | 2020-9-11 16:03:12 | 1 |
8 | Data Analysis | 500 | 2019-7-12 13:03:12 | 1 |
10 | Object Oriented Design | 300 | 2020-8-8 13:03:12 | 4 |
12 | Dynamic Programming | 2000 | 2018-8-18 20:03:12 | 1 |
在运行你的 SQL 语句之后,表应返回:
name
因为 courses 表中没有 Western Venom 老师所教的课程,所以返回的课程名也为空,所以这里只展示了标题,没有数据。
一看就是多表查询题目,让其外键相等即可将两个表连接起来
题解:
1 | select c.name |
20.leetcode 第N高的薪水
表: Employee
1 | +-------------+------+ |
查询 Employee
表中第 n
高的工资。如果没有第 n
个最高工资,查询结果应该为 null
。
查询结果格式如下所示。
示例 1:
1 | 输入: |
示例 2:
1 | 输入: |
题解:
1 | CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT |
21.linkcode 我的最佳好友
在本题中,存在以下三张表:
Student
表
column | type |
---|---|
id | int |
name | int |
Friend
表(最佳好友)
column | type |
---|---|
id | int |
fid | varchar |
Score
表
column | type |
---|---|
id | int |
value | int |
现在你需要根据这三张表,找到所有最佳好友成绩比他们自己高的学生,同时根据最佳好友的成绩进行降序排序,最后输出这些学生自己的名字。
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhangfeifei】备注【66】领取
多个人的最佳好友可能是同一个人。
一个人的最佳好友的最佳好友不一定是这个人自己。
样例
样例 1
输入:
Student
表:
id | name |
---|---|
0 | Jack Rath |
1 | Jackie Little |
2 | Sheila Hintz |
Friend
表:
id | fid |
---|---|
0 | 1 |
1 | 2 |
2 | 0 |
Score
表:
id | value |
---|---|
0 | 80 |
1 | 90 |
2 | 100 |
输出:
name |
---|
Jackie Little |
Jack Rath |
解释:
- Jack Rath 的最佳好友 Jackie Little 成绩为 90,比 Jack Rath 自己的 80 高
- Jackie Little 的最佳好友 Sheila Hintz 成绩为 100,比 Jackie Little 自己的 90 高
- Sheila Hintz 的最佳好友 Jack Rath 成绩为 80,比 Sheila Hintz 自己的 100 低(因此最终结果不包含 Sheila Hintz)
由于 Jackie Little 的最佳好友成绩为 100,Jack Rath 的最佳好友为 90,因此按照最佳好友的降序顺序是 Jackie Little、Jack Rath。
样例 2
输入:
Student
表:
id | name |
---|---|
0 | Jack Rath |
1 | Jackie Little |
2 | Sheila Hintz |
Friend
表:
id | fid |
---|---|
0 | 1 |
1 | 2 |
2 | 1 |
Score
表:
id | value |
---|---|
0 | 100 |
1 | 90 |
2 | 80 |
输出:
name |
---|
Jackie Little |
题解:
1 | select s.name as name |
22.牛客网 SQL26 计算25岁以上和以下的用户数量(if的使用)
题目:现在运营想要将用户划分为25岁以下和25岁及以上两个年龄段,分别查看这两个年龄段用户数量
本题注意:age为null 也记为 25岁以下
示例:user_profile
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
---|---|---|---|---|---|---|---|---|
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | male | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
根据示例,你的查询应返回以下结果:
age_cut | number |
---|---|
25岁以下 | 4 |
25岁及以上 | 3 |
题解:
1 | SELECT IF(age >= 25, '25岁及以上', '25岁以下') AS age_cut, COUNT(*) AS number |
这里主要用了if查询
1 | IF(condition, value_if_true, value_if_false) |
-
condition: 这是一个逻辑表达式,返回布尔值(
TRUE
或FALSE
)。 -
value_if_true: 当条件为
TRUE
时返回的值。 -
value_if_false: 当条件为
FALSE
时返回的值。
解释