美文网首页
MySQL 部分习题 & 答案

MySQL 部分习题 & 答案

作者: 嫩牛_软件测试_笔记 | 来源:发表于2018-12-05 11:01 被阅读0次
*   创建数据库表数据

    *   use test;
    *   CREATE TABLE test.Student(Sid VARCHAR(10),Sname VARCHAR(10),Sage DATETIME,Ssex NVARCHAR(10));
    *   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' , '女');
    *   CREATE TABLE test.Course(Cid VARCHAR(10),Cname VARCHAR(10),Tid VARCHAR(10));
    *   INSERT INTO Course VALUES('01' , '语文' , '02');
    *   INSERT INTO Course VALUES('02' , '数学' , '01');
    *   INSERT INTO Course VALUES('03' , '英语' , '03');
    *   CREATE TABLE test.Teacher(Tid VARCHAR(10),Tname VARCHAR(10));
    *   INSERT INTO Teacher VALUES('01' , '张三');
    *   INSERT INTO Teacher VALUES('02' , '李四');
    *   INSERT INTO Teacher VALUES('03' , '王五');
    *   CREATE TABLE test.SC(Sid VARCHAR(10),Cid VARCHAR(10),score DECIMAL(18,1));
    *   INSERT INTO SC VALUES('01' , '01' , 80);
    *   INSERT INTO SC VALUES('01' , '02' , 90);
    *   INSERT INTO SC VALUES('01' , '03' , 99);
    *   INSERT INTO SC VALUES('02' , '01' , 70);
    *   INSERT INTO SC VALUES('02' , '02' , 60);
    *   INSERT INTO SC VALUES('02' , '03' , 80);
    *   INSERT INTO SC VALUES('03' , '01' , 80);
    *   INSERT INTO SC VALUES('03' , '02' , 80);
    *   INSERT INTO SC VALUES('03' , '03' , 80);
    *   INSERT INTO SC VALUES('04' , '01' , 50);
    *   INSERT INTO SC VALUES('04' , '02' , 30);
    *   INSERT INTO SC VALUES('04' , '03' , 20);
    *   INSERT INTO SC VALUES('05' , '01' , 76);
    *   INSERT INTO SC VALUES('05' , '02' , 87);
    *   INSERT INTO SC VALUES('06' , '01' , 31);
    *   INSERT INTO SC VALUES('06' , '03' , 34);
    *   INSERT INTO SC VALUES('07' , '02' , 89);
    *   INSERT INTO SC VALUES('07' , '03' , 98);
