sql常见50道查询练习题

sql常见50道查询练习题

  • 1. 表创建
    • 1.1 表创建
    • 1.2 数据插入
  • 2. 简单查询例题(3题)
    • 2.1 查询"李"姓老师的数量
    • 2.2 查询男生、女生人数
    • 2.3 查询名字中含有"风"字的学生信息
  • 3. 日期相关例题(6题)
    • 3.1 查询各学生的年龄
    • 3.2 查询本周过生日的学生
    • 3.3 查询下周过生日的学生
    • 3.4 查询本月过生日的学生
    • 3.5 查询下月过生日的学生
    • 3.6 查询1990年出生的学生名单
  • 4. 开窗函数查询(7题)
    • 4.1 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
    • 4.2 按各科成绩进行排序,并显示排名(实现不完全)
    • 4.3 查询学生的总成绩并进行排名
    • 4.4 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
    • 4.5 查询学生平均成绩及其名次
    • 4.6 查询各科成绩前三名的记录
    • 4.7 查询每门功成绩最好的前两名
  • 5. 表连接+子查询+聚合函数查询(34题)
    • 5.1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数
    • 5.2 查询"01"课程比"02"课程成绩低的学生的信息及课程分数
    • 5.3 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
    • 5.4 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的)
    • 5.5 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
    • 5.6 查询学过"张三"老师授课的同学的信息
    • 5.7 查询没学过"张三"老师授课的同学的信息
    • 5.8 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
    • 5.9 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
    • 5.10 查询没有学全所有课程的同学的信息
    • 5.11 查询至少有一门课与学号为"01"的同学所学相同的同学的信息
    • 5.12 查询和"01"号的同学学习的课程完全相同的其他同学的信息
    • 5.13 查询没学过"张三"老师讲授的任一门课程的学生姓名
    • 5.14 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
    • 5.15 检索"01"课程分数小于60,按分数降序排列的学生信息
    • 5.16 查询各科成绩最高分、最低分和平均分
    • 5.17 统计各科成绩各分数段人数
    • 5.18 查询不同老师所教不同课程平均分从高到低显示
    • 5.19 查询每门课程被选修的学生数
    • 5.20 查询出只有两门课程的全部学生的学号和姓名
    • 5.21 查询同名同性学生名单,并统计同名人数
    • 5.22 查询每门课程的平均成绩
    • 5.23 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
    • 5.24 查询课程名称为"数学",且分数低于60的学生姓名和分数
    • 5.25 查询所有学生的课程及分数情况
    • 5.26 查询任何一门课程成绩在70分以上的姓名、课程名称和分数(学生的每门课都大于70)
    • 5.27 查询不及格的课程
    • 5.28 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名
    • 5.29 求每门课程的学生人数
    • 5.30 查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
    • 5.31 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
    • 5.32 统计每门课程的学生选修人数(超过5人的课程才统计)
    • 5.33 检索至少选修两门课程的学生学号
    • 5.34 查询选修了全部课程的学生信息

1. 表创建

在这里插入图片描述

1.1 表创建

#–1.学生表 
#Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
CREATE TABLE `Student` (`s_id` VARCHAR(20),s_name VARCHAR(20) NOT NULL DEFAULT '',s_brith VARCHAR(20) NOT NULL DEFAULT '',s_sex VARCHAR(10) NOT NULL DEFAULT '',PRIMARY KEY(s_id)
);#–2.课程表 
#Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 
create table Course(c_id varchar(20),c_name VARCHAR(20) not null DEFAULT '',t_id VARCHAR(20) NOT NULL,PRIMARY KEY(c_id)
);/*
–3.教师表 
Teacher(t_id,t_name) –教师编号,教师姓名 
*/
CREATE TABLE Teacher(t_id VARCHAR(20),t_name VARCHAR(20) NOT NULL DEFAULT '',PRIMARY KEY(t_id)
);/*
–4.成绩表 
Score(s_id,c_id,s_score) –学生编号,课程编号,分数
*/
Create table Score(s_id VARCHAR(20),c_id VARCHAR(20) not null default '',s_score INT(3),primary key(`s_id`,`c_id`)
);

1.2 数据插入

#--插入学生表测试数据
#('01' , '赵雷' , '1990-01-01' , '男')
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');#--课程表测试数据
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');#--教师表测试数据
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');#--成绩表测试数据
insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);

2. 简单查询例题(3题)

2.1 查询"李"姓老师的数量

SELECTcount(1) as cnt
FROMteacher
WHEREt_name like "李%"

2.2 查询男生、女生人数

SELECTs.s_sex,count(1) as 人数
FROMstudent s
group bys.s_sex

2.3 查询名字中含有"风"字的学生信息

SELECT*
FROMstudent
WHEREs_name like "%风%"

3. 日期相关例题(6题)

3.1 查询各学生的年龄

  • (按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一)
    -- if函数selecta.*,year(NOW())-year(a.s_brith)-if(DATE_FORMAT(now(),"%m%d") >DATE_FORMAT(a.s_brith,"%m%d"),0,1) as age
    FROMstudent a-- case函数select s_brith,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_brith,'%Y') - (case when DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_brith,'%m%d') then 0 else 1 end)) as age
    from student;
    

