sql练习题,没事可以过一遍

习题内容来自网络共享。

20200522加入了join的知识点

表名和字段


–1.学生表
Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别
–2.课程表
Course(c_id,c_name,t_id) – --课程编号, 课程名称, 教师编号
–3.教师表
Teacher(t_id,t_name) --教师编号,教师姓名
–4.成绩表
Score(s_id,c_id,s_score) --学生编号,课程编号,分数

测试数据

把下面的sql放到数据库里面运行一下,先造一些数据。

CREATE TABLE `Student`(
    `s_id` VARCHAR(20),
    `s_name` VARCHAR(20) NOT NULL DEFAULT '',
    `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
    `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY(`s_id`)
);

CREATE TABLE `Course`(
    `c_id`  VARCHAR(20),
    `c_name` VARCHAR(20) NOT NULL DEFAULT '',
    `t_id` VARCHAR(20) NOT NULL,
    PRIMARY KEY(`c_id`)
);

CREATE TABLE `Teacher`(
    `t_id` VARCHAR(20),
    `t_name` VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY(`t_id`)
);

CREATE TABLE `Score`(
    `s_id` VARCHAR(20),
    `c_id`  VARCHAR(20),
    `s_score` INT(3),
    PRIMARY KEY(`s_id`,`c_id`)
);

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' , '女');

insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');


insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');


insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);


下面开始做题:

1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 -- (包括有成绩的和无成绩的)

5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

6、查询"李"姓老师的数量

7、查询学过"张三"老师授课的同学的信息

8、查询没学过"张三"老师授课的同学的信息

9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

11、查询没有学全所有课程的同学的信息

12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

13、查询和"01"号的同学学习的课程完全相同的其他同学的信息

14、查询没学过"张三"老师讲授的任一门课程的学生姓名 

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

16、检索"01"课程分数小于60,按分数降序排列的学生信息

        
17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
     
18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

19、按各科成绩进行排序,并显示排名

20、查询学生的总成绩并进行排名

    
21、查询不同老师所教不同课程平均分从高到低显示 
        
 
22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
            
         
            
23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比


                 
24、查询学生平均成绩及其名次 

     
25、查询各科成绩前三名的记录
            -- 1.选出b表比a表成绩大的所有组
            -- 2.选出比当前id成绩大的 小于三个的
    

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

     

27、查询出只有两门课程的全部学生的学号和姓名 
     

28、查询男生、女生人数 
      

29、查询名字中含有"风"字的学生信息

       

30、查询同名同性学生名单,并统计同名人数 
        
     

31、查询1990年出生的学生名单
        
      

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

  

33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 
    
34、查询课程名称为"数学",且分数低于60的学生姓名和分数 
    
   35、查询所有学生的课程及分数情况; 
    
        
  
  36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数; 
           

        

37、查询不及格的课程
   
        
38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名; 
     

39、求每门课程的学生人数 
      

40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

        
  
41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 
   

42、查询每门功成绩最好的前两名 

43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列  
     
44、检索至少选修两门课程的学生学号 
      

45、查询选修了全部课程的学生信息 
      
46、查询各学生的年龄
    按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
47、查询本周过生日的学生

48、查询下周过生日的学生

49、查询本月过生日的学生
    
50、查询下月过生日的学生
   

 

部分答案

总结一下:

group by后面跟着的列要在select后面出现。

聚合函数的作用原理理解清楚

尽量使用join,不要使用from 多个表

 

 

1.
select tt.s_id ,stu.s_name,tt.c01,tt.c02 from (select lf.s_id ,lf.s_score as c01,rt.s_score as c02 from score lf left join score rt on lf.s_id = rt.s_id where lf.c_id = 01 and rt.c_id = 02 and lf.s_score>rt.s_score) as tt ,student as stu where tt.s_id = stu.s_id
select s1.s_id ,s1.s_score,s2.s_score,stu.s_name from score as s1,score as s2 ,student as stu where s1.c_id=01 and s2.c_id=02 and s1.s_id = s2.s_id and s1.s_score > s2.s_score and stu.s_id = s1.s_id
//
select a.* ,b.s_score as 01_score,c.s_score as 02_score from 
student a 
    join score b on a.s_id=b.s_id and b.c_id='01'
    left join score c on a.s_id=c.s_id and c.c_id='02' or c.c_id = NULL where b.s_score>c.s_score

3.
select stu.s_id ,stu.s_name, avg(sc.s_score) as avg_score FROM student stu LEFT JOIN score sc 
on stu.s_id = sc.s_id GROUP BY sc.s_id HAVING avg_score>= 60

select b.s_id,b.s_name,ROUND(AVG(a.s_score),2) as avg_score from 
    student b 
    join score a on b.s_id = a.s_id
    GROUP BY b.s_id,b.s_name HAVING avg_score >=60;

5.
//这样写有个问题就是如果有学生没有选课,就会出现少学生信息的情况,使用join来查询就不会
select student.s_id,student.s_name,COUNT(score.s_id),SUM(score.s_score) from student,score where
student.s_id = score.s_id GROUP BY student.s_id
//使用下面的查询才能有正确的结果
select a.s_id,a.s_name,count(b.c_id) as sum_course,sum(b.s_score) as sum_score from 
    student a 
    left join score b on a.s_id=b.s_id
    GROUP BY a.s_id,a.s_name;
//自己手写的
select stu.s_id ,stu.s_name, count(sc.s_score),SUM(sc.s_score) FROM student stu LEFT JOIN score sc 
on stu.s_id = sc.s_id GROUP BY sc.s_id ORDER BY stu.s_id

 

 

 

jon知识点

a inner join b

查到的数据是a和b同事满足条件,

 

 

a left join b

把a当做标准,如果满足不了条件,那么b中的数据就不需要,但是a的所有数据将会被查出

 

 

把b当做标准,如果满足不了条件,那么a中的数据就不需要,但是b的所有数据将会被查出

a left join b

 

 

full join

查出的数据是满足a或者满足b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值