【数据库】实验报告及过程

在这里插入图片描述

数据库实验,没有随大流用可视化的那个软件,老老实实还是用命令行。(可能个人比较传统,觉得初学阶段还是踏实一点把基础打扎实一点)。过程中碰到一些困惑,感谢网上各位前辈的同款疑惑和指点,有的地方确实废了一些力气才找到,现在贴出我的报告和过程,回馈社会。
环境:MySQL

对不起各位,因为某人的原因,本篇坑了

实验一

建立表

前面忘记粘贴代码了,都是图,后面有代码

创建数据库 wzq的小尾巴
在这里插入图片描述
创建表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

插入数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询
use little_tail_of_wzq;
 show tables;
describe courses;
 select * from courses;
 describe sc;
 select * from sc;
 describe students;
 select * from students;

查询选修 2 号课程的学生学号与该课程成绩
在这里插入图片描述

查询选修课程名为数据结构的学生学号与年龄
在这里插入图片描述

查询不选 3 号课程的学生学号与姓名

//false
mysql> select students.Sno, students.Sname
    -> from students
    -> where not exists
    ->      (select *
    ->       from sc
    ->       where sc.Sno=students.Sno
    ->       and sc.Sno = 3)
    -> ;
//right
mysql> SELECT Sno, Sname
    -> FROM students
    -> WHERE NOT EXISTS
    ->      (SELECT *
    ->       FROM sc
    ->       WHERE Sno=students.Sno AND Cno ='1')
    -> ;

在这里插入图片描述

查询学习全部课程学生姓名

mysql> SELECT Sname
    -> FROM students
    -> WHERE NOT EXISTS
    ->      (SELECT *
    ->       FROM courses
    ->       WHERE NOT EXISTS
    ->            (SELECT *
    ->             FROM sc
    ->             WHERE Sno = students.Sno
    ->                   AND Cno = courses.Cno
    ->             )
    ->       )
    -> ;

在这里插入图片描述

查询所有学生除了选修 1 号课程外所有成绩均及格的学生的学号和平均成绩,其结果按平均成绩的降序排列

mysql> CREATE VIEW bufenjige(Sno, Cno, Grade)
    -> AS
    ->    SELECT students.Sno, Cno, Grade
    ->    FROM students,sc
    ->    WHERE students.Sno = sc.Sno
    ->          AND Cno != 1
    ->          AND Grade >= 60
    -> ;
mysql> SELECT Sno, AVG(Grade)
    ->   FROM bufenjige
    ->   GROUP BY Sno
    ->   ORDER BY AVG(Grade) DESC;

在这里插入图片描述
在这里插入图片描述

查询选修数据库原理成绩第 2 名的学生姓名
这个是有一点不懂的

mysql>  SELECT *
    ->  FROM (
    ->  SELECT students.Sname,ROW_NUMBER() OVER (PARTITION BY sc.Cno ORDER BY Grade DESC) M
    ->  FROM sc
    ->  INNER JOIN students ON sc.Sno=students.Sno
    ->  INNER JOIN courses ON sc.Cno=courses.Cno
    ->  WHERE courses.Cname = '数据库')A
    ->  WHERE M IN(2);

在这里插入图片描述

查询所有 3 个学分课程中有 3 门以上(含 3 门)课程获 80 分以上(含 80 分)的学生的姓名

mysql> create view youxiu (Sno,Cno,Grade)
    -> AS
    -> SELECT Sno, sc.Cno, Grade
    -> FROM sc, courses
    -> WHERE sc.Cno = courses.Cno
    -> AND Grade >= 80
    -> AND Ccredit = 3;
mysql> select Sname
    -> from students
    -> where Sno in
    ->      (select Sno
    ->       from youxiu
    ->       group by Sno
    ->       having count(*)>=3
    ->      )
    -> ;

在这里插入图片描述

查询选课门数唯一的学生的学号

mysql> create view coursenum(Sno, Ccount)
    -> AS
    -> select Sno, count(*)
    -> from sc
    -> group by Sno;
mysql> select x.Sno
    -> from coursenum x
    -> where x.Ccount != ALL
    ->       (select y.Ccount
    ->        from coursenum y
    ->        where y.Sno != x.Sno
    ->       )
    -> ;

在这里插入图片描述
在这里插入图片描述

数据修改、删除与视图

把 1 号课程的非空成绩提高 5%。

这个逻辑有点点问题,但不想改了
不应该是判断变大以后的值小于100也不应该是原来的值小于100, 应该先判断原来的值小于100就操作,如果结果大于100就改成100

