MySQL实验,数据库原理实验,插入数据随机生成器

文章目录

MySQL实验

实验一:利用SQL语言完成数据库定义

建立数据库结构,完成数据库中的基本表的建立,同时将表中数据进行添加。

实验题目1:建立数据库结构,完成数据库中的基本表的建立

实验代码及注释:

建立Student表
在这里插入图片描述
Course表之前已建立

建立Sc表
在这里插入图片描述

实验题目2:修改表结构

实验代码及注释:

Student表增加新的属性s_entrance

Sc表grade属性的类型改为int
在这里插入图片描述
删除student表中s_entrance属性
在这里插入图片描述

实验题目3:插入数据

实验代码及注释:

Student表插入数据(中间错误是因为忘更改学号了)
在这里插入图片描述
Course表插入数据
在这里插入图片描述
Sc表插入数据
在这里插入图片描述

mysql> insert sc(sno,cno,grade) values('201215121','7',50);

mysql> insert sc(sno,cno,grade) values('201215121','4',45);

mysql> insert sc(sno,cno,grade) values('201215121','6',55);

实验二:利用SQL语言完成数据库维护

对于已完成数据库中数据进行修改、删除操作。

实验题目1:修改“CS”的学生成绩,不及格学生的成绩增加5分。

实验代码及注释:

mysql> update sc

  	-> set grade=grade+5

  	-> where 'cs'=

  	-> (select sdept

  	-> from student

  	-> where student.sno=sc.sno and sc.grade<60 );

实验题目2:删除“CS”系学生的成绩记录。(不小心写成CS的了。。。)

实验代码及注释:

mysql> delete

  	-> from sc

  	-> where 'CS'=

  	-> (select sdept

  	-> from student

  	-> where student.sno=sc.sno);

自造题目3:删除所有2号课程的成绩

实验代码及注释:

mysql> delete

    -> from sc

    -> where cno=2;

自造题目4:选修cno=6的课程的成绩中高于90分的都扣5分。

实验代码及注释:

mysql> update sc

    -> set grade=grade-10

    -> where grade>90 and cno=6;

实验三:利用SQL语句完成数据库查询

采用查询语句对于数据库中数据进行查询或统计功能的操作。

实验题目1:查询平均成绩大于80的学生姓名。

实验代码及注释:
在这里插入图片描述

实验题目2:查询课程成绩大于课程平均成绩的选课信息,显示学生姓名、课程名称和成绩。

实验代码及注释:

mysql> select sname,cname,grade

    -> from student,sc,course

    -> where student.sno=sc.sno

    -> and course.cno=sc.cno

    -> and grade>

    -> (select avg(grade)

    -> from sc

    -> where course.cno=cno);

实验题目3:查询至少选修了C1和C2课程的学生名单。

实验代码及注释:

mysql> select sname

    -> from student

    -> where exists

    -> (select *

    -> from sc

    -> where sno=student.sno and cno=1)

    -> and exists

    -> (select *

    -> from sc

    -> where sno=student.sno and cno=2);

实验题目4:查询选修了C1课程而没有选修C2课程的学生名单。

实验代码及注释:

mysql> select sname

    -> from student

    -> where exists

    -> (select * from sc where student.sno=sno and cno=1)

    -> and not exists

    -> (select * from sc where student.sno=sno and cno=2);

实验题目5:统计每门课程成绩大于80分的学生数。

实验代码及注释:

mysql> select cno,count(sno)

    -> from sc

    -> where grade>80

    -> group by cno;

实验题目6:统计计算机系CS学生的平均分

实验代码及注释:

mysql> select avg(grade)

    -> from sc

    -> where sno in

    -> (select sno

    -> from student

    -> where sdept='CS');

实验题目7:统计至少选修了两门课程的学生数

实验代码及注释:

mysql> select count(sname)

    -> from student

    -> where exists

    -> (select *

    -> from sc

    -> where student.sno=sno

    -> group by sno

    -> having count(cno)>2);

实验题目8:查询至少选修了两门课程的学生名单

实验代码及注释:

mysql> select sname

    -> from student

    -> where exists

    -> (select *

    -> from sc

    -> where student.sno=sno

    -> group by sno

    -> having count(cno)>=2);

实验题目9:查询没有被选修的课程信息

实验代码及注释

mysql> select cno,cname,cpno,ccredit

    -> from course

    -> where not exists

    -> (select *

    -> from sc

    -> where course.cno=cno);

实验题目10:查询没有选修C1课程的学生信息

实验代码及注释:

mysql> select *

    -> from student

    -> where not exists

    -> (select *

    -> from sc

    -> where cno=1 and sno=student.sno);

实验题目11:统计没有选修C1课程的学生人数

实验代码及注释:

mysql> select count(sno)

    -> from student

    -> where not exists

    -> (select *

    -> from sc

    -> where cno=1 and sno=student.sno);

