山东大学 2020级数据库系统 实验二

What’s more

山东大学 2020级数据库系统 实验一
山东大学 2020级数据库系统 实验二
山东大学 2020级数据库系统 实验三
山东大学 2020级数据库系统 实验四
山东大学 2020级数据库系统 实验五
山东大学 2020级数据库系统 实验六
山东大学 2020级数据库系统 实验七
山东大学 2020级数据库系统 实验八、九

写在前面

做数据库实验一定要静得下心来,才能发现其中的错误然后进行改正。同时,如果发现 SQL 语句总是报错,“一定是你错了,只是不知道错在哪里”

其次,SQL 语句中较为复杂的点博主都进行了注释,希望大家一定要看懂思路后自己写一遍,而不是盲目的 Ctrl+C,Ctrl+V,切记切记!!

实验二

注意:实验二使用的表是:pub.student_course, pub.student, pub.course 哦,别搞错了!!

检索查询部分应该算是数据库中较为困难的一部分了,每道题我会先写出思路,同时在 SQL 语句中进行注释,希望能够看懂。

  • 2-1 找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生)
    思路:
    1. 找出有选课记录的同学的学号,不妨记为关系 A;
    2. 使用 not in 在 pub.student 中筛选不在 A 中有记录的学生的学号及姓名;
create view test2_01 asselect sid, namefrom pub.studentwhere sid not in(select sid			-- 选出有选课记录的同学的学号from pub.student_course)
  • 2-2 找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。
    思路 1:

    1. 选出该同学所选修了的课程号 cid,作为集合 A;
    2. 使用 = some 来对 pub.student_course 中每个同学的课程号 cid 进行筛选;
    3. 最后在 pub.student 中选出对应的学号 sid 及姓名 name

    思路 2:

    1. 选出该同学所选修了的课程号 cid,作为集合 A;
    2. 使用 in 根据 A 筛选出课程号在集合 A 中的同学对应的学号及姓名;
    3. 集合运算 minus(except) 减去该同学的学号及姓名
---------------思路 1---------------------
create view test2_02 asselect sid, namefrom pub.studentwhere sid in(select sidfrom pub.student_coursewhere sid <> '200900130417' 		-- 不包含这名同学and cid = some				-- 课程号至少有一个与 A 中元素相同的才满足条件(select cidfrom pub.student_coursewhere sid = '200900130417'))
---------------思路 2---------------------
create view test2_02 as(select sid, name					-- 选出对应的学生的学号及姓名(此时包括学号为‘200900130417’的这名同学)from pub.studentwhere sid in(select sid					-- 选出至少有一个 cid 在 A 中的同学的 sidfrom pub.student_coursewhere cid in(select cid				-- 集合 Afrom pub.student_coursewhere sid = '200900130417')))except--(Oracle 中是 minus 哦~~)		-- 除去这名同学的信息(select sid, namefrom pub.studentwhere sid = '200900130417')
  • 2-3 找出至少选修了一门其先行课程号为“300002”号课程的学生的学号、姓名
    思路:

    1. 根据先行课程号 fcid 在 pub.course 中选出对应的选修课程号 cid,记为集合 A;
    2. 在 pub.student_course 中根据集合 A 筛选出所选课程在 A 中的学生的 sid,记为集合 B;
    3. 在 pub.student 中根据集合 B 筛选出对应学生的 sid 和 name;

    第 2 步以及第 3 步可以使用 natural join 进行连接。

create view test2_03 asselect sid, namefrom pub.student natural join pub.student_coursewhere cid in(select cidfrom pub.coursewhere fcid = '300002')
  • 2-4 找出选修了“操作系统”并且也选修了“数据结构”,但是没有选修“程序设计语言”的学生的学号、 姓名
    思路:

    1. 找出选修了“操作系统”的学生的 sid,记为集合 A;
    2. 找出选修了“数据结构”的学生的 sid,记为集合 B;
    3. 找出没有选修“程序设计语言”的学生的 sid,记为集合 C;
    4. (A intersect B) except C 即可;

    (注意 Oracle 中将 except 换为 minus 就行)