mysql> UPDATE sc
    -> SET Grade = Grade*1.05
    -> WHERE Cno = '1'
    ->       AND Grade*1.05 <= 100
    ->       AND Grade is NOT NULL;
mysql> select *
    -> from sc
    -> where Cno = '1';

在这里插入图片描述

在这里插入图片描述

在 SC 表中删除课程名为数据结构的成绩的元组。

mysql>   DELETE
    ->   FROM sc
    ->   WHERE Cno IN
    ->         (SELECT Cno
    ->          FROM courses
    ->          WHERE courses.Cname='数据结构'
    ->         )
    -> ;
mysql> select *
    -> from sc
    -> where Cno IN
    ->          (SELECT Cno
    ->           FROM courses
    ->          WHERE courses.Cname='数据结构'
    ->          )
    -> ;

在这里插入图片描述

在 S 和 SC 表中删除学号为 201885003 的所有数据。

mysql> DELETE
    -> FROM sc
    -> WHERE Sno = '201885003';
Query OK, 6 rows affected (0.01 sec)

mysql> DELETE
    -> FROM students
    -> WHERE Sno = '201885003';
Query OK, 1 row affected (0.01 sec)

在这里插入图片描述
在这里插入图片描述

建立男学生的视图,属性包括学号、姓名、选修课程名和成绩。

mysql> CREATE VIEW male_students (Sno, Sname, Cname, Grade)
    -> AS
    -> SELECT students.Sno, Sname, Cname, Grade
    -> FROM students, sc, courses
    -> WHERE students.Sno = sc.Sno
    ->       AND sc.Cno = courses.Cno
    ->       AND students.Ssex = '男';
Query OK, 0 rows affected (0.02 sec)

mysql> select * from male_students;

在这里插入图片描述

在男学生视图中查询平均成绩大于 80 分的学生学号与姓名。

mysql>  SELECT Sno, Sname
    ->   FROM male_students
    ->  GROUP BY Sno
    -> HAVING  AVG(Grade)>80;

在这里插入图片描述

计算每个学生有成绩的课程门数、平均成绩。

mysql> SELECT Sno, COUNT(*), AVG(Grade)
    -> FROM sc
    -> GROUP BY Sno;

在这里插入图片描述

使用 GRANT 语句,把对基本表 S、SC、C 的使用权限授给其它用户。

mysql> GRANT SELECT
    -> ON TABLE students
    -> TO PUBLIC;

在这里插入图片描述
看到这个我累了,也没有想办法,该怎样怎样吧,反正语句差不离吧

触发器

触发器部分要注意一下,有两个问题:

  1. 网上的一些开头并没有说自己是MySQL还是SQLSERVER,两者在触发器上是有一点些微的区别的。像我这种啥都不懂的初学者,不知道就很可能会死磕也不明白
  2. 触发器的body部分可能需要多个“;”,但是mysql一遇到“;”就提交,所以需要换一个分隔符,可以使用DELIMITER

首先解除S表和SC表的参照关系。然后在Student表上创建一个触发器,使更新一个学生的学号信息时能够级联的更新此学生在SC表中的选课记录的学号信息,并进行验证

mysql> set foreign_key_checks=0;
mysql> delimiter $
mysql> create trigger updateSno
    -> after update on students
    -> for each row
    -> begin
    ->   update sc set Sno=new.Sno where Sno=old.Sno;
    -> end $
Query OK, 0 rows affected (0.05 sec)
mysql> select * from students;
    -> $
mysql> select * from sc;
    -> $
mysql> update students
    -> set Sno = '201885008'
    -> where Sno = '201885001';
    -> $
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from students;
    -> $
mysql> select * from sc;
    -> $

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

首先解除S表和SC表的参照关系。然后在Student表上创建一个触发器,使删除一个学生时能够级联的删除此学生在SC表中的选课记录,并进行验证

mysql> create trigger deleteSC
    -> after delete on students
    -> for each row
    -> begin
    ->   delete from sc where Sno=old.Sno;
    -> end $
Query OK, 0 rows affected (0.02 sec)
mysql> delete from students where Sno='201885002';
    -> $
Query OK, 1 row affected (0.01 sec)
mysql> select * from students;
    -> $
mysql> select * from sc;
    -> $

在这里插入图片描述
在这里插入图片描述

在 S 表中编写 insert 的触发器,假如每个班的学生不能超过 30 个,如果低于此数,添加可以完成;如果超过此数,则插入将不能实现

在 SC 表上编写 update 触发器,当修改 SC 表中的 Grade 字段时将其修改前后的信息保存在 SC_log 表中

