实验前准备:JDBC联接数据库

实验内容:

(一)写出教务管理数据库中如下8张表的DDL语句, 要求标识出每张表的主键,包含的外键,明确每个字段的域定义。然后在数据库中创建出这8张表来。

  1. Course

  1. Coursetype

  1. Department

  1. Enroll

  1. Speciality

  1. Student

  1. Teach

  1. Teacher

2)写出DML语句,将上述数据添加到各个表中。

-- 输出信息科学与工程学院(学院编号“24”)2018级学生“李毅”的课程选修成绩单,输出项包括课程名称,学分,成绩三项;

SELECT c.`name`,c.credit,e.score

FROM course c,enroll e

WHERE c.dno = '24' AND c.ctno = (SELECT coursetype.ctno FROM coursetype WHERE coursetype.ctname = '选修课') AND e.sno = (SELECT student.sno FROM student WHERE student.sname = '李毅' AND student.sno LIKE '2018%');

  1. 对于如下业务需求,写出获取所须数据的SQL语句:

-- 找出学生李毅(学号为 ‘20182401101’)的电话;

SELECT tel

FROM student

WHERE sname = '李毅';

-- 输出信息科学与工程学院(学院编号为’24’)的学生清单,输出项包括姓名,学号,班级三列,按照班级和学号排序;

SELECT sname,sno,classno

FROM student

WHERE dno='24';

-- 输出所有学院的清单,包括学院编号,名称,地址,电话,院长姓名;

SELECT department.dno,department.`name`,department.addr,department.phone,teacher.`name`

FROM department

LEFT JOIN teacher

ON teacher.tno = department.dean;

-- 在2020-1学期选修了周曼玲老师(工号为”2001009”)开设的“数据库系统”课程的学生名单,输出项为五项:教学班,姓名、学号、性别,行政班。要求先按照教学班,再按行政班排序;(注:一个老师在某个学期开的某门课,完全有可能有多个教学班);

SELECT distinct enroll.classno,student.sname,student.sno,student.sex,student.classno

FROM enroll right JOIN student

on enroll.sno=student.sno

WHERE student.sno in (

SELECT enroll.sno

FROM enroll

WHERE year_semeste LIKE '2020-01%'

AND tno = '2001009')

order by enroll.classno,student.classno;

-- 对于在2020-1学期选修了“数据库系统”课程的各行政班,求其平均分,并按照平均分从高到低排序;

SELECT DISTINCT enroll.classno,AVG(score) as AVG_SCORE

FROM enroll

WHERE enroll.cno = ( SELECT course.cno FROM course WHERE course.`name` = '数据库系统' )

group by classno

ORDER BY

AVG_SCORE;

-- 对于信息科学与工程学院(学院编号“24”)在2020-1学期开设的每门课程,输出其选修人数,输出项包括课程名称,选修人数;

SELECT course.`name`,COUNT( DISTINCT enroll.sno ) AS COUNT

FROM course, enroll

WHERE course.dno = '24'

AND course.cno = ANY ( SELECT enroll.cno FROM enroll WHERE enroll.year_semeste LIKE '2020-01%' )

GROUP BY course.`name`;

-- 在2020-1学期,对于开设的“数据库系统”这门课程,在信息科学与工程学院(学院编号“24”)的2018级学生中,有哪些学生没有选修该课程,输出姓名,学号,行政班三项信息;

SELECT sname,sno,classno

FROM student s

WHERE s.dno = '24' AND

NOT EXISTS (

SELECT* FROM enroll e

WHERE e.year_semeste LIKE '2020-01%'

AND s.sno = e.sno

AND e.cno = ( SELECT c.cno FROM course c WHERE c.`name` = '数据库系统' ));

-- 对于在2020-1学期开设的每门课程,输出其最高分、最低分,平均分;

SELECT MAX( score ) AS MAX,MIN( score ) AS MIN,AVG( score ) AS AVG

FROM enroll

WHERE year_semeste LIKE '2020-01%';

-- 对于在2020-1学期开设的“数据库系统”课程,求选修了该课,但是没有及格的学生名单,输出姓名,学号,行政班,课程成绩四项信息;

SELECT sname, sno,classno

FROM student s

WHERE EXISTS (

SELECT * FROM enroll e

WHERE e.year_semeste LIKE '2020-01%'

AND e.score < '60'

AND s.sno = e.sno

AND e.cno = ( SELECT c.cno FROM course c WHERE c.`name` = '数据库系统' ));

-- 对于信息科学与工程学院(学院编号“24”)的每个教师,统计出其在2019年度的教学工作量;(提示:课程表中,每门课有课时量hours字段)

