zoukankan      html  css  js  c++  java
  • mysql 习题及解析

    暂时没学过视图

    1.a表外链b表  想成生成一个临时表,在这个表里面可以进行条件判断,筛选操作

    2.不管是外链查询还是同数据对比都需要明确外链主键或者同表主键,通过主键关联表格可以更快组合获取想要的数据

    3.()内可以想成一个表,可以作为where   n  in ()的条件,也可以作为临时表,如需命名可以用()as 名称 使用

    4.avg()等分组后的值的平均数、求和最好进行命名as name 否则会被错误认成函数

    5.第五、八题内容相识,都是对同一表内数据筛选后根据以表内同一学生(非sid、这里同学同时满足两个条件)外链在一起,由此进行筛选

    6、SELECT count(1)  from course 这里count(1)表示计数可以用在where条件中

    7.计算满足条件的某列数据个数:select count(1) from score  where student_id=2;  count 不分组中的使用

    8.select 可以的对象可以是固定值,也可以是固定动态查询语句 :select id,name,1,(select count(1) from tb) 动态筛选   from tb2

    9.group by 在对(例:select  * from table1) 表中运用时,不需要在对该表进行select from(例)的操作,并且此时 * 失效,需要根据group by 的对象进行重新筛选

    10、判断 avg(if(isnull(num),0,num)) 当需要对数据进行操作时,可能存在未null的情况需对数据进行判断

    11.distinct 去重           select count(distinct student_id) from score

    归纳总结: 

     1.建表:

    (1)class

    主键为cid,非空自增,自增初始值为5(这里可以不设置)

    CREATE TABLE `class` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `caption` varchar(32) NOT NULL,
      PRIMARY KEY (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
    

    (2)course

    cid主键非空自增,外键teacher表tid  

    CREATE TABLE `course` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `cname` varchar(32) NOT NULL,
      `teacher_id` int(11) NOT NULL,
      PRIMARY KEY (`cid`),
      KEY `fk_course_teacher` (`teacher_id`),
      CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
    

    (3)student

    CREATE TABLE `student` (
      `sid` int(11) NOT NULL AUTO_INCREMENT,
      `gender` char(1) NOT NULL,
      `class_id` int(11) NOT NULL,
      `sname` varchar(32) NOT NULL,
      PRIMARY KEY (`sid`),
      KEY `fk_class` (`class_id`),
      CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    
    INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');
    

    (4)score  

    CREATE TABLE `score` (
      `sid` int(11) NOT NULL AUTO_INCREMENT,
      `student_id` int(11) NOT NULL,
      `course_id` int(11) NOT NULL,
      `num` int(11) NOT NULL,
      PRIMARY KEY (`sid`),
      KEY `fk_score_student` (`student_id`), --这里是命名
      KEY `fk_score_course` (`course_id`),
      CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
      CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;
    
    INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
    

    (5)teacher

    CREATE TABLE `teacher` (
      `tid` int(11) NOT NULL AUTO_INCREMENT,
      `tname` varchar(32) NOT NULL,
      PRIMARY KEY (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
    

    2.操作查询

    简单查询:

    1.找出num大于60的数据

    select * from score where num>60
    

    2.找出course表中老师任了几门课(分组操作)

    select teacher_id,count(cname)  from course GROUP BY teacher_id 
    

     3.课程表显示老师中文名(连表操作)

    SELECT * from course
    LEFT JOIN teacher on course.teacher_id =teacher.tid;
    

     4.列出学生的信息和班级信息(连表操作)

    SELECT * FROM student  
    LEFT JOIN class on student.class_id=class.cid;
    

     5.student表中男生女生的个数(分组)

    根据gender进行group by ,通过count()进行取数

    select gender,count(gender) from student GROUP BY gender;
    select gender,count(sid) from student GROUP BY gender;
    select gender,count(sname) from student GROUP BY gender;
    select gender,count(1) from student GROUP BY gender;
    

     6.临时表/子查询

    select num,course_id  from (SELECT num,course_id  from score where num>60) as B; 
    

     7.同表中 表名.行名 与 表名.行名对比满足条件保留

    如假设取出score表中 student_id 比oure_id 大的 sid和num

    SELECT sid,num FROM score WHERE score.student_id > score.course_id
    

     操作表查询方法组合 

    1、查询平均成绩大于60分的同学的学号和平均成绩;

     a、查询score表

     b、平均成绩大于60 avg、每个学生应该group by

    SELECT student_id,avg(num) from score GROUP BY student_id having avg(num)>60;
    

     c、在添加条件avg(num)>60

           having avg(num)>60

    SELECT student_id,avg(num) from score GROUP BY student_id HAVING avg(num)>60;
    

    d、 附加:查询满足上面条件的学生的姓名-连表操作

    SELECT * from (SELECT student_id,avg(num) from score GROUP BY student_id HAVING avg(num)>60)as B 
    LEFT JOIN   student on  B.student_id=student.sid;
    

     精确获取student_id  sname,以及avg(num)

    注意这里avg(num)会被误认为函数报错,需要最avg(num)进行命名 

    SELECT B.student_id,student.sname,B.ccc  from (SELECT student_id,avg(num) as ccc from score GROUP BY student_id HAVING avg(num)>60)as B  
    LEFT JOIN   student on  B.student_id=student.sid;
    

     2、查询所有同学的学号、姓名、选课数、总成绩;

    连表查询+分组查询

    连表不用as做临时表 select 是需要的,连表可以理解成一张整表,不过select内部元素时需要带上表名

    select score.student_id,student.sname,count(student_id),sum(num) from score left JOIN student on score.student_id =student.sid GROUP BY score.sid 
    

     

     附加:以sum(num)进行排序

    select score.student_id,student.sname,count(student_id),sum(num) from 
    score left JOIN student on score.student_id =student.sid GROUP BY score.sid  ORDER BY sum(num) asc; 

      

     3.查询姓李的老师个数

    like的用法,count计数count(1)

    select  *  from teacher where teacher.tname like '李%' 
    SELECT count(1) from (select  *  from teacher where teacher.tname like '李%' )as B 
    

    4.查询没学过“李平”老师课的同学的学号、姓名

    思考:这里存在有一个学生选择多门课程的情况,当筛到这么名学生coures_id 不在时依旧会取出student_id,但是实际上这个人是学过的

    所以一定要先考虑是否有student_id重合的情况

    先筛出( 学过的学生id)再获得没学过的学生id,之后获得满足的学号姓名

    a、先查询老师的任课情况,连表查询李平老师任教的课(cid)

    SELECT course.cid from  course left JOIN  teacher on course.teacher_id= teacher.tid where teacher.tname='李平老师'
    

     

     b、查询学过的学生score.student_id

    SELECT student_id from score where course_id in(
    SELECT 
    course.cid 
    from 
    course 
    left JOIN teacher on course.teacher_id= teacher.tid 
    where 
    teacher.tname='李平老师'
    )GROUP BY student_id

    c、再查询student表里student.sid不在已查的sid里的

    select student.sid,student.sname  from student WHERE sid not in (
    SELECT  student_id  from score  where course_id in(
    SELECT 
     course.cid 
    from  
     course 
    left JOIN  teacher on course.teacher_id= teacher.tid 
    where 
     teacher.tname='李平老师'
    )GROUP BY student_id
    )

    5. 查询“生物”课程比“物理”课程成绩高的所有学生的学号

    考察 先链表  分别查询出满足条件的数据,在通过二者间存在唯一主键学生,进行外链,组合后,通过表名.行名的对比返回满足条件的学生学号

    解析:

    a、查询student表中课程是生物的及分数 ,查询student 表中课程是物理的及分数

    SELECT A.student_id FROM (SELECT  score.student_id,score.num,course.cname  from score left JOIN course 
    on course.cid=score.course_id WHERE course.cname='物理')as A LEFT JOIN (SELECT score.student_id,score.num,course.cname from score left JOIN course on course.cid=score.
    course_id WHERE course.cname='生物') as B on A.student_id=B.student_id WHERE A.num<B.num

      

    深化 显示所有学生姓名 

    SELECT C.student_id,student.sname  
    FROM(SELECT A.student_id
    FROM (SELECT score.student_id,score.num,course.cname from score left JOIN course on course.cid=score.
    course_id WHERE course.cname='物理')
    as A LEFT JOIN (SELECT score.student_id,score.num,course.cname from score left JOIN course on course.cid=score.
    course_id WHERE course.cname='生物')
    as B on A.student_id=B.student_id WHERE A.num<B.num) as C LEFT JOIN student on student.sid=C.student_id

     6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

     错误思路:筛选出学过001 and 002的同学,这里and错误,因为表内001与002数据皆为单独存在,不存在单独情况

    正确思路:可以筛出course_id为1或者2的数据,对student_id进行分组,若学生数大于1则筛出学生的学号,并链表查询姓名

    SELECT B.student_id,student.sname from (select * from score where course_id=1 or course_id=2)as B 
    LEFT JOIN student on B.student_id=student.sid GROUP BY B.student_id HAVING count(B.student_id)>1;

    -- 方法二、

    select A.student_id,student.sname from
    (SELECT * from score where course_id =1
    union all
    select * from score where course_id =2) as a
    left join student on student.sid = A.student_id
    GROUP BY a.student_id
    HAVING count(A.student_id)=2 ;

     

     7.查询学过“李平”老师所教的所有课的同学的学号、姓名;

    a、明确查询同学的学号、姓名所在的表,

    b、明确查询条件,查询的老师和对应课程

    c、链表查询

    A.student_id,student.sname from (SELECT cid  FROM score where course_id in(select course.cid  from  course LEFT JOIN teacher on course.teacher_id=teacher.tid  where teacher.tname='李平老师'))as A  
    LEFT JOIN student on A.student_id=student.sid  GROUP BY A.student_id HAVING count(A.student_id)=(select count(course.cid)  from  course LEFT JOIN teacher on course.teacher_id=teacher.tid  where teacher.tname='李平老师')
    

     8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

    同第五题

    SELECT C.student_id,student.sname  FROM
    
    (select A.sid,A.student_id  from (select sid,student_id,num from score where  course_id=2) as A 
    left JOIN
    (select sid,student_id,num from score where  course_id=1)as B 
    on A.student_id =B.student_id where A.num<B.num) as C  LEFT JOIN  student on student.sid=C.student_id
    

      

    9、查询有课程成绩小于60分的同学的学号、姓名;

    a、第一种使用筛选出student表中sid在(筛选score表的student_in)中的数据 

    这里可以 用distinct去重,但是效率不高

      select sid,sname from student where sid in (
            select distinct student_id from score where num < 60
        )
    

    b、第二种先筛选score表中的student—id 再链表查找姓名,group by 去重

    select A.student_id ,student.sname from 
    (SELECT student_id ,num from score where num<60) as A
    LEFT JOIN student
    on student.sid =A.student_id GROUP BY A.student_id  

     

    10.查询没有学全所有课的同学的学号、姓名;

    使用count(1) 或者count(主键) 进行计数

    思路

    a、在分数表中根据学生进行分组,获取每一个学生选课数量

    b、如果数量= 总课程数量,表示 已经选择了所有课程

     
    SELECT A.student_id,student.sname from
    (SELECT student_id,count(student_id) from score GROUP BY student_id  
    HAVING count(student_id)  < (SELECT count(1)  from course ))as A
    left JOIN student
    on student.sid=A.student_id
    

      

    11、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;

    思路:获取001同学选择的所有课程

       获取课程在其中的所有人以及所有课程

       根据学生筛选,获取所有学生信息

       再与学生表连接,获取姓名 

    select  学生id   from    分数表    where    学生id!=1   and   课程id        in   (学号为1的课程id  ) group by 学生id      

    SELECT  A.student_id,student.sname FROM
    (select student_id from score WHERE student_id !=1 and course_id  
    in (select course_id from score where student_id=1) GROUP BY student_id
    )as A LEFT JOIN student on student.sid=A.student_id
    

     12、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;

    a、先筛选出至少有一门课与学号为“001”的同学所学相同的同学的学号

    SELECT student_id,count(1) from score WHERE student_id !=1 and course_id in (SELECT course_id FROM score 
    WHERE student_id =1) GROUP BY student_id;
    

     

     b、由于a里面判断了course_id  in 001同学的courser_id的情况,并且最多只能是3,所以判断count(1)与1同学相等,相等的情况不止有001同学的所有课的情况可能还有别的选课

    SELECT student_id,count(1) from score WHERE student_id !=1 and course_id in (SELECT course_id FROM score 
    WHERE student_id =1) GROUP BY student_id HAVING count(1) =(SELECT count(course_id) FROM score 
    WHERE student_id =1)
    

     13、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;

    获取选课个数相同的学生,

    002学得课程也学过

    select student_id  FROM score WHERE student_id in (
    select student_id from score 
    WHERE student_id !=2
    GROUP BY student_id  HAVING count(1)=(select  count(1) from score  where student_id=2)
    ) and course_id in  (select course_id from score WHERE student_id =2)  GROUP BY student_id HAVING count(1)=(select  count(1) from score  where student_id=2)
    

     

    14、删除学习“李平”老师课的score表记录 

     找到李平老师对应的课,找出courser_id in 李平的课 ,删除

    DELETE  from  score  where  course_id in (select course.cid  from course left JOIN teacher on teacher.tid=course.teacher_id where teacher.tname='李平老师')
    

     

     15、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩

    insert into table() select * from table1 的格式

    select 

      id,

      name,

      1,

      (select count(1) from tb) 动态筛选

    from tb2

    INSERT INTO score(student_id,course_id,num) 
    select student_id ,2, (SELECT AVG(NUM)  from score WHERE course_id =2)  FROM score where course_id !=2
    

      

    16、按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分; 

    a、筛出课程表

    select * 
    from score ; 

    b、在原表基础上进行遍历筛选(测试)

    select   
    student_id,
    (select num  from score as s2 where s2.student_id = s1.student_id and course_id =1) as '语文',
    (select num  from score as s2 where s2.student_id = s1.student_id and course_id =2)as '数学',
    (select num  from score as s2 where s2.student_id = s1.student_id and course_id =3) as '英语'
    
    from score  as s1;

    针对s1表student_id 的条件再对s2每一级的满条件(s2的student_id对应s1的student_id 并满足course_id =某值)的num 进行筛选

     c、针对满足的条件的内容进行筛选

    select sc.student_id,
    (select num from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
    (select num from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
    (select num from score left join course on score.course_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty,
    count(sc.course_id),
    avg(sc.num)
    from score as sc
    group by student_id        
    

    17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 

    group by ,max,min的用法

    select  course_id,max(num) as max_num,min(num) as min_num
    
    from  score GROUP BY course_id
    

    附加:让最低分小于10的显示为0

    case when 条件 then 满足的结果 els 不满足的结果 end

    select  course_id,max(num) as max_num,min(num),case when min(num)<10 then 0 else min(num) end as min_num
    from  score GROUP BY course_id;
    

    18、按各科平均成绩从低到高和及格率的百分数从高到低顺序;

    case   when   then   else     end

    select student_id,course_id,num  from score;
    

    a、 通过case对数据进行清洗,使得小于60的为0 大于60的为1,通过对0,1的计数来获取及格率

    select student_id ,course_id ,num ,case when num <60 then 0 else 1 end as count_num from score
    

    b、 对course_id 进行分组,分组后对num进行avg 求出平均值,对为0为1的数计数求和,以及通过sum(1)对所有数计数求和,为0的数量/sum(1)的数即为及格率

    select course_id ,avg(num) as avg_num ,sum(case when num <60 then 0 else 1 end),sum(1),
    sum(case when num <60 then 0 else 1 end)/sum(1) as pas
    
    from score GROUP BY course_id;
    

     c、按平均分和及格率分别排序

    select course_id ,avg(num) as avg_num ,sum(case when num <60 then 0 else 1 end),sum(1),
    sum(case when num <60 then 0 else 1 end)/sum(1) as p
    
    from score GROUP BY course_id order by avg_num asc,p desc;
    

    19、课程平均分从高到低显示(现实任课老师) 

    三表链表操作,分组后排序

    select avg(if(isnull(score.num),0,score.num)),teacher.tname from course
    left join score on course.cid = score.course_id
    left join teacher on course.teacher_id = teacher.tid
    group by score.course_id
    

     

    20、查询各科成绩前三名的记录:(不考虑成绩并列情况)  

    #order by num desc limit 0,1 表示倒叙排名第一  1.1表示第二

    select 

         sid,

     条件一,

     条件二

    from score

    select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join
     (select
            sid,
            (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
            (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 3,1) as second_num
        from
            score as s1
        ) as T
        on score.sid =T.sid
        where score.num <= T.first_num and score.num >= T.second_num
    

    21、查询每门课程被选修的学生数;  

    SELECT  course_id ,count(student_id) from score GROUP BY course_id;
    SELECT  course_id ,count(1) from score GROUP BY course_id

    22、查询出只选修了一门课程的全部学生的学号和姓名;  

    select * from score;
    select student_id,student.sname from score
    LEFT JOIN student on score.student_id = student.sid
    group by student_id  HAVING count(course_id) =1  

    23、查询男生、女生的人数; 

    group by 

    -- 第一种
    SELECT  gender,count(gender) FROM student GROUP BY gender ;
    
    -- 第二种
    select * from
        (select count(1) as man from student where gender='男') as A ,
        (select count(1) as feman from student where gender='女') as B
    

     24、查询姓“张”的学生名单;

    where like 的用法

    select  *  from student where  student.sname like'张%'

    25、查询同名同姓学生名单,并统计同名人数;  

    select  sname,count(1) from  student GROUP BY sname 
    

     

    26、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;

    group by  ;order by * asc, * desc

    select  course_id,avg(num) from  score GROUP BY course_id order by avg(num) asc ,course_id desc
    

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

    可以先链表后进行group by ,having判断

    注意avg(Num)在链表后A.avg(num)会被误认为函数,请命名

    注意加上判断 avg(if(isnull(num),0,num))

    select A.student_id,student.sname,A.nn from
    (select student_id,avg(if(isnull(num),0,num))as nn from score group by student_id HAVING nn>85) as A 
    left join student 
    on student.sid = A.student_id
    

    28、查询课程名称为“生物”,且分数低于60的学生姓名和分数;

    两次链表,where 条件判断 

    或者 一次查询的临时表作为数据二次筛选

    select student.sname, score.num from score
      left join course on course.cid = score.course_id
      left JOIN studenton student.sid= score.student_id
    where course.cname = '生物' and score.num<60;select *  from score  where num<60 and course_id  =(select cid from course where cname='生物');

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

    一次链表,where a条件 and b条件

    select student_id,student.sname 
    from score 
    left JOIN student on  score.student_id = student.sid
    where score.num>80 and score.course_id=3
    

    30、求选了课程的学生人数  

    select count(distinct student_id) from score;

    select  student_id,count(student_id) from score GROUP BY student_id; 
    select count(c) from ( select count(student_id) as c from score group by student_id) as A

              

    31、查询选修“张磊”老师所授课程的学生中,成绩最高的学生姓名及其成绩

    提取极值信息:order by 后limit取数

    select  *  from score;
    
    select sname,num from score
    left join student on score.student_id = student.sid;
    
    -- 找到张磊老师课程id
    select course.cid from course left join teacher on course.teacher_id = teacher.tid where tname='张磊老师';
    
    -- 找到选了张磊老师课程的学生 select sname,num from score left join student on score.student_id = student.sid where score.course_id in (select course.cid from course left join teacher on course.teacher_id = teacher.tid where tname='张磊老师') order by num desc limit 1;

                

     32、查询各个课程及相应的选修人数;

    SELECT  score.course_id, count(1) 
    from  score left JOIN course on course.cid = score.course_id 
    group by  score.course_id
    

     

    33、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;

     笛卡尔积概念

    SELECT * from score as s1,score as s2;
    
    SELECT * from score as s1,score as s2 where s1.sid !=s2.sid;
    
    
    
    SELECT * from score as s1,score as s2 where s1.sid !=s2.sid  and s1.sid != s2.sid ;
    
    
    select * from score as s1, score as s2 where s1.num = s2.num and s1.course_id != s2.course_id;
    
    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;
    

     

    34、查询每门课程成绩最好的前两名;

    表示前几名,最好的,需要二级筛选,第一是什么,第二是什么

    select *  from score;
    
    
    select
            sid,
            (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
            (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num
        from
            score as s1;

        

    select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join
        (
        select
            sid,
            (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
            (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num
        from
            score as s1
        ) as T
        on score.sid =T.sid
        where score.num <= T.first_num and score.num >= T.second_num
    

      

     35、检索至少选修两门课程的学生学号;

    select student_id from score group by student_id having count(student_id) > 1  

    36、查询全部学生都选修的课程的课程号和课程名; 

    select course_id , count(1)  from  score   GROUP BY course_id having COUNT(1)= (SELECT count(1) from student)
    

    37、查询没学过“叶平”老师讲授的任一门课程的学生姓名;  

    select sid from student where sid not in
    (select student_id from score where course_id in (select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '张磊老师'))

      

    38、查询两门以上不及格课程的同学的学号及其平均成绩 

    select student_id,count(1) from score where num < 60 group by student_id having count(1) > 2
    

    39、检索“004”课程分数小于60,按分数降序排列的同学学号;  

    select student_id from score where num< 60 and course_id = 4 order by num desc;
    

    40、删除“002”同学的“001”课程的成绩; 

    delete from score where course_id = 1 and student_id = 2
    

      

  • 相关阅读:
    TL 重构
    eclipse中使用Lombok
    一个成功的 Git 分支模型
    《重构,改善既有代码的设计》读书笔记
    重构——改善既有代码的设计
    安装Mysql5.7并修改初始密码
    支付宝支付-PC电脑网站支付
    sqlite3 线程模型
    sqlite 常用的一些语句
    Electron 入门第一篇
  • 原文地址:https://www.cnblogs.com/yescarf/p/14024211.html
Copyright © 2011-2022 走看看