create view test2_04 asselect sid, namefrom pub.studentwhere sid in((select sidfrom pub.student_coursewhere cid in(select cidfrom pub.coursewhere name = '操作系统'))intersect(select sidfrom pub.student_coursewhere cid in(select cidfrom pub.coursewhere name = '数据结构'))except(Oracle 中是 minus 哦~~)(select sidfrom pub.student_coursewhere cid in(select cidfrom pub,coursewhere name = '程序设计语言')))
  • 2-5 查询 20 岁的所有有选课的学生的学号、姓名、平均成绩(avg_score,此为列名,下同)(平均成绩四舍 五入到个位)、总成绩(sum_score)
    思路:

    1. 使用 natural join 将 pub.student 和 pub.student_course 连接起来;
    2. 计算对应的信息即可;

    注意:函数 round(number, precision) 可以将 number 按照 precision 精确到对应位。round(avg(number), 0) 即代表将 score 的平均值保留到整数位。

create view test2_05 asselect sid, name, round(avg(score), 0) avg_score, sum(score) sum_scorefrom pub.student natural join pub.student_coursewhere age = 20group by sid, name
  • 2-6 查询所有课的最高成绩、最高成绩人数,test2_06 有四个列:课程号 cid、课程名称 name、最高成绩 max_score、最高成绩人数 max_score_count(一个学生同一门课成绩都是第一,只计一次,需要考虑刷 成绩情况,一个同学选了一个课程多次,两次都是最高分。如果结果错一行,可能就是没有考虑这种情 况,这里是为了考核“去重复计数”知识点的)。如果没有学生选课,则最高成绩为空值,最高成绩人 数为零
    此题应该算是实验二中最难的一道了。希望我能将思路说清楚
    主要用到的表如下:

    1. t1:得出 cid,name
    2. t2:得出max_score
    3. t5:得出max_score_count

    思路:
    1. t1, t2 表的求解过程不用多说,简单的分组查询(查询时一定要加上 cid ,因为后面要将它们连接起来);
    2. 由于需要数最高分的人数,因此首先要在查询 max_score_count 部分的 from 子句中计算出 max_score (t4 表);
    3. 然后针对 score 对学生进行筛选,让 t3.cid = t4.cid 以及 t3.score = t4.max_score,得出每门课的最高分的学生的信息;
    4. 再进行分组后 count 得到 max_score_count;
    5. 最后将这些表的信息连起来 t1.cid = t2.cid and t2.cid = t5.cid;

create view test2_06 asselect t1.cid, name, max_score, max_score_countfrom (select cid, namefrom pub.coursegroup by cid, name) t1,(select cid, max(score) max_scorefrom pub.student_coursegroup by cid) t2,(select t3.cid, count(distinct sid) max_score_countfrom pub.student_course t3,(select cid, max(score) max_scorefrom pub.student_coursegroup by cid) t4where t3.cid = t4.cidand t3.score = t4.max_scoregroup by t3.cid) t5where t1.cid = t2.cidand t2.cid = t5.cid
  • 2-7 查询所有不姓张、不姓李、也不姓王的学生的学号 sid、姓名 name
    思路 1:

    1. 直接使用函数 substr(string, p1, p2),该函数可以针对取得字符串相对应部分的字符。如 substr(name, 0, 1) 就可以取得学生姓名 name 的第一个字符,即为姓。
    2. 然后接着判断取得的字符串是否是“张”、“李”、“王”即可。

    思路 2:

    1. 使用 not like 子句对字符串进行处理即可;
------------------思路 1-------------------
create view test2_07 as select sid, namefrom pub.studentwhere substr(name, 0, 1) <> '张'and substr(name, 0, 1) <> '李'and substr(name, 0, 1) <> '王'
------------------思路 2-------------------
create view test2_07 asselect sid, namefrom pub.studentwhere name not like '张%'and name not like '李%'and name not like '王%'
  • 2-8 查询学生表中每一个姓氏及其人数(不考虑复姓),test2_08 有两个列:second_name、p_count
    思路:
    1. 使用 substr 函数来取得学生的姓,然后进行 count 即可;