3.2 查询本周过生日的学生

SELECT*
FROMstudent
WHEREWEEKOFYEAR(STR_TO_DATE(concat(year(NOW()),DATE_FORMAT(s_brith,'%m%d')),"%Y%m%d"))=WEEKOFYEAR(NOW())
-- 	WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)

3.3 查询下周过生日的学生

SELECT*
FROMstudent
WHEREWEEKOFYEAR(STR_TO_DATE(concat(year(NOW()),DATE_FORMAT(s_brith,'%m%d')),"%Y%m%d"))=WEEKOFYEAR(NOW()+interval "7" day)
-- 	WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1=WEEK(s_birth)

3.4 查询本月过生日的学生

SELECT*
FROMstudent
WHEREMONTH(now())=month(s_brith)

3.5 查询下月过生日的学生

SELECT*
FROMstudent
WHEREMONTH(now()+interval "1" month)=month(s_brith)

3.6 查询1990年出生的学生名单

SELECT*
FROMstudent
WHEREs_brith like "1990%"
-- 	left(s_brith,4)="1990"
-- 	year(s_brith)="1990"

4. 开窗函数查询(7题)

4.1 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

  • 方法一:开窗函数
    selecta.*,avg(a.s_score) over(PARTITION by a.s_id) as avg_score
    FROMscore a
    
  • 方法二:临时表连接
    SELECTa.*,t.avg_score
    FROMscore a,(SELECTa.s_id,round(avg(a.s_score),2) as avg_scoreFROMscore agroup bya.s_id) t
    WHEREa.s_id=t.s_id
    order byt.avg_score desc
    
  • 方法三:长型数据转为宽型数据
    SELECTa.s_id,ifnull((select s_score from score where s_id=a.s_id and c_id="01"),0) as "语文",ifnull((select s_score from score where s_id=a.s_id and c_id="02"),0) as "数学",ifnull((select s_score from score where s_id=a.s_id and c_id="03"),0) as "英语",ifnull(round(avg(a.s_score),2),0) as avg_score
    FROMscore a
    group bya.s_id
    order byifnull(round(avg(a.s_score),2),0) desc
    

4.2 按各科成绩进行排序,并显示排名(实现不完全)

  • 方法一:开窗函数
    SELECTa.*,rank() over(PARTITION by c_id order by s_score desc) rank排名,row_number() over(PARTITION by c_id order by s_score desc) row_number排名,dense_rank() over(PARTITION by c_id order by s_score desc) dense_rank排名
    FROMscore a
    
  • 方法二:子查询
    SELECT	a.*,(select count(s_score) from score b where a.c_id=b.c_id and  a.s_score<b.s_score)+1 rk,(select count(distinct s_score) from score b where a.c_id=b.c_id and  a.s_score<=b.s_score) den_rk
    FROMscore a
    order byc_id,s_score desc
    

4.3 查询学生的总成绩并进行排名

  • 方法一:开窗函数
    SELECTt.*,rank() over(order by sum_score desc) rank排名
    FROM(SELECTs_id,sum(s_score) as sum_scoreFROMscoregroup bys_id) t
    

4.4 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

  • 方法一:子查询+开窗函数
    SELECTa.*,t.c_id,t.rk,t.s_score
    FROMstudent a,(SELECTa.s_id,a.c_id,a.s_score,dense_rank() over(PARTITION by a.c_id order by a.s_score desc) as rkFROMscore a) t
    WHEREt.rk in (2,3)
    ANDa.s_id=t.s_id

4.5 查询学生平均成绩及其名次

  • 方法一: 开窗函数
    SELECTt.*,rank() over(order by t.avg_score desc) 排名
    FROM(SELECTa.s_id,round(avg(a.s_score),2) as avg_scoreFROMscore agroup bya.s_id) t
    

4.6 查询各科成绩前三名的记录

  • 方法一:开窗函数
    SELECTt.*
    from(SELECTa.c_id,a.c_name,b.s_score,rank() over(PARTITION by a.c_id order by b.s_score desc) rkFROMcourse aLEFT JOINscore bONa.c_id=b.c_id) t
    WHEREt.rk<=3;
  • 方法二:子查询
    SELECT*
    from (SELECTa.c_id,a.c_name,b.s_score,(select count(c.s_score) from score c where a.c_id=c.c_id and b.s_score<c.s_score)+1 as rkFROMcourse aLEFT JOINscore bONa.c_id=b.c_id) t
    WHEREt.rk<=3
    order byt.c_name,t.rk asc;
    

4.7 查询每门功成绩最好的前两名

  • 方法一:开窗函数
    SELECTt.s_id,t.c_id,t.s_score
    FROM(SELECT*,rank() over(PARTITION by b.c_id order by b.s_score desc) rkFROMscore b) t
    WHEREt.rk<=2;
    
  • 方法二:自连接
    SELECTt.s_id,t.c_id,t.s_score
    FROM(SELECTa.*,(select count(1) from score b where b.c_id=a.c_id and a.s_score<b.s_score)+1 as rkFROMscore aorder bya.c_id,rk) t
    WHERE	t.rk<=2
  • 方法三:条件查询+子查询
    SELECTa.*
    FROMscore a
    WHERE(select count(1) from score b where b.c_id=a.c_id and a.s_score<b.s_score)+1<=2
    order bya.c_id

