hongz1228

前言:小透明xx在mysql基础上用了很多时间但实际运用到实际业务中...还是没头没脑。

啧,还是多找些习题练练吧。

本次使用经典50题做练习。

目标:理解每一题的思路,同时思考如何运用在实际业务中。

一、建表:教师表,学生表,成绩表,课程表

1、四表关系:教师表teacher.tid=课程表course.tid  ,学生表student.sid=成绩表sscore.sid ,成绩表sscore.cid=course.cid

 

2、建表:学生表student 共50条数据,成绩表sscore共137条数据,在excel里随机生成csv文件后导至navicat

     建表:课程表:course  教师表:teacher

 1 create table Course(cid varchar(10),cname varchar(10),tid varchar(10));
 2 insert into Course values(\'1\' , \'语文\' , \'2\');
 3 insert into Course values(\'2\' , \'数学\' , \'1\');
 4 insert into Course values(\'3\' , \'英语\' , \'3\');
 5 create table Teacher(tid varchar(10),tname varchar(10));
 6 insert into Teacher values(\'1\' , \'\');
 7 insert into Teacher values(\'2\' , \'\');
 8 insert into Teacher values(\'3\' , \'\');
 9 insert into Teacher values(\'4\' , \'\');
10 insert into Teacher values(\'5\' , \'null\');

二、50题

问题逻辑:
构造语句:
select 查询结果 [] from 从哪张表中查找数据 []
join on 关联 [] where 查询条件 []
group by 分组 []
having 对分组结果指定条件 []
order by 对结果排序 []

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

问题逻辑:
1、要显示学生信息,两个课程的成绩,要用于学生表和成绩表
2、使用子查询得到课程1和课程2的学生学号,再将两个子查询连接筛选出课程1成绩>课程2成绩的学号
3、使用连接将学生表与筛选后的成绩表连接。
构造语句:
select 查询结果 [学生表student所有信息,即* 成绩表课程1成绩和课程2成绩,即sscore score] from 从哪张表中查找数据 [学生表student 成绩表sscore]
join on 关联 [学号sid]

第一步:找到课程1和课程2的学生学号和成绩:

查询表:  sscore 

结果字段:课程号cid,学生学号sid,成绩score

1 SELECT cid,sid,score AS score1 FROM sscore  WHERE cid=\'1\';
2 SELECT cid,sid,score AS score2 FROM sscore  WHERE cid=\'2\';

第二步:将以上两个结果连接,同时筛选条件:课程1成绩>课程2成绩。

结果字段:学号sid,课程1成绩score1,课程2成绩score2

查询表:    课程1子查询表命名为t1,课程2子查询表命名为t2,连接字段t1.sid=t2.sid

1 SELECT t1.sid,score1 课程1成绩,score2 课程2成绩 FROM
2  (SELECT cid,sid,score AS score1 FROM sscore WHERE cid=\'1\')t1
3 JOIN 
4  (SELECT cid,sid,score AS score2 FROM sscore WHERE cid=\'2\')t2
5 ON t1.sid=t2.sid  
6 AND 
7 t1.score1>t2.score2

第三步:将上表语句单独成表t3,并与学生表连接,连接字段为学生学号即sid

查询表:t3,学生表student

结果字段:student表所有,t3表所有

1 SELECT * FROM
2 (SELECT t1.sid,score1 课程1成绩 ,score2 课程2成绩 FROM
3 (SELECT cid,sid,score AS score1 FROM sscore WHERE cid=\'1\')t1
4 JOIN 
5 (SELECT cid,sid,score AS score2 FROM sscore WHERE cid=\'2\')t2
6 ON t1.sid=t2.sid AND t1.score1>t2.score2) t3
7 LEFT JOIN student ON
8 t3.sid=student.sid

 

 

 哇哦~有点小激动..感觉学会了子查询和两表连接。我真棒~

2.查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

问题逻辑:
1、翻译成大白话不就是——把选了课程1和2的学生都找出来,
不管存不存在课程1或2
2、使用子查询找到所有选了课程1,课程2的学生。再将两表连接,最后得出所有选了课程1和课程2的学生

第一步:使用子查询查出所以选了课程1和课程2的学生学号

查询表:成绩表sscore

结果字段:*

1 SELECT * FROM sscore WHERE cid=\'1\';
2 SELECT * FROM sscore WHERE cid=\'2\'

 

 第二步:将以上两个子查询分别命名为t1表和t2表,连接后得出所有学生学号,连接字段t1.sid=t2.sid

1 SELECT * FROM
2 (SELECT * FROM sscore WHERE cid=\'1\') t1
3 JOIN
4 (SELECT * FROM sscore WHERE cid=\'2\') t2
5 ON t1.sid=t2.sid

 

 3.查询同时存在01和02课程的情况

 

posted on 2020-05-19 18:26  也许zz  阅读(272)  评论(0编辑  收藏  举报

分类:

技术点:

相关文章:

  • 2022-01-07
  • 2021-12-18
  • 2021-12-26
  • 2021-06-25
  • 2023-03-22
  • 2022-12-23
猜你喜欢
  • 2021-11-30
  • 2021-11-26
  • 2022-12-23
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
相关资源
相似解决方案