create view test2_08 asselect substr(name, 0, 1) second_name, count(*) p_countfrom pub.studentgroup by substr(name, 0, 1)
  • 2-9 查询选修了 300003 号课程的学生的 sid、name、score
    思路:
    1. 使用 natural join 将 pub.student 和 pub.student_course 进行连接;
    2. 从中寻找对应的 sid, name 以及 score;
create view test2_09 asselect sid, name, scorefrom pub.student natural join pub.student_coursewhere cid = '300003'
  • 2-10 找出同一个同学同一门课程有两次或以上不及格的所有学生的学号、姓名(即一门课程需要补考两次 或以上的学生的学号、姓名)
    思路 1:

    1. 先选出 score < 60 的学生,并将此时的 pub.student_course 记为 S;
    2. 然后将子查询中的 pub.student_course 记为 T,在 S.cid = T.cid, T.score < 60 的条件下,查找是否还存在记录;
    3. 若存在,则满足条件;不满足则不输出;

    思路 2:

    1. 选出分数 < 60 的学生的 sid 以及 cid,并按照这两个标准对 pub.student_course进行分组;
    2. 在分组的基础上使用 count 来数出每一组的人数。若人数 > 2,则满足条件,记录其 sid;反之则不记录;
----------------思路 1-----------------
--思路 1有点缺陷,建议思路 2--
create view test2_10 asselect sid, namefrom pub.studentwhere sid in(select sidfrom pub.student_course Swhere score < 60and exists(select sidfrom pub.student_course Twhere S.cid = T.cidand T.score < 60and S.score <> T.score))
----------------思路 2-----------------
create view test2_10 asselect sid, namefrom pub.studentwhere sid in(select sidfrom (select sid, cid, count(*) s_countfrom pub.student_coursewhere score < 60group by sid, cid)where s_count >= 2)

再次强调:一定是看懂思路之后自己实践哈~~
有问题还请斧正!

请添加图片描述

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

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

相关文章

jupyter(Anaconda)设置默认打开文件夹

win r 输入 cmd 回车 再输入如下命令回车&#xff1a; jupyter notebook --generate-config然后&#xff1a;打开生成的文件路径 进去后&#xff1a;编辑这个py ctrl f 搜索&#xff1a;notebook_dir定位 去掉# &#xff0c;引号后改为你要打开的文件路径&#xff08;路径…

山东大学 2020级数据库系统 实验三

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

山东大学 2020级数据库系统 实验四

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

jupyter(Anaconda)打不开浏览器

问题描述 有时jupyter不能自动打开浏览器&#xff0c;jupyter notebook输入回车后&#xff0c;不能跳转&#xff0c;把输出的链接复制粘贴到浏览器后&#xff0c;写的代码页不能运行。 问题解决 不是软件什么的问题&#xff0c;而是他们的用户名为中文的问题。只要把用户名改为…

C语言数组初入

情景 实用程序输出一个 44 的整数矩阵&#xff0c;代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> int main() {int a120, a2345, a3700, a422;int b156720, b299, b322, b42;int c1233, c2205, c31, c46666;int d134, d20, d323, d423006783;pri…

最全python爬虫库安装详解

目录 一、请求库的安装 1.requests 的安装 2.Selenium的安装 3.ChromeDrive 的安装 4.GeckoDriver 的安装 5.PhantomJS 的安装 6.aiohttp 的安装 二、解析库的安装 1.lxml 的安装 2.Beautiful Soup 的安装 3.pyquery 的安装 4.tesserocr 的安装 一、请求库的安装 …

山东大学 2020级数据库系统 实验五

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

C语言二维数组的使用

