« Structured Query Language/Requêtes SELECT » : différence entre les versions

Contenu supprimé Contenu ajouté
(:Julien:) (discussion | contributions)
Aucun résumé des modifications
(:Julien:) (discussion | contributions)
Aucun résumé des modifications
Ligne 378 :
==== BETWEEN ====
 
On aurait pu écrire la requête du dernier exemple différemment, les mots-clefs BETWEEN ... AND ... permettent de sélectionner des valeurs comprises entre deux bornes. Voici une requête qui renverra le même résultat qu'au -dessus mais avec BETWEEN :
 
<source lang="sql">SELECT id, nom FROM test WHERE id BETWEEN 2 AND 7 AND ( nom = 'shepard' OR nom = 'somebody' );</source>
Ligne 559 :
HAVING, par contre, s'effectue après. C'est pourquoi il permet, contrairement à WHERE, de filtrer les données calculées.
 
{{non}} La requête suivante vous renverra une erreur, en général « la colonne score n'existe pas » :
 
<source lang="sql">SELECT points AS score FROM test WHERE score > 100;</source>
 
Une façon de contourner ce problème seraitest de traiter cette requête comme un tableau et d'y infligereffectuer une nouvelle requête (je dis infliger carmais cette pratique risquealourdit bienla decharge mettre undu serveur par terre s'il y a beaucoup de données) en mettant la première requête dans le FROM de la principale :
 
<source lang="sql">SELECT score FROM (SELECT points AS score FROM test) s WHERE score > 100;</source>
Ligne 569 :
Le "s" après le FROM est un alias de table, il est obligatoire dans le cas d'une sous-requête (c'est la requête entre parenthèses).
 
La requête suivante auraa l'effet escompté, en plus d'être bien plus rapide que celle juste au -dessus :
 
<source lang="sql">SELECT points AS score FROM test HAVING score > 100;</source>
Ligne 667 :
|}
 
Vous constatez qu'en effet, c'estles ordonnécolonnes sont ordonnées par ordre dealphabétique sur le nom, mais vous pouvez également spécifier plusieurs colonnes pour l'ordonnancement du résultat. Par exemple par nom puis par points :
 
<source lang="sql">SELECT * FROM test ORDER BY nom, points;</source>
Ligne 725 :
|}
 
Si vous voulez trier une colonne par ordre inverse, il vous suffit d'ajouter le mot-clef DESC après le nom de la colonne concernée. Par exemple la même requête qu'au -dessus avec les points triés par ordre inverse :
 
<source lang="sql">SELECT * FROM test ORDER BY nom, points DESC;</source>
Ligne 783 :
|}
 
{{non}} ORDER BY permet de trier selon les colonnes récupérées uniquement, ainsi la requête suivante n'est pas conforme étant donné que la colonne "quand" ne fait pas partie des colonnes rapatriées :
 
<source lang="sql">SELECT id, nom FROM test ORDER BY quand;</source>
 
== Une clause à part : LIMIT ou TOP ==
 
Une clause {{Abréviation|S.Q.L.|Structured Query Language}} implémentée par la plupart des SGBDR permet de limiter le nombre de lignes retournées. Pour certains (PostGreSQL, MySQL, SQLite par exemple), c'est LIMIT à la fin de l'ordre SELECT, pour d'autres (Microsoft Access, Microsoft {{Abréviation|S.Q.L.|Structured Query Language}} Server), c'est TOP au début de ce même ordre.
 
Ces clauses ne font absolument pas partie du standard {{Abréviation|S.Q.L.|Structured Query Language}}, en effet le {{Abréviation|S.Q.L.|Structured Query Language}} suit une logique ensembliste, et limiter un ensemble est contraire à cette logique. N'hésitez cependant pas à les utiliser car dans beaucoup de cas ces clauses sont très pratiques et vous permettent d'éviter des élucubrations souvent dangeureuses pour la santé de votre serveur ...
 
==== Un exemple avec LIMIT ====
Ligne 826 :
|}
 
Les 5 premières lignes insérées sont renvoyées. Suite à certaines requêtes le SGBDR pourrait tout aussi bien vous renvoyer les lignes dans un ordre totalement aléatoire, {{Abréviation|S.Q.L.|Structured Query Language}} n'admet aucuneaucun sorte "d'ordre par défaut", si vous voulez être sur d'obtenir le même résultat à chaque requête sur les mêmes données, vous devez utiliser ORDER BY.
Attention, dans ce cas-ci les 5 premières lignes insérées sont renvoyées, '''ce n'est pas toujours le cas'''
 
Les SGBDR qui proposent la clause LIMIT proposent généralement un complément nommé OFFSET qui permet de dire de prendre xn lignes à partir de la ligne yk :
Suite à certaines requêtes le SGBDR pourrait tout aussi bien vous renvoyer les lignes dans un ordre totalement aléatoire, {{Abréviation|S.Q.L.|Structured Query Language}} n'admet aucune sorte "d'ordre par défaut", si vous voulez être sur d'obtenir le même résultat à chaque requête sur les mêmes données, vous devez utiliser ORDER BY.
 
Les SGBDR qui proposent la clause LIMIT proposent généralement un complément nommé OFFSET qui permet de dire de prendre x lignes à partir de la ligne y :
 
<source lang="sql">SELECT * FROM test ORDER BY id LIMIT 3 OFFSET 2;</source>
Ligne 853 ⟶ 851 :
|}
 
==== Le même exemple avec TOP ====
 
<source lang="sql">SELECT TOP 5 * FROM test;</source>
 
 
{| class="wikitable"
Ligne 920 ⟶ 917 :
== Application de l'[[algèbre relationnelle]] ==
=== Sélection ===
À partir d'un ensemble A, obtenir un ensemble B dont les valeurs des nupletsn-uplets correspondent à des critères donnés.
<source lang="sql">
selectSELECT *
fromFROM A
whereWHERE nuplet = 'critère'
</source>
 
=== Projection ===
À partir d'un ensemble A, obtenir un ensemble B dont les nupletsk-uplets contiennent certaines composantes des nupletsn-uplets de A.
<source lang="sql">
selectSELECT cellule
fromFROM A
whereWHERE nuplet = 'critère'
</source>
 
=== Intersection ===
À partir des ensembles A et B, obtenir un ensemble C qui contient les nupletsn-uplets présents à la fois dans A et dans B. voir aussi intersection (mathématiques)
 
<source lang="sql">
selectSELECT cellule fromFROM A
INTERSECT
intersect
selectSELECT cellule fromFROM B
</source>
 
=== Union ===
À partir des ensembles A et B, obtenir un ensemble C qui contient les nupletsn-uplets présents dans A ou dans B. voir aussi union (mathématiques).
<source lang="sql">
selectSELECT cellule fromFROM A
UNION ALL
union all
selectSELECT cellule fromFROM B
</source>
 
Sans les doublons :
<source lang="sql">
selectSELECT cellule fromFROM A
UNION
union
selectSELECT cellule fromFROM B
</source>
 
=== Différence ===
À partir des ensembles A et B, obtenir un ensemble C qui contient les nupletsn-uplets présents dans A mais pas dans B. voir aussi différence.
<source lang="sql">
selectSELECT cellule
fromFROM A
whereWHERE A.cellule notNOT inIN (selectSELECT cellule fromFROM B);
</source>
 
En {{Abréviation|S.Q.L.|Structured Query Language}} 2 :
<source lang="sql">
selectSELECT cellule
fromFROM A
EXCEPT
except
selectSELECT cellule
fromFROM B;
</source>
 
=== Produit cartésien ===
À partir des ensembles A et B, obtenir un ensemble C qui contient des nupletsn-uplets qui sont toutes les combinaisons possibles des nupletsj-uplets de A avec les nupletsk-uplets de B. voir aussi produit cartésien.
<source lang="sql">
selectSELECT cellule
fromFROM A, B
</source>
 
=== Jointure ===
À partir des ensembles A et B, obtenir un ensemble C qui est leun sous-ensemble du produit cartésien de chaque nuplet de A pouret lesquelsB il existe des nuplets de Bdans lesquel la valeur de la composante M de A est identique à la valeur de la composante N de B.
<source lang="sql">
selectSELECT A.cellule
fromFROM A leftLEFT joinJOIN B onON A.cellule = B.cellule
whereWHERE B.cellule isIS nullNULL;
</source>
 
=== Division cartésienne ===
À partir des ensembles A et B, obtenir un ensemble C, où la combinaison de chaque nupletn-uplet de B avec chaque nupletn-uplet de C (produit cartésien de B et C) existe dans A.
<source lang="sql">
</source>