【MySQL基础刷题】总结题型(一)

devtools/2024/10/9 3:28:47/

一篇十题复习的负担小一点

  • 不重要的知识点
  • 1.第二高的薪水
  • 2.分数排名
  • 3.连续出现的数字
  • 3.部门工资最高的员工
  • 4.部门工资前三高的人
  • 5.游戏玩法分析II
  • 6.游戏玩法分析III
  • 7.购买了A和B但没有购买C
  • 8.机器的进程平均运行时间
  • 9.每位学生的最高成绩
  • 10.学生们参加各科测试的次数

在这里插入图片描述

不重要的知识点

这里记录了几个自己刷题过程中的小tips

  1. Type是varchar时统计长度,假如Column Name是content。那么就是char_length(content)
  2. 遇到昨天,明天等,需要将日期+1的,用date_add。date_add(w1.recordDate, interval 1 day,w1表中的recordDate这一列加了一天

1.第二高的薪水

在这里插入图片描述
找第二高的薪水,有就返回,没有就返回null

思路:
想要第二高,需要排序,使用order by,默认就是asc升序,想要降序可以用desc;
去重,多个重复数据需要使用distinct去重;
判断临界输出,如果不存在第二高的薪水,查询应该返回null,使用ifNull;
查找第二大使用limit,limit(1,1)。这个数据是因为默认从0开始,所以第一个1是查询第二大的数,第二个1是表示往后显示多少条数据,这里只需要一条。所以是limit(1,1)

select ifNull((select distinct Salary from Employee order by Salary desc limit 1, 1), null) 
as SecondHighestSalary;

注意limit没有括号

2.分数排名

在这里插入图片描述
要求将score排名,从高到低,新加一列rank,score相等的rank排名也相等

引入窗口函数的做法

select score, dense_rank() over(order by score desc) as 'rank' 
from Scores;
  • dense_rank()函数为结果集中的每一行返回其在指定列排序后的排名
  • 与 rank() 函数类似,dense_rank () 在有相同值的行中会返回相同的排名,但排名之间不会有间隔。例如,如果两行并列第一,则下一行的排名就是第二,而不是第三。但 rank() 会将排名跳过,比如两行并列第一,下一行就是第三。
  • 窗口函数通常与 over() 子句结合使用,over() 子句定义了窗口函数操作的数据窗口。

3.连续出现的数字

在这里插入图片描述
找出所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。

自连接,查看当前行与前两行的关系,是不是num相同,id差1和2

select distinct a.num as 'ConsecutiveNums'
from Logs a
join Logs b on a.id = b.id + 1 and a.num = b.num
join Logs c on a.id = c.id + 2 and a.num = c.num

3.部门工资最高的员工

表Employee
在这里插入图片描述
查出每个部门中薪资最高的员工
输出要求:
在这里插入图片描述

SELECT d.name AS Department, e.name AS Employee, e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
WHERE e.salary >= ALL (SELECT salaryFROM EmployeeWHERE e.departmentId = departmentId
);

主查询从 e 表中选择所有员工,并与 d 表连接,获取部门名称。子查询从 Employee 表中选择同部门的所有薪资。通过 >= ALL 确定选出的员工在其所在部门中的薪资是最高的,即他们的薪资大于或等于他们部门中任何其他人的薪资。

4.部门工资前三高的人

相同工资的人排名相同
还是要用窗口函数
rank() 函数的特性是,当多个员工具有相同的工资时,它会给这些员工相同的排名,并且之后的排名会跳过相应的数量。这意味着如果两个或更多员工共享同一排名,随后的排名数字会相应地跳过。
所以这里用的不是rank()而是dense_rank(),他不会跳过任何排名数量

partition by是sql窗口函数的一个组成部分,用于执行窗口函数计算时对数据进行分组

窗口函数只能写在select语句中
where子句不能用于过滤使用窗口函数计算的结果,因为窗口函数在 where 子句处理后才执行。

select Department, Employee, salary
from(select d.name as Department, e.name as Employee, e.salary as salary,dense_rank() over(partition by e.departmentId order by e.salary desc) as salaryrankfrom Employee e left join Department d on e.departmentId = d.id
)ranked
where salaryrank <= 3;

这个ranked是指代的别名

5.游戏玩法分析II

有张activity表,列名有在这里插入图片描述
现在需要找到每一个玩家首次登陆的设备名称,返回player_id和device_id

select player_id, device_id 
from Activity
where (player_id, event_date) in
(select player_id, min(event_date)
from Activity
group by player_id
)

6.游戏玩法分析III

还是activity表
报告玩家到 目前为止 玩了多少游戏。通过date累加的
还是要用窗口函数
sum() 窗口函数会计算截至每个 event_date 的 games_played 的累积总和。

select player_id, event_date, sum(games_played) over (partition by player_id order by event_date asc) as games_played_so_far
fromActivity
order byplayer_id, event_date;
  • sum(games_played) over (…):这是一个窗口聚合函数,用于计算累积总和。
  • partition by player_id表示窗口函数在每个player_id上独立计算。也就是说,每个玩家的游戏次数累加是独立的。
  • order by event_date asc表示在每个玩家的分区内,累积计算是按照日期顺序进行的。从最早的记录开始,一直加到当前行日期
  • 最后的 order by 确保结果首先按玩家ID排序,其次按日期排序,这使得结果更易读。

7.购买了A和B但没有购买C

Customers表和Orders表
在这里插入图片描述
现在要求输出买了A和B但没买C的顾客信息,返回格式如下:
customer_id | customer_name

select o.customer_id, c.customer_name 
from orders o left join customers c
on o.customer_id = c.customer_id
group by customer_id
having SUM(if(product_name = 'A', 1, 0)) > 0 andSUM(if(product_name = 'B', 1, 0)) > 0 andSUM(if(product_name = 'C', 1, 0)) = 0

8.机器的进程平均运行时间

输入一张表:
在这里插入图片描述
输出每台机器的平均运行时间
在这里插入图片描述

selectmachine_id,round(2*avg(if(activity_type = 'start', -1, 1) * timestamp), 3) as processing_time
from Activity
group by machine_id;

9.每位学生的最高成绩

在这里插入图片描述
用窗口函数

select student_id, course_id, grade 
from 
(select *,
dense_rank() over (partition by student_id order by grade desc, course_id) rk 
from enrollments) t
where rk=1

dense_rank()用于分配唯一的排名给结果集中的每一行,当有相同行时,得到相同的排名,并且不跳过任何数字(rank()会跳过)

partition by student_id order by grade desc, course_id
其中partition by意味着,排名是针对每个学生的,而不是整个结果集,所以说,每个学生都有自己独立的成绩排名
order by grade desc,course_id在为每个学生的成绩排名时,首先根据成绩降序,相同时根据课程ID升序

先select *是为了快速选择所有列,是为了方便
as rk为排名指定了一个别名

10.学生们参加各科测试的次数

输入学生表,学科表和考试表
在这里插入图片描述
在这里插入图片描述
输出学生的考试信息以及每门课考试的次数
在这里插入图片描述

select s.student_id, s.student_name, su.subject_name, count(e.subject_name) as attended_exams
from Students s join Subjects su left join Examinations e one.student_id = s.student_id and e.subject_name = su.subject_name
group by student_id, su.subject_name
order by student_id, su.subject_name

http://www.ppmy.cn/devtools/120425.html

相关文章

图像处理基础知识点简记

简单记录一下图像处理的基础知识点 一、取样 1、释义 图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化, 决定了图像的空间分辨率。 2、过程 简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个…

VB.NET中如何利用LINQ to SQL进行数据库操作

在VB.NET中&#xff0c;利用LINQ to SQL进行数据库操作是一种强大的方式&#xff0c;它允许你使用VB.NET的查询语法来直接操作数据库&#xff0c;而无需编写大量的SQL代码。LINQ to SQL是一种ORM&#xff08;对象关系映射&#xff09;技术&#xff0c;它将数据库表映射为.NET中…

若无向图G(V,E)中含7个顶点,为保证图G在任何情况下都是连通的,则需要的边数最少是多少?

这乍一看是不是可抽象&#xff08;迷糊&#xff09;了&#xff0c;butttt待我小翻译一下。 先举少一点的例子&#xff0c;假如我们有三个点&#xff0c;我给你两条边&#xff0c;那是不是不管咋连都一定一定是连通的。 那我们再进一步&#xff0c;假如四个点呢&#xff1f;我给…

【STM32】 TCP/IP通信协议(1)--LwIP介绍

一、前言 TCP/IP是干啥的&#xff1f;它跟SPI、IIC、CAN有什么区别&#xff1f;它如何实现stm32的通讯&#xff1f;如何去配置&#xff1f;为了搞懂这些问题&#xff0c;查询资料可解决如下疑问&#xff1a; 1.为什么要用以太网通信? 以太网(Ethernet) 是指遵守 IEEE 802.3 …

操作符详解与表达式求值

目录 操作符分类 1.算数操作符 2.移位操作符&#xff08;只适用于整数范围&#xff09; &#xff08;1&#xff09;引入 &#xff08;2&#xff09;左移操作符<< &#xff08;2&#xff09;右移操作符>> 3.位操作符 4.赋值操作符 复合赋值符 5.单目操作符 5…

【系统架构设计师】专题:需求工程总结

更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 一、软件需求二、需求获取三、需求分析3.1 需求分析的任务3.2 结构化的需求分析四、需求定义五、需求验证六、需求管理一、软件需求 软件需求是指 用户对系统在功能、行为、性能、设计约束等方面的期望。是指用户解决…

CSS点击事件穿透

假设盒子中有一个按钮&#xff0c;要实现点击按钮时透过按钮的点击事件&#xff0c;只触发盒子的点击事件&#xff0c;这个时候只需要给按钮设置如下属性即可&#xff1a; button {/* 清除点击事件 */pointer-events: none; } uniapp测试代码如下&#xff1a; <templat…

IDEA开发SpringBoot项目基础入门教程。包括Spring Boot简介、IDEA创建相关工程及工程结构介绍、书写配置文件、Bean对象管理等内容

文章目录 0. 关于本文1. 概述1.1 Spring简介1.2 Spring Boot简介1.3 传统的开发方式1.3.1 简述1.3.2 缺点 1.4 Spring Boot的优点 2. 创建一个简单的Spring Boot应用程序2.1 在IDEA创建项目2.2 pom配置文件内容2.3 启动类2.4 创建Controller 3. 从Maven工程创建Spring Boot工程…