当前位置: 首页 > 编程日记 > 正文

mysql的小练习

建立如下表:

建表语句:

class表创建语句
create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句
create table student(-> sid int not null auto_increment primary key,-> name varchar(32) not null,-> gender varchar(8) not null,-> class_id int not null)engine=innodb default charset=utf8;teacher表创建语句
create table teacher(-> tid int not null auto_increment primary key,-> tname varchar(32) not null)engine=innodb default charset=utf8;course表创建语句
create table course(-> cid int not null auto_increment primary key,-> cname varchar(16) not null,-> teacher_id int not null)engine=innodb default charset=utf8;score表创建语句
create table score(-> sid int not null auto_increment primary key,-> student_id int not null,-> corse_id int not null,-> number int not null)engine=innodb default charset=utf8;

练习题目:

1、查询所有的课程的名称以及对应的任课老师姓名2、查询学生表中男女生各有多少人3、查询物理成绩等于100的学生的姓名4、查询平均成绩大于八十分的同学的姓名和平均成绩5、查询所有学生的学号,姓名,选课数,总成绩6、 查询姓李老师的个数7、 查询没有报李平老师课的学生姓名8、 查询物理课程比生物课程高的学生的学号9、 查询没有同时选修物理课程和体育课程的学生姓名10、查询挂科超过两门(包括两门)的学生姓名和班级
、查询选修了所有课程的学生姓名12、查询李平老师教的课程的所有成绩记录13、查询全部学生都选修了的课程号和课程名14、查询每门课程被选修的次数15、查询之选修了一门课程的学生姓名和学号16、查询所有学生考出的成绩并按从高到低排序(成绩去重)17、查询平均成绩大于85的学生姓名和平均成绩18、查询生物成绩不及格的学生姓名和对应生物分数19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名20、查询每门课程成绩最好的前两名学生姓名21、查询不同课程但成绩相同的学号,课程号,成绩22、查询没学过“叶平”老师课程的学生姓名以及选修的课程名称;23、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;24、任课最多的老师中学生单科成绩最高的学生姓名

答案:

#1、查询所有的课程的名称以及对应的任课老师姓名
SELECTcourse.cname,teacher.tname
FROMcourse
INNER JOIN teacher ON course.teacher_id = teacher.tid;#2、查询学生表中男女生各有多少人
SELECTgender 性别,count(1) 人数
FROMstudent
GROUP BYgender;#3、查询物理成绩等于100的学生的姓名
SELECTstudent.sname
FROMstudent
WHEREsid IN (SELECTstudent_idFROMscoreINNER JOIN course ON score.course_id = course.cidWHEREcourse.cname = '物理'AND score.num = 100);#4、查询平均成绩大于八十分的同学的姓名和平均成绩
SELECTstudent.sname,t1.avg_num
FROMstudent
INNER JOIN (SELECTstudent_id,avg(num) AS avg_numFROMscoreGROUP BYstudent_idHAVINGavg(num) > 80
) AS t1 ON student.sid = t1.student_id;#5、查询所有学生的学号,姓名,选课数,总成绩(注意:对于那些没有选修任何课程的学生也算在内)
SELECTstudent.sid,student.sname,t1.course_num,t1.total_num
FROMstudent
LEFT JOIN (SELECTstudent_id,COUNT(course_id) course_num,sum(num) total_numFROMscoreGROUP BYstudent_id
) AS t1 ON student.sid = t1.student_id;#6、 查询姓李老师的个数
SELECTcount(tid)
FROMteacher
WHEREtname LIKE '李%';#7、 查询没有报李平老师课的学生姓名(找出报名李平老师课程的学生,然后取反就可以)
SELECTstudent.sname
FROMstudent
WHEREsid NOT IN (SELECT DISTINCTstudent_idFROMscoreWHEREcourse_id IN (SELECTcourse.cidFROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tidWHEREteacher.tname = '李平老师'));#8、 查询物理课程比生物课程高的学生的学号(分别得到物理成绩表与生物成绩表,然后连表即可)
SELECTt1.student_id
FROM(SELECTstudent_id,numFROMscoreWHEREcourse_id = (SELECTcidFROMcourseWHEREcname = '物理')) AS t1
INNER JOIN (SELECTstudent_id,numFROMscoreWHEREcourse_id = (SELECTcidFROMcourseWHEREcname = '生物')
) AS t2 ON t1.student_id = t2.student_id
WHEREt1.num > t2.num;#9、 查询没有同时选修物理课程和体育课程的学生姓名(没有同时选修指的是选修了一门的,思路是得到物理+体育课程的学生信息表,然后基于学生分组,统计count(课程)=1)
SELECTstudent.sname
FROMstudent
WHEREsid IN (SELECTstudent_idFROMscoreWHEREcourse_id IN (SELECTcidFROMcourseWHEREcname = '物理'OR cname = '体育')GROUP BYstudent_idHAVINGCOUNT(course_id) = 1);#10、查询挂科超过两门(包括两门)的学生姓名和班级(求出<60的表,然后对学生进行分组,统计课程数目>=2)
SELECTstudent.sname,class.caption
FROMstudent
INNER JOIN (SELECTstudent_idFROMscoreWHEREnum < 60GROUP BYstudent_idHAVINGcount(course_id) >= 2
) AS t1
INNER JOIN class ON student.sid = t1.student_id
AND student.class_id = class.cid;#11、查询选修了所有课程的学生姓名(先从course表统计课程的总数,然后基于score表按照student_id分组,统计课程数据等于课程总数即可)
SELECTstudent.sname
FROMstudent
WHEREsid IN (SELECTstudent_idFROMscoreGROUP BYstudent_idHAVINGCOUNT(course_id) = (SELECT count(cid) FROM course));#12、查询李平老师教的课程的所有成绩记录
SELECT*
FROMscore
WHEREcourse_id IN (SELECTcidFROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tidWHEREteacher.tname = '李平老师');#13、查询全部学生都选修了的课程号和课程名(取所有学生数,然后基于score表的课程分组,找出count(student_id)等于学生数即可)
SELECTcid,cname
FROMcourse
WHEREcid IN (SELECTcourse_idFROMscoreGROUP BYcourse_idHAVINGCOUNT(student_id) = (SELECTCOUNT(sid)FROMstudent));#14、查询每门课程被选修的次数
SELECTcourse_id,COUNT(student_id)
FROMscore
GROUP BYcourse_id;#15、查询之选修了一门课程的学生姓名和学号
SELECTsid,sname
FROMstudent
WHEREsid IN (SELECTstudent_idFROMscoreGROUP BYstudent_idHAVINGCOUNT(course_id) = 1);#16、查询所有学生考出的成绩并按从高到低排序(成绩去重)
SELECT DISTINCTnum
FROMscore
ORDER BYnum DESC;#17、查询平均成绩大于85的学生姓名和平均成绩
SELECTsname,t1.avg_num
FROMstudent
INNER JOIN (SELECTstudent_id,avg(num) avg_numFROMscoreGROUP BYstudent_idHAVINGAVG(num) > 85
) t1 ON student.sid = t1.student_id;#18、查询生物成绩不及格的学生姓名和对应生物分数
SELECTsname 姓名,num 生物成绩
FROMscore
LEFT JOIN course ON score.course_id = course.cid
LEFT JOIN student ON score.student_id = student.sid
WHEREcourse.cname = '生物'
AND score.num < 60;#19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名
SELECTsname
FROMstudent
WHEREsid = (SELECTstudent_idFROMscoreWHEREcourse_id IN (SELECTcourse.cidFROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tidWHEREteacher.tname = '李平老师')GROUP BYstudent_idORDER BYAVG(num) DESCLIMIT 1);#20、查询每门课程成绩最好的前两名学生姓名
#查看每门课程按照分数排序的信息,为下列查找正确与否提供依据
SELECT*
FROMscore
ORDER BYcourse_id,num DESC;#表1:求出每门课程的课程course_id,与最高分数first_num
SELECTcourse_id,max(num) first_num
FROMscore
GROUP BYcourse_id;#表2:去掉最高分,再按照课程分组,取得的最高分,就是第二高的分数second_num
SELECTscore.course_id,max(num) second_num
FROMscore
INNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id
) AS t ON score.course_id = t.course_id
WHEREscore.num < t.first_num
GROUP BYcourse_id;#将表1和表2联合到一起,得到一张表t3,包含课程course_id与该们课程的first_num与second_num
SELECTt1.course_id,t1.first_num,t2.second_num
FROM(SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t1
INNER JOIN (SELECTscore.course_id,max(num) second_numFROMscoreINNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t ON score.course_id = t.course_idWHEREscore.num < t.first_numGROUP BYcourse_id
) AS t2 ON t1.course_id = t2.course_id;#查询前两名的学生(有可能出现并列第一或者并列第二的情况)
SELECTscore.student_id,t3.course_id,t3.first_num,t3.second_num
FROMscore
INNER JOIN (SELECTt1.course_id,t1.first_num,t2.second_numFROM(SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t1INNER JOIN (SELECTscore.course_id,max(num) second_numFROMscoreINNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t ON score.course_id = t.course_idWHEREscore.num < t.first_numGROUP BYcourse_id) AS t2 ON t1.course_id = t2.course_id
) AS t3 ON score.course_id = t3.course_id
WHEREscore.num >= t3.second_num
AND score.num <= t3.first_num;#排序后可以看的明显点
SELECTscore.student_id,t3.course_id,t3.first_num,t3.second_num
FROMscore
INNER JOIN (SELECTt1.course_id,t1.first_num,t2.second_numFROM(SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t1INNER JOIN (SELECTscore.course_id,max(num) second_numFROMscoreINNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t ON score.course_id = t.course_idWHEREscore.num < t.first_numGROUP BYcourse_id) AS t2 ON t1.course_id = t2.course_id
) AS t3 ON score.course_id = t3.course_id
WHEREscore.num >= t3.second_num
AND score.num <= t3.first_num
ORDER BYcourse_id;#可以用以下命令验证上述查询的正确性
SELECT*
FROMscore
ORDER BYcourse_id,num DESC;-- 21、查询不同课程但成绩相同的学号,课程号,成绩
-- 22、查询没学过“叶平”老师课程的学生姓名以及选修的课程名称;
-- 23、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;
-- 24、任课最多的老师中学生单科成绩最高的学生姓名
View Code

小知识:外键约束条件

  外键约束有三种约束模式(都是针对父表的约束):模式一: district 严格约束(默认的 ),父表不能删除或者更新已经被子表数据引用的记录模式二:cascade 级联模式:父表的操作,对应的子表关联的数据也跟着操作 。模式三:set null:置空模式,父表操作之后,子表对应的数据(外键字段)也跟着被置空。通常的一个合理的约束模式是:删除的时候子表置空;更新的时候子表级联。指定模式的语法:foreign key(外键字段)references 父表(主键字段)on delete 模式 on update 模式;注意:删除置空的前提条件是 外键字段允许为空,不然外键会创建失败。外键虽然很强大,能够进行各种约束,但是外键的约束降低了数据的可控性和可拓展性。通常在实际开发时,很少使用外键来约束。

转载于:https://www.cnblogs.com/one-tom/p/11177105.html

相关文章:

针对 Windows Phone 7 上的独立存储的 Sterling

http://msdn.microsoft.com/zh-cn/magazine/hh205658.aspx转载于:https://www.cnblogs.com/thankchunzi/archive/2011/11/18/2254416.html

【Linux】Linux简单操作之文件管理

1、mkdir : 创建文件夹 2、rm &#xff1a; 删除文件或目录 注&#xff1a; 凡是涉及到路径&#xff0c;绝对路径相对路径都可以 &#xff08;1&#xff09;直接使用 rm 文件名可以删除文件&#xff0c;但删除不了文件夹 &#xff08;2&#xff09;删除时会有一行提示 如果…

phpmyadmin另类拿shell

发现了个PHPMYADMIN 结果弱口令登陆进去 爆出绝对路径 然后执行SQL语句发现导出SHELL的时候却发现缺少了import.php这个文件 结果没办法执行MYSQL语句&#xff01; 然后本地测试了下 发现另外的方法phpMyAdmin/sql.php?dbtest&tablea&printview1&sql_queryselect%…

第二章、IP协议详解

一、IP服务的的特点 IP协议是TCP/IP协议族的动力&#xff0c;他为上层协议提供的无状态无连接&#xff0c;不可靠的服务。 无状态是指IP通信双方不同步传输数据的状态信息&#xff0c;因此所有的ip数据报的发送&#xff0c;传出和接受都是相互独立的&#xff0c;没有上下文的联…

为绑定的NSArrayController设置默认的排序

当NSArrayController与一个class或者entity进行绑定&#xff08;Binding&#xff09;之后&#xff0c;可以为这个NSArrayController设置默认的排序。通过在Bindings Insepector中选择Controller Content Parameters -> Sort Descriptor进行默认排序的设定。 1、在.h文件中创…

快速求斯特林数总结(洛谷模板题解)

题目链接 第一类斯特林数行第一类斯特林数列第二类斯特林数行第二类斯特林数列 求一行第一类斯特林数 由第一类斯特林数的推论&#xff0c;\(x^{\overline{n}}\sum_i\begin{bmatrix}n\\i\end{bmatrix}x^i\)&#xff0c;分治FFT计算上升幂即可 \(O(nlog^2n)\)。 求一列第一类斯特…

【Linux】Linux简单操作之系统管理

1、date &#xff1a; 显示系统时间 注 &#xff1a;系统操作与所在的文件夹无关&#xff0c;在哪都能操作。 2、su &#xff1a; 切换账号 注&#xff1a; &#xff08;1&#xff09;如果高级用户切换低级用户可以直接切换&#xff0c;不用密码 &#xff08;2&#xff09;…

嵌入式开发博客收藏

http://hbhuanggang.cublog.cn 嵌入式linux之我行 http://blog.csdn.net/fudan_abc fudan_abc的Linux内核专栏 http://blog.chinaunix.net/space.php?uid20543672

【Python3.6+Django2.0+Xadmin2.0系列教程之一(入门篇-上)】环境搭建及项目创建

由于工作需要&#xff0c;接触了大半年时间的Djangoxadmin框架&#xff0c;一直没空对这块对进行相关的梳理。最近在同事的怂恿下&#xff0c;就在这分享下笔者的学习及工作经验吧。 好了&#xff0c;话不多说&#xff0c;下面开始进入正题&#xff1a; 转载请注明出处&#xf…

JavaScript深拷贝Json

今天因为项目需要写了个Json格式的深拷贝&#xff08;深度复制&#xff09;。很简单&#xff0c;没有做其他的判断&#xff0c;代码如下&#xff1a; function deepCopy(json){if(typeof json number || typeof json string || typeof json boolean){return json;}else if(t…

【Linux】Linux简单操作之压缩解压

一、tar &#xff1a; 归档 格式&#xff1a;tar 参数&#xff08;必须有&#xff09; 要被压缩的文件或目录 1、创建归档文件 格式&#xff1a; tar -zvcf 归档文件名 要归档文件列表 注意&#xff1a; &#xff08;1&#xff09;z是压缩 v是显示详细信息 c是创建压缩文件…

Firefox 的User Agent 将移除 CPU 架构信息

Mozilla 计划从 Firefox 的 User Agent&#xff08;用户代理&#xff09;和几个支持的 API 中移除 CPU 架构信息&#xff0c;以减少 Firefox 用户的“数字指纹”。Web 浏览器会自动向用户在应用程序中打开的网站显示信息&#xff0c;而用户代理会显示有关浏览器和浏览器版本、操…

工程师必读 微软如何部署Exchange2010

一年一度的IT技术盛典——微软TechEd2010大会将于2010年12月1日正式开幕。为了更好地为网友和读者报道今年的大会&#xff0c;我们IT168前方的记者在TechEd会场&#xff0c;为读者带来第一时间的报道。 在今天的大会现场&#xff0c;来自微软的高级顾问陈刘项为我们全面介绍了关…

线程范围内的数据共享

1、如果每个线程执行的代码相同&#xff0c;可以使用同一个Runnable对象&#xff0c;这个Runnable对象中有那个共享数据&#xff0c;例如&#xff0c;买票系统就可以这么做。 2、如果每个线程执行的代码不同&#xff0c;这时候需要用不同的Runnable对象&#xff0c;有如下两种方…

Setting the Reply-To Header in an Email using CDONTS.NewMail Object and CDO Message

代码 1 <%2 OptionExplicit3 4 DimobjMail5 DimstrSubject6 DimstrBody7 8 strSubject "This is a test email"9 strBody "This test email is using testdevasp.com "&_10 "as the sender email address but we are "&_11 "…

Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)

做这样的比赛既考快速编码的能力&#xff0c;还有快速思维的能力。本人很弱&#xff0c;跌了rating。。加油&#xff01;&#xff01;&#xff01;。。 第一题上来就把题意理解错了。。粗心啊。。直接模拟着做就行:1&#xff1a;如果字符串全是大写字母就进行大小写转换:2&…

【Linux】 Linux简单操作之网络通信和网络访问

一、网络通信 1、ifconfig &#xff1a; 查看ip信息 2、ping &#xff1a; 测试网络连通 格式 &#xff1a; ping ip或域名 注&#xff1a; 通过该测试你能知道你的计算机是不是能联网的。 二、网络访问 1、curl &#xff1a; 测试网络访问和模拟用户访问 2、wget &#x…

将类别加入到别人的名称空间内

怎样把自己的类别加入到别人的名称空间内&#xff0c;在引用时&#xff0c;能在别人的名称空间下使用到自己写的类别。 这是一位台湾朋友问及此问题&#xff0c;因此录制一个视频做演示&#xff1a; 视频文件格式&#xff1a;.wmv&#xff1b;大小&#xff1a;9,706KB&#xff…

Linux内核初期内存管理---memblock(转)

http://www.maxwellxxx.com/linuxmemblock转载于:https://www.cnblogs.com/erhu-67786482/p/8873112.html

看懂SqlServer查询计划(转)

转自&#xff1a;http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 对于SqlServer的优化来说&#xff0c;可能优化查询是很常见的事情。关于数据库的优化&#xff0c;本身也是一个涉及面比较的广的话题&#xff0c;本文只谈优化查询时如何看懂SqlServer查询计划…

openoj的一个小比赛(F题解题报告)poj3978(dp+素数筛选)

http://openoj.awaysoft.com:8080/judge/contest/view.action?cid47#problem/F 一个素数帅选法的题目&#xff0c;才开始直接就套模板结构tle应为被题目中的As many as 1000 lines, 给坑了总的时间消耗是1000*10^5.。这样暴力枚举的话肯定会超时&#xff0c;当时就急了&#x…

【Linux】Linux简单操作之管道与重定向

一、重定向 1、重定向 使用符号 > 例如&#xff1a; echo "hello world" > a.txt注&#xff1a;如果文件不存在则会自动创建文件 2、重定向覆盖&#xff1a; 代码实现&#xff1a; echo "hello world" > a.txt3、重定向追加&#xff1a; 使…

linux tc打造ip流量限制

tc是个配置Linux内核流量控制的工具 名字 tc - 显示&#xff0f;维护流量控制配置 摘要 tc qdisc dev DEV qdisc tc class dev DEV parent qdisc-id qdisc tc filter dev DEV protocol protocol prio priority filtertype flowid flow-id tc qdisc show tc class show dev DEV …

vue Element-ui 表格自带筛选框自定义高度

el-table中可以在一行的某列进行筛选&#xff0c;代码如下&#xff1a; <el-table-column prop"classOfTest" class"test" label"测试类名" :filters"classList" filter-placement"bottom-start" width"300" c…

【Linux】Linux简单操作之vi与vim编辑器

一、vi与vim的区别 vi类似于普通的记事本&#xff0c;没有字体颜色的变化&#xff0c;vim对一些关键字会进行变色处理 二、vi 1、启动vi编辑器 格式&#xff1a; vi 文件名 注&#xff1a; &#xff08;1&#xff09;如果文件存在&#xff0c;则打开该文件 &#xff08;2…

vectorbool不是容器

vector<bool>不是容器&#xff0c;为了节省空间&#xff0c;其内部是用一个bit来表示一个bool值的&#xff0c;operator[]不会返回一个指向bool值的引用&#xff0c;而是返回一个代理&#xff08;proxy&#xff09; 试图以数组的形式来使用vector<bool>会引发错误。…

.Net MVC3中取得当前区域的名字(Area name)

在代码中&#xff1a; ControllerContext.RouteData.DataTokens["area"] 在View中&#xff1a; ViewContext.RouteData.DataTokens["area"] 转载于:https://www.cnblogs.com/idlewater/archive/2011/11/29/2267892.html

草根创业都选择的是什么人?

前言&#xff1a;选合伙人和投资就像在选女朋友一样&#xff0c;要谨慎&#xff0c;甚至有时候宁缺毋滥。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />曾经以为有了钱&#xff0c;就会找到需要的人&#xff0c;后来发现不是这…

MSF渗透测试-CVE-2017-11882(MSOffice漏洞)

1.测试环境 2.测试前准备 3.测试过程 —3.1虚拟机环境测试 —3.2局域网靶机测试 4.测试感想 1.测试环境 攻击机&#xff1a; OS&#xff1a;kail IP&#xff1a;192.168.15.132/192.168.137.231 靶机&#xff1a; OS&#xff1a;Windows7 Office版本&#xff1a;Office2013_CN …

002本周总结报告

在这次的一周中&#xff0c;我从网站上观看了有关Java基础的教学视频&#xff0c;学习了一些Java语言的历史及发展&#xff0c;更重要的是学习了Java的部分基本语法&#xff1a;如编写Java程序的的外部框架&#xff0c;输入输出函数的格式等。平均每天花在学习上一小时&#xf…