列表:Select t,m.frameworkName,ma.accountName from SaleEntity t left join MediaAccountEntity ma on t.mediaAccountId=ma.id left  join  MediaEntity  m on ma.mediaId=m.id left  join  ClientEntity  c on ma.clientId=c.id  where 1=1  order by t.id desc.

excel:Select t, m.frameworkName , ma.accountName from SaleEntity t join MediaAccountEntity ma on t.mediaAccountId=ma.id left  join  MediaEntity  m on ma.mediaId=m.id  left  join  ClientEntity  c on ma.clientId=c.id  order by m.id desc

今天遇到到处excel表格的数据比页面展示的数据少几条

首先你要知道excel表格的数据通过什么查出来的 列表的数据通过什么查出来的

通过打断点 找出他们的查询语句 做个对比 发现不同点

接着吧excel表格的数据查询语句改成和列表的一直 join 改成left join 代码出现空指针异常 接着解决空指针异常

问题

为什么使用相同的语句 列表不会出现空指针异常 但是导出excel表格 出现空指针异常 页面报500

还有join 和left join在多表关联查询的时候有啥区别

还有一个我问题别人在一个地方先new 了一个 不报空指针 和直接返回结果 报空指针  待解决

sql中join与left-join图解区别

inner join 是内连接  join默认就是inner join

Join  表示两个表都必须存在的
left join 表示以左边的表为基准,不管你右边的表有没有都显示
right join和left join刚好相反
full outer join表示只要在两个表中任何一个表中有的都显示

预先生成两张测试表,并插入一下测试数据:

create table t1(id int, name char(10), primary key (id));

create table t2(id int, score int, primary key (id));

insert into t1 values(1, “lucy”);

insert into t1 values(2, “lily”);

insert into t1 values(3, “jack”);

insert into t2 values(2, 20);

insert into t2 values(3, 30);

insert into t2 values(4, 40);

t1表内容如下:

t2表内容如下:

下面来简述join和left join/right join的区别:

inner join

select * from t1 inner join t2 on t1.id = t2.id;

公共部分的数据才会被查询出来;

left join

select * from t1 left join t2 on t1.id = t2.id;

查询出来的结果和前表记录数一样多;

right join

select * from t1 right join t2 on t1.id = t2.id;

能转化为

select * from t2 left join t1 on t1.id = t2.id;

SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别

首先看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果。

  • 在数据库中新建两张表,并插入要测试的数据。

新建表:

[sql] view plain copy

  1. USE [Test]

  2. GO

  3. /****** 对象:  Table [dbo].[EMP]    脚本日期: 06/22/2012 15:37:28 ******/

  4. SET ANSI_NULLS ON

  5. GO

  6. SET QUOTED_IDENTIFIER ON

  7. GO

  8. CREATE TABLE [dbo].[EMP](

  9. [ENAME] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,

  10. [CITY] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL

  11. ) ON [PRIMARY]

[sql] view plain copy

  1. USE [Test]

  2. GO

  3. /****** 对象:  Table [dbo].[SAL]    脚本日期: 06/22/2012 15:38:04 ******/

  4. SET ANSI_NULLS ON

  5. GO

  6. SET QUOTED_IDENTIFIER ON

  7. GO

  8. CREATE TABLE [dbo].[SAL](

  9. [ENAME] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,

  10. [SALARY] [money] NULL

  11. ) ON [PRIMARY]

插入数据得到的表:

EMP表:

SAL表:

  • 左连接

    [sql] view plain copy

    左连接,表EMP是主表,因此查询结果是显示EMP(主表)的全部信息和SAL(附表)与EMP相关的信息。

  1. select  * from EMP Left join SAL on EMP.ENAME = SAL.ENAME;

右连接[sql] view plain copy右连接,表SAL是主表,因此查询结果显示SALT(主表)的全部信息和EMP(附表)与SAL想关的信息。

  1. Select * from EMP Right join SAL on EMP.ENAME = SAL.ENAME;

内连接[sql] view plain copy内连接,显示的是连个表相关的信息。

  1. SELECT * FROM EMP inner join SAL on EMP.ENAME = SAL.ENAME;

全连接[sql] view plain copy全连接,显示两个表所有的信息。

  1. SELECT * FROM EMP full join SAL on EMP.ENAME = SAL.ENAME;

图解SQL的inner join、left join、right join、full outer join、union、union all的区别

SQL的Join语法有很多,
inner join(等值连接) 只返回两个表中联结字段相等的行,
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,
看到一篇图解文章,非常清楚简洁的说明了使用JOIN操作后的结果集是什么格式。

假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:

