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

What’s more

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

写在前面

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

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

实验七

本实验所考察的内容主要是关于索引,索引的建立一般有以下需要注意的点:
· 避免在取值朝一个方向增长的字段(例如:日期类型的字段)上,建立索引;对复合索引,避免将这种类型的字段放置在最前面。由于字段的取值总是朝一个方向增长,新记录总是存放在索引的最后一个叶页中,从而不断地引起该叶页的访问竞争、新叶页的分配、中间分支页的拆分。此外,如果所建索引是聚集索引,表中数据按照索引的排列顺序存放,所有的插入操作都集中在最后一个数据页上进行,从而引起插入“热点”。

· 对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用。因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用。

建立索引的格式:create index index_name on table(name);

  • 7-1
    1. 将pub用户下表student的3个列sid,name,birthday复制到表test7_01中。
    2. 执行如下查询,观察运行速度(5秒以上)。
    查询Samefirstname相同姓氏的人数。
    select * from
    (select sid,name,birthday,
    (select count(*) from test7_01 where substr(name,1,1)=substr(t1.name,1,1)) samefirstname
    from pub.student_testindex t1)
    where samefirstname=7
    3. 为test7_01创建一个仅仅一个索引,保证上面SQL耗时在1秒内。
    4. 交卷验证

    思路:
    1. 在什么上建立索引往往取决于 where 中的判断条件。一般判断条件是什么,就在什么上建立索引;
    2. 因此本题中在 substr(name, 1, 1) 上建立索引即可;
create index firstname_index on test7_01(substr(name, 1, 1))
  • 7-2
    1. 将pub用户下表student的3个列sid,name,birthday复制到表test7_02中。
    2. 将出生日期全部修改成一天:
    Update test7_02 set birthday=to_date(‘19881018’,‘yyyymmdd’) where substr(sid,12,1)=‘0’;
    3. 为test7_02创建一个仅仅一个索引,保证下面SQL耗时在1秒内。
    Samenamebirthday同名同生日的人数,Samebirthday相同出生日期的人数
    select * from
    (select sid,name,birthday,
    (select count() from test7_02 where name=t1.name and birthday=t1.birthday) samenamebirthday,
    (select count(
    ) from test7_02 where birthday=t1.birthday) samebirthday
    from pub.student_testindex t1)
    where samebirthday=403
    4. 交卷验证
    5. 思考题,test7_02不增建索引情况下,下面这个查询能使用索引吗?改进后能使用索引吗?
    select * from
    (select sid,name,birthday,
    (select count(*) from test7_02 where name=t1.name) samename
    from pub.student t1)
    where samename=7

    思路:
    1. 根据上面所提到的原则:应用频度高的字段应放在复合索引的前面;由于我们把生日都设在了同一天,因此 birthday 才是应用频度最高的字段,应将其放在第一个;(前提条件是 where 中即用了 name 来查询,也用了 birthday 来查询)
create index name_birthday_index on test7_02(birthday, name)

接下来是根据索引修改条件的题目,基本原则就是:建立了索引的属性在 where 子句中要保持原样,运算符号 >, <, = 左边不能对它进行运算,也不能对它使用函数等操作

  • 7-3
    1. pub用户下表student已经用下面两句SQL创建了两索引。
    Create index student_birthday on student(birthday);
    Create index student_name on student(name);
    2. 下面SQL不能用索引耗时超过2秒,在逻辑不变情况下,修改SQL中标为记红色的子查询的where条件部分,不要修改其它地方,使其能使用索引。
    说明:因为pub.student_testindex数据行数太少,不能通过修改主句where绕过问题。
    查询samefirstname同姓氏的人数。
    select * from
    (select sid,name,birthday,
    (select count(*) from pub.student
    where substr(name,1,1)=substr(t1.name,1,1)
    ) samefirstname
    from pub.student_testindex t1) where samefirstname=7
    3. 修改以后验证耗时在2秒之内,将修改以后语句创建成视图create view test7_03 as select ……。
    4. 交卷验证

    思路:
    1. 该问需要查询同姓的学生信息,可以使用模糊查询 like 来进行,但需要注意怎样将“姓”和“%”进行连接呢?
    2. 想到了 rpad(str1, position, str2) 函数,表示在 str1 的右边第三个字节的位置连接 str2 字符,这样便可实现该功能;(或者 concat 函数也可以连接字符串)
