MySQL练习题,学生成绩查询练习题,附带答案
题目
(一) 新建以下几个表
student(学生表):
sno | sname | sex | dept | birth | age | Phone |
---|---|---|---|---|---|---|
其中约束如下:
(1) 学号不能存在相同的
sno int auto_increment primary key
(2) 名字为非空
sname varchar(20) not null
(3) 性别的值只能是*’男’**或’女’**
sex enum('男','女') fefault
(4) 系包括这几个:信息系,计算机科学系,数学系,管理系,中文系,外语系,法学系
dept ENUM('信息系','计算机科学系','数学系','管理系','中文系','外语系','法学系'),
(5) 出生日期为日期格式
birth DATE,
(6) 年龄为数值型,且在**0~100之间**
age INT(100),
(7) phone唯一
phone CHAR(11) UNIQUE
cs(成绩表):
sno | cno | cj |
---|---|---|
其中约束如下:
(**1)sno和cno分别参照student和course表中的sno,cno的字段**
sno int,
foreign key(sno)references student(sno),
cno int,
foreign key (cno) references course(cno),
(**2)cj(成绩)只能在0~100之间,可以不输入值**
cj int check(cj>=0 and cj<=100)
course(课程表)
cno | cname |
---|---|
其约束如下:
(**1)课程号(cno)不能有重复的**
cno INT AUTO_INCREMENT PRIMARY KEY,
(**2)课程名(cname)非空**
cname VARCHAR(50) NOT NULL
(三)针对学生课程数据库查询
(1) 查询全体学生的姓名、学号、所在系,并用别名显示出结果。
(2) 查全体学生的姓名及其出生年份。
(3) 查询选修了课程的学生学号。
(4) 查询年龄在**20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。**
(5) 查询信息系、数学系和计算机科学系生的姓名和性别。
(6) 查询姓**“欧阳”且全名为三个汉字的学生姓名**
(7) 查询缺少成绩的学生的学号和相应的课程号。
(8) 查所有有成绩的学生学号和课程号。
(9) 查询选修了**3号课程的学生的学号及其成绩,查询结果按分数降序排列。**
(10) 查询学生总人数。
(11) 查询选修了课程的学生人数。
(12) 求各个课程号及相应的选课人数。
(13) 查询选修了**3门以上课程的学生学号。**
(14) 查询有**3门以上课程是90分以上的学生的学号及(90分以上的)课程数。**
(15) 查询每个学生选修课程的总学分。
(16) 查询每个学生及其选修课程的情况。
(17) 查询选修**2号课程且成绩在90分以上的所有学生的学号、姓名**
(18) 查询每个学生的学号、姓名、选修的课程名及成绩。
(19) 查询与**“刘晨”在同一个系学习的学生(分别用嵌套查询和连接查询)**
(20) 查询选修了课程名为**“管理学”的学生学号和姓名**
(21) 查询其他系中比信息系任意一个**(其中某一个)学生年龄小的学生姓名和年龄**
(22) 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。**(可以用嵌套聚合函数或者用ALL谓词)**
(23) 查询所有选修了**1号课程的学生姓名。(分别用嵌套查询和连查询)**
(24) 查询没有选修**1号课程的学生姓名。**
(25) 查询选修了全部课程的学生姓名。
(26) 查询选修了课程**1或者选修了课程2的学生的信息。**
(27) 查询既选修了课程**1又选修了课程2的学生的信息。**
(28) 通过查询求学号为**2006001学生的总分和平均分。**
(29) 求出每个系的学生数量
(30) 查询平均成绩大于**85的学生学号及平均成绩。**
(31) 要求查寻学生的所有信息,并且查询的信息按照年龄由高到低排序,如果年龄相等,则按照学号从低到高排序
表的创建
CREATE TABLE student(
sno INT AUTO_INCREMENT PRIMARY KEY,
sname VARCHAR(20) NOT NULL,
sex ENUM('男','女') DEFAULT '男',
dept ENUM('信息系','计算机科学系','数学系','管理系','中文系','外语系','法学系'),
birth DATE,
age INT(100),
phone CHAR(11) UNIQUE
)
CREATE TABLE cs(
id INT PRIMARY KEY,
sno INT ,
FOREIGN KEY(sno) REFERENCES student(sno),
cno INT,
FOREIGN KEY(cno) REFERENCES course(cno),
cj INT CHECK(cj>=0 AND cj<=100)
)
DROP TABLE course
CREATE TABLE course(
cno INT AUTO_INCREMENT PRIMARY KEY,
cname VARCHAR(50) NOT NULL
)
学生表数据
INSERT INTO student VALUES ( '7','甜甜','女','计算机科学系','2000-01-10','18','12345678911');
这是sql语句创建,后面数据用的图形化创建
课程表数据
成绩表数据
练习答案
-- (三)针对学生课程数据库查询
-- (1) 查询全体学生的姓名、学号、所在系,并用别名显示出结果。
SELECT * FROM student
-- (2) **查全体学生的姓名及其出生年份。
SELECT sname,birth FROM student
-- 查询选修了课程的学生学号。**
SELECT sno FROM student WHERE dept IS NOT NULL
-- **查询年龄在 20~23岁(包括18岁和23岁)之间的学生的姓名、系别和年龄。*
SELECT sname,dept,age FROM student WHERE age>=18 AND age<=23
-- (5) **查询信息系、数学系和计算机科学系生的姓名和性别。**
SELECT sname,sex FROM student WHERE dept IN('信息系','数学系','计算机科学系');
-- (6) 查询姓“鬼火”且全名为四个汉字的学生姓名
SELECT sname FROM student WHERE sname LIKE '鬼火__'
-- (7) 查询缺少成绩的学生的学号和相应的课程号。
SELECT student.sno,course.cno FROM student JOIN course
JOIN cs ON cs.sno=student.sno AND cs.cj IS NULL AND course.cno=cs.cno
-- (8) **查所有有成绩的学生学号和课程号。
SELECT student.sno,course.cno FROM student JOIN course
JOIN cs ON cs.sno=student.sno AND cs.cj IS NOT NULL AND course.cno=cs.cno
-- (9)查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT student.sno,cs.cj FROM student JOIN course ON course.cno = 3
JOIN cs ON course.cno = cs.cno AND student.sno = cs.sno AND cj IS NOT NULL ORDER BY cj DESC
-- (10)查询学生总人数。**
SELECT COUNT(1) FROM student
-- (11) 查询选修了课程的学生人数
SELECT COUNT(DISTINCT student.sno)AS '选课的人数' FROM student JOIN cs ON student.sno=cs.sno
-- (12)求各个课程号及相应的选课人数。**
SELECT cs.cno AS '课程号',COUNT(1)AS '选课人数' FROM student JOIN course
JOIN cs ON cs.cno=course.cno AND student.sno=cs.sno GROUP BY cs.cno
-- (13) 查询选修了2 门以上课程的学生学号。
SELECT cs.sno AS '学号',COUNT(1)AS '选课数量' FROM student JOIN cs ON student.sno=cs.sno
JOIN COURSE ON COURse.cno=cs.cno GROUP BY cs.sno HAVING COUNT(1)>2
-- (14) 查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数。
SELECT *,COUNT(1)AS'所有同学90以上课程数'FROM ( SELECT cs.sno AS '学号',sname FROM student JOIN cs ON student.sno=cs.sno
JOIN COURSE ON COURse.cno=cs.cno AND cj>=90) AS cjj
-- 这题应该是输出3门都是九十以上的学生,而不是输出三门九十学生后在输出所有考了九十分的人数
SELECT * ,COUNT(1)AS'选课数' FROM (SELECT student.sname,student.sno FROM student JOIN cs ON student.sno=cs.sno
JOIN course ON course.cno=cs.cno AND cj>=90)AS cjj GROUP BY sno HAVING COUNT(1) >2
-- (15) 查询每个学生选修课程的总学分。
SELECT sname AS '名字',sno AS '学号',SUM(cj)AS'总分' FROM(SELECT sname,cj,cs.sno FROM student JOIN cs ON student.sno=cs.sno)AS fen GROUP BY sno
-- (16) 查询每个学生及其选修课程的情况。
SELECT cs.sno,sname,cname FROM student JOIN cs ON student.sno=cs.sno
JOIN course ON cs.cno = course.cno ORDER BY sno
-- (17) 查询选修2号课程且成绩在90分以上的所有学生的学号、姓名
SELECT cs.sno,sname,cs.cno,cj FROM student JOIN cs ON student.sno=cs.sno
JOIN course ON cs.cno = course.cno AND cs.cno =2 AND cj>=90
-- (18) 查询每个学生的学号、姓名、选修的课程名及成绩。
SELECT cs.sno,sname,cname,cj FROM student JOIN cs ON student.sno=cs.sno
JOIN course ON cs.cno = course.cno
-- (19) 查询与“张三”在同一个系学习的学生(分别用嵌套查询和连接查询)
-- 嵌套查询
SELECT * FROM(SELECT * FROM student WHERE dept = '计算机科学系')AS ta
WHERE sname != '张三'
-- 链接查询
SELECT * FROM student JOIN cs ON student.sno=cs.sno AND sname != '张三'AND dept = '计算机科学系'
-- (20) 查询选修了课程名为“基础课”的学生学号和姓名
SELECT cs.sno,sname,cname FROM student JOIN cs ON student.sno=cs.sno
JOIN course ON cs.cno = course.cno AND cname = '基础课'
-- (21) 查询其他系中比法学系任意一个(其中某一个)学生年龄小的学生姓名和年龄
SELECT sname,student.age,dept FROM student JOIN
(SELECT age FROM student WHERE dept='法学系')AS ww WHERE student.age < ww.age AND dept != '法学系'
-- (22) **查询其他系中比法学系所有学生年龄都小的学生姓名及年龄。****(可以用嵌套****聚合函数****或者****用****ALL谓词****)**
SELECT sname,student.age,dept FROM student WHERE student.age <
(SELECT MIN(age)AS age FROM student WHERE dept='法学系') AND dept != '法学系'
-- (23) 查询所有选修了1号课程的学生姓名。(分别用嵌套查询和连查询)
-- 嵌套
SELECT sname FROM student,
(SELECT sno FROM cs WHERE cno =(SELECT cno FROM course WHERE cno=1)) AS ww
WHERE ww.sno=student.sno
-- 链接
SELECT sname FROM student JOIN cs ON student.sno=cs.sno
JOIN course ON cs.cno = course.cno AND cs.cno=1
-- (24) 查询没有选修2号课程的学生姓名。
SELECT *
FROM student
WHERE sno
IN(SELECT sno FROM cs WHERE cno!=2)
-- student.sno,sname
SELECT * ,COUNT(1)
FROM student JOIN cs
ON student.sno=cs.sno
GROUP BY(student.sno) HAVING COUNT(1)<3 AND cno!=2
-- (25) 查询选修了全部课程的学生姓名。
SELECT COUNT(1), student.sno,sname
FROM student JOIN cs
ON student.sno=cs.sno GROUP BY(student.sno) HAVING COUNT(1)>2
-- (26) 查询选修了课程1或者选修了课程2的学生的信息。
SELECT DISTINCT *
FROM student JOIN cs
ON student.sno=cs.sno AND
(cs.cno=1 OR cs.cno=2)
-- (27) 查询既选修了课程1又选修了课程2的学生的信息。
SELECT COUNT(1), student.sno,sname
FROM student JOIN cs
ON student.sno=cs.sno AND
(cs.cno=1 OR cs.cno=2) GROUP BY(student.sno) HAVING COUNT(1)>1
-- (28) 通过查询求学号为1学生的总分和平均分
SELECT cs.sno ,AVG(cj),SUM(cj) FROM student JOIN cs ON cs.sno = student.sno AND cs.sno=1
-- (29) 求出每个系的学生数量
SELECT dept,COUNT(1)AS '学生数量' FROM student GROUP BY dept
-- (30) 查询平均成绩大于85的学生学号及平均成绩。
SELECT sno,a FROM(SELECT id,cs.sno,AVG(cj) AS a FROM student JOIN cs GROUP BY cs.sno)
AS aa WHERE a>85
-- (31) 要求查寻学生的所有信息,并且查询的信息按照年龄由高到低排序,如果年龄相等,则按照学号从低到高排序
SELECT * FROM student ORDER BY age DESC