A表
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
B表
id name
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

让我们看看不同JOIN的不同。

1.INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

满足TableA.name = TableB.name的数据共有两条,即 name=Pirate 和 name=Ninja ,结果如下

结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja

Inner join 产生的结果集中,是A和B的交集。

2.FULL [OUTER] JOIN

(1)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

TableA.name = TableB.name 的情况,A和B的交集有两条数据,那么 FULL OUTER JOIN的结果集,

应该是2+2+2=6条,即上面的交集,再加剩下的四条数据,没有匹配,以null补全。

结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

可以使用IFNULL判断。

(2)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null

添加这个 where 条件,可以排除掉两表的数据交集。

结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade

产生A表和B表没有交集的数据集。

3.LEFT [OUTER] JOIN

(1)

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

以左表为准,根据 TableA.name = TableB.name 这个条件,右表没有的数据 null 补全。

结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

(2)

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

其实就是在上一步的结果集中又做了一次筛选工作。

结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null

产生在A表中有而在B表中没有的集合。

4.RIGHT [OUTER] JOIN

RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

5.UNION 与 UNION ALL

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。

(1)SELECT name FROM TableA UNION SELECT name FROM TableB

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade

选取不同值。

(2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

全部列出来。

(3)注意:

SELECT * FROM TableA UNION SELECT * FROM TableB

新结果集
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

由于 id 1 Pirate   与 id 2 Pirate 并不相同,不合并。

6.CROSS JOIN

还需要注意的是“交差集” cross join,这种Join没有办法用文式图表示,

因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。

表达式如下:

SELECT * FROM TableA CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,很少用到这个语法。

但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。当表很大的时候,会极大的影响性能。

画图解释 SQL join 语句

我认为 Ligaya Turmelle 的关于SQL联合(join)语句的帖子对于新手开发者来说是份很好的材料。SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。不过正如在她的帖子的回复中所说的,在测试中我发现韦恩图并不是十分的匹配SQL联合语法。

不过我还是喜欢这个观点,所以我们来看看能不能用上韦恩图。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

  1. id name id name

  2. ------------

  3. 1Pirate1Rutabaga

  4. 2Monkey2Pirate

  5. 3Ninja3DarthVader

  6. 4Spaghetti4Ninja

我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。

内联合(inner join)

  1. SELECT * FROM TableA

  2. INNER JOIN TableB

  3. ON TableA.name =TableB.name

  4. id name id name

  5. ------------

  6. 1Pirate2Pirate

  7. 3Ninja4Ninja

内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)

inner join

全外联合(full outer join)

  1. SELECT * FROM TableA

  2. FULL OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. id name id name

  5. ------------

  6. 1Pirate2Pirate

  7. 2Monkeynullnull

  8. 3Ninja4Ninja

  9. 4Spaghettinullnull

  10. nullnull1Rutabaga

  11. nullnull3DarthVader

全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)

Full outer join

左外联合(left outer join)

  1. SELECT * FROM TableA

  2. LEFT OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. id name id name

  5. ------------

  6. 1Pirate2Pirate

  7. 2Monkeynullnull

  8. 3Ninja4Ninja

  9. 4Spaghettinullnull

左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)

Left outer join

左外联合,然后用where语句排除一边我们不想要的记录

  1. SELECT * FROM TableA

  2. LEFT OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. WHERE TableB.id IS null

  5. id name id name

  6. ------------

  7. 2Monkeynullnull

  8. 4Spaghettinullnull

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)

WHERE TableB.id IS nul

全外联合,然后用where语句排除两边都不想要的记录

  1. SELECT * FROM TableA

  2. FULL OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. WHERE TableA.id IS null

  5. OR TableB.id IS null

  6. id name id name

  7. ------------

  8. 2Monkeynullnull

  9. 4Spaghettinullnull

  10. nullnull1Rutabaga

  11. nullnull3DarthVader

为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)

WHERE TableA.id IS null

交叉联合(cross join)

还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:

  1. SELECT * FROM TableA

  2. CROSS JOIN TableB

这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。

总结图

下图由 Moffatt 在 2008 年制作(点击可查看大图)。PS:Jeff Atwood 的文章写于 2007 年。

SQL Joins

本文转自wiwi博客51CTO博客,原文链接http://blog.51cto.com/wiwili/1965845如需转载请自行联系原作者


wiwili