SELECT teacher.`name`, SUM( course.hours ) AS SUM

FROM teacher, course

WHERE course.cno = ANY (

SELECT enroll.cno

FROM enroll

WHERE enroll.year_semeste LIKE '2019%'

AND enroll.tno = ANY ( SELECT teacher.tno FROM teacher WHERE teacher.dno = '24' ))

GROUP BY teacher.`name`;

-- 统计各个学院在2019年度的教学工作量;

SELECT department.`name`, SUM( course.hours )

FROM department, course

WHERE department.dno = ALL (

SELECT course.dno

FROM course

WHERE course.cno = ALL ( SELECT enroll.cno FROM enroll WHERE enroll.year_semeste LIKE '2019%' ))

GROUP BY department.`name`;

-- 对于2016级学生,即将毕业,求出输出所得总学分不足172的学生,输出项为所属学院名称,学号,姓名,已得学分数这四项;

SELECT department.`name`,student.sno,student.sname,SUM( course.credit ) AS SUM

FROM department, student,course

WHERE department.dno = student.dno

AND course.cno = ALL (

SELECT enroll.cno

FROM enroll

WHERE enroll.sno = ALL ( SELECT student.sno FROM student WHERE student.sno LIKE '2016%' ))

GROUP BY student.sno

HAVING SUM( course.credit ) < '172';

附加部分:

分析所给出的SQL语句的含义,理解和注释出每个语句的目的。然后上机执行数据操作SQL语句,得出正确结果。

查询迪斯尼1999年发行的电影的名字与片长,名字字段命名为“name”,片长字段命名为“lengthInHours”,以小时为单位:

select title as name , length*0.016667 as lengthInHours from movies

where studioName='Disney' and year=1999;

查询迪斯尼1999年发行的电影的名字与片长,名字字段命名为“name”,片长字段命名为“length”,以小时为单位,并用名为“InHours”的一列记录电影片长的单位(hrs.):

select title as name , length*0.016667 as length, 'hrs.' as InHours from movies

where studioName='Disney' and year=1999;

-- 查询Fox在1970年之后发行的片长在90分钟以内的电影的名字:

select title from movies where (year>1970 or length<90) and studioName='Fox';

-- 在电影表中查询以“Star”开头的电影的名字:

select title from movies where title like 'Star %';

-- 在不存在的“dual”表格中查询常量date:

select date '1948-05-14', time '12:08:08.08' from dual;

select date '1948-05-14', time '12:08:08.08' from dual;

select date '1948-05-14', timestamp '1948-05-14 12:08:08.08' from dual;

-- 在不存在的“dual”表格中查询1+2、1+null、null+1的结果:

select 1+2 , 1+null,null+1 from dual;

-- 查询电影表中满足1=1的电影的详细信息:

select * from movies where 1=1;

-- 查询电影表中满足null=null的电影的详细信息:

select * from movies where null=null;

-- 查询电影表中title字段非空的电影的详细信息:

select * from movies where title is not null;

-- 查询电影表中的全部记录,并使用排他锁:

select * from movies for update;

-- 查询电影表中的片长不超过120分钟或超过120分钟的电影:

select * from movies where length<=120 or length>120;

-- 查询电影表中title字段为空的电影的详细信息:

select * from movies where title is null;

-- 查询电影表中Fox发行的全部电影的详细信息,按片长与片名升序排序:

select * from movies where Studioname = 'Fox' order by length, title;

-- 查询片名为“Star Wars”,movieexec表中cert字段等于movie表中producerc字段的电影在movieexec表中的名字:

select name from movies, movieexec where title='Star Wars' and producerc= cert;

-- 查询moviestar表中的住址与movieexec表中的住址相同的记录,

-- 在两个表格中的名字:

select moviestar.name, movieexec.name from moviestar , movieexec where moviestar.address =

movieexec.address;

-- 查询住址相同的不同电影明星的名字,结果成对出现:

select star1.name, star2.name from moviestar star1, moviestar star2 where star1.address = star2.address

and star1.name<star2.name;

-- 查询电影明星表中可能出现关联的两人名字,结果成对出现:

select star1.name, star2.name from moviestar star1, moviestar star2;

-- 查询电影“Star Wars”的出品方的名字:

select name from movieexec where cert =( select producerc from movies where title='Star Wars' );

-- 查询姓名为“Harrison Ford”的明星参演的电影的出品方的名字:

select name from movieexec where cert in ( select producerc from movies where (title, year) in (select

movietitle, movieyear from starsin where starname='Harrison Ford' ));

