leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第1张图片

本篇介绍SQL的多表查询,具体分享内容如下:

  1. 表的加法
  2. 表的联结
  3. 联结应用案例
  4. case表达式

1. 表的加法

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第2张图片
合并这两个表

1.1 union——不包含重复值

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第3张图片

1.2 union all——包含重复值

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第4张图片

2.表的联结

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第5张图片
4张表之间的关系

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第6张图片

表的联结有以下5种:

  1. 交叉联结(cross join)
  2. 内联结(inner join)
  3. 左联结(left join)
  4. 右联结(right join)
  5. 全联结(full join)——此联结种mysql不适用

2.1 交叉联结(cross join)

交叉联结也称笛卡尔积,就是将表中的每一行都和另一个表中的每一行合并在一起。

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第7张图片

2.2 内联结(inner join)

内联结即查找出同时存在于两表中的数据。

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第8张图片

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第9张图片
select <表别名1>.<列名1>,<表别名1>.<列名2>,<表别名2>.<列名3> 
from <表1> as <表别名1> inner join <表2> as <表别名2> 
on <表别名1>.<列名1> = <表别名2>.<列名1>;

2.3 左联结(left join)

左联结将左侧表的数据全都取出来联结右侧表的值,没有匹配的话生成null,左联结见下方方文图

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第10张图片

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第11张图片

其中:以下表示使用左联结仅留下左表不包含右表部分

select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号 = b.学号
where b.学号 = Null;

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第12张图片

2.4 右联结(right join)

右联结会将右侧表中的数据全都取出来联结左侧表的值,没有匹配的话生成null,右联结见下方方文图

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第13张图片

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第14张图片

其中:以下表示使用右联结仅留下左表不包含左表部分

select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号 = b.学号
where a.学号 = Null;

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第15张图片

2.5 全联结(full join)——此联结种mysql不适用

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第16张图片

3. 联结应用案例

案例一:查询所以学生的学号、姓名、选课数、总成绩

翻译成大白话如下

  1. 学号、姓名(student表)
  2. 选课数(每个学生的选课数目:score表,按学号分组,对课程号计数count)
  3. 总成绩(每个学生的总成绩:score表,按学号分组,对成绩求和sum)

查询语句如下

select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩 
from student as a left join score as b
on a.学号 = b.学号
group by a.学号;

案例二:查询平均成绩大于85的所有学生的学号、姓名和平均成绩

翻译成大白话如下

  1. 查询出所有学生的学号(student表)、姓名(student表)、平均成绩(每个学生的平均成绩:score表,按学号分组,平均成绩用avg(成绩))
  2. 平均成绩>85

查询语句如下

select a.学号,a.姓名,avg(b.成绩) as 平均成绩 
from student as a left join score as b
on a.学号 = b.学号
group by a.学号
having avg(b.成绩)>85;

案例三:查询学生的选课情况

select a.学号,a.姓名,c.课程号,c.课程名称
from student as a inner join score as b
on a.学号 = b.学号
inner join course as c 
on b.课程号=c.课程号;

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第17张图片

4. case表达式

case表达式相当于条件判断函数,判断某一行是否满足判断条件,都不符合则运行else语句的内容。

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第18张图片

案例一:判断成绩是否及格,60分及以上为及格,60分以下为不及格

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第19张图片

案例二:查询出每门课程的及格人数和不及格人数

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第20张图片

案例三:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各科成绩,分别统计分数段人数,课程号和课程名称

leftjoin多表联合查询_跟我一起零基础学会SQL——多表查询篇_第21张图片

使用case语句时注意用end结尾

你可能感兴趣的:(leftjoin多表联合查询)