5. 表连接+子查询+聚合函数查询(34题)

5.1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数

  • 方法一:自连接,同列比较,使用自查询
    • 思路:先找出查询条件的学生信息及分数,根据子查询得到最终结果
    SELECT
    st.*,t1.sc1,t1.sc2
    FROMstudent st,(SELECTs1.s_id,s1.s_score as sc1,s2.s_score as sc2FROMscore s1,score s2WHERE	s1.c_id="01"AND	s2.c_id="02"ANDs1.s_id=s2.s_idANDs1.s_score>s2.s_score) t1
    WHEREst.s_id=t1.s_id;
    
  • 方法二:表连接
    SELECT
    st.*,s1.s_score as sc1,s2.s_score as sc2
    FROMstudent st
    left JOINscore s1
    ONs1.s_id=st.s_id
    left JOINscore s2
    ONs2.s_id=st.s_id
    WHERE	s1.c_id="01"
    AND	s2.c_id="02"
    ANDs1.s_id=s2.s_id
    ANDs1.s_score>s2.s_score
    
  • 数据长型数据变为宽型数据
    -- IF函数或case函数
    SELECTa.*,t.s01,t.s02
    fromstudent a,(SELECTa.s_id,max(case when a.c_id="01" then a.s_score end) as s01,max(case when a.c_id="02" then a.s_score end) as s02
    --  max(if(a.c_id="01",a.s_score,null)) as s01,
    --  max(if(a.c_id="02",a.s_score,null)) as s02fromscore agroup bya.s_id) t
    WHEREa.s_id=t.s_id
    ANDt.s01>t.s02

5.2 查询"01"课程比"02"课程成绩低的学生的信息及课程分数

  • 与上一题思路一致,条件大于变小于
  • 方法一:自连接
    SELECT
    st.*,t1.sc1,t1.sc2
    FROMstudent st,(SELECTs1.s_id,s1.s_score as sc1,s2.s_score as sc2FROMscore s1,score s2WHERE	s1.c_id="01"AND	s2.c_id="02"ANDs1.s_id=s2.s_idANDs1.s_score<s2.s_score) t1
    WHEREst.s_id=t1.s_id;
  • 方法二:表连接
    SELECTst.*,s1.s_score as sc1,s2.s_score as sc2
    FROMstudent st
    left JOINscore s1
    ONs1.s_id=st.s_id
    left JOINscore s2
    ONs2.s_id=st.s_id
    WHERE	s1.c_id="01"
    AND	s2.c_id="02"
    ANDs1.s_id=s2.s_id
    ANDs1.s_score<s2.s_score-- 方法二
    SELECTst.*,s1.s_score as sc1,s2.s_score as sc2
    FROMstudent st
    left JOINscore s1
    ONs1.s_id=st.s_id
    ANDs1.c_id="01"
    left JOINscore s2
    ONs2.s_id=st.s_id
    ANDs2.c_id="02"
    ANDs1.s_id=s2.s_id
    WHEREs1.s_score<s2.s_score
  • 方法三:数据长型数据变为宽型数据
    -- IF函数或case函数
    SELECTa.*,t.s01,t.s02
    fromstudent a,(SELECTa.s_id,max(case when a.c_id="01" then a.s_score end) as s01,max(case when a.c_id="02" then a.s_score end) as s02
    --  max(if(a.c_id="01",a.s_score,null)) as s01,
    --  max(if(a.c_id="02",a.s_score,null)) as s02fromscore agroup bya.s_id) t
    WHEREt.s01<t.s02
    ANDa.s_id=t.s_id
    

5.3 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

  • 方法一:子查询
    -- 子查询一
    SELECT
    st.s_id,st.s_name,t.avg_s
    FROMstudent ST,(SELECTs.s_id,round(avg(s.s_score),2) as avg_sFROM	score sGROUP BYs.s_idHAVINGround(avg(s.s_score),2)>=60) t
    WHEREst.s_id=t.s_id-- 方法二:子查询二SELECTs.s_id,(select s_name from student where s_id=s.s_id) as s_name,round(avg(s.s_score),2) as avg_s
    FROM	score s
    GROUP BYs.s_id
    HAVINGavg_s>=60
    
  • 方法二:表连接
    SELECTa.s_id,a.s_name,round(avg(b.s_score),2) as avg_score
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    GROUP BYa.s_id
    HAVINGround(avg(b.s_score),2)>=60;
    

5.4 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的)

  • 方法一:子查询
    -- 有成绩的SELECTa.s_id,a.s_name,t.avg_acore
    FROMstudent a,(SELECTa.s_id,round(avg(a.s_score),2) as avg_acoreFROMscore aGROUP BYa.s_idHAVINGround(avg(a.s_score),2)<60) t
    WHEREa.s_id=t.s_idUNION
    -- 没有成绩的:没有成绩的s_id不存在
    SELECTa.s_id,a.s_name,0 as avg_acore
    FROMstudent a
    WHEREa.s_id not in (SELECT DISTINCT s_id FROM score);
    
  • 方法二:表连接
    SELECTa.s_id,a.s_name,ifnull(round(avg(b.s_score),2),0) as avg_score
    FROMstudent a
    LEFT JOINscore b
    on a.s_id=b.s_id
    GROUP BYa.s_id
    HAVINGavg_score<60
    

