前言:小透明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课程的情况