新建一个course1表,输入以上查询语句,可以看出course表和course1表中数据合并到了一起,表中的重复数据(0001 语文 0002)只保留一个.
如果想要重复的数据都保留下来,将union改为union all即可。
我们不难发现各个表中存在着关系,那么关系是如果建立的呢?两个表中的关联可以叫‘联结join’。
我们可知学生表和成绩表按学号产生了联结,用内联结可以查询出同时存在两表中的数据。
会将左侧的数据全部读取出来,相应的对应右边的数据。(合并时时交叉连结)如学号0004姓名王思聪的课程号,在右侧表中不存在该数据,但左侧表中存在,所以读取出来。
想显示出左侧表中的数据,不含两表共同数据如下:
与左联结相反,右表中的数据全部读取出来,为了清楚看出右联结的使用方法,在student表中删除学号0002姓名猴子的信息。
想显示出右侧表中的数据,不含两表共同数据如下:
查询结果返回左表和右表的所有行,如果某行数据有匹配的情况,两个行进行合并,如果没有匹配的话,另一表中用NULL值填充。
左联结、右联结:当实际业务中,想深层固定或行数的表单或者特别说明要哪一张表中的全部数据的时候。
内联结:来获取两个表中的公共部分。
如果用sql解决业务问题?1.翻译成大白话 2.写出分析思路 3.写出对应的sql子句。
练习:查询所有学生的学号、姓名、选课数、总成绩。
选课数:每个学生的选课数量,成绩表score按学号分组,对课程号计数。
总成绩:每个学生的总成绩,成绩表score按学号分组,对成绩求和。
练习:查询平均成绩大于85的所有学生的学号、姓名、平均成绩。
平均成绩:每个学生的平均成绩,按学号分组,对成绩求平均数。
练习:查询学生的选课情况:学号,姓名,课程号,课程名称
举例:case表达式用于select子句中
练习:查询出每门课程的及格人数和不及格人数。(因原数据无不及格人数,这里讲成绩>=80为优秀,<80为非优秀)
每门课程:按课程分组。
else语句可以省略,但为了良好的书写习惯,尽量写清楚。
end是不可以省略的。
case可以放在select语句的任意语句中。
什么时候使用case表达式呢?多种形式需要条件判断的时候
练习:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数,课程号和课程名。
分段:使用case表达式
各科成绩:按课程号分组
oracle里没有inner join吗?如果没有能用其它方式代替吗?
例1 查询course表和course1表的课程号、课程名称(无重复项)
例2 查询course表和course1表的课程号、课程名称(含重复项)
练习一:如何合并两个表?
①创建结构和数据相同的表
②合并表:见例1和例2。
二、表的联结:使用join子句把来自两个或多个表的行结合起来,基于这些表之间的共同字段
①定义:交叉联结(笛卡尔积)返回被连接的两个表所有数据行的笛卡尔积,返回结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数,没有匹配关系进行筛选。例如实际中的扑克牌。
注意:以下讲述到的联结均是以交叉联结为基础的操作,实际是对交叉联结进行过滤的结果。
①定义:内联结指取得两张表中满足存在连接匹配关系的记录。
例3 查询所有学生的学号、姓名、课程号。
①定义:除显示两表满足匹配关系的记录,还显示左边表不满足匹配关系的记录;
例4 查询学生表所有学生的学号、姓名、课程号。
③如何去掉左联结中两个表交集的内容?使用where子句实现。
例5 查询学生表中没有选择课程的学生的学生号、姓名、课程号。
①定义:除显示两表满足匹配关系的记录,还显示右边表不满足匹配关系的记录;
例6 查询成绩表所有学生的学号、姓名、课程号。
例7 查询学生表中没有成绩表中学生的信息的学生号、姓名、课程号。
定义:除显示两表满足匹配关系的记录,还显示左右表不满足匹配关系的记录;
注意:MySQL不支持全联结,仅了解概念即可。
6、一张表记住所有联结
①、使用场景:根据实际工作需要进行使用
②sql运行顺序更新:由于联结语句在from子句中,因此不影响整体运行顺序。具体如下:
2)、每个查询语句例运行顺序:先运行蓝框里的子句,再运行select子句,最后运行红框里的子句。
例8 查询所有学生的学号、姓名、选课数、总成绩
①学号、姓名查询自学生表student
②选课数即每个学生的选课数目,查询自成绩表score,并按学号分组,对课程号计数使用count函数
③总成绩即每个学生的总成绩,查询自成绩表score,并按学号分组,对成绩求和使用sum函数
第三步写出sql语句:
例9 查询平均成绩大于85的所有学生的学号、姓名和平均成绩。
①学号、姓名查询自学生表student
②平均成绩,每个学生的平均成绩,查询自成绩表score,并按学号分组,对成绩求均值使用avg函数。
第三步写出sql语句:
例10 查询学生的选课情况:学号,姓名,课程号,课程名称。
①学号、姓名查询自学生表student
②课程号、课程名称查询自课程表course
③学生表与课程表没有相同的列产生联系,需要通过成绩表构建联结
第三步写出sql语句:
练习五:见例8、例9、例10。
1、case表达式语法
例11 查询成绩表中学生成绩的及格情况,其中成绩>=60及格,成绩<60不及格。
例12 查询每门课程的及格人数和不及格人数。
①else子句可以省略不写,则默认为空值,建议不要省略
③case表达式可以放在sql的任一子句中,当需要判断时需要用到case表达式
练习六:见例12、例13。
本节学习了sql多表查询的相关知识,主要包含表的加法、表的联结、联结应用案例、case表达式。实际应用场景中经常会遇到多表查询的问题,而表的各种联结操作则提供了十分便利的方法,需要牢记各种联结关系之间的区别,使用场景。此外,case表达式在需要判断的情况下有着十分广泛的应用,可以跟各个子句结合实现复杂的查询,本节主要介绍了case子句在select子句中的使用,在其他子句中的搭配使用可以多加练习。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。