数据库概论(实验四1)数据查询mysql教程

[实验目标]1、掌握单表查询的应用2、熟练掌握连接查询的应用3、掌握嵌套查询和集合查询[实验内容]一、根据实验二,建立SC数据库(实验条件),含有student、course和sc三个表二、数据查询实验1、单表查询1)选择指定的列【例】查询全体

[实验目标]

1、掌握单表查询的应用

2、熟练掌握连接查询的应用

3、掌握嵌套查询和集合查询

[实验内容]

一、根据实验二,建立SC数据库(实验条件),含有student、course和sc三个表

二、数据查询实验

1、单表查询

1)选择指定的列

【例】查询全体学生的学号和姓名

2)查询全部列

【例】查询全体学生的详细信息

3)对查询后的指定列进行命名

【例】查询全部学生的“姓名”及其“出生年”两列

4)消除取值重复的行

【例】查询选修了课程的学生学号

5)选择表中若干元组(满足条件的)

(I)大小比较

【例】查询计算机系(IS)全体学生名单

【例】查询全体20岁以下的学生姓名和年龄

(II)确定范围

【例】查询所有在20到23岁(含20和23)的学生姓名、系别和年龄

(III)in和notin确定集合

【例】查询IS系和CS系的全体学生姓名和性别

【例】查询既不属于IS系,也不属于MA系的学生姓名和年龄

(IV)字符匹配(like%_)

【例】查询所有姓李的学生姓名和性别

【例】查询所有“2002”年入学的学生学号、姓名和系别

【例】查询所有不姓“刘”的学生信息

【例】查询名称含有“数据”的课程号、课程名及学分

(V)涉及空值的查询(isnull)

【例】查询没有先修课的课程号和课程名。

【例】查询所有有成绩的学生学号、课程号及成绩

6)查询结果排序(orderby)

【例】查询选修了3号课程的学生学号和成绩,结果按成绩降序排列。

注:

排序是对查询后的结果排序。所以应该放在最后。

7)聚集函数

count、sum、avg、max、min

【例】查询学生总数

【例】查询所有课程的总学分

【例】查询全体学生平均年龄

【例】查询1号课程的最高分

8)分组统计(groupby)

【例】查询男女学生各有多少人。

【例】查询每个课程的课程号和平均分。

【例】查询选修了3门课程以上(含3门)的学生学号和选修课程数。

【例】查询选修了2门课程以上(含2门,但不含1号课程),学生学号和选修课程数。

【例】查询不及格门数2门以上的学生学号。

【例】查询有2名以上(含2名)学生选修了的课程号和选修人数。

注:1.分组查询的目标列可以出现分组的列及含在聚集函数中的其他列;

2.where条件用于分组前的选择条件;having子句,用于分组后选择的条件。

2、连接查询

1)等值与非等值连接查询

【例】查询每个学生及其的选修课程情况

2)自身连接

【例】查询每个课程的间接选修课

3)外连接

【例】查询所有学生选修课程情况(含没选修课程的学生)

【例】查询所有学生选修课程情况(含没选修课程的学生,属性有学号,姓名,课程名和成绩)

4)符合条件连接

【例】查询选修了2号课程且成绩在90分以上的所有学生学号和姓名

【例】查询每个学生的学号、姓名,选修课程名和成绩。

3、嵌套查询

1)带有IN谓词的子查询(属性in(子查询的查询结果))

【例】查询与王敏同学在同一个系的学生信息。

【例】查询与王敏同学不在同一个系的学生信息。

【例】查询选修了课程名为“信息系统”的学生学号和姓名。

【例】查询曾与刘晨一同上课的学生学号和姓名。(假设:一个课程只有一个上课班)

2)带有比较运算符的子查询(=,>=,或!=)

【例】查询与王敏同学在同一个系的所有学生信息(=判断)

【例】查询每个学生超过该课程最低分的课程号。(同类课程不是最低分的)

【例】查询每个学生超过他选修课程平均成绩的课程号。

【例】查询每个学生超过该课程平均成绩的课程号。

3)带有ANY或ALL谓词的子查询

【例】查询其他系中比计算机系某一学生年龄小的学生姓名,性别、年龄和所在系。

【例】查询其他系中比计算机系所有年龄都小的学生姓名和年龄。

4)带有Exists谓词的子查询

【例】查询所有选修了1号课程的学生姓名。

【例】查询选修了全部课程的学生姓名。

【例】查询至少选修了学生200215122选修的全部课程的学生学号。

4、集合查询

1)并UNION

【例】查询计算机系的学生及年龄不大于19岁的学生详细信息。

【例】查询选修了1号课程的及年龄不大于19岁的学生详细信息。

2)交INTERSECT

【例】查询选修了1号课程的与年龄不大于19岁的学生详细信息的交集。

3)差EXCEPT

【例】查询计算机科学系的学生与年龄不大于19岁的学生详细信息的差集。

[课后作业]

