数据库SQL语言实战(八)

目录

练习题 

题目一

题目二 

题目三 

题目四 

题目五 

题目六 

题目七 

题目八 

题目九

题目十


练习题 

题目一

找出年龄小于20岁且是“物理学院”的学生的学号、姓名、院系名称,按学号排序

create or replace view test6_01 as
select S.sid,S.name,S.dname
from pub.student S
where S.age<20 and
S.dname='物理学院'
order by S.sid

关键点:

1、create or replace:可以创建或者替代table和view,方便调试错误

题目二 

查询统计2009级、软件学院所有学生的学号、姓名、总成绩(列名sum_score)(如果有学生没有选一门课,则总成绩为空值)

create or replace view test6_02 as
select S.sid,S.name,sum(SC.score) sum_score
from pub.student S left outer join pub.student_course SC
on S.sid=SC.sid
where S.dname='软件学院' andS.class=2009
group by S.sid,S.name

关键点:

1、left outer join 需要利用on来确定连接的原则

2、select结果集、view和table三者都是不同的。select结果集是一次性显示的在数据库中不占有任何内存;view在数据库中占有非常小的内存,因为它并不存储数据而是动态从table中获取;table是真实存储数据的,是占有内存的

题目三 

查询所有课的最高成绩、最高成绩人数,test6_06有四个列:课程号cid、课程名称name、最高成绩max_score、最高成绩人数max_score_count(一个学生同一门课成绩都是第一,只计一次,需要考虑刷成绩情况,一个同学选了一个课程多次,两次都是最高分。如果结果错一行,可能就是没有考虑这种情况,这里是为了考核“去重复计数”知识点的)。如果没有学生选课,则最高成绩为空值,最高成绩人数为零

提示:参考讲义关于标量子查询(只返回包含单个属性的单个元组)

create or replace view test6_03 as
select*
from
(select C.cid,C.name,max(SC.max_score) max_scorefrom pub.course C left outer join (select sid,cid,max(score) max_scorefrom pub.student_coursegroup by sid,cid)SCon C.cid=SC.cidgroup by C.cid,C.name
) 
natural full outer join
(select SC.cid,count(sid) max_score_countfrom (select sid,cid,max(score) max_scorefrom pub.student_coursegroup by sid,cid)SCgroup by SC.cid,SC.max_scorehaving (SC.max_score=(select max(score) from pub.student_course tempwhere SC.cid=temp.cid))
)

关键点:

1、多个select结果处理:每一个sql程序只能有一个最终的select,而不能重复显示select多次的结果(结果会覆盖从而报错);如果select结果要按行合并则用union(删除重复行)/union all(不删除重复行);如果select结果要按列合并,则可以用join、natural full outer join

2、select结果是临时的不是表也不是视图,所以要将select结果合并需要把select语句放在from中当成一个临时关系来处理

3、当select提取较为复杂时,可以考虑分开两个select语句处理,再将select结果合并处理

4、没有学生考试的课程也要呈现出课程的cid和name,就是后面的max_score以及count用NULL来处理。用left outer join/full outer join来完成这一功能

题目四 

找出选修了“操作系统”并取得学分或者选修“数据结构”并且取得学分,但是没有选修“程序设计语言”或者没有取得这门课的学分的男学生的学号、姓名

create or replace view test6_04 as
select SC.sid,S.name
from pub.student_course SC,pub.student S,pub.course C
where SC.sid=S.sid and SC.cid=C.cid
and SC.score>=60 and (C.name='操作系统' or C.name='数据结构')
and S.sex='男' and (SC.sid not in(select SC.sidfrom pub.student_course SC,pub.course Cwhere SC.cid=C.cid andC.name='程序设计语言' andSC.score>=60))

关键点:

1、对于或的关系可以直接在where 的条件中利用or来表达,但是对于与的关系不能在where中利用and来写,而是要select后将结果取交集(intersect)

2、没有 或 没有 =有 与 有 取一个否定 。所以在实现上直接在where上利用not in 来实现

题目五 

