mysql篇---mysql习题

2.查询’生物‘课程比’物理‘课程成绩高的所有学生的学号
	思路:
		获取所有有生物课程的人(学号,成绩)-临时表
		获取所有有物理课程的人(学号,成绩)-临时表
		根据【学号】连接两个临时表:
			学号 物理成绩 生物成绩

		生物---》	SELECT score.sid,score.student_id,course.cname,score.num FROM score
		LEFT JOIN course ON score.course_id=course.cid WHERE course.cname=‘生物‘;

	select A.student_id from
			(select score.sid,score.student_id,course.cname,score.num from score
				LEFT JOIN course on score.course_id=course.cid where course.cname="生物") as A

	INNER JOIN

				(select score.sid,score.student_id,course.cname,score.num from score
					LEFT JOIN course on score.course_id=course.cid where course.cname="物理") as B
	on A.student_id = B.student_id
	where A.num > B.num

3.查询平均成绩大于60分的同学的学号和平均成绩;
	 思路:
        根据学生分组,使用avg获取平均值,通过having对avg进行筛选

        select student_id,avg(num) from score group by student_id having avg(num) > 60

	进行连表操作:
	SELECT B.student_id,student.sname,B.mean FROM
		(SELECT student_id,avg(num) as mean FROM score GROUP BY student_id HAVING avg(num) > 60) as B
	LEFT JOIN student
	ON  B.student_id=student.sid 

4.查询所有同学的学号,姓名,选课数,总成绩;
	SELECT score.student_id,student.sname,count(student_id),sum(num) FROM score
	LEFT JOIN student on score.student_id=student.sid
	GROUP BY score.student_id

5.查询姓’李‘的老师的个数
	SELECT count(1) FROM teacher WHERE tname like ‘李%‘;

6.查询没学过’李平老师‘课的同学的学号,姓名;
	思路:
		先查到’李平老师‘老师教的所有课的 ID
		获取选过课的所有学生ID
		学生表中筛选

		SELECT student.sid,student.sname FROM student
		WHERE sid NOT in
			(SELECT student_id FROM score WHERE course_id in
				(SELECT course.cid FROM course LEFT JOIN teacher
					ON course.teacher_id=teacher.tid
					WHERE teacher.tname = ‘李平老师‘)
		GROUP BY student_id
			)

7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
		思路:
			先查到既选择001又选择002课程的所用同学
			根据学生进行分组,如果学生数量等于2 表示 两门均已选择

	SELECT student_id,sname FROM
	(SELECT student_id,course_id FROM score WHERE course_id=1 OR course_id=2 ) as B
	LEFT JOIN student on B.student_id = student.sid GROUP BY student_id
	HAVING count(student_id) > 1

8.查询学过’李平‘老师课的同学的学号,姓名;
	同上,只不过001和002 变成 in
	SELECT student.sid,student.sname FROM student
WHERE sid in
	(SELECT student_id FROM score WHERE course_id in (SELECT course.cid FROM course
		LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname = ‘李平老师‘)
GROUP BY student_id
)

10.查询有课程成绩小于60分的同学的学号,姓名;
	SELECT sid,sname FROM student WHERE sid in (
		SELECT DISTINCT student_id FROM score WHERE num < 60)

11.查询没有学全所有课的同学的学号,姓名;
	思路:
		在分数表中根据学生进行分组,获取每一个学生选课数量
		如果 数量== 总课程数量,表示已经选择了所有课程

	SELECT student_id,sname FROM score
	LEFT JOIN student on score.student_id=student.sid
	GROUP BY student_id
	HAVING count(course_id) = (SELECT count(1) FROM course)

12.查询至少一门课程与学号为’001‘的同学所学相同的同学的学号和姓名;
	思路:
		获取 001 同学 选择的所有课程
		获取课程在其中的所有人以及所有课程
		根据学生筛选,获取所有学生信息
		再与学生表 连接,获取姓名

	SELECT student_id,sname,count(course_id)
	FROM score LEFT JOIN student on score.student_id=student.sid
	WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id=1)
	GROUP BY student_id

13.查询至少学过学号为 ’001‘同学所有课的其他同学学号和姓名;
	先找到和001的学过所有人
	然后个数 = 001所有学科  ==》 其他人可能选择的更多

	SELECT student_id,sname,count(course_id) FROM score
	LEFT JOIN student on score.student_id=student.sid
	WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id = 1)
	GROUP BY student_id
	HAVING count(course_id) = (SELECT count(course_id) FROM score WHERE student_id=1) 

14.查询和’002‘号的同学学习的课程完全相同的其他同学学号和姓名;(!!!)
	个数相同
	002学过的也学过

		select student_id from score where  student_id in (
		select student_id from score where student_id !=1
			GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1)
		 ) and course_id in (select course_id from score where student_id = 1)
			GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1)

15.删除

