【数据库】实验五 数据库综合查询|多表查询、聚集函数、orderby、groupby

2024-03-05 18:50

本文主要是介绍【数据库】实验五 数据库综合查询|多表查询、聚集函数、orderby、groupby,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 参考文章

本文在实验四的基础上增加了orderby、聚集函数、groupby、多表查询的知识点,相较于上一次实验的难度变大了,嵌套表达更多了,逐渐开始套娃……
其实可以看成一个偏正短语来拆分,再写成SQL语句,比如查询一个年龄大于20的学生成绩,那么学生成绩就为中心语,年龄大于20则作为修饰语,将中心语放至select ...from之间,依次类推进行分析。


  1. 查询‘C language’或者‘Database’的学生学号、姓名、所在院系、选修课程号及成绩;
  1. 中心语:Student.sno,sname,sdept,Course.cno,SC.grade放到前面
  2. 由于所查询的内容涉及三个表,所以将三表按照索引进行合并Student.sno=SC.sno and Course.cno=SC.cno
  3. 修饰语:课程为‘C language’或者‘Database’=》为在课程名字中查询‘C language’或者‘Database’
select Student.sno,sname,sdept,Course.cno,SC.grade 
from Student,Course,SC 
where Student.sno=SC.sno and Course.cno=SC.cno 
and Course.cname in ('C language','Database');

在这里插入图片描述


  1. 查询缺少成绩的所有学生的详细情况;
  1. 中心语:学生的详细情况Student.*
  2. 合并Student,SC两表Student.sno=SC.sno
  3. 修饰语:成绩缺少grade is null
select Student.* 
from Student,SC 
where Student.sno=SC.sno and grade is null;

在这里插入图片描述


  1. 查询与‘Lisi’(假设姓名唯一)年龄不同的所有学生的信息;
  1. 中心语:学生信息Student.*
  2. 从表Student提取信息
  3. 修饰语:与‘Lisi’年龄不同;提取年龄为中心语,Lisi的年龄为修饰语
select Student.* 
from Student 
where sage not in (select sage from Student where sname='Lisi');

在这里插入图片描述


  1. 查询所选课程的平均成绩大于‘Lisi’的平均成绩的学生学号、姓名及平均成绩
  1. 中心语:学生学号、姓名及平均成绩Student.sno,sname,avg(SC.grade)
  2. 合并Student,SC两表Student.sno=SC.sno
  3. 修饰语:课程的平均成绩avg(Grade)
  4. 子语句:‘Lisi’的平均成绩=》查李四的成绩,嵌套一个子语句:select avg(grade)from SC,Student where sname='lisi’and Student.sno=SC.sno
select Student.sno,sname,avg(grade) 
from Student ,SC
where Student.sno=SC.sno 
group by Student.sno,sname
having avg(Grade)>(select avg(grade)from SC,Student where sname='lisi'and Student.sno=SC.sno)

由于条件语句中有聚集函数avg所有使用group by … having

  • count sum avg max min
  • 不可以出现在where语句后面,要使用group by和having

在这里插入图片描述


  1. 按照学号,姓名,所在院系,已修学分的顺序列出学生学分的获得情况。
    其中已修学分为考试已经及格的课程学分之和;
  1. 中心语:学号,姓名,所在院系,已修学分
  2. 三表按照索引进行合并Student.sno=SC.sno and Course.cno=SC.cno
  3. 修饰语:已经及格的课程学分之和
select Student.sno,sname,sdept,sum(ccredit) 
from Student,SC,Course 
where Student.sno=SC.sno and SC.cno=Course.cno 
and grade>60 group by student.sno,sname,sdept;

在这里插入图片描述


  1. 查询只选修一门课程的学生的学号、姓名、院系及成绩;
  1. 中心语:学生的学号、姓名、院系及成绩
  2. 涉及两个表内容,连接两表:Student.sno=SC.sno
  3. 修饰语:只选修一门的课程
  4. 子语句中心语:课程
  5. 子语句修饰语:只选修一门
select Student.sno,sname,sdept,grade
from Student,SC
where Student.sno=SC.sno
and SC.sno in (select sno from SC group by SC.sno having count(distinct cno)=1);