-- 通过联接查询姓名为“Harrison Ford”的明星参演的电影的出品方的名字:

select name from movieExec, movies, starsin where cert = producerC and title = movietitle and year=

movieyear and starname='Harrison Ford';

-- 查找有多个版本的电影中的老版本的名字与年代。

select title, year from movies old where year <any (select year from movies where title = old.title) ;

select name from movieexec, (select producerc from movies, starsin where title = movietitle and year =

movieyear and starname = 'Harrison Ford') prod where cert = prod.producerc;

-- 查询movies表与starsin表的笛卡尔积:

select * from movies cross join starsin ;

-- 查询姓名为“Harrison Ford”的明星出演的所有电影的出品方,如果有重复便输出多次:

select * from movies join starsin on title=movietitle and year = movieyear;

select title, year, length, genre, studioName, producerc, starname from movies join starsin on

title=movietitle and year = movieyear;

-- 将movies表与starsin表自然联结:

select * from movies natural join starsin ;

-- 将moviestar表与movieexec表自然联结:

select * from moviestar natural join movieexec ;

-- 将movieexec表与moviestar表左联接的结果与右联接的结果合在一起输出,联接字段为name:

select * from moviestar left outer join movieexec on moviestar.name= movieexec.name

union select * from moviestar right outer join movieexec on moviestar.name= movieexec.name;

-- 不指定联接字段,将movieexec表与moviestar表左联接,观察能否输出结果:

select * from moviestar left outer join movieexec ;

select * from moviestar right outer join movieexec ;

-- 将movies表与starin表左联接的结果与右联接的结果合在一起输出,联接字段为左表的title、year分别对应右表的movietitle、movieyear:

select * from movies left outer join starsin on title = movietitle and year=movieyear

union

select *from movies right outer join starsin on title = movietitle and year=movieyear;

-- 将movies表与starin表左联接,联接字段为左表的titile、movietitle分别对应右表的year、movieyear:

select * from movies left outer join starsin on title = movietitle and year=movieyear;

-- 将movies表与starin表右联接,联接字段为左表的titile、movietitle分别对应右表的year、movieyear:

select * from movies right outer join starsin on title = movietitle and year=movieyear;

-- 查询不重复的所有电影名

select distinct title from movies;

-- 查询movie表中全部记录的title、year,查询starin表中所有记录的movietitle、movieyear,对两个结果集进行不去重的并集操作:

select title, year from movies

union all select movietitle as title , movieyear as year from starsin;

-- 查询movieexec表中所有记录networth的平均值:

select avg(networth) from movieexec;

-- 查询starin表中的记录数目:

select count(*) from starsin;

-- 查询starin表中starname的数目:

select count(starname) from starsin;

-- 查询starin表中不同的starname的数目:

select count(distinct starname) from starsin;

-- 查询所有制片厂的制片总长度:

select studioname,sum(length) from movies group by studioname;

-- 在movies表中查询不同的制片厂的名字:

select studioname from movies group by studioname;

-- 在movies表中查询不同的制片厂的名字:

select distinct studioname from movies group by studioname;

drop table tmp_a;

-- 创建一个名为temp_a的表,有两个字段:a和b,数据类型都是varchar(8):

CREATE TABLE TMP_A ( A varchar(8), b varchar(8));

-- 向该表中插入一行记录,该记录全部字段为NULL。

insert into tmp_a values(null,null);

-- 查询tmp_a表中的全部记录:

select * from tmp_a;

-- 查询tmp_a表中b字段的记录数量:

select a, count(b) from tmp_a group by a;

-- 查询在1985年之前发行过电影的制片厂的电影总时长:

select name, sum(length) from movieExec , movies where producerc = cert group by name having

min(year)<1985;

-- 查询制片厂1985年之前发行的所有电影的总时长:

select name, sum(length) from movieExec , movies where producerc= cert and year<1985 group by name

having min(year)<1985;

-- 向starsin表中插入一条记录,movietitle为The maltese falcon,movieyear为1942,starname为Sydney Greenstreet:

insert into starsin(movietitle, movieyear, starname) values('The maltese falcon',1942,'Sydney Greenstreet');

-- 向studio表中插入movies表中存在但studio表中不存在的记录

insert into studio(name) select distinct studioname from movies where studioname not in (

select name from studio);

-- 删除starsin表中指定的记录:指定要删除的记录的movietitle、movieyear、starname:

delete from starsin where movietitle='The maltese falcon' and movieyear=1942 and starname='Sydney

Greenstreet';

-- 更新movieexec中的cert字段值存在于studio表中的记录,将对应记录的name修改为“Pres.”。

