zoukankan      html  css  js  c++  java
  • sql数据库查询



    mysql练习题:https://www.cnblogs.com/majj/articles/8946156.html

    练习题答案:https://www.cnblogs.com/majj/articles/9167308.html

    -- 2
    
    select A.student_id,A.num as 生物,B.num as 物理 from 
    (select student_id,num,cname from score left join course on course_id = cid where cname = '生物') as A
    left join
    (select student_id,num,cname from score left join course on course_id = cid where cname = '物理') as B
    on A.student_id = B.student_id  where A.num > if(isnull(B.num),0,B.num )
    
    
    
    -- 3
    -- select student_id as 学号,avg(num) as 平均成绩 from score group by  student_id having avg(num) >60;
    
    -- 4
    
    有问题的代码,不知道什么问题
    select student_id,count(course_id),group_concat(sname) from 
    (select * from score left join student on score.student_id = student.sid) as A
    group by A.student_id
    
     正确代码
    select student_id,sname,课程数,总成绩 from 
    (select student_id,count(course_id) as 课程数,sum(num) as 总成绩 from score group by student_id) as A 
    left join 
    student on A.student_id = student.sid
    
    
    -- 5
    -- select count(tid) from teacher where tname like '李%'
    
    
    -- 6
    
    select student_id,GROUP_CONCAT(DISTINCT sname),GROUP_CONCAT(DISTINCT tname)  from
    (select * from
    	(select student_id,course_id,num,sname from score left join student on score.student_id = student.sid) as A
    	left join
    	course on A.course_id = course.cid) 
    as B
    left join 
    teacher on B.teacher_id = teacher.tid  group by student_id  HAVING  not FIND_IN_SET('李平老师',GROUP_CONCAT(DISTINCT tname));
    
    
    
    -- 7
    
    select student_id,sname from 
    (select student_id,GROUP_CONCAT(course_id) as group_course from score  group by student_id HAVING FIND_IN_SET(1,group_course) and  FIND_IN_SET(2,group_course)) as A
    left JOIN
    student on A.student_id = student.sid
    
    
    
    
    -- 8
    --  
    方法1,有问题,不能自己写李平的课程是2 4
    select  student_id,GROUP_CONCAT(DISTINCT sname),GROUP_CONCAT( tname),GROUP_CONCAT( DISTINCT course_id) from
    (select * from
    	(select student_id,course_id,num,sname from score left join student on score.student_id = student.sid) as A
    	left join
    	course on A.course_id = course.cid) 
    as B
    left join 
    teacher on B.teacher_id = teacher.tid  group by student_id  HAVING  FIND_IN_SET('2',GROUP_CONCAT(DISTINCT course_id)) and FIND_IN_SET('4',GROUP_CONCAT(DISTINCT course_id))
    
    
    
    
    
     方法2
    SELECT * from
    (select student_id,GROUP_CONCAT(course_id ORDER BY course_id ASC) as course_student,GROUP_CONCAT(DISTINCT sname),GROUP_CONCAT(DISTINCT tname) as tname   from
    (select * from
    	(select student_id,course_id,num,sname from score left join student on score.student_id = student.sid) as A
    	left join
    	course on A.course_id = course.cid) 
    as B
    left join 
    teacher
    on B.teacher_id = teacher.tid  WHERE tname = '李平老师'  GROUP BY student_id) as C
    left JOIN
    (select tname,GROUP_CONCAT(cid ORDER BY cid ASC) as course_teacher from course INNER JOIN teacher on course.teacher_id = teacher.tid where tname = '李平老师' GROUP BY tname) as D
    on C.tname = D.tname  WHERE course_student = course_teacher
    
    
    
    
    
     方法3
    select score.student_id,student.sname,count(score.course_id) as 选课总数,GROUP_CONCAT(DISTINCT tc2_tw) as 讲课总数 from 
    score inner join student 
    		inner join
    	(select teacher.tname as tc2_tn,course.cid as tc2_tcid,tc.td as tc2_tw from course inner join teacher inner join
    		(select teacher.tname as tn,count(course.cid) as td from course inner join teacher on course.teacher_id = teacher.tid group by tn having tn='李平老师') as tc
    	 on course.teacher_id = teacher.tid and tc.tn = teacher.tname)
    	as tc2
    	on score.course_id = tc2.tc2_tcid and score.student_id = student.sid 
    group by score.student_id  HAVING  选课总数 = 讲课总数
    
     方法三拆分1
    李平老师教的课程数
    select teacher.tname as tn,count(course.cid) as td from 
    course 
    inner join 
    teacher on course.teacher_id = teacher.tid group by tn having tn='李平老师' and tc.tn = teacher.tname
    
    
    方法三拆分2
    李平老师教的课程号和课程数
    select teacher.tname as tc2_tn, course.cid as tc2_tcid, tc.td as tc2_tw from 
    		course inner join teacher inner join
    		(select teacher.tname as tn,count(course.cid) as td from course inner join teacher on course.teacher_id = teacher.tid group by tn having tn='李平老师') as tc
    	 on course.teacher_id = teacher.tid and tc.tn = teacher.tname
    
    
    
    
    -- 9
    
    select student_id,sname from 
    (select A.student_id  from
    (SELECT * from score where course_id = 1) as A
    left JOIN
    (SELECT * from score where course_id = 2) as B
    on A.student_id = B.student_id where A.num > B.num) 
    as C
    left JOIN
    student on C.student_id = student.sid
    
    
    
    -- 10
    SELECT student_id,sname from
    (select student_id from score where num <60 GROUP BY student_id) as A
    left JOIN
    student
    on A.student_id = student.sid
    
    
    
    -- 11
    
    select student_id,sname from
    (select * from 
    (SELECT student_id,GROUP_CONCAT(course_id ORDER BY course_id) as 选的课程 from score GROUP BY student_id) as A
    inner JOIN
    (select GROUP_CONCAT(cid ORDER BY cid ASC) as 全部课程 from course) as B
    where 选的课程 != 全部课程) as C
    left JOIN
    student  on C.student_id = student.sid
    
    
    -- 12
     有问题的代码
    SELECT score.student_id from
    (select student_id,GROUP_CONCAT(course_id)as a  from score GROUP BY student_id HAVING student_id = 1) as A
    inner JOIN
    score where course_id in (1,2,4)  GROUP BY score.student_id
    -- 这里的a 是字符串 ,而in方法只能用列表,mysql 又不能将字符串转化为列表,不得不说这个mysql是真难用
    -- where a = '1,2,4' 
    -- where course_id in (1,2,4)
    
    
    
    SELECT student_id,sname from
    (SELECT student_id  from
    (select course_id as A_course from score where student_id = 1) as A
    inner JOIN
    score where course_id = A_course GROUP BY student_id) as B
    LEFT JOIN
    student
    on B.student_id = student.sid 
    
    
    
    -- 13
     不知道是不是审题错了,和12题基本一样
    SELECT student_id,sname from
    (SELECT student_id  from
    (select course_id as A_course from score where student_id = 1) as A
    inner JOIN
    score where course_id = A_course GROUP BY student_id) as B
    LEFT JOIN
    student
    on B.student_id = student.sid where student_id !=1
    
    
    
    
    -- 14
    
    SELECT student_id,sname from
    (SELECT student_id from
    (select student_id as a_id, GROUP_CONCAT(course_id ORDER BY course_id ASC)as a  from score GROUP BY student_id HAVING student_id = 2) as A
    inner JOIN
    (select student_id,GROUP_CONCAT(course_id ORDER BY course_id ASC) as b from score GROUP BY student_id) as B
    where a = b and student_id != 2)
    as C
    LEFT JOIN
    student
    on C.student_id = student.sid
    
    
    
    -- 15
    不知道这样写为什么不行,难道是主键不能删除
    delete  from score where sid in
    (select sid from score
    left join
    (select * from course left join teacher on course.teacher_id = teacher.tid) as A
    on score.course_id = A.cid
    where tname = '李平老师')
    
    
    
    delete from score where course_id in 
     ( select cid from course left join teacher on course.teacher_id = teacher.tid where teacher.tname = '李平老师' )
       
    
    
    -- 16
    
    INSERT into score(student_id,course_id,num) 
    SELECT student_id,2,AVG(num) from score 
    where student_id not in 
    (select student_id from score where course_id = 2)
    GROUP BY student_id
    
    
    -- insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2)
    --     from student where sid not in (
    --         select student_id from score where course_id = 2
    --     )
    
    -- 17
    
    select A.student_id as 学号,生物,物理,体育,美术,平均分  from
    (select student_id,num as 生物 from score
    inner JOIN
    course on score.course_id = course.cid  where cname = '生物') as A
    inner JOIN
    (select student_id,num as 物理 from score
    inner JOIN
    course on score.course_id = course.cid  where cname = '物理') as B
    inner join
    (select student_id,num as 体育 from score
    inner JOIN
    course on score.course_id = course.cid  where cname = '体育') as C
    inner join 
    (select student_id,num as 美术 from score
    inner JOIN
    course on score.course_id = course.cid  where cname = '美术') as D
    inner join
    (select student_id,AVG(num) as 平均分 from score GROUP BY student_id) as E
    
    on A.student_id = B.student_id and A.student_id = C.student_id and A.student_id = D.student_id and A.student_id = E.student_id ORDER BY 平均分 ASC
    
    
    
    
    -- 18
    -- select course_id,max(num),min(num) from score group by course_id
    
    
    -- 19
    
    SELECT C.course_id,平均分,及格率 from
    (select course_id,avg(num) as 平均分,GROUP_CONCAT(num) from score group by course_id) as C
    LEFT JOIN
    (select A.course_id,及格, 总数,及格/总数 as 及格率 from
    (SELECT course_id,count(num) as 及格 from score where num >=60 GROUP BY course_id) as A
    left JOIN
    (SELECT course_id,count(num) as 总数 from score GROUP BY course_id) as B
    on A.course_id = B.course_id) as D
    on C.course_id = D.course_id  ORDER BY 平均分 ASC, 及格率 DESC
    
    
    
    -- 20
    
    select 平均分,tname from 
    (select course_id,avg(num) as 平均分 from score GROUP BY course_id ORDER BY 平均分 DESC  ) as A
    LEFT JOIN
    (select * from course LEFT JOIN teacher on course.teacher_id = teacher.tid ) as B
    on A.course_id = B.cid ORDER BY 平均分 DESC
    
    
    
    -- 21
    -- 还没做出来,有问题
    --  select course_id,GROUP_CONCAT(num),GROUP_CONCAT(student_id ORDER BY num DESC ) from score GROUP BY course_id
    
    -- 22 
    -- select course_id,COUNT(student_id) from score GROUP BY course_id
    
    -- 23
    
    select A.student_id,sname from 
    (select student_id from score GROUP BY student_id  HAVING count(course_id) = 1) as A
    LEFT JOIN
    student
    on A.student_id = student.sid
    
    
    
    
    -- 24
     方法一
    select * from
    (select count(1) as man from student  where gender = '男') as A,
    (select count(1) as feman from student  where gender = '女') as B
    
    -- 方法二 
    -- select gender,count(1) from student group by gender
    
    
    -- 25
    -- select * from student where sname like '张%'
    
    
    -- 26
    -- select sname,count(1) from student GROUP BY sname 
    
    
    -- 27
    -- select course_id,avg(if(isnull(num), 0 ,num)) as avg  from score GROUP BY course_id ORDER BY avg ASC,course_id DESC
    
    
    -- 28
    
    SELECT student_id,sname,avg from
    (select student_id,avg(if(isnull(num),0,num)) as avg from score GROUP BY student_id HAVING avg > 85) as A
    LEFT JOIN
    student on A.student_id = student.sid
    
    
    
    -- 29
    
    select student_id,sname,num from
    (select * from 
    score left JOIN
    course on score.course_id = course.cid where cname = '生物' and num < 60) as A
    left join student on A.student_id = student.sid
    
    
    
    -- 30
    
    SELECT A.student_id,sname from
    (select student_id from score where course_id = 3 and num >80) as A
    LEFT JOIN
    student on A.student_id = student.sid
    
    
    
    -- 31
    
    select count(1) from
    (select student_id,count(1) from score  GROUP BY student_id) as A
    
    
    
    -- 32
    
    select student_id,sname from 
    (select student_id,num from 
    (select * from score 
    LEFT JOIN
    course on score.course_id = course.cid) as A
    LEFT JOIN
    teacher on A.teacher_id = teacher.tid where tname = '刘海燕老师' ORDER BY num desc LIMIT 1) as B
    LEFT JOIN
    student on B.student_id = student.sid
    
    
    
    -- 33
    
    select cname,count  from 
    (select course_id,count(1) as count from score GROUP BY course_id) as A
    left join 
    course on A.course_id = course.cid
    
    
    
    -- 34
    -- select DISTINCT s1.course_id,s2.course_id,s1.num,s2.num from score as s1, score as s2 where s1.num = s2.num and s1.course_id != s2.course_id;
    
    
    -- 35
    --  有问题
    -- select course_id,GROUP_CONCAT(sid ORDER BY num desc) from score GROUP BY course_id 
    
    -- 36
    -- select student_id from score GROUP BY student_id HAVING count(course_id) > 1
    
    
    -- 37
    
    select course_id,GROUP_CONCAT(student_id ORDER BY student_id) as st from score GROUP BY course_id
     HAVING st=
    (select GROUP_CONCAT( DISTINCT student_id ORDER BY student_id) from score )
    
    
    
    
    
    -- 38
    
    SELECT A.student_id,sname from 
    (select * from score where student_id not in
    (select DISTINCT student_id from score
    INNER JOIN
    course
    INNER JOIN
    teacher on score.course_id = course.cid AND course.teacher_id = teacher.tid  WHERE tname = '李平老师')
    ) as A
    LEFT JOIN
    student on A.student_id = student.sid
    
    
    
    
    -- 39
    
    select A.student_id,avg from 
    (select student_id ,count(1) as count from score  where num<60  GROUP BY student_id HAVING count >1) as A
    LEFT JOIN
    (select student_id,avg(num) as avg from score GROUP BY student_id) as B 
    on A.student_id = B.student_id
    
    
    -- 40
    -- SELECT student_id from score where course_id= 4 and num < 60 ORDER BY num desc 
    
    -- 41
    -- delete from score where course_id = 1 and student_id = 2
    
    
    
    21 35题 一个问题,没有解决,没做出来
    

      

  • 相关阅读:
    PyQt5 控件学习(一个一个学习之QCommandLinkButton)
    多任务--线程
    PyQt5 控件学习(一个一个学习之QPushButton)
    PyQt5 控件学习(一个一个学习之QAbstractButton)
    再测我心中的事
    花了两天时间,整理了代码,封装了逻辑
    我现在发现,我写代码有严重的问题
    2014年8月2日0时13分22秒
    2014年8月2日15时13分4秒
    交警与货车司机
  • 原文地址:https://www.cnblogs.com/perfey/p/9902215.html
Copyright © 2011-2022 走看看