在这里插入图片描述


  1. 查找选修了至少一门和‘Lisi’选修课程一样的学生的学号、姓名及课程号;
  1. 中心语:学生的学号、姓名及课程号
  2. 二表按照索引进行合并Student.sno=SC.sno
  3. 修饰语:选修了至少一门和‘Lisi’选修课程一样
  4. 子语句中心语:课程一样的学生
  5. 子语句修饰语:‘Lisi’选修的课程
select Student.sno,sname,cno 
from Student,SC 
where Student.sno=SC.sno 
and SC.sno in 
(select SC.sno from SC,Student where cno in 
(select cno from Student,SC where sname='lisi' and Student.sno=SC.sno));

在这里插入图片描述


  1. 至少选修’C language’或’Database’课程的学生的基本信息;
  • 只包括其中一门或两门:
  1. 中心语:学生的基本信息
  2. 三表按照索引进行合并Student.sno=SC.sno and Course.cno=SC.cno
  3. 修饰语:至少选修’C language’或’Database’课程
  4. 子语句中心语:课程
  5. 子语句修饰语:选修’C language’或’Database’
select Student.sno,sname,sdept,SC.cno,cname,grade 
from Student,SC,Course 
where Student.sno=SC.sno and Course.cno=SC.cno 
and SC.cno in 
(select SC.cno from SC,Course where (cname='C language' or cname='Database') and SC.cno=Course.cno);

在这里插入图片描述

  • 两门全部包括:
  1. 中心语:学生的基本信息
  2. 三表按照索引进行合并Student.sno=SC.sno and Course.cno=SC.cno
  3. 修饰语:至少选修’C language’或’Database’课程
  4. 子语句中心语:课程
  5. 子语句修饰语:选修’C language’和’Database’
select Student.sno,sname,sdept,SC.cno,grade 
from Student,SC,Course 
where Student.sno=SC.sno and Course.cno=SC.cno 
and SC.sno in (select SC.sno from SC,Course where (cname='C language' or cname='Database') 
and SC.cno=Course.cno group by SC.sno having count(SC.cno)>=2);

在这里插入图片描述


  1. 列出所有课程被选修的详细情况,包括课程号、课程名、学号、姓名及成绩
  1. 中心语:课程号、课程名、学号、姓名及成绩
  2. 三表按照索引进行合并Student.sno=SC.sno and Course.cno=SC.cno
  3. 修饰语:课程被选修
select Course.cno,cname,Student.sno,sname,grade 
from Student,SC,Course 
where Student.sno=SC.sno and SC.cno=Course.cno 
order by Course.cno;

在这里插入图片描述


  1. 查询只被一名学生选修的课程的课程号、课程名
  1. 中心语:课程号、课程名
  2. 二表按照索引进行合并Course.cno=SC.cno
  3. 修饰语:只被一名学生选修的课程
select SC.cno,cname 
from SC,Course where Course.cno=SC.cno 
group by SC.cno,cname having count(SC.cno)=1;

在这里插入图片描述


11.使用嵌套查询列出选修了’Data structure’课程的学生学号和姓名

  1. 中心语:学生学号和姓名
  2. 三表按照索引进行合并Student.sno=SC.sno and Course.cno=SC.cno
  3. 修饰语:选修了’Data structure’课程
  4. 子语句中心语:课程
  5. 子语句修饰语:选修了’Data structure’
select Student.sno,sname 
from Student,SC,Course 
where Student.sno=SC.sno and Course.cno=SC.cno 
and SC.cno in 
(select SC.cno from SC,Course where SC.cno=Course.cno and Course.cname='Data structure');

在这里插入图片描述


  1. 使用嵌套查询查询其它系中年龄小于AI的某个学生的学生姓名、年龄和院系;
  1. 中心语:学生姓名、年龄和院系
  2. 从表Student选取
  3. 修饰语1:其它系
  4. 修饰语2:年龄小于AI的某个学生的年龄
select sname,sage,sdept 
from Student 
where sage<any (select sage from Student where sdept='AI') and sdept<>'AI';

在这里插入图片描述

参考文章

https://blog.csdn.net/qq_43776450/article/details/95965866
https://blog.csdn.net/qq_43717736/article/details/107722502
https://max.book118.com/html/2017/0326/97190702.shtm

这篇关于【数据库】实验五 数据库综合查询|多表查询、聚集函数、orderby、groupby的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777475

相关文章

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora