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

 

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

 

当选用两张表中各自的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

经过上面的解释,这个地方就不是很难理解了。

第一个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表连接方式可以参考这篇文章

 

你可能感兴趣的:(oracle,sql,c,测试,table,insert)