create view test7_03 asselect * from(select sid,name,birthday,(select count(*) from pub.studentwhere name like rpad(substr(t1.name, 1, 1), 3, '%')) samefirstname from pub.student_testindex t1) where samefirstname=7
  • 7-4
    1. pub用户下表student已经用下面两句SQL创建了两索引。
    Create index student_birthday on student(birthday);
    Create index student_name on student(name);
    2. 下面SQL不能用索引耗时超过1秒,在逻辑不变情况下,修改SQL中标为记红色的子查询的where条件部分,不要修改其它地方,使其能使用索引。
    说明:因为pub.student_testindex数据行数太少,不能通过修改主句where绕过问题。
    select * from
    (select sid,name,birthday,
    (select count() from pub.student
    where to_char(birthday,‘yyyymm’)=to_char(t1.birthday,‘yyyymm’)
    ) sameyearmonth,
    (select count(
    ) from pub.student
    where extract (year from birthday) =extract (year from t1.birthday)
    ) sameyear
    from pub.student_testindex t1) where sameyearmonth=35
    3. 修改以后验证耗时在1秒之内,将修改以后语句创建成视图create view test7_04 as select ……。
    4. 交卷验证

    函数介绍:

    1. trunc(t1.birthday, ‘mm’) – 获取当前日期月份的第一天;
    2. last_day(t1.birthday) – 获取当前日期月份的最后一天;
    3. trunc(t1.birthday, ‘yyyy’) – 获取当前日期年的第一天;
    4. add_months(date, number) – 在 date 上加 number 个月;

    思路:
    1. 本问需要求的是同年月以及同年的学生的 sid, name, birthday;
    2. 同年月的学生的生日应该在当月的第一天和当月最后一天之间,trunc(t1.birthday, ‘mm’) 得到第一天,last_day(t1.birthday) 得到最后一天,使用 between 连接即可;
    3. 同年的学生的生日应该在当年的第一天和当年最后一天之间,trunc(t1.birthday, ‘yyyy’) 得到当年的第一天,add_months(trunc(t1.birthday, ‘yyyy’), 12) 得到后一年的第一天,再 -1 得到当年的最后一天;

create view test7_04 asselect * from (select sid,name,birthday,(select count(*) from pub.student where birthday between (trunc(t1.birthday, 'mm')) and last_day(t1.birthday)) sameyearmonth,(select count(*) from pub.studentwhere birthday between (trunc(t1.birthday, 'yyyy')) and add_months(trunc(t1.birthday, 'yyyy'), 12) - 1) sameyearfrom pub.student_testindex t1) where sameyearmonth=35
  • 7-5
    1. pub用户下表student已经用下面两句SQL创建了两索引。
    Create index student_birthday on student(birthday);
    Create index student_name on student(name);
    2. 下面SQL不能用索引耗时超过1秒,在逻辑不变情况下,修改SQL中标为记红色的子查询的where条件部分,不要修改其它地方,使其能使用索引。
    说明:因为pub.student_testindex数据行数太少,不能通过修改主句where绕过问题。
    查询nextbirthday晚一天出生的人数
    select * from
    (select sid,name,birthday,
    (select count(*) from pub.student
    where birthday-1=t1.birthday
    ) nextbirthday
    from pub.student_testindex t1) where nextbirthday=7
    3. 修改以后验证耗时在1秒之内,将修改以后语句创建成视图create view test7_05 as select ……。
    4. 交卷验证

    思路:
    1. 由于不能对建立了索引的属性进行运算等操作,因此直接把 birthday-1 = t1.birthday 改成 birthday = t1.birthday + 1 即可;
select * from 
(select sid,name,birthday,
(select count(*) from pub.student 
where birthday = t1.birthday + 1
) nextbirthday
from pub.student_testindex t1) where nextbirthday=7

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

在这里插入图片描述

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

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

相关文章

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..假设的选择原则 …

山东大学 2020级计算机系统原理——拆解二进制炸弹