二维数组的定义 二维数组定义的一般形式是&#xff1a; dataType arrayName[length1][length2];其中&#xff0c;dataType 为数据类型&#xff0c;arrayName 为数组名&#xff0c;length1 为第一维下标的长度&#xff0c;length2 为第二维下标的长度。 我们可以将二维数组看…

python基础入门(8)之集合

目录 Python集合 一、集合理解 二、访问集合 2.1&#xff09;遍历集合 3.2&#xff09;检查是否存在 三、添加集合 3.1&#xff09;添加项目值 3.3&#xff09;添加任何可迭代对象 四、移除集合项 4.1&#xff09;remove方法 4.2&#xff09;iscard() 方法 4.3&…

山东大学 2020级数据库系统 实验六

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

C语言数组元素的查询

数组的查询 在日常的开发过程中&#xff0c;我们经常需要查询数组中的元素&#xff0c;这就需要我们使用数组元素查询的方法来进行查询。 对无序数组的查询 无序数组&#xff0c;就是数组元素的排列没有规律。无序数组元素查询的思路也很简单&#xff0c;就是用循环遍历数组…

山东大学 2020级数据库系统 实验七

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

python基础入门(9)之字典

目录 Python字典 一、字典理解 1.1&#xff09;创建字典与访问 1.2&#xff09;字典长度 1.3&#xff09;数据类型 二、访问字典 2.1&#xff09;访问键名 2.2&#xff09;访问健值 三、更改字典各种方法 四、添加字典项各种方法 五、删除字典的各种方法 ​六、遍历…

山东大学 2020级数据库系统 实验八、九

What’s more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 2020级数据库系统 实验五 山东大学 2020级数据库系统 实验六 山东大学 2020级数据库系统 实验七 山东大学 20…

python基础入门(10)之循环语句

目录 一、If … Else语句 一.if语句 二.缩进 三.elif语句 四.else语句 4.1基本else 4.2&#xff09;and语句 4.3&#xff09;or 语句 4.4&#xff09;嵌套if语句 4.4&#xff09;pass语句 二、while循环语句 一.基本理解 二.中断声明 三.continue 声明 四.else …

python基础(11)之函数

目录 函数 一、创建函数与调用 二、参数 三、参数数量 四、任意参数&#xff0c;*args 五、关键字参数 七、任意关键字参数&#xff0c;**kwargs 八、默认参数值 九、将列表作为参数传递 十、返回值 十一、pass语句 函数 一、创建函数与调用 在 Python 中&#xf…

排序算法的实现及时间复杂度分析——计数排序、选择排序、冒泡排序、插入排序

文章目录排序算法计数排序选择排序冒泡排序插入排序排序算法 排序算法是解决问题中常见且非常重要的一环&#xff0c;针对相应的问题选择相应的排序算法&#xff0c;能够提高问题解决速度&#xff0c;节省时间&#xff01;&#xff01;&#xff01; 常见的排序算法有&#xf…

python基础(12)之匿名函数lambda

lambda lambda 函数是一个小的匿名函数。一个 lambda 函数可以接受任意数量的参数&#xff0c;但只能有一个表达式。 语法&#xff1a; lambda arguments : expression 执行表达式并返回结果&#xff1a; 示例将 10 添加到 argument a&#xff0c;并返回结果&#xff1a; …

C语言快速排序

快速排序是对冒泡法排序的一种改进。 快速排序算法 的基本思想是&#xff1a;将所要进行排序的数分为左右两个部分&#xff0c;其中一部分的所有数据都比另外一 部分的数据小&#xff0c;然后将所分得的两部分数据进行同样的划分&#xff0c;重复执行以上的划分操作&#xff0…

机器学习入门(1)之基本概念简介

目录 一、机器学习概述 1.1 什么是机器学习&#xff1f; 1.2 为什么需要机器学习&#xff1f; 1.3 机器学习应用场景 1.4 机器学习的一般流程 1.5 典型的机器学习过程​ 二、机器学习的基本术语 三.假设空间与版本空间 四、归纳偏好 1.哪种更好 2..假设的选择原则 …