Souvent lors de l'utilisation de SQL pour l'échantillonnageinformations provenant de tables, l'utilisateur reçoit des données redondantes, consistant en la présence de lignes répétitives absolument identiques. Pour éviter cette situation, l'argument distinct SQL de la clause Select est utilisé. Cet article examinera des exemples d'utilisation de cet argument, ainsi que des situations dans lesquelles il est préférable de refuser d'utiliser l'argument.
Avant de commencer à regarder des exemples spécifiques, créons quelques tables requises dans la base de données.
Imaginons que notre base de données stockeinformations sur le papier peint présentées dans deux tableaux. Il s'agit d'une table Oboi (papier peint) avec les champs id (identifiant unique), type (type de papier peint - papier, vinyle, etc.), couleur (couleur), structure (structure) et prix (prix). Et la table Ostatki (restes) avec les champs id_oboi (lien vers l'identifiant unique dans la table Oboi) et count (le nombre de rouleaux dans l'entrepôt).
Remplissons les tableaux de données. Ajoutez 9 enregistrements à la table de papier peint:
Oboi | ||||
id | type | Couleur | struct | prix |
1 | Papier | Multicolore | En relief | 56,9 |
2 | Papier à deux couches | Beige | Lisse | 114,8 |
3 | Vinyle | Orange | En relief | 504 |
4 | Non-tissé | Beige | En relief | 1020,9 |
5 | Papier à deux couches | Beige | Lisse | 150,6 |
6 | Papier | Multicolore | Lisse | 95,4 |
7 | Vinyle | marron | Lisse | 372 |
8 | Non-tissé | blanc | En relief | 980,1 |
9 | Tissu | Rose | Lisse | 1166,5 |
Il y a également neuf entrées dans le tableau avec des résidus:
Ostatki | |
id_oboi | compter |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Commençons par décrire comment distinct est utilisé dans SQL.
Distinct doit être placé immédiatement aprèsSélectionnez le mot-clé dans les requêtes. Elle est appliquée immédiatement à toutes les colonnes spécifiées dans la clause Select, car elle exclura les lignes absolument identiques du résultat final de la requête. Ainsi, il suffit de spécifier une fois «select distinct» lors de l'écriture d'une requête SQL. Une exception est l'utilisation de fonctions d'agrégation internes distinctes, que nous examinerons un peu plus tard.
Il ne faut pas oublier que la plupart des SGBD ne reconnaissent pas votre requête du formulaire:
Sélectionnez Ostatki.Count distinct, Oboi distinct. * DE Oboi INNER JOIN Ostatki ON Oboi.id = Ostatki.id_oboi |
L'argument en question a été spécifié plusieurs fois ici, ou il a été spécifié une fois, mais avant la deuxième, troisième ou autre colonne sélectionnable. Vous recevrez une erreur citant une inexactitude dans la syntaxe.
Il est évident qu'avec une construction compétente de la structureles tables et leur remplissage, à l'intérieur d'une table, les situations sont exclues lorsque des lignes absolument identiques sont rencontrées. Par conséquent, l'exécution de la requête "Select distinct *" avec une sélection dans une table est pratiquement impossible.
Imaginez une situation où nous avons besoin de savoir quel type de papier peint nous avons, pour plus de commodité, nous allons immédiatement trier par type:
SELECT Oboi.type FROM Oboi ordre par type |
Et nous obtenons le résultat:
type |
Papier |
Papier |
Papier à deux couches |
Papier à deux couches |
Vinyle |
Vinyle |
Tissu |
Non-tissé |
Non-tissé |
Comme vous pouvez le voir, il y a des lignes en double dans le tableau. Si nous ajoutons à la clause Select distinct:
SELECT distinct Oboi.type FROM Oboi ordre par type |
on obtient le résultat sans répétitions:
type |
Papier |
Papier à deux couches |
Vinyle |
Tissu |
Non-tissé |
Ainsi, si les données ont été correctement saisiestables, puis immédiatement sur appel ou demande du client, nous pourrons répondre que le papier peint liquide, le papier peint en verre et le papier peint acrylique ne sont pas disponibles dans le magasin. Étant donné que l'assortiment en magasin n'est généralement pas limité à une centaine de papiers peints, il serait assez laborieux de parcourir la liste des types non uniques.
L'argument distinct SQL peut être utilisé avec n'importe quelfonction d'agrégation. Mais pour Min et Max, cela n'aura aucun effet, et lors du calcul de la somme ou de la moyenne, vous pouvez rarement imaginer une situation où vous n'auriez pas besoin de prendre en compte les répétitions.
Disons que nous voulons savoir à quel point notre entrepôt est plein, et pour cela, nous envoyons une demande qui calcule le nombre total de rouleaux dans l'entrepôt:
SELECT somme (Ostatki.count) DE Ostatki |
La demande renverra la réponse 143. Si nous changeons en:
SELECT somme (Ostatki.count distinct) DE Ostatki |
nous n'en obtenons que 119, car les papiers peints des articles 3 et 7 sont dans l'entrepôt dans la même quantité. Cependant, cette réponse n'est clairement pas correcte.
Le plus souvent utilisé dans SQL distinct avec la fonction Count. Ainsi, nous pouvons facilement savoir combien de types de papiers peints uniques nous avons en général:
SELECT count (Oboi.type distinct) DE Oboi |
Et obtenez le résultat 5 - papier régulier etdeux couches, vinyle, tissu et non tissé. Tout le monde a sûrement vu une publicité comme: "Seulement, nous avons plus de 20 types de papiers peints différents!", Ce qui signifie que dans ce magasin, il n'y a pas deux douzaines de rouleaux de tout, mais des papiers peints des types modernes les plus divers.
Il est intéressant de noter qu'en une seule demande, vous pouvez spécifierplusieurs fonctions de comptage avec et sans distinct. Autrement dit, il s'agit de la seule situation dans laquelle distinct dans Select peut apparaître plusieurs fois.
L'argument SQL distinct doit être ignoré dans l'un des deux cas suivants:
Disons que votre patron vous demande de lister le fond d'écran que vous avez avec seulement deux colonnes - type et couleur. Par habitude, vous fournissez l'argument distinct:
SELECT Oboi.type distinct, Oboi.color DE Oboi COMMANDER PAR Oboi.type |
Et - vous perdez certaines des données:
type | Couleur |
Papier | Multicolore |
Papier à deux couches | Beige |
Vinyle | marron |
Vinyle | Orange |
Tissu | Rose |
Non-tissé | Beige |
Non-tissé | blanc |
Il peut sembler que nous n'avons qu'un seul type de papier peint (ordinaire et bicouche), même si en fait, même dans notre petite table, il y a deux articles chacun (le résultat est sans distinction):
type | Couleur |
Papier | Multicolore |
Papier | Multicolore |
Papier à deux couches | Beige |
Papier à deux couches | Beige |
Vinyle | marron |
Vinyle | Orange |
Tissu | Rose |
Non-tissé | blanc |
Non-tissé | Beige |
Par conséquent, comme pour écrire toute requête, avec l'argument distinct, vous devez être prudent et résoudre avec compétence le problème avec son application, en fonction de la tâche à accomplir.
Le contraire de distinct est un argumentTout. Les lignes dupliquées sont conservées lorsqu'elles sont appliquées. Mais puisque par défaut le SGBD pense que toutes les valeurs doivent être affichées, l'argument Tous est plus un qualificatif qu'un véritable argument fonctionnel.