1、通过SPJ数据库完成课后针对SPJ的查询练习。

2、根据SPJ数据库用SQL语句完成以下查询。

1)查询“天津”的供应商详细信息。

2)查询不是“天津”的供应商代码。

3)查询供应工程J1零件的供应商代码。

4)查询供应商S1供应过的商品代码。

5)查询供应商S1供应工程J1的零件种类有几种。

6)查询供应商S1供应工程J1的各种零件的零件代码和其数量和。

7)查询J1工程使用的零件种类有几种。

8)查询J1工程使用的各种零件代码和其数量和。

9)查询J1工程使用的零件总数大于300的零件代码和数量。

10)查询J1工程使用的各种零件,其数量至少大于J3使用的S2供应的所有零件数量和的,零件代码和数量。

11)查询J1工程使用的各种零件,其数量至少大于J3使用的同类数量和的,零件代码和数量。

12)查询至少使用了J1工程所用的几类零件的工程的工程号。

13)查询至少使用了所有红色零件的工程号。

14)查询使用了全部红色零件的工程号。

15)查询工程所在地与供应其零件的供应商在同一个城市的工程号和供应商号。

16)查询没有使用天津供应商生产的红色零件的工程号JNO。

17)查询至少使用了供应商S1供应的全部零件的工程号JNO。

18)查询使用了全部上海产的零件的工程号JNO。

19)查询没有使用J2所使用的所有零件的工程号JNO。

3、根据SC数据库用SQL语句完成以下任务。

1)将不及格的每个学生成绩增加5分。

2)将低于该课程平均分的学生成绩,成绩提高10%。

3)把计算机科学系所有学生增加1岁。

4)把学分为3分以内(含3分)的课程成绩提高3分,学分为3分以上的课程成绩提高4分。

5)建立名字为“成绩单”的视图,属性有学生号,学生姓名、课程号、课程名和成绩。

THE END
1.sql如何查询所有学生都选修了的课程的课程号cno?*首先从课程表里面选出一个课程,然后再从学生表里面取出所有的学生,然后进行B.sno = student.sno and course.cno = B.cno的判断来确定该名学生有没有选这门课,如果有则查询到了结果则第二个NOT EXISTS 返回false则student里面的where则接受到false不进行任何操作,即为空,如果没有查询到结果则第二个NOT EXISTShttps://blog.csdn.net/weixin_51215850/article/details/124258836
2.SQL那个面试题(学生表课程表成绩表教师表)select C# as 课程号,count() as 人数 from sc group by C# order by count() desc,c# 45. 检索至少选修两门课程的学生学号 select S# from sc group by s# having count() > = 2 46. 查询全部学生都选修的课程的课程号和课程名 select C#,Cname https://www.jianshu.com/p/2bc402e41fdc
3.数据库——关系代数结论:当查询条件和结果来自两个关系时, 用连接 [例 2] 查询选修了2号课程的学生的学生名。 π Sname(σCno=‘2’(Student 连接 SC )) [例3] 查询选修了先行课为5号课的课程的学生姓名。 π Sname(σ Cpno='5'(Student 连接 SC 连接 Course)) https://www.pianshen.com/article/13152011004/
4.学院名,电话,家庭住址)课程关系C(课程号,课程名选修课程号给定学生关系S(学号,姓名,学院名,电话,家庭住址)、课程关系C(课程号,课程名,选修课程号)、选课关系SC(学号,课程号,成绩)。查询“张晋”选修了“市场营销”课程的学号、学生名、学院名、成绩的关系代数表达式为:π1,2,3,7(π1,2,3(1) )∞(2) ))。 https://www.ruantiku.com/shiti/459417960.html
5.数据库复习题考试题库(应用题)阅读清单5)检索WANG同学不学的课程的课程名。 ∏C#(C)-ΠC#(σSNAME=‘WANG’(S∞SC) 6)检索全部学生都选修的课程的课程号与课程名。 ∏C#,CNAME(C∞(πS#,C#(SC) ÷πS#(S))) 7)检索选修课程包含LIU老师所授全部课程的学生学号。 ∏S#,C#(SC)÷∏C#(σTEACHER=‘LIU’(C)) https://cloud.tencent.com/developer/inventory/3529/article/1557979
6.数据库中查询全部学生都选修了的课程号和课程名select 课程.课程号,课程.课程名 from 课程 where 课程号 in(select distinct 课程号 from 选课 group by 课程号 having count(*) =(select count(*) from 学生))根据人数判断 ,比较土,可以这样试试。https://zhidao.baidu.com/question/543608443.html
7.mysql查询某班学生的各科平均分代码mysql查询平均分大于60的学号36、检索至少选修两门课程的学生学号; select student_id from score group by student_id having count(student_id) > 1 1. 37、查询全部学生都选修的课程的课程号和课程名; select course_id,count(1) from score group by course_id having count(1) = (select count(1) from student); https://blog.51cto.com/u_16213723/10393460