5.5 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECTa.s_id,a.s_name,count(b.c_id) as cnt_course,ifnull(sum(b.s_score),0) as sum_score
FROMstudent a
LEFT JOINscore b
ONa.s_id=b.s_id
group bya.s_id

5.6 查询学过"张三"老师授课的同学的信息

  • 方法一:表连接+子查询单层嵌套
    SELECTa.*
    FROMstudent a
    LEFT JOINscore b
    on a.s_id=b.s_id
    LEFT JOINcourse c
    ONb.c_id=c.c_id
    where c.t_id in(SELECT t_id FROM teacher WHERE t_name = "张三")
    
  • 方法二:表连接+子查询多层嵌套
    SELECTa.*
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    WHEREb.c_id in (
    SELECTc_id
    FROMcourse where t_id in(SELECT t_id from teacher where t_name="张三")
    );
    
  • 方法三:多表连接
    selecta.*
    fromstudent a,score b,course c,teacher d
    WHEREa.s_id=b.s_id
    ANDb.c_id=c.c_id
    ANDc.t_id=d.t_id
    ANDd.t_name="张三"
    

5.7 查询没学过"张三"老师授课的同学的信息

  • 注意:一个学生有几门课程包含张三课程,不是张三课程的,根据没学过的查询不出来,因为一个人有多个老师的课程
  • 方法一:多层嵌套子查询
    SELECTs.*
    FROMstudent s
    WHEREs.s_id NOT IN (-- 查找学的学生SELECT DISTINCTa.s_idFROMstudent aLEFT JOIN score b ON a.s_id = b.s_idWHEREb.c_id IN (-- 查找学过的课程SELECT c_idFROM courseWHERE t_id IN ( SELECT t_id FROM teacher WHERE t_name = "张三")))
    
  • 方法二:条件查询+子表连接
    SELECT*
    FROMstudent s
    WHEREs.s_id not in (selecta.s_idfromscore a,course b,teacher cWHEREa.c_id=b.c_idANDb.t_id=c.t_idANDc.t_name="张三")
    

5.8 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

  • 方法一:子查询+自连接,同列对比可以用自连接
    SELECT*
    FROMstudent s
    WHEREs.s_id in(SELECTa.s_idFROMscore a,score bWHEREa.c_id="01" ANDb.c_id="02"ANDa.s_id=b.s_id)
    
  • 方法二:连表+自连接,同列对比可以用自连接
    SELECTs.*
    FROMstudent s
    LEFT JOIN score a
    ONs.s_id=a.s_id
    LEFT JOINscore b
    ONa.s_id=b.s_id
    WHEREa.c_id="01" 
    ANDb.c_id="02"
    
  • 方法三:条件查询+子查询
    SELECT*
    FROMstudent
    WHEREs_id in (SELECTs_idFROMscorewherec_id="01" or c_id="02"GROUP BYs_idHAVINGcount(1)=2)
    
  • 方法四:自连接,条件连接
    SELECTs.*
    FROMstudent s,score a,score b
    WHEREs.s_id=a.s_id
    ANDa.s_id=b.s_id
    ANDa.c_id="01" 
    ANDb.c_id="02"
    
  • 方法五:子查询+数据长型数据变为宽型数据
    SELECTa.*
    FROMstudent a,(selecta.s_id,max(if(a.c_id="01",a.s_score,0)) as s01,max(if(a.c_id="02",a.s_score,0)) as s02fromscore agroup bya.s_id) t
    WHEREa.s_id=t.s_id
    ANDt.s01>0
    ANDt.s02>0
    

5.9 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

  • 方法一:条件查询+子查询
    selecta.*
    fromstudent a
    WHERE	a.s_id in(select s_id from score where c_id="01") 
    ANDa.s_id not in (select s_id from score where c_id="02")
    
  • 方法二: 子查询+分组聚合
    SELECTs.*
    FROMstudent s,(SELECTa.s_id,max(case when a.c_id="01" then a.s_score end) s01,max(case when a.c_id="02" then a.s_score end) s02FROMscore agroup bya.s_id) t
    WHEREs.s_id=t.s_id
    ANDt.s01 is not NULL
    ANDt.s02 is null
    
  • 方法三:数据长型数据变为宽型数据
    SELECTa.*
    FROMstudent a,(selecta.s_id,max(if(a.c_id="01",a.s_score,null)) as s01,max(if(a.c_id="02",a.s_score,null)) as s02fromscore agroup bya.s_id) t
    WHEREa.s_id=t.s_id
    ANDt.s01 is not null
    ANDt.s02 is null
    

5.10 查询没有学全所有课程的同学的信息

  • 方法一:条件查询+子查询
    SELECTs.*
    FROMstudent s
    WHEREs.s_id in(SELECTa.s_idFROMscore agroup bya.s_idhavingcount(1)<(select count(1) from course))
    
  • 方法二:表连接
    SELECTs.*,count(a.c_id) cnt
    FROMstudent s
    LEFT JOINscore a
    ONa.s_id=s.s_id
    group bys.s_id
    HAVINGcount(a.c_id)<(select count(1) from course)
    

