rianley 博客              盗版必究!
基于上一个sql练习的答案;该答案是我所写!如果有错误或者用法不当之处;请下方评论指出;感激不尽!谢谢各位码友! <!--1、查询所有的课程的名称以及对应的任课老师姓名 -->
SELECT
course.cname,
teacher.tname
FROM
course
INNER JOIN teacher ON course.teacher_id = teacher.tid;

  


<!--2、查询学生表中男女生各有多少人-->
SELECT
gender
count(1)
FROM
student
GROUP BY
gender;

  


<!--3、查询物理成绩等于100的学生的姓名-->
SELECT
student.sname
FROM
student
WHERE
sid IN (
SELECT
student_id
FROM
score
INNER JOIN course ON score.course_id = course.cid
WHERE
course.cname = '物理'
AND score.num = 100
);

  

<!--4、查询平均成绩大于八十分的同学的姓名和平均成绩-->
SELECT
student.sname,
t1.avg_num
FROM
student
INNER JOIN (
SELECT
student_id,
avg(num) AS avg_num
FROM
score
GROUP BY
student_id
HAVING
avg(num) > 80
) AS t1 ON student.sid = t1.student_id;

  

<!--5、查询所有学生的学号,姓名,选课数,总成绩 -->
SELECT
student.sid,
student.sname,
t1.course_num,
t1.total_num
FROM
student
LEFT JOIN (
SELECT
student_id,
COUNT(course_id) course_num,
sum(num) total_num
FROM
score
GROUP BY
student_id
) AS t1 ON student.sid = t1.student_id;

  

<!--6、 查询姓李老师的个数-->
SELECT
count(tid)
FROM
teacher
WHERE
tname LIKE '李%';

  


<!--7、 查询没有报李平老师课的学生姓名 -->
SELECT
student.sname
FROM
student
WHERE
sid NOT IN (
SELECT DISTINCT
student_id
FROM
score
WHERE
course_id IN (
SELECT
course.cid
FROM
course
INNER JOIN teacher ON course.teacher_id = teacher.tid
WHERE
teacher.tname = '李平老师'
)
);

  


<!--8、 查询物理课程比生物课程高的学生的学号 -->
SELECT
t1.student_id
FROM
(
SELECT
student_id,
num
FROM
score
WHERE
course_id = (
SELECT
cid
FROM
course
WHERE
cname = '物理'
)
) AS t1
INNER JOIN (
SELECT
student_id,
num
FROM
score
WHERE
course_id = (
SELECT
cid
FROM
course
WHERE
cname = '生物'
)
) AS t2 ON t1.student_id = t2.student_id
WHERE
t1.num > t2.num;

  


<!--方法二-->
SELECT x.sname from
(SELECT c.sid,c.sname,b.num from course as a INNER JOIN score as b on a.cid=b.course_id
and a.cname ='物理'
LEFT JOIN student as c on b.student_id=c.sid)
as x INNER JOIN
(SELECT c.sid,c.sname,b.num from course as a INNER JOIN score as b on a.cid=b.course_id
and a.cname ='生物'
LEFT JOIN student as c on b.student_id=c.sid)
as y on x.sid=y.sid WHERE x.num>y.num

  


<!--9、 查询没有同时选修物理课程和体育课程的学生姓名 -->
SELECT
student.sname
FROM
student
WHERE
sid IN (
SELECT
student_id
FROM
score
WHERE
course_id IN (
SELECT
cid
FROM
course
WHERE
cname = '物理'
OR cname = '体育'
)
GROUP BY
student_id
HAVING
COUNT(course_id) = 1
);

  


<!--10、查询挂科超过两门(包括两门)的学生姓名和班级 -->
SELECT
student.sname,
class.caption
FROM
student
INNER JOIN (
SELECT
student_id
FROM
score
WHERE
num < 60
GROUP BY
student_id
HAVING
count(course_id) >= 2
) AS t1
INNER JOIN class ON student.sid = t1.student_id
AND student.class_id = class.cid;

  