在这里插入图片描述

在这里插入图片描述

实验二

任务要求

实现一个小型管理信息系统(题目可以自拟)
掌握 Visual C++、C#、Qt、Java、PHP 或 Python 等任意语言访问数据库的方法, 设计和实现一个小型管理信息系统。要求具有数据的增加、删除、修改和查询的基本功能,并尽可能提供较多的查询功能,用户界面要友好。

如:
基于MySQL,设计并实现一个简单的旅行预订系统。该系统涉及的信息有航班、大巴班车、宾馆房间和客户数据等信息。 其关系模式如下:

FLIGHTS(String flightNum, int price, int numSeats, int numAvail, String FromCity, String ArivCity)
HOTELS(String hotelNum, String location, int price, int numRooms, int numAvail)
BUS(String BusNum, String location, int price, int numBus, int numAvail)
CUSTOMERS(int custID, String custName)
RESERVATIONS(String resvNum, String custID, int resvType, String resvKey)

基本功能

应用系统应完成如下基本功能:
航班,大巴车,宾馆房间和客户基础数据的入库,更新(表中的属性也可以根据你的需要添加)。
预定航班,大巴车,宾馆房间。(取消预定功能)
查询航班,大巴车,宾馆房间,客户和预订信息。(取消预定功能)
查询某个客户的旅行线路。
其他任意你愿意加上的功能。

反思

大作业的过程中发现自己很多语言书写不规范,诸如大小写问题,随心所欲

常见错误

过程中出现了一些愁死人的错误,记录下来要是大伙碰到了可以少点惊吓:

第一次安装的时候

我用的是命令行的那个,一开始找不到初始密码,后来发现在初始化的时候给了。详情可以看后面的网页,真真保姆级教程。如果找不到初始化的密码了,可以把data删掉重新初始化一遍。

登陆的时候

正常情况通过命令行登录进去应该是这样的
在这里插入图片描述
而我有一次碰到了这个样子
在这里插入图片描述
mysql: [Warning] Using a password on the command line interface can be insecure.就是说警告在命令行界面上使用明文密码不安全,我感觉很懵,上网查了有解决方法是把‘-p’和‘-u’换个位置
在这里插入图片描述

刚开始很开心可以输入密码了,结果输完发现提示密码错误。懵:我记错密码了,网上开始一顿忘记密码操作。。。。
人快哭了
后来才发现,是多了个分号啊。。在MySQL里面写语句写习惯了,进去的时候也顺手打了一个分号,结果还有模有样地报错,真是吓死我了,差点去找助教。

ERROR 1054 (42S22)

ERROR 1054 (42S22): Unknown column ‘Sno.Cno’ in ‘field list’
在这里插入图片描述

mysql> update sc
    -> set Grade = 88
    -> where Sno = 201885001;
ERROR 1054 (42S22): Unknown column 'Sno.Cno' in 'field list'
mysql> update sc
    -> set Cno = 9
    -> where Sno = 201885001;
ERROR 1054 (42S22): Unknown column 'Sno.Cno' in 'field list'
mysql> update sc
    -> set Grade = 66
    -> where Grade = 77;
ERROR 1054 (42S22): Unknown column 'Sno.Cno' in 'field list'

看到很多诸如字段前面多加空格,引号应该用英文引号··而不是中文单引号‘’等等的,但问题是我这个‘Sno.Cno’根本就在我的查询语句里没有出现啊,而且我的三个字段都是int型啊啊疯了

mysql> update sc
    -> set Grade = Grade*1.05
    -> where Cno = '1'
    ->       AND Grade*1.05 <= 100
    ->       AND Grade is NOT NULL;
ERROR 1054 (42S22): Unknown column 'Sno.Cno' in 'field list'

之前好用的语句(还不在同一个表中)也报同样的错,也重启过,还是这个问题

cmd光标消失(奇奇怪怪的问题)

windows下,在输入中文后,按shift,拼音变成英文的同时,光标出现。如何调出cmd光标

写实验过程中的一些好用网址

MySQL的安装与配置——详细教程超详细的保姆级安装教程
触发器中定义变量报错1064不说环境写触发器都是流氓
Sqlserver与Mysql触发器之间的差别
MySQL触发器基本用法详解【创建、查看、删除等】


小白自己的大作业经历,很多因为太菜所以走弯路的,可能最后结果也不是很对,只是想跟大家分享一下,有用就是互帮互助,没用您再找下一个,错了您笑一笑走或者好心评论告诉我都行。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值