mysql经典50题

 create table `student`(
 `StudentNo` int(4) not null  comment '学号',
 `LoginPwd` varchar(20) DEFAULT  null,
 `StudentName` varchar(20) DEFAULT null  comment '学生姓名',
 `Sex` tinyint(1) DEFAULT null comment '性别,取值0或1',
 `GandeId` int(11) DEFAULT null comment '年级编号',
 `Phone` varchar(50) comment '联系电话',
 `Address` varchar(255) comment '地址',
 `BronDate` datetime DEFAULT null comment '出生日期',
 `Email` varchar(50) comment '邮箱账号',
 `IdentityCard` varchar(18) DEFAULT null comment '身份证号');
 CREATE TABLE `student` (
  `StudentNO` int NOT NULL COMMENT '学号',
  `LoginPwd` varchar(20) DEFAULT NULL,
  `StudentName` varchar(20) DEFAULT NULL COMMENT '学生姓名',
  `Sex` tinyint(1) DEFAULT NULL COMMENT '性别,取值0或1',
  `GradeId` int DEFAULT NULL COMMENT '年级编号',
  `Phone` varchar(50) NOT NULL COMMENT '联系电话',
  `Address` varchar(255) NOT NULL COMMENT '地址',
  `BornDate` datetime DEFAULT NULL COMMENT '出生时间',
  `Email` varchar(50) NOT NULL COMMENT '邮箱账号',
  `IdentityCard` varchar(18) DEFAULT NULL COMMENT '身份证号'
)
CREATE TABLE `subjet`(
`SubjectNo` int(11) NOT NULL COMMENT "课程编号",
`SubjectName` VARCHAR(50) DEFAULT null comment"课程名称",
`ClassHour` int(4) DEFAULT NULL comment"学时",
`GradeID`int(4) DEFAULT NULL comment"年纪编号")
ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE`student`(`StudentNO` int(10) PRIMARY KEY auto_increment,
`LoginPwd` varchar(20),
`StudentName` VARCHAR(20),
sex tinyint,gradeid int,
phone VARCHAR(50),
address VARCHAR(255),
borndate datetime,email varchar(50),
identintycard VARCHAR(18),
CONSTRAINT FK_gradeid FOREIGN key (gradeid) REFERENCES grade (gradeid));


CREATE table `grade` (gradeid int(10) PRIMARY KEY auto_increment,
subjectno int(10), 
gradename varchar(50));
create table `result`
(studentno int(10),
subjectno int(10),
examedate datetime,
studentresult int
)
CREATE TABLE `subject`(subjectno int(10) PRIMARY KEY auto_increment ,
subjectname varchar(50),
classhour int(10),
gradeid int );
insert into student(studentno,studentname,sex,gradeid,borndate,identintycard)
values (1000,'张三',1,1,now(),'140020319349583928'),
(1001,'李四',0,2,now(),'140020319349583918'),
(1002,'王五',1,3,now(),'140020319349583938');
insert into subject(subjectno,subjectname,classhour,gradeid)
values(1,'高等数学1',40,1),(2,'高等数学2',38,2),(3,'java编程',38,3),(4,'hadoop理论',44,4);
insert into result(studentno,subjectno,examedate,studentresult)
values(1000,1,now(),98),(1001,1,now(),100),(1000,2,now(),78),(1000,3,now(),100),
(1000,4,now(),85),(1001,2,now(),100),(1001,3,now(),100),(1001,4,now(),100),
(1002,1,now(),68),(1002,2,now(),60),(1002,3,now(),61),(1002,4,now(),63);
select  r.studentno as'学号',st.studentname '姓名',s.subjectname,r.studentresult 
from result r  left join subject s on s.subjectno=r.subjectno  
left join student st on st.studentno=r.studentno 
where s.subjectname='hadoop理论' order by r.studentresult desc limit 2;
select   r.studentno as'学号',stu.studentname '姓名',s.subjectname,r.studentresult           
FROM result r left join subject s on s.subjectno=r.subjectno
left join student stu on stu.studentno=r.studentno
where s.subjectname='java编程' and r.studentresult>80 order by r.studentresult DESC limit 4;
SELECT  
from result r WHERE 
(SELECT subjectname from subject)='高等数学1'
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' , '女');
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
#--1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
mysql> select stu.*,sc.score,sc2.score from sc join sc sc2 on sc.sid=sc2.sid and sc.cid=01 and sc2.cid=02 join student stu on stu.sid=sc.sid where sc.score>sc2.score;
+------+--------+---------------------+------+-------+-------+
| SID  | Sname  | Sage                | Ssex | score | score |
+------+--------+---------------------+------+-------+-------+
| 02   | 钱电   | 1990-12-21 00:00:00 | 男   |  70.0 |  60.0 |
| 04   | 李云   | 1990-08-06 00:00:00 | 男   |  50.0 |  30.0 |
+------+--------+---------------------+------+-------+-------+

