MYSQL语句强化练习
之前发现自己写sql不怎么得心应手,总是百度零零散散的学习一下,所以在空闲的时候自己就专门找一下mysql的强化题敲一下练习一下,简要记录一下,sql写着写着就会越来越熟练,总之要自己加油!
表结构
学生表:Student(SNO,Sname,Sage,Sex)
课程表:Course(CNO,Cname,TNO)
成绩表:SC(SNO,CNO,score)
教师表:Teacher(TNO,Tname)
建表语句
create table student(
id int primary key auto_increment comment '主键id',
sno int not null comment '学号',
sname varchar(100) comment '姓名',
age int comment '年龄',
sex int not null comment '性别0男1女'
)comment= '学生表' create table course(
id int primary key auto_increment comment '课程表主键id',
cno int not null comment '课程号',
cname varchar(100) comment '课程名',
tno int not null comment '教师编号'
)comment = '课程表' create table sc(
id int primary key auto_increment comment '成绩表主键id',
sno int not null comment '学号',
cno int not null comment '课程号',
score int not null comment '分数'
)comment = '成绩表' create table teacher(
id int primary key auto_increment comment '教师表主键id',
tno int not null comment '教师编号',
tname varchar(100) comment '教师姓名'
)comment = '教师表'
#1.查询“3001”课程比“3002”课程成绩高的所有学生的学号
select a.sno from
(select sno,score from sc where cno=3001)a,
(select sno,score from sc where cno=3002)b
where a.score>b.score and a.sno=b.sno #2.查询平均成绩大于60分的同学的学号和平均成绩
select
sno,
AVG(score) avg_score
from sc
group by sno
having avg_score>60 #3.查询所有同学的学号、姓名、选课数、总成绩
select
student.sno,
student.sname,
count(sc.cno),
sum(sc.score)
from student
left join sc on student.sno = sc.sno
group by student.sno #4.查询姓“李”的教师数
select count(distinct(teacher.tname)) num
from teacher where teacher.tname like '李%' #5.查询没有学过“李老师”课程的同学的学号、姓名
select
student.sno,
student.sname
from student
where student.sno not in
(
select sc.sno from sc
inner join course on sc.cno = course.cno
inner join teacher on teacher.tno = course.tno
where teacher.tname = '李老师'
) #6.查询学过“王老师”所有课程的学生的学号、姓名
select student.sno,student.sname
from student where student.sno in
(
select sc.sno
from sc
inner join course on sc.cno = course.cno
inner join teacher on course.tno = teacher.tno
where teacher.tname = '王老师'
group by sc.sno
having count(sc.sno)=(
select COUNT(course.cno) from teacher
inner join course on teacher.tno = course.tno
where teacher.tname = '王老师'
)
) #7.查询学过“3001”也学过“3004”课程的学生的学号、姓名
select student.sno,student.sname
from student
inner join sc on student.sno = sc.sno
where cno = 3001
and student.sno in (
select sc.sno from sc where sc.cno=3004
) select student.sno,student.sname
from student
inner join sc a on student.sno = a.sno
where cno = 3001
and EXISTS
(
select b.sno from sc b where a.sno = b.sno and b.cno=3004
) #8.查询所有课程成绩小于60的同学的学号、姓名
select stu.sno,stu.sname
from student stu
where stu.sno not in(
select sc.sno from sc where sc.score >= 60 group by sc.sno
) #9.查询没有学全所有课的同学的学号、姓名
select student.sno,student.sname
from student
inner join sc on student.sno = sc.sno
group by sc.sno having count(*)<
(
select count(cno) from course
) #10.查询至少有一门课与学号为“1001”同学所学相同的学生的学号和姓名
select student.sno,student.sname
from student
inner join sc on student.sno = sc.sno
where sc.sno != 1001
and sc.cno in(
select sc.cno from sc where sc.sno = 1001
)
group by student.sno #11.查询和“1001”号的同学学习的课程完全相同的其他同学学号和姓名
select sc.sno
from sc where sc.sno != 1002 and cno in
(select cno from sc where sc.sno = 1002)
group by sno having count(*) =
(select count(*) from sc where sno = 1002) #12.删除学习“李老师”课的sc表记录
delete sc
from sc
inner join course on course.cno = sc.cno
inner join teacher on teacher.tno = course.tno
where teacher.tname = '李老师' #13.向sc表中插入一些记录,这些记录要求符合以下条件;没有上过编号“3004”课程的同学学号、3001号课程的平均成绩
insert into sc(sno,cno,score)
select sno,3001,(SELECT AVG(score) from sc where cno = 3001)
from student where sno not in
(
select sno from sc where cno = 3003
) #14.按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示:学生id,语文,数学,英语,有效课程数,有效平均分
select
s.sno as '学生id',
(select s1.score from sc s1 where s1.sno = s.sno and s1.cno = 3001) as '语文',
(select s2.score from sc s2 where s2.sno = s.sno and s2.cno = 3002) as '数学',
(select s3.score from sc s3 where s3.sno = s.sno and s3.cno = 3003) as '英语',
count(cno) as '有效课程数',
AVG(score) as '有效平均分'
from sc s group by s.sno order by '有效平均分' #15.查询各科成绩最高和最低的分:以如下的形式显示,课程id,最高分,最低分
select
s.cno as '课程id',
(select max(score) from sc s1 where s1.cno = s.cno) as '最高分',
(select min(score) from sc s2 where s2.cno = s.cno) as '最低分'
from sc s group by s.cno #16.按各科平均成绩从低到高和及格率的百分数从高到低顺序
select
s.cno as '课程id',
course.cname as '课程名',
AVG(s.score) as avgScore,
(select count(*) from sc s1 where s.cno = s1.cno and s1.score>60)/count(sno)*100 as rate
from sc s
inner join course on course.cno = s.cno
group by s.cno
order by avgScore asc,rate desc #17.查询“3001”课程成绩在第2名到3名的学生的各科成绩
select
student.sname,course.cname,sc.score
from course
inner join sc on course.cno = sc.cno
and course.cno = 3001
inner join student on student.sno = sc.sno
order by sc.score desc
limit 1,2 #18.查询出只选修两门课程的全部学生的学号和姓名
select student.sno,student.sname
from student
inner join sc on student.sno = sc.sno
group by student.sno having count(student.sno)=2
MYSQL语句强化练习的更多相关文章
- 如何根据执行计划,判断Mysql语句是否走索引
如何根据执行计划,判断Mysql语句是否走索引
- 让dede运行php代码和mysql语句
一.dede运行php代码 举例1: {dede:name runphp='yes'} $str = "hello ";@me = $str;@me .= "world& ...
- php代码优化,mysql语句优化,面试需要用到的
首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- Thinkphp用exp表达式执行mysql语句,查询某字段不为空is not null,自动增值
Thinkphp用exp表达式执行mysql语句,查询某字段不为空is not null,自动增值 Thinkphp 的文档经常不够完整的表达MYSQL的各种组合,is not null在thinkp ...
- MySQL语句进行分组后的含有字段拼接方法
MySQL语句: SELECT GROUP_CONCAT(DISTINCT transaction_no) FROM `lm_wh_trans` GROUP BY staff_code; 如果tran ...
- shell脚本循环执行mysql语句
参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...
- 【PHP基础】常用mySQL语句以及WampServer2.2设置数据库默认编码
一.WampServer2.2设置数据库默认编码(此部分转自http://www.cnsecer.com/5984.html) wamp下MySQL的默认编码是Latin1,不支持中文,要支持中文的话 ...
- mysql语句中把string类型字段转datetime类型
mysql语句中把string类型字段转datetime类型 在mysql里面利用str_to_date()把字符串转换为日期 此处以表h_hotelcontext的Start_time和En ...
随机推荐
- WPF的点击穿透
1.background 为{x:null} 或 鼠标点击会穿透,如果不想让一个透明的border点击穿透,设置透明色Transparent时就可以点到这个看起来透明的border 2.当依赖属性I ...
- mage J和Graphpad如何对Western Blot条带灰度分析
原文 mage J和Graphpad如何对Western Blot条带灰度分析 WB是研究蛋白表达的一个经典方法.对于一些时间点或者是不同组织蛋白表达量的分析就涉及到量的变化.一些凝胶成像软件带有此分 ...
- C#破解access数据库密码方法
原文:C#破解access数据库密码方法 using System; using System.Collections.Generic; using System.IO; using System.L ...
- 如何线程调用C++类成员函数
方法就是: 1,写成静态成员函数 2,参数为 (void* __this)用来传入类 对象指针(this) 3,进入函数首先 C类名 *_this = (C类名*)__this; 转化为对象指 ...
- 零元学Expression Blend 4 - Chapter 19 如何让做好的Blend专案变Silverlight网页
原文:零元学Expression Blend 4 - Chapter 19 如何让做好的Blend专案变Silverlight网页 本章将教大家如何把制作好的Blend专案变为可以让任何人在网际网路浏 ...
- WPF修改窗体标题栏的颜色
WPF程序通常情况下没办法修改窗体标题栏的样式,包括标题栏的背景颜色. 不过借助一个叫Fluent.Ribbon的第三方控件,貌似可以修改标题栏的背景颜色. 可以通过NuGet来安装这个控件:Inst ...
- 【转】跟面试官聊.NET垃圾收集,直刺面试官G点
装逼的面试官和装逼的程序员 我面试别人的时候,经常是按这种路子来面试: 看简历和面试题,从简历和面试题上找到一些技术点,然后跟应聘者聊. 聊某个技术点的时候,应聘者的回答会牵涉到其他的技术点,然后我会 ...
- Linux C/C++编程手册查阅方法
Linux Programmer's Manual & User Commands https://www.kernel.org/doc/man-pages/ 搜索框输入epoll调用搜索引擎 ...
- 使用pjax实现类似github无刷新更改页面url
pjax=pushState+ajax,相信用过github的同学都知道,github部分页面采用了pjax这个项目来实现ajax无刷新加载的同时改变页面url.一起来学习一下这个插件吧. 我们都知道 ...
- cookie,session,用户认证组件
一. 绘画跟踪技术 在客户端与服务端的一次会务中,多次的请求与相应,HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态.会话跟踪技术即能够实现多次回话间信息共享的作用,HT ...