sql 两表数据合并_多表查询SQL语句

5c79f26e12c5e6d0877e56ff77d03719.png

本篇文章中主要讲述以下内容:

e4acfdd12e0f1d4c64ca3e40eba60b91.png

一、表的加法

合并两张表的过程:

a8e86b430aebef453ab7dcfba7f6e610.png

然后运用sql语句:

select 课程号,课程名称
from course
union
select 课程号,课程名称
from course1

以上子句会把两个表中重复数据删除。要想不删除重复的行,则需要在上面子句union的后面加一个all,变成union all。

b9f56676fbde112b53ffb2bdae3e6309.png

c2d72d3f075c7912f2d85b822cf53520.png

二、表的联结

关系数据库里各表之间相互联结建立关系。

1. 交叉联结 cross join

交叉联结也称笛卡尔积,当a表有x行,b表有y行时,交叉联结就是x行与y行的所有组合组成的新表。在实际运用中,运用较少。

2.内联结 inner join

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

3. 左联结 left join

左联结是以左表为基础,根据on后给出的两表的条件将两表连接起来,结果会将左表所有的查询信息列出,而右表只列出on后条件与左表满足的部分。

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

bd413d134bacf23c1ddfe3a18fab968d.png

在左联结的基础上,去掉两表的公共部分:

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

7485908681d3faf4bb3983b2e86886c5.png

4.右联结 right join

右联结是以右表为基础,根据on后给出的两表的条件将两表连接起来,结果会将右表所有的查询信息列出,而左表只列出on后条件与右表满足的部分。

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

64eae3ba6a34a5286a11f3fda9e63145.png
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号=b.学号
where b.学号 is  not null;

80a6144adefab73ab83fa1837c9f5730.png

5. 全联结 full join

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

6.SQL运行顺序:

1.先运行子查询

2.每个查询语句里的运行顺序:

1)先运行from where group by 和having子句
2)select 子句
3)最后运行order by和limit子句.

c14bf175497b91571c944ddb0f592880.png

三、联结应用案例(常见面试题)

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

1.翻译成大白话就是:

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

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

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

2.分析思路:

查询所有学生的学号,姓名、每个学生的选课数目、每个学生的总成绩。

326e37f9623a94c34d3f970d2580e1c8.png

3.将分析思路写成sql语句:

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

07f709185a445ef9fa237d0051f756b3.png

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

1.翻译成大白话就是:

1)查找所有学生的学号、姓名和平均成绩,学号、姓名在学生表student中,平均成绩可通过成绩表score中。

2)查找平均成绩>85

2.分析思路

74417fbb57b4929c7b62a25e7453a3b3.png

3.将分析思路写成sql语句:

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;

564eb6c73d665e68099bc10483e324bd.png

问题3*:查询学生的选课情况:学号,姓名,课程号,课程名称。(涉及三张表的联结。)

1.翻译成大白话就是:

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

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

636d20581da08b177bca7f4396d48bb4.png

2.分析思路

这里学生表和课程表无法直接联结,因此需要通过成绩表score联结,那么这里就涉及到三张表的联结了。

3.将分析思路写成sql语句:

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.课程号;

1d4b0e520f7eebae6fe989ac1d2077f8.png

四、case表达式

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

举例:

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

e3bdc7aa3b1630fa22e28aaa54334ee5.png

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

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 课程号;

1ad34bbfe384843fd42384f146ec7987.png

case表达式注意事项

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

case表达式中else子句可以不写,默认为空值,但一般情况下还是要写上。case表达式可放在任意子句上。

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

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

10037a913881adc9492664b71437da02.png

sqlzoo习题:

The JOIN operation/zh​sqlzoo.net

ebe09985b6c8c6fd8c2e0a7a7faef280.png

c709d6263431be24bd0a8384f1b186cb.png

e4c122bce83bd003586b8ebbf0b2c662.png

ff36baa1c346763e86a299db08e54496.png

e2589c8b952345dfb14b06f217a17ca2.png