mysql> select stu.*,sc.score,sc2.score from sc join sc sc2 on sc.sid=sc2.sid and sc.cid=01 and sc2.cid=02 join student stu on stu.sid=sc.sid where sc.score<sc2.score;
+------+--------+---------------------+------+-------+-------+
| SID  | Sname  | Sage                | Ssex | score | score |
+------+--------+---------------------+------+-------+-------+
| 01   | 赵雷   | 1990-01-01 00:00:00 | 男   |  80.0 |  90.0 |
| 05   | 周梅   | 1991-12-01 00:00:00 | 女   |  76.0 |  87.0 |
+------+--------+---------------------+------+-------+-------+

# 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
select sc.sid,stu.sname,avg(sc.score) avg from sc join student stu on stu.sid=sc.sid group by sc.sid,stu.sname having avg>=60;
+------+--------+----------+
| sid  | sname  | avg      |
+------+--------+----------+
| 01   | 赵雷   | 89.66667 |
| 02   | 钱电   | 70.00000 |
| 03   | 孙风   | 80.00000 |
| 05   | 周梅   | 81.50000 |
| 07   | 郑竹   | 93.50000 |
+------+--------+----------+

# 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
mysql> select stu.sid,stu.sname,count(sc.cid),sum(sc.score)from student stu left join sc on stu.sid=sc.sid  group by stu.sid,stu.sname;
+------+--------+---------------+---------------+
| sid  | sname  | count(sc.cid) | sum(sc.score) |
+------+--------+---------------+---------------+
| 01   | 赵雷   |             3 |         269.0 |
| 02   | 钱电   |             3 |         210.0 |
| 03   | 孙风   |             3 |         240.0 |
| 04   | 李云   |             3 |         100.0 |
| 05   | 周梅   |             2 |         163.0 |
| 06   | 吴兰   |             2 |          65.0 |
| 07   | 郑竹   |             2 |         187.0 |
| 08   | 王菊   |             0 |          NULL |
+------+--------+---------------+---------------+
#--6、查询"李"姓老师的数量
mysql> select count(*)from teacher t where t.tname like '李%';
+----------+
| count(*) |
+----------+
|        1 |
+----------+
#7、查询学过"张三"老师授课的同学的信息
mysql> select * from student stu where stu.sid in (select sid from sc where cid=(select cid from course where tid=(select tid from teacher where tname='张三')));
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 01   | 赵雷   | 1990-01-01 00:00:00 | 男   |
| 02   | 钱电   | 1990-12-21 00:00:00 | 男   |
| 03   | 孙风   | 1990-05-20 00:00:00 | 男   |
| 04   | 李云   | 1990-08-06 00:00:00 | 男   |
| 05   | 周梅   | 1991-12-01 00:00:00 | 女   |
| 07   | 郑竹   | 1989-07-01 00:00:00 | 女   |
+------+--------+---------------------+------+
# --8、查询没学过"张三"老师授课的同学的信息
mysql> select * from student stu where stu.sid not in (select sid from sc where cid=(select cid from course where tid=(select tid from teacher where tname='张三')));
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 06   | 吴兰   | 1992-03-01 00:00:00 | 女   |
| 08   | 王菊   | 1990-01-20 00:00:00 | 女   |
+------+--------+---------------------+------+
#--9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
mysql> select stu.* from sc join sc sc2 on sc.sid=sc2.sid and sc.cid=01 and sc2.cid=02 join student stu on stu.sid=sc.sid;
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 01   | 赵雷   | 1990-01-01 00:00:00 | 男   |
| 02   | 钱电   | 1990-12-21 00:00:00 | 男   |
| 03   | 孙风   | 1990-05-20 00:00:00 | 男   |
| 04   | 李云   | 1990-08-06 00:00:00 | 男   |
| 05   | 周梅   | 1991-12-01 00:00:00 | 女   |
+------+--------+---------------------+------+
#--10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
select stu.* from student stu where stu.sid not in(select stu.sid from sc join sc sc2 on sc.sid=sc2.sid andsc.cid=01 and sc2.cid=02 join student stu on stu.sid=sc.sid);
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 06   | 吴兰   | 1992-03-01 00:00:00 | 女   |
| 07   | 郑竹   | 1989-07-01 00:00:00 | 女   |
| 08   | 王菊   | 1990-01-20 00:00:00 | 女   |
+------+--------+---------------------+------+
#--11、查询没有学全所有课程的同学的信息
mysql> select stu.sid,count(sc.cid) c from student stu left join sc on stu.sid=sc.sid group by stu.sid having c<(select count(*)from course);
+------+---+
| sid  | c |
+------+---+
| 05   | 2 |
| 06   | 2 |
| 07   | 2 |
| 08   | 0 |
+------+---+
# --12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
mysql> select distinct stu.* from sc join student stu on sc.sid=stu.sid where sc.sid!=01 and cid in(select cid from sc where sid=01);
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 02   | 钱电   | 1990-12-21 00:00:00 | 男   |
| 03   | 孙风   | 1990-05-20 00:00:00 | 男   |
| 04   | 李云   | 1990-08-06 00:00:00 | 男   |
| 05   | 周梅   | 1991-12-01 00:00:00 | 女   |
| 06   | 吴兰   | 1992-03-01 00:00:00 | 女   |
| 07   | 郑竹   | 1989-07-01 00:00:00 | 女   |
+------+--------+---------------------+------+

