下午写完了上一篇文章,晚上就开始做牛客的SQL题啦,然后发现少少的十题就用到了好几次多表连接,case在实际分析过程中也非常常用,所以我打算单独把多表查询和case拉出来写一篇文章。


文章目录:

  1. 表的加法
  2. 表的联结
  3. 联结案例
  4. case表达式

一、表的加法

表与表相加最简单的方法就是使用union/union all这两个关键字,其中union会在求并集的时候去除完全一致的记录行,而union all则会保留所有的行。

例如:新建一个course1表,分别使用union/union all将其与原有course表合并

先看course1:

course:

course

union:

union all:

但是前文说的"重复",是只看主键,还是一行里所有的字段都看呢?

我将course1里 "0001 语文 0002"暂时改成了"0001 语 0002",执行同样的union语句:

使用union时,MySQL判断是否是重复行会比较所有的字段

注意事项:

  1. union(all)两侧的查询语句如果最终的输出列数量不一致,就会报错:
错误信息:查询语句应该有数量一致的结果列

二、表的联结

为了降低数据库的冗余,使数据库好维护,也为了让相应的用户只看到自己该看的信息,我们在设计数据库时会尽量避免建立一个字段很庞杂的表。但实际使用的时候,我们往往需要结合多个表的信息一起看,这就要涉及到表的联结啦!

表的联结,往往是靠他们之间共有的列实现的:student(学号,姓名,性别),score(学号,课程号,成绩),这两个表就可以通过"学号"联结起来,查出同一个学生学习了哪些课程,成绩如何。

cross join(求笛卡尔积)由于使用频率不高,在此先略过。

①inner join 内连接:

运行示意图:

SQL示例:

select column1,column2,...column n

from table1 inner join table2

on table1.共有列=table2.共有列

where condition...;

②left join 左连接:

运行示意图:

SQL示例:

select column1,column2,...column n

from table1 left join table2

on table1.共有列=table2.共有列

where condition...;

但!是!想求出下图的红色块怎么办?

左连接由于保留了左表的所有记录,因此在右表做匹配时可能会存在没有值能和左表匹配上的情况。此时在联结出来的表中,有些记录的右表字段都是NULL。

NULL这一特征,就是我们破题的题眼→只要我们用where找出联结表中右表字段(多用的是左右两表的共有字段)为NULL的值,那么问题就解决了

SQL示例:

select * from table1 left join table2

on table1.sharedcolumn=table2.sharedcolumn

where table2.sharedcolumn IS NULL;→不要忘了判断是否为空用的关键字是 IS (NOT) NULL,而不是'=NULL'

③right join 右联结

SQL示例:

select column1,column2,...column n

from table1 right join table2

on table1.共有列=table2.共有列

where condition...;

和left join 一样的问题:怎么求出红色块

只要我们用where找出联结表中左表字段(多用的是左右两表的共有字段)为NULL的值,问题就解决了,具体SQL代码见上文。

注意:左右表联结由于只有一个表保留了所有记录行,因此有主次表之分。而主次表这样的情况在实际情况中非常常见,在此补充一个我做题时遇到的两个案例

图中的SQL已经通过了系统的检查

③full join 全连接

MySQL不支持full join,所以在这里不多展开了。

三、联结实用案例

①求各学生的学号,姓名,选课数以及总成绩

由于要统计所有学生的信息,所以无论他是否选课,都应该被呈现在结果里。故应该以student表为主表做left join

②求平均成绩超过85的所有学生的学号,姓名,平均分

由于题目问的是平均成绩超过85的学生,因此没有选课的学生就不必考虑了。在此可以用score做主表left join student,也可以直接inner join

③求各个学生的学号,姓名,选修课程号,课程名称

由于是求所有学生的选课情况,因此无论有没有选课都应该被包含在结果里,故应将student做为主表且保留所有记录,即以student为主表left join其他表。

四、case表达式

case表达式就像是中文中的固定搭配:如果...就..否则...,它可以实现许多复杂的判断条件。

SQL结构:

case(

when 列名 判断条件1 then 满足判断条件的操作1

when 列名 判断条件2 then 满足判断条件的操作2

...

ELSE 以上所有判断条件都不满足时对应的操作

END)

常用场景:

①做为查询结果中的一列,例如:

select 学号,(case 性别=‘F' '女' else ‘男' END) as 性别

from student;

②做聚合函数括号内的组成部分

sum(case avg(成绩)>60 then 1

else 0

END) as 及格人数

③做查询范围

④修改某列的值

update 学生

set 性别=

(case 性别='M' '男' else '女' end);

应用案例:查询每门课有多少学生及格,多少同学挂科

select 课程号,sum(case when 成绩>60 then 1 else 0 end) as 及格人数,count(*)-及格人数 as 不及格人数