*   Q&A
    *   Questions
        *   0、查询sc表中,平均成绩,行号显示出来
        *   1、查询“01”课程比“02”课程成绩高的所有学生的学号;
        *   2、查询平均成绩大于60 分的同学的学号和平均成绩;
        *   3、查询所有同学的学号、姓名、选课数、总成绩;
        *   4、查询姓“张”的老师的个数;
        *   5、查询没学过“张三”老师课的同学的8学号、姓名;
        *   6、查询学过“01”并且也学过编号“02”课程的同学的学号、姓名;
        *   7、查询学过“张三”老师所教的所有课的同学的学号、姓名;
        *   8、查询课程编号“02”的成绩比课程编号“01”课程低的所有同学的学号、姓名;
        *   9、查询所有课程成绩小于60 分的同学的学号、姓名;
        *   10、查询没有学全所有课的同学的学号、姓名;
        *   11、查询至少有一门课与学号为“01”的同学所学相同的同学的学号和姓名;
        *   12、查询至少学过学号为“01”同学所有课程中的一门课的其他同学学号和姓名;
        *   13、把“SC”表中“张三”老师教的课的成绩都更改为此课程的平均成绩;
        *   14、查询和“01”号的同学学习的课程相同的其他同学学号和姓名;
        *   15、删除学习“张三”老师课的SC 表记录;
        *   16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“02”课程的同学学号、“02”课程的平均成绩;
        *   17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
        *   18、按各科平均成绩从低到高和及格率的百分数从高到低顺序
        *   19、查询不同老师所教不同课程平均分从高到低显示
        *   20、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
        *   21、查询各科成绩前三名的记录:(不考虑成绩并列情况)
        *   22、查询每门课程被选修的学生数
        *   23、查询出只选修了一门课程的全部学生的学号和姓名
        *   24、查询男生、女生人数
        *   25、查询姓“孙”的学生名单
        *   26、查询同名同性学生名单,并统计其人数
        *   27、1991 年出生的学生名单(注:Student 表中Sage 列的类型是number)
        *   28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
        *   29、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩
        *   30、查询课程名称为“数学”,且分数低于60 的学生姓名和分数
        *   31、查询所有学生的选课情况;
        *   32、查询任何一门课程成绩在70 分以上的姓名、课程名称和分数;
        *   33、查询不及格的课程,并按课程号从大到小排列
        *   34、查询课程编号为'01' 且课程成绩在75 分以上的学生的学号和姓名;
        *   35、求选了课程的学生人数
        *   36、查询选修“张三”老师所授课程的学生中,成绩最高的学生姓名及其成绩
        *   37、查询各个课程及相应的选修人数
        *   38、查询不同课程成绩相同的学生的姓名
        *   39、查询每门功课成绩最好的前两名
        *   40、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列41、检索至少选修两门课程的学生学号
        *   42、查询全部学生都选修的课程的课程号和课程名
        *   43、查询没学过“张三”老师讲授的任一门课程的学生姓名
        *   44、查询两门以上不及格课程的同学的学号及其平均成绩
        *   45、检索“03”课程分数小于60,按分数降序排列的同学学号
        *   46、删除“02”同学的“01”课程的成绩   
    *   Answsers
        *   0\. 数据来源:SC表
            *   SELECT c.sid,c.aa,(@rowNum:=@rowNum+1) AS rowNo
            *   FROM
            *   (SELECT sid,AVG(score)aa FROM sc GROUP BY sid ORDER BY aa DESC)c,
            *   (SELECT (@rowNum:=0))b;
        *   1.  数据来源:SC表
        *   SELECT a.sid FROM
        *   (SELECT * FROM sc WHERE cid='01') a,
        *   (SELECT * FROM sc WHERE cid='02') b
        *   WHERE a.sid=b.sid AND a.score > b.score;
        *   2\. 数据来源:SC表
        *   SQL1: (按照:平均分 = 总分/已考试的科目数 计算)
            *   select sc.sid,avg(sc.score) ss
            *   from sc
            *   group by sc.sid
            *   having ss > 60 ;
        *   SQL2: (按照:平均分 = 总分/总的科目数 计算)
            *   SELECT c.sid,SUM(c.score)/(SELECT COUNT(*) FROM test.course) AS ss
            *   FROM test.SC c
            *   GROUP BY c.sid
            *   HAVING ss > 60;
        *   3\. 数据来源:SC & Student
        *   SELECT s.sid,s.sname,[b.cc](http://b.cc),b.ss
        *   FROM student s LEFT JOIN (SELECTsid,COUNT(cid)cc,SUM(sc
        *   ore)ss FROM sc GROUP BY sid)b
        *   ON s.sid=b.sid;
        *   4\. 数据来源:Teacher
        *   SELECT COUNT(*) FROM teacher WHERE Tname LIKE ‘张%';
        *   5.数据来源:Teacher,Course,Sc, Student 
        *   SELECT sid,sname FROM student
        *   WHERE sid NOT IN (SELECT sc.sid
        *   FROM sc,(SELECT c.cid
        *   FROM course c,(SELECT tid FROM teacher WHERE tname = '张三')a
        *   WHERE c.tid = a.tid)b
        *   WHERE sc.cid = b.cid);
        *   6.
        *   SELECT s.sid,s.sname
        *   FROM student s,
        *   (SELECT a.sid FROM
        *   (SELECT sid,cid FROM sc WHERE cid='01')a,
        *   (SELECT sid,cid FROM sc WHERE cid='02')b WHERE a.sid=b.sid)c
        *   WHERE s.sid=c.sid;
        *   7.
        *   SELECT st.sid,st.sname FROM student st JOIN sc ON st.sid=sc.sid
        *   JOIN course c ON sc.cid=c.cid
        *   JOIN teacher t ON c.tid=t.tid
        *   WHERE t.tname='张三' ;
        *   8.
        *   SELECT st.sid,st.sname
        *   FROM student st JOIN
        *   (SELECT a.sid esid FROM
        *   (SELECT * FROM sc WHERE cid='01') a,
        *   (SELECT * FROM sc WHERE cid='02') b
        *   WHERE a.sid=b.sid AND a.score > b.score)e
        *   ON st.sid = e.esid ;
        *   9.
        *   SELECT DISTINCT st.sid,st.sname
        *   FROM student st
        *   JOIN sc ON st.sid=sc.sid
        *   JOIN course c ON sc.cid=c.cid
        *   WHERE sc.score <60 ;
        *   10.
        *   SELECT sid,sname FROM student WHERE sid NOT IN
        *   (SELECT a.sid FROM
        *   (SELECT sid,COUNT(cid)cc FROM sc GROUP BY sid)a,
        *   (SELECT COUNT(cid)bb FROM course)b
        *   WHERE [a.cc](http://a.cc)=b.bb)
        *   11.
        *   selectst.sid,st.sname fromstudent st,
        *   (select distinct a.sid from
        *   (select * from sc) a,
        *   (select * from sc where sc.sid='01') b
        *   where a.cid=b.cid) h
        *   where st.sid=h.sid and st.sid<>'01';
        *   12.
        *   selectst.sid,st.sname
        *   from student st,
        *   (select distinct sc.sid psid from sc
        *   left join student st
        *   on st.sid=sc.sid
        *   where sc.sid<>'01'
        *   and sc.cid in
        *   (select cid from sc
        *   where sid='01'))p
        *   where st.sid=p.psid;
        *   13.
        *   1> MSSQL中可以用此方法,但是MYSQL中却不行
        *   update sc
        *   set sc.score = (select avg(sc.score) from sc where sc.cid=
        *   (select a.Cid from course a,teacher b where a.Tid=b.Tid and b.tname='张三'))
        *   where sc.cid = (select a.Cid from course a,teacher b where a.T=b.T and b.tname='张三');
        *   2>MYSQL中Update中有select子查询,必须innerjoin才可以.
        *   update sc
        *   inner join (select avg(sc.score)av from sc where sc.cid=
        *   (select a.cid from course a,teacher b where a.Tid=b.Tid and b.tname='张三'))A set sc.score = A.av
        *   where sc.cid = (select a.cid from course a,teacher b where a.Tid=b.Tid and b.tname='张三');
        *   14.
        *   select st.sid,st.sname from student st,sc
        *   where st.sid=sc.sid
        *   and sc.cid in (select sc.cid from sc where sc.sid='01') and sc.sid<>'01'
        *   group by st.sid,st.sname
        *   having count(*)=(select count(*) from sc where sid='01');
        *   15.
        *   delete from sc where sc.cid in (select cid from course c join (select tid from teacher where tname = '张三')d on c.tid=d.tid);
        *   16.
        *   INSERT INTO sc(sid,cid,score)
        *   SELECT DISTINCT st.sid,sc.cid,(SELECT AVG(score)FROM sc WHEREcid='02')
        *   FROM student st,sc
        *   WHERE NOT EXISTS
        *   (SELECT * FROM sc WHERE cid='02' AND sc.sid=st.sid)
        *   AND sc.cid='02' ;
        *   17.
        *   SELECT cid ,MAX(score),MIN(score) FROM sc GROUP BY cid;
        *   18.
        *   SELECT B.CID,B.A,Z.P
        *   FROM (SELECT cid,AVG(score)a FROM sc GROUP BY cid)B,
        *   (SELECT y.cid e,x.b/y.c p FROM
        *   (SELECT cid,COUNT(*)c FROM sc GROUP BY cid)Y,
        *   (SELECT cid,COUNT(*)b FROM sc WHERE score>=60 GROUP BYcid)X
        *   WHERE x.cid=y.cid)Z
        *   WHERE B.CID=z.e
        *   ORDER BY B.A ASC,Z.P DESC;
        *   或者:
        *   SELECT cid,AVG(score) a,SUM(CASE WHEN score>=60 THEN 1ELSE 0 END)/COUNT(*) AS p FROM sc GROUP BY cid
        *   ORDER BY a ASC, p DESC ;
        *   19.
        *   SELECT
        *   t.tid,
        *   t.tname,
        *   c.cid,
        *   c.cname,
        *   AVG(score)a
        *   FROM
        *   sc,
        *   course c,
        *   teacher t
        *   WHERE sc.cid = c.cid
        *   AND c.tid = t.tid
        *   GROUP BY c.cid
        *   ORDER BY a DESC ;
        *   20.
        *   SELECT C.Cid,c.Cname,D.Y "[100-85]",D.U "[85-70]",D.I"[70-60]",D.O "[<60]"
        *   FROM COURSE C JOIN
        *   (SELECT sc.Cid E,
        *   SUM(CASE WHEN sc.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END)AS Y,
        *   SUM(CASE WHEN sc.score BETWEEN 70 AND 85 THEN 1 ELSE 0 END)AS U,
        *   SUM(CASE WHEN sc.score BETWEEN 60 AND 70 THEN 1 ELSE 0 END)AS I,
        *   SUM(CASE WHEN sc.score <60 THEN 1 ELSE 0 END) AS O
        *   FROM sc
        *   GROUP BY sc.cid)D
        *   ON C.Cid=D.E ;
        *   21.
        *   SELECT a.* FROM sc a
        *   WHERE 3 > (SELECT COUNT(*) FROM sc WHERE cid = a.cid ANDscore > a.score )
        *   ORDER BY a.cid,a.score DESC;
        *   Oracle:SELECT * FROM
        *   (SELECT sid,cid,score,row_number()over(PARTITION BY cid ORDERBY score DESC) rn FROM sc)
        *   WHERE rn<4 ;
        *   22.
        *   SELECT cid,COUNT(sid) FROM sc GROUP BY cid;
        *   23.
        *   SELECT s.sid,s.sname
        *   FROM student s,
        *   (SELECT sid,COUNT(cid)cc FROM sc GROUP BY sid)a
        *   WHERE s.sid=a.sid AND a.cc=1;
        *   24.
        *   SELECT ssex,COUNT(*) FROM student GROUP BY ssex ;
        *   25.
        *   SELECT * FROM student WHERE sname LIKE '孙%';
        *   26.
        *   SELECT sname,ssex,COUNT(*)FROM student
        *   GROUP BY sname,ssex HAVING COUNT(*)>1;
        *   27.
        *   MySQL日期格式:
        *   SELECT DATE_FORMAT('2008-08-08 22:23:01', '%Y%m%d%H%i%s');
        *   SELECT * FROM student
        *   WHERE DATE_FORMAT(sage,'%Y')=1991
        *   28.
        *   SELECT cid,AVG(score)a FROM sc GROUP BY cid
        *   ORDER BY a ASC,cid DESC;
        *   29.
        *   SELECT st.sid,st.sname,AVG(score) FROM student st
        *   LEFT JOIN sc
        *   ON sc.sid=st.sid
        *   GROUP BY st.sid,st.sname HAVING AVG(score)>85;
        *   或:
        *   SELECT s.sid,s.sname,b.a
        *   FROM student s,
        *   (SELECT sid,AVG(score)a FROM sc GROUP BY sid)b
        *   WHERE s.sid = b.sid AND b.a>85;
        *   30.
        *   SELECT x.xsname,sc.score
        *   FROM (SELECT st.sid xsid,st.sname xsname
        *   FROM student st WHERE st.sid NOT IN
        *   (SELECT sc.sid
        *   FROM sc,
        *   (SELECT cid FROM course WHERE cname='数学')a
        *   WHERE
        *   sc.cid=a.cid
        *   AND sc.score>=60))X
        *   LEFT JOIN sc
        *   ON sc.sid=x.xsid
        *   AND sc.cid IN
        *   (SELECT cid FROM course WHERE cname='数学') ;
        *   31.
        *   SELECT st.sid,st.sname,c.cname FROM student st,sc,course c
        *   WHERE sc.sid=st.sid AND sc.cid=c.cid;
        *   32.
        *   select st.sname,c.cname,sc.score from student st,sc,course cwhere sc.sid=st.sid and sc.cid=c.cid and sc.score>70
        *   33.
        *   SELECT sc.sid,c.cname,sc.score FROM sc,course c
        *   WHERE sc.cid=c.cid AND sc.score<60 ORDER BY sc.cid DESC;
        *   34.
        *   SELECT st.sid,st.sname,sc.score FROM sc,student st
        *   WHERE sc.sid=st.sid AND cid='01' AND score>75;
        *   35.
        *   SELECT COUNT(DISTINCT sid) FROM sc;
        *   36.
        *   SELECT st.sname,score FROM student st,sc ,course c,teacher t
        *   WHERE
        *   st.sid=sc.sid AND sc.cid=c.cid AND c.tid=t.tid
        *   AND t.tname='张三' AND sc.score=
        *   (SELECT MAX(score)FROM sc WHERE sc.cid=c.cid) ;
        *   37.
        *   SELECT cid,COUNT(sid) FROM sc GROUP BY cid;
        *   38.
        *   SELECT st.Sname,bb.cid,bb.score
        *   FROM student st,
        *   (SELECT aa.sid,aa.cid,aa.score
        *   FROM
        *   (SELECT DISTINCT a.* FROM sc a ,sc b
        *   WHERE a.score=b.score
        *   AND a.cid<>b.cid)aa)bb
        *   WHERE st.sid = bb.sid ;
        *   39.
        *   SELECT a.* FROM sc a
        *   WHERE 2 > (SELECT COUNT(*) FROM sc WHERE cid = a.cid ANDscore > a.score )
        *   ORDER BY a.cid,a.score DESC;
        *   40.
        *   SELECT cid,COUNT(sid) FROM sc GROUP BY cid
        *   HAVING COUNT(sid)>5
        *   ORDER BY COUNT(sid) DESC,cid ASC;
        *   41.
        *   SELECT sid,COUNT(cid) FROM sc GROUP BY sid
        *   HAVING COUNT(cid)>=2;
        *   42.
        *   select distinct(c.cid),c.cname from course c ,scwhere sc.cid=c.cid
        *   43.
        *   SELECT st.sname FROM student st
        *   WHERE st.sid NOT IN
        *   (SELECT DISTINCT sc.sid FROM sc,course c,teacher t
        *   WHERE sc.cid=c.cid AND c.tid=t.tid AND t.tname='张三') ;
        *   44.
        *   SELECT sid,AVG(score)FROM sc
        *   WHERE sid IN
        *   (SELECT sid FROM sc WHERE sc.score<60
        *   GROUP BY sid HAVING COUNT(cid)>1) GROUP BY sid ;
        *   45.
        *   SELECT SID
        *   FROM SC
        *   WHERE CID='03' AND SCORE<60
        *   ORDER BY SCORE DESC;
        *   46.
        *   DELETE FROM sc WHERE sid='02' AND cid='01' ;
*   查询每门课前三名
    *   创建数据库表数据
        *   create table ttt (
        *   id int primary key,
        *   gid    char,
        *   col1    int,
        *   score    int
        *   );

        *   insert into ttt values
        *   (1,'A',31,6),
        *   (2,'B',25,83),
        *   (3,'C',76,21),
        *   (4,'D',63,56),
        *   (5,'E',3,17),
        *   (6,'A',29,97),
        *   (7,'B',88,63),
        *   (8,'C',16,22),
        *   (9,'D',25,43),
        *   (10,'E',45,28),
        *   (11,'A',2,78),
        *   (12,'B',30,79),
        *   (13,'C',96,73),
        *   (14,'D',37,40),
        *   (15,'E',14,86),
        *   (16,'A',32,67),
        *   (17,'B',84,38),
        *   (18,'C',27,9),
        *   (19,'D',31,21),
        *   (20,'E',80,63),
        *   (21,'A',89,9),
        *   (22,'B',15,22),
        *   (23,'C',46,84),
        *   (24,'D',54,79),
        *   (25,'E',85,64),
        *   (26,'A',87,13),
        *   (27,'B',40,45),
        *   (28,'C',34,90),
        *   (29,'D',63,8),
        *   (30,'E',66,40),
        *   (31,'A',83,49),
        *   (32,'B',4,90),
        *   (33,'C',81,7),
        *   (34,'D',11,12),
        *   (35,'E',85,10),
        *   (36,'A',39,75),
        *   (37,'B',22,39),
        *   (38,'C',76,67),
        *   (39,'D',20,11),
        *   (40,'E',81,36);
    *   Q&A
        *   期望结果
        *   1) N=1 取GID每组 score最大的记录
        *   +----+------+------+------+
        *   | id | gid  | col1 | score |
        *   +----+------+------+------+
        *   |  6 | A    |   29 |   97 |
        *   | 15 | E    |   14 |   86 |
        *   | 24 | D    |   54 |   79 |
        *   | 28 | C    |   34 |   90 |
        *   | 32 | B    |    4 |   90 |
        *   +----+------+------+------+
        *   2) N=3 取GID每组 score最大的3条记录
        *   +----+------+------+------+
        *   | id | gid  | col1 | score |
        *   +----+------+------+------+
        *   |  6 | A    |   29 |   97 |
        *   | 11 | A    |    2 |   78 |
        *   | 36 | A    |   39 |   75 |
        *   | 32 | B    |    4 |   90 |
        *   |  2 | B    |   25 |   83 |
        *   | 12 | B    |   30 |   79 |
        *   | 28 | C    |   34 |   90 |
        *   | 23 | C    |   46 |   84 |
        *   | 13 | C    |   96 |   73 |
        *   | 24 | D    |   54 |   79 |
        *   |  4 | D    |   63 |   56 |
        *   |  9 | D    |   25 |   43 |
        *   | 15 | E    |   14 |   86 |
        *   | 25 | E    |   85 |   64 |
        *   | 20 | E    |   80 |   63 |
        *   +----+------+------+------+
        *   Answers:
        *   1)
        *   select a.gid,a.score from ttt a
        *   where 1>=(
        *   select count(*) from ttt b
        *   where a.gid = b.gid and a.score<=b.score)
        *   order by gid,score desc;

        *   2)
        *   select a.gid,a.score from ttt a
        *   where 3>=(
        *   select count(*) from ttt b
        *   where a.gid = b.gid and a.score<=b.score)
        *   order by gid,score desc;

相关文章

网友评论

      本文标题:MySQL 部分习题 & 答案

      本文链接:https://www.haomeiwen.com/subject/qgjicqtx.html