# --13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
select  t.sid,t.count1 
from  
(select sid,count(sid) count1 from
(select sc.sid from sc left join sc sc2 on sc.cid=sc2.cid and sc2.sid=01 and sc.sid!=01 where sc.sid!=01 and sc2.sid is not null) t group by t.sid) t 
having t.count1= (select count(*) from sc where sid=01);
+------+--------+
| sid  | count1 |
+------+--------+
| 02   |      3 |
| 03   |      3 |
| 04   |      3 |
+------+--------+

#--14、查询没学过"张三"老师讲授的任一门课程的学生姓名
select * 
from student stu 
where stu.sid not in 
(select sid from sc where cid=
(select cid from course where tid=
(select tid from teacher where tname='张三')));
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 06   | 吴兰   | 1992-03-01 00:00:00 | 女   |
| 08   | 王菊   | 1990-01-20 00:00:00 | 女   |
+------+--------+---------------------+------+

#--15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select stu.sid, stu.sname,avg(sc.score) as 平均分
from student as stu
join sc on stu.sid = sc.sid
where sc.score < 60
group by stu.sid, stu.sname
having count(sc.cid) >= 2;
+------+--------+-----------+
| sid  | sname  | 平均分    |
+------+--------+-----------+
| 04   | 李云   |  33.33333 |
| 06   | 吴兰   |  32.50000 |
+------+--------+-----------+

#--16、检索"01"课程分数小于60,按分数降序排列的学生信息
select stu.* 
from sc 
join student stu on sc.sid=stu.sid 
where sc.cid=01 and sc.score<60;
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 04   | 李云   | 1990-08-06 00:00:00 | 男   |
| 06   | 吴兰   | 1992-03-01 00:00:00 | 女   |
+------+--------+---------------------+------+

# --17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select stu.sname, stu.sid,ifnull(t.avg,0) avgscore,
 sum(case when sc.cid='01' then sc.score else 0 end )as '语文',
 sum(case when sc.cid='02' then sc.score else 0 end )as '数学',
 sum(case when sc.cid='03' then sc.score else 0 end )as '英语'
 from (select sc.sid,avg(score) avg from sc group by sc.sid order by avg desc) t  
 left  join sc on t.sid=sc.sid  
 right join student stu on stu.sid=t.sid 
 group by stu.sid,t.avg,stu.sname ;
+--------+------+----------+--------+--------+--------+
| sname  | sid  | avgscore | 语文   | 数学   | 英语   |
+--------+------+----------+--------+--------+--------+
| 赵雷   | 01   | 89.66667 |   80.0 |   90.0 |   99.0 |
| 钱电   | 02   | 70.00000 |   70.0 |   60.0 |   80.0 |
| 孙风   | 03   | 80.00000 |   80.0 |   80.0 |   80.0 |
| 李云   | 04   | 33.33333 |   50.0 |   30.0 |   20.0 |
| 周梅   | 05   | 81.50000 |   76.0 |   87.0 |    0.0 |
| 吴兰   | 06   | 32.50000 |   31.0 |    0.0 |   34.0 |
| 郑竹   | 07   | 93.50000 |    0.0 |   89.0 |   98.0 |
| 王菊   | 08   |  0.00000 |    0.0 |    0.0 |    0.0 |
+--------+------+----------+--------+--------+--------+

