• Aucun résultat trouvé

Lignes dupliquées dans le résultat

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 68-72)

Le langage SQL DML

5.2 CONSULTATION ET EXTRACTION DE DONNÉES DANS UNE TABLE

5.2.4 Lignes dupliquées dans le résultat

En principe, le résultat d’une requête monotable contient autant de lignes qu’il y a, dans la table de départ, de lignes vérifiant la condition de sélection. Il se peut donc, dès qu’aucun identifiant n’est repris entièrement dans la clause select, que le résultat contienne plusieurs lignes identiques.

La requête suivante affiche les localités où habitent des clients de catégorie C1 : select LOCALITE

NCLI NOM

B512 C003 D063 F011 K729

GILLET AVRON MERCIER PONCELET NEUMAN

2. En fait, le standard préconise la forme date'2005-02-14'; pour des raisons de concision, nous adopterons la forme courte. En MS Access, une date se note #2005-02-14#.

5.2 Consultation et extraction de données dans une table 69

© Dunod – La photocopie non autorisée est un délit.

from CLIENT where CAT = 'C1' Nous obtenons le résultat suivant :

La réponse contient autant de lignes que la table originale CLIENT en contient qui satisfont la sélection. On pourra éliminer les lignes en double par la clause distinct comme suit3 :

select distinct LOCALITE from CLIENT

where CAT = 'C1'

Nous obtenons le résultat suivant, qui ne contient plus que des lignes distinctes :

Ainsi qu’on l’a indiqué dans le chapitre 3, nous travaillerons sur des tables initiales dotées chacune d’un identifiant primaire, c’est-à-dire dont les lignes sont distinctes.

On vient de voir cependant que le résultat d’une requête peut contenir des lignes dupliquées. Il faut être très prudent lorsqu’on exploite de tels résultats. Par exemple, la requête suivante donne les numéros des clients qui ont passé au moins une commande.

select NCLI from COMMANDE

Cependant, le nombre d’éléments du résultat n’est pas égal à celui des clients qui ont passé une commande, mais bien au nombre de commandes. On écrira plutôt : select distinct NCLI

from COMMANDE LOCALITE

Poitiers Namur Poitiers Namur Namur

3. En fait, l’expression "selectLOCALITE..." est une forme abrégée de "select all LOCALITE ...".

LOCALITE Namur Poitiers

L’existence de lignes en double dans une table pose de nombreux problèmes logi-ques dont le lecteur trouvera le développement dans [Codd, 1990] et [Date, 1992]

par exemple.

Unicité des lignes par construction

Si la clause select cite tous les composants de l’un des identifiants de la table, l’unicité des lignes du résultat est garantie. Il est donc inutile4 d’inclure distinct. 5.2.5 Des conditions de sélection plus complexes

a) Autres conditions élémentaires

Une condition élémentaire peut porter sur la présence de la valeur null : CAT is null

CAT is not null

On pourra s’étonner qu’il faille une forme spéciale (is, is not) pour exprimer l’égalité ou la non égalité dans le cas des valeurs null. Pourquoi en effet n’a-t-on pas utilisé la forme classique : CAT=null et CAT<>null ? Nous justifierons ce choix lorsque nous examinerons plus en détail la question de l’information incom-plète (Section 6.10). Nous y verrons que ces deux conditions, quelle que soit la valeur de CAT, ne pourront jamais avoir la valeur vrai.

Une condition peut aussi porter sur l’appartenance à une liste : CAT in ('C1','C2','C3')

LOCALITE not in ('Toulouse','Namur','Breda') ou à un intervalle :

COMPTE between 1000 and 4000 CAT not between 'B2' and 'C1'

ou encore sur la présence de certains caractères dans une valeur : CAT like '_1'

ADRESSE like '%Neuve%'

Ces dernières conditions utilisent un masque qui décrit la structure générale des valeurs désignées. Dans ce masque, le signe "_ " désigne un caractère quelconque et

" % " désigne toute suite de caractères, éventuellement vide; tout autre caractère doit être présent là où il apparaît. La première expression est satisfaite dans la table CLIENT pour les valeurs de CAT constituées d’un caractère quelconque suivi du caractère "1", soit l’une des valeurs "A1", "B1", "C1". La seconde est satisfaite par 4. et d’ailleurs déconseillé du point de vue des performances.

5.2 Consultation et extraction de données dans une table 71

© Dunod – La photocopie non autorisée est un délit.

toute valeur de ADRESSE contenant le mot "Neuve". Un petit problème se pose : comment rechercher les caractères % et _ dans les données ? Il suffit de les préfixer dans le masque par un caractère spécial qu’on définit dans une clause escape. Dans l’exemple ci-dessous, on recherche la présence de la chaîne '_CHENE' dans les valeurs de LIBELLE:

LIBELLE like '%$_CHENE%' escape '$'

Un masque peut aussi s’appliquer à une date. La forme suivante retient les dates de commande tombant en 2005

DATECOM like '%2005%'

Cette condition admet une forme négative, dont l’interprétation est évidente : ADRESSE not like '%Neuve%'

Note

L’effet d’une condition like portant sur le dernier caractère d’une valeur dépend du type char ou varchar de cette valeur. Une colonne de type char(n) contient des valeurs composées de n caractères exactement. Si la valeur qu’on y range comporte moins de n caractères, ceux-ci sont considérés comme étant complétés par des espaces. Donc, la condition CAT like '_1' reconnaîtra 'B1 si CAT est déclarée char(2) mais pas si on l’avait déclarée char(3). Le type varchar(n) définit des valeurs dont la longueur est le nombre de caractères effectivement introduits (à concurrence de n). Cette condition se comporterait donc selon l’intuition si CAT avait été déclarée varchar(3).

b) Expressions composées

La condition de sélection introduite par la clause where peut être constituée d’une expression booléenne de conditions élémentaires (opérateurs and, or, not et paren-thèses). La requête suivante retient les lignes pour lesquelles, simultanément (and), LOCALITE a pour valeur 'Toulouse' et COMPTE a une valeur négative.

select NOM, ADRESSE, COMPTE from CLIENT

where LOCALITE = 'Toulouse' and COMPTE < 0

Etant donné les conditions P et Q relatives aux lignes de la table T, la clause

• wherePandQ sélectionne les lignes de T qui vérifient simultanément P et Q;

• wherePorQ sélectionne les lignes de T qui vérifient P ou Q ou les deux;

• wherenotP sélectionne les lignes de T qui ne vérifient pas P.

L’usage de parenthèses permet de former des conditions plus élaborées encore : where COMPTE > 0

and (CAT = 'C1' or LOCALITE = 'Paris')

Les parenthèses peuvent être utilisées même lorsqu’elles ne sont pas indispensables, par exemple pour rendre plus lisible une condition composée :

where (LOCALITE = 'Toulouse') and (COMPTE < 0)

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 68-72)