查询20岁的所有有选课的学生的学号、姓名、平均成绩(avg_score,此为列名,下同)(平均成绩四舍五入到个位)、总成绩(sum_score)

Test6_05有四个列,并且列名必须是:sid、name、avg_score、sum_score。通过下面方式实现列名定义:

create or replace view test6_05 as select sid,name,(表达式) avg_score,(表达式) sum_score  from ……

create or replace view test6_05 as
select S.sid sid,S.name name,round(avg(score),0) avg_score,round(sum(score),0) sum_score
from pub.student S,pub.student_course SC
where S.sid=SC.sid and S.age=20
group by S.sid,S.name

关键点:

1、四舍五入处理round函数:round(number,digit)

digit>0:四舍五入到第digit位小数

digit=0:四舍五入到整数

digit<0:在整数位置四舍五入(-1:四舍五入到十位;-2:四舍五入到百位)

题目六 

找出同一个同学同一门课程有两次或以上不及格的所有学生的学号、姓名(即一门课程需要补考两次或以上的学生的学号、姓名)

create or replace view test6_06 as
select S.sid,S.name
from pub.student S,pub.student_course SC
where S.sid=SC.sid and
SC.score<60
group by S.sid,S.name,SC.cid
having (count(*)>=2)

关键点:

1、这里查找的对象是一个学生一门课上所有考试记录 

题目七 

找出选修了所有课程并且每门课程每次考试成绩均及格的学生的学号、姓名。(题6的延伸和巩固)

create or replace view test6_07 as
select distinct S.sid,S.name
from pub.student S,pub.student_course SC
where S.sid=SC.sid and S.sid in(select sidfrom pub.student_course SCwhere not exists(select cidfrom pub.course Cminusselect cidfrom pub.student_course Tempwhere Temp.sid=SC.sid)
) and S.sid not in(select sidfrom pub.student_course SCwhere SC.score<60
)

关键点:

1、选修了所有课程就是除法的应用

2、所有成绩都及格查找对象是一个学生一门课上所有考试记录 

题目八 

找出选修了所有课程并且得到所有课程的学分(即每门课程最少一次考试及格)的学生的学号、姓名。(题6的 延伸和巩固)

create or replace view test6_08 as
with T as(select sid, cid, MAX(score) AS max_scorefrom pub.student_coursegroup by sid, cid
) 
select distinct S.sid,S.name
from pub.student S,T SC
where S.sid=SC.sid and S.sid in(select sidfrom T SCwhere not exists(select cidfrom pub.course Cminusselect cidfrom T Tempwhere Temp.sid=SC.sid)
) and S.sid not in(select sidfrom T SCwhere SC.max_score<60
)

关键点:

1、本题和上一题不同点在于:查找的对象转变为:一个学生一门课上最高成绩

题目九

查询统计2010级、化学与化工学院的学生总学分表,内容有学号、姓名、总学分sum_credit。(不统计没有选课的学生)

create or replace view test6_09 as
select S.sid,S.name,sum(C.credit) sum_credit
from pub.student_course SC,pub.student S,pub.course C
where SC.cid=C.cid and SC.sid=S.sid
and S.dname='化学与化工学院'
and S.class=2010 and SC.score>=60
group by S.sid,S.name

题目十

查询学生表中每一个姓氏及其人数(不考虑复姓,用到取子串函数substr(string,postion,length))),test6_10有两个列:second_name、p_count

create or replace view test6_10 as
select substr(S.name,1,1) second_name,count(*) p_count
from pub.student S
group by substr(S.name,1,1)

关键点:

1、group by后面可以跟表达式(例如:to_char(trunc(sc.score, -1), 'fm000') || '-' || to_char(trunc(sc.score, -1) + 9, 'fm000') as score)、字段(substr)

 总结 

本文的所有题目均来自《数据库系统概念》(黑宝书)、山东大学数据库实验六。不可用于商业用途转发。

如果能帮助到大家,大家可以点点赞、收收藏呀~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/687748.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基础算法总结】二分查找一

二分查找一 1. 二分查找2.在排序数组中查找元素的第一个和最后一个位置3.x 的平方根4.搜索插入位置 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1…