#--18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
# 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
select sc.cid,course.cname,max(sc.score) 最高分,
min(sc.score) 最低分,
avg(sc.score) 平均分,
SUM(case WHEN sc.score>=60 THEN 1 else 0 end)/ COUNT(sc.cid) 及格率,
SUM(case WHEN sc.score>=70 and sc.score<80 THEN 1 else 0 end)/ COUNT(sc.cid) 中等率,
SUM(case WHEN sc.score>=80 and sc.score<90 THEN 1 else 0 end)/ COUNT(sc.cid) 优良率,
SUM(case WHEN sc.score>=90 THEN 1 else 0 end)/ COUNT(sc.cid) 优秀率
from sc left join course on sc.cid=course.cid group BY sc.cid,course.cname;
+------+--------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| cid  | cname  | 最高分    | 最低分    | 平均分    | 及格率    | 中等率    | 优良率    | 优秀率    |
+------+--------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| 01   | 语文   |      80.0 |      31.0 |  64.50000 |    0.6667 |    0.3333 |    0.3333 |    0.0000 |
| 02   | 数学   |      90.0 |      30.0 |  72.66667 |    0.8333 |    0.0000 |    0.5000 |    0.1667 |
| 03   | 英语   |      99.0 |      20.0 |  68.50000 |    0.6667 |    0.0000 |    0.3333 |    0.3333 |
+------+--------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+

# --19、按各科成绩进行排序,并显示排名
SELECT a.* ,  (SELECT COUNT(DISTINCT score) FROM SC WHERE CID = a.CID AND score >a.score) +1 
AS 排名 FROM SC AS a ORDER BY a.cid , 排名;
+------+------+-------+--------+
| SID  | CID  | score | 排名   |
+------+------+-------+--------+
| 01   | 01   |  80.0 |      1 |
| 03   | 01   |  80.0 |      1 |
| 05   | 01   |  76.0 |      2 |
| 02   | 01   |  70.0 |      3 |
| 04   | 01   |  50.0 |      4 |
| 06   | 01   |  31.0 |      5 |
| 01   | 02   |  90.0 |      1 |
| 07   | 02   |  89.0 |      2 |
| 05   | 02   |  87.0 |      3 |
| 03   | 02   |  80.0 |      4 |
| 02   | 02   |  60.0 |      5 |
| 04   | 02   |  30.0 |      6 |
| 01   | 03   |  99.0 |      1 |
| 07   | 03   |  98.0 |      2 |
| 03   | 03   |  80.0 |      3 |
| 02   | 03   |  80.0 |      3 |
| 06   | 03   |  34.0 |      4 |
| 04   | 03   |  20.0 |      5 |
+------+------+-------+--------+

# --21、查询不同老师所教不同课程平均分从高到低显示 
select cs.cid,t.tname,avg(sc.score) avg from sc  left join course cs on sc.cid=cs.cid left join teacher t on t.tid=cs.tid  group by cs.cid,t.tname order by avg DESC ;
+------+--------+----------+
| cid  | tname  | avg      |
+------+--------+----------+
| 02   | 张三   | 72.66667 |
| 03   | 王五   | 68.50000 |
| 01   | 李四   | 64.50000 |
+------+--------+----------+

# --21、查询不同老师所教不同课程平均分从高到低显示 
select cs.cid,t.tname,avg(sc.score) avg from sc  left join course cs on sc.cid=cs.cid left join teacher t on t.tid=cs.tid  group by cs.cid,t.tname order by avg DESC ;
+------+--------+----------+
| cid  | tname  | avg      |
+------+--------+----------+
| 02   | 张三   | 72.66667 |
| 03   | 王五   | 68.50000 |
| 01   | 李四   | 64.50000 |
+------+--------+----------+

