MySQL练习题,学生成绩查询练习题,附带答案

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        表的创建

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        学生表数据

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        课程表数据

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        成绩表数据

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        练习答案

题目

(一) 新建以下几个表

student(学生表):

snosnamesexdeptbirthagePhone

其中约束如下:

(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(成绩表):

snocnocj

其中约束如下:

(**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(课程表)

cnocname

其约束如下:

(**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

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些MySQL二级考试的练习题答案,供参考: 1. 创建一个名为“student”的数据库,并在其中创建一个名为“score”的表,包含学生的学号(sid)、姓名(name)、课程名称(course)和成绩(score)四个字段。其中,学号和姓名为字符串类型,长度为10个字符;课程名称为字符串类型,长度为20个字符;成绩为整数类型。 ``` CREATE DATABASE student; USE student; CREATE TABLE score ( sid VARCHAR(10), name VARCHAR(10), course VARCHAR(20), score INT ); ``` 2. 向“score”表中插入以下数据: ``` INSERT INTO score (sid, name, course, score) VALUES ('20180001', '张三', '语文', 80), ('20180001', '张三', '数学', 90), ('20180001', '张三', '英语', 85), ('20180002', '李四', '语文', 75), ('20180002', '李四', '数学', 88), ('20180002', '李四', '英语', 92), ('20180003', '王五', '语文', 85), ('20180003', '王五', '数学', 90), ('20180003', '王五', '英语', 95); ``` 3. 查询“score”表中每个学生的总成绩和平均成绩,并按总成绩从高到低排序。 ``` SELECT sid, name, SUM(score) AS total_score, AVG(score) AS avg_score FROM score GROUP BY sid, name ORDER BY total_score DESC; ``` 4. 查询“score”表中英语成绩最高的学生姓名和成绩。 ``` SELECT name, score FROM score WHERE course = '英语' ORDER BY score DESC LIMIT 1; ``` 5. 将“score”表中所有学生的成绩加10分。 ``` UPDATE score SET score = score + 10; ``` 以上是一些基础的MySQL二级考试练习题答案,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值