<!--11、查询选修了所有课程的学生姓名 -->
SELECT
student.sname
FROM
student
WHERE
sid IN (
SELECT
student_id
FROM
score
GROUP BY
student_id
HAVING
COUNT(course_id) = (SELECT count(cid) FROM course)
);

  


<!--12、查询李平老师教的课程的所有成绩记录-->
<!-- 方法一 -->
select
score.num
from
score
join
(select cid from course inner join teacher on course.teacher_id = teacher.tid where tid =2) as t1
on
score.course_id=t1.cid;

  

    <!-- 方法二 -->
 select
score.num
from
score
where
course_id
in (select cid from course inner join teacher on course.teacher_id = teacher.tid where tid =2)

  


<!--13、查询全部学生都选修了的课程号和课程名-->

<!-- 方式一 -->
 SELECT
cid,
cname
FROM
course
WHERE
cid IN ( select course_id from score group by course_id having COUNT(student_id) = (select count(sid) from student) ) <!-- 注解:--先将所有的课程分组 然后 过滤学生没有全选择的课程,在通过cid 找出 对应的课程号与课程名-->
);

  

<!--方式二-->
 SELECT course.cname,count(course.cid) as count_id from course INNER JOIN score  on course.cid=score.course_id
group by course.cid HAVING count_id=(SELECT count(sid) from student);

  

<!--方式三-->
  SELECT a.cid,a.cname from course as a INNER JOIN score as b on a.cid=b.course_id
GROUP BY a.cid HAVING count(a.cid)=(SELECT count(sid) from student);

  


<!--14、查询每门课程被选修的次数-->
select course_id,count(student_id) from score group by student_id;

  


<!--15、查询之选修了一门课程的学生姓名和学号-->
SELECT
sid,
sname
FROM
student
WHERE
sid IN (
SELECT
student_id
FROM
score
GROUP BY
student_id
HAVING
COUNT(course_id) = 1
);

  

<!--16、查询所有学生考出的成绩并按从高到低排序(成绩去重)-->
SELECT DISTINCT sum(if(b.num is null,0,b.num)) as all_num from
student as a LEFT JOIN score as b on a.sid=b.student_id
GROUP BY a.sid ORDER BY all_num DESC

  

<!--17、查询平均成绩大于85的学生姓名和平均成绩-->
SELECT
sname,
t1.avg_num
FROM
student
INNER JOIN (
SELECT
student_id,
avg(num) avg_num
FROM
score
GROUP BY
student_id
HAVING
AVG(num) > 85
) t1 ON student.sid = t1.student_id;

  


<!--18、查询生物成绩不及格的学生姓名和对应生物分数-->
SELECT
sname 姓名,
num 生物成绩
FROM
score
LEFT JOIN course ON score.course_id = course.cid
LEFT JOIN student ON score.student_id = student.sid
WHERE
course.cname = '生物'
AND score.num < 60;

  


<!--19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名-->
SELECT
sname
FROM
student
WHERE
sid = (
SELECT
student_id
FROM
score
WHERE
course_id IN (
SELECT
course.cid
FROM
course
INNER JOIN teacher ON course.teacher_id = teacher.tid
WHERE
teacher.tname = '李平老师'
)
GROUP BY
student_id
ORDER BY
AVG(num) DESC
LIMIT 1
);

  

<!--20、查询每门课程成绩最好的前两名学生姓名-->
SELECT c.course_id,c.student_id,c.num
from
score as c LEFT JOIN
(SELECT b.course_id,max(num) as second_num from (SELECT course_id,max(num) first_num from score GROUP BY course_id) as a LEFT JOIN score as b
on a.course_id=b.course_id WHERE a.first_num>b.num GROUP BY b.course_id) as b on c.course_id=b.course_id and b.second_num=c.num LEFT JOIN
(SELECT b.course_id,b.student_id,a.first_num from (SELECT course_id,max(num) first_num from score GROUP BY course_id) as a LEFT JOIN score as b on a.course_id=b.course_id and a.first_num=b.num) as a
on c.course_id=a.course_id and a.first_num=c.num WHERE a.first_num is NOT NULL or b.second_num is NOT NULL
GROUP BY c.student_id,c.num
ORDER BY c.course_id,c.num desc

  