5.11 查询至少有一门课与学号为"01"的同学所学相同的同学的信息

  • 方法一:子查询
    SELECTs.*
    FROMstudent s
    WHEREs.s_id in(SELECTdistinct a.s_idFROMscore aWHEREa.c_id in(SELECTb.c_idFROMscore bWHEREb.s_id="01"))
    ANDs.s_id!='01'
    
  • 方法二:表连接+子查询
    SELECTa.*
    FROMstudent a
    LEFT JOINscore b
    on a.s_id=b.s_id
    WHEREb.c_id in (SELECTb.c_idFROMscore bWHEREb.s_id="01")
    group by 1,2,3,4
    

5.12 查询和"01"号的同学学习的课程完全相同的其他同学的信息

  • 筛选课程与01号一样的数据,计算课程数与01一致的
SELECTs.*
FROMstudent s
WHEREs.s_id in(SELECT distinct a.s_idFROMscore aWHEREa.c_id in(SELECTa.c_idFROMscore aWHEREa.s_id="01")ANDa.s_id!="01"group by a.s_idHAVINGcount(distinct a.c_id)=(select count(1) from score a where a.s_id="01"))

5.13 查询没学过"张三"老师讲授的任一门课程的学生姓名

  • 查询学过张三老师的学生,在学生表中反向查询
SELECTs.s_name
FROMstudent s
WHEREs.s_id not in(SELECTa.s_idFROMscore aWHEREa.c_id in (SELECTa.c_idFROMcourse aWHEREa.t_id in (SELECT t.t_id FROM teacher t WHERE t.t_name="张三")))

5.14 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

  • 方法一:表连接+分组+having条件
    SELECTa.s_id,a.s_name,round(avg(b.s_score),2) as avg_score
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    group bya.s_id
    havingsum(if(b.s_score>=60,0,1))>=2
    
  • 方法二:自连接+子查询
    selecta.s_id,a.s_name,round(avg(b.s_score),2) as avg_score
    FROMstudent a,score b
    WHEREa.s_id=b.s_id
    ANDa.s_id in(SELECTa.s_idFROMscore aWHEREa.s_score<60group bya.s_idHAVINGcount(1)>=2)
    group bya.s_id
  • 方法三:表连接+子查询
    selecta.s_id,a.s_name,round(avg(b.s_score),2) as avg_score
    FROMstudent a
    LEFT JOINscore b
    ona.s_id=b.s_id
    wherea.s_id in(SELECTa.s_idFROMscore aWHEREa.s_score<60group bya.s_idHAVINGcount(1)>=2)
    group bya.s_id
    

5.15 检索"01"课程分数小于60,按分数降序排列的学生信息

  • 方法一:表连接
    SELECTa.*,b.c_id,b.s_score
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    WHEREb.c_id="01" and b.s_score<60
    order byb.s_score desc
    

5.16 查询各科成绩最高分、最低分和平均分

  • 以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
  • 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
  • 方法一:if语句
    SELECTa.c_id,a.c_name,max(b.s_score) as max_score,min(b.s_score) as min_score,round(avg(b.s_score),2) as avg_score,round(100*sum(if(b.s_score>=60,1,0))/count(1),2) as "及格率",round(100*sum(if(b.s_score>=70 and b.s_score<80,1,0))/count(1),2) as "中等率",round(100*sum(if(b.s_score>=80 and b.s_score<90,1,0))/count(1),2) as "优良率",round(100*sum(if(b.s_score>=90,1,0))/count(1),2) as "优秀率"
    FROMcourse a,score b
    WHEREa.c_id=b.c_id
    group bya.c_id
    
  • 方法二:case when
    SELECTa.c_id,a.c_name,max(b.s_score) as max_score,min(b.s_score) as min_score,round(avg(b.s_score),2) as avg_score,round(100*sum(case when b.s_score>=60 then 1 else 0 end)/sum(case when b.s_score then 1 else 0 end),2) as "及格率",round(100*sum(case when b.s_score>=70 and b.s_score<80 then 1 else 0 end)/sum(case when b.s_score then 1 else 0 end),2) as "中等率",round(100*sum(case when b.s_score>=80 and b.s_score<90 then 1 else 0 end)/sum(case when b.s_score then 1 else 0 end),2) as "优良率",round(100*sum(case when b.s_score>=90 then 1 else 0 end)/sum(case when b.s_score then 1 else 0 end),2) as "优秀率"
    FROMcourse a,score b
    WHEREa.c_id=b.c_id
    group bya.c_id