2488f453765dbbea2bc49a3adf424eca.png
注意:外国人姓名顺序

3223bd448960f40e8ea8105bab50e82e.png

52e248d8a51abf3d6959376a4c06c7f5.png

9736bd55be0cf73ba94f8fa5f5fcac65.png

e5bad5b3fa8c613163bb3c48630c6812.png
注意:distinct为保留唯一值。

7d168165655caee3a4f7748f19e4209d.png

c37cefef7836979025e490977201f44d.png

c8191ef149a4f70a78dfa159595df5a8.png

bf37c80123f2a566599ec8e30b1ef935.png

64f038d6b1d1fed031cc1497b203e9a8.png

总结:注意区分左联结、右联结、内联结、distinct、 “%”、及case子句。

封面图片来源于网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angularjs增删改查数据_MongoDB数据读写操作(增删改查)总结

《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言&#xff0c;希望大家以后关注本头条号更多的内容。一、在执行mongo.exe文件后&#xff0c;进入MongoDB的shell 操作1、创建一个数据库use users2、查…

SpringAop与AspectJ的联系与区别____比较分析 Spring AOP 和 AspectJ 之间的差别

SpringAop与AspectJ的联系与区别 区别 AspectJ AspectJ是一个面向切面的框架&#xff0c;它扩展了Java语言。AspectJ定义了AOP语法&#xff0c;所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 spring aop Spring提供了四种类型的Aop支持 * 基于经典的…

ssrf漏洞内网渗透_渗透小白看了也能明白的SSRF

什么是SSRF含义服务器端请求伪造&#xff08;SSRF&#xff09;是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)攻击者能够利用目标帮助攻击者访问其他想要攻击的目标攻击者要求服务器为他…

高并发之服务降级和服务熔断____服务降级、熔断、限流的区别

高并发之服务降级和服务熔断 服务降级&#xff1a; 服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级&#xff0c;以此环节服务器的压力&#xff0c;以保证核心任务的进行。 同时保证部分甚至大部分任务客户能得到正确的相应。也就是当前的请求处理…

Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation

Controller获取数据导出Excel&#xff0c;详细教程 1&#xff1a;导入对应依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.3</version></dependency><dependency&g…

01 - java 开始

Java 的优势 java适合做web后台 java配置环境的时候 java的安装目录&#xff1a;JAVA_HOMEjdk的安装目录&#xff1a;%JAVA_HOME%\bin java的执行机制 先将.java的文件用 javac 编译成 .class的字节码文件再将这些 .class 的字节码文件用 java 执行&#xff08;执行的是文…

15 - java 继承

java继承 This > Son Super > Father Object 类是所有类的顶级父类 只要创建一个类默认都会继承这个顶级父类 – Object 在子类继承父类里面 构造器必须先构造一个父类&#xff08;先有爸爸&#xff0c;才有儿子&#xff09;&#xff0c;必须首先构造父类&#xff0…

easyPOI基本用法详解

文章目录easyPOI基本用法1.Excel文件的简单导入和导出1.1准备工作1.2导入1.3导出1.4图片的导出1.5图片的导入1.6excel模板导出文件1.7excel转html2.Word文件导出2.1使用word模板导出2.2使用word模板导出多页3.excel导入时验证3.1环境准备3.2实战演练3.3注意事项easyPOI基本用法…

16 - java 类加载顺序

类的加载顺序 类对象、静态变量是存在元空间的方法区&#xff0c;实例对象是new出来的&#xff0c;放在堆里面的 一个类加载到内存的完整过程 加载父类 --> 加载子类 --> 构造父类 --> 构造子类 class文件要从磁盘加载到内存形成对象 内存靠地址去取寻址 – 随机存…

360全景倒车影像怎么看_别克关怀-后视镜和倒车影像 倒车时到底看哪个

