今日分享开始啦,请大家多多指教~
1.联合查询
定义及数据准备
实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
关于笛卡尔积通过一个例子理解:
如在a表中有a1,a2,a3,在b表中有b1,b2,b3等数据,因此笛卡尔积就为
a1b1,a1b2,a1b3
a2b1,a2b2,a2b3,
a3b1,a3b2,a3b3
表a中的所有数据都能跟表b的所有数据有所对应;
首先把准备好三张表和其对应的数据:
班级表:
学生表:
课程表:
分数表:
2.内连接
通过两张表共有的列来筛选信息,达到尽快查询的目的。
语法:
select字段from表1别名1[inner]join表2别名2on链接条件and其他条件
select字段from表1别名1,表2别名2where链接条件and其他条件
2.1例子1:
查询许仙的成绩;
具体看看整个查询的过程;
首先直接进行学生表和分数表的链接查询:
select*fromstudentinnerjoinscore;
以及
查询到的表中共有行数据,每个人都对应了成绩表中的所有成绩,也就是说每个人有了21个成绩,所以9个学生有条数据,与上述的笛卡尔积相互对应起来。
接下来要给查询加上条件:我们知道在score表中,有student_id和course_id,因此要从score表中筛选出sutdnet_id和student中的id相等的分数。
select*fromstudentinnerjoinscoreonstudent.id=score.student_id;
此时,我们看到的表中,所有人的成绩和本人都对应起来,现在就可以去筛选出许仙了;
select*fromstudentinnerjoinscoreonstudent.id=score.student_idandstudent.id=4;
到这一步其实查询已经结束了,我们已经获得了许仙的各科成绩了,但是只有课程id不知道课程的名字。
进行改进:
selectstu.sn,stu.name,sco.score,cou.namefromstudentstuinnerjoinscorescoonstu.id=sco.student_id
innerjoincourseonscore.course_id=course.idandstudent.id=4;
分析上述代码,要查询的是学生表中的学生sn和name,以及成绩表中的score,以及课程表中的name;
首先通过分数表中的学生id和学生表中的id对应查到当前每个学生的成绩,然后通过分数表中的课程id在课程表中查询相对应的课程名;
上述代码也可以不使用innerjoin来查询:
2.2查询所有学生的总成绩
重点