Le langage SQL (Structured Query Language) SQL (Structured Query Language, en français « langage structuré de requête ou d’interrogation » ou « langage de requête structurée »…) est un langage informatique normalisé servant à créer et à exploiter des bases de données relationnelles. I- Les SGBDR Pour implanter sur un support informatique un ensemble de données structurées selon le modèle relationnel (en d’autres termes, pour créer une base de données relationnelles), il faut un logiciel spécifique : un système de gestion de bases de données relationnelles ou SGBDR. Un SGBDR permet de créer des tables, d’établir des liens entre ces tables et d’exploiter la base de données (mettre à jour, rechercher, sélectionner, trier, transformer… les informations de la base de données). Exemple de SGBDR : Oracle Database et MySQL de Oracle, DB2 de IBM, SQL server et Access de Microsoft…. La mise en œuvre d’un SGBDR s’effectue grâce sur un langage particulier qui sert d’interface entre l’homme et le langage machine : le langage SQL. II- Les instructions (ou requêtes) SQL Le langage SQL se présente sous la forme d’instructions (ou requêtes) constituées de mots clés (écrits en anglais) indiquant une action (un ordre) que le SGBDR doit effectuer sur la base de données. Les instructions (ordres, commandes) sont classées en trois catégories : - Les instructions qui permettent de créer et de modifier la structure de la base de données (langage de définition de données – LDD). Exemples : CREATE (pour créer une table, un utilisateur ou un index), ALTER (pour modifier), DROP (pour supprimer). - Les instructions qui permettent de contrôler l’accès des utilisateurs aux données (langage de contrôle de données – LCD). Exemples : GRANT (pour autoriser des opérations à certains utilisateurs), DENY (pour interdire), REVOKE (pour supprimer une autorisation). - Les instructions qui permettent d’interroger et de modifier (ajouter, supprimer) les données de la base de données (langage de manipulation de données – LMD). Exemples : SELECT (pour rechercher des données), UPDATE (pour modifier des données), INSERT INTO (pour ajouter des données), DELETE FROM (pour supprimer des données). (Référentiel BTS CG : « Seul le LMD est attendu en SQL ») 1/6 III- La structure d’une requête SQL (LMD) A) L’instruction SELECT La commande SELECT permet de sélectionner (de lire) des données issues de la base de données. La syntaxe élémentaire (minimale) de l’instruction SELECT est la suivante : SELECT FROM WHERE suivi de la liste des champs (ou attributs, ou colonnes) à afficher (séparés par une virgule) suivi de la liste des tables (ou relations, ou tableaux) utilisées (séparés par une virgule) suivi d’une condition que doivent respecter les enregistrements (ou n-uplets ou lignes) pour être sélectionnés (suivie d’un point-virgule indiquant la fin de la requête) Remarques : - Les mots clés FROM et WHERE qui suivent l’instruction SELECT sont des clauses (comme les clauses d’un contrat qui précisent les modalités de son exécution). - En algèbre relationnel (langage de manipulation des relations), SELECT correspond à une projection (réduction du nombre d’attributs d’une relation) et WHERE correspond à une restriction ou « sélection » (réduction du nombre de n-uplets d’une relation). Exemple : Modèle relationnel de la facturation des clients de l’entreprise DELTA CLIENT (N°_Client, NomClient, RueClient, CPClient, VilleClient) FACTURE (N°_Facture, DateFacture, DateRèglement, #N°_Client) ARTICLE (Réf_Article, DésignationArticle, PrixArticle) COMMANDER (#N°_Facture, #Réf_Article, QuantitéCommandée) Requête 1 : On veut obtenir la liste des clients (nom et CP) qui habitent à Paris. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Le résultat de la requête est une table, comme la table CLIENT, mais avec seulement deux colonnes (NomClient et CPClient) et uniquement les lignes correspondant aux clients habitant à Paris. Remarque : Les valeurs des champs de type texte sont écrites entre guillemets simples (en revanche, pour les champs de type numérique, il suffit d’écrire le nombre). 2/6 Si on veut obtenir tous les champs de la table CLIENT on utilise le caractère « * » (étoile) : .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Requête 2 : On veut afficher la liste des articles (désignation et prix) dont le prix est supérieur à 100 € avec un classement par ordre décroissant des prix. Pour effectuer un classement il faut utiliser la clause (ou commande) : ORDER BY suivi du champ à classer et de l’instruction ASC ou DESC (on n’est pas obligé d’utiliser « ASC » car par défaut les résultats sont toujours classés par ordre ascendant). .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Requête 3 : On veut connaître le nom et l’adresse du client de la facture n° F425 du 18/12/15. La requête nécessite d’effectuer une jointure i.e. d’associer les lignes de deux tables (CLIENT et FACTURE) grâce à l’égalité des valeurs du champ commun aux deux tables (N°_Client). La jointure en SQL peut être réalisée à l’aide de la clause WHERE (d’autres solutions plus complexes existent…). L’opérateur AND (après WHERE) permet d’ajouter des conditions (restrictions). .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Requête 4 : On veut obtenir le nombre total de factures établies par client pour l’année 2015. Pour compter le nombre de valeurs (ou lignes) d’un champ, il faut utiliser la fonction (ou agrégat) statistique COUNT. Pour effectuer un regroupement sur les valeurs communes d’un champ (NomClient), la fonction COUNT doit être précédée de ce champ et suivie de la clause GROUP BY (pour éviter d’afficher plusieurs fois les mêmes lignes : par exemple s’il y a 5 factures pour un client, on obtiendrait 5 lignes identiques, avec un total de 5, si on n’utilise pas GROUP BY). La clause (ou commande) AS permet de renommer un champ. L’opérateur BETWEEN … AND … (après WHERE suivi d’un champ) permet de sélectionner les lignes dont les valeurs d’un champ sont comprises dans un intervalle. 3/6 .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Requête 5 : On veut connaître le total des quantités commandées par article pour l’année 2015. Pour calculer la somme des valeurs d’un champ, il faut utiliser la fonction (ou agrégat) SUM. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Autre solution, sans la désignation de l’article : .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Requête 6 : On veut afficher la liste des articles (la référence uniquement) pour lesquels le total des quantités commandées pour l’année 2015 est inférieur à 10 Il s’agit de la même requête que la précédente mais avec une restriction supplémentaire sur la fonction SUM. La clause HAVING permet d’ajouter une condition que doivent respecter les résultats des fonctions statistiques (COUNT, SUM, …) pour être affichés. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Remarque : Les clauses possibles d’une instruction SELECT doivent être utilisées dans l’ordre suivant : SELECT FROM WHERE GROUP BY HAVING ORDER BY 4/6 B) L’instruction UPDATE L’instruction UPDATE permet de mettre à jour (modifier) des enregistrements existants. La syntaxe de la commande UPDATE est généralement la suivante : UPDATE SET WHERE suivi de la table qu’il faut mettre à jour suivi des nouvelles valeurs pour les champs concernés (séparés par une virgule) suivi d’une condition que doivent respecter les enregistrements (ou lignes) pour être mis à jour (suivie d’un point-virgule indiquant la fin de la requête) Sans la clause WHERE, la même nouvelle valeur sera attribuée à toutes les lignes de la table Exemple : Requête qui permet de modifier l’adresse du client n° C12 (Dupond) .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. C) L’instruction INSERT INTO La commande INSERT INTO permet d’ajouter (d’insérer) un ou plusieurs enregistrements dans une table. La syntaxe est la suivante : INSERT INTO VALUES suivi de la table dans laquelle il faut insérer des enregistrements et des champs qu’il faut renseigner (entre des parenthèses et séparés par une virgule) suivi des valeurs pour les champs concernés (entre des parenthèses et séparés par une virgule) (suivies d’un point-virgule indiquant la fin de la requête) Si tous les champs d’une table doivent être renseignés, il n’est pas nécessaire d’indiquer les champs après le nom de la table (mais après VALUES il faut indiquer toutes les valeurs en respectant l’ordre des colonnes). En revanche, si on ne renseigne que certains champs, il faut les indiquer avant VALUES. Il est également possible d’insérer plusieurs lignes en une seule requête en indiquant les valeurs de chaque ligne après VALUES (les groupes de valeurs entre des parenthèses étant séparés par des virgules). 5/6 Exemples : Requête 1 : Requête qui permet d’ajouter un nouvel article .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Ou, plus simplement : .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Requête 2 : Requête qui permet d’ajouter deux nouveaux articles .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. D) L’instruction DELETE FROM La commande DELETE FROM permet de supprimer un ou plusieurs enregistrements dans une table. La syntaxe est la suivante : DELETE FROM WHERE suivi de la table pour laquelle il faut supprimer des enregistrements (ou lignes) suivi d’une condition que doivent respecter les enregistrements pour être supprimés (suivie d’un point-virgule indiquant la fin de la requête) Sans la clause WHERE, tous les enregistrements de la table seront supprimés ! Exemple : Requête permettant de supprimer l’article A45 .............................................................................................................................................................................................................................. .............................................................................................................................................................................................................................. Cf. Cas Medic-Air ; Cas LBA ; Cas Socofrois ; Cas Elizaldia ; Cas Oplast ; Cas Mecanix ; Cas Odysée 6/6