sql 相加_SQL:多表查询

一,表的加法

在原有school数据库里再创建一张跟course结构相同的表course1,可以【右击course】,【点复制表】-【选结构和顺序】,然后把course1里按照要求修改数据

223e217807cbfd8ff36ce6b1c953ec83.png

270f3027186fc6f285aae59c12cd967e.png

完成操作后发现course和course1 结构是一样的,列和列的数据类型是一致的,不同的是红色框的数据

练习:将course和course1相加,用union将两张表的查询语句结合一起

文氏图:加法(Union)

ecef946901a2ba2be8650363ed647b5d.png
图一

表的加法会把表里重复的数据删除,只保留一个(图一);若想要保留2张表里重复的行,在Union后加all 即可(图二)

f944f0d0f3a681491398321159beabbb.png
图二

二,表的连接

School数据库里4张表

319e353b49cff6da9720b6f2e60a539b.png

cb520a5bbdcbb4b4fbe2554196c31d9f.png
学生表和成绩表之间有什么关系呢?

student和score这两张表通过学号关联起来,学号0001的成绩,可以通过成绩表里查学号0001的行,一共发现3行,对应是找到了学号0001三门课程的成绩。

School数据库里四张表之间的关系

075f369e6c64a8ba307f1294a9875c30.png

c21be86f1c2fb2d0427c3a716ce887b5.png
4张表联结关系图

3c1b5e8c0b3d2acbab703f4832ad1df6.png
  • 交叉联结cross join:(将一个表的每一行 与 另一表中的每一行 合并在一起)

c558080e776582b12af2f2d4d967c87d.png
表1 三行数据;表2 两行数据 交叉联结=3*2 六行数据

生活中典型的交叉联结 :扑克牌

13张牌(A,1,2,3,4,5,6,7,8,9,10,J,Q,K)和 四种花色(♠,)交叉联结 13*4=52张牌

【注】:交叉联结实际业务用的比较少(耗时成本;没有实际价值),交叉联结是所有联结的基础

  • 内联结inner join:(查找出同时存在于两张表的数据)

bba29d94680c5beaf4301ba1e0b1a36e.png

fc86002fb7781bdb9ac71e8b3cd5cb93.png

a8b9b949c3c21eed542ece305cfcd2d8.png
  • 左联结left join: (将左侧的表作为主表,将左表数据全部取出,右边表只选出和左边表相同列名的行)

ab167eb86863cbd9528999b4af753169.png

c206af4030763fc6c04f00597eefd035.png

00980de778e8174bc90609f2de681b8c.png
  • 右联结right join:(将右侧表的数据全部取出,将左侧表中与右侧表相同列名的行取出)

0d83c190665c43e50e531163713b432d.png

da148283fa3cdf0334fc0d5b4d34f723.png

e8cf950e5a49737e2a9b9125268cd488.png
  • 全联结 full join (查询结果返回左表和右表中的所有行。当某行和另一表中有匹配的时,两行进行合并;若某行跟另一表中没有匹配时,另一表中对应的值用空值来填充)

【注】:MySQL是不支持全联结,理解概念即可

6cdcc1523c25c49b1dd4c28db61cbfba.png

所有SQL联结:

e971ded5539e2f23426812a3548522d8.png

复习SQL运行顺序:

  • 先运行子查询
  • 每个查询语句中的运行顺序
    • 1,先运行篮框的子句
    • 2,select子句
    • 3,最后运行红框的子句

c2a4fdcfd930a35ab10ceb6dd16899c0.png

三,联结应用案列

如何用SQL解决业务问题

  1. 翻译成大白话
  2. 写出分析思路
  3. 写出对应的SQL语句

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

1:翻译为大白话

  • 学号、姓名: 学生表student
  • 选课数: 每个学生的选课数:成绩表 (按学号分组,对课程号计数count)
  • 总成绩:每个学生的总成绩:成绩表(按学号分组,对组里成绩求和sum)

