1

如果我有一张如下表:

+------+-------+   
| sno  | cno   |  
+------+-------+  
|    1 | CS112 |  
|    1 | CS113 |  
|    1 | CS114 |  
|    2 | CS112 |  
|    3 | CS112 |  
|    3 | CS114 |  
|    4 | CS112 |  
|    4 | CS113 |  
|    5 | CS113 |  
|    6 | CS113 |  
|    6 | CS114 |  
+------+-------+  

如果我进行内部自联接,sno我希望看到以下顺序的行:

+------+-------+------+-------+  
| sno  | cno   | sno  | cno   |  
+------+-------+------+-------+  
|    1 | CS112 |    1 | CS112 |  
|    1 | CS112 |    1 | CS113 |  
|    1 | CS112 |    1 | CS114 |  
|    1 | CS113 |    1 | CS112 |  
|    1 | CS113 |    1 | CS113 |  
|    1 | CS113 |    1 | CS114 |  
etc
+------+-------+------+-------+    

但是顺序是

+------+-------+------+-------+  
| sno  | cno   | sno  | cno   |  
+------+-------+------+-------+  
|    1 | CS112 |    1 | CS112 |   
|    1 | CS113 |    1 | CS112 |  
|    1 | CS114 |    1 | CS112 |  
|    1 | CS112 |    1 | CS113 |  
|    1 | CS113 |    1 | CS113 |  
|    1 | CS114 |    1 | CS113 |  
|    1 | CS112 |    1 | CS114 |  
etc
+------+-------+------+-------+    

即,我希望看到左侧的每一行对于骑行中的每一行都重复。反之亦然。即,它似乎获取所有行并将其与连接右侧的第一行匹配。
为什么是这样的顺序?

4

2 回答 2

2

您不应该对查询中的结果顺序有任何期望,除非您使用order by子句(或在 MySQL 中,group by子句)。

不幸的是,我没有在 MySQL 文档中找到明确说明这一点的参考资料。最接近的是这里的引用

您可能已经注意到,在前面的示例中,结果行没有按特定顺序显示。当行以某种有意义的方式排序时,通常更容易检查查询输出。要对结果进行排序,请使用 ORDER BY 子句。

但是,ANSI 标准确实指定查询结果(和表)是无序的,除非order by指定了子句。

于 2013-04-18T20:13:44.257 回答
1

将表视为记录集。我说“集合”是因为这通常是 SQL 的一个远亲称为关系代数的有效词。而且,当然,集合中没有顺序。

添加order by子句后,您将按指定顺序获得结果:

select t1.sno, t1.cno, t2.sno, t2.cno from t t1
join t t2 on t1.sno = t2.sno
order by t1.sno, t2.sno, t1.cno, t2.cno
于 2013-04-18T20:35:29.230 回答