• SQL练习50题(基于MySQL)后25题


    #--学生表
    create table student(
        s_id vaechar(20),
        s_name vaechar(20) not NULL,
        s_birth vaechar(20) not NULL,
        s_sex vaechar(10) not NULL,
        constraint pk_student PRIMARY KEY (s_id))
    
    #--课程表
    create table  course(
        c_id  vaechar(20),
        c_name vaechar(20) not NULL DEFAULT '',
        t_id vaechar(20) not NULL,
        PRIMARY KEY(c_id))
    
    #--教师表
    create table teacher(
        t_id vaechar(20),
        t_name vaechar(20) not NULL DEFAULT '',
        PRIMARY KEY(t_id))
    
    #--成绩表
    create table score(
        s_id varchar(20),
        c_id  varchar(20),
        s_score int(3),
        PRIMARY KEY(s_id,c_id))
    
    alter table teacher convert to character set utf8
    
    #--插入学生表测试数据
    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);
    #-- 26、查询每门课程被选修的学生数
    select s.c_id, c.c_name, count(*) 
    from 
    (score s
    join
    course c
    on s.c_id = c.c_id)
    group by s.c_id
    
    #--- 27、查询出只有两门课程的全部学生的学号和姓名
    select * from student where s_id in
    (select s_id from score
    group by s_id
    having count(*) = 2)
    
    #--- 28、查询男生、女生人数
    select s_sex, count(*)
    from student
    group by s_sex
    
    #--- 29、查询名字中含有"风"字的学生信息
    select * from student
    where s_name like '%风%'
    
    #--- 30、查询同名同性学生名单,并统计同名人数
    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
    
    #--- 31、查询1990年出生的学生名单
    select * from student
    where s_birth like '1990%'
    
    #--- 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 
    select c_id, avg(s_score) from score
    group by c_id
    order by avg(s_score) desc, c_id asc
    
    #--- 33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
    select st.s_id, st.s_name, avg(s.s_score) from 
    (score s join student st
    on s.s_id = st.s_id)
    group by s.s_id
    having avg(s.s_score) >= 85
    
    #--- 34、查询课程名称为"数学",且分数低于60的学生姓名和分数
    select c.c_name, t.s_name, s.s_score
    from 
    (score s join course c on s.c_id = c.c_id
    join student t on s.s_id = t.s_id)
    where c.c_name = '数学' and s.s_score < 60
    
    #--- 35、查询所有学生的课程及分数情况;
    select st.s_id, st.s_name,
    sum(case c.c_name when '语文' then s.s_score else 0 end) as '语文',
    sum(case c.c_name when '数学' then s.s_score else 0 end) as '数学',
    sum(case c.c_name when '英语' then s.s_score else 0 end) as '英语',
    sum(s.s_score) '总分'
    from
    (student st left outer join score s on st.s_id = s.s_id
    left outer join course c on s.c_id = c.c_id)
    group by st.s_id
    #--- 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数; 
    select st.s_name, c.c_name, s.s_score
    from
    (score s join student st on s.s_id = st.s_id
    join course c on s.c_id = c.c_id)
    where s.s_score >= 70
    
    #--- 37、查询不及格的课程
    select s.s_id, c.c_name, s_score from 
    (score s left join course c on s.c_id=c.c_id)
    where s_score<60
    
    #---38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名;
    select s.s_id, s.c_id, st.s_name, s.s_score
    from
    (score s left join student st on s.s_id=st.s_id)
    where s.c_id='01' and s.s_score>=80
    
    #--- 39、求每门课程的学生人数 
    select c_id, count(c_id) from score group by c_id    
    
    #--- 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
    select t.t_name, st.s_id, st.s_name, s.s_score
    from
    (score s left join course c on s.c_id=c.c_id
    left join teacher t on c.t_id=t.t_id
    left join student st on s.s_id=st.s_id)
    where t.t_name='张三'
    group by s.s_score desc
    limit 1    
    
    #--- 41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 
    select distinct s.s_id, s.c_id, s.s_score from
    score s cross join score sc
    where s.s_score=sc.s_score and s.c_id!=sc.c_id
    
    #--- 42、查询每门功成绩最好的前两名
    select s.s_id, s.c_id, s.s_score from
    score s left join score sc
    on s.c_id=sc.c_id and s.s_score<sc.s_score
    group by s.s_id, s.c_id having count(sc.s_id) < 2
    order by s.c_id,s.s_score desc
    
    #--- 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,
    --查询结果按人数降序排列,若人数相同,按课程号升序排列    
    select c_id, count(c_id) from score 
    group by c_id having count(c_id)>5
    order by count(c_id)desc ,c_id asc 
    
    #--- 44、检索至少选修两门课程的学生学号 
    select s_id, count(c_id) from score
    group by s_id
    having count(c_id)>=2
    
    #--- 45、查询选修了全部课程的学生信息 
    select * from student where s_id in
    (select s_id from score group by s_id
    having count(s_id)=(select count(*) from course))
    
    #---46、查询各学生的年龄,按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
    select s_name,
    (DATE_FORMAT(now(),'%Y')-DATE_FORMAT(cast(s_birth as date),'%Y'))-
    (case when DATE_FORMAT(now(),'%m%d')>DATE_FORMAT(cast(s_birth as date),'%m%d') then 0 else 1 end) as age
     from student
    
    #--- 47、查询本周过生日的学生
    select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)
    
    #--- 48、查询下周过生日的学生
    select * from student where week(date_format(now(),'%Y%m%d'))+1=week(s_birth)
    
    #--- 49、查询本月过生日的学生
    select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d')) = MONTH(s_birth)
    
    #--- 50、查询下月过生日的学生
    select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1 = MONTH(s_birth)
  • 相关阅读:
    2019-3-13-win10-uwp-使用-ScaleTransform-放大某个元素
    2019-8-31-dotnet-控制台-Hangfire-后台定时任务
    2019-8-31-dotnet-控制台-Hangfire-后台定时任务
    2018-8-10-WPF-编译为-AnyCPU-和-x86-有什么区别
    2018-8-10-WPF-编译为-AnyCPU-和-x86-有什么区别
    2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
    2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
    2019-9-23-dotnet-判断特定进程存在方法
    android解析xml (pull)
    字符串转换成float和double类型
  • 原文地址:https://www.cnblogs.com/aioverg/p/11157518.html
Copyright © 2020-2023  润新知