sql case when用法_SQL 多表查询

本文深入介绍了SQL中的多表查询,包括使用UNION和UNION ALL进行表合并,以及不同类型的联结(交叉联结、内连接、左连接、右连接和全连接)的使用方法。通过实例展示了如何在查询中应用这些操作,如查询学生信息、成绩统计等。此外,还讲解了CASE表达式的应用,用于对数据进行条件判断和分段统计。

在SQL的学习和运用中,有时候我们需要同时在2张及以上的表格中查找我们需要的数据,这时就需要用到多表查询。

首先,我们可以通过相加两张表来得到两张表中的所有信息

表的相加,我们需要用到(union)

具体sql语句为:

select<列名>,<列名>,…
from <表名1>
union
select <列名>,<列名>,...
from <表名2>

输入语句 union all时,可显示出重的行

除了合并表之外,多表查询中我们还会用到联结。

什么是联结呢?联结是吧两个表中你所需要的数据,按照特定的关系关联在一起,并显示在一张表中的过程。

联结分为:交叉联结,内连接,左联结,右联结,全联结

1)交叉联结:把两列数据进行相互匹配,就像下图中这样

f8122b93b13f0f095320fc2f39987b0a.png

可也以理解成想扑克牌这样

b2399655f4c3ac18070c0cb48ed033f8.png

交叉联结在实际应用中并不多,但却是其他联结的基础

2)内连接(inner join)

内连接指的是将两个表中相同的部分取出

就像文氏图中展示的这样

b5d2d7961f7339dac1316ddd2e06c902.png

SQL语句

select ...
from 表1 as a 
inner jion 表2 as b
on a.列名=b.列名;

3)左连接(left join):以左边表格为母表,取出左边表格中的所有数据

文氏图:

80021a4b5ecb9be114f4f3c400b45f9e.png

SQL语句

select ...
from 表1 as a left jion 表2 as b
on a.列名=b.列名;

此时,显示的数据中其实包含了空值

增加一行SQL语句:

select ...
from 表1 as a 
inner jion 表2 as b
on a.列名=b.列名
where b.列名=Null;

这样得出的结果,就只剩下左表中的所有数据了,文氏图表示为下图:

c85742c214faad63fef9dead3cc12b5c.png

4)右联结(right join):取出右边表格中的所有数据

fdb3f26c30919ce8a7c379e68dc13001.png

SQL语句:

select ...
from 表1 as a right jion 表2 as b
on a.列名=b.列名;

6828231192e958655a72ef7aa6dcd8d7.png

去掉空值,只取出右边表中的数据

select ...
from 表1 as a left jion 表2 as b
on a.列名=b.列名
where b.列名=NULL;

5)全连接:取出两种表中的所有数据

1e329e329621ee8f6a065fde0c06700a.png

了解完联结以后,我们来用联结解决一些实际工作中会出现的问题

Q:1.查询所有学生的学号、姓名、选课数、总成绩

这里涉及到两张表,学号、姓名在表student中,课程号和成绩在表score中,于是,需要用到联结

具体SQL语句如下:

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

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

SQL语句:

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

Q3:查询学生的选课情况:学号,姓名,课程号,课程名称

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

最后,我们来了解一下case表达式

case表达式一般需要用在什么情况下呢?当我们需要对多个数据进行“是/否”看判断的时候,就需要用到case 表达式

比如,我们需要对学生成绩是否及格进行判断

首先,我们先看看case表达式长什么样

case when<判断表达式>then<表达式>
     when<判断表达式>then<表达式>
     when<判断表达式>then<表达式>
     ...
     else<表达式>
end

case语句会先对第一个when后面的条件进行判断,满足条件时,将会输出then后面的表达式;如果不满足,将会与第二个条件进行比对,一直比对到最后一个条件,若均不满足,将反对else之后的表达式

下面我们看一下具体的应用案例:

Q1.查询学生们的课程成绩是否及格

select 课程号,学号,成绩,
(case when 成绩>=60 then '及格'
       when 成绩 <60 then '不及格'
       else NULL
end)as 是否及格
from score;

Q2.查询每门课程的及格和不及格人数

在这个问题中,需要先对及格和不及格进行判断,在对各种类人数进行统计

select 课程号,
sum(case when 成绩>=60 then 1
       else 0
end) as 及格人数
sum(case when 成绩 <60 then 1
      else 0
end)as 不及格人数
from score
group by 课程号;

Q3.使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:

各分数段人数,课程号和课程名称

在这个问题中涉及到两张表的查询,也涉及到数据的判断

所以需要用到联结和case表达式

select a.课程号,b.课程名称,
sum(case when a.成绩 bewteen 100 and 85 then 1
         else 0
    end) as [100-85]人数
sum(case when a.成绩>=70 and 成绩<85 then 1
         else 0
    end) as [70-85]人数
sum(case when a.成绩>=60 and 成绩<70 then 1
         else 0
    end) as [60-70]人数
sum(case when a.成绩<60 then 1
         else 0
    end)as [<60]人数
from score as a right join crouse as b 
on a.课程号=b.课程号
group by a.课程号,b.课程名称;

SQLzoo 练习

ffafcc2ff9c717f424dd8c17568b9112.png

9ee1727575fe78a1d2909cba831f7d32.png

94eb560d142b35ee7dcb4e51e5e06832.png

47ff8203a6dbc9fe25459cb689eb46bd.png

850562d702301306aa20057aa9f1fe34.png

f8c9b5bc88a4706e371f59fde26c37df.png

08238f6d508d3ac4bca5a5419c19335e.png

bf0aadb5842b55ada8632688de040ed6.png

7b16268998303ef798790ecbef9337ca.png

db76a33f72952f0ad9980c78b8722f4a.png

3721b9c88a76f98bcc348cb86859e78b.png

3a018d15cd3a1adf0d12b75df517c9fb.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值