sql 两表数据合并_多表查询SQL语句
本篇文章中主要讲述以下内容:
一、表的加法
合并两张表的过程:
然后运用sql语句:
select 课程号,课程名称
from course
union
select 课程号,课程名称
from course1
以上子句会把两个表中重复数据删除。要想不删除重复的行,则需要在上面子句union的后面加一个all,变成union all。
二、表的联结
关系数据库里各表之间相互联结建立关系。
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.学号;
在左联结的基础上,去掉两表的公共部分:
select a.学号,a.姓名,b.课程号
from student as a left join score as b
on a.学号=b.学号
where b.学号 is not null;
4.右联结 right join
右联结是以右表为基础,根据on后给出的两表的条件将两表连接起来,结果会将右表所有的查询信息列出,而左表只列出on后条件与右表满足的部分。
select a.课程号,b.学号,b.姓名
from score as a right join student as b
on a.学号=b.学号;
select a.学号,a.姓名,b.课程号
from student as a right join score as b
on a.学号=b.学号
where b.学号 is not null;
5. 全联结 full join
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
6.SQL运行顺序:
1.先运行子查询
2.每个查询语句里的运行顺序:
1)先运行from where group by 和having子句
2)select 子句
3)最后运行order by和limit子句.
三、联结应用案例(常见面试题)
问题1:查询所有学生的学号、姓名、选课数、总成绩。
1.翻译成大白话就是:
1)学号、姓名(学生表student)
2)选课数(每个学生的选课数目:成绩表score,按学号分组,对课程号计数count)
3)总成绩(每个学生的总成绩:成绩表score,按学号分组,对成绩求和sum)
2.分析思路:
查询所有学生的学号,姓名、每个学生的选课数目、每个学生的总成绩。
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.学号;
问题2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩。
1.翻译成大白话就是:
1)查找所有学生的学号、姓名和平均成绩,学号、姓名在学生表student中,平均成绩可通过成绩表score中。
2)查找平均成绩>85
2.分析思路
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;
问题3*:查询学生的选课情况:学号,姓名,课程号,课程名称。(涉及三张表的联结。)
1.翻译成大白话就是:
1)学号,姓名(学生表student)
2)课程号,课程名称(课程表course)
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.课程号;
四、case表达式
case when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
when <判断表达式> then <表达式>
…
else<表达式>
end
举例:
select 学号,课程号,成绩,
(case when 成绩>=60 then'及格'
when 成绩<60 then'及格'
else null
end) as 是否合格
from score;
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 课程号;
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.课程名称;
sqlzoo习题:
The JOIN operation/zhsqlzoo.net
总结:注意区分左联结、右联结、内联结、distinct、 “%”、及case子句。
封面图片来源于网络。
sql 两表数据合并_多表查询SQL语句相关推荐
- SQL 将两张包含相同字段和不同字段的表数据合并成一张表
此为SQL案例:将两张具备相同字段,有一部分字段不相同的两张表获取查询结果为整合之后的. 两张表 table1 table2 我想要将两者的数据进行合并达到如下的效果: 这里限制条件有两个分别是dat ...
- python两个csv表数据合并_怎么用python把一个*。csv 文件里面的数据整合成一个表格...
展开全部 假设你这里是一个大文件32313133353236313431303231363533e78988e69d8331333332643336.用CSV缺省配置不能读大文件.我们自己写一个.de ...
- oracle 两表两列数据对比_当表中的列数不同时,如何比较oracle中的两个表
INTRO:下面我将展示如何做到"手工"这些工具(例如SQL Developer)可以做得更快更好.我对此(和你的!)的兴趣是双重的:学习和使用一些可以帮助解决许多其他问题的想法; ...
- mysql 将a表数据插入b表_查询A表数据插入到B表中 sql
前言: 最近遇到一个 查询A表数据插入到B表中sql的问 所以就发文章记录下,希望能帮助到家 开发环境 win10专业版本(其他操作系统具体安装mysql请百度 ) 准备工作: 安装MySQL 1 m ...
- 把多个excel表数据合并到一个工作簿中怎么操作
1.如下图含有两个工作表,工资表含有姓名.年龄.工资等信息,信息表含有姓名.身份证号码.出生日期信息.现在想要将这两个表格相同姓名员工数据合并到一个表中. 2.点击下图选项(Excel工具箱, ...
- java实现将A表数据转移到B表_解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表(merge into)...
作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表: 语法: MERGE INTO [your table-name] [rename your table h ...
- 如何将分表汇总到总表_Excel如何实现将动态的分表数据汇总到总表
将分表数据汇总到总表,需要支持动态更新,这绝对是职场应用中的痛点.很多高手都是用VBA宏代码来搞定,代码难写,不易修改,也不太灵活.事实上,Excel自带的功能就能解决. 分析:解决这个问题最多的方法 ...
- 两个链接合并_如何找到两个链接列表的合并点
两个链接合并 了解问题 (Understand the Problem) We are given two singly linked lists and we have to find the po ...
- oracle删除库里的所有表,清空mysql指定库里全部表数据-自动删除所有表,有外键约束的表优先删除...
清空mysql指定库里所有表数据-自动删除所有表,有外键约束的表优先删除 由于要清空数据库数据 ,手动非常麻烦.网上找了一下,有一个Oracle的,参照它,在其上修改一下用于Mysql,把代码奉献如下 ...
最新文章
- bootstrap 标签页tab切换js(含报错原因)
- 用java做出32选7_用java做的一个彩票32选7的简单程序
- 混合云数据中心运维的管理
- 伸展树(Splay tree)浅谈
- Ajax-基础篇(02)
- 【LOJ】#2184. 「SDOI2015」星际战争
- JavaFX中的塔防(6)
- 连接 Microsoft Cloud App Security 的数据
- Java ArrayList set()方法与示例
- 谈谈双亲委派模型的第四次破坏-模块化
- AngularJS+Satellizer+Node.js+MongoDB-Instagram-01
- dict.get 用法笔记
- 气象要素空间插值分析
- MapReduce操作Hbase史上最完整范例
- Iocomp for .net/wpf the Crack
- 啦啦外卖41.8[四端全开源版本]
- dependency-check-maven安全漏洞扫描工具介绍
- 数据库身份证号用什么类型_数据库设计规范
- C++语言基础——C++一本通:第四章 循环结构的程序设计:第一节 for语句:1082:求小数的某一位
- 解决SecureCRT连接网络设备console口失败的问题
热门文章
- linux反序列化漏洞,思科多个产品Java反序列化漏洞(CVE-2015-6420)
- 手机html5性能测试工具,HTML5模块 性能方面8大测试环节_小米 M3_手机硬件频道-中关村在线...
- linux firefox 脚本,linux下调整firefox的有用设置(高分辨率下需要)
- php拼接xml特殊字符不显示,使用PHP的XML特殊字符
- 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
- C语言基础知识整理(选择结构)
- Ray.tune可视化调整超参数Tensorflow 2.0
- Maven多模块打包
- python自动化测试常见面试题二_思考|自动化测试面试题第二波
- linux nginx 安装出错,Linux Nginx安装以及可能出现错误