5.17 统计各科成绩各分数段人数

  • 课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]个数及所占百分比
  • 方法一:if函数
    SELECTb.c_id,a.c_name,round(100*sum(if(b.s_score>85 and b.s_score<=100,1,0))/count(1),2) as "[100-85]百分比",sum(if(b.s_score>85 and b.s_score<=100,1,0)) as "[100-85]",round(100*sum(if(b.s_score>70 and b.s_score<=85,1,0))/count(1),2) as "[85-70]百分比",sum(if(b.s_score>70 and b.s_score<=85,1,0)) as "[85-70]",round(100*sum(if(b.s_score>60 and b.s_score<=70,1,0))/count(1),2) as "[70-60]百分比",sum(if(b.s_score>60 and b.s_score<=70,1,0)) as "[70-60]",round(100*sum(if(b.s_score>0 and b.s_score<=60,1,0))/count(1),2) as "[0-60]百分比",sum(if(b.s_score>=0 and b.s_score<=60,1,0)) as "[0-60]"
    FROMcourse a,score b
    WHEREa.c_id=b.c_id
    group byb.c_id
    

5.18 查询不同老师所教不同课程平均分从高到低显示

  • 方法一:表连接
    SELECTc.t_name,a.c_name,round(avg(b.s_score),2) as avg_score
    FROMcourse a
    left JOINscore b
    ONa.c_id=b.c_id
    LEFT JOINteacher c
    ONa.t_id=c.t_id
    group byc.t_name,a.c_name
    order byavg_score DESC
    

5.19 查询每门课程被选修的学生数

SELECTa.c_id,a.c_name,count(1) as cnt
FROMcourse a
LEFT JOINscore b
ON	a.c_id=b.c_id
group bya.c_id

5.20 查询出只有两门课程的全部学生的学号和姓名

  • 方法一:连表
    SELECTdistinct a.s_id,a.s_name
    FROMstudent a,score b
    WHEREa.s_id=b.s_id
    group bya.s_id
    HAVINGcount(b.c_id)=2
    
  • 方法二:条件查询
    select s_id,s_name 
    from student 
    where s_id in (select s_id from score GROUP BY s_id HAVING COUNT(c_id)=2);
    

5.21 查询同名同性学生名单,并统计同名人数

  • 方法一:分组条件查询
    SELECTs_name,count(1) as "人数"
    FROMstudent
    group bys_name,s_sex
    HAVINGcount(1)>1
    
  • 方法二:自连接(同列比较可以用自连接)
    select a.s_name,a.s_sex,count(*) 
    from student a  
    JOIN student b 
    on a.s_id !=b.s_id 
    and a.s_name = b.s_name 
    and a.s_sex = b.s_sex
    GROUP BY a.s_name,a.s_sex

5.22 查询每门课程的平均成绩

  • 结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
    SELECTa.c_id,round(avg(a.s_score),2) as avg_score
    FROMscore a
    group bya.c_id
    order byavg_score desc,a.c_id asc	
    

5.23 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

  • 方法一:子查询
    SELECTa.s_id,a.s_name,t.avg_score
    FROMstudent a,(SELECTa.s_id,round(avg(a.s_score),2) as avg_scoreFROMscore agroup bya.s_idHAVINGavg_score>=85) t
    WHERE	a.s_id=t.s_id
    ANDt.avg_score is not null
    
  • 方法二:表连接
    selecta.s_id,b.s_name,ifnull(round(avg(a.s_score),2),0) as avg_score
    FROMscore a
    LEFT JOINstudent b
    ONa.s_id=b.s_id
    GROUP BYa.s_id
    HAVINGavg_score>=85
    

5.24 查询课程名称为"数学",且分数低于60的学生姓名和分数

  • 方法一:条件查询+子查询
    SELECTb.s_name,a.s_score
    FROMscore a
    LEFT JOINstudent b
    ONa.s_id=b.s_id
    WHEREc_id in (SELECT c_id FROM course where c_name="数学")
    ANDa.s_score<60
    
  • 方法二:多表连接
    SELECTb.s_name,a.s_score
    FROMscore a
    LEFT JOINstudent b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONa.c_id=c.c_id
    WHEREc.c_name="数学"
    ANDa.s_score<60
    

5.25 查询所有学生的课程及分数情况

  • 方法一:表连接
    SELECTa.s_name,c.c_name,b.s_score
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONc.c_id=b.c_id
    
  • 方法二:if函数
    SELECTa.s_id,a.s_name,sum(if(c.c_name="语文",b.s_score,0)) as "语文",sum(if(c.c_name="数学",b.s_score,0)) as "数学",sum(if(c.c_name="英语",b.s_score,0)) as "英语",sum(b.s_score) as "总分"
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONc.c_id=b.c_id
    group bya.s_id,a.s_name
    
  • 方法三:case函数
    selecta.s_id,a.s_name,sum(case when c.c_name="语文" then b.s_score else 0 end) as "语文",sum(case when c.c_name="数学" then b.s_score else 0 end) as "数学",sum(case when c.c_name="英语" then b.s_score else 0 end) as "英语",sum(b.s_score) as "总分"
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONc.c_id=b.c_id
    group bya.s_id,a.s_name
    

5.26 查询任何一门课程成绩在70分以上的姓名、课程名称和分数(学生的每门课都大于70)

  • 方法一:表连接+子查询
    SELECTa.s_name,c.c_name,b.s_scoreFROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONc.c_id=b.c_id
    WHEREa.s_id in (select s_id from score group by s_id having min(s_score)>70);
    

5.27 查询不及格的课程

  • 方法一:表连接
