今天看到论坛上一个朋友的回帖内容,突然意识到自己好像从来没对SELECT语句做过任何思考,即便SELECT是平时使用最多的语句。自己建了两个测试表,内容如下:

  1. SQL> conn scott/tiger
  2. Connected.
  3. SQL> create table a(aid int, name char(1));
  4. Table created.
  5. SQL>
  6. SQL> create table b(bid int, name char(1));
  7. Table created.
  8. SQL> insert into a values(1,'a');
  9. 1 row created.
  10. SQL> insert into a values(2,'b');
  11. 1 row created.
  12. SQL> insert into a values(3,'c');
  13. 1 row created.
  14. SQL> insert into b values(1,'b');
  15. 1 row created.
  16. SQL> insert into b values(2,'c');
  17. 1 row created.
  18. SQL> insert into b values(3,'a');
  19. 1 row created.
  20. SQL> commit;
  21. Commit complete.
  22. SQL> select * from a;
  23. AID N
  24. ---------- -
  25. 1 a
  26. 2 b
  27. 3 c
  28. SQL> select * from b;
  29. BID N
  30. ---------- -
  31. 1 b
  32. 2 c
  33. 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、先进行两个表的简单连接查询

  1. SQL> select a.aid from a,b where a.aid=b.bid;
  2. AID
  3. ----------
  4. 1
  5. 2
  6. 3
  7. SQL> select a.aid from a,b where a.name=b.name;
  8. AID
  9. ----------
  10. 2
  11. 3
  12. 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,我就以为上面这两条查询语句将会返回一样的结果,可是实践证明我的想法是错误的,返回的结果顺序是不一样的。

别着急,看看下面这个语句的返回结果,可能你会想到些什么

  1. SQL> select a.aid from a,b where b.name=a.name;
  2. AID
  3. ----------
  4. 2
  5. 3
  6. 1
  7. SQL> select a.aid from b,a where a.name=b.name;
  8. AID
  9. ----------
  10. 1
  11. 2
  12. 3
  13. SQL> select a.aid from b,a where a.aid=b.bid;
  14. AID
  15. ----------
  16. 1
  17. 2
  18. 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子句的情况

  1. SQL> select a.aid from a,b where a.name=b.name order by b.bid;
  2. AID
  3. ----------
  4. 2
  5. 3
  6. 1
  7. SQL> select a.aid from a,b where a.name=b.name order by b.name;
  8. AID
  9. ----------
  10. 1
  11. 2
  12. 3
  13. SQL> select a.aid from a,b where a.aid=b.bid order by b.name;
  14. AID
  15. ----------
  16. 3
  17. 1
  18. 2
  19. SQL> select a.aid from a,b where a.aid=b.bid order by b.bid;
  20. AID
  21. ----------
  22. 1
  23. 2
  24. 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相关的问题再加好了。

ORACLE表连接方式可以参考这篇文章

select语句返回结果的顺序问题 .的更多相关文章

  1. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  2. SQL Select语句完整的执行顺序(转)

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  3. 【SQL】SQL 中Select语句完整的执行顺序

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  4. 170607、SQL Select语句完整的执行顺序

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  5. sql中select语句的逻辑执行顺序

    下面是SELECT语句的逻辑执行顺序: FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECTDISTINCTORDER BYTOP M ...

  6. Oracle中Select语句完整的执行顺序

    oracle Select语句完整的执行顺序: .from 子句组装来自不同数据源的数据: .where 子句基于指定的条件对记录行进行筛选: .group by子句将数据划分为多个分组: .使用聚集 ...

  7. Select语句完整的执行顺序

    Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据:2.where子句基于指定的条件对记录行进行筛选:3.group by子句将数据划分为多个分组:4.使用聚集函数进行计算:5. ...

  8. SQL Select语句完整的执行顺序

    1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5. 使用having子句筛 ...

  9. Oracle SQL开发 之 Select语句完整的执行顺序

    查询语句语法: Select 属性 From 表 Where 条件 Group by 分组条件 Having 分组选择条件 Order by 排序条件 1.from子句组装来自不同数据源的数据: 2. ...

随机推荐

  1. 数字转化为人民币大写(PHP)

    <?php function numTrmb($num) { $d = array("零", "壹", "贰", "叁&qu ...

  2. 改进我们的小游戏 - 零基础入门学习Python004

    改进我们的小游戏 让编程改变世界 Change the world by program 改进我们的小游戏 很多鱼油对改善这个游戏提出了建议,小甲鱼做了一下总结,大概有以下几个方面需要改进: 猜错的时 ...

  3. Method Resolution Order – Python类的方法解析顺序

    在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...

  4. [TYVJ] P1010 笨小猴

    笨小猴 背景 Background NOIP2008复赛提高组第一题   描述 Description 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种 ...

  5. UFI命令格式里SCSI指令

    有三种字长命令:6位.10位.12位,一般Windows下用12位. 在UFI 命令格式里SCSI指令用到如下: 指令代码 指令名称 说明 04h Format Unit 格式化存储单元 12h In ...

  6. c++ ifstream ofstream 文件流

    #include <fstream>ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中fstream //读写操作,对打开的文件可进 ...

  7. 用来控制 XML 序列化的属性

    通过将下表中的属性应用于类和类成员,可以控制 XmlSerializer 序列化或反序列化该类的实例的方式.若要了解这些属性如何控制 XML 序列化,请参见使用属性控制 XML 序列化. 这些属性还可 ...

  8. Linux系统编程(4)——文件与IO之ioctl函数

    ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的参数个数如下:int ioctl(int ...

  9. 2015第10周四-CSS小结

    这两天做前台页面发现个人在CSS前端方法很多基础知识都忘了,晚上又搜索学习了下,把相关内容摘录总结. CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector {declara ...

  10. 【POJ 2010 Moo University-Financial Aid】优先级队列

    题目链接:http://poj.org/problem?id=2010 题意:C只牛犊,各有自己的分数score和申请的补助aid,现要选出N只(N为奇数),使得其aid的总和不超过F,且按score ...