实验题目12:查询平均分最高的课程信息

实验代码及注释:

mysql> select *

    -> from course

    -> where cno=
  
    -> (select cno

    -> from sc

    -> group by cno

    -> having avg(grade)>= all

    -> (select avg(grade)

    -> from sc

    -> group by cno));

实验题目13:查询平均分最高的课程的选课信息(学号,姓名,课程名程,成绩)

实验代码及注释:

mysql> select sc.sno,sname,cname,grade

    -> from sc,student,course

    -> where sc.sno=student.sno

    -> and course.cno=sc.cno

    -> and sc.cno=7;

这个课程号是我上一问求出来的,大家根据自己的数据课程号可能不同。我只是懒得上面再重复一遍了。

实验题目14:查询平均分最高的学生所在院系。

实验代码及注释:

mysql> select sdept

    -> from student

    -> where sno=

    -> (select sno

    -> from sc

    -> group by sno

    -> having avg(grade)>= all

    -> (select avg(grade)

    -> from sc

    -> group by sno));

实验题目15:统计学生平均选修课程数。

实验代码及注释:

mysql> select count(*)/count(distinct sno) from sc;

实验题目16:统计各院系学生平均选课数。

实验代码及注释:

mysql> select sdept,count(*)/count(distinct student.sno)

    -> from student,sc

    -> where student.sno=sc.sno

    -> group by sdept;

实验题目17:统计每门课程的选课人数,最高分,平均分和最低分。

实验代码及注释:

mysql> select cno,count(*),max(grade),avg(grade),min(grade)

    -> from sc

    -> group by cno;

实验题目18:查询平均分75以上,并且没有不及格成绩的学生信息。

实验代码及注释:

mysql> select *

    -> from student

    -> where sno in
 
    -> (select sno

    -> from sc

    -> group by sno

    -> having avg(grade)>75

    -> and min(grade)>60);

实验四:利用SQL语句完成视图设计

对于已有数据库进行建立相应视图,同时在视图上进行相应的查询、修改、删除等操作

实验题目1:查询没有选修C1课程的学生信息

实验代码及注释:

创建视图:
mysql> create view not_c1
    -> as
    -> select *
    -> from student
    -> where not exists
    -> (select *
    -> from sc
    -> where cno=1 and sno=student.sno);
查询视图:
mysql> select sname
    -> from not_c1
    -> where sage=18;
修改视图:
mysql> update not_c1
    -> set sage=sage+1
    -> where sdept='MA';
删除视图:
mysql> drop view not_c1;

实验题目2:查询平均分75以上,并且没有不及格成绩的学生信息。

实验代码及注释:

创建视图
mysql> create view good_stu
    -> as
    -> select *
    -> from student
    -> where sno in
    -> (select sno
    -> from sc
    -> group by sno
    -> having avg(grade)>75
    -> and min(grade)>60);
插入新的数据
mysql> insert sc(sno,cno,grade) values('201215127','7',100);
视图自动更新
mysql> select * from good_stu;
查询视图:
mysql> select *
    -> from good_stu
    -> where sage<20;
删除视图:
mysql> drop view good_stu;

实验题目3:统计每门课程的选课人数,最高分,平均分和最低分。

实验代码及注释:

创建视图:
mysql> create view final(cno,countt,maxx,avgg,minn)
    -> as
    -> select cno,count(*),max(grade),avg(grade),min(grade)
    -> from sc
-> group by cno;
该视图不可更改!
查询视图:
mysql> select *
    -> from final
    -> where countt>=4;

实验题目4:查询选修了C1课程而没有选修C2课程的学生名单。

实验代码及注释:

创建视图:
mysql> create view c2_yes
    -> as
    -> select *
    -> from student
    -> where exists
    -> (select * from sc where student.sno=sno and cno=1)
    -> and not exists
-> (select * from sc where student.sno=sno and cno=2);
更新视图:
删除所有选修2的记录。
mysql> delete
    -> from sc
    -> where cno=2;

插入数据随机生成器

生成sc表插入数据,输出格式是可以直接用MySQL运行的。

生成一个在本cpp同目录下的sctxt.out文件,用记事本打开即可。

生成数据随机,可能不符合范式,可能不均匀,自行更改。

#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;
typedef long long ll;
int main()
{
    freopen("sctxt.out","w",stdout);
    srand((int)time(0));
    for(int i=1;i<=20;i++) 
    {
        int sno=rand()%6,cno=rand()%8,grade=rand()%100;//学号末尾1~6,课程号1~7,成绩百分制,可自行更改
        if(sno==0) sno=1;
        if(cno==0) cno=1; 
        cout<<"insert sc(sno,cno,grade) values(\'20121512"<<sno<<"\',"<<cno<<","<<grade<<");"<<endl;
        
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章