SELECT
distinctb.s_id,b.c_id,a.c_name,b.s_score
fromcourse a
LEFT JOINscore b
ONa.c_id=b.c_id
WHEREb.s_score<60

5.28 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名

  • 方法一:子查询
    SELECTt.s_id,t.s_name
    FROMstudent t
    WHEREt.s_id in(SELECTa.s_idFROMscore aWHEREa.c_id="01" ANDa.s_score>80)
    
  • 方法二:表连接
    selecta.s_id,a.s_name
    fromstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    WHEREb.c_id="01"
    ANDb.s_score>80
    

5.29 求每门课程的学生人数

SELECTa.c_name,count(1) as "人数"
FROMcourse a
LEFT JOINscore b
ONa.c_id=b.c_id
group bya.c_id

5.30 查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

  • 方法一:表连接+子查询
    SELECTa.*,b.s_score as max_score,b.c_id,c.c_name
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONc.c_id=b.c_id
    WHERE
    -- 查询idb.c_id in (SELECTc_idFROMcourse WHEREt_id in (select t_id from teacher where t_name="张三"))
    AND
    -- 查询最大分数b.s_score=(select distinct max(s_score) from score where c_id="02")
    
  • 方法二:表连接
     SELECTa.*,b.s_score as max_score,b.c_id,c.c_name
    FROMstudent a
    LEFT JOINscore b
    ONa.s_id=b.s_id
    LEFT JOINcourse c
    ONc.c_id=b.c_id
    LEFT JOINteacher d
    ONd.t_id=c.t_id
    WHEREd.t_name="张三"
    order bymax_score desc
    limit 1;
    

5.31 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

SELECT
distincta.*
FROMscore a,score b
WHEREa.c_id!=b.c_id
ANDa.s_score=b.s_score

5.32 统计每门课程的学生选修人数(超过5人的课程才统计)

  • 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
  • 方法一: 分组聚合
    SELECTc_id,count(1) as "选修人数"
    FROMscore
    group byc_id
    HAVINGcount(1) >5
    order by"选修人数" desc,c_id asc
    
  • 方法二:连表+分组聚合
    SELECTa.c_id,count(b.s_id) cnt
    FROMcourse a
    LEFT JOINscore b
    ONa.c_id=b.c_id
    group bya.c_id
    HAVINGcount(b.s_id)>5
    order bycnt desc,a.c_id asc
    

5.33 检索至少选修两门课程的学生学号

SELECTs_id
FROMscore
group bys_id
HAVINGcount(c_id)>=2;

5.34 查询选修了全部课程的学生信息

  • 方法一:连表查询
    SELECTa.*
    FROMstudent a,score b
    WHEREa.s_id=b.s_id
    group bys_id
    HAVINGcount(1)=(select count(1) from course)
    
  • 方法二:子查询
    SELECT*
    FROMstudent a
    WHEREa.s_id in(select s_idFROMscoregroup bys_idHAVING	count(1)=(select count(1) from course))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1483751.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS6minimal安装nginx-1.26.1.tar.gz 笔记240718

CentOS6安装新版nginx 240718, CentOS6.1-minimal 安装 nginx-1.26.1.tar.gz 下载 nginx-1.26.1.tar.gz 的页面 : https://nginx.org/en/download.html 下载 nginx-1.26.1.tar.gz : https://nginx.org/download/nginx-1.26.1.tar.gz CentOS6.1已过期, 给它更换yum源, 将下面…

用 Bytebase 实现可回滚的数据库数据变更

在修改数据库的数据时&#xff0c;建议先备份即将修改的数据&#xff0c;以便在需要时能够恢复。Bytebase 提供了「数据回滚」的功能来帮助实现这一功能。本教程将为你演示这一过程。 准备 请确保已安装 Docker&#xff0c;如果本地没有重要的现有 Bytebase 数据&#xff0c;可…

github上的工程如何下载子模块.gitmodules如何下载指定的模块download submodules开源项目子模块下载externals

github上的工程如何下载子模块.gitmodules如何下载指定的模块download submodules 说明(废话)解决方案无法执行下载子模块无法下载子项目 说明(废话) 今天在编译一个开源库时&#xff0c;该开源库依赖其他项目&#xff0c;并且项目还挺多的&#xff0c;所以有此解决方案 在编…

IDEA2023版本创建JavaWeb项目及配置Tomcat详细步骤!

一、创建JavaWeb项目 第一步 之前的版本能够在创建时直接选成Web项目&#xff0c;但是2023版本在创建项目时没有该选项&#xff0c;需要在创建项目之后才能配置&#xff0c;首先先创建一个项目。 第二步 在创建好的项目中选中项目后&#xff08;一定要注意选中项目名称然后继…

UE4-打包游戏,游戏模式,默认关卡

一.打包游戏 注意windows系统无法打包苹果系统的执行包&#xff0c;只能使用苹果系统打包。 打包完之后是一个.exe文件。 打包要点&#xff1a; 1.确定好要操控的角色和生成位置。 2.设置默认加载的关卡和游戏模式。 在这个界面可以配置游戏的默认地图和游戏的模式&#xff0c;…

C/C++ xml库