from score

group by 课程号;

注意事项:case表达式中else可以省略,但end不行。

sql 两个表字段不一样合并查询_数据分析进阶--SQL多表查询相关推荐

  1. postgres sql 多表联合查询_从零学会SQL-多表查询

    之前学习的内容几乎针对单个表进行简单操作,实际工作中可没有这么简单,复杂的表结构和多表数据关联进行分析,这时候需要我们掌握多表查询方法,一如既往,我们先看一下这篇的主要内容: 表的加法 表的联结 联结 ...

  2. SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决

    SQL Server2019 数据库查询所有数据库名.表名.表结构.表字段.主键方法演示 第一章:查询方法 ① 查询所有数据库名 ② 查询所有表名方法 ③ 查询表结构.表字段方法 ④ 查询主键方法 第 ...

  3. 通过SQL一键解析表字段血缘关系

    可以根据sql文件中的sql快速解析出表字段到字段的血缘关系,支持mysql.oracle.hive.impala.greenplum等数据库sql语法解析,可以在sql文件中放如多段sql解析,也可 ...

  4. postgresql两个列模糊比较_数据分析之SQL优化系列(二)---PostgreSQL 的索引

    参考<PostgreSQL11.2-中文手册> 下面这个链接,讲的通俗易懂,可以看看. 数据分析师不得不知道的SQL优化 - 鑫获 - 博客园​www.cnblogs.com 索引是提高数 ...

  5. sql 多表多行模糊查询_从零开始学习SQL(五)多表查询

    经过之前的学习,现在我们已经对查询有了一定的了解,但是我们目前的所有查询都只能找到在一张表中的数据,但如果我们需要寻找分布在多张表格中的数据时,这种之前的查询就做不到了,这时就需要引入一种新的查询方法 ...

  6. hive hsql 漏斗模型_数据分析之SQL:常用模型

    以下介绍常用的SQL写法: case when的用法---不管偏不偏,你可能真没见过这种写法 内连接VS左连接---80%的业务代码都与之相关 distinct的用法--你可能真的错怪distinct ...

  7. pgsql vs mysql查询_对比平台--SQL Server Vs PostgreSQL

    Microsoft SQL Server是一个数据库管理和分析系统,主要用于电子商务,业务范围和不同的数据仓库解决方案.另一方面,PostgreSQL是高级的对象关系数据库管理系统,它为SQL标准的扩 ...

  8. sql跨表查询_白话django之ORM的查询语句

    教程源码:z991/django_turital 在日常开发中,数据库的增删改查(CDUR)中,查询需求偏多,所以查询的语法比增删改操作多得多,尤其是跨表关联查询,可以让代码精简很多年. 直接上代码吧 ...

  9. java sql 联表查询系统_Spring Hibernate JPA 联表查询 复杂查询(转)

    关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...

最新文章

  1. php中htpt,PHP中的HTTP协议
  2. oracle_base,Oracle--基础知识--Oracle 数据库目录 ORACLE_BASE ORACLE_HOME
  3. mysql数据库的后_MySQL数据库误删后的回复技巧
  4. Python学习笔记之异常
  5. 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
  6. mysql选中一行数据_获取table选中一行数据库
  7. 百度宣布7nm制程AI芯片“昆仑芯2”实现量产
  8. python美化输出模块_美化输出结果之Python模块PrettyTable介绍
  9. jenkins安装部署全过程
  10. 更新visual studio 报错The dependent package of ‘Microsoft.Net.PackageGroup.4.6.Redist‘
  11. flink读取不到文件_Flink读取本地文件
  12. 视频下载v1.0全能短视频解析
  13. 计算机能换显卡吗,一体机电脑可以更换CPU和显卡嘛?
  14. 从微软下载Vista Ultimate 中文旗舰版
  15. Android面试之J2SE基础
  16. [翻译]pb技巧、代码和实用工具[程序员家园论坛]
  17. 笔记本找不到WiFi
  18. CFileDialog类学习
  19. 微服务架构的基础框架选择
  20. 技术分享 | 黑盒测试方法论—边界值

热门文章

  1. The current directory must be set to the ITT directory解决办法
  2. 抛硬币直到若干次(k次)连续正面向上的概率
  3. 解决 mybatis-generator-maven-plugin 中 overwrite 配置无效的问题
  4. Kubelet源码分析(一):启动流程分析
  5. 28天打造专业红客(一)
  6. 天天在用Stream,那你知道如此强大的Stream的实现原理吗?
  7. hadoop配置文件聚集功能(设置日志可以查看)
  8. Mysql练习题15-给定数字的频率查询中位数
  9. 将一个PPT文档按页分割成多个PPT文档的代码
  10. Eclipse + Spring boot +mybatis + mysql