怎么用sql按条件把表分离_SQL多表查询

20ed39f744bfd09b56752a2213218270.png

多表查询:从多张表中获取数据;

1、表的加法(union)

2f84eeefce697aed0096671f1fad7eba.png

两个表的结构一样,但是红框的数据不一样,利用表的加法,把两张表合并成一张表;

表的加法(union)是将两个表的数据按照行合并到一起,删除重复数据;

314e30823bb1224e8c8729dde5fe91f1.png

要想保留重复数据,用union all

54f959b88b18e5280f722138a57c7bd7.png

2、表的联结

1)什么是联结

关系就是数据库能对应的匹配,在关系数据库中,叫做联结(join);

联结是通过表和表之间的关系,把表合并到一起的操作;

62f1bf72f27196875c9dfe38f182d88f.png

学生表-成绩表 通过学号联结;成绩表-课程表 通过课程号联结;课程表-教师表 通过教师号联结;

2)常见的联结方式

751be94bb17f95cdd17e323344540e0b.png

①交叉联结(笛卡尔积)

是将表中的每一行,都与另一个表的每一行合并在一起;

如图:表1、表2、表3分别和A、B合并在一起;

新表的行数=表1行数*表2行数。

3c3ce1e62443e9ec0417fa2c60fe6eac.png

交叉联结在实际工作中用的比较少,结果行数太多,需要花费大量的运算成本和设备的支持,

而且行数太多,实际价值有限;

但交叉联结是后边所有联结的基础,其他的联结都是在交叉连接的基础上+过滤条件。

②内联结(inner join)

查找同时存在在两张表中的数据

e124e209979309e4e9fa47e2d9159b89.png

内联结的运行:分别从学生表、成绩表中取出符合条件的行 → 交叉联结;

内联结SQL语句:

/*

③左联结(left join)

将表中左侧的数据全部查找出来,左联结是下图中红色的部分;

83dd75c1a103dcc6387adecdc76f3fe4.png

左联结的运行:通过学号产生匹配关系,左联结会把左边的表作为主表,全部数据读取出来(学生表的数据全部取出来),右边的表只取学号相同的数据,然后交叉联结合并;

左联结SQL语句:

select 

如何联结下图的语句,只保留红色区域

fd17cd39add56cdf89f53f886587a66c.png

左联结+where子句

b931c67d00dac7cbe00f2497e8a051ae.png

④右联结(right join)

右侧表中的数据全部取出来,右边0005在左边的表中没有对应的数据,显示null

41f017fcb10861b9974ec52b59058168.png

右联结的运行:通过学号产生匹配关系,把右表的全部数据读取出来(成绩表的数据全部取出来),左边的表只取学号相同的数据,然后交叉联结合并;

右联结SQL语句:

select 

右联结基础上,去掉重合的部分

601ea6b66f9f1cf08a4f9ba5ed84964a.png

5a6f7d383a0853ce12fc61cf389635ec.png

⑤全联结(full join)

返回左表和右表的所有行,当某行和另一个行中数据匹配的时候,两个行进行合并,如果没有匹配的行,对应的地方用空值填充,my sql不支持全联结;

cf33ecaf570c9578c94aaaa8a6c22f87.png

b0dbe91f18b569a4236b735fd37ea309.png

SQL 联结方式总结

c6fcca4bf1905865933dac1f6f33241d.png

3、联结应用案例

翻译成大白话,写出分析思路,写出对应的sql语句;

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

1)学号、姓名(学生表 student)

2)选课数(每个学生的选课数目:成绩表score,按学号分组,对课程号计数count)

3)总成绩(每个学生的总成绩:成绩表 score,按学号分组,对成绩求和sum)

/*

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

1)查询出所有学生的学号,姓名,平均成绩;学号,姓名(在学生表student);

平均成绩(每个学生的平均成绩:在成绩表score,按学号分组,平均成绩:avg(成绩));

2)平均成绩>85

select 

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

1)学号,姓名在学生表(student)

2)课程号,课程名称在课程表(course)

学生表和课程表发生联系,需要通过成绩表建立关系

fcf215f110b0a83635703faf956a8669.png
select 

4、case 表达式

case when <判断表达式> then <表达式>

when <判断表达式> then <表达式>

when <判断表达式> then <表达式>

......

else <表达式>

end

1)case表达式的作用

当有多种情况需要判断的时候,就需要使用case表达式了;

可以帮助我们解决复杂的查询问题,case表达的作用相当于进行一个条件判断的函数,用来判断每一行,是不是满足某个条件;

如何符合某个条件,就运行后边的then子句,不符合条件继续进行运行when子句,如果还没有查找到合适的数据,就会到else子句。

2)问题1:

select 

b4ba71864166b682677dc3fd0940193b.png

运行顺序:

第一步:先运行>=60,满足后,显示及格,end;

第二步:在运行<60,满足后,不及格,结束end。

问题2:查询出 每门课程及格人数 和 不及格人数

3eaacad3a00cd2c961ccf5a256d14efd.png

查询出 每门课程 的人数

select 

76372e4fe37f4dccfe6acbdae7be4ef9.png

查询出 每门课程及格人数不及格人数

select 

052b197cd20c8801fb0541bedd13edf0.png

3)case表达式 注意事项

①else可以省略不写,这时候默认else是空值,为了养成更好的书写习惯,不建议省略;

②最后的end不能省略;

③把case表达式放在了select子句中,对查询结果进行了条件判断,其实case表达式可以写字SQL语句的任意子句中。

练习:

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

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

各分数段人数(成绩表 score),课程号和课程名称(课程表 course)

select 

5、SQL Zoo练习

d222b18b01713d56a0fc0d952df06613.png
/*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值