update movieexec set name = 'Pres.' where cert in (select presc from studio);

湖南大学数据库实验一相关推荐

  1. 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶

    数据库实验:数据库和表.查询.视图与安全性.存储过程及游标.触发器.综合实验-水果商店进阶 实验一.数据库和表 源码1: 源码2: 小结 实验二.查询 源码 小结 实验三.视图.安全性 源码: 小结 ...

  2. 查询选修c语言课程的学生学号和姓名,数据库实验(学生信息表)

    目录 数据库实验(学生信息表) 实验一 实验二 实验三 实验四 数据库实验(学生信息表) 实验一 创建数据库以及学生信息表.课程信息表.选课表 create Table student (Sno ch ...

  3. mysql实验四图书视图_[数据库实验四.doc

    [数据库实验四 计算机与信息学院实验报告 系: 专业: 年级: 姓名: 学号: 22 实验室号 计算机号 22 实验时间: 2013年10月29日 指导教师签字: 成绩: 报告退发 (订正 . 重做) ...

  4. mysql实验学生表_数据库实验(学生信息表)

    数据库实验(学生信息表) 实验一 创建数据库以及学生信息表.课程信息表.选课表 create Table student (Sno char(9) primary key, Sname char(20 ...

  5. 如何使用SQL Server数据库实验助手(DEA)工具

    介绍 (Introduction) This is my second article about Database Experimentation Assistant (DEA). Please r ...

  6. 如何下载和安装SQL Server数据库实验助手(DEA)

    介绍 (Introduction) The Database Experimentation Assistant (DEA) is a new Experimental solution provid ...

  7. 如何下载和安装SQL Server数据库实验助手(DEA v2.0)

    介绍 (Introduction) I had the opportunity to work and perform various tests with Database Experimentat ...

  8. 【数据库实验】《小型MIS的开发》— JavaFx 开发 民航票务管理系统

    <小型MIS的开发> 需求描述 数据库建表 用户表的 SQL 航班信息表的 SQL 项目演示 GitHub 网址获取源代码 比较重要的知识点 JavaFx 中 spring 工厂如何创建 ...

  9. 数据库实验四:数据高级查询

    真给我整无语了,数据库实验怎么这么多,要考试还要写实验.写写写,写他娘的什么东西. 实验内容 实现查询 ps:实验要求用两种方法写的我除了union都是用的两种方法写,union查了好久都查不到,或许 ...

最新文章

  1. 数组的遍历你都会用了,那Promise版本的呢
  2. 团队冲刺站立会议07
  3. java 初始化二维数组_java二维数组的常见初始化
  4. laravel框架应用和composer扩展包开发
  5. 电商行业最复杂的人货场分析,我用一个案例给你讲清楚
  6. 微擎后端/知识付费阅读店铺小程序 V5.1.0 全套源码
  7. 用户密码重设对EFS的影响
  8. mysql常见内置函数
  9. phalcon index.php,除了Phalcon php中的indexAction之外,无法调用indexController的动作
  10. img写盘工具安装Linux,USB Image Tool:Windows下的直接写盘利器 【开源硬件佳软介绍 #2】...
  11. Python3简单爬虫之下载相关类型音乐(喜马拉雅网站)!
  12. Python----稀疏矩阵
  13. stm32 spi nss硬件模式配置参考程序
  14. 行走社会的100条忠告
  15. hdoj 2036 改革春风吹满地 (多边形面积)
  16. 关于UEditor与Bootstrap结合使用时产生的工具栏边距错乱现象的解决方法
  17. C\C++ 输出8位,不足时全补0
  18. log(n)怎么理解
  19. 2021年质量员-市政方向-通用基础(质量员)免费试题及质量员-市政方向-通用基础(质量员)考试技巧
  20. 想把读取的网络图片显示在UIImageView 视图,居然死活不显示,代码绝对没问题

热门文章

  1. 解决VisualVm的Profiler一直转圈:正在连接到目标 VM...
  2. 让企业用上金融合规专有云,腾讯云专有云TCE矩阵来支招儿!
  3. android身高控件_RuleView Android 自定义标尺控件(选择身高、体重等) @codeKK Android开源站...
  4. JavaScript 判断对象中属性的值是否空,如果为空,则删除该属性
  5. 自己设计系统之间的通信协议
  6. ATTCK实战系列——红队实战(一)
  7. 说说 java包与导包
  8. MATLAB:变量类型与赋值
  9. 前端里的button怎么去除点击自带边框_自媒体人做视频时配音中的噪音如何用EQ和采样去除(详细介绍)...
  10. 设计模式之-代理模式