16.向sc表中插入一些记录,这些记录要求符合以下条件:
		1.没有上过编号’002‘课程的同学学号
		2.插入’002‘号课程的平均成绩
	思路;
		由于insert支持
				insert into tb1(xx,xx) select x1,x2 from tb2;
		所有,获取所有没上过002课 的所有人,获取002的平均成绩

17.

18.查询各科成绩最高和最低分:如下形式显示:课程ID,最高分,最低分;

	SELECT course_id,max(num) AS max_num,min(num) AS min_num FROM score GROUP BY course_id;

19.按各科平均成绩从低到高和及格率的百分数从高到低顺序;
	方法一:
	SELECT course_id,avg(num),sum(CASE WHEN num<60 THEN 0 ELSE 1 END),
	sum(1),sum(CASE WHEN num<60 THEN 0 ELSE 1 END)/sum(1) *100
	AS percent FROM score
	GROUP BY course_id
	ORDER BY avg(num) ASC,percent desc;

	方法二:
	select course_id, avg(num) as avgnum,
	sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent
	from score
	group by course_id
	order by avgnum asc,percent desc;

20.课程平均分从高到低显示(任课老师)
	SELECT avg(if(isnull(score.num),0,score.num)),teacher.tname FROM course
	LEFT JOIN score ON course.cid=score.course_id
	LEFT JOIN teacher ON course.teacher_id=teacher.tid
	GROUP BY score.course_id

21.查询各科成绩前三名的记录:(不考虑成绩并列情况)
		SELECT score.sid,score.course_id,score.num,T.first_num,T.second_num FROM score
	LEFT JOIN (SELECT sid,
							(SELECT num FROM score AS s2 WHERE s2.course_id=s1.course_id
								ORDER BY num DESC LIMIT 0,1) AS first_num,

							(SELECT num FROM score AS s2 WHERE s2.course_id=s1.course_id
								ORDER BY num DESC LIMIT 3,1) AS second_num
						FROM score as s1
						) AS T
	ON score.sid = T.sid
	WHERE score.num <= T.first_num AND score.num >= T.second_num

22.查询每门课程被选修的学生数;
	SELECT course_id,count(1) FROM score GROUP BY course_id

23查询出只选修了一门课程的全部学生的学号和姓名;(!!!)
	SELECT student.sid,student.sname,count(1) FROM score
	LEFT JOIN student ON score.student_id=student.sid
	GROUP BY course_id HAVING count(1) = 1

24.查询男生,女生的人数
	SELECT * FROM
		(SELECT count(1) AS man FROM student WHERE gender=‘男‘) AS A,
		(SELECT count(1) AS woman FROM student WHERE gender=‘女‘) AS B;

25.查询姓’张‘的学生名单
		SELECT sname FROM student WHERE sname LIKE ‘张%‘

26.查询同名同姓学生名单,并统计同名人数

	SELECT sname,count(1) AS count FROM student GROUP BY sname

27.查询每门课的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程降序排列
	SELECT course_id,avg(if(isnull(num),0,num)) AS avg FROM score
	GROUP BY course_id ORDER BY avg
	ASC,course_id desc

28.查询平均成绩大于85的所有学生的学号,姓名和平均成绩(!!!!未取出 >85)

	SELECT student_id,sname,avg(if(isnull(num),0,num)) FROM score
	LEFT JOIN student on score.student_id=student.sid
	GROUP BY student_id 

29.查询课程名称为’生物‘,且分数低于60的学生姓名和分数
	SELECT student.sname,score.num FROM score
	LEFT JOIN course ON score.course_id=course.cid
	LEFT JOIN student ON score.student_id=student.sid
WHERE score.num < 60 AND course.cname=‘生物‘

30.查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
	SELECT * FROM score WHERE score.student_id = 3 and score.num > 80

31.求选了课程的学生人数
	select count(c) from (
			select count(student_id) as c from score group by student_id) as A;

32.查询选修’张磊‘老师所授课程的学生中,成绩最高的学生姓名及其成绩
	SELECT sname,num FROM score
	LEFT JOIN student ON score.student_id=student.sid
	WHERE score.course_id in (SELECT course.cid FROM course LEFT JOIN teacher ON
													course.teacher_id=teacher.tid WHERE tname=‘张磊老师‘) ORDER BY num DESC LIMIT 1

33.查询各个课程及相应的选修人数;
    select course.cname,count(1) from score
    left join course on score.course_id = course.cid
    group by course_id;

34.查询不同课程但成绩相同的学生的学号,课程号,学生成绩(!!!)
SELECT DISTINCT s1.course_id,s2.course_id,s1.num,s2.num
FROM score AS s1,score AS s2
WHERE s1.num=s2.num AND s1.course_id != s2.course_id

36.检索至少选修两门课程的学生学号
SELECT student_id FROM score
GROUP BY student_id
HAVING count(student_id) > 1;

