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

一、表的加法

合并两张表的过程:

然后运用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/zh​sqlzoo.net

注意:外国人姓名顺序
注意:distinct为保留唯一值。

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

封面图片来源于网络。

sql 两表数据合并_多表查询SQL语句相关推荐

  1. SQL 将两张包含相同字段和不同字段的表数据合并成一张表

    此为SQL案例:将两张具备相同字段,有一部分字段不相同的两张表获取查询结果为整合之后的. 两张表 table1 table2 我想要将两者的数据进行合并达到如下的效果: 这里限制条件有两个分别是dat ...

  2. python两个csv表数据合并_怎么用python把一个*。csv 文件里面的数据整合成一个表格...

    展开全部 假设你这里是一个大文件32313133353236313431303231363533e78988e69d8331333332643336.用CSV缺省配置不能读大文件.我们自己写一个.de ...

  3. oracle 两表两列数据对比_当表中的列数不同时,如何比较oracle中的两个表

    INTRO:下面我将展示如何做到"手工"这些工具(例如SQL Developer)可以做得更快更好.我对此(和你的!)的兴趣是双重的:学习和使用一些可以帮助解决许多其他问题的想法; ...

  4. mysql 将a表数据插入b表_查询A表数据插入到B表中 sql

    前言: 最近遇到一个 查询A表数据插入到B表中sql的问 所以就发文章记录下,希望能帮助到家 开发环境 win10专业版本(其他操作系统具体安装mysql请百度 ) 准备工作: 安装MySQL 1 m ...

  5. 把多个excel表数据合并到一个工作簿中怎么操作

    1.如下图含有两个工作表,工资表含有姓名.年龄.工资等信息,信息表含有姓名.身份证号码.出生日期信息.现在想要将这两个表格相同姓名员工数据合并到一个表中. ​ ​ 2.点击下图选项(Excel工具箱, ...

  6. 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 ...

  7. 如何将分表汇总到总表_Excel如何实现将动态的分表数据汇总到总表

    将分表数据汇总到总表,需要支持动态更新,这绝对是职场应用中的痛点.很多高手都是用VBA宏代码来搞定,代码难写,不易修改,也不太灵活.事实上,Excel自带的功能就能解决. 分析:解决这个问题最多的方法 ...

  8. 两个链接合并_如何找到两个链接列表的合并点

    两个链接合并 了解问题 (Understand the Problem) We are given two singly linked lists and we have to find the po ...

  9. oracle删除库里的所有表,清空mysql指定库里全部表数据-自动删除所有表,有外键约束的表优先删除...

    清空mysql指定库里所有表数据-自动删除所有表,有外键约束的表优先删除 由于要清空数据库数据 ,手动非常麻烦.网上找了一下,有一个Oracle的,参照它,在其上修改一下用于Mysql,把代码奉献如下 ...

最新文章

  1. bootstrap 标签页tab切换js(含报错原因)
  2. 用java做出32选7_用java做的一个彩票32选7的简单程序
  3. 混合云数据中心运维的管理
  4. 伸展树(Splay tree)浅谈
  5. Ajax-基础篇(02)
  6. 【LOJ】#2184. 「SDOI2015」星际战争
  7. JavaFX中的塔防(6)
  8. 连接 Microsoft Cloud App Security 的数据
  9. Java ArrayList set()方法与示例
  10. 谈谈双亲委派模型的第四次破坏-模块化
  11. AngularJS+Satellizer+Node.js+MongoDB-Instagram-01
  12. dict.get 用法笔记
  13. 气象要素空间插值分析
  14. MapReduce操作Hbase史上最完整范例
  15. Iocomp for .net/wpf the Crack
  16. 啦啦外卖41.8[四端全开源版本]
  17. dependency-check-maven安全漏洞扫描工具介绍
  18. 数据库身份证号用什么类型_数据库设计规范
  19. C++语言基础——C++一本通:第四章 循环结构的程序设计:第一节 for语句:1082:求小数的某一位
  20. 解决SecureCRT连接网络设备console口失败的问题

热门文章

  1. linux反序列化漏洞,思科多个产品Java反序列化漏洞(CVE-2015-6420)
  2. 手机html5性能测试工具,HTML5模块 性能方面8大测试环节_小米 M3_手机硬件频道-中关村在线...
  3. linux firefox 脚本,linux下调整firefox的有用设置(高分辨率下需要)
  4. php拼接xml特殊字符不显示,使用PHP的XML特殊字符
  5. 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
  6. C语言基础知识整理(选择结构)
  7. Ray.tune可视化调整超参数Tensorflow 2.0
  8. Maven多模块打包
  9. python自动化测试常见面试题二_思考|自动化测试面试题第二波
  10. linux nginx 安装出错,Linux Nginx安装以及可能出现错误