select语句返回结果的顺序问题 .
今天看到论坛上一个朋友的回帖内容,突然意识到自己好像从来没对SELECT语句做过任何思考,即便SELECT是平时使用最多的语句。自己建了两个测试表,内容如下:
- SQL> conn scott/tiger
- Connected.
- SQL> create table a(aid int, name char(1));
- Table created.
- SQL>
- SQL> create table b(bid int, name char(1));
- Table created.
- SQL> insert into a values(1,'a');
- 1 row created.
- SQL> insert into a values(2,'b');
- 1 row created.
- SQL> insert into a values(3,'c');
- 1 row created.
- SQL> insert into b values(1,'b');
- 1 row created.
- SQL> insert into b values(2,'c');
- 1 row created.
- SQL> insert into b values(3,'a');
- 1 row created.
- SQL> commit;
- Commit complete.
- SQL> select * from a;
- AID N
- ---------- -
- 1 a
- 2 b
- 3 c
- SQL> select * from b;
- BID N
- ---------- -
- 1 b
- 2 c
- 3 a
SQL> conn scott/tiger
Connected.
SQL> create table a(aid int, name char(1));
Table created.
SQL>
SQL> create table b(bid int, name char(1));
Table created.
SQL> insert into a values(1,'a');
1 row created.
SQL> insert into a values(2,'b');
1 row created.
SQL> insert into a values(3,'c');
1 row created.
SQL> insert into b values(1,'b');
1 row created.
SQL> insert into b values(2,'c');
1 row created.
SQL> insert into b values(3,'a');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from a;
AID N
---------- -
1 a
2 b
3 c
SQL> select * from b;
BID N
---------- -
1 b
2 c
3 a
1、先进行两个表的简单连接查询
- SQL> select a.aid from a,b where a.aid=b.bid;
- AID
- ----------
- 1
- 2
- 3
- SQL> select a.aid from a,b where a.name=b.name;
- AID
- ----------
- 2
- 3
- 1
SQL> select a.aid from a,b where a.aid=b.bid;
AID
----------
1
2
3
SQL> select a.aid from a,b where a.name=b.name;
AID
----------
2
3
1
起初我看到这两个表中的内容差不多,a.aid和b.bid里都是1、2、3,a.name和b.name里都是a、b、c,我就以为上面这两条查询语句将会返回一样的结果,可是实践证明我的想法是错误的,返回的结果顺序是不一样的。
别着急,看看下面这个语句的返回结果,可能你会想到些什么
- SQL> select a.aid from a,b where b.name=a.name;
- AID
- ----------
- 2
- 3
- 1
- SQL> select a.aid from b,a where a.name=b.name;
- AID
- ----------
- 1
- 2
- 3
- SQL> select a.aid from b,a where a.aid=b.bid;
- AID
- ----------
- 1
- 2
- 3
SQL> select a.aid from a,b where b.name=a.name;
AID
----------
2
3
1
SQL> select a.aid from b,a where a.name=b.name;
AID
----------
1
2
3
SQL> select a.aid from b,a where a.aid=b.bid;
AID
----------
1
2
3
当选用两张表中各自的name字段作为查询条件的时候,如果FROM 子句后面表出现的顺序不同,结果也会有所不同。
当a表出现在后面的时候,那么SELECT 语句选择a中的一条记录,然后去b表中进行扫面,看有没有符合条件的记录,当然a、b、c三个值在b表中都是有的,所以aid的结果依次为1、2、3。
可是当b表出现在后面的时候,那么SELECT语句先选择b表中的一条记录(1,'b'),到a表中进行扫面,看是否有符合条件的记录,这个时候a表中name字段为'b'的记录的响应aid为2,所以2查询结果中2就排在第一位咯。
2、看一看在SELECT中加上ORDER BY子句的情况
- SQL> select a.aid from a,b where a.name=b.name order by b.bid;
- AID
- ----------
- 2
- 3
- 1
- SQL> select a.aid from a,b where a.name=b.name order by b.name;
- AID
- ----------
- 1
- 2
- 3
- SQL> select a.aid from a,b where a.aid=b.bid order by b.name;
- AID
- ----------
- 3
- 1
- 2
- SQL> select a.aid from a,b where a.aid=b.bid order by b.bid;
- AID
- ----------
- 1
- 2
- 3
SQL> select a.aid from a,b where a.name=b.name order by b.bid;
AID
----------
2
3
1
SQL> select a.aid from a,b where a.name=b.name order by b.name;
AID
----------
1
2
3
SQL> select a.aid from a,b where a.aid=b.bid order by b.name;
AID
----------
3
1
2
SQL> select a.aid from a,b where a.aid=b.bid order by b.bid;
AID
----------
1
2
3
经过上面的解释,这个地方就不是很难理解了。
第一个SELECT语句中的ORDER BY B.BID对语句查询结果没有产生什么影响。
对于第二个SELECT语句,在排序前的结果为:
A.AID B.BID B.NAME
2 1 b
3 2 c
1 3 a
经过ORDER BY B.NAME了,就变为如下结果了:
A.AID B.BID B.NAME
1 3 a
2 1 b
3 2 c
这个时候从这个结果集中选出A.AID,当然就是1、2、3了。
下面两个以A.AID和B.BID的例子比较简单,我就不多说了,基本情况和前面一样,有兴趣的话你也可以对照着想一想这个过程,呵呵。
好了,大概就这些吧,小记一下,以后碰到SELECT相关的问题再加好了。
select语句返回结果的顺序问题 .的更多相关文章
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- SQL Select语句完整的执行顺序(转)
SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...
- 【SQL】SQL 中Select语句完整的执行顺序
SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...
- 170607、SQL Select语句完整的执行顺序
SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...
- sql中select语句的逻辑执行顺序
下面是SELECT语句的逻辑执行顺序: FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECTDISTINCTORDER BYTOP M ...
- Oracle中Select语句完整的执行顺序
oracle Select语句完整的执行顺序: .from 子句组装来自不同数据源的数据: .where 子句基于指定的条件对记录行进行筛选: .group by子句将数据划分为多个分组: .使用聚集 ...
- Select语句完整的执行顺序
Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据:2.where子句基于指定的条件对记录行进行筛选:3.group by子句将数据划分为多个分组:4.使用聚集函数进行计算:5. ...
- SQL Select语句完整的执行顺序
1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5. 使用having子句筛 ...
- Oracle SQL开发 之 Select语句完整的执行顺序
查询语句语法: Select 属性 From 表 Where 条件 Group by 分组条件 Having 分组选择条件 Order by 排序条件 1.from子句组装来自不同数据源的数据: 2. ...
随机推荐
- Python学习(七) 流程控制if语句
在Python中流程控制if语句采用如下格式: if expression : statement elif expression : statement elif expression : stat ...
- [XMPP]iOS聊天软件学习笔记[一]
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Linux上使用Azure CLI来管理Azure
在Windows上我们有强大的Powershell提供各种命令来管理Azure的服务,在Linux上微软提供了基于Node.JS的跨平台的Azure Command Line来帮助Linux用户来管理 ...
- LeetCode_Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Qt编程可不可以结合其他的第三方库和本土API?(有zeroMQ的Qt封装,还可轻易使用Python的库)
作者:渡世白玉链接:http://www.zhihu.com/question/29030777/answer/59378712来源:知乎著作权归作者所有,转载请联系作者获得授权. 可以,十分可以,你 ...
- SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现
原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...
- Linux下的命令行上网
对于网页浏览器现在大多数人用links/elinks,对了,还有个老牌一点的文本浏览器Lynx,links/elinks也是从Lynx中fork出来的. 以上所说的虽然能字符界面来浏览网页,但是不能显 ...
- Ice笔记-利用Ice::Application类简化Ice应用
Ice笔记-利用Ice::Application类简化Ice应用 作者:ydogg,转载请申明. 在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信 ...
- C#中Split分隔字符串的应用(C#、split、分隔、字符串)
转载地址 .用字符串分隔: using System.Text.RegularExpressions; string str="aaajsbbbjsccc"; string[] s ...
- C#两个时间的时间差的方法
今天遇到一问题,计算两个时间的时间差,看网上的写法较为复杂,找到个简单点的,记录下作为自己的总结. 关键函数: DateTime.Subtract 函数解释: 从此实例中减去指定的日期和时间,返回一个 ...