到处excel表格的数据和页面的数据不一致相关推荐

  1. 如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件?

    如何利用python将excel表格中筛选出来的每一份数据各自另存为新的excel文件? 1.问题描述 2.解决过程 2.1 问题分析: 2.2 解决思路 3.运行结果 1.问题描述 最近在处理一堆工 ...

  2. 计算机算最大值如何操作,Excel表格中如何通过函数判断数据中的最大值

    Excel表格中如何通过函数判断数据中的最大值 腾讯视频/爱奇艺/优酷/外卖 充值4折起 Excel是我们常用的一款数据处理软件,深受大家的欢迎,是我们学习办公的助手,有的朋友想知道怎么通过函数判断数 ...

  3. 怎么一次性将Excel表格中指定文本整行数据删除

    今天跟跟大家分享一下怎么一次性将Excel表格中指定文本整行数据删除 1.如下图我们想要快速将汇总行数据整行删除掉 2.首先我们点击表格任意一单元格,同时按下Ctrl+A全选表格区域 3.然后点击下图 ...

  4. Excel 表格把所有行变成一行数据

    Excel 表格把所有行变成一行数据 应用场景:excel表格把所有行的数据变成一行. 工具:nodepade++.excel 具体流程: 1.excel表格,确保每个表格里面只有一个sheet表格 ...

  5. Python 批量处理大学校运会报名 Excel 表格,多表整合、数据汇总及统计 实例

    Python 与 Excel 表格综合实例:处理校运会报名 Excel 表格,多表整合.数据汇总及统计实例 前言: 需求: 主要思路及实现代码: 1.先获取目标文件路径下的所有Excel文件: 2.读 ...

  6. layui数据表格分页导出全部页面的数据到Excel表格中

    在使用layui数据表格进行分页显示时,可能需要导出数据到Excel表,可是直接使用table.exportFile却会导出的是已经渲染到表中的数据,这时就会发现问题,导出的数据只是分页表格数据中的一 ...

  7. halcon 将数据保存到excel_halcon保存数据到excel表格-怎样把图像里面的数据提取到excel表格里面去?...

    mt4如何将自定义数据保存到excel表格 这种方式嵌入的,目的就是让你没有办法简单复制粘贴.即使通过OCR之类的软件,由于存在底色.水印等,错误率也相当高,意义不是很大. 怎样把图像里面的数据提取到 ...

  8. php按一列拆分excel表格,excel表格要根据某一列数据拆分-excel怎么按照某一列拆分表格...

    求助:一张excel表,希望按照某列内容(比如某列为... 是把这一列进行筛选或者排序,然后不断制到新表中,如果较多,可以VBA进行自动的复制和新建文件. 如果需要代劳,可以[百度云盘](一个使用百度 ...

  9. 怎么把好几行弄成一行_怎么把excel表格里多行变成一行数据|excel表格中让多行内容变成为一行...

    excel怎么把多行数据变成一行 F1=INDEX($A$1:$E$21,ROUNDUP(COLUMN()/5,0),COLUMN()-5*(ROUNDUP(COLUMN()/5,0)-1))向后拉 ...

最新文章

  1. 情人节|致爱丽丝……
  2. python字符串/列表/字典互相转换
  3. linux 服务 启动 关闭 列表
  4. 线性回归原理与spark/sklearn实现
  5. CentOS 7设置KVM硬盘模式为SCSI
  6. python调用API来实现机器人
  7. springboot 2.x 集成 drools 7.x
  8. 预编译头文件(precompiled header)说明
  9. 【Caffe安装】ImportError: No module named caffe 的解决方案
  10. java报错 csrf_CSRF Security Error解决办法
  11. 访问共享打印机报错:0x00000bcb
  12. 小马 KMS10激活系统后的浏览器小尾巴分析与清除
  13. Blender 插件开发 添加快捷键
  14. java中分解json数据,java解析JSON数据详解
  15. 1. -vinc- = -vict- 胜利,征服
  16. 联想服务器修改开机启动项,怎样在Win10系统里面手动设置开机启动项
  17. java gef_GEF最简单的入门-helloword(1)
  18. html背景图片拉伸解决办法
  19. Android12 源码下载、编译、刷机、单编调试Framework
  20. mysql怎么看表的结构_mysql查看表的结构

热门文章

  1. easyExcel中导入文件参数校验实现方案
  2. jetson nano风扇控制、远程控制和远程桌面
  3. 程序员用技术在「抖音」上「撩妹」
  4. 爱情三十九课,爱的礼物
  5. Sepic变换器的基本原理
  6. TheDAO悲剧重演,SpankChain重入漏洞分析
  7. 网站并发量的计算方法
  8. HTTPS加密为什么能保证网站的安全
  9. Premiere Pro之字幕添加(三)
  10. a标签下载txt,会直接打开txt文件的处理方法