StudentCourse数据查询1~30-有数据
- 格式:doc
- 大小:68.00 KB
- 文档页数:4
数据库系统(⼀)——数据查询⽂章⽬录⼀、实验⽬的:1. 熟练掌握SQL定义数据表和索引的⽅法;2. 能够使⽤SQL完成数据的单表查询、多表查询和嵌套查询操作。
⼆、实验内容:1. 根据指定场景创建数据库;2. 根据具体的查询应⽤需求写出相应的SQL查询语句,并得到正确的查询结果。
1、熟悉基于单表的SQL的数据查询功能;2、掌握基于单表的GROUP BY⼦句、HAVING⼦句、ORDER BY⼦句的⽤法;3、掌握基于单表的(NOT)IN等谓词的⽤法,掌握集合函数的⽤法;4、掌握多表连接查询的适⽤情况和语句构造⽅法;三、实验过程:1、创建学⽣课程数据库(stu_course):create database stu_course;2、学⽣表、课程表和学⽣选课表的创建和修改:2.1、创建数据表:create table Student(Sno char(9)primary key,Sname char(20)unique,Ssex char(2),Sage smallint,Sdept char(20));create table Course (Cno char(4)primary key,Cname char(4) not null,Cpno char(4),Ccredit smallint ,foreign key(Cpno) references Course(Cno));create table SC(Sno char(9),Cno char(4),Grade smallint,primary key(Sno,Cno),foreign key(Sno) references Student(Sno),foreign key(Cno) references Course(Cno));2.2、修改数据表:在 Student 表增加⼊学时间列,数据类型为⽇期型:alter table Student add S_entrance Date;将年龄的数据类型由字符型(假设原来是字符型)改为整数型:alter table Student alter column Sage int;增加课程名称必须取唯⼀的约束条件:alter table Course add unique(Cname);删除 Student表:drop table Student;3、插⼊数据:INSERT INTO student VALUES ('201215121', '李勇', '男', 20, 'CS');INSERT INTO student VALUES ('201215122', '刘晨', '⼥', 19, 'CS');INSERT INTO student VALUES ('201215123', '王敏', '⼥', 18, 'MA');INSERT INTO student VALUES ('201215125', '张⽴', '男', 19, 'IS');INSERT INTO course VALUES ('1', '数据库', '5', 4);INSERT INTO course VALUES ('2', '数学', NULL, 2);INSERT INTO course VALUES ('3', '信息系统', '1', 4);INSERT INTO course VALUES ('4', '操作系统', '6', 3);INSERT INTO course VALUES ('5', '数据结构', '7', 4);INSERT INTO course VALUES ('6', '数据处理', NULL, 2);INSERT INTO course VALUES ('7', 'PASCAL语⾔', '6', 4);INSERT INTO sc VALUES ('201215121', '1', 92);INSERT INTO sc VALUES ('201215121', '2', 85);INSERT INTO sc VALUES ('201215121', '3', 88);INSERT INTO sc VALUES ('201215122', '2', 90);INSERT INTO sc VALUES ('201215122', '3', 80);4、各种类型的查询操作:4.1 、单表查询操作:1、查询指定列:查询所有学⽣的的学号与姓名:select Sno,Sname from Student;2、查询全部列:查询所有学⽣的信息:select * from Student;3、查询经过计算的值:查询全体学⽣的姓名和出⽣年份:select Sname 2021-Sage from Student;4、消除出重复的元组:select Distinct Sno from Student;5、查询满⾜条件的元组:查询计算机科学系的所有学⽣:select Sname from Student where sdept='CS';查询年龄⼩于20的学⽣:select * from student where Sage <20;查询年龄在20~23岁之间的学⽣姓名,系别和年龄:select sname,sdept,sage from student where sage between 20 and 23;查询年龄不在20~23岁之间的学⽣姓名,系别和年龄:select sname,sdept,sage from student where sage not between 20 and 23;6、确定集合(IN):查询计算机科学系(CS),数学系(MA)和信息系(IS)学⽣的姓名和性别。
数据查询(⼆)⼆.连接查询等值查询1.查询每个学⽣及其选修课程的情况select student.* ,SC.*from Student,SCwhere Student.Sno = SC.Sno;⾃⾝连接2.查询每⼀门课的间接先修课select o,o //first second为Course的别名from Course first,Course secondwhere first.Cpno = second.Cpno;复合条件连接3.查询选修2号课程且成绩在90分以上的所有学⽣select Student.Sno,Snamefrom Student,SCwhere Cno = '2' and Grade > 90 and Student.Sno = SC.Sno;4.查询每个学⽣的学号、姓名、选修的课程名及成绩select Student.Sno,Sname,Cname,Gradefrom Student,Course,SCwhere Student.Sno = SC.Sno and o = o;⼆.嵌套查询select Snamefrom Studentwhere Sno in(select Snofrom SCwhere Cno = '2') ;带有in谓词的⼦查询5.查询与Larry在同⼀个系的学⽣姓名select Snamefrom Studentwhere Sdept in(select Sdeptfrom Studentwhere Sname = 'Larry');6.查询选修了课程名为“信息系统”的学⽣学号和姓名select Sno,Snamefrom Studentwhere Sno in(select Snofrom SCwhere Cno in(seelct Cnofrom Coursewhere Cname = '信号与系统'));//或者是select Student.Sno,Snamefrom Studnet,SC,Coursewhere SC.Sno = o and o = o and Cname = '信号与系统';带有⽐较运算符的查询7.查询与Larry在同⼀个系的学⽣姓名由于每⼀个学⽣只在⼀个系学习,因此该例可以⽤⽐较运算符=查询:select Snamefrom Studentwhere Sdept = (select Sdeptfrom studentwhere Sname = 'Larry');8.查询每个学⽣超过他选修课程平均成绩的课程号select Cnofrom SC x//这是⼀个相关⼦查询where grade > (select avg(grade)from SC ywhere y.Sno = o);9.查询其他系中⽐计算机系所有学⽣的年龄都⼩的学⽣姓名和年龄select Sname,Sagefrom studentwhere sage <= (select min(sage)from studentwhere Sdept = 'CS')and Sdept <> 'CS';带有exists谓词的⼦查询10.查询所有选修了1号课程的学⽣姓名select Snamefrom SC,studentwhere exists(//如果是没有选修,则改为 where not exists...select *from SCwhere Sno = student.Sno and Cno = '1');11.查询选修了全部课程的学⽣姓名该题⽬可以等价转换为:查询⼀个学⽣,没有⼀门课程是他不选修的。
利用学生选课数据库进行SQL查询。
学生{学号,姓名,性别,系别,年龄}课程{课程号,课程名,学分}学生选课{学号,课程号,成绩 }查询条件及相应的SQL语句如下:(1)查询全体学生的姓名、学号。
SELECT学号, 姓名FROM 学生;(2)查询所有选修过课的学生的学号。
SELECT DISTINCT 学号FROM 学生选课;(3)查询年龄在19到22之间的学生姓名、系别和年龄。
SELECT 姓名, 系别, 年龄FROM 学生WHERE 年龄 BETWEEN 19 AND 23;年龄 > 19 and 年龄 < 23谓词BETWEEN…AND…和NOT BETWEEN … AND…可以查找属性值在(或不在)指定范围内的元组。
(4)查询出成绩为80、85、87的记录。
SELECT * FROM 学生选课 WHERE 成绩 IN(80,85,87);成绩=80 or成绩=85 or成绩=87谓词IN可以用来查找属性值属于指定集合的元组。
(5)查询第二个字为“艳”的学生的姓名和系别。
SELECT 姓名,系别FROM 学生WHERE 姓名 LIKE ‘_艳%’;谓词LIKE可以用来进行字符串的匹配。
其中%代表任意长的的字符串,_代表任意单个字符。
(6)查询所有学生的姓名、选修的课程名及成绩。
SELECT 学生.姓名, 课程.课程名, 学生选课.成绩From 学生 join学生选课 on 学生.学号 = 学生选课.学号join 课程 on学生选课.课程号 = 课程.课程号SELECT 学生.姓名, 课程.课程名, 学生选课.成绩From 学生, 学生选课, 课程Where 学生.学号 = 学生选课.学号 and 学生选课.课程号 = 课程.课程号此查询为复合条件查询。
(7)查询选修了“数据库系统原理”课程的学生姓名。
SELECT 姓名FROM 学生WHERE 学号 IN (SELECT 学号 FROM 学生选课WHERE 课程号 IN (SELECT 课程号 FROM 学生选课WHERE 课程名=’数据库系统原理’));SELECT 姓名Where 学生.学号 = 学生选课.学号 and 学生选课.课程号 = 课程.课程号And课程名=’数据库系统原理’此查询为嵌套查询。
实验4 数据查询一、实验目的1.掌握SELECT语句的基本语法和查询条件的表示方法;2.掌握连接查询的表示方法;3.掌握嵌套查询的表示方法;4.掌握数据汇总的方法;5.掌握ORDER BY子句的作用和使用方法;6.掌握HAVING子句的作用和使用方法;二、实验内容使用SELECT查询语句,在数据库StudentCourse的Student表、Course 表和StuCourse 表上进行各种查询,包括单表查询、连接查询、嵌套查询,并进行数据汇总,以及使用GROUP BY子句、ORDER BY子句和HAVING子句对结果进行分组、排序和筛选处理。
1.SELECT语句的基本使用;2.连接查询;3.嵌套查询;4.数据汇总;5.使用GROUP BY 子句对结果分组;6.使用ORDER BY子句对结果排序;7.使用HAVING子句对分组结果进行筛选;思考与练习:1.用SELECT语句查询Course表和StuCourse表中的所有记录。
SQL语句:select * from Course;select * from StuCourse;实验结果:2.用SELECT语句查询Course表和StuCourse表中满足指定条件的一列或若干列。
SQL语句:select 课程号,课程名 from Course where 学分=5;select 学号,课程号 from StuCourse where 成绩>80;实验结果:3.查询所有姓名中包含有“红”的学生的学号及姓名。
SQL语句:select 学号,姓名 from Student where 姓名 like '%红%';实验结果:4.用连接查询的方法查找所有选修了“2001” 或“1002”号课程的学生学号和姓名。
SQL语句:selectdistinct Student.学号,姓名from StuCourse,Studentwhere(课程号='1002'or 课程号='2001')and StuCourse.学号=Student.学号;实验结果:5.用子查询的方法查找所有选修了“2001”或“1002”号课程的学生学号和姓名。
学生数据库中有三个数据表,如下所示:学生表S(Sno,Sname,Age,Sex,SD)(学号,姓名,年龄,性别,系别)课程表C(Cno,Cname,Teacher)(课程号,课程名称,任课教师)选课表SC(Sno,Cno,Grade)(学号,课程号,成绩)1)检索选修课程名为“数据库系统原理”的学生学号、姓名、成绩select a.Sno,Sname,Grade ;from S a,C b, SC c ;where a.Sno=c.Sno and o=o ;and Cname="数据库系统原理"2)检索年龄在18--20(含18、20)的女生的学号、姓名、年龄select Sno,Sname,age ;from S ;where age between 18 and 20 and sex="女"另一种表达select Sno,Sname,age ;from S ;where age>=18 and age<=20 and sex="女"3)检索选修了“高博”老师所讲课程的学生的学号、姓名、选修课程名称、成绩select a.Sno,Sname,Cname,grade ;from S a,C b, SC c ;where a.Sno=c.Sno and o=o ;and teacher="高博"4)检索所有姓“蒋”的学生的姓名、年龄、系别select Sname,age,SD ;from S ;where Sname like "蒋%"5)按系别统计人数select SD as 系名,count(*) as 人数 ;from S ;group by SD6)按课程名称统计成绩的最高分、最低分和平均分select Cname as 课程名称,max(grade) as 最高分,; min(grade) as 最低分,avg(grade) as 平均分 ;from C a,SC b ;where o=o ;group by Cname7)查询不及格的学生姓名、选修课程名称、成绩select Sname,Cname,Grade ;from S a,C b, SC c ;where a.Sno=c.Sno and o=o ;and grade<608)查询统计讲授三门课程以上的老师select teacher as 授课老师,count(*) as 授课门数 ;from C ;group by teacher ;having count(*)>=39)查询统计计科学院和政法学院选修课程的人数select SD as 系别,count(*) as 选修人数 ;from S a,SC b ;where o=o ;group by SD ;having SD="计科学院" or SD="政法学院"。
所用数据库为学生课程数据库,包括student、course、sc、teacher,具体结构如下所示:Student(sno,sname,ssex,sbirthday,sdepart)其中,sno:学号,sname:姓名,ssex:性别,sbirthday:出生日期,sdepart:所在系Course(cno,cname,ccredit,cpno,tno)其中,cno:课程号,cname:课程名,ccredit:学分,cpno:先修课编号,tno:授课教师号Sc(sno,cno,degree)其中,sno:学号,cno:课程号,degree:成绩Teacher(tno,tname,tsex,tbirthday,prof,depart)其中,tno:教师号,tname:教师姓名,tsex:性别,tbirthday:出生日期,prof:职称,depart:所在系1.查询姓名以“王”打头的所有学生的姓名和年龄。
select sname,year(getdate())-year(sbirthday) from student where sname like '王%'2.将所有所在系为‘计算机’的学生成绩加 10。
update sc set degree=degree+10 where sno in (select sno from student where sdepart='计算机')3.求有两门以上课程不及格的学生的姓名。
select sname from student where sno in (select sno from sc where degree<60 group by sno having count(*)>2)4.查询每个系的名称及该系各个职称的教师人数。
select depart,prof,count(*) from teacher group by depart,prof 5.按成绩降序排列选择了“02”号课程的学生姓名和成绩。
MySQL(学⽣表、教师表、课程表、成绩表)多表查询1、表架构student(sid,sname,sage,ssex) 学⽣表course(cid,cname,tid) 课程表sC(sid,cid,score) 成绩表teacher(tid,tname) 教师表2、建表sql语句SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for course-- ----------------------------DROP TABLE IF EXISTS `course`;CREATE TABLE `course` (`cid` int(11) NOT NULL,`cname` varchar(30) DEFAULT NULL,`tid` int(11) DEFAULT NULL,PRIMARY KEY (`cid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of course-- ----------------------------INSERT INTO `course` VALUES ('3001', '语⽂', '4');INSERT INTO `course` VALUES ('3002', '数学', '2');INSERT INTO `course` VALUES ('3003', '英语', '1');INSERT INTO `course` VALUES ('3004', '物理', '3');-- ------------------------------ Table structure for sc-- ----------------------------DROP TABLE IF EXISTS `sc`;CREATE TABLE `sc` (`sid` int(11) NOT NULL,`cid` int(11) NOT NULL,`score` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of sc-- ----------------------------INSERT INTO `sc` VALUES ('101', '3001', '90');INSERT INTO `sc` VALUES ('102', '3001', '85');INSERT INTO `sc` VALUES ('103', '3001', '76');INSERT INTO `sc` VALUES ('105', '3001', '87');INSERT INTO `sc` VALUES ('106', '3001', '66');INSERT INTO `sc` VALUES ('108', '3001', '96');INSERT INTO `sc` VALUES ('101', '3002', '92');INSERT INTO `sc` VALUES ('102', '3002', '81');INSERT INTO `sc` VALUES ('103', '3002', '93');INSERT INTO `sc` VALUES ('104', '3002', '73');INSERT INTO `sc` VALUES ('105', '3002', '65');INSERT INTO `sc` VALUES ('108', '3002', '96');INSERT INTO `sc` VALUES ('101', '3003', '96');INSERT INTO `sc` VALUES ('102', '3003', '85');INSERT INTO `sc` VALUES ('103', '3003', '76');INSERT INTO `sc` VALUES ('104', '3003', '63');INSERT INTO `sc` VALUES ('105', '3003', '59');INSERT INTO `sc` VALUES ('106', '3003', '56');INSERT INTO `sc` VALUES ('107', '3003', '91');INSERT INTO `sc` VALUES ('108', '3003', '86');INSERT INTO `sc` VALUES ('101', '3004', '100');INSERT INTO `sc` VALUES ('102', '3004', '83');INSERT INTO `sc` VALUES ('103', '3004', '75');INSERT INTO `sc` VALUES ('104', '3004', '69');INSERT INTO `sc` VALUES ('105', '3004', '50');INSERT INTO `sc` VALUES ('106', '3004', '52');INSERT INTO `sc` VALUES ('107', '3004', '87');INSERT INTO `sc` VALUES ('108', '3004', '78');-- ------------------------------ Table structure for student-- ----------------------------DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (`sid` int(11) NOT NULL,`sname` varchar(30) DEFAULT NULL,`sage` int(11) DEFAULT NULL,`ssex` varchar(8) DEFAULT NULL,PRIMARY KEY (`sid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of student-- ----------------------------INSERT INTO `student` VALUES ('101', '龙⼤', '18', '男');INSERT INTO `student` VALUES ('102', '熊⼆', '19', '男');INSERT INTO `student` VALUES ('103', '张三', '18', '男');INSERT INTO `student` VALUES ('104', '李四', '19', '⼥');INSERT INTO `student` VALUES ('105', '王五', '20', '男');INSERT INTO `student` VALUES ('106', '李华', '19', '男');INSERT INTO `student` VALUES ('107', '李红', '19', '⼥');INSERT INTO `student` VALUES ('108', '李明', '20', '男');INSERT INTO `student` VALUES ('109', '贝贝', '19', '⼥');INSERT INTO `student` VALUES ('110', '娜娜', '20', '⼥');-- ------------------------------ Table structure for teacher-- ----------------------------DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (`tid` int(11) NOT NULL,`tname` varchar(30) DEFAULT NULL,PRIMARY KEY (`tid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- ------------------------------ Records of teacher-- ----------------------------INSERT INTO `teacher` VALUES ('1', '叶平');INSERT INTO `teacher` VALUES ('2', '李龙');INSERT INTO `teacher` VALUES ('3', '李逍遥');INSERT INTO `teacher` VALUES ('4', '朱钊');3、问题:(1)查询“3001”课程的所有学⽣的学号与分数;SELECT sid,score FROM sc WHERE cid="3001"(2)查询“3001”课程⽐“3002”课程成绩⾼的所有学⽣的学号与分数;SELECT a.sid,a.score FROM (SELECT sid,score FROM sc WHERE cid="3001") a,(SELECT sid,score FROM sc WHERE cid="3002") bWHERE a.score>b.score AND a.sid=b.sid(3)查询平均成绩⼤于60分的同学的学号和平均成绩;SELECT sid,AVG(score)FROM scGROUP BY sid HAVING AVG(score)>60(4)查询所有同学的学号、姓名、选课数、总成绩select s.sid as学号,s.sname as姓名,count(sc.cid) as选课数,SUM(sc.score) as总成绩from student s INNER JOIN sc scon s.sid=sc.sidGROUP BY s.sid(5)查询姓“李”的⽼师的个数;select count(distinct(Tname))from teacherwhere tname like'李%';(6)查询学过“叶平”⽼师课的同学的学号、姓名SELECT s.sid AS "学号", s.sname AS "姓名"FROM student s, sc sc, course c, teacher tWHERE s.sid=sc.sid AND c.cid=sc.cid AND t.tid=c.tid AND t.tname="叶平"(7)查询没有学过“叶平”⽼师课的同学的学号、姓名SELECT s.sid, s.snameFROM student sWHERE s.sid NOT IN (SELECT s.sidFROM student s, sc sc, course c, teacher tWHERE s.sid=sc.sid AND c.cid=sc.cid AND t.tid=c.tid AND t.tname="叶平")(8)查询学过“3001”并且也学过编号“3002”课程的同学的学号、姓名SELECT s.sid, s.snameFROM student s, sc scWHERE s.sid=sc.sid AND sc.cid="3001" AND EXISTS(SELECT*FROM sc AS sc2 WHERE sc2.sid=sc.sid AND sc2.cid="3002")(9)查询学过“叶平”⽼师所教的所有课的同学的学号、姓名;SELECT sid, snameFROM studentWHERE sid IN (SELECT sc.sidFROM sc sc, course c, teacher tWHERE sc.cid=c.cid AND c.tid=t.tid AND t.tname="叶平")(10)查询所有课程成绩⼩于60分的同学的学号、姓名SELECT sid, sname FROM studentWHERE sid NOT IN (SELECT DISTINCT(sc.sid) FROM student s, sc scWHERE sc.sid=s.sid AND sc.score>60)(11)查询没有学全所有课的同学的学号、姓名;SELECT sid, sname FROM studentWHERE sid NOT IN(SELECT s.sid FROM student s, sc scWHERE sc.sid=s.sidGROUP BY s.sidHAVING COUNT(sc.cid)=(SELECT COUNT(cid) FROM course))(12)查询各科成绩最⾼和最低的分:以如下形式显⽰:课程ID,最⾼分,最低分SELECT cid AS "课程ID", MAX(score) AS "最⾼分", MIN(score) AS "最低分"FROM scGROUP BY cid(13)按各科平均成绩从低到⾼和及格率的百分数从⾼到低顺序(⽅式⼀)SELECT sc.cid AS "课程ID",ame AS "课程名", AVG(sc.score) AS "平均成绩",SUM(CASE WHEN sc.score >60THEN1ELSE0END)/COUNT(1)*100AS "及格百分数"FROM sc sc, course cWHERE sc.cid=c.cidGROUP BY sc.cidORDER BY AVG(sc.score) ASC,SUM(CASE WHEN sc.score >60THEN1ELSE0END)/COUNT(1)*100DESC(⽅式⼆)SELECT sc.cid AS "课程ID",ame AS "课程名", IFNULL(AVG(sc.score),0) AS "平均成绩",100*SUM(CASE WHEN IFNULL(sc.score,0)>=60THEN1ELSE0END)/COUNT(*) AS "及格百分数"FROM sc sc, course cWHERE sc.cid = c.cidGROUP BY sc.cidORDER BY AVG(sc.score) ASC,100*SUM(CASE WHEN IFNULL(sc.score,0)>=60THEN1ELSE0END)/COUNT(*) DESC(14)查询所有学⽣的所有科⽬的成绩单(学号、姓名、语⽂、数学、英语、物理、平均分、总分(按照总分由⾼到低排序))SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE ame WHEN "语⽂" THEN sc.score ELSE0END) AS "语⽂",SUM(CASE ame WHEN "数学" THEN sc.score ELSE0END) AS "数学",SUM(CASE ame WHEN "英语" THEN sc.score ELSE0END) AS "英语",SUM(CASE ame WHEN "物理" THEN sc.score ELSE0END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cidGROUP BY s.sid, s.snameORDER BY IFNULL(SUM(sc.score),0) DESC(15)查询总分排名在200-300(包含200和第300)之间的学⽣所有成绩单信息SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE ame WHEN "语⽂" THEN sc.score ELSE0END) AS "语⽂",SUM(CASE ame WHEN "数学" THEN sc.score ELSE0END) AS "数学",SUM(CASE ame WHEN "英语" THEN sc.score ELSE0END) AS "英语",SUM(CASE ame WHEN "物理" THEN sc.score ELSE0END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cidGROUP BY s.sid, s.snameHAVING IFNULL(SUM(sc.score),0) BETWEEN200AND300ORDER BY IFNULL(SUM(sc.score),0) DESC(16)查询总分排名在前四名的学⽣所有成绩单信息SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE ame WHEN "语⽂" THEN sc.score ELSE0END) AS "语⽂",SUM(CASE ame WHEN "数学" THEN sc.score ELSE0END) AS "数学",SUM(CASE ame WHEN "英语" THEN sc.score ELSE0END) AS "英语",SUM(CASE ame WHEN "物理" THEN sc.score ELSE0END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cidGROUP BY s.sid, s.snameORDER BY IFNULL(SUM(sc.score),0) DESCLIMIT 0,4(17)查询总分排名在前⼆名到四名的学⽣所有成绩单信息(limit 1,3表⽰从第⼆条数据开始,连续三条数据)SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE ame WHEN "语⽂" THEN sc.score ELSE0END) AS "语⽂",SUM(CASE ame WHEN "数学" THEN sc.score ELSE0END) AS "数学",SUM(CASE ame WHEN "英语" THEN sc.score ELSE0END) AS "英语",SUM(CASE ame WHEN "物理" THEN sc.score ELSE0END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cidGROUP BY s.sid, s.snameORDER BY IFNULL(SUM(sc.score),0) DESCLIMIT 1,3(18)查询学⽣平均成绩及其名次SELECT1+(SELECT COUNT( distinct平均成绩)FROM (SELECT sid,AVG(score) AS平均成绩FROM scGROUP BY sid ) AS T1WHERE平均成绩> T2.平均成绩) as名次, sid as学⽣学号,平均成绩FROM (SELECT sid,AVG(score) 平均成绩FROM sc GROUP BY sid ) AS T2ORDER BY平均成绩desc思考:1、?2、?3、?4、?5、?6、?。
实验三:数据库的SQL基本操作
(1) 查询全体学生的学号和姓名
select sno, sname from student
(2) 查询选修了课程名为’数据库原理’的学生的学号和姓名
select sno, sname from student where sno in
(select sno from sc where cno in
(select cno from course where cname='数据库原理'))
(3) 查询全体学生的姓名, 出生年份,和所在系, 并用小写字母表示所有系名,并给各列指定列名。
SELECT sname SNAME, 'Year of Birth:' YEARBIRTH, 2016-sage BIRTH , LOWER(sdept) SDEPT
FROM student ;
(4) 查询有多少名学生的数据库课程成绩不及格
Select count(sno)
From sc,course
Where came=’数据库’ and o= and grade<60
(5) 查找所有姓’李’的学生的姓名, 学号和性别
select sname, sno, ssex from student where sname like '李%'
(6) 求没有选修数学课程的学生学号
select sno
from s
except
select sno
from sc
where cno=
(select cno
from c
where cname='数学')
(7) 查询选修了课程的学生的学号
select distinct sno from sc
select sno from sc
(8) 计算1号课程的学生的平均成绩, 最高分和最低分
select avg(grade) as 平均成绩,max(grade) as 最高分, min(grade) as 最低分
from sc where cno='1'
(9) 查询数学系和信息系的学生的信息;
select * from student where sdept=’MA’
union
select * from student where sdept='IS'
(10) 将年龄为19岁的学生的成绩置零
UPDATE sc
SET grade=0
WHERE 19=
(SELECT sage
FROM student
WHERE student.sno = s.sno)
UPDATE sc
SET grade=0
WHERE sno In
(SELECT sno
FROM student
WHERE sage=19)
(11) 查询所有选修了1号课程的学生姓名
select sname from student where exists
(select * from sc where sno=student.sno and cno='1')
(12) 对每一个性别,求学生的平均年龄,并把结果存入数据库
先创建表,再插入数据
(13) 查询每个学生已获得的学分
Select sno, sum(credit)
From sc,course
Where grade>=60 and o=o
Group by sno
(14) 将所有女生的记录定义为一个视图
create view F_student
as
select * from student where ssex='女'
(15) 查询没有选修了1号课程的学生姓名
select sname from student where not exists
(select * from sc where sno=student.sno and cno='1') (16) 将所有选修了数据库课程的学生的成绩加5分
update sc
Set grade=grade+5
Where cno=
(
Select con
From course
Where cname='数据库'
)
(17) 查询各系的男女生学生总数, 并按系别,升序排列, 女生排在前
select sdept,ssex,Count(*)
from student
group by sdept, ssex
order by sdept,ssex desc
(18) 查询’信息系’(IS)学生”数据结构”课程的平均成绩
select avg(grade)
from student, course, sc
where student.sno=sc.sno and o=o and sdept='IS' and cname='数据结构'
(19) 创建一个反映学生出生年份的视图
create view BT_S(sno, sname, 出生年份)
as
select sno, sname, year(date())- sage from student
(20) 查询与’王田’在同一个系学习的学生的信息
select * from student where sdept in
(select sdept from student where sname='王田')
比较: select * from student where sdept =
(select sdept from student where sname='王田')
比较: select * from student where sdept =
(select sdept from student where sname='王田') and sname<>'王田' 比较: select S1.* from student S1, student S2 where S1.sdept=S2.sdept and S2.sname='王田'
(21) 查询年龄在20岁以下的学生的姓名及其年龄
select sname, sage from student where sage<20
(22) 查询当前至少选修数据库和信息系统其中一门课的学生的学号
Select sno
From sc,course
Where cname=’数据库’ and o=o
Union
Select sno
From sc,course
Where cname=’信息系统’ and o=o
(23) 查询每个学生的学号, 姓名, 选修的课程名和成绩:
select S.sno, sname, cname, grade
from student S, course C, sc SC
where S.sno=SC.sno and o=o
(24) 查找名字中包括“俊”的学生的姓名, 学号,选课课程和成绩
select sname, sno, cno, grade
from student,sc
where sname like '%俊%' and student.sno=sc.sno
(25) 查询学分大于8的学生,输出学生的学号和学分
Select sno, sum(credit)
From sc,course
Where grade>=60 and o=o
Group by sno
Having sum(credit)>8
(26) 查询IS,CS,MA系的所有学生的姓名和性别
select sname, ssex from student
where sdept in ('IS', 'MA','CS')
(27) 查询至少选修了2门课程的学生的平均成绩
select sno, avg(grade)
from sc
group by sno
having count(*)>=2
(28) 查询每个学生所选课程的平均成绩, 最高分, 最低分,和选课门数
select sno, avg(grade) ,max(grade) , min(grade), count(*)
from sc
group by sno
(29) 删除年龄大于21岁所有学生的选课记录
DELETE
FROM sc
WHERE 21<
(SELETE sage
FROM student
WHERE student.sno=sc.sno)
DELETE
FROM sc
WHERE sno IN
(SELETE sno
FROM student
WHERE sage>21)
(30) 查询没有先行课的课程的课程号cno和课程名cname
select cno, cname
from course
where pcno is null。