`
chengxianju
  • 浏览: 256616 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

union联合查询

 
阅读更多

 select * from [IND] where INDID>10
 union
 select * from [IND] where INDID<9


目前为止,还没有出现问

之后,也许有人会用到类似的查询

 select * from [IND] where INDID>10 order by INDID desc
 union
 select * from [IND] where INDID<9 order by INDID desc

此时就出现问题了,数据库报错。问题就出在order by上

为什么呢?难道UNION和ORDER BY 不能同时存在?

union和 order by 当然是可以同时存在的

但是在使用union的时候,联合查询不仅仅是将数据集合合并

他并不是将每个子查询一个一个查询出来后联接在一起,数据库是将整段查询语句理解之后统一查询得到的是整个的数据集合

另外order by在一个数据集合查询里也只能出现一次并且出现在最后。

因此,在联合查询里,order by 要写在最后一个子查询之后,并且,该排序是对整个联合查询出来的结果集排序的,并不是只对最后一个子查询排序

 select * from [IND] where INDID>10
 union
 select * from [IND] where INDID<9 order by INDID desc

这样就可以对我们联合查询出来的结果集进行整体排序,而不是只对最后一个子查询的结果集排序。

再做一个试验来更充分的说明这个问题

创建一个这样的查询

 select * from [IND] where INDID=4

 union

 select * from [IND] where INDID=2
 union
 select * from [IND] where INDID=1
 union
 select * from [IND] where INDID=5
 union
 select * from [IND] where INDID=3

INDID是主键,在创建数据的时候,数据库里的顺序是12345

如果联合查询只是但存的将查询结果联接在一起,那么我们得到的结果应该是:42153

但是,实际上得到的结果是和数据库里数据排列的顺序一样的 12345

因此,可以得出结论,联合查询的结果是整个查询完成后得出的,而不是将子查询挨个完成后拼接的。

 select * from [IND] where INDID=4

 union

 select * from [IND] where INDID=2
 union
 select * from [IND] where INDID=1
 union
 select * from [IND] where INDID=5
 union
 select * from [IND] where INDID=3

 order by INDID ASC/DESC

这样就可以对整个联合结果集进行排寻了。

另外关于TOP?

如果是这样,在普通的查询中,TOP是在ORDER BY之后执行的,那么

 select TOP 2 * from [IND] where INDID=4

 union

 select * from [IND] where INDID=2
 union
 select * from [IND] where INDID=1
 union
 select * from [IND] where INDID=5
 union
 select * from [IND] where INDID=3

 order by INDID

这样是不是可以得到整个结果集排序后的最前面两条数据呢?

答案是不可以。

虽然说在单句的查询中,TOP是在ORDER BY 之后执行,但是在联合查询中,这样写,TOP的作用域是在子查询里,因此TOP并没有对联合查询的结果集筛选,而只对它所写在的那条子查询里进行筛选,这就像是子查询里的WHERE语句一样,类似这样的筛选作用范围都是在子查询,不像ORDER BY 作用在整个联合查询。

那么如何对联合查询进行 截取置顶N条数据的筛选呢? 很简单

用 rowcount

比起TOP来说,rowcount作为结果集截取置顶更加规范些,毕竟不是依靠查询语句,而是直接设置查询语句获得结果集的数目。

 set rowcount 2
 
 select * from [IND] where INDID=4

 union
 select * from [IND] where INDID=1
 union
 select * from [IND] where INDID=2

 union
 select * from [IND] where INDID=3

 order by INDID ASC
 

形如以上查询语句。我们就可以做到对联合查询排序,并获得最上的两条数据了。

既然能利用order by 排序 和 并用rowcount截取集和数量,那么自然联合查询分页等其他应用也不在话下了

分享到:
评论

相关推荐

    SQL注入笔记-union联合查询

    SQL注入笔记-union联合查询

    hibernate映射配置文件不支持union联合查询[参照].pdf

    本案例中,开发者遇到了一个与Hibernate映射配置文件相关的异常,该异常涉及到不支持的“union”联合查询。具体表现为在执行查询时抛出了`SQLGrammarException`,提示为`ORA-00907: 缺失右括号`,这通常意味着SQL...

    sqlserver union

    在SQL Server中,`UNION`操作符是用于合并两个或更多`...记住,选择正确的操作符(`UNION`或`UNION ALL`)以及优化查询是提升数据库性能的关键。通过持续学习和实践,你将能够熟练掌握这些技能,成为数据库查询的专家。

    简单SQL数据库语句总结——以学生成绩的管理为例描述

    摘要:本文总结了简单 SQL 数据库语句的基本用法,以学生成绩的管理为例进行描述,涵盖了查询结果中的列名显示、精确查找、时间类型变量的处理、集函数、分组、union 联合查询结果、多表查询等多个方面的知识点。...

    Union联合数据大小端问题.rar

    在C++编程中,`union`是一种特殊的数据结构,它允许多个数据类型共享同一块内存空间。这个特性使得`union`在处理不同数据类型的转换和节省存储空间时非常有用。然而,`union`在处理大小端问题时,可能会引发一些不...

    SQL注入防御.ppt

    基于 UNION 联合查询的检测是指攻击者使用 UNION 联合查询来推断数据库中的数据。攻击者可以通过在用户输入中注入恶意 SQL 代码,来推断数据库中的数据。 ### 5. 基于堆叠查询的检测 基于堆叠查询的检测是指攻击者...

    上传一个带合计的联合查询(转别人的,与大家分享)

    联合查询,又称为"UNION"查询,它允许我们将两个或多个SELECT语句的结果合并成一个结果集。在Access中,这通常用于将数据从不同的表中组合在一起,尤其当这些表有相似的列结构时。而“带合计”的概念意味着在查询中...

    数据库介绍(二)12~17

    在本系列的“数据库介绍(二)12~17”中,我们将深入探讨数据库管理中的几个关键概念和操作,主要包括SELECT查询语句的执行顺序、表数据的复制、数据类型的转换、GROUP BY的运用以及UNION联合查询。这些都是数据库查询...

    sql注入-0629-田靖宇-17130105521

    **一、UNION联合查询注入** 1. **注入点判断**:通过在查询参数中添加`' and 1=1`来检查是否存在注入漏洞,如果页面返回正常,说明可能存在注入。 2. **字段数猜测**:利用`order by`来逐个尝试字段数,观察页面响应...

    信息安全技术:SQL注入的常规分类.pptx

    1. **UNION 联合查询注入** 在这种类型的注入攻击中,攻击者利用`UNION`操作符将两个或多个`SELECT`语句连接起来。攻击者的目标是合并他们的恶意查询与原始查询,以便在结果集中注入额外的行或列。成功的关键在于...

    Mysql联合查询UNION和UNION ALL的使用介绍

    本文详细介绍了Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下

    利用联合查询实现库存计算

    为了高效地执行此类操作,我们可以利用数据库查询语言,如SQL(结构化查询语言)中的联合查询(Union Query)来实现。本篇文章将深入探讨如何通过联合查询来解决库存计算的问题,并提供相关源代码作为示例。 联合...

    Mysql联合查询UNION和Order by同时使用报错问题的解决办法

    因此,常常出现这样的错误 代码如下:select * from [IND] where INDID&gt;10unionselect * from [IND] where INDID&lt;9&gt;10 order by INDID descunionselect * from [IND] where INDID&lt;9 order by INDID desc此时就出现...

    SQL注入攻击-高级方法,手动注入 自动化注入

    3. **基于UNION联合查询**:在两个查询之间使用UNION操作符,当查询列数和数据类型匹配时,可以合并结果,高效地获取大量数据。例如,通过ORDER BY和数据类型的测试来确定列数和类型。 **自动化检测与利用**: 工具...

    sql相关的操作

    #### 七、UNION联合查询 UNION用于合并两个或多个SELECT语句的结果集,确保结果集中没有重复的行。 1. **标准UNION:** ```sql SELECT * FROM students WHERE name LIKE '张%' UNION SELECT * FROM students ...

    手工注入常用SQL语句笔记.docx

    * UNION 联合查询型注入 * 时间延迟型盲注 * 堆查询注入 三、判断数据库类型 * Access:and (select id from MSysAccessObjects) &gt;0 返回正常说明是 Access * MSSQL:and (select id from sysobjects) &gt;0 返回...

    计算机病毒与防护:MYSQL联合查询上.ppt

    MySQL数据库中的联合查询(UNION)是一种强大的操作,它允许将两个或更多SELECT语句的结果合并成一个结果集。在理解联合查询时,我们需要明确几个关键概念: 1. **UNION操作符**:UNION操作符用于合并两个或多个...

    sql语言手册 和联合查询

    ### 联合查询(UNION) #### 基本语法 ```sql SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` - `UNION`:用于合并两个或多个SELECT语句的结果集。 #### 示例 假设有两个表`...

    SQL学习笔记六 union联合结果集使用

    总结来说,`UNION`和`UNION ALL`是SQL中非常有用的工具,用于合并不同查询的结果,创建一个单一的、去重(对于`UNION`)的结果集。它们在数据分析、报表生成和数据整合等场景中有着广泛的应用。了解并熟练掌握这些...

Global site tag (gtag.js) - Google Analytics