/ / SQL distinct: description, exemples, propriétés

SQL distinct: description, exemples, propriétés

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.

sql distinct

Préparer les tables

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.

Placer distinct dans la clause Select

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.

sql sélectionner distinct

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.

Utilisation de distinct dans les requêtes standard

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.

distinct en sql

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.

Utilisation de fonctions d'agrégat internes distinctes

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.

Quand abandonner l'argument

L'argument SQL distinct doit être ignoré dans l'un des deux cas suivants:

  1. Vous récupérez des tables et êtes sûrunicité des valeurs dans chacun. Dans ce cas, l'utilisation de l'argument n'est pas pratique, car il s'agit d'une charge supplémentaire sur le serveur ou le client (selon le type de SGBD).
  2. Vous avez peur de perdre les données dont vous avez besoin. Expliquons-nous.

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.

Une alternative à distinct

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.

description SQL distincte
Nous espérons que vous comprenez maintenant quanddistinct (SQL) s'applique. La description vous a donné des informations complètes sur l'opportunité d'utiliser cet argument pour résoudre divers problèmes. En effet, il s'est avéré que même un argument aussi simple dans son application cache une probabilité tout à fait tangible de perdre certaines données et d'afficher des informations inexactes.

J'ai aimé:
0
Messages populaires
Développement spirituel
Nourriture
yup