写在前面 第一次拿到这个实验还是有点慌&#xff01;之前没见过&#xff0c;不过还是慢慢做过来了。 这是个需要耐心的过程&#xff0c;请一定静下心来哦&#xff01; 环境及配置 环境&#xff1a;Ubuntu 20.04 GDB 调试工具 可参考配置&#xff1a;GDB调试工具配置&#…

机器学习入门(2)之模型评估与选择

目录 一、误差与拟合 1. 泛化误差与经验误差 2. 损失函数与训练误差 3. 过拟合与欠拟合 4. 过拟合的另一种现象&#xff1a;数据泄露 二、评估方法 1. 留出法 2. 交叉验证法&#xff08;留一法&#xff09; 3. 自助法 4. 调参与最终模型 三、性能度量 1. 混淆矩阵 …

pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练

文章目录1. MNIST 手写数字识别2. 聚焦数据集扩充后的模型训练3. pytorch 手写数字识别基本实现3.1完整代码及 MNIST 测试集测试结果3.1.1代码3.1.2 MNIST 测试集测试结果3.2 使用自己的图片进行测试3.2.1 测试图片预处理代码3.2.2 测试图片结果4. 数据增强4.1 手动读取 MNIST …

python基础(13)之数组

目录 数组 一、访问数组的元素 二、数组的长度 三、修改数组 四、数组的其它操作 数组 Python 没有对数组的内置支持&#xff0c;但可以使用Python 列表代替。 例如&#xff1a; ben ["笨小孩1", "笨小孩2", "笨小孩3"]一、访问数组的元…

C语言归并排序(合并排序)

归并排序也称合并排序&#xff0c;其算法思想是将待排序序列分为两部分&#xff0c;依次对分得的两个部分再次使用归并排序&#xff0c;之后再对其进行合并。仅从算法思想上了解归并排序会觉得很抽象&#xff0c;接下来就以对序列A[0], A[l]…, A[n-1]进行升序排列来进行解说&a…

python基础(14)之 类和对象

目录 Python类和对象 一、创建类 二、创建对象 三、init() 函数 四、对象方法 五、自参数 六、对象及其属性更改 七、pass语句 Python类和对象 Python 类/对象。Python 是一种面向对象的编程语言。Python 中的几乎所有东西都是一个对象&#xff0c;有它的属性和方法。…

C语言顺序查找

顺序査找是一种简单的査找算法&#xff0c;其实现方法是从序列的起始元素开始&#xff0c;逐个将序列中的元素与所要查找的元素进行比较&#xff0c;如果序列中有元素与所要查找的元素相等&#xff0c;那么査找成功&#xff0c;如果査找到序列的最后一个元素都不存在一个元素与…

python基础(15)之 继承

目录 Python继承 一、创建父类 二、创建子类 三、添加 init() 函数 四、使用 super() 函数 五、添加属性 六、添加方法 Python继承 继承允许我们定义一个从另一个类继承所有方法和属性的类。父类是被继承的类&#xff0c;也称为基类。子类是从另一个类继承的类&#xff…

C语言二分查找(折半查找)

二分査找也称折半査找&#xff0c;其优点是查找速度快&#xff0c;缺点是要求所要査找的数据必须是有序序列。该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进行比较&#xff0c;如果相等&#xff0c;则表示査找成功&#xff0c;否则将以该位置为基准将…

python基础(16)之 日期

目录 Python日期 一、日期输入输出 二、创建日期对象 三、strftime() 方法 Python日期 Python 中的日期不是它自己的数据类型&#xff0c;但我们可以导入一个名为的模块datetime来处理日期作为日期对象。 一、日期输入输出 导入 datetime 模块并显示当前日期&#xff1a;…

python基础(17)之 JSON

Python JSON JSON 是一种用于存储和交换数据的语法。JSON 是文本&#xff0c;用 JavaScript 对象表示法编写。 Python 有一个名为 的内置包json&#xff0c;可用于处理 JSON 数据。 导入 json 模块&#xff1a; import json一.从 JSON 转换为 Python 如果您有 JSON 字符串&am…

python基础(18)之 异常处理

目录 异常处理 一、异常处理 二、else搭配 三、finally语句 四、引发异常 异常处理 try块可让您测试代码块的错误。except块可让您处理错误。finally无论 try- 和 except 块的结果如何&#xff0c;该块都允许您执行代码。 一、异常处理 例如该try块将产生异常&#xff0…