sql 两个表字段不一样合并查询_数据分析进阶--SQL多表查询
下午写完了上一篇文章,晚上就开始做牛客的SQL题啦,然后发现少少的十题就用到了好几次多表连接,case在实际分析过程中也非常常用,所以我打算单独把多表查询和case拉出来写一篇文章。
文章目录:
- 表的加法
- 表的联结
- 联结案例
- case表达式
一、表的加法
表与表相加最简单的方法就是使用union/union all这两个关键字,其中union会在求并集的时候去除完全一致的记录行,而union all则会保留所有的行。
例如:新建一个course1表,分别使用union/union all将其与原有course表合并
先看course1:
course:
union:
union all:
但是前文说的"重复",是只看主键,还是一行里所有的字段都看呢?
我将course1里 "0001 语文 0002"暂时改成了"0001 语 0002",执行同样的union语句:
注意事项:
- 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代码见上文。
注意:左右表联结由于只有一个表保留了所有记录行,因此有主次表之分。而主次表这样的情况在实际情况中非常常见,在此补充一个我做题时遇到的两个案例
③full join 全连接
MySQL不支持full join,所以在这里不多展开了。
三、联结实用案例
①求各学生的学号,姓名,选课数以及总成绩
②求平均成绩超过85的所有学生的学号,姓名,平均分
③求各个学生的学号,姓名,选修课程号,课程名称
四、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多表查询相关推荐
- postgres sql 多表联合查询_从零学会SQL-多表查询
之前学习的内容几乎针对单个表进行简单操作,实际工作中可没有这么简单,复杂的表结构和多表数据关联进行分析,这时候需要我们掌握多表查询方法,一如既往,我们先看一下这篇的主要内容: 表的加法 表的联结 联结 ...
- SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
SQL Server2019 数据库查询所有数据库名.表名.表结构.表字段.主键方法演示 第一章:查询方法 ① 查询所有数据库名 ② 查询所有表名方法 ③ 查询表结构.表字段方法 ④ 查询主键方法 第 ...
- 通过SQL一键解析表字段血缘关系
可以根据sql文件中的sql快速解析出表字段到字段的血缘关系,支持mysql.oracle.hive.impala.greenplum等数据库sql语法解析,可以在sql文件中放如多段sql解析,也可 ...
- postgresql两个列模糊比较_数据分析之SQL优化系列(二)---PostgreSQL 的索引
参考<PostgreSQL11.2-中文手册> 下面这个链接,讲的通俗易懂,可以看看. 数据分析师不得不知道的SQL优化 - 鑫获 - 博客园www.cnblogs.com 索引是提高数 ...
- sql 多表多行模糊查询_从零开始学习SQL(五)多表查询
经过之前的学习,现在我们已经对查询有了一定的了解,但是我们目前的所有查询都只能找到在一张表中的数据,但如果我们需要寻找分布在多张表格中的数据时,这种之前的查询就做不到了,这时就需要引入一种新的查询方法 ...
- hive hsql 漏斗模型_数据分析之SQL:常用模型
以下介绍常用的SQL写法: case when的用法---不管偏不偏,你可能真没见过这种写法 内连接VS左连接---80%的业务代码都与之相关 distinct的用法--你可能真的错怪distinct ...
- pgsql vs mysql查询_对比平台--SQL Server Vs PostgreSQL
Microsoft SQL Server是一个数据库管理和分析系统,主要用于电子商务,业务范围和不同的数据仓库解决方案.另一方面,PostgreSQL是高级的对象关系数据库管理系统,它为SQL标准的扩 ...
- sql跨表查询_白话django之ORM的查询语句
教程源码:z991/django_turital 在日常开发中,数据库的增删改查(CDUR)中,查询需求偏多,所以查询的语法比增删改操作多得多,尤其是跨表关联查询,可以让代码精简很多年. 直接上代码吧 ...
- java sql 联表查询系统_Spring Hibernate JPA 联表查询 复杂查询(转)
关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...
最新文章
- php中htpt,PHP中的HTTP协议
- oracle_base,Oracle--基础知识--Oracle 数据库目录 ORACLE_BASE ORACLE_HOME
- mysql数据库的后_MySQL数据库误删后的回复技巧
- Python学习笔记之异常
- 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
- mysql选中一行数据_获取table选中一行数据库
- 百度宣布7nm制程AI芯片“昆仑芯2”实现量产
- python美化输出模块_美化输出结果之Python模块PrettyTable介绍
- jenkins安装部署全过程
- 更新visual studio 报错The dependent package of ‘Microsoft.Net.PackageGroup.4.6.Redist‘
- flink读取不到文件_Flink读取本地文件
- 视频下载v1.0全能短视频解析
- 计算机能换显卡吗,一体机电脑可以更换CPU和显卡嘛?
- 从微软下载Vista Ultimate 中文旗舰版
- Android面试之J2SE基础
- [翻译]pb技巧、代码和实用工具[程序员家园论坛]
- 笔记本找不到WiFi
- CFileDialog类学习
- 微服务架构的基础框架选择
- 技术分享 | 黑盒测试方法论—边界值
热门文章
- The current directory must be set to the ITT directory解决办法
- 抛硬币直到若干次(k次)连续正面向上的概率
- 解决 mybatis-generator-maven-plugin 中 overwrite 配置无效的问题
- Kubelet源码分析(一):启动流程分析
- 28天打造专业红客(一)
- 天天在用Stream,那你知道如此强大的Stream的实现原理吗?
- hadoop配置文件聚集功能(设置日志可以查看)
- Mysql练习题15-给定数字的频率查询中位数
- 将一个PPT文档按页分割成多个PPT文档的代码
- Eclipse + Spring boot +mybatis + mysql