2015-07-26 8 views
0

J'ai deux tables simples pour ce sujet:cartésien SQL produit/Cross Rejoindre direction

abc  numbers 
+--------+ +--------+ 
| letter | | number | 
+--------+ +--------+ 
| a  | |  1 | 
| b  | |  2 | 
+--------+ |  3 | 
      +--------+ 

Requête:

SELECT letter, number 
FROM abc 
CROSS JOIN numbers; 

Résultat:

+--------+--------+ 
| letter | number | 
+--------+--------+ 
| a  |  1 | 
| b  |  1 | 
| a  |  2 | 
| b  |  2 | 
| a  |  3 | 
| b  |  3 | 
+--------+--------+ 

Résultat attendu:

+--------+--------+ 
| letter | number | 
+--------+--------+ 
| a  |  1 | 
| a  |  2 | 
| a  |  3 | 
| b  |  1 | 
| b  |  2 | 
| b  |  3 | 
+--------+--------+ 

Pourquoi n'est-ce pas sorti comme je l'avais prévu? D'après ce que j'ai lu sur les produits cartésiens dans ce article, il aurait fallu sortir comme je m'y attendais.

enter image description here

Quelqu'un peut-il expliquer étape par étape comment le résultat que j'ai été traité par MySql?

+2

Ressemble aux boucles imbriquées avec des nombres comme table externe. Aucune commande n'est garantie sans commande par. –

+1

Parce que les ensembles sont par définition non ordonnés sauf si explicitement ordonné. La réponse à votre question ne peut probablement être trouvée qu'en examinant le code source qui constitue le moteur MySQL, en particulier le processeur de requêtes et les optimiseurs associés. En fin de compte, est-ce important? – jpw

Répondre

3

Les jeux de résultats sont identiques. Les ensembles de résultats SQL n'ont pas d'ordre, sauf si vous spécifiez un order by. Les deux contiennent les mêmes lignes, elles sont donc identiques.

Si vous attendez une requête pour renvoyer des lignes dans un ordre particulier et que vous n'utilisez pas order by, votre attente est tout simplement fausse.

+0

ok ok est logique. –

+0

Je vais poster une autre question, un peu en rapport avec ça. –