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.
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):
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:
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:
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:
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:
123, -0.003, 7.12;'Archambault'. La présence du caractère ' dans la chaîne se représente par le caractère d'échappement \' ; par exemple 'L\'art de la guerre'.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:
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":
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).
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:
Produit en tenant compte de 2.4% de TVA et de 6 francs de frais d'envoi:ProduitID) des livres commandés et d'autre part une valeur agrégée égale à 3 correspondant au nombre de livres commandés. Dans certains SGBD, une telle requête engendre un message d'erreur. Dans MySQL, le résultat transmis est tout simplement erroné et ne correspond pas à la requête transmise...NOW(), retourne la date et l'heure actuelles.Date, est le nom de la colonne où est enregistrée la date des commandes effectuées.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:
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:
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:
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:
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.
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:
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:
Afin d'éliminer les redondances, il est alors nécessaire d'utiliser la clause DISTINCT comme suit: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.
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:
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.
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: