2009-05-05 14 views

Répondre

41

Non, si vous n'utilisez pas "order by", vous n'avez aucune garantie quant à la commande. En fait, vous n'êtes pas assuré que la commande d'une requête à l'autre sera la même. Rappelez-vous que SQL traite les données de manière fixe. Maintenant, une implémentation de base de données ou une autre peut arriver à fournir des commandes d'une certaine manière, mais vous ne devriez jamais compter sur cela.

+1

Y a-t-il une chance que les enregistrements soient retournés dans l'ordre de l'index clusterisé? –

+1

Une très bonne chance, mais pas garantie. Les requêtes compliquées impliquant des jointures, des vues, des sous-requêtes et similaires peuvent laisser l'ensemble de résultats ordonné très différemment. –

+0

ET il peut parfois revenir dans l'ordre de l'index cluster et parfois non. Toujours utiliser une commande par si vous voulez une commande spécifique. – HLGEM

6

Lorsque je fais une sélection, est-il toujours garanti que mon résultat sera ordonné par la clé primaire, ou devrais-je le spécifier avec une 'commande par'?

Non, ce n'est pas garanti.

SELECT * 
FROM table 

très probablement utilisera TABLE SCAN qui n'utilise pas la clé primaire du tout.

Vous pouvez utiliser un indice:

SELECT /*+ INDEX(pk_index_name) */ 
     * 
FROM table 

, mais même dans ce cas, la commande n'est pas garanti: si vous utilisez Enterprise Edition, la requête peut être parallélisé.

Ceci est un problème, car ORDER BY ne peut pas être utilisé dans une sous-requête de clause SELECT et vous ne pouvez pas écrire quelque chose comme ceci:

SELECT (
     SELECT column 
     FROM table 
     WHERE rownum = 1 
     ORDER BY 
       other_column 
     ) 
FROM other_table 
+0

Pas de problème: SELECT DISTINCT FIRST_VALUE (colonne) OVER (ORDER BY autre_colonne) FROM table; –

+0

@Jeffrey: c'est possible, mais la sous-requête sélectionnera toutes les FIRST_VALUE et HASH UNIQUE. Cela va tuer toutes les performances, la sous-requête retourne beaucoup de lignes. – Quassnoi

0

Cela dépend de votre DB et aussi dépend de champs indexés. Par exemple, dans ma table Utilisateurs, chaque utilisateur a un identifiant de champ varchar (20) unique et un identifiant de clé primaire.

Et "Sélectionner * des utilisateurs" renvoie l'ensemble de lignes ordonné par la connexion.

0

Si vous désirez une commande spécifique, déclarez-la spécifiquement en utilisant ORDER BY.

Que faire si la table n'a pas de clé primaire?

+0

Si la table ne possède pas de clé primaire, vous avez d'autres problèmes que l'ordre dans lequel les données sont renvoyées. –

+0

totalement, mais cela n'empêche pas les gens de concevoir des tables mal! – pmcilreavy

0

Si vous voulez que vos résultats dans un ordre spécifique, toujours spécifier une commande par

2

Non, la commande est jamais garanti sauf si vous utilisez une clause ORDER BY. L'ordre de lecture des lignes dépend de la méthode d'accès (par exemple analyse complète de la table, analyse d'index), des attributs physiques de la table, de l'emplacement logique de chaque ligne dans la table et d'autres facteurs. Ceux-ci peuvent tous changer même si vous ne changez pas votre requête, donc afin de garantir une commande cohérente dans votre jeu de résultats, ORDER BY est nécessaire.