Académique Documents
Professionnel Documents
Culture Documents
-1-
SOMMAIRE
-2-
Chapitre premier
Les bases de données
Dans ce chapitre :
1. Définition ............................................................................................................................................... 4
2. Pourquoi apprendre une base de données relationnelle ......................................................................... 4
3. Terminologies ........................................................................................................................................ 5
4. Création d’une base de données ............................................................................................................. 5
5. Normalisation et formes normales ......................................................................................................... 7
-3-
1. Définition :
Une base de données est un ensemble structuré de données enregistrées dans un ordinateur et
accessibles de façon sélective par plusieurs utilisateurs.
L’utilisation d’une base de données offre plusieurs avantages. Parmi lesquels, on peut citer :
Exemple: Combien me reste-t-il en stock du produit X? Qui sont mes dix plus importants clients en ce
moment? Etc.
Pour mieux comprendre l'avantage ainsi que pour montrer certains concepts de base d'un système de
gestion de base de données relationnelle, utilisons l’exemple d’une facture. Sur une facture, nous trouvons
généralement: la date, le numéro de la facture, le numéro du vendeur, le numéro du produit, la quantité
vendue, le prix unitaire, la description du produit, le sous total, les taxes, le total, etc. Voici quelques-unes
de ces données, organisées dans une base de données simple.
L'idée d'une base de données relationnelle est de répartir les données dans plusieurs tables et de créer
des connexions, des points communs, des liens, c'est-à-dire des relations entre chacune d'elles. Voici
comment les variables pourraient être divisées dans une base de données relationnelle.
-4-
Dans le tableau 2, la table FACTURE va chercher les informations sur le client de la table CLIENT
par le champ commun N° Client. Il est inutile de réécrire les données sur un client plusieurs fois.
On peut aller chercher l'information grâce à une relation entre ces deux tables, soit par le champ
N°Client. La même chose se produit pour les informations nécessaires pour les tables VENDEUR et
INVENTAIRE par leurs variables communes, respectivement, N° Vendeur et N° Produit.
De cette manière, il est inutile de réécrire les données redondantes ou répétitives. Ceci conserve de
l'espace pour d'autres données.
Pour les trois factures de l'exemple, on économise de l'espace et du temps à ne pas avoir à réécrire les
informations sur le client ABC ni la description et le prix unitaire du produit 415.
3. Terminologies
L’utilisation d'une base de données apporte de nouveaux termes à comprendre. En effet, la définition
d'une base de données n'est plus juste un fichier qui contient de l'information utile pour l'utilisateur. Il
contient aussi les requêtes, les formulaires, les états, les macros et les modules pour développer une
« application » ou un « système » qui répond aux besoins spécifiques de l'utilisateur.
TERME DEFINITION
Une information nécessaire sur une personne, une chose ou un événement.
Champ Ex.: couleur, taille, modèle, date, nom, prénom, téléphone, adresses, description,
commentaires, etc.
Un regroupement de champs qui décrivent une personne, une chose ou un événement.
Ex.: nom, prénom, date de naissance, téléphone, numéro d'assurance sociale ou
Enregistrement
compagnie, adresse, téléphone, télécopieur, personne responsable ou département,
personne responsable, téléphone.
Un regroupement d'enregistrements sur un thème un commun. Ex.: employés, inventaire,
Table
client, fournisseurs, véhicules, contacts etc.
Tableau 3 : Terminologie courante
Avant de créer la base de données, il faut avoir une idée claire de ce que seront les besoins pour celle-
ci. Il faut préparer une analyse approfondie des besoins en se posant la question : « Quelles sont les
informations dont on a besoin ? »
Exemple : Quelles informations ai-je besoin sur mes clients, sur mes fournisseurs, sur mon inventaire,
sur mon personnel, etc.
Une technique parmi d'autres que l'on peut utiliser consiste à fonctionner « à l'envers » (top-down),
c'est-à-dire, songer aux formulaires et aux états dont on aura besoin. Connaissant ces informations,
découvrir quels sont les champs nécessaires pour atteindre ceux-ci. Par exemple, il faut connaître les
quantités vendues et à quel prix unitaire avant de connaître le total des ventes.
-5-
La technique « bottom-up » peut aussi être utilisée : à partir de la base, on détermine toutes les
informations qui sont nécessaires pour les requêtes, les formulaires et les états de la base de données.
N.B. On peut combiner les deux techniques pour s'assurer d'avoir toutes les informations nécessaires.
Voici, par exemple, la liste de champs que l'on peut retrouver une facture : Date, Numéro de facture,
Numéro de client, Adresse de facturation du client, Ville, Numéro de téléphone, Numéro de télécopieur,
courrier électronique, Adresse de livraison, Personne contact, Conditions de paiement, Numéro de
produit, Description du produit, Prix unitaire du produit, Quantité achetée, Total pour l'item, sous total,
Grand total, Escompte, Bon de commande, Numéro du vendeur, Nom du vendeur, etc...
Une des techniques pour regrouper les champs dans des tables et pour déterminer les relations entre
ces tables est le concept de distribuer les champs dans le plus grand nombre de tables possibles tout en
suivant certaines règles telles que :
- Regroupement des champs dans des tables qui peuvent être reliées.
- Pas de dédoublement de champs, sauf pour les champs en commun.
- Pas de dédoublement d'entrée d'information.
- Pas de champs calculables dont on peut avoir le résultat avec les informations des autres champs
des tables.
Exemple:
Si l'on se basait sur des éléments de la vie de tous les jours, du concret, on pourrait se référer sur les
questions suivantes :
- Quelles sont les opérations accomplies ?
- Qui utilise quelle information ?
Pour la facture, on retrouve des éléments qui distinguent la facture, le client, les produits et le vendeur.
Ce sont donc les quatre tables qui seront utilisées.
Il faut aussi s'assurer que les champs sont dans la bonne table, qu'il n'y a pas de tables cachées à
l'intérieur des autres.
A l'exception des « champs en commun » qui servent à « relier » les tables, un champ ne devrait pas se
retrouver dans plusieurs tables.
Par exemple, bien qu'il puisse avoir plusieurs factures avec la même date, la même quantité achetée, au
même client ou avec le même vendeur, il n'y aura pas deux factures avec le même numéro de facture.
Une clé primaire n'est pas obligatoire pour une table. Elle le devient lorsque l'on veut relier deux
tables : l'une des tables doit avoir une clé primaire.
Rendu à un certain point, il est préférable d'avoir un champ nommé Numéro d'employé ou Numéro
d'assurance social pour distinguer chacun des enregistrements de la table. Mais il y a des occasions où il
est nécessaire d'avoir une clé primaire qui est composée de plusieurs champs.
-6-
Quatrième étape : Déterminer les relations entre les tables
Pour qu'une relation soit possible entre deux tables, il faut:
- deux tables (ou requêtes ou une combinaison des deux)
- un champ en commun dans chacune des tables.
Remarque :
Le champ en commun doit être :
- de même type (Texte avec texte, numérique avec numérique)
- de même longueur (Pas un champ long de 15 caractères avec un autre long de 50 caractères)
- de même genre d'information (Code d'inventaire avec des codes d'inventaires, NAS avec NAS ...)
En outre, il n'est pas obligatoire de relier toutes les tables l'une à l'autre. Il est possible d'accéder à
l'information tant que les tables soient reliées directement ou indirectement en elles.
Pour l'exemple qui est utilisé, voici comment relier les tables dont les informations se retrouvent sur
une facture. L'image ci-dessous démontre la liste des tables avec les champs qui les composent. Les lignes
indiquent les relations entre les tables.
N.B. La relation de types plusieurs à plusieurs requiert une tables intermédiaire composé, au minimum
de la clé primaire des deux tables à relier. C'est la raison d'être de la table Transition Fact-Inv qui
pourrait tout aussi s'appeler « Items » de la facture.
On parle de retirer progressivement quelques problèmes que l'on retrouve dans les bases de données
pour afficher la base de données sous différentes formes normales. Pour le moment, nous allons
seulement regarder les trois premières formes normales.
-7-
Première forme normale: répétition des données
Pour atteindre la première forme normale, il faut éliminer les groupes répétitifs en les séparant en
plusieurs tables. Le travail à accomplir pour atteindre la première forme normale est d'éviter
complètement les répétitions d'entrée de données. Par exemple, une facture peut contenir plusieurs
produits.
Donc, il peut avoir plusieurs numéros de produits pour une même facture. Ceci est de la redondance et
ce n'est pas une forme appropriée pour conserver de l'information dans une base de données relationnelle.
Comment fera-t-on ensuite pour relier une modification au bon produit ? Il faut donc mettre Numéro de
produit dans une table autre que Facture.
On peut en même temps déplacer les champs similaires dans l'autre table. Le test de la deuxième forme
normale va s'assurer que les champs sont à la bonne place.
Il faut s'assurer que l'utilisateur ne va entrer plusieurs fois la même information. Par exemple, cela ne
serait pas efficace d'avoir une table « Facture » qui contiendrait aussi les champs « Nom du client »,
« Adresse de livraison », « personne contact ». Cela ne passerait pas à la première forme normale. La
raison est qu'il faudrait que l'utilisateur rentre pour chaque facture la même information qu'il a déjà entrée
dans les factures précédentes pour le même client.
C'est pour cette raison qu'il faut « découper » la liste des champs dont on a besoin dans plusieurs tables
pour avoir une forme efficiente d'entrée et d'utilisation des données. La même situation se répète pour les
informations sur le vendeur. Ainsi, dans notre exemple, on aura les tables :
Il faut ensuite déterminer la clé primaire pour chaque table. Cela est nécessaire pour la seconde forme
normale. Pour la table Facture, la clé primaire est le champ Numéro de facture. Le contenu de tous les
autres champs de la table peut se répéter ce qui serait contraire à la convention d'une clé primaire.
Le problème pour ce niveau est le champ « Quantité ». Il dépend en même temps du numéro de facture
et du numéro de produit. Une facture peut avoir plusieurs produits. Mais un produit peut aussi se
retrouver sur plusieurs factures. Il y a donc une relation de type « plusieurs à plusieurs » entre ces deux
tables.
Dans un tel cas, il est nécessaire de créer une table « intermédiaire » entre les tables facture et
inventaire afin de maintenir le type de relation, au plus, à un à plusieurs. C’est la table « Items ». Le
contenu de cette dernière est représenté ci-dessous.
-8-
Facture: Numéro de facture, Date, bon de commande, escompte
Clients: Numéro de client, adresse de facturation, ville, numéro de téléphone, numéro de télécopieur,
adresse de courriel, adresse de livraison, personne contact, escompte, conditions de paiement
Employés: Numéro du vendeur, nom, prénom, numéro d'assurance social
Inventaire: Numéro de produit, description, prix unitaire, quantité disponible
Items: Numéro de facture, Numéro de produit, Quantité achetée
Pour notre base de données, la table items est appelée « Transition Fact-Inv » puisqu'elle permet de
relier les tables Facture et Inventaire. L’on remarquera aussi que la clé primaire de cette table est
composée de deux champs: Numéro de facture et Numéro de produit. Ce sont aussi les clés primaires des
tables Facture et Inventaire.
Dans cette table, un même numéro de facture et un même numéro de produit peuvent être utilisé
plusieurs fois.
La troisième étape étant de déterminer les relations entre les différentes tables, il faut regarder quelles
sont les relations possibles entre les entités.
Pour avoir une relation, deux tables doivent avoir au moins un champ en commun. On peut relier une
facture à un client par le champ « ID_Client ». Ou encore, relier un produit à une facture par le champ
« ID_Produit » etc.
On devra à ce moment s’apercevoir que certains champs seraient mieux placés dans une autre entité.
Une fois que l’on ait réalisé les regroupements et déterminé les relations, on a la base pour la création des
tables.
Maintenant que l’on a les entités et les champs qui les composent, on doit penser à quoi devrait
ressembler les formulaires et les états. Les champs que l’on a choisis doivent répondre à tous les besoins.
Il faut prendre tout le temps nécessaire pour l'analyse.
-9-
Chapitre II
La programmation
Dans ce chapitre :
1. Préliminaires .......................................................................................................................................... 11
2. Ouverture ............................................................................................................................................... 12
3. Enregistrement ....................................................................................................................................... 13
4. Modification ........................................................................................................................................... 14
5. Suppression ............................................................................................................................................ 14
6. Navigation .............................................................................................................................................. 15
- 10 -
1. Préliminaire
La programmation d'une base de données relationnelle consiste, en général, à travailler sur les
enregistrements que contiennent les tables de la base. Une opération spécifique sur ces enregistrements
est aisément appelée « requête ».
La programmation peut être effectuée au sein même du logiciel MS Office Access, logiciel avec lequel
nous avons créé notre base de données, mais, notre but étant d'étudier la manipulation de ces données
d'une manière plus personnalisée, nous allons utiliser MS Visual BASIC.
De ce fait, comme notre projet se compose de plusieurs fichiers issus de différents logiciels, il est
nécessaire d'insérer, dans l'environnement Visual BASIC, une bibliothèque spécifique. Dans notre cas
cette bibliothèque se dénomme Microsoft DAO 2.5/3.51 Compatibility Library. L'insertion d'une
référence dans un projet s'effectue à partir du menu « Projet (Project) – Référence (Reference)». Ceci
nous permettra d'utiliser les types de variables « Database » et « Recordset ». A l'aide de ces objets, on
créera une copie de la base et des tables de la base dans le projet1. Ainsi, on aura une variable de type
« Database » et, éventuellement, plusieurs variables de type « Recordset » dont le nombre peut dépendre
de celui des tables que la base de données contient. Ces variables sont, en général, de niveau projet car,
selon la complexité des opérations à effectuer au sein de la base de données, elles seront manipulées dans
plusieurs « Forms2 ».
Syntaxes :
'Déclaration des variables base de données et tables
Public MaBase As Database
Public MaTable As Recordset
La programmation d'une base de données repose, en général, sur la manipulation des enregistrements tels
que : l'insertion de nouveaux enregistrements, la suppression, la modification ainsi que les recherches (ou
navigations entre enregistrements). Nous allons détailler chacune de ces opérations.
1
Il est à noter que l'omission de cette référence interdit l'accès aux types Database et Recordset
2
cf. portées des variables – cours de programmation.
- 11 -
2. Ouverture de la base de données et celle des tables :
Il est évident qu’avant d'accéder aux enregistrements, il faut ouvrir la base ainsi que la table où se trouve
l'enregistrement dont on a l'intention de manipuler. « L’OUVERTURE » est donc la première procédure à
écrire dans le programme. Les méthodes « OpenDatabase » et « OpenRecordset » permettent d'effectuer
cette opération.
La méthode OpenDatabase d'un objet « Database » impose la spécification de l'endroit où se situe la base
de données (dans notre cas le fichier .mdb, créé à l'aide de MS Office Access). C’est le « chemin » (en
anglais path). Il peut être absolu (ex. : C:\Gestion.mdb), comme pour une base de données en réseau en
général, ou relatif afin de rendre l'installation plus souple pour une base de données monoposte.
OpenRecordset est aussi une des méthodes d'un objet Database. Elle s'effectue en second plan (après
l'ouverture de la base) car elle permet l'ouverture d'une table de la base.
Syntaxes :
'Ouverture de la base de données
Set MaBase = OpenDatabase(Chemin)
'Ouverture de la table
Set MaTable = MaBase.OpenRecordset(NomTable)
La base ainsi que la table (ou les tables) étant ouvertes, on peut procéder aux opérations se rapportant sur
les enregistrements.
N.B. Dans ce tutoriel, nous n’allons détailler que tout ce qui concerne la table « Clients ». Voici, à quoi
ressemble le formulaire servant à manipuler les informations sur un client :
- 12 -
Figure 4 : Le formulaire d'informations sur un client (frmClients)
3. Enregistrement
Enregistrer veut dire insérer des nouvelles informations sur une entité dans une table spécifique. Elle
s'effectue par le biais de la méthode « Addnew » d'un objet recordset dont la syntaxe est la suivante :
Syntaxes :
MaTable.AddNew
MaTable ![PremierChamp] = Valeur_1
MaTable ![DeuxiemeChamp] = Valeur_2
…
MaTable.Update
La méthode « Update » met à jour la structure de la table. Ainsi, si tous se passe bien, les nouvelles
informations seront enregistrées dans la table. Voici, par exemple, le code d'enregistrement d'un client,
instructions qui se répètent chaque fois que l'utilisateur appui sur le bouton « cmdEnregistrer » :
- 13 -
Quelques remarques :
- Le Bloc « With…End With » permet de se passer de la répétition d'une entité particulière (ici,
« MaTableClient »
- Il faut tenir compte du type de chaque champ. Un transtypage peut parfois être nécessaire.
4. Modification
La syntaxe de la modification ressemble à celle de l'enregistrement. A la différence qu’ici, on opère sur
un enregistrement existant. L'algorithme est donc le suivant :
- Spécifier la clé avec laquelle l'enregistrement à modifier sera recherché (Index)
- Rechercher cet enregistrement en entrant la valeur de la clé de recherche (Seek)
- Procéder à la modification de la valeur de chaque champ correspondant à la clé (Edit)
- Mettre la structure de la table à jour (Update)
Syntaxes :
MaTable.Index = NomDeLaCle
MaTable.Seek "=", Valeur
MaTable.Edit
MaTable ![PremierChamp] = Valeur_1
MaTable ![DeuxiemeChamp] = Valeur_2
…
MaTable.Update
Noter la syntaxe de l'instruction « Seek » : elle doit contenir un opérateur de comparaison selon la valeur
de la clé de l'enregistrement à rechercher. Cet opérateur ne doit cependant retourner qu’une et une seule
valeur correspondant à un seul enregistrement.
5. Suppression
Supprimer un enregistrement consiste à effacer un enregistrement de la table. Elle doit respecter
l'algorithme suivant :
- Spécifier la clé avec laquelle l'enregistrement à supprimer sera recherché (Index)
- Rechercher cet enregistrement en entrant la valeur de la clé de recherche (Seek)
- Procéder à la suppression (Delete)
Il faut noter que cette opération est irréversible : quand un enregistrement a été supprimé de la table, il n’y
aucun moyen de le récupérer. Il est donc indispensable d'attendre que l'utilisateur confirme l'exécution de
cette opération.
- 14 -
En outre, la méthode « Delete » met la table à jour automatiquement. Il n’est donc plus nécessaire de faire
appel à la méthode « Update » pour effectuer cette tâche.
Syntaxes :
MaTable.Index = NomDeLaCle
MaTable.Seek "=", Valeur
MaTable.Delete
6. Navigation
La navigation entre enregistrement peut se résumer en quatre (4) méthodes dont les syntaxes respectives
sont présentées ci-après. Cette opération consiste à parcourir les enregistrements que contient une table.
Syntaxes :
' Aller au premier enregistrement
MaTable.MoveFirst
- 15 -
Chapitre III
Notion SQL
- 16 -
Introduction
SQL (Structured Query Language) est un langage de programmation informatique destiné à stocker, à
manipuler et à retrouver des données enregistrées dans des bases de données relationnelles. Le langage
SQL est apparu pour la première fois en 1974 lorsqu’un groupe d’IBM a mis sur pied le premier
prototype d’une base de données relationnelle. La première base de données relationnelle a été
commercialisée par Relational Software (plus tard Oracle).
SQL a des standards. Toutefois, le SQL qui peut être actuellement utilisé sur la plupart des SGBDR3se
trouve sous différents aspects. Pour deux raisons telles que, premièrement, le standard SQL est assez
complexe, et il n’est pas pratique d’implémenter le standard entier et, deuxièmement, chaque fournisseur
de bases de données a le besoin de différencier ses produits parmi tant d’autres. Dans le présent
didacticiel, ce type de différences sera pris en main au moment opportun.
Ce chapitre dresse la liste des commandes SQL couramment utilisées, et se présente sous les titres
suivants :
- Commandes SQL : Instructions SQL de base pour stocker, retrouver et manipuler des données dans
une base de données relationnelle.
- Manipulation d'enregistrement: Manière dont les instructions SQL sont utilisées pour gérer des
tables au sein de la base de données.
- Commandes SQL Avancé: Commandes de SQL avancé.
La syntaxe de chaque commande SQL sera décrite et expliquée en premier lieu, puis illustrée par un
exemple.
3
SGBDR : Système de gestion de base de données relationnelle
- 17 -
Partie I
Les commandes SQL
Select........................................................................................................................................................... 19
Distinct ........................................................................................................................................................ 19
Where .......................................................................................................................................................... 20
And-Or ........................................................................................................................................................ 20
In ................................................................................................................................................................. 21
Between ...................................................................................................................................................... 21
Like ............................................................................................................................................................. 22
Order by ...................................................................................................................................................... 22
Les fonctions usuelles (Avg, count, max, min, sum).................................................................................. 23
Groupe by ................................................................................................................................................... 24
Having......................................................................................................................................................... 25
Alias ............................................................................................................................................................ 25
Les jointures internes .................................................................................................................................. 26
Les Jointures externes ................................................................................................................................. 27
Fonction de concaténation .......................................................................................................................... 27
Sous-chaîne ................................................................................................................................................. 28
Trim ............................................................................................................................................................ 28
- 18 -
SELECT
Une utilisation courante des commandes SQL consiste à sélectionner les données de tables contenues
dans une base de données. Nous venons tout juste de mentionner deux mots-clés : il faut
SÉLECTIONNER (SELECT) des informations PROVENANT (FROM) d’une table4. Nous avons ainsi
la structure SQL la plus basique :
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table"
Exemple :
Supposons que nous avons la table suivante :
Table Store_Information
store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999
Note :
Cette table sera utilisée comme exemple tout au long du cours.
L’instruction suivante permet de sélectionner tous les magasins dans cette table :
Il est à remarquer que cette syntaxe nous donne la possibilité de sélectionner plusieurs champs et de
tables.
Exemple :
Supposons que nous voulions sélectionner les deux premiers champs de la table. On écrira alors :
Pour sélectionner tous les champs de la table, on utilise le caractère « * » au lieu des noms de ces champs.
Dans notre cas, par exemple, on écrit :
DISTINCT
Le mot-clé SELECT permet d’extraire toutes les informations d’un champ (ou de plusieurs champs)
d’une table. Les résultats retournés comporteront, dans certains cas, des redondances5.
4
Notez qu’une table est un conteneur qui réside dans la base de données où sont stockées les données. Pour en savoir plus sur
la manipulation d’une table, voir Partie II Manipulation de table
5
Dans notre cas, la valeur « Los Angeles »
- 19 -
Nous devons alors compléter cette clause pour ne sélectionner que des éléments DISTINCT-s.
Syntaxe :
SELECT DISTINCT "Nom_Champ" FROM "Nom_Table"
Exemple :
Pour sélectionner tous les différents magasins dans la table Store_Information, il faut saisir :
WHERE
Il est ainsi possible de sélectionner conditionnellement les données d’une table. Par exemple, en utilisant
le mot-clé WHERE, il est possible de retrouver uniquement des magasins dont les ventes sont
supérieures à 1000 €. La syntaxe est comme suit :
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table" FROM "Condition"
Exemple :
Pour sélectionner tous les magasins dont les ventes sont supérieures à 1000 € dans la table
Store_Information, il faut saisir :
AND - OR
Dans la section précédente, nous avons vu que le mot-clé WHERE peut s’utiliser pour sélectionner
conditionnellement des données d’une table. Cette condition peut être une condition simple (comme celle
de la section précédente), ou combinée. Les conditions combinées se constituent de plusieurs conditions
simples connectées par AND ou OR. Une seule instruction SQL peut contenir un nombre illimité de
conditions simples.
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table" WHERE "ConditionSimple1"{(AND|OR)
ConditionSimple2"}+6
Notez que AND et OR peuvent être utilisés de manière interchangeable. En outre, nous devons utiliser les
parenthèses ( ) pour indiquer l’ordre de la condition.
Exemple :
Pour sélectionner tous les magasins dont les ventes sont supérieures à 1000 € ou inférieures à 500 €, mais
supérieures à 275 € dans la Table Store_Information, il faut saisir :
6
{}+ signifie que l’expression entre parenthèses pourra apparaître une ou plusieurs fois.
- 20 -
SELECT store_name FROM Store_Information WHERE Sales > 1000 OR (Sales < 500 AND Sales >
275)
Ce qui nous donne, comme résultat :
store_name
Los Angeles
San Francisco
IN
Deux utilisations du mot-clé IN sont possibles dans SQL, et cette section décrit celle qui est relative à la
clause WHERE. Utilisé dans ce contexte, ce mot clé nous permet de connaître exactement la valeur des
valeurs retournées que nous souhaitons voir au moins pour l’un des champs.
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table" WHERE "Nom_Champ"
IN(′Valeur1′,′Valeur2′,…)
Il est possible de saisir une ou plusieurs valeurs entre parenthèses, tout en veillant bien de les séparer par
une virgule. Les valeurs peuvent être saisies en chiffres ou en lettres. S’il n’y a qu’une valeur entre
parenthèses, cette commande sera équivalente à
Exemple :
Pour sélectionner tous les enregistrements des magasins de Los Angeles et de San Diego dans la Table
Store_Information, il faut saisir :
Ce qui donne:
store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
BETWEEN
Alors que le mot-clé IN aide les utilisateurs à limiter le critère de sélection à une ou plusieurs valeurs
distinctes, le mot-clé BETWEEN permet de sélectionner un intervalle.
Syntaxe :
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table" WHERE "Nom_Champ" BETWEEN ′Valeur1′
AND ′Valeur2′
Cette instruction sélectionnera toutes les lignes dont les colonnes ont une valeur comprise entre 'valeur1'
et 'valeur2'.
Exemple :
Pour visualiser toutes les informations de vente comprises entre le 6 janvier 1999 et le 10 janvier 1999
dans la Table Store_Information, il faut saisir :
7
Le format de la date peut différer selon la base de données utilisée.
- 21 -
Le résultat obtenu après l’exécution de cette commande sera :
store_name Sales Date
San Diego 250 € 07-Jan-1999
San Francisco 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999
LIKE
LIKE est un autre mot-clé utilisé dans la clause WHERE. LIKE permet d’effectuer une recherche basée
plutôt sur un modèle qu’une spécification exacte de ce qui est souhaité (comme dans IN) ou une
définition d’un intervalle (comme dans BETWEEN).
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table" WHERE "Nom_Champ" LIKE {Modèle}
Exemple :
Pour rechercher tous les magasins dont le nom contient 'AN', il faut saisir :
ORDER BY
Jusqu’à présent, nous avons vu comment extraire des données d’une table à l’aide des commandes
SELECT et WHERE. Il convient souvent de lister les résultats dans un ordre particulier. Le classement
peut se faire dans un ordre ascendant ou descendant, ou peut être établi par des valeurs saisies en chiffres
ou en lettres. Dans de tels cas, il est possible d’utiliser le mot-clé ORDER BY pour atteindre notre
objectif.
Syntaxe :
SELECT "Nom_Champ" FROM "Nom_Table" [WHERE "condition"] ORDER BY
″Nom_Champ″ [ASC|DESC]
Les crochets signifient que l’instruction WHERE est optionnelle. Toutefois, si une clause WHERE est
déjà présente, elle se trouvera devant la clause ORDER BY. La clause ASC ou DESC provoque
respectivement un tri des résultats dans un ordre ascendant ou descendant. En cas d’omission de l’une
d’elles, la clause ASC est implicitement appelée, provoquant donc un tri en ordre ascendant par défaut.
Il est possible d’ordonner par plusieurs colonnes. Dans ce cas, la clause ORDER BY ci-dessus devient :
- 22 -
ORDER BY ″Nom_Champ1″ [ASC|DESC], ″Nom_Champ2″ [ASC|DESC],
Supposons que nous avons choisi l’ordre ascendant pour les deux colonnes, la colonne de sortie sera
classée dans un ordre ascendant selon la colonne 1. S’il y a une liaison pour la valeur de la colonne 1, le
tri se fera dans un ordre ascendant selon la colonne 2.
Exemple :
Pour trier les contenus de la Table Store_Information par montant en dollar, dans un ordre descendant il
faut saisir :
Résultat obtenu :
store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
Boston 700 € 08-Jan-1999
San Francisco 300 € 08-Jan-1999
San Diego 250 € 07-Jan-1999
En plus du nom de colonne, il est également possible d’utiliser une position de colonne (basée sur la
requête SQL) pour indiquer la colonne à laquelle nous souhaitons appliquer la clause ORDER BY. La
première colonne est 1, la seconde 2, et ainsi de suite. Dans l’exemple précédent, il serait possible
d’obtenir les mêmes résultats en utilisant la commande suivante :
Exemple :
Pour obtenir la somme de toutes les ventes à partir de la table Store_Information il faut saisir :
On aura alors:
SUM(Sales)
2750 €
2 750 € représente la somme de toutes les entrées Sales : 1500 € + 250 € + 300 € + 700 €.
En plus d’utiliser des fonctions, avec SQL nous pouvons aussi effectuer de simples tâches telles que
l’addition (+) et la soustraction (-). Pour les données à type de caractères, plusieurs fonctions de chaînes
- 23 -
sont disponibles, telles que les fonctions de concaténation, de Trim et de sous-chaîne. Chaque fournisseur
SGBDR dispose de sa propre implémentation de fonctions de chaîne. Il est donc recommandé de
consulter les références du fournisseur SGBDR pour en savoir plus sur l’utilisation de ces fonctions.
Une autre fonction arithmétique est COUNT. Cette fonction permet de compter le nombre
d’enregistrements inclus dans une table.
Exemple :
Pour rechercher le nombre d’entrées d’un magasin dans notre table, il faut saisir :
Les clauses COUNT et DISTINCT peuvent être utilisées ensemble dans une instruction pour obtenir le
nombre d’entrées distinctes d’une table. Pour déterminer, par exemple, le nombre des différents
magasins, il faut saisir :
Ce qui donnera :
Count(DISTINCT store_name)
3
GROUP BY
Nous passons maintenant aux fonctions d’agrégation. Nous avons déjà utilisé le mot-clé SUM pour
calculer les ventes totales de tous les magasins. La question qui se pose maintenant est de savoir comment
calculer les ventes totales pour chaque magasin. Pour cela, il existe deux manières : tout d’abord, il est
nécessaire de s’assurer d’avoir sélectionné le nom du magasin, ainsi que les ventes totales. Ensuite, tous
les chiffres d’affaires doivent être groupés par (GROUP BY) magasin.
Syntaxe :
SELECT ″Nom_Champ_1″ , SUM (″Nom_Champ_2″) FROM "Nom_Table" GROUP BY
"Nom_Champ_1"
Exemple : Pour retrouver les ventes totales de chaque magasin, il faut saisir :
Le mot-clé GROUP BY s’utilise lorsque divers champs d’une ou de plusieurs tables sont sélectionnées et
qu’au moins, un opérateur arithmétique apparaît dans l’instruction SELECT. Nous devons, le cas
- 24 -
échéant, regrouper (GROUP BY) tous les autres champs sélectionnés, c’est-à-dire, tous les champs sauf
ceux utilisés par l’opérateur arithmétique.
HAVING
Une autre chose que les utilisateurs souhaiteraient faire, c’est de limiter la sortie basée sur la somme
correspondante (ou sur toute autre fonction d’agrégation). Par exemple, pour visualiser uniquement les
magasins dont les ventes sont supérieures à 1 500 €, il faut utiliser la clause HAVING, réservée pour les
fonctions d’agrégation, à la place de la clause WHERE dans l’instruction SQL. Généralement, la clause
HAVING est placée en fin d’instruction SQL, et cette dernière peut ou non inclure la clause GROUP
BY.
Syntaxe :
SELECT ″Nom_Champ_1″ , SUM (″Nom_Champ_2″) FROM "Nom_Table" GROUP BY
"Nom_Champ_1" HAVING (condition|Fonction)8
ALIAS
Deux types d’alias sont fréquemment utilisés : alias de champ et alias de table.
En résumé, les alias de champ concourent à améliorer la lisibilité d’une requête. Dans l’exemple
précédent, les ventes totales sont listées comme SUM(sales). Cette procédure est facile à comprendre,
mais pensons à des cas où l’en-tête de champs est plus compliqué (surtout s’il provoque plusieurs
opérations arithmétiques).
L’utilisation d’un alias de champ permet de rendre le résultat beaucoup plus lisible.
Le second type d’alias est l’alias de table. Cet alias s’obtient en plaçant directement un alias après le nom
de table dans la clause FROM. Les alias sont très utiles lorsque l’on souhaite obtenir des informations de
deux tables séparées (le terme technique est « perform joins »). L’avantage d’utiliser un alias de table au
moment d’exécuter des commandes de jointure est manifeste.
Syntaxe :
SELECT ″table alias ″.″Nom_Champ_1″ ″Nom_Champ_alias″ FROM "Nom_Table" ″table
alias″
Ici, les deux types d’alias sont directement placés après les éléments qu’ils représentent, séparés par un
espace blanc.
Exemple : Il s’agit du même exemple que celui de la section GROUP BY de SQL, sauf que nous avons
défini l’alias de champs et l’alias de table :
8
la clause GROUP BY est optionnelle.
- 25 -
Résultat :
Store Total Sales
Los Angeles 1800 €
San Diego 250 €
Boston 700 €
A noter cette différence dans le résultat (les titres de champs ont changé) est le résultat obtenu à l’aide de
l’alias de champ. A noter également qu’au lieu d’un en-tête complexe comme « Sum(Sales) », nous avons
maintenant « Total Sales », qui est beaucoup plus compréhensible. L’avantage d’utiliser un alias de table
n’est pas clair dans cet exemple. Toutefois, l’utilité des alias sera beaucoup plus évidente lors que l’on
parle de jointure.
Supposons que nous souhaitons connaître les ventes par région. La table Geography comprend des
informations sur des régions et magasins, et la table Store_Information contient des données relatives
aux ventes de chaque magasin. Afin d’obtenir les informations sur les ventes par région, il faut combiner
les informations de ces deux tables. En les examinant, nous constatons qu’elles sont mises en relation par
le champ commun « store_name ». Voici l’instruction SQL permettant d’effectuer cette opération :
Résultat :
REGION SALES
East 700 €
West 2050 €
Les deux premières lignes (SELECT et FROM) permettent à SQL de sélectionner deux champs : le
premier est le champ « region_name » de la table Geography (dont l’alias est REGION), et le second est
la somme du champ « Sales » de la table Store_Information (dont l’alias est SALES). Notez comment les
alias de tables sont utilisés ici : A1 est l’alias de Geography et A2 de Store_Information. Sans l’alias, la
première ligne deviendrait :
ce qui n’est pas très concis. Par essence, les alias de table sont destinés à faciliter la compréhension des
instructions SQL, surtout en présence de plusieurs tables.
Note :
La syntaxe pour exécuter une jointure externe sous SQL dépend de la base de données utilisée. Par
exemple, dans Oracle, il faut placer un « (+) » dans la clause WHERE de l’autre côté de la table dans
laquelle nous souhaitons inclure tous les enregistrements.
Exemple :
Supposons que nous avons les deux tables précédentes et que nous souhaitons trouver le montant des
ventes de tous les magasins. Dans le cas d’une jointure régulière, il n’est pas possible d’obtenir le critère
de recherche souhaité étant donné que « New York » n’apparaît pas dans la table Store_Information. Par
conséquent, il est nécessaire d’exécuter une jointure externe sur les deux tables. La commande est alors la
suivante :
Remarque :
A défaut d’une correspondance dans la deuxième table, la valeur NULL sera retournée. Dans ce cas,
comme « New York » n’apparaît pas dans la table Store_Information, son champ « SALES »
correspondant contient une valeur NULL.
Fonction de concaténation
Il est parfois nécessaire de combiner ensemble (concaténer) les résultats de plusieurs champs différents.
Chaque base de données a sa propre méthode de concaténation:
- MySQL: CONCAT( )
- Oracle: CONCAT( ), ||
- SQL Server : +
Syntaxe :
CONCAT(str1,str2,str3,…)
La fonction CONCAT( ) d’Oracle ne permet que deux arguments : cette fonction ne permet de concaténer
ensemble que deux chaînes à la fois. En utilisant '||', il est toutefois possible de concaténer plus de deux
chaînes à la fois dans Oracle.
Exemples : de la table Geography
9
Notez que dans ce cas de figure, c’est la syntaxe Oracle qui est utilisée pour la jointure externe.
- 27 -
a. MySQL/Oracle:
SELECT CONCAT(region_name,store_name) FROM Geography WHERE store_name = 'Boston';
b. Oracle :
SELECT region_name || ' ' || store_name FROM Geography WHERE store_name = 'Boston';
c. SQL Server :
SELECT region_name + ' ' + store_name FROM Geography WHERE store_name = 'Boston';
Résultat :
'EastBoston'
Sous-chaîne (Substring)
La fonction de sous-chaîne sous SQL est utilisée pour extraire une partie des données stockées. Le nom
de cette fonction diffère selon la base de données utilisée:
- MySQL: SUBSTR( ), SUBSTRING( )
- Oracle: SUBSTR( )
- SQL Server: SUBSTRING( )
Les utilisations les plus fréquentes sont comme suit (SUBSTR( ) sera ici utilisé):
Syntaxe (Pour SUBSTR( )):
1. SUBSTR(str,pos) : sélectionne tous les caractères de en commençant par position
2. SUBSTR(str,pos,len): en commençant par le caractère dans la chaîne , sélectionne
les caractères suivants
Exemples : De la table Geography
TRIM
La fonction TRIM sous SQL permet de supprimer des préfixes ou suffixes spécifiques d’une chaîne de
caractères. Les modèles fréquemment supprimés sont les espaces blancs. Le nom de cette fonction diffère
selon la base de données utilisée :
- MySQL: TRIM( ), RTRIM( ), LTRIM( )
- Oracle: RTRIM( ), LTRIM( )
- SQL Server: RTRIM( ), LTRIM( )
Syntaxe :
TRIM([[Location] [remstr] FROM ] str)
Note :
[Location] peut être LEADING, TRAILING ou BOTH.
D’après cette syntaxe, la fonction TRIM efface le modèle [remstr] à partir du début [Leading] ou de la fin
[Trailing] de la chaîne de caractères, ou des deux [Both]. Si [remstr] n’est pas spécifié, les espaces blancs
seront effacés.
- 28 -
Exemples :
SELECT TRIM(' Sample ');
Résultat :
'Sample'
- 29 -
Partie II
Manipulation d'enregistrements
- 30 -
INSERT INTO
Dans les sections précédentes, nous avons appris comment retrouver des informations dans les tables.
Maintenant, nous allons voir comment ajouter des lignes de données (enregistrements) dans ces tables en
première position. Ce thème et l’instruction INSERT seront décrits dans cette section, tandis que
l’instruction UPDATE sera décrite dans la section suivante.
Sous SQL, il existe deux manières de base pour INSÉRER des données dans une table : l’une consiste à
insérer des données une ligne à la fois, et l’autre plusieurs à la fois.
Syntaxe:
INSERT INTO ″Nom_Table″ (″Champ1″,″champ2 ″,…) VALUES (″Valeur1″,″Valeur2 ″,…)
Exemple :
Pour insérer un enregistrement supplémentaire dans la table Store_Information, enregistrement
représentant les données de ventes pour Los Angeles le 10 janvier 1999, dont les ventes de ce magasin, à
ce jour, s’élevaient à 900 €, il faudra utiliser le script SQL suivant :
INSERT INTO Store_Information (store_name, Sales, Date) VALUES ('Los Angeles', 900, '10-Jan-
1999')
Le deuxième type de la commande INSERT INTO permet d’ajouter plusieurs enregistrements à une
table. Contrairement à l’exemple précédent, où nous avons inséré un seul enregistrement en spécifiant ses
valeurs pour tous les champs, nous devons maintenant utiliser une instruction SELECT pour spécifier les
données à ajouter à la table. Nous sommes donc en train d’insérer dans une table des données provenant
d’une autre table.
Syntaxe:
INSERT INTO ″Table1″ (″Champ1″,″champ2 ″,…) SELECT ″Champ1″,″champ2 ″,… FROM
″Table1″
Note :
C’est la méthode la plus simple. L’instruction entière peut facilement contenir les clauses WHERE,
GROUP BY, et HAVING, ainsi que les jointures et alias de table.
Exemple :
Pour avoir une table Store_Information, regroupant les données de ventes de l’année 1998, et que nous
savons d’avance que les données d’origine sont contenues dans la table Sales_Information, il faut saisir :
INSERT INTO Store_Information (store_name, Sales, Date) SELECT store_name, Sales, Date FROM
Sales_Information WHERE Year(Date) = 199810
UPDATE
Nous pouvons, parfois, être amenés à modifier les données contenues dans une table. Pour ce faire, il
convient d’utiliser la commande UPDATE.
Syntaxe:
UPDATE ″Nom_Table″ SET ″Champ1″=[New_Value] WHERE {Condition}
10
C’est la syntaxe SQL Server qui a été utilisée ici pour extraire les informations annuelles périmées. Chaque base de données
relationnelle a sa propre syntaxe. Par exemple, sous Oracle, on utilisera to_char(date,'yyyy')=1998.
- 31 -
Exemple :
Dans le cas d’une table Store_Information, supposons que nous nous rendons compte que les ventes pour
Los Angeles du 08-Jan-1999 sont en réalité de 500 € au lieu de 300 €, et que cette entrée particulière doit
être corrigée. Pour ce faire, nous utiliserons la requête SQL suivante :
UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date =
"08-Jan-1999"
Dans ce cas, il n’y a qu’un enregistrement qui satisfait la condition de la clause WHERE. Tous les
enregistrements qui satisfont la condition seront modifiés.
Syntaxe:
UPDATE ″Nom_Table″ SET ″Champ1″=[New_Value1], ″Champ2″=[New_Value2] WHERE
{Cond}
DELETE FROM
Pour supprimer des enregistrements d’une table, il est possible d’utiliser la commande DELETE FROM.
Syntaxe:
DELETE FROM ″Nom_Table″ WHERE {Condition}
Exemple :
Supposons que nous décidons de ne conserver aucune information de Los Angeles dans la table
Store_Information. Pour ce faire, nous saisissons la requête SQL suivante :
- 32 -
Partie III
Les commandes SQL avancées
En premier lieu, nous allons voir les mots-clés et les concepts SQL suivants :
UNION ....................................................................................................................................................... 34
UNION ALL ............................................................................................................................................... 34
INTERSECT ............................................................................................................................................... 35
MINUS ....................................................................................................................................................... 35
SOUS-REQUETE....................................................................................................................................... 36
EXISTS ....................................................................................................................................................... 36
CASE .......................................................................................................................................................... 37
En outre, nous examinerons comment SQL peut être utilisé pour réaliser certaines des opérations des plus
complexes :
RANG ......................................................................................................................................................... 38
MEDIANE .................................................................................................................................................. 38
EXECUTION TOTALE ............................................................................................................................. 39
POURCENTAGE DU TOTAL ................................................................................................................. 39
POURCENTAGE DU TOTAL CUMULATIF ......................................................................................... 40
- 33 -
UNION
L’objectif de la commande UNION de SQL est de combiner ensemble les résultats de deux requêtes. La
commande UNION est un peu similaire à Jointure du fait qu’elles sont utilisées pour mettre en liaison des
informations provenant de plusieurs tables. Une restriction de UNION est que tous les champs
correspondants doivent inclure le même type de données. Aussi, lors de l’utilisation de UNION, seules
les valeurs distinctes sont sélectionnées (similaire à SELECT DISTINCT).
Syntaxe:
[Instructions_SQL_1] UNION [Instructions_SQL_2]
Exemple :
Supposons que nous avons les deux tables suivantes :
Pour retrouver toutes les dates où il y a des ventes, il faudra utiliser l’instruction SQL suivante :
Résultat :
Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999
Notez qu’en saisissant « SELECT DISTINCT Date» pour les deux instructions SQL, nous obtiendrons
le même jeu de résultats.
UNION ALL
L’objectif de la commande UNION ALL de SQL est aussi de combiner ensemble les résultats de deux
requêtes. La différence entre UNION ALL et UNION est la suivante : UNION sélectionne seulement
des valeurs distinctes alors que UNION ALL sélectionne toutes les valeurs.
Syntaxe:
[Instructions_SQL_1] UNION ALL [Instructions_SQL_2]
Exemple :
Pour retrouver toutes les dates où il y a des ventes au magasin et aussi sur Internet (Selon les informations
des deux tables précédentes), il faudra utiliser l’instruction SQL suivante :
SELECT Date FROM Store_Information UNION ALL SELECT Date FROM Internet_Sales
- 34 -
Résultat :
Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
08-Jan-1999
07-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999
INTERSECT
À l’instar de la commande UNION, INTERSECT opère aussi sur deux instructions SQL. La différence
entre les deux commandes est la suivante : UNION agit essentiellement comme un opérateur OR (OU :
la valeur est sélectionnée si elle apparaît dans la première ou la deuxième instruction), la commande
INTERSECT agit comme un opérateur AND (ET : la valeur est sélectionnée seulement si elle apparaît
dans les deux instructions).
Syntaxe:
[Instructions_SQL_1] INTERSECT [Instructions_SQL_2]
Exemple :
Pour retrouver toutes les dates où il y a les deux types de ventes (Tables précédentes) : au magasin et sur
Internet, il faudra utiliser l’instruction SQL suivante :
Résultat :
Date
07-Jan-1999
Note :
La commande INTERSECT ne retournera que des valeurs distinctes.
MINUS
MINUS opère sur deux instructions SQL. Elle prend tous les résultats de la première instruction SQL,
puis soustrait ceux de la deuxième instruction SQL pour obtenir la réponse finale. Si la deuxième
instruction SQL comprend des résultats qui ne sont pas inclus dans la première instruction SQL, ils seront
ignorés.
Syntaxe:
[Instructions_SQL_1] MINUS [Instructions_SQL_2]
Exemple :
Toujours en utilisant les deux tables précédentes, pour trouver toutes les dates où il y a des ventes au
magasin, mais pas sur Internet, il faudra utiliser l’instruction SQL suivante :
Résultat :
Date
05-Jan-1999
08-Jan-1999
- 35 -
"05-Jan-1999", "07-Jan-1999",et "08-Jan-1999" sont les valeurs distinctes retournées à partir de
"SELECT Date FROM Store_Information." "07-Jan-1999" est également retourné à partir de la
deuxième instruction SQL, "SELECT Date FROM Internet_Sales", il sera donc exclu du jeu de
résultats final.
Note :
La commande MINUS ne retournera que des valeurs distinctes.
Certaines bases de données peuvent utiliser EXCEPT au lieu de MINUS. Pour une utilisation correcte,
consulter la documentation de la base de données.
SOUS-REQUETE
Il est possible d’imbriquer une instruction SQL dans une autre. Lorsque cette opération est effectuée sur
les instructions WHERE ou HAVING, nous obtenons une construction de sous-requête.
Syntaxe:
SELECT ″Nom_Champ_1″ FROM ″Nom_Table_1″ WHERE ″Nom_Champ_2″ [Opérateur]
(SELECT ″Nom_Champ_3″ FROM ″Nom_Table_2″ WHERE [Condition])
[Opérateur] peut être un opérateur d’égalité tel que . Il peut être aussi un opérateur de
texte tel que "LIKE".
La deuxième partie (la partie entre parenthèse) de la syntaxe est considérée comme "requête interne",
alors que la première partie est considérée comme "requête externe".
Résultat :
SUM(Sales)
2050
Dans cet exemple, au lieu de joindre directement les deux tables et d’ajouter seulement le montant des
ventes des magasins de la région West (Ouest), nous allons d’abord utiliser la sous-requête pour trouver
les magasins situés dans la région West (Ouest), puis additionner le montant des ventes de ces magasins.
Dans l’exemple ci-dessus, la requête interne est d’abord exécutée, puis le résultat est envoyé à la requête
externe. Ce type de sous-requête est appelé sous-requête simple. Si la requête interne dépend de la
requête externe, nous aurons une sous-requête corrélée. Voici un exemple de sous-requête corrélée :
Noter la clause WHERE dans la requête interne, où la condition nécessite une table de la requête externe.
EXISTS
Dans la section précédente, nous avons utilisé IN pour mettre en liaison la requête interne et la requête
externe dans une instruction de sous-requête. L’utilisation de IN n’est pas la seule manière de procéder ;
- 36 -
il est aussi possible d’utiliser plusieurs opérateurs tels que . EXISTS est un opérateur spécial
que nous verrons dans cette section.
EXISTS teste simplement si la requête interne retourne un enregistrement. Si elle le fait, la requête
externe peut s’exécuter. Sinon, la requête externe ne s’exécutera pas, et l’instruction SQL entière ne
retournera aucun résultat.
Syntaxe:
SELECT ″Nom_Champ_1″ FROM ″Nom_Table_1″ WHERE EXISTS (SELECT * FROM
″Nom_Table_2″ WHERE [Condition])
Note :
Au lieu de l’étoile , nous pouvons sélectionner une ou plusieurs colonnes dans la requête interne. L’effet
sera identique.
A première vue, cette opération peut paraître un peu confuse, car la sous-requête inclut la condition
[region_name = 'West']. La requête n’a pas encore ajouté les magasins pour toutes les régions. Par une
analyse plus approfondie, nous parvenons à la condition suivante : puisque la sous-requête retourne plus
de 0 enregistrement, la condition EXISTS est vraie, et la condition placée au sein de la requête interne
n’affecte pas le mode d’exécution de la requête externe.
CASE
CASE permet de fournir le type de logique si-alors-autre à SQL.
Syntaxe:
SELECT CASE (″Nom_Champ″) WHEN ″Condition1″ THEN ″Resultat1″ WHEN ″Condition2″
THEN ″Resultat2″… [ELSE ″ResultatN″] END FROM ″Nom_Table″
"condition" peut être une valeur ou une expression statique. La clause ELSE est optionnelle.
Résultat :
store_name Nouvelles Ventes Date
Los Angeles 3000 € 05-Jan-1999
San Diego 375 € 07-Jan-1999
San Francisco 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999
- 37 -
RANG
Afficher le rang associé à chaque ligne est une requête courante, mais cette procédure est plus délicate
sous SQL. Pour afficher le rang sous SQL, il est nécessaire d’effectuer une jointure réflexive, de lister les
résultats dans l’ordre, et de compter le nombre d’enregistrements énumérés (y compris) devant
l’enregistrement de votre choix. Utilisons un exemple pour illustrer. Supposons que nous avons la table
suivante
Table Total_Sales
Name Sales
John 10
Jennifer 15
Stella 20
Sophia 40
Greg 50
Jeff 20
Concentrons-nous sur la clause WHERE. La première partie de la clause, (a1.Sales a2.Sales), nous
permet de ne pas compter le nombre d’occurrences où la valeur du champ Sales est inférieure ou égale à
elle-même. Si ce champ ne contient pas de doublons, cette partie de la clause WHERE serait en elle-
même suffisante pour générer le rang correct.
La deuxième partie de la clause, (a1.Sales a2.Sales and a1.Name a2.Name), garantit qu’en présence
de doublons dans le champ Sales, chaque valeur obtiendrait le rang correct.
MEDIANE
Pour calculer la médiane, nous devons procéder de la manière suivante :
- Classifier les enregistrements dans l’ordre et trouver le rang de chaque enregistrement.
- Déterminer ce qu’est le rang du "milieu". Par exemple, s’il y a 9 enregistrements, ce rang serait 5.
- Obtenir la valeur pour l’enregistrement situé au milieu.
Exemple : Table Total_Sales
La commande suivante :
SELECT Sales Median FROM (SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank FROM
Total_Sales a1, Total_Sales a2 WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <=
a2.Name) group by a1.Name, a1.Sales order by a1.Sales desc) a3 WHERE Rank = (SELECT
(COUNT(*)+1) DIV 2 FROM Total_Sales);
- 38 -
Donne le résultat suivant :
Median
20
La détermination du rang des enregistrements 2-6 a été effectuée de la même manière. L’enregistrement 7
trouve le rang du "milieu". DIV permet de trouver le quotient sous MySQL, et il est possible que cette
méthode diffère selon la base de données utilisée. Finalement, l’enregistrement 1 obtient la valeur pour
l’enregistrement au milieu.
EXECUTION TOTALE
L’affichage d’exécution totale est une requête commune, mais cette procédure est plus délicate sous SQL.
Exécution totale sera affichée sous SQL de la même façon que le rang : on effectue d’abord une jointure
réflexive, puis, on liste les résultats dans l’ordre. Alors que la recherche du rang requiert un comptage du
nombre d’enregistrements listés (y compris) devant l’enregistrement souhaité, trouver exécution totale
requiert l’addition des valeurs pour les enregistrements listés devant (y compris) l’enregistrement de notre
choix.
Donne :
Name Sales Running_Total
Greg 50 50
Sophia 40 90
Stella 20 110
Jeff 20 130
Jennifer 15 145
John 10 155
La combinaison de la clause WHERE et de clause ORDER BY permet d’assurer que les exécution totale
appropriées soient tabulées lorsqu’il y a des doublons.
POURCENTAGE DU TOTAL
Pour afficher le pourcentage du total sous SQL, il est nécessaire de se reporter aux concepts que nous
avons utilisés pour le rang/cumul, en plus de la sous-requête. À la différence de ce que nous avons vu
dans la section Sous-requête de SQL, nous allons utiliser ici la sous-requête en tant que partie de
SELECT.
- 39 -
Donne, comme résultat :
Name Sales Pct_To_Total
Greg 50 0.3226
Sophia 40 0.2581
Stella 20 0.1290
Jeff 20 0.1290
Jennifer 15 0.0968
John 10 0.0645
La sous-requête "SELECT SUM(Sales) FROM Total_Sales" calcule la somme. Nous pouvons alors
diviser les valeurs individuelles par cette somme pour obtenir le pourcentage du total de chaque ligne.
La sous-requête "SELECT SUM(Sales) FROM Total_Sales" calcule la somme. Il est alors possible de
diviser le cumul, "SUM(a2.Sales)", par cette somme pour obtenir le pourcentage du total cumulatif pour
chaque ligne.
- 40 -