# --22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
(select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=01 limit 1,2) union (select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=02 limit 1,2) union (select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=03 limit 1,2);
+------+------+-------+---+
| sid  | cid  | score | r |
+------+------+-------+---+
| 03   | 01   |  80.0 | 1 |
| 05   | 01   |  76.0 | 2 |
| 07   | 02   |  89.0 | 2 |
| 05   | 02   |  87.0 | 3 |
| 07   | 03   |  98.0 | 2 |
| 02   | 03   |  80.0 | 3 |
+------+------+-------+---+

# --23、统计各科成绩各分数段人数:课程编号,课程名称, 100-85 , 85-70 , 70-60 , 0-60 及所占百分比
select sc.cid,course.cname,
SUM(case WHEN 0<sc.score and sc.score<60 THEN 1 else 0 end)/7 '0-60',
SUM(case WHEN 60<=sc.score and sc.score<70 THEN 1 else 0 end)/7 '60-70',
SUM(case WHEN 70<=sc.score and sc.score<85 THEN 1 else 0 end)/7 '70-85',
SUM(case WHEN 85<=sc.score THEN 1 else 0 end)/7 '85-100'
from sc left join course on sc.cid=course.cid group BY sc.cid,course.cname;
+------+--------+--------+--------+--------+--------+
| cid  | cname  | 0-60   | 60-70  | 70-85  | 85-100 |
+------+--------+--------+--------+--------+--------+
| 01   | 语文   | 0.2857 | 0.0000 | 0.5714 | 0.0000 |
| 02   | 数学   | 0.1429 | 0.1429 | 0.1429 | 0.4286 |
| 03   | 英语   | 0.2857 | 0.0000 | 0.2857 | 0.2857 |
+------+--------+--------+--------+--------+--------+

# --24、查询学生平均成绩及其名次
select  sc.sid,avg(sc.score) avg from sc group by sc.sid order by avg desc;
+------+----------+
| sid  | avg      |
+------+----------+
| 07   | 93.50000 |
| 01   | 89.66667 |
| 05   | 81.50000 |
| 03   | 80.00000 |
| 02   | 70.00000 |
| 04   | 33.33333 |
| 06   | 32.50000 |
+------+----------+
# --25、查询各科成绩前三名的记录
(select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=01 limit 0,3) 
union (select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=02 limit 0,3) 
union (select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=03 limit 0,3);
+------+------+-------+---+
| sid  | cid  | score | r |
+------+------+-------+---+
| 01   | 01   |  80.0 | 1 |
| 03   | 01   |  80.0 | 1 |
| 05   | 01   |  76.0 | 2 |
| 01   | 02   |  90.0 | 1 |
| 07   | 02   |  89.0 | 2 |
| 05   | 02   |  87.0 | 3 |
| 01   | 03   |  99.0 | 1 |
| 07   | 03   |  98.0 | 2 |
| 02   | 03   |  80.0 | 3 |
+------+------+-------+---+

# --26、查询每门课程被选修的学生数
select  c.cid,count(sc.sid)from course c join sc on sc.cid=c.cid group by c.cid;
+------+---------------+
| cid  | count(sc.sid) |
+------+---------------+
| 01   |             6 |
| 02   |             6 |
| 03   |             6 |
+------+---------------+
# --27、查询出只有两门课程的全部学生的学号和姓名
select  stu.sid,stu.sname from (select  sc.sid,count(sc.cid) c from  student stu join sc on sc.sid=stu.sid group by sc.sid) t join student stu on t.sid=stu.sid where t.c=2;
+------+--------+
| sid  | sname  |
+------+--------+
| 05   | 周梅   |
| 06   | 吴兰   |
| 07   | 郑竹   |
+------+--------+
#--28、查询男生、女生人数
(select t.ssex,count(*) from (select stu.sid,ssex from student stu where stu.ssex='男') t) union all (select t.ssex,count(*) from (select stu.sid,ssex from student stu where stu.ssex='女') t);
+------+----------+
| ssex | count(*) |
+------+----------+
| 男   |        4 |
| 女   |        4 |
+------+----------+

# --29、查询名字中含有"风"字的学生信息
select stu.* from student stu where stu.sname LIKE '%风%';
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 03   | 孙风   | 1990-05-20 00:00:00 | 男   |
+------+--------+---------------------+------+

