今天看到论坛上一个朋友的回帖内容,突然意识到自己好像从来没对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. (原)Ubuntu16中使用nvidia官方提供的驱动,而非自带的驱动

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5638185.html 安装完ubuntu16后,显卡显示的是Gallium... 在“设置-软件和更新 ...

  2. project euler 12 Highly divisible triangular number

    Highly divisible triangular number Problem 12 The sequence of triangle numbers is generated by addin ...

  3. 解决pip安装时 UnicodeDecodeError 问题

    在装django的时候用pip安装就出现了问题,一大堆的红字,然后联想到很多次用pip安装都以失败告终,于是今天抽空看了看出现问题的原因. 情况如下图:

  4. GitLab CI

    GitLab CI持续集成配置方案   目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 Git ...

  5. SCSI接口图文详解

    目前存储设备的接口有五大类:IDE.SCSI.USB,并行口,串口,其中并行口与串口的速度非常慢,不提也罢,最主要的就是IDE,usb,SCSI.IDE(Integrated Drive Electr ...

  6. python模块学习之random

    模块源码: Source code: Lib/random.py 文档:http://docs.python.org/2/library/random.html 常用方法: random.random ...

  7. mysql logstash 配置

    [elk@dr-mysql01 mysql]$ cat logstash_mysql.conf input { file { type => "zj_mysql" path ...

  8. 《MATLAB数据分析与挖掘实战》赠书活动

    <MATLAB数据分析与挖掘实战>是泰迪科技在数据挖掘领域探索10余年经验总结与华南师大.韩山师院.广东工大.广技师   等高校资深讲师联合倾力打造的巅峰之作.全书以实践和实用为宗旨,深度 ...

  9. java collection framework

    java collection framework Map

  10. 六度分离(floyd算法+dijskra+SPFA)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...