【Spring之依赖注入】2. Spring处理@Async导致的循环依赖失败问题

使用异步Async注解后导致的循环依赖失败详解 1 问题复现1.1 配置类1.2 定义Service1.3 定义Controller1.4 启动springboot报错 2.原因分析&#xff1a;看Async标记的bean注入时机2.1 循环依赖生成过程2.2 自检程序 doCreateBean方法 3.解决方案3.1 懒加载Lazy3.1.1 将Lazy写到A…

综合性练习(验证码案例)

目录 一、需求 二、准备工作 三、约定前后端交互接口 1、需求分析 2、接口定义 四、Hutool工具介绍 1、引入依赖 2、测试使用Hutool生成验证码 五、实现服务器端代码 代码解读&#xff1a; 六、调整前端页面代码 七、运行测试 随着安全性的要求越来越高&#xff0c…

Vue3专栏项目 -- 二、自定义From组件(下)

需求分析&#xff1a; 现在我们还需要一个整体的表单在单击某个按钮的时候可以循环的验证每个input的值&#xff0c;最后我们还需要有一个事件可以得到最后验证的结果&#xff0c;从而进行下一步的操作 如下&#xff0c;我们应该有一个form表单包裹着全部的input表单&#xf…

HC-05的简介与使用

蓝牙概述 蓝牙&#xff08;Bluetooth&#xff09;是一种用于无线通信的技术标准&#xff0c;允许设备在短距离内进行数据交换和通信。它是由爱立信&#xff08;Ericsson&#xff09;公司在1994年推出的&#xff0c;以取代传统的有线连接方式&#xff0c;使设备之间能够实现低功…

【Docker】Docker部署Java程序

Maven中使用打包插件 <build><finalName>duanjian</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass…

​在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理

在缺少标注数据场景&#xff0c;SetFit 是解决的建模问题的一个有前途的解决方案&#xff0c;其由 Hugging Face 与Intel 实验室以及UKP Lab合作共同开发。作为一个高效的框架&#xff0c;SetFit 可用于对Sentence Transformers模型进行少样本微调。 SetFit 仅需很少的标注数据…

融资融券概念和操纵流程,案例解析

融资融券是一种金融工具&#xff0c;它允许投资者在证券市场上进行杠杆交易。简单来说&#xff0c;融资就是借钱买股票&#xff0c;融券就是借股票卖出。这种交易方式可以帮助投资者在短期内获得更高的收益&#xff0c;但同时也伴随着较高的风险。 案例背景&#xff1a; 假设…

素数判定的优化

常规写法亲民&#xff0c;高效写法炼人。用素数的基本特性写&#xff0c;易读易懂&#xff1b;用6k1特性写&#xff0c;高效但却得有学过《数论》。 (笔记模板由python脚本于2024年05月09日 19:47:00创建&#xff0c;本篇笔记适合初通Python&#xff0c;熟悉六大基本数据(str字…

打开linux内核的企鹅log

Linux 内核启动的时候可以选择显示小企鹅 logo&#xff0c;只要这个小企鹅 logo 显示没问题那么我 们的 LCD 驱动基本就工作正常了。这个 logo 显示是要配置的&#xff0c;不过 Linux 内核一般都会默认 开启 logo 显示。 打开 Linux内核图形化配置界面&#xff0c;按下路径找到…

【错题集-编程题】最大子矩阵(二维前缀和)

牛客对应题目链接&#xff1a;最大子矩阵_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 ⼆维前缀和矩阵 的应用。 初始化⼆维前缀和矩阵。枚举所有的子矩阵&#xff0c;求出最大子矩阵。 这道题的输入规模最大为 100&#xff0c;用动态规划可以做到 O(n^3)。 下面的做法虽然…

C语言/数据结构——(链表的回文结构)

一.前言 今天在牛客网上刷到了一道链表题——链表的回文结构https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?&#xff0c;巧合的是它的解题思路恰好是我们一起分享过两道链表题的汇总。这两道题分别是反转链表和链表的中间节点。废话不多数&#xff0c…