#--30、查询同名同性学生名单,并统计同名人数
select stu.sname,count(*) from student stu join student stu1 on stu.sname=stu1.sname where stu.sid!=stu1.sid and stu.ssex=stu1.ssex group by stu.sname;
Empty set (0.00 sec)
# --31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)
select stu.* from student stu where stu.sage like '1990%';
+------+--------+---------------------+------+
| SID  | Sname  | Sage                | Ssex |
+------+--------+---------------------+------+
| 01   | 赵雷   | 1990-01-01 00:00:00 | 男   |
| 02   | 钱电   | 1990-12-21 00:00:00 | 男   |
| 03   | 孙风   | 1990-05-20 00:00:00 | 男   |
| 04   | 李云   | 1990-08-06 00:00:00 | 男   |
| 08   | 王菊   | 1990-01-20 00:00:00 | 女   |
+------+--------+---------------------+------+
# --32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
select sc.cid,avg(score) avg from sc group by sc.cid order by avg desc,sc.cid; 
+------+----------+
| cid  | avg      |
+------+----------+
| 02   | 72.66667 |
| 03   | 68.50000 |
| 01   | 64.50000 |
+------+----------+
# --33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
select  sc.sid,stu.sname,avg(sc.score) avg from sc  join student stu on stu.sid=sc.sid group by sc.sid,stu.sname having avg >=85;
+------+--------+----------+
| sid  | sname  | avg      |
+------+--------+----------+
| 01   | 赵雷   | 89.66667 |
| 07   | 郑竹   | 93.50000 |
+------+--------+----------+
#--34、查询课程名称为"数学",且分数低于60的学生姓名和分数
select  stu.sname,sc.score from sc join course cs on cs.cid=sc.cid join student stu on stu.sid=sc.sid where cs.cname='数学' and sc.score<60;
+--------+-------+
| sname  | score |
+--------+-------+
| 李云   |  30.0 |
+--------+-------+
# --35、查询所有学生的课程及分数情况;
select stu.sid,sc.cid,sc.score from sc  right join student stu on stu.sid=sc.sid; 
+------+------+-------+
| sid  | cid  | score |
+------+------+-------+
| 01   | 03   |  99.0 |
| 01   | 02   |  90.0 |
| 01   | 01   |  80.0 |
| 02   | 03   |  80.0 |
| 02   | 02   |  60.0 |
| 02   | 01   |  70.0 |
| 03   | 03   |  80.0 |
| 03   | 02   |  80.0 |
| 03   | 01   |  80.0 |
| 04   | 03   |  20.0 |
| 04   | 02   |  30.0 |
| 04   | 01   |  50.0 |
| 05   | 02   |  87.0 |
| 05   | 01   |  76.0 |
| 06   | 03   |  34.0 |
| 06   | 01   |  31.0 |
| 07   | 03   |  98.0 |
| 07   | 02   |  89.0 |
| 08   | NULL |  NULL |
+------+------+-------+
#--36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数
select stu.sname,c.cname,sc.score from sc  join student stu on stu.sid=sc.sid  join course c on c.cid=sc.cid where sc.score>70;
+--------+--------+-------+
| sname  | cname  | score |
+--------+--------+-------+
| 赵雷   | 英语   |  99.0 |
| 赵雷   | 数学   |  90.0 |
| 赵雷   | 语文   |  80.0 |
| 钱电   | 英语   |  80.0 |
| 孙风   | 英语   |  80.0 |
| 孙风   | 数学   |  80.0 |
| 孙风   | 语文   |  80.0 |
| 周梅   | 数学   |  87.0 |
| 周梅   | 语文   |  76.0 |
| 郑竹   | 英语   |  98.0 |
| 郑竹   | 数学   |  89.0 |
+--------+--------+-------+
# --37、查询不及格的课程
select DISTINCT cs.cname from sc join course cs  on cs.cid=sc.cid where sc.score<60; 
+--------+
| cname  |
+--------+
| 语文   |
| 数学   |
| 英语   |
+--------+
#--38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名;
select sc.sid,stu.sname from sc  join student stu on stu.sid=sc.sid where sc.cid=01 and sc.score>80;
Empty set (0.00 sec)
# --39、求每门课程的学生人数
select sc.cid,COUNT(sc.sid)from sc group by sc.cid;
+------+---------------+
| cid  | COUNT(sc.sid) |
+------+---------------+
| 01   |             6 |
| 02   |             6 |
| 03   |             6 |
+------+---------------+
# --40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
select stu.sid,stu.sname,sc.score 
from sc join course c on sc.cid=c.cid 
join teacher t on t.tid=c.tid 
join student stu on sc.sid=stu.sid
where t.tname='张三' 
group by stu.sid,stu.sname,sc.score 
limit 1;
#--41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
select sc.sid,sc.cid,sc.score from sc join sc sc2 on sc.sid=sc2.sid where sc.score=sc2.score and sc.cid!=sc2.cid;
+------+------+-------+
| sid  | cid  | score |
+------+------+-------+
| 03   | 03   |  80.0 |
| 03   | 02   |  80.0 |
| 03   | 03   |  80.0 |
| 03   | 01   |  80.0 |
| 03   | 02   |  80.0 |
| 03   | 01   |  80.0 |
+------+------+-------+
#--42、查询每门功课成绩最好的前两名
(select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=01 limit 2) 
union (select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=02 limit 2) 
union (select sc.sid,sc.cid,sc.score,dense_rank()over (order by score desc) as r from sc where sc.cid=03 limit 2); 
+------+------+-------+---+
| sid  | cid  | score | r |
+------+------+-------+---+
| 01   | 01   |  80.0 | 1 |
| 03   | 01   |  80.0 | 1 |
| 01   | 02   |  90.0 | 1 |
| 07   | 02   |  89.0 | 2 |
| 01   | 03   |  99.0 | 1 |
| 07   | 03   |  98.0 | 2 |
+------+------+-------+---+
# --43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,
# 查询结果按人数降序排列,若人数相同,按课程号升序排列
select sc.cid,COUNT(sc.sid) c from sc group by sc.cid order by c desc,sc.cid;
+------+---+
| cid  | c |
+------+---+
| 01   | 6 |
| 02   | 6 |
| 03   | 6 |
+------+---+
# --44、检索至少选修两门课程的学生学号
select sid,count(cid) c from sc group  by sid having c>=2;
  +------+---+