很多人在考驾照的时候&#xff0c;倒车倒的都很熟练&#xff0c;但是一上路就不行了。一方面&#xff0c;这是因为道路上的状况多变&#xff0c;时常有行人经过&#xff0c;另一方面&#xff0c;上路之后&#xff0c;遇见的停车位千奇百怪&#xff0c;什么样子的都有&#xff0…

17 - 引用类型比较内容

引用数据类型比较 引用数据类型直接比较一定是 false --> 比较的是它俩的地址 Animail a1 new Animal(); Animail a2 new Animal(); System.out.println(a1 a2); //false特殊的 String String s1 "a"; String s2 "a"; System.out.println(s1 s…

springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel

springboot使用jxls导出excel 实现思路&#xff1a; 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板&#xff0c;然后在具体的导出接口业务代码里通过IO流加载到这个Excel模板文件&#xff0c;读取指定的工作薄(也就是excel左下角的Shee…

idea(mac) 使用收集

其实 idea 后面的 webstorm phpstorm pycharm… 都大同小异 idea 使用积累1. 设置代码区字体大小2. command​ 滚轮改变字体大小3. 去掉代码区中间的白线4. 查看项目配置5. 自动删除类中无用包、自动导入包6. 显示行号和方法分隔符7. 提示的时候忽略大小写8. 统一显示 utf - 8…

epp是什么意思_什么是1K/2K/3K注塑?

ABC小词条的出现是因为公众号后台大家留言提问的名词很多&#xff0c;我们每周挑一个成本分析相关的小知识点&#xff0c;可能是工艺&#xff0c;成本方法&#xff0c;产品方面等话题&#xff0c;来做一个简短的ABC解释&#xff0c;如有错误欢迎指出。文末会提出一个问题&#…

facebook对话链接_Facebook已开源其最新的聊天机器人Blender

它是一种更具人性化的聊天机器人&#xff0c;并击败了Google成为世界上最好的聊天机器人> Photo by Alex Haney on Unsplash4月29日&#xff0c;Facebook AI Research(FAIR)宣布已构建并开源了一个新的聊天机器人Blender。最先进的开源聊天机器人Facebook AI拥有开源的Blend…

基于easypoi实现自定义模板导出excel

项目中需要做一个统计报表功能&#xff0c;实现各种Excel报表数据导出。要求表头能够动态配置&#xff0c;表数据通过存储过程实现&#xff0c;也要求能够动态配置。 技术选型&#xff1a; 由于之前在项目中使用过easypoi&#xff0c;相对于原生apache poi&#xff0c;能够用很…

vb6 datagrid表格垂直居中_老板不喜欢看你的Excel表格,学完这些美化技巧,早日升职加薪...

Excel报表是工作中经常要制作的&#xff0c;给老板看的表格越是简单明了越好&#xff0c;工作得到认可&#xff0c;给你升职加薪&#xff0c;如果你发给你老板的表格是这样的&#xff1a;对齐方式各种各样&#xff0c;数据看起来也很枯燥&#xff0c;仅需简单4点&#xff0c;轻…

Java接口修饰符详解

接口就是提供一种统一的”协议”&#xff0c;而接口中的属性也属于“协议”中的成员。它们是公共的&#xff0c;静态的&#xff0c;最终的常量。相当于全局常量。抽象类是不“完全”的类&#xff0c;相当于是接口和具体类的一个中间层。即满足接口的抽象&#xff0c;也满足具体…

查看论坛隐藏链接_软连接与硬链接的区别

点击上方蓝色“后端开发杂谈”关注我们, 专注于后端日常开发技术分享硬链接与软连接的联系与区别文件都有文件名和数据, 这在Linux上被分为两部分: 用户数据(user data) 与 元数据(metadata). 用户数据, 即文件数据块( data block), 数据块是记录文件真实内容的地方; 元数据是文…

java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽

为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控&#xff0c;那么如果程序出现异常错误时要如何排查呢&#xff1f;并且系统在运行时做了哪些事情我们又从何得知呢&#xff1f;这个时候日志这个概念就出现了&#xff0c;日志的出现对系统监控和异常分析起着…