<!--21、查询不同课程但成绩相同的学号,课程号,成绩-->
SELECT a.student_id,a.course_id,a.num from (SELECT num,course_id,student_id FROM score
GROUP BY course_id,num) as a
GROUP BY a.num
HAVING count(a.num)>1

  


<!--22、查询没学过“叶平”老师课程的学生姓名以及选修的课程名称;-->
SELECT DISTINCT d.sname,b.cname from teacher as a INNER JOIN course as b
on a.tid=b.teacher_id and a.tname!='叶平老师'
LEFT JOIN score as c on c.course_id=b.cid
LEFT JOIN student as d on d.sid=c.student_id

  

<!--23、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;-->
SELECT DISTINCT b.sid,b.sname FROM score as a  LEFT JOIN student as b
on a.student_id=b.sid
WHERE a.course_id in (SELECT course_id FROM score WHERE student_id=1)

  

<!--24、任课最多的老师中学生单科成绩最高的学生姓名-->
SELECT b.cname,b.num,c.sname from    <!-- 注:这里没有考虑2个老师任课数目一样,考虑了单科成绩可能会一样-->
(SELECT a.cname,max(a.num) as max_num from (
SELECT a.cname,b.num,b.student_id from course as a LEFT JOIN score as b on a.cid=b.course_id
WHERE a.teacher_id =(SELECT COUNT(teacher_id) as teacher_idx FROM course GROUP BY teacher_id
ORDER BY teacher_idx desc LIMIT 1)
) as a
GROUP BY a.cname) as a LEFT JOIN (
SELECT a.cname,b.num,b.student_id from course as a LEFT JOIN score as b on a.cid=b.course_id
WHERE a.teacher_id =(SELECT COUNT(teacher_id) as teacher_idx FROM course GROUP BY teacher_id
ORDER BY teacher_idx desc LIMIT 1)
) as b on a.cname=b.cname and a.max_num=b.num
LEFT JOIN student as c on c.sid=b.student_id

  


<!------------------------------------------------------------->
<!--扩展题-->
<!-- 问题来了,有个上班打卡表,记录公司多个user的打开记录(每天至少打卡2次),表里字段:id,user_id,sign_time,要求统计出2018-6月份user迟到情况,9点以后算迟到 -->
CREATE TABLE  sign_in(id INT NOT NULL  PRIMARY KEY AUTO_INCREMENT,
`user_id` int not null ,
sign_time datetime not null )ENGINE=INNODB CHARSET=UTF8

  

<!--迟到情况 大于9点算是迟到--用substr 获取>
select a.sign_time,a.user_id from sign_in as a inner join (select id,sign_time from sign_in  where   sign_time >='2018-6-1 00:00:00' and  sign_time < '2018-7-1 00:00:00'
GROUP BY user_id,DATE(sign_time) having substr(sign_time,12,2) > '09') as t1
on a.id= t1.id

  


<!--迟到情况 大于9点算是迟到-- 用 time 获取>
SELECT user_id, MIN(sign_time) as min_sign_time from sign_in WHERE sign_time like '2018-06%' GROUP BY user_id,DATE(sign_time)  HAVING TIME(min_sign_time)>'09:00:00'

  


<!--统计出上个月上班不足8小时的user的情况-->
SELECT user_id, MIN(sign_time) as min_sign_time,MAX(sign_time) as max_sign_time  from sign_in WHERE sign_time like '2018-06%' GROUP BY user_id,DATE(sign_time)
HAVING UNIX_TIMESTAMP(max_sign_time)-UNIX_TIMESTAMP(min_sign_time)<8*3600

  

作者邮箱:rianleycheng@gmail.com

作者QQ:2855132411