2:写出分析思路

  • select 查询结果 (学号、姓名、选课数、总成绩)
  • from 从哪张表查找数据 ( 学生表、成绩表)【2张表 用什么联结,哪种联结
  • where查询条件(
  • group by 分组(学号)
    • 选课数: 每个学生的选课数:成绩表 (按学号分组,对课程号计数count)
    • 总成绩:每个学生的总成绩:成绩表(按学号分组,对组里成绩求和sum)
  • having 对分组结果指定条件(
  • order by 对查询结果排序(
  • limit 从查询结果中取出指定行(

3:写出SQL语句

f678033438b030c6404de169028cd088.png

问题2:查询平均成绩大于85的所有学生的 学号、姓名、平均成绩?
1:翻译为大白话

  • 查询所有学生的学号,姓名,平均成绩(学号、姓名 在 学生表student; 平均成绩 在 成绩表score [ 按学号分组,avg(成绩) ])
  • 平均成绩>85 (分组后)

2:写出分析思路

  • select 查询结果 (学号,姓名,平均成绩)
  • from 从哪张表查找数据 ( 学生表、成绩表)【2张表 用什么联结,哪种联结
  • where查询条件(
  • group by 分组(学号)
    • 平均成绩: 按学号分组,计算avg(成绩)
  • having 对分组结果指定条件(avg(成绩)>85
  • order by 对查询结果排序(
  • limit 从查询结果中取出指定行(

3:写出SQL语句

4d2fba72c62dbd2598f263c2543eb317.png

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

1:翻译为大白话

  • 学号、姓名: 学生表student
  • 课程号,课程名称:课程表course

【注】:学生表student 和 课程表course 是需要通过 中间的成绩表建立关系(3张表联结)

a285aa9c1582f518d503554e6e2d6425.png

2:写出分析思路

  • select 查询结果 (学号,姓名,课程号,课程名称)
  • from 从哪张表查找数据 (学生表,成绩表,课程表)【3张表 用什么联结,哪种联结
  • where查询条件(
  • group by 分组()
  • having 对分组结果指定条件(
  • order by 对查询结果排序(
  • limit 从查询结果中取出指定行(

3:写出SQL语句

57a7109e5891b982b4b7970b762efc07.png

四,Case表达式

8181b77014edb7afb7642ff7f23c9d50.png

问题1:查询成绩表里的成绩是否及格?

17d7cf5466d2aa5d78a3d151b9b84b21.png

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

2ef869ba5a497b4c4cc34240041e00d4.png

分析思路:

  • 查询 每门课程 的 人数 (以课程号分组)
  • 及格人数 和 不及格人数 (用sum函数和case表达式)

38f2cb0d89b33ccb29b8f133f1b0ddcc.png

case表达式 注意事项:

  • else子句可以省略不写,默认空值,为了更好的SQL书写习惯,建议不要省略
  • end 是不可以省略不写的
  • case表达式放在select子句中对查询结果进行判断,其实case表达式可以写sql任意子句里

case表达式有何作用何时使用呢:当有多重情况需要判断时,或者需要自定义分组

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

  • 查询出各分段人数:成绩表score (设及 自定义分组,用case表达式)
  • 课程号,课程名称:课程表course

26f60a5f1e5bd7e0d258dba4aec27b64.png

SQLZOO (Join)练习:

e92f70bbc4121193abeac9fe0ac81463.png

bffddf0e7941a02bbde13b83113513e0.png

fd07eea0e3d7cf9d5213c3bbf16d4f22.png

41cdce90c8dd3a68e982a62e5c76d653.png

b477bcb2f07406f9ea095795d97e15be.png

5943327e6f5518ec5b92cb065a4f94c2.png

21d3f285c8ce1588decb0ca97fdcbc93.png

7374e54cb2a21057b1a1e2db06a9f42e.png

c35dec79e3dff85744a14105fd2ba227.png

ab4566d09132e97b9f7d8c2f9f25b360.png

4bbe77dc8362143ed0b8eda5445ed554.png

f2e9c807f1dd796cd4e55e3af5b03824.png

ceb0644b8cee032673ac1d0ee9d6a8c4.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值