13.有3个表S(学生表),C(课程表),SC(学生选课表)
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1、找出没选过“黎明”老师的所有学生姓名。
2、列出2门以上(含2门)不及格学生姓名及平均成绩。
3、即学过1号课程又学过2号课所有学生的姓名。 create table s(
sno int(4) primary key auto_increment,
sname varchar(32)
); insert into s(sname) values('zhangsan');
insert into s(sname) values('lisi');
insert into s(sname) values('wangwu');
insert into s(sname) values('zhaoliu'); create table c(
cno int(4) primary key auto_increment,
cname varchar(32),
cteacher varchar(32)
);
insert into c(cname,cteacher) values('Java','吴老师');
insert into c(cname,cteacher) values('C++','王老师');
insert into c(cname,cteacher) values('C##','张老师');
insert into c(cname,cteacher) values('MySQL','郭老师');
insert into c(cname,cteacher) values('Oracle','黎明'); create table sc(
sno int(4),
cno int(4),
scgrade double(3,1),
constraint sc_sno_cno_pk primary key(sno,cno),
constraint sc_sno_fk foreign key(sno) references s(sno),
constraint sc_cno_fk foreign key(cno) references c(cno)
); insert into sc(sno,cno,scgrade) values(1,1,30);
insert into sc(sno,cno,scgrade) values(1,2,50);
insert into sc(sno,cno,scgrade) values(1,3,80);
insert into sc(sno,cno,scgrade) values(1,4,90);
insert into sc(sno,cno,scgrade) values(1,5,70);
insert into sc(sno,cno,scgrade) values(2,2,80);
insert into sc(sno,cno,scgrade) values(2,3,50);
insert into sc(sno,cno,scgrade) values(2,4,70);
insert into sc(sno,cno,scgrade) values(2,5,80);
insert into sc(sno,cno,scgrade) values(3,1,60);
insert into sc(sno,cno,scgrade) values(3,2,70);
insert into sc(sno,cno,scgrade) values(3,3,80);
insert into sc(sno,cno,scgrade) values(4,3,50);
insert into sc(sno,cno,scgrade) values(4,4,80);

首先分析下上面表的设计

一个学生可以选修多门课程

同一门课程可以被多个学生选择

学生和课程之间是多对多的关系

所以就要引入第三张中间表来解决学生和课程之间的关系

create table sc(
sno int(4),
cno int(4),
scgrade double(3,1),
constraint sc_sno_cno_pk primary key(sno,cno),
constraint sc_sno_fk foreign key(sno) references s(sno),
constraint sc_cno_fk foreign key(cno) references c(cno)
);

第三张表的sno的值必须来自学生表,使用外键约束

cno必须来自课程表,使用外键约束

然后建立一个sno 和cno的一个复合主键

接下来我们就可以做题了

/*
1、找出没选过“黎明”老师的所有学生姓名。
2、列出2门以上(含2门)不及格学生姓名及平均成绩。
3、即学过1号课程又学过2号课所有学生的姓名。
*/

第一题的第一种做法:

--先找出选过黎明老师的学生编号 -> 黎明老师的授课的编号
select cno from c where cteacher = '黎明'; select sno from sc where cno = (select cno from c where cteacher = '黎明'); select * from s where sno not in(select sno from sc where cno = (select cno from c where cteacher = '黎明'));

第一题的第二种做法:

第一步:找到黎明老师所上课对应的课程对应的课程编号
select cno from c where cteacher = '黎明'; 第二步:求出那些学生选修了黎明老师的课程
select
sno
from
sc
join
(
select cno from c where cteacher = '黎明' ) t
on
sc.cno = t.cno; 第三步:求出那些学生没有选择黎明老师的课
select
sno,sname
from
s
where
sno not in
( select
sno
from
sc
join
(
select cno from c where cteacher = '黎明' ) t
on
sc.cno = t.cno );
+-----+---------+
| sno | sname |
+-----+---------+
| 3 | wangwu |
| 4 | zhaoliu |
+-----+---------+

第二题:

2、列出2门以上(含2门)不及格学生姓名及平均成绩。

思路一 :在sc表中首先按照学生编号进行分组,得到哪些学生的有两门以上的成绩低于60分

select
sc.sno ,count(*) as studentNum
from
sc
where
scgrade < 60
group by
sc.sno
having
studentNum >= 2; 第二步:查询出该学生对应的编号 select
a.sno , a.sname
from
s as a
join
(
select
sc.sno ,count(*) as studentNum
from
sc
where
scgrade < 60
group by
sc.sno
having
studentNum >= 2 ) as b
on
a.sno = b.sno;
+-----+----------+
| sno | sname |
+-----+----------+
| 1 | zhangsan |
+-----+----------+
1 row in set

接下来需要获得该学生的平均成绩,我们得到该学生的sno的值是1,我们需要在sc表中求出该学生的平均成绩,首先需要将上面的表和sc表关联起来形成一个临时表,然后对这个临时表按照sno进行group by

我们来看下下面的代码

