实验2 数据查询

一、实验目的
熟悉SQL语句的数据查询语言,能够使用SQL语句对数据库进行单表查询、连接查询、嵌套查询、集合查询和统计查询。通过实验理解在数据库表中对数据的NULL值的处理。
二、实验内容1

  1. 问题描述
    (1)单表查询
    查询的目标表达式为所有列、指定列或指定列的运算
    使用DISTINCT保留字消除重复行
    对查询结果排序和结果
    集合分组使用集函数进行各项统计
    (2)连接查询
    笛卡尔链接和等值连接
    自连接
    外连接
    复合条件连接
    多表连接
    (3)嵌套查询
    通过实验验证对子查询的两个限制条件
    体会相关子查询和不相关自查询的不同
    考察四类谓词的用法
    (4)集合运算
    使用保留字UNION进行集合或运算
    采用逻辑运算符AND或OR来实现集合交和减运算

  2. 数据库设计
    1)单表查询
    •查询的目标表达式为所有列、指定列或指定列的运算。
    •使用 DISTINCT保留字消除重复行。
    •对查询结果排序和分组。
    •集合分组使用集函数进行各项统计。
    一般格式:
    SELECT [ALL|DISTINCT] <目标列表达式>
    [,<目标列表达式>] …
    FROM <表名或视图名>[, <表名或视图名> ] …
    [ WHERE <条件表达式> ]
    [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
    [ ORDER BY <列名2> [ ASC|DESC ] ];
    2) 连接查询
    •笛卡儿连接和等值连接。
    自连接。
    •外连接。
    •复合条件连接。
    •多表连接。
    一般格式:
    [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
    [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
    连接字段:连接谓词中的列名称
    连接条件中的各连接字段类型必须是可比的,但名字不必是相同的

3. 程序实现
查询年级为2001的所有学生的名称,按编号升序排列:
SELECT SNAME
FROM STUDENTS
WHERE GRADE=‘2001’
ORDER BY SID
查询学生的选课成绩合格的课程成绩,并把成绩换算为积点(60分对应积点为1,每增加1分,积点增加0.1):
SELECT TID,CID,SCORE,‘POINT OF SCORE’,(SCORE-50)/10
FROM CHOICES
WHERE SCORE>60
查询课时是48或64的课程的名称:
SELECT CNAME
FROM COURSES
WHERE HOUR IN(‘48’,‘64’)
查询所有课程名称中含有data的课程编号:
SELECT CNAME
FROM COURSES
WHERE CNAME like ‘%data%’
查询所有选课记录的课程号(不重复显示):
SELECT CID FROM CHOICES
–去重
SELECT DISTINCT CID FROM CHOICES
统计所有老师的平均工资:
SELECT AVG(SALARY) FROM TEACHERS
查询所有学生的编号,姓名和平均成绩,按总平均成绩降序排列:
SELECT TID,AVG(SCORE)
FROM CHOICES
GROUP BY TID
ORDER BY AVG(SCORE) DESC
统计各个课程的选课人数和平均成绩:
SELECT CID, COUNT(NO),AVG(SCORE)
FROM CHOICES
GROUP BY CID

查询至少选修了三门课程的学生编号:
SELECT SID
FROM CHOICES
GROUP BY SID
HAVING COUNT(*)>3

查询编号800009026的学生所选的全部课程的课程名和成绩:
SELECT COURSES.CNAME,CHOICES.SCORE
FROM COURSES,CHOICES
WHERE CHOICES.SID=‘800009026’ AND COURSES.CID=CHOICES.CID

查询所有选了database的学生的编号
SELECT CHOICES.SID
FROM CHOICES,COURSES
WHERE CHOICES.CID=COURSES.CID AND COURSES.CNAME=‘database’

SELECT SID
FROM CHOICES
WHERE ‘database’ IN
(
SELECT CNAME
FROM COURSES
WHERE COUSES.CID=CHOICES.CID
)
–子查询(11)

求出选择了同一个课程的学生对
SELECT CID,COUNT(*)
FROM CHOICES
GROUP BY CID;

求出至少被两名学生选修的课程编号
SELECT X.CID
FROM CHOICES X
GROUP BY X.TID
HAVING COUNT(*)>2

查询选修了编号80009026的学生所选的某个课程的学生编号
SELECT Y.SID
FROM CHOICES AS X,CHOICES AS Y
WHERE X.CID=Y.CID AND X.SID=‘850955252’

查询学生的基本信息及选修课编号和成绩
SELECT STUDENTS.SID,STUDENTS.SNAME,STUDENTS.GRADE,CHOICES.CID,CHOICES.SCORE
FROM STUDENTS JOIN CHOICES ON STUDENTS.SID=CHOICES.SID

查询学号850955252的学生的姓名和选修的课程名
SELECT STUDENTS.SNAME,COURSES.CNAME,CHOICES.SCORE
FROM STUDENTS,COURSES,CHOICES
WHERE STUDENTS.SID=CHOICES.SID AND COURSES.CID=CHOICES.CID AND STUDENTS.SID=‘850955252’

查询学号850955252的学生同年级的所有学生资料
SELECT *
FROM STUDENTS
WHERE GRADE=(
SELECT GRADE
FROM STUDENTS
WHERE SID=‘850955252’
)

查询所有的有选课的学生的详细信息
SELECT *
FROM STUDENTS
WHERE SID IN
(
SELECT SID
FROM CHOICES
)

查询没有学生选的课程编号
SELECT CNAME
FROM COURSES
WHERE CID NOT IN
(
SELECT CID
FROM CHOICES
)

查询选修了课程名为c++的学生学号和姓名
SELECT SID,SNAME
FROM STUDENTS
WHERE SID IN
(
SELECT SID
FROM CHOICES
WHERE CID IN
(
SELECT CID
FROM COURSES
WHERE CNAME=‘C++’
)
)

找出选修课程成绩最差的选课记录
SELECT *
FROM CHOICES
WHERE CHOICES.SCORE>=ALL
(SELECT SCORE
FROM CHOICES
WHERE SCORE IS NOT NULL
)

找出和课程UML或c++的课时一样的课程名称
SELECT CNAME
FROM COURSES
WHERE HOUR=SOME
(
SELECT HOUR
FROM COURSES
WHERE CNAME='UML’OR CNAME=‘C++’
)

查询所有选修编号10001的课程的学生的姓名
SELECT SNAME
FROM STUDENTS
WHERE EXISTS
(
SELECT*
FROM CHOICES X
WHERE X.CID=‘10001’ AND X.SID=STUDENTS.SID
)

查询所有选修了所有课程的学生姓名
SELECT SNAME
FROM STUDENTS
WHERE NOT EXISTS
(SELECT *
FROM COURSES AS X
WHERE NOT EXISTS
(
SELECT *
FROM CHOICES AS Y
WHERE Y.SID=STUDENTS.SID AND Y.CID=X.CID
)
)

利用集合运算,查询选修课程c++或课程Java的学生的编号
SELECT TID
FROM CHOICES
WHERE CHOICES.CID=
(
SELECT COURSES.CID
FROM COURSES
WHERE COURSES.CNAME=‘C++’
)
UNION
SELECT TID
FROM CHOICES
WHERE CHOICES.CID=
(
SELECT CID
FROM COURSES
WHERE COURSES.CNAME=‘Java’
)

实现集合交运算,查询既选修课程c++又选修课程Java的学生的编号
SELECT SID
FROM CHOICES
WHERE SID IN(
SELECT SID
FROM COURSES
WHERE CNAME=‘C++’
)
INTERSECT
SELECT SID
FROM CHOICES
WHERE SID IN(
SELECT SID
FROM COURSES
WHERE CNAME=‘JAVA’
)
实现集合减运算,查询选修课程c++而没有选修课程Java的学生编号
SELECT SID
FROM CHOICES
WHERE SID IN(
SELECT SID
FROM COURSES
WHERE CNAME=‘C++’
)
EXCEPT
SELECT SID
FROM CHOICES
WHERE SID IN(
SELECT SID
FROM COURSES
WHERE CNAME=‘JAVA’
)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耗子煨汁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值