Le langage SQL-DML

Le langage SQL-DML (pour Data Manipulation Language) est certainement la partie la plus spectaculaire du langage SQL. Ce sous-langage comporte deux grandes catégories de fonctions: les instructions permettant l'extraction de données et celles rendant possible la modification de données. En SQL, l'extraction de données fait l'objet d'une seule commande, SELECT, qui sera étudiée sous différentes formes dans la première partie de cette section: extraction de données d'une seule table, puis extraction de données de plusieurs tables et finalement extraction de données groupées. Dans un deuxième temps, nous nous pencherons sur les commandes permettant la modification du contenu d'une base de données : parallèlement à la clause INSERT qui permet d'ajouter des données dans une table, nous étudierons les clauses DELETE et UPDATE permettant de supprimer, respectivement mettre à jour, les enregistrements d'une table.

Extraction de données dans une table

L'instruction SELECT permet d'extraire des données d'un ensemble de tables et de les présenter sous la forme d'une table. D'une manière générale, une requête SELECT comporte trois parties principales se présentant dans l'ordre suivant:

Les deux premières clauses, SELECT et FROM, sont obligatoires: elles permettent d'afficher les valeurs de certaines colonnes des lignes d'une table. La requête suivante permet, par exemple, de récupérer les valeurs des champs Description et PrixUnitaire des enregistrements de la table Produit (un clic sur l'image permet de voir apparaître son résultat):

sql24.jpg

Sélection de la description et du prix unitaire des produits de la librairie

Remarquons que l'exécution d'une requête SQL produit toujours une table résultat. Un astérisque (*) à la place de la liste des colonnes dans la clause SELECT permet d'afficher toutes les colonnes de la table:

sql26.jpg

Sélection de toutes les informations des produits de la librairie

L'extraction d'enregistrements sélectionnées se fait à l'aide de l'ajout d'un critère dans la clause WHERE. La requête suivante permet, par exemple, de connaître le nom de tous les livres de la librairie dont le prix unitaire est inférieur à 50 francs:

sql28.jpg

Sélection du nom des produits dont le prix unitaire est inférieur à 50 francs

La relation d'égalité apparaissant dans la condition de sélection n'est que l'exemple d'un des comparateurs dont dispose SQL et qui sont répertoriés ci-dessous:

sql30.jpg

Opérateurs d'(in)égalité

sql31.jpg

Opérateurs d'inégalités strictes

sql32.jpg

Opérateurs d'inégalités non strictes

L'interprétation de ces relations est évidente pour les valeurs numériques ou temporelles. En ce qui concerne les chaînes de caractères, il s'agit de l'ordre lexicographique. Notons la formulation des principales constantes:

Ainsi, la requête suivante permet de récupérer les identifiants des commandes faites après le 24.08.2011 dans la table Commande:

sql35.jpg

Sélection des commandes passées après le 24.08.2011

Par défaut, le nom de chaque colonne de la table résultant d'une requête SELECT est identique à celui de la colonne correspondante de la table sur laquelle s'applique la sélection. Si ce nom, choisi par le programmeur SQL, n'est pas "parlant", il serait difficile à l'utilisateur final d'interpréter les résultats de la requête. Les alias de colonne, déclarés dans la clause SELECT, permettent d'améliorer la lisibilité d'une table résultat. Ainsi, l'exemple suivant permet de retourner de manière très compréhensible l'adresse du client nommé "Globe Trotteur":

sql37.jpg

Utilisation d'alias de colonne pour améliorer la lisibilité de la table résultant d'une requête SQL

Les alias de colonnes définis dans l'exemple ci-dessus apparaîtront dans l'en-tête des colonnes de la table résultat. Notez que les alias de Adresse et NoPostal sont écrits entre guillemets à cause de la présence de caractères spéciaux entre les mots (virgules, espace, accents).

Expressions et fonctions

Le langage SQL offre une panoplie d'opérateurs arithmétiques et de fonctions prédéfinies permettant de manipuler les valeurs des colonnes de lignes extraites. Des expressions faisant usage de ces fonctions peuvent apparaître dans la clause SELECT et dans la clause WHERE. Citons les plus utilisées:

Caractères de remplacement

Une condition peut porter sur la présence de certains caractères dans une valeur. Il suffit alors d'utiliser un masque décrivant la structure générale des valeurs désignées. Un tel masque peut contenir des caractères de remplacement permettant de définir un critère de recherche. Ces caractères vont alors de pair avec le mot-clé LIKE dans la clause WHERE. Dans un masque, le caractère de remplacement "_" désigne un caractère quelconque et "%" désigne toute suite de caractères, éventuellement vide. Ainsi, la requête suivante permet de produire la liste de tous les clients dont le nom commence par le préfixe "Lib" dans la table Client:

sql47.jpg

Liste des clients dont le nom commence par 'Lib'

De même, la requête suivante produit la liste des clients dont le nom contient la lettre "i" en troisième position, suivie d'une suite quelconque de caractères:

sql49.jpg

Liste des clients dont le nom contient la lettre "i" en troisième position

Opérateurs logiques

Les opérateurs logiques, appelés également opérateurs booléens, permettent de combiner les conditions de sélection ou de recherche:

Dans une clause WHERE contenant plusieurs opérateurs booléens, NOT est évalué en premier, puis AND et finalement OR.

La requête suivante, par exemple, retourne le titre, le type de reliure et le prix unitaire de tous les livres brochés quel que soit leur prix et des livres cartonnés dont le prix est supérieur à 50 francs:

sql51.jpg

Liste de tous les livres brochés à prix quelconque et des livres cartonnés à plus de 50 francs

Dans la table résultat, figurent tous les livres brochés, même s'ils coûtent moins de 50 francs, et seulement les livres cartonnés de plus de 50 francs. Ce résultat montre que le filtrage des livres a bel et bien commencé par évaluer l'opérateur AND en premier en retournant tous les livres cartonnés plus chers que 50 francs, ensuite l'opérateur OR en retournant tous les livres brochés quel que soit leur prix.

La requête suivante, quant à elle, retourne le titre, le type de reliure et le prix unitaire de tous les livres brochés ou cartonnés qui coûtent plus de 50 francs:

sql53.jpg

Liste de tous les livres brochés et des livres cartonnés à plus de 50 francs

Observons le placement des parenthèses après WHERE et avant AND pour forcer la combinaison des conditions imposée par la requête. Le résultat présente cette fois uniquement les livres qui coûtent plus de 50 francs. Il n'existe aucun livre broché dans cette catégorie de prix.

Plages de valeurs

Pour définir une plage (ou intervalle) de valeurs dans une condition de sélection, nous utilisons:

Les requêtes suivantes retournent chacune tous les livres dont le prix unitaire est compris entre 50 francs et 100 francs, bornes comprises:

sql55.jpg sql57.jpg

Liste des livres dont le prix unitaires est compris entre 50 et 100 francs

Valeurs distinctes

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, comme dans l'exemple ci-dessous:

sql111.jpg

Sélection, avec duplication, des villes d'où proviennent les clients de la librairie

Afin d'éliminer les redondances, il est alors nécessaire d'utiliser la clause DISTINCT comme suit:

sql33.jpg

Sélection, sans duplication, des villes d'où proviennent les clients de la librairie

La requête ci-dessus permet ainsi de déterminer le nombre exact de villes distinctes de Suisse dans lesquelles séjournent au moins une librairie cliente de la base de données.

Si la clause SELECT contient une liste de plusieurs colonnes, seules les lignes entièrement identiques seront considérées comme doublons et donc éliminées, sauf une qui apparaîtra dans la table résultat.

Listes de valeurs

L'opérateur de comparaison IN sert à vérifier si la valeur d'un certain attribut est égale à un des éléments d'une liste. Ainsi, pour récupérer tous les clients établis en Suisse Romande, il suffit d'utiliser la requête suivante:

sql58.jpg

Liste des clients romands

La clause WHERE ci-dessus consiste à vérifier si une valeur donnée de Canton est égale à un des éléments de la liste des quatre cantons romands.

A vous de jouer !

Rédigez les requêtes SQL suivantes permettant d'obtenir des informations à partir de la base de données Librairie. Vos solutions devront engendrer les mêmes tables que celles proposées dans le lien "Résultat" situé à la suite de l'énoncé de chaque requête:

  1. La requête retourne le nom et l'adresse du client "Globe Trotteur"
    ( Résultat | Solution)
  2. La requête retourne le nom et l'adresse des clients romands dont le nom commence par une voyelle
    ( Résultat | Solution)
  3. La requête retourne le nombre de clients genevois
    ( Résultat | Solution)
  4. La requête retourne le nombre de produits proposés par le grossiste, la somme du prix de tous les produits ainsi que leur prix unitaire moyen
    ( Résultat | Solution)
  5. La requête retourne le prix unitaire moyen des produits cartonnés
    ( Résultat | Solution)
  6. La requête retourne la description des produits cartonnés dont le prix unitaire est inférieur ou égal à 80 francs
    ( Résultat | Solution)
  7. La requête retourne le nombre de clients ayant passé une commande auprès du fournisseur
    ( Résultat | Solution)
  8. La requête retourne le nombre de titres (livres) différents présents dans la commande 1004
    ( Résultat | Solution)
  9. La requête retourne le numéro de toutes les commandes passées après le 31 août 2011
    ( Résultat | Solution)
  10. La requête retourne le numéro de toutes les commandes datant de plus de 3000 jours à compter d'aujourd'hui
    ( Résultat | Solution)