select
sc.sno ,count(*) as studentNum
from
sc
where
scgrade < 60
group by
sc.sno
having
studentNum >= 2; 第二步:查询出该学生对应的编号 select
a.sno , a.sname
from
s as a
join
(
select
sc.sno ,count(*) as studentNum
from
sc
where
scgrade < 60
group by
sc.sno
having
studentNum >= 2 ) as b
on
a.sno = b.sno; 第三步得到该学生的平均成绩,把上面的表当成临时表m select
m.sno,m.sname,avg(d.scgrade)
from
sc as d
join
(
select
a.sno , a.sname
from
s as a
join
(
select
sc.sno ,count(*) as studentNum
from
sc
where
scgrade < 60
group by
sc.sno
having
studentNum >= 2 ) as b
on
a.sno = b.sno ) as m
on
m.sno = d.sno
group by
d.sno ;
+-----+----------+----------------+
| sno | sname | avg(d.scgrade) |
+-----+----------+----------------+
| 1 | zhangsan | 64.00000 |
+-----+----------+----------------+
1 row in set

第三题:

select
s.sname
from
sc
join
s
on
sc.sno = s.sno
where
cno = 1 and sc.sno in(select sno from sc where cno = 2);

+----------+
| sname |
+----------+
| zhangsan |
| wangwu |
+----------+

不能写成下面的形式会存在错误

动力节点 mysql 郭鑫 34道经典的面试题二的更多相关文章

  1. 动力节点 mysql 郭鑫 34道经典的面试题三

    1.第十五题 15.列出受雇日期早于其直接上级的所有员工编号.姓名.部门名称 思路一:第一步将emp a看成员工表,将emp b 看成领导表,员工表的mgr字段应该等于领导表的主键字段 mysql&g ...

  2. 动力节点 mysql 郭鑫 34道经典的面试题

    DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` int(2) NOT NULL COMMENT '部门编号', `DNAME` ...

  3. 【转】 71道经典Android面试题和答案,重要知识点都包含了

    ,,面试题1.        下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存  B.内存回收程序负责释放无用内存   C.内存回收程序允许程序员直接释放内存 ...

  4. 71道经典Android面试题和答案

    ,,面试题1.        下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存  B.内存回收程序负责释放无用内存   C.内存回收程序允许程序员直接释放内存 ...

  5. 这十道经典Python笔试题,全做对算我输

    经常有小伙伴学了Python不知道是否能去找工作,可以来看下这十道题检验你的成果: 1.常用的字符串格式化方法有哪些?并说明他们的区别 a. 使用%,语法糖 print("我叫%s,今年%d ...

  6. 75道经典AI面试题,我就想把你们安排的明明白白的!(含答案)

    基础知识(开胃菜) Python 1.类继承 有如下的一段代码: class A(object): def show(self): print 'base show' class B(A): def ...

  7. 二十道经典C#面试题

    1.在下面的代码中,如何引用命名空间fabulous中的great? namespace fabulous{// code in fabulous namespace}namespace super{ ...

  8. 100多道经典的JAVA面试题及答案解析

    面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...

  9. 50道经典的JAVA编程题(31-35)

    50道经典的JAVA编程题(31-35),今天考完了java,在前篇博客里面贴出了题了,见:<今天考试的JAVA编程题>.考完了也轻松了,下个星期一还考微机原理呢,啥都不会,估计今天就做到 ...

随机推荐

  1. MySQL 可重复读,差点就我背上了一个 P0 事故!

    小黑黑的碎碎念 哎,最近有点忙,备考复习不利,明天还要搬家,好难啊!! 本想着这周鸽了,但是想想还是不行,爬起来,更新一下,周更可不能断.偷懒一下,修改一下之前的一篇历史文章,重新发布一下. P0 事 ...

  2. Rocket - debug - Example: Quick Access

    https://mp.weixin.qq.com/s/SxmX-CY2tqvEqZuAg-EXiQ 介绍riscv-debug的使用实例:配置Quick Access功能. 1. Quick Acce ...

  3. Ftrace的部分使用方法

    ftrace主要是用于调试linux kernel调度相关的一个工具,也可用于分析部分kernel性能问题. 相关ftrace的介绍可以参考:kernel/msm-4.9/Documentation/ ...

  4. Java实现 蓝桥杯 基础练习 查找整数

    基础练习 查找整数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n ...

  5. Java实现固定长度得01子串

    固定位数得01子串 Description 对于长度为n的一个01串,每一位都可能是0或1,一共有2 ^n 种可能.请按从小到大的顺序输出这2^n种01串. Input 包含多组数据,每组数据占一行, ...

  6. Java实现 蓝桥杯VIP 算法提高 前10名

    算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名数据. 输入格式 ...

  7. java实现 蓝桥杯 算法训练 操作格子

    问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求 ...

  8. CDN百科 | 假如没有CDN,网络世界会变成什么样?

    很多人都知道CDN是内容分发加速,所谓内容分发,就是将本来位于源站的内容分发到全国各地的节点,方便用户去就近访问所需的内容.随着移动互联网.云计算等一代代技术变革,CDN已经成为了缓解互联网网络拥塞. ...

  9. 深入理解JVM(③)判断对象是否还健在?

    前言 因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些 ...

  10. linux下gdb调试方法与技巧整理

    参考博客:  https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...