Mysql练习1

Mysql练习1
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时返回的值。
解释