| sid  | c |
+------+---+
| 01   | 3 |
| 02   | 3 |
| 03   | 3 |
| 04   | 3 |
| 05   | 2 |
| 06   | 2 |
| 07   | 2 |
+------+---+

# --45、查询选修了全部课程的学生信息
select sid,count(cid) c from sc group  by sid having c=3;
+------+---+
| sid  | c |
+------+---+
| 01   | 3 |
| 02   | 3 |
| 03   | 3 |
| 04   | 3 |
+------+---+

# --46、查询各学生的年龄
#1.只按年份来算
select year(now())-year(stu.sage) year from student stu;

+------+
| year |
+------+
|   32 |
|   32 |
|   32 |
|   32 |
|   31 |
|   30 |
|   33 |
|   32 |
+------+
#2.按出生日期来算,过了生日那一天肯定就是大一岁了
select 
if((month(stu.sage)=month(now()) and day(stu.sage)>day(now())) or month(stu.sage)>month(now()),YEAR(now())-YEAR(stu.sage),YEAR(now())-1-YEAR(stu.sage)) age from student stu;
+------+
| age  |
+------+
|   31 |
|   32 |
|   31 |
|   31 |
|   30 |
|   29 |
|   32 |
|   31 |
+------+
# --47、查询本周过生日的学生
select IF(week(stu.sage)=week(now()),stu.sname,0) from student stu;
+--------------------------------------------+
| IF(week(stu.sage)=week(now()),stu.sname,0) |
+--------------------------------------------+
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
+--------------------------------------------+

# --48、查询下周过生日的学生
select IF(week(stu.sage)=week(now()),stu.sname,0) from student stu;
+--------------------------------------------+
| IF(week(stu.sage)=week(now()),stu.sname,0) |
+--------------------------------------------+
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
| 0                                          |
+--------------------------------------------+

# --49、查询本月过生日的学生
select IF(month(stu.sage)=month(now()),stu.sname,0) from student stu;
+----------------------------------------------+
| IF(month(stu.sage)=month(now()),stu.sname,0) |
+----------------------------------------------+
| 0                                            |
| 钱电                                         |
| 0                                            |
| 0                                            |
| 周梅                                         |
| 0                                            |
| 0                                            |
| 0                                            |
+----------------------------------------------+

# --50、查询下月过生日的学生
select 
IF((MONTH(now())=12 and (MONTH(stu.sage)=MONTH(now())-11)) 
or (MONTH(stu.sage)=(MONTH(now())+1)),stu.sname,NULL) name
from student stu; 
+--------+
| name   |
+--------+
| 赵雷   |
| NULL   |
| NULL   |
| NULL   |
| NULL   |
| NULL   |
| NULL   |
| 王菊   |
+--------+

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值