文章目录 一、介绍1.1 xml 介绍1.2 xml 标准1.3 xml 教程1.4 xml 构成 二、C/C xml 库选型2.1 选型范围2.2 RapidXML2.3 tinyxml22.4 pugixml2.5 libxml 五、性能比较5.1 C xml 相关的操作有哪些5.2 rapidxml、Pugixml、TinyXML2 文件读取性能比较 六、其他问题6.1 version和 e…

Jangow

关于靶场环境配置&#xff0c;确实这个靶场存在很大的问题&#xff0c;不仅仅是网络的配置问题&#xff0c;更重要的是明知道如何修改网络环境配置&#xff0c;但是键盘存在很大的问题。许多字符输入不一致。 Vulnhub靶场&#xff0c;Jangow靶机环境找不到ip解决方法。_jangow…

算法力扣刷题记录 五十二【617.合并二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十二【617.合并二叉树】 一、题目阅读 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要…

自动驾驶-2D目标检测

yolo及yolo的变体 anchor boxes (锚框) intersection over union 并集交集 用于计算两个边界框的差异程度 bounding box predictions 边界框预测 non maximum suppression非极大值抑制 为了分离这些边界框并为每个对象获得单个边界框&#xff0c;我们使用IOU。这种获取单…

【学术会议征稿】第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)

第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024) 2024 6th International Conference on Frontier Technologies of Information and Computer 第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)将在中国青岛举行&#xff0c;会期是2024年11月8-10日&#xff0c;为…

区块链技术在版权保护领域的应用

区块链技术具有去中心化、不可篡改、可追溯等特点&#xff0c;使其在版权保护领域具有广阔的应用前景。具体而言&#xff0c;区块链技术可以应用于以下几个方面。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 版权确权 版权确权…

微信小程序实现拉起微信支付功能-最简单版

里面有很多逻辑需要大家自己写啊&#xff0c;比如订单获取啊&#xff0c;生成订单啊&#xff0c;变更订单状态&#xff0c;退款啊&#xff0c;等等的&#xff0c;我这里就实现了一个基本的功能&#xff0c;就是拉起支付&#xff0c;支付到账这样的&#xff0c;大家根据需求自己…

一分钟了解半导体行业国产通讯方案

随着半导体行业的快速发展,半导体通讯设备国产化的需求日益强烈,ZLG致远电子基于行业需求,推出系统的DeviceNet主从站控制和网关通讯方案。 ▌半导体行业中DeviceNet的应用 半导体行业中设备一般分为前道设备和后道设备。前道是指晶圆制造厂的加工过程,在空白的硅片完成电…

SAPUI5基础知识15 - 理解控件的本质

1. 背景 经过一系列的练习&#xff0c;通过不同的SAPUI5控件&#xff0c;我们完成了对应用程序界面的初步设计&#xff0c;在本篇博客中&#xff0c;让我们一起总结下SAPUI5控件的相关知识点&#xff0c;更深入地理解SAPUI5控件的本质。 通常而言&#xff0c;一个典型UI5应用…

网络编程-TCP 协议的三次握手和四次挥手做了什么

TCP 协议概述 1. TCP 协议简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 协议提供可靠的通信服务&#xff0c;通过校验和、序列号、确认应答、重传等机制保证数据传输…

Uniapp 组件 props 属性为 undefined

问题 props 里的属性值都是 undefined 代码 可能的原因 组件的名字要这样写&#xff0c;这个官方文档有说明

美图WHEE AI:包括文生图、图生图、风格模型训练多种模式图片创作绘画创作平台

美图WHEE AI是一款基于MiracleVision模型的创作平台&#xff0c;提供文生图和图生图功能。用户可以通过输入文字或上传照片生成画作&#xff0c;并自定义风格。美图通过收购站酷网&#xff0c;增强了模型商店和版权能力&#xff0c;丰富了产品线。 美图WHEE功能演示观看请到喜…

华为“铁三角模式”在数据类项目中的应用和价值

引言&#xff1a;随着信息技术的飞速发展&#xff0c;企业纷纷踏上数字化转型的道路&#xff0c;希望通过数据分析和智能决策来提升企业竞争力。在这一过程中&#xff0c;数据类项目成为关键&#xff0c;它们旨在构建高效的数据治理和分析平台&#xff0c;为企业决策提供有力支…

MSVC2017+Qt 打包

在环境变量下配置好 QT 和 MSVC 的路径 相关搜索&#xff1a; 找不到msvcp140.dll 1.搜索 Qt 选择在编译器路径下打开 2. Windeployqt 生成打包&#xff0c;正常情况下生成 VC 相关package&#xff0c; 即 msvcp140.dll 等MSVC 相关 但是lz尝试没有生成 解决办法 先将生成…

【开源 Mac 工具推荐之 2】洛雪音乐(lx-music-desktop):免费良心的音乐平台

旧版文章&#xff1a;【macOS免费软件推荐】第6期&#xff1a;洛雪音乐 Note&#xff1a;本文在旧版文章的基础上&#xff0c;新更新展示了一些洛雪音乐的新功能&#xff0c;并且描述更为详细。 简介 洛雪音乐&#xff08;GitHub 名&#xff1a;lx-music-desktop &#xff09;…