【头歌系统数据库实验】实验8 SQL的复杂多表查询-2

目录

第1关:基于派生表查询每个队员解答中超过他平均memory的user_id及题目编号problem_id

第2关:用ANY/ALL实现查询2019级选手(user_id前4位为2019)满足比2020级其中一个选手注册时间早即可的选手

第3关:用聚集查询实现查询2019级选手(user_id前4位为2019)满足比2020级其中一个选手注册时间早即可的选手

第4关:用ANY/ALL实现查询2019级选手所有比2020级选手注册时间都早的选手信息

第5关:用聚集查询实现查询2019级选手所有比2020级选手注册时间都早的选手信息

第6关:用 NOT EXISTS 实现查询至少参与过"202002020217"选手参与过的所有比赛的选手信息

第7关:求至少用了供应商 S1所供应的全部零件的工程号 JNO


如果对你有帮助的话,不妨点赞收藏评论一下吧,爱你么么哒😘❤️❤️❤️

第1关:基于派生表查询每个队员解答中超过他平均memory的user_id及题目编号problem_id

任务描述

基于派生表查询每个队员解答中超过他平均memory的user_id及题目编号problem_id(查询结果无需去重) 注意:按课本的别称表名+列名的方式,mysql8.0可以过,但oj题用的是mysql5.7,不能通过,所以仅用表名别称。

相关知识

solution:选手提交的题目解答 solution表如下图(仅显示前几条):

,

现已构建solution表,结构信息如下:

,


开始你的任务吧,祝你成功!

USE `sqlexp-sztuoj`;
#请在此处添加实现代码
########## Begin ##########

select solution.user_id, problem_id 
from solution
join (select 
user_id, avg(memory) 
as am 
from solution 
group by user_id) uam
on solution.user_id = uam.user_id and memory > am;

########## End ##########

第2关:用ANY/ALL实现查询2019级选手(user_id前4位为2019)满足比2020级其中一个选手注册时间早即可的选手

任务描述

用ANY/ALL实现查询2019级选手(user_id前4位为2019)满足比2020级其中一个选手注册时间(reg_time)早即可的选手信息

相关知识

users为选手信息表; users表如下图(仅显示前几条):

,

现已构建users表,结构信息如下:

,


开始你的任务吧,祝你成功

USE `sqlexp-sztuoj`;
#请在此处添加实现代码
########## Begin ##########
select user_id, reg_time, name 
from users
where user_id like '2019%' and reg_time < any(
    select reg_time 
    from users 
    where user_id like '2020%');


########## End ##########

第3关:用聚集查询实现查询2019级选手(user_id前4位为2019)满足比2020级其中一个选手注册时间早即可的选手

任务描述

用聚集查询实现查询2019级选手(user_id前4位为2019)满足比2020级其中一个选手注册时间(reg_time)早即可的选手信息

相关知识

users为选手信息表; users表如下图(仅显示前几条):

,

现已构建users表,结构信息如下:

,


开始你的任务吧,祝你成功

USE `sqlexp-sztuoj`;
#请在此处添加实现代码
########## Begin ##########
select user_id, reg_time, name 
from users
where user_id like '2019%' and reg_time < (
    select max(reg_time) 
    from users 
    where user_id like '2020%');

########## End ##########

第4关:用ANY/ALL实现查询2019级选手所有比2020级选手注册时间都早的选手信息

任务描述

用ANY/ALL实现查询2019级选手所有比2020级选手注册时间都早的选手信息

相关知识

users为选手信息表; users表如下图(仅显示前几条):

,

现已构建users表,结构信息如下:

,


开始你的任务吧,祝你成功!

USE `sqlexp-sztuoj`;
#请在此处添加实现代码
########## Begin ##########
select user_id, reg_time, name 
from users
where user_id like '2019%' and reg_time < all(
    select reg_time
    from users
    where user_id like '2020%'
);

########## End ##########

第5关:用聚集查询实现查询2019级选手所有比2020级选手注册时间都早的选手信息

任务描述

聚集查询实现查询2019级选手所有比2020级选手注册时间都早的选手信息

相关知识

users为选手信息表; users表如下图(仅显示前几条):

,

现已构建users表,结构信息如下:

,


开始你的任务吧,祝你成功

USE `sqlexp-sztuoj`;
#请在此处添加实现代码
########## Begin ##########
select user_id, reg_time, name 
from users
where user_id like '2019%' and reg_time < (
    select min(reg_time)
    from users
    where user_id like '2020%'
);

########## End ##########

第6关:用 NOT EXISTS 实现查询至少参与过"202002020217"选手参与过的所有比赛的选手信息

任务描述

用 NOT EXISTS 实现查询至少参与过"202002020217"选手参与过的所有比赛的选手信息,contest_id不为NULL

相关知识

1、users为选手信息表; users表如下图(仅显示前几条):

,

现已构建users表,结构信息如下:

,

2、solution为选手提交的题目解答 solution表如下图(仅显示前几条):

,

现已构建solution表,结构信息如下:

,


开始你的任务吧,祝你成功!

USE `sqlexp-sztuoj`;
#请在此处添加实现代码
########## Begin ##########
select u.user_id, u.reg_time, u.name 
from users u
where not exists(
    select contest_id 
    from (
        select s.contest_id 
        from solution s
        where s.user_id = '202002020217' and s.contest_id is not null) s1
    where not exists(
        select user_id, contest_id 
        from solution s2
        where s1.contest_id = s2.contest_id and u.user_id = s2.user_id)
);


########## End ##########

第7关:求至少用了供应商 S1所供应的全部零件的工程号 JNO

任务描述

求至少用了供应商 S1所供应的全部零件的工程号 JNO

相关知识

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
select JNO
from SPJ
where PNO ='P1' and JNO in
(select JNO
 from SPJ
 where PNO='P2');
########## End ##########

  • 34
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面为你介绍一下SQL数据库实验六嵌套查询。 嵌套查询是指在一个查询语句中嵌入另一个查询语句。嵌套查询可以通过子查询来实现,子查询可以嵌套在SELECT、FROM、WHERE等子句中,用于获取需要的数据。 下面是一个简单的示例: 假设我们有两张表:学生表(student)和成绩表(score),它们的结构如下: 学生表(student): | id | name | age | gender | |----|--------|-----|--------| | 1 | 张三 | 18 | 男 | | 2 | 李四 | 19 | 女 | | 3 | 王五 | 20 | 男 | | 4 | 赵六 | 21 | 女 | 成绩表(score): | id | student_id | course | score | |----|------------|--------|-------| | 1 | 1 | 语文 | 80 | | 2 | 1 | 数学 | 90 | | 3 | 2 | 语文 | 85 | | 4 | 2 | 数学 | 95 | | 5 | 3 | 语文 | 70 | | 6 | 3 | 数学 | 80 | 现在,我们要查询出每个学生的总成绩和平均成绩,可以使用嵌套查询来实现: ``` SELECT s.id, s.name, (SELECT SUM(score) FROM score WHERE student_id = s.id) AS total_score, (SELECT AVG(score) FROM score WHERE student_id = s.id) AS avg_score FROM student s; ``` 上述SQL语句中,首先查询学生表(student),然后通过嵌套查询获取每个学生的总成绩和平均成绩。在子查询中,WHERE子句指定了查询条件,即只查询与当前学生相关的成绩信息。 嵌套查询可以实现非常复杂查询,但也可能导致查询效率低下。因此,在使用嵌套查询时,需要根据实际情况合理设计查询语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值