sql题目---day39

# 1、查询所有的课程的名称以及对应的任课老师姓名
#where
select 
    teacher.tname,course.cname
from 
    teacher,course
where
    course.teacher_id  = teacher.tid

#内联写法
select 
    teacher.tname,course.cname
from
    teacher inner join course on course.teacher_id = teacher.tid;
    

# 2、查询学生表中男女生各有多少人
select 
    gender,count(*)
from 
    student
group by
    gender;

# 3、查询物理成绩等于100的学生的姓名
#where
select
    student.sid,student.sname,score.num
from 
    course,score,student
where
    course.cid = score.course_id
and student.sid = score.student_id
and course.cname = "物理"
and score.num = 100 

# inner join
select
    student.sid,student.sname,score.num
from 
    course inner join score on course.cid = score.course_id
    inner join student on student.sid = score.student_id
where
    course.cname = "物理"
and score.num = 100

#4.查询平均成绩大于八十分的同学的姓名和平均成绩
select
    student_id,avg(num)
from 
    score
group by
    student_id
having
    avg(num) > 80;

#where 写法
select 
    student_id,avg(num),sname
from 
    score,student
where
    score.student_id = student.sid
group by
    student_id
having
    avg(num) > 80;

#内联写法
select
    student_id,avg(num),sname
from 
    score inner join student on score.student_id = student.sid
group by
    student_id
having
    avg(num) > 80;
    
    
# 5、查询所有学生的学号,姓名,选课数,总成绩
#选课数
select
    student_id,count(*)
from
    score
group by
    student_id
#总成绩
select
    student_id,sum(num)
from 
    score
group by
    student_id

#where
'''group by +字段 by谁搜谁,跟其他表要搜索的字段无关'''
select 
    student_id,sname,count(*),sum(num)
from 
    score,student
where
    score.student_id = student.sid
group by
    student_id;

#内联写法
select
    student_id,sname,count(*),sum(num)
from 
    score inner join student on score.student_id  = student.sid
group by
    student_id;

#附加(展现所有学生,使用左联以学生表为主)
select
    student.sid,sname,count(score.course_id),sum(num)
from 
    student left join score on score.student_id = student.sid
group by
    student.sid;


## 6、 查询姓李老师的个数
select
    count(*)
from 
    teacher
where
    tname like "李%";

# 7、 查询没有报李平老师课的学生姓名
#1.先查报了李平老师课程的学生id
'''distinct 去重
distinct score.student_id
distinct(score.student_id)
'''
select
    distinct(score.student_id)
from
    teacher,course,score
where
    teacher.tid = course.teacher_id
and course.cid =score.course_id
and teacher.tname = "李平";
#2.除了这些学习李平老师id的,剩下的就没有学习李平课程的
select
    *
from 
    student
where
    sid not in (1号);
#3.综合拼接
select
    sname
from 
    student
where
    sid not in (select
    distinct(score.student_id)
from
    teacher,course,score
where
    teacher.tid = course.teacher_id
and course.cid =score.course_id
and teacher.tname = "李平"  
    );


## 8、 查询物理课程的分数比生物课程的分数高的学生的学号
#1.物理课程学生分数
select
    score.student_id,score.num,course.cid
from 
    course inner join score on course.cid = score.course_id
where
    course.cname ="物理";
#2.生物课程学生分数
select
    score.student_id,score.num,course.cid
from
    course inner join score on course.cid = score.course_id
where
    course.cname = '生物'
#3.综合拼接
select
    t1.t1_id
from
    (select 
        score.student_id as t1_id,score.num as t1_num,course.cid as t1_cid
    from 
        course inner join score on course.cid = score.course_id
    where 
        course.cname = "物理"
    ) as t1
    inner join(select 
    score.student_id as t2_id,score.num as t2_num,course.cid as t2_cid
    from 
        course inner join score on course.cid = score.course_id
    where 
        course.cname = "生物"
    ) as t2
    on t1.t1_id = t2.t2_id
where
    t1.t1_num > t2.t2_num;


# 9、 查询没有同时选修物理课程和体育课程的学生姓名
#1.找物理和体育的课程id
select
    course.cid
from 
    course
where
    cname ="物理" or cname = "体育"
#2.找学习了体育和物理的学生id
select 
    student_id