37.查询全部学生都选修的课程号和课程名(!!!)
SELECT course_id,count(1) FROM  score
GROUP BY course_id HAVING count(1) = (SELECT count(1) FROM student);

38.查询没学过‘李平‘老师讲授的任意一门课程的学生姓名
SELECT student_id,student.sname FROM score
LEFT JOIN student on score.student_id=student.sid
WHERE score.course_id NOT in (
SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid
WHERE tname=‘李平老师‘
)
GROUP BY student_id

加 课程名
SELECT student_id,student.sname,course.cname FROM score
LEFT JOIN student on score.student_id=student.sid
LEFT JOIN course on course_id=course.cid
WHERE score.course_id NOT in (
SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid
WHERE tname=‘李平老师‘
)
GROUP BY student_id

39.查询两门以上不及格课程的同学的学号及其平均成绩(!!!)
SELECT student_id,count(1) FROM score
WHERE num < 60
GROUP BY student_id HAVING count(1) > 2 

40.检索’004‘课程分数小于60,按分数 降序 排列的同学学号
SELECT student_id FROM score
WHERE num<60 and course_id=4
ORDER BY num DESC;
时间: 2024-10-15 05:45:22

mysql篇---mysql习题的相关文章

mysql篇---mysql(三)

一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户只需使用[名称]即可获取结果集,并可以将其代表来使用. SELECT * FROM ( SELECT nid,NAME FROM tb1 WHERE nid > 2) AS A WHERE A. NAME > 'alex'; 1.创建视图 --格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS SELET nid, name FROM A WHERE

mysql篇---mysql(一)

一.软件的安装 可执行文件 压缩包 Windows: 可执行文件 点点点 压缩包 放置任意目录 初始化 服务端:E:\wupeiqi\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --initialize-insecure # 用户名 root 密码:空 启动服务端: E:\wupeiqi\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld\mysqld 客户端连接: E:\wupeiqi\

《Mycat学习笔记》 第二篇. MySql 读写分离与日志分析——主从多结点

1    环境说明 接上篇环境   <Mycat学习笔记> 第一篇. MySql 读写分离与日志分析——主从单结点 http://www.cnblogs.com/kaye0110/p/5134588.html 增加一套 mysql 实例,端口为3308 ,通过Binlog方式同步主机情况 localhost : 3306 主机,    在mycat 中配置为 writehost 1 localhost : 3307 从机 a ,在mycat 中配置为 readhost localhost :

【Python之路】第十八篇--MySQL(一)

[Python之路]第十八篇--MySQL(一) 一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一个软件,都有两个主要的功能: a. 将数据保存到文件或内存 b. 接收特定的命令,然后对文件进行相应的操作 PS:如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数

《Mycat学习笔记》 第三篇. MySql 主从同步异常后,主从切换

1)系统环境说明 MySql 5.5 主从节点 127.0.0.1:3306   主结点,为验证主从切换效果,手动停止服务 127.0.0.1: 3307    从结点 1 127.0.0.1:338     从结点 2 ,为验证主从切换效果,在主结点停止后,新增两个记录. MyCat 1.5 schema.xml 配置 具体配置说明,参考上篇: <Mycat学习笔记> 第二篇. MySql 读写分离与日志分析——主从多结点 <dataHost name="localhost1

sql注入知识库-mysql篇(2)

上接mysql篇(1) 测试数据库版本 1.使用自带函数 version() @@version @@global.version examples select version(); SELECT * FROM Users WHERE id = '1' AND MID(VERSION(),1,1) = '5'; mid() 用于截取字符串,用法  mid(字符串,起始位置,截取几个字符) 备注: 如果数据库运行在windows的机器上的话输出会带上-nt-log 2.使用特殊代码 1 /*!5

LNMP环境搭建——MySQL篇

The world's most popular open source database 1.Install MySQL root@kallen:~# apt-get install mysql-server-5.5 mysql-client-5.5 2.Add Users (1) 选择数据表 语句例如以下:use mysql; (2) 在mysql的user表中添加连接用户帐号: 这里不要直接使用INSERT语句加入user记录,使用INSERT可能出现错误: ERROR 1364 (HY0

sql注入知识库-mysql篇(3)

上接sql注入知识库-mysql篇(2) 表和字段 一.检测字段数量 order by/group  by group by / order by +1 ; 备注: order by 和 group by 都是用来根据字段排序用的 保持数字持续增加,直到得到一个错误响应 尽管group by 和 order by 在sql中是不同的功能,他们都可以用完全相同的方式确认查询的列数 examples: Given the query SELECT username, password, permis

Linux 各种软件的安装-mysql篇

作为一个长期混迹在windows圈的小白,当拿到一个新的linux服务器时,有点手足无措的赶脚.但是万事开头难嘛,Just Do It! 下面记录一下自己安装各种软件时遇到的坑.这一篇先讲mysql 安装环境:系统是 centos7.3 64位 1:mysql 通常软件都安装在 /usr/local下面 #下载 wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz 否