闲着没事情做几道SQL题。 Orcal SQL: 在线SQL测试

MySQL指定进入某个端口命令

mysql -uroot -p -P 3307

问题描述

1.学生表 Student(SID,Sname,Sage,Ssex) –SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别. 2.课程表 Course(CID,Cname,TID) –CID –课程编号,Cname 课程名称,TID 教师编号. 3.教师表 Teacher(TID,Tname) –TID 教师编号,Tname 教师姓名. 4.成绩表 SC(SID,CID,score) –SID 学生编号,CID 课程编号,score 分数. 建表语句:

create table Student(SID varchar(10),Sname nvarchar(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 Course(CID varchar(10),Cname nvarchar(10),TID varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
create table Teacher(TID varchar(10),Tname nvarchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
create table 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);

题目

  1. 查询"01"课程比"02"课程成绩高的学生的信息及课程分数
  • 查询同时存在"01"课程和"02"课程的情况 结果:
+------+-------+---------------------+------+------------+------------+
| SID  | Sname | Sage                | Ssex | 01课程分数 | 02课程分数 |
+------+-------+---------------------+------+------------+------------+
| 02   | 钱电  | 1990-12-21 00:00:00 | 男   |       70.0 |       60.0 |
| 04   | 李云  | 1990-08-06 00:00:00 | 男   |       50.0 |       30.0 |
+------+-------+---------------------+------+------------+------------+
2 rows in set (0.00 sec)
select a.* , b.score 01课程分数, c.score 02课程分数 from Student a, SC b, SC c
where a.SID=b.SID and a.SID=c.SID and b.CID="01" and c.CID="02" and b.score>c.score;
  • 查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释). 结果:
+------+-------+---------------------+------+------------+------------+
| SID  | Sname | Sage                | Ssex | 01课程分数 | 02课程分数 |
+------+-------+---------------------+------+------------+------------+
| 01   | 赵雷  | 1990-01-01 00:00:00 | 男   |       80.0 |       90.0 |
| 02   | 钱电  | 1990-12-21 00:00:00 | 男   |       70.0 |       60.0 |
| 03   | 孙风  | 1990-05-20 00:00:00 | 男   |       80.0 |       80.0 |
| 04   | 李云  | 1990-08-06 00:00:00 | 男   |       50.0 |       30.0 |
| 05   | 周梅  | 1991-12-01 00:00:00 | 女   |       76.0 |       87.0 |
| 06   | 吴兰  | 1992-03-01 00:00:00 | 女   |       31.0 |       NULL |
+------+-------+---------------------+------+------------+------------+
6 rows in set (0.00 sec)
select a.*,b.score 01课程分数,c.score 02课程分数 from Student a
left join SC b on b.SID=a.SID and b.CID='01'
left join SC c on c.SID=a.SID and c.CID='02'
where b.score>isnull(c.score);
  1. 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩. CAST()函数:CAST('12.5' AS decimal(9,2)) 如果通过CAST()函数将这个值转换为decimal表示精度与小数位数分别为9与2. 结果:
+------+-------+-----------+
| SID  | Sname | avg_socre |
+------+-------+-----------+
| 01   | 赵雷  |     89.67 |
| 02   | 钱电  |     70.00 |
| 03   | 孙风  |     80.00 |
| 05   | 周梅  |     81.50 |
| 07   | 郑竹  |     93.50 |
+------+-------+-----------+
5 rows in set (0.00 sec)
select a.SID,a.Sname,cast(avg(b.score) as decimal(10,2))avg_socre
from Student a, SC b
where a.SID=b.SID
group by a.SID,a.Sname
having cast(avg(b.score) as decimal(10,2))>=60
order by a.SID;
  1. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩.
  • 查询所有有成绩的SQL. 结果:
+------+-------+----------+--------+
| SID  | Sname | 选课总数 | 总成绩 |
+------+-------+----------+--------+
| 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 |
+------+-------+----------+--------+
7 rows in set (0.00 sec)
select a.SID,a.Sname,count(b.CID) 选课总数,sum(b.score) 总成绩
from Student a, SC b
where a.SID=b.SID
group by a.SID, a.Sname
order by a.SID
  • 查询所有(包括有成绩和无成绩)的SQL. 结果:
+------+-------+--------------+------------+
| SID  | Sname | count(b.CID) | sum(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 |
+------+-------+--------------+------------+
8 rows in set (0.00 sec)
select a.SID,a.Sname,count(b.CID),sum(score)
from Student a
left join SC b
on a.SID=b.SID
group by a.SID, a.Sname
order by a.SID;
  1. 查询"李"姓老师的数量. 结果:
+----------+
| 教师数量 |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
-- 1
select count(Tname)教师数量 from Teacher where Tname like '李%'; 
-- 2
select count(Tname)教师数量 from Teacher where left(Tname, 1)='李';
  1. 查询学过"张三"老师授课的同学的信息. 结果:
+------+-------+---------------------+------+
| 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 | 女   |
+------+-------+---------------------+------+
6 rows in set (0.00 sec)
select Student.* 
from Student,SC,Course,Teacher
where Student.SID=SC.SID and SC.CID=Course.CID and Course.TID=Teacher.TID 
and Teacher.Tname="张三"
order by Student.SID;
  1. 查询没学过"张三"老师授课的同学的信息 结果:
+------+-------+---------------------+------+
| SID  | Sname | Sage                | Ssex |
+------+-------+---------------------+------+
| 06   | 吴兰  | 1992-03-01 00:00:00 | 女   |
| 08   | 王菊  | 1990-01-20 00:00:00 | 女   |
+------+-------+---------------------+------+
2 rows in set (0.00 sec)
select s.*
from Student s
where SID not in
(
select SC.SID
from SC,Course,Teacher
where SC.CID=Course.CID and Course.TID=Teacher.TID 
and Teacher.Tname="张三"
)
order by s.SID;
  1. 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息. 结果:
+------+-------+---------------------+------+
| 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 | 女   |
+------+-------+---------------------+------+
5 rows in set (0.00 sec)
-- 1
select Student.*
from Student,SC
where Student.SID=SC.SID and SC.CID='01'
and exists
(
    select * from SC sc_2 where sc_2.CID='02' and sc_2.SID=SC.SID
)
order by Student.SID;
-- 2
select s.* from Student s where s.SID in
(
    select SID from
    (
        select SID from SC where SC.CID='01'
        union all
        select SID from SC where SC.CID='02'
    ) t group by SID having count(1) = 2
)
order by s.SID;
  1. 查询没有学全所有课程的同学的信息. 结果:
+------+-------+---------------------+------+
| SID  | Sname | Sage                | Ssex |
+------+-------+---------------------+------+
| 05   | 周梅  | 1991-12-01 00:00:00 | 女   |
| 06   | 吴兰  | 1992-03-01 00:00:00 | 女   |
| 07   | 郑竹  | 1989-07-01 00:00:00 | 女   |
+------+-------+---------------------+------+
3 rows in set (0.01 sec)
-- 1
select Student.* from Student,SC
where Student.SID=SC.SID 
group by Student.SID,Student.Sname,Student.Sage,Student.Ssex having count(CID) < (select count(CID) from Course);
-- 2
select Student.* from Student
left join SC on Student.SID=SC.SID
group by Student.SID,Student.Sname,Student.Sage,Student.Ssex having count(CID)<(select count(CID) from Course);

select *
from Student
left join SC on Student.SID=SC.SID
left join Course on SC.CID=Course.CID
order by Student.SID;
  1. 查询至少有一门课与学号为"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 | 女   |
+------+-------+---------------------+------+
6 rows in set (0.00 sec)
select distinct Student.*
from Student, SC
where Student.SID=SC.SID and SC.CID in
(
    select CID from SC where SC.SID='01'
) and Student.SID!='01';
  1. 查询没学过"张三"老师讲授的任一门课程的学生姓名. 结果:
+------+-------+
| SID  | Sname |
+------+-------+
| 06   | 吴兰  |
| 08   | 王菊  |
+------+-------+
2 rows in set (0.00 sec)
select Student.SID,Student.Sname from Student where Student.SID not in
(
    select distinct SC.SID from SC,Course,Teacher where SC.CID=Course.CID and Course.TID=Teacher.TID and Teacher.Tname="张三"
)
order by Student.SID;
  1. 查询和"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 | 男   |
+------+-------+---------------------+------+
3 rows in set (0.00 sec)
-- 这个只是按数量算...
select Student.* from Student where SID in
(
    select distinct SC.SID from SC where SID!='01' and SC.CID in
    (
        select distinct CID from SC where SID='01'
    ) group by SC.SID having count(1)=(select count(1) from SC where SID='01')
);
  1. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩. 结果:
+------+-------+-----------+
| SID  | Sname | avg_score |
+------+-------+-----------+
| 04   | 李云  |     33.33 |
| 06   | 吴兰  |     32.50 |
+------+-------+-----------+
2 rows in set (0.00 sec)
-- group by(分组)having(条件) 用法.
--  select Ssex from Student group by Ssex having Ssex!='男';
select SID from SC where score < 60
group by SID having count(1) >= 2

select Student.SID, Student.Sname, cast(avg(score) as decimal(10, 2)) avg_score from Student, SC
where Student.SID=SC.SID and Student.SID in
(
    select SID from SC where score<60
    group by SID having count(1)>=2
)
group by Student.SID,Student.Sname;
  1. 检索"01"课程分数小于60,按分数降序排列的学生信息. 结果:
+------+-------+---------------------+------+-------+------+
| SID  | Sname | Sage                | Ssex | score | CID  |
+------+-------+---------------------+------+-------+------+
| 04   | 李云  | 1990-08-06 00:00:00 | 男   |  50.0 | 01   |
| 06   | 吴兰  | 1992-03-01 00:00:00 | 女   |  34.0 | 03   |
| 06   | 吴兰  | 1992-03-01 00:00:00 | 女   |  31.0 | 01   |
| 04   | 李云  | 1990-08-06 00:00:00 | 男   |  30.0 | 02   |
| 04   | 李云  | 1990-08-06 00:00:00 | 男   |  20.0 | 03   |
+------+-------+---------------------+------+-------+------+
5 rows in set (0.00 sec)
select distinct Student.*,SC.score,Course.CID from Student,SC,Course where Student.SID=SC.SID and SC.CID=Course.CID and Student.SID in 
(
    select SID from SC,Course where SC.CID=Course.CID and SC.score<60 and Course.CID='01'
)
order by SC.score desc;
  1. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩. 结果:
+------+------+------+------+------+--------+
| 学号 | 姓名 | 语文 | 数学 | 英语 | 平均分 |
+------+------+------+------+------+--------+
| 07   | 郑竹 | NULL | 89.0 | 98.0 |  93.50 |
| 01   | 赵雷 | 80.0 | 90.0 | 99.0 |  89.67 |
| 05   | 周梅 | 76.0 | 87.0 | NULL |  81.50 |
| 03   | 孙风 | 80.0 | 80.0 | 80.0 |  80.00 |
| 02   | 钱电 | 70.0 | 60.0 | 80.0 |  70.00 |
| 04   | 李云 | 50.0 | 30.0 | 20.0 |  33.33 |
| 06   | 吴兰 | 31.0 | NULL | 34.0 |  32.50 |
| 08   | 王菊 | NULL | NULL | NULL |   NULL |
+------+------+------+------+------+--------+
8 rows in set (0.00 sec)
-- 列转行
select a.SID 学号,a.Sname 姓名,
max(case c.Cname when '语文' then b.score else null end) 语文,
max(case c.Cname when '数学' then b.score else null end) 数学,
max(case c.Cname when '英语' then b.score else null end) 英语,
cast(avg(b.score) as decimal(18, 2)) 平均分
from student a
left join SC b on a.SID=b.SID
left join Course c on b.CID=c.CID
group by a.SID, a.Sname
order by 平均分 desc;
  1. 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 –及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90. 结果:
+----------+----------+--------+--------+--------+--------+--------+--------+--------+
| 课程编号 | 课程名称 | 最高分 | 最低分 | 平均分 | 及格率 | 中等率 | 优良率 | 优秀率 |
+----------+----------+--------+--------+--------+--------+--------+--------+--------+
| 01       | 语文     |   80.0 |   31.0 |  64.50 |  66.67 |  33.33 |  33.33 |   0.00 |
| 02       | 数学     |   90.0 |   30.0 |  72.67 |  83.33 |   0.00 |  50.00 |  16.67 |
| 03       | 英语     |   99.0 |   20.0 |  68.50 |  66.67 |   0.00 |  33.33 |  33.33 |
+----------+----------+--------+--------+--------+--------+--------+--------+--------+
3 rows in set (0.07 sec)
-- 1
select m.CID 课程编号,m.Cname 课程名称,max(n.score) 最高分,min(n.score) 最低分,
cast(avg(n.score) as decimal(18,2)) 平均分,
cast((select count(1) from sc where CID=m.CID and score>=60)*100.0/(select count(1) from sc where CID=m.CID) as decimal(18, 2)) 及格率,
cast((select count(1) from sc where CID = m.CID and score >= 70 and score < 80 )*100.0 / (select count(1) from sc where CID = m.CID) as decimal(18,2))  中等率 ,
cast((select count(1) from sc where CID = m.CID and score >= 80 and score < 90 )*100.0 / (select count(1) from sc where CID = m.CID) as decimal(18,2))  优良率 ,
cast((select count(1) from sc where CID = m.CID and score >= 90)*100.0 / (select count(1) from sc where CID = m.CID) as decimal(18,2))  优秀率 
from course m,sc n
where m.CID=n.CID
group by m.CID,m.Cname
order by m.CID;
-- 2
select m.CID  课程编号 , m.Cname  课程名称 , 
(select max(score) from SC where CID = m.CID)  最高分 ,
(select min(score) from SC where CID = m.CID)  最低分 ,
(select cast(avg(score) as decimal(18,2)) from SC where CID = m.CID)  平均分 ,
cast((select count(1) from SC where CID = m.CID and score >= 60)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  及格率,
cast((select count(1) from SC where CID = m.CID and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  中等率 ,
cast((select count(1) from SC where CID = m.CID and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  优良率 ,
cast((select count(1) from SC where CID = m.CID and score >= 90)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2))  优秀率
from Course m 
order by m.CID;

我实在是太难了………… 16. 按各科成绩进行排序,并显示排名.

  • Score重复时保留名次空缺. 结果:
--- emmm
  • Score重复时合并名次(DENSE_RANK完成). 结果:
  1. 查询学生的总成绩并进行排名.
  • 查询学生的总成绩. 结果:
  • 查询学生的总成绩并进行排名,sql 2000用子查询完成,分总分重复时保留名次空缺和不保留名次空缺两种。 结果:
  • 查询学生的总成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分总分重复时保留名次空缺和不保留名次空缺两种。 结果:

未完待续~