mysql题目练习的答案的更多相关文章

  1. 【转】asp.net c# 网上搜集面试题目大全(附答案)

    asp.net c# 网上搜集面试题目大全(附答案) http://www.cnblogs.com/hndy/articles/2234188.html

  2. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  3. 互联网公司面试必问的mysql题目(下)

    这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...

  4. Python+MySQL随机试卷及答案生成程序

    一.背景 本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样. 二.准备工作 1.安装Python3 下载地址:https://www.python.org/ ...

  5. 互联网公司面试必问的mysql题目(上)

    又到了招聘的旺季,被要求准备些社招.校招的题库.(如果你是应届生,尤其是东北的某大学,绝对福利哦) 介绍:MySQL是一个关系型数据库管理系统,目前属于 Oracle 旗下产品.虽然单机性能比不上or ...

  6. 阿里巴巴MySQL DBA面试题答案[转]

    无意中看到阿里巴巴的面试题,,借此回首DBMS时刻趁热打铁巩固一下基础 拿到题目大概浏览了一遍难度大概在中上游水平,自己跪了接近35%的题目 自己答题如下,欢迎大家讨论分析题 1 2 3 4 5 6 ...

  7. MySQL面试题和答案

    Mysql 的存储引擎,myisam和innodb的区别. 答: 1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用.表锁,不会出现死锁,适合小数据,小并发. 2.innodb是支持事务的存 ...

  8. SQL学习笔记四(补充-2-1)之MySQL SQL查询作业答案

    阅读目录 一 题目 二 答案 一 题目 1.查询所有的课程的名称以及对应的任课老师姓名 2.查询学生表中男女生各有多少人 3.查询物理成绩等于100的学生的姓名 4.查询平均成绩大于八十分的同学的姓名 ...

  9. 数据库入门级面试题(带答案) 数据库简单面试题(带答案) MySQL面试题带答案

    数据库入门[mysql]   1.假设要按照分页(每页显示10条)的形式获取test表中的数据,在MySql数据库中,以下哪条语句是取第2页中的数据?(单选)   (难度A) A.select * f ...

随机推荐

  1. 关于token,session,cookie的概念和区别

    记录几篇讲的比较好的文章 https://www.cnblogs.com/moyand/p/9047978.html https://blog.csdn.net/wabiaozia/article/d ...

  2. slf4j-log4j12-1.5.8.jar有什么用

    slf4j是hibernate的日志接口,通常我们用log4j.jar来实现hibernate的记录日志功能,slf4j-log4j.jar可以看成是用来把slf4j的接口转换成适合log4j的接口的 ...

  3. iOS图像处理之Core Graphics和OpenGL ES初见

    http://www.jianshu.com/p/f66a7ca326dd iOS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES.OpenGL ES是跨平台 ...

  4. UVa 10791 - Minimum Sum LCM(唯一分解定理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. Spring MVC 使用tomcat中配置的数据源

    Spring MVC 使用tomcat中配置的数据源 配置tomcat数据源 打开tomcat目录下的conf目录,编辑sever.xml目录.在<GlobalNamingResources&g ...

  6. HUD 1288 Hat's Tea(反向的贪心,非常好的一道题)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1288 Hat's Tea Time Limit: 2000/1000 MS (Java/Others)  ...

  7. Mysql不同表的同名字段索引名可以相同

    mysql中不同表的相同字段索引是可以重名的,因为索引文件一表一个: 命名规则: 普通索引:idx_字段名 唯一索引:ux_字段名

  8. 【oracle使用笔记1】SQL报的常见错误

    项目中使用最多的就是oracle数据库了,在实际的开发中书写SQL时遇到过许多错误,趁着现在不太忙,把之前遇到的总结一下,以后遇到的会持续更新总结. 1. ORA-00001:违反唯一约束条件 [原因 ...

  9. 为什么我们需要DTO?

    最近在写代码时突然产生了这个疑惑,我们为什么需要DTO进行数据传输呢? 要了解DTO首先我们要知道什么是DAO,DAO就是数据库的一个数据模型,是一个类文件里面存储着数据库的字段及其getter&am ...

  10. df du sync

    df命令用来检查linux系统的磁盘空间占用情况 df [选项] -h:以容易理解的格式输出文件系统分区占用情况,如32KB,120MB,60GB -k:以KB大小单位输出文件系统分区占用情况 -m: ...