from 
    score
where
    course_id in(2,3);
#3.拼接数据
select
    student_id
from 
    score
where
    course_id in(select 
    course.cid
    from 
        course
    where 
        cname = "物理" or cname = "体育"
    );
#4.(同时)学习物理和体育的学生id
select
    student_id
from 
    score
where
    course_id in (select 
    course.cid
    from 
        course
    where 
        cname = "物理" or cname = "体育"
    )
group by
    score.student_id
having
    count(*) = 2;
#5.除了同时学习物理和体育的学生id之外,剩下的都是没有同时学习的id
select
    sid
from 
    student
where
    sid not in (3号)
#6.综合拼接
select
    sid
from 
    student
where
    sid not in (select 
    student_id
    from 
        score
    where 
        course_id in (select 
        course.cid
        from 
            course
        where 
            cname = "物理" or cname = "体育"
    )
group by
    score.student_id
having
    count(*) = 2)

#10、查询挂科超过两门(包括两门)的学生姓名和班级
'''通过查询出来的id,在和其他表进行联表,找出需要中的对应字段展示即可'''
select
    student_id,sname,caption
from 
    score inner join student on student.sid = score.student_id
    inner join class on class.cid = student.class_id
where
    num < 60
group by
    student_id
having
    count(*) >= 2;

# 11、查询选修了所有课程的学生姓名
# 1.先统计所有课程总数
select count(*) from course;
#2.按照学生分类,总数量是1号查询出来的数据,就认为学了所有课
select 
    score.student_id,student.sname
from 
    socre inner join student on score.student_id = student.sid
group by 
    score.student_id
having
    count(*) = (select count(*) from course);
#3.综合拼接
select
    score.student_id,student.sname
from 
    score inner join student on score.student_id = student.sid
group by
    score.student_id
having
    count(*) = (1号);

# 12、查询李平老师教的课程的所有成绩记录
#内联写法
select
    score.student_id,course.cid,course.cname,score.num
from 
    teacher,course,score
where
    teacher.tid = course.teacher_id
and
    score.course_id = course.cid
and
    teacher.tname = '李平';
#1.找李平老师所有课程id
select
    course.cid
from 
    teacher,course
where
    teacher.tid = course.teacher_id
and
    teacher.tname ="李平";
#2.找这几门课程对应的数据
select
    *
from 
    score
where
    course_id in (1号)
#3.综合拼接
select
    *
from 
    score
where
    course_id in (select 
    course.cid
    from 
        teacher,course
    where 
        teacher.tid = course.teacher_id
        and
        teacher.tname = "李平"
    );

#13.查询全部学生都选修了的课程号和课程名
#1.通过score表,找有成绩的学生个数
select 
    count(distinct student_id)
from 
    score
#2.按照课程分类,筛选学生个数为13的课程id(一个学科被13人学习,等于说都选秀了)
select
    course_id
from 
    score
group by
    course_id
having
    count(*) = (1号数据13);
#3.综合拼接
select
    course_id,course.cname
from 
    score,course
where
    score.course_id = course.cid
group by
    course_id
having
    count(*) = (select
    count(distinct student_id)
    from 
        score
    );

#14.查询每门课程被选修的次数
select 
    course_id,count(*)
from 
    score
group by
    course_id;

#15.查询只选修了一门课程的学生学号和姓名
#1.按照学生分类,统计个数是1(选一门)
select
    student_id
from 
    score
group by
    student_id
having
    count(*) = 1;
#2.顺带连一张学生表,通过id拿学生姓名
select
    student_id,student.sname
from 
    score inner join student on score.student_id =student.sid
group by
    student_id
having
    count(*) = 1;

#16.查询所有学生考出的成绩并按从高到低排序(成绩去重)
select
    distinct num
from 
    score
order by
    num desc;

#加上学生形成一一对应的关系
select
    distinct num,student_id
from 
    score
order by
    num desc;

## 17、查询平均成绩大于85的学生姓名和平均成绩
#1.先搜索出学生id
select
    score.student_id,avg(score.num)
from 
    score
group by
    score.student_id
having  
    avg(score.num) > 85;
#2.拿id顺带联一张学生表找出姓名
select
    score.student_id,avg(score.num),student.sname
from 
    score inner join student on student.sid =score.student_id
group by
    score.student_id
having
    avg(score.num) >85;

# 18、查询生物成绩不及格的学生姓名和对应生物分数
select
    student.sname,score.num,course.cname
from 
    course inner join score on score.course_id =course.cid
    inner join student on score.student_id  = student.sid
where
    score.num < 60
and
    course.cname ="生物";

#查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名
#1.找李平老师所教的课程id
select
    course.cid
from 
    teacher,course
where
    teacher.tic =course.teacher_id
and
    teacher.tname = "李平"; #(2,4)
#2.在学习李平老师课程基础上,按照学生分类,找出平均分最高的id
select
    score.student_id
from 
    score
where
    score.course_id in (2,4)
group by
    score.student_id
order by
    avg(num) desc limit 1;
#3.通过学生id,顺带连一张学生表,找出姓名
select
    score.student_id,student.sname,avg(num)
from 
    score,student
where
    score.student_id =student.sid
and
    score,course_id in(2,4)
group by
    score.student_id
order by
    avg(num) desc limit 1;

# 20、查询每门课程成绩最好的学生姓名和分数,课程id
#1.找分数最大值,按照课程分类
select
    course_id,max(num) as max_num
from 
    score
group by
    score.course_id;
#2.找出该分数对应的学生相关数据
select
    *
from 
    score as t1 inner join(1号) as t2 on t1.course_id = t2.course_id
    inner join student t3 on t1.student_id =t3.sid;
#3.数据拼接
select
    t2.max_num,t3.sname,t1.course_id
from 
    score as t1 inner join(select 
    course_id,max(num) as max_num
    from 
        score
    group by 
        score.course_id
    ) as t2 on t1.course_id = t2.course_id
        inner join student t3 on t1.student_id = t3.sid
where
    t2.max_num = t1.num

#21.查询不同课程但成绩相同的,学生号,成绩,课程号
select 
    s1.student_id as s1_sid,
    s2.student_id as s2_sid,
    s1.course_id as s1_cid,
    s2.course_id as s2_cid,
    s1.num as s1_num,
    s2.num as s2_num
from 
    score as s1,
    score as s2
where
    # 不同的课程 (不要使用!= 相同的数据会查两遍,>的一遍,<的一遍)
    s1.course_id > s2.course_id
    and
    s1.num = s2.num


# 24、任课最多的老师中学生单科成绩最高的课程id、学生姓名和分数
# 1.老师任课的最大数量是几门?
select 
    count(*)
from 
    course
group by
    teacher_id
order by 
    count(*) desc limit 1
    
# 2.找最大任课数量为2的老师id
select 
    teacher_id
from 
    course
group by 
    teacher_id
having
    count(*) = (1号)

# 综合拼接
select 
    teacher_id
from 
    course
group by 
    teacher_id
having
    count(*) = (select 
        count(*)
    from 
        course
    group by
        teacher_id
    order by 
        count(*) desc limit 1)

# 3.通过老师id,找对应课程
select cid from course where  teacher_id in (2) # 2,4


# 4.通过该课程号,找其中的最大分数
select 
    course_id,
    max(num) as max_num
from 
    score
where 
    course_id in (3号)
group by
    course_id


# 5.把对应的学生姓名,最大分数拼在一起,做一次单表查询
select
    t1.num,t2.max_num,t3.sid,t3.sname,t1.course_id
from 
    score t1 inner join (4号) t2 on t1.course_id = t2.course_id
    inner join student t3 on t3.sid = t1.student_id
where
    t1.num = t2.max_num


# 综合拼装:

select
    t1.num,t2.max_num,t3.sid,t3.sname,t1.course_id
from 
    score t1 inner join (select 
    course_id,
    max(num) as max_num
from 
    score
where 
    course_id in (select cid from course where  teacher_id in (select 
    teacher_id
from 
    course
group by 
    teacher_id
having
    count(*) = (select 
        count(*)
    from 
        course
    group by
        teacher_id
    order by 
        count(*) desc limit 1)))
group by
    course_id
) t2 on t1.course_id = t2.course_id
    inner join student t3 on t3.sid = t1.student_id
where
    t1.num = t2.max_num

猜你喜欢

转载自www.cnblogs.com/weiweivip666/p/13184067.html