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

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

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

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

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

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

 

mysql 学生和成绩表 mysql学生表课程表成绩表_字段

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';

mysql 学生和成绩表 mysql学生表课程表成绩表_mysql 学生和成绩表_02

mysql 学生和成绩表 mysql学生表课程表成绩表_字段_03

第二步:将以上两个结果连接,同时筛选条件:课程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

mysql 学生和成绩表 mysql学生表课程表成绩表_字段_04

第三步:将上表语句单独成表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

mysql 学生和成绩表 mysql学生表课程表成绩表_子查询_05

 

 

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

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'

mysql 学生和成绩表 mysql学生表课程表成绩表_字段_06

mysql 学生和成绩表 mysql学生表课程表成绩表_子查询_07

 

 第二步:将以上两个子查询分别命名为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

mysql 学生和成绩表 mysql学生表课程表成绩表_子查询_08

 

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