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语句创建,后面数据用的图形化创建

MySQL练习题,学生成绩查询练习题,附带答案_第1张图片

课程表数据

MySQL练习题,学生成绩查询练习题,附带答案_第2张图片

成绩表数据

MySQL练习题,学生成绩查询练习题,附带答案_第3张图片

练习答案

-- (三)针对学生课程数据库查询

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

你可能感兴趣的:(mysql,数据库)