Système d'information de Gestion Le langage SQL Table des matières ACCÈS À UNE BASE DE DONNÉES.............................................................................................2 LE LANGAGE SQL................................................................................................................................... 2 INTERROGATION DES DONNÉES.................................................................................................................... 2 Le modèle relationnel utilisé......................................................................................................................................................3 Requêtes de base.....................................................................................................................................................................4 Sélection (Restriction)...............................................................................................................................................................4 La jointure..................................................................................................................................................................................8 Requêtes emboîtées.................................................................................................................................................................9 DESCRIPTION DES DONNÉES..................................................................................................................... 10 DELETE..................................................................................................................................................................................10 INSERT...................................................................................................................................................................................10 UPDATE..................................................................................................................................................................................10 MÉMENTO SQL STANDARD...................................................................................................................... 11 COMMENT RÉALISER UNE REQUÊTE ?...................................................................................................... 12 © Jacques Chambon 1/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Accès à une Base de Données Le gestionnaire est souvent amené dans son travail à confronter des données de sources différentes. Les outils qu'il utilise au quotidien ne lui mettent pas toujours à disposition les informations dont il a besoin. Il lui est parfois nécessaire d'interroger une vue de base de données par l'intermédiaire d'un requêteur. Le schéma ci-dessus montre que l'utilisateur peut accéder aux Données de la Base soit directement en utilisant un applicatif métier ( un logiciel de comptabilité par exemple), soit en utilisant les logiciels bureautiques. Dans ce deuxième cas, il devra réaliser lui même les requêtes, par l'intermédiaire d'un langage au travers d'une interface graphique ( QBE : Query By Example) ou en frappant des requêtes SQL. Le Middleware qui apparaît sur le schéma est un traducteur entre le SQL du SGBD et celui du requêteur. Bien que le langage SQL soit normalisé, des particularismes locaux imposent cette traduction. Le langage SQL Structured Query Language a été conçu dans les années 1970 pour manipuler les bases de Données relationnelles. SQL est un langage NON PROCEDURAL : L'utilisateur se contente de spécifier ce qu'il recherche sans se préoccuper comment y parvenir. Avec un tel langage, c'est au SGBD qu'incombe le choix du chemin d'accès aux données. ▲ L'utilisateur indique LE "QUOI" et pas le "COMMENT". Interrogation des Données Ce sont les ordres les plus utilisés de SQL, ils permettent : • la sélection d'attributs répondant éventuellement à certains critères précisés et appartenant à une ou plusieurs tables; • le tri de données sur la valeur d'un ou plusieurs attributs, selon un ordre croissant ou décroissant; • l'utilisation des fonctions arithmétiques standard telles que +,-, *, /, (, ) et d'un certain nombre de fonctions normalisées (COUNT, AVG, SUM, MIN, MAX). La partie interrogation des données de SQL se résume à une seule instruction, ce qui en fait toute sa puissance mais aussi sa complexité. SELECT liste d'attributs FROM liste des Tables WHERE condition de recherche GROUP BY liste d'attributs spécifiés au niveau du SELECT HAVING condition de regroupement ORDER BY attribut du tri ▲ Toute commande SELECT est une REQUETE qui génère un résultat sous forme de table. © Jacques Chambon 2/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Le modèle relationnel utilisé Vision littéraire BATEAU ( BAT_NO, BAT_NOM, TYP_BAT_CODE, BAT_VOILE ) Clé primaire : BAT_NO Clé étrangère : TYP_BAT_CODE référence TYPE BATEA.TYP_BAT_CODE TYPE BATEAU ( TYP_BAT_CODE, TYP_BAT_LIBELLE, CAT_BAT_NO ) Clé primaire : TYP_BAT_CODE Clé étrangère : CAT_BAT référence CATEGORIE BATEAU.CAT_BAT_NO CATEGORIE BATEAU ( CAT_BAT_NO, CAT_BAT_LIBELLE) ETRE_PROPRIETAIRE (BAT_NUMERO, ADH_CODE) Clé primaire : ADH_CODE , BAT_NUMERO Clé étrangère : ADH_CODE référence ADHERENT Clé étrangère : BAT_NUMERO référence BATEAU Louer (BAT_NO, LOC_DATE_DEBUT, LOC_DATE_FIN, LOC_HEURE_DEBUT, LOC_HEURE_FIN, LOC_PRIX) Clé primaire : BAT_NO, LOC_DATE_DEBUT, LOC_DATE_FIN, LOC_HEURE_DEBUT, LOC_HEURE_FIN Clé étrangère : BAT_NO référence BATEAU. BAT_NO ADHERENT (ADH_CODE, ADH_NOM, ADH_DATENAIS, ADH_COPOST, ADH_DECEDE, ADH_DER_INSCRIPTION, ADH_PARRAIN) Clé primaire : ADH_CODE Clé étrangère : ADH_PARRAIN référence ADHERENT.ADH_CODE. TITRE (TIT_CODE, TIT_LIBELLE, TIT_IMPORTANCE) Clé primaire : TIT_CODE ASSUMER_RESPONSABILITE (ADH_CODE, TIT_CODE, ASS_DATE_DEB_RESP, ASS_DATE_FIN_RESP,ASS_RESPONSABILITE) Clé primaire : ADH_CODE référence ADHERENT.ADH_CODE Clé étrangère : TIT_CODE référence TITRE.TIT_CODE EMPLOYE (EMP_MATRICULE, EMP_NOSS, EMP_NOM, EMP_PRENOM, EMP_SEXE, EMP_DATENAISS, EMP_ADRESSE ; COM_CODE, CEN_NO, EMP_DATE_EMBAUCHE) Clé primaire : EMP_MATRICULE Clé étrangère : COM_CODE référence COMMUNE.COM_CODE Clé étrangère : CEN_NO référence CENTRE;CEN_NO Occuper (EMP_matricule, QUA_code, OCC_date_debut, OCC_date_fin,CEN_NO) Clé primaire : EMP_MATRICULE, OCC_date_debut Clé étrangère : EMP_MATRICULE référence EMPLOYE.EMP_MATRICULE Clé étrangère : OCC_date_debut référence DATE.date QUALIFICATION (QUA_CODE, QUA_LIBELLE, QUA_NIVEAU, QUA_COEF) Clé primaire : QUA_CODE TARIF (TAR_NB_PERS,TAR_VALEUR) Clé primaire : TAR_NBRE Cotiser (COT_SAISON, ADH_CODE_PAYEUR, COT_DATE_REGLEMENT, COT_MONTANT) Clé primaire : COT_ANNEE, ADH_CODE © Jacques Chambon 3/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Vision graphique Cette vision est un peu plus étendue que la vision littéraire. Elle correspond aux relations que vous trouverez dans la Base de Données exemple. Requêtes de base ▲ Une requête est toujours composée d'une clause SELECT et d'une clause FROM et se termine toujours par un point virgule. Syntaxe SELECT [DISTINCT] expr1 [AS nom1], expr2 [AS nom2],… FROM table1 [alias1], table2 [alias2],… Exemple SELECT CATEGORIE_BATEAU.CAT_BAT_LIBELLE AS Libellé FROM CATEGORIE_BATEAU; Affiche la colonne contenant le libellé de la catégorie bateau. Cette colonne s 'intitulera sur la table résultante « Libellé ». L'étoile signifie toutes les colonnes. SELECT ADHERENT.* SELECT * Équivalent à FROM ADHERENT; FROM ADHERENT; Affiche le contenu intégral de la table ADHERENT. Une requête sans clause « WHERE » affiche l'intégralité des lignes de la table d'origine pour les colonnes dont le nom a été précisé. Sélection (Restriction) Pour ne faire apparaître qu'un certain nombre de lignes d'une table, il faut indiquer un critère derrière une clause WHERE. SELECT ADHERENT.ADH_NOM,ADHERENT. ADH_VILLE FROM ADHERENT WHERE ADH_VILLE like 'BORDEAUX'; R1 : Affiche le nom et la ville des adhérents qui habitent la ville de Bordeaux. L’opérateur permettant de tester le contenu d’une chaîne de caractères est LIKE © Jacques Chambon 4/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Le symbole = est réservé aux valeurs numériques ! Sélection avec élimination des doublons. SELECT DISTINCT ADHERENT.ADH_NOM, ADHERENT.ADH_VILLE FROM ADHERENT WHERE ADHERENT.ADH_VILLE like 'BORDEAUX'; R2 : Plusieurs Adhérents habitant Bordeaux ont le même nom. Il s'agit des familles inscrites à l'association., ainsi on aura sur plusieurs lignes le couple CHANFORT, BORDEAUX. Ces « doublons » n'apportent aucune information supplémentaire. On décide donc de les éliminer en utilisant la clause DISTINCT. Lorsque les noms d'attribut ne génèrent aucune ambiguïté, il n'est pas nécessaire de préciser le nom de la table. Dans les requêtes suivantes, nous n'utiliserons le nom « complet d'attribut » (nom table . nom attribut) que lorsque se sera nécessaire, sinon nous n'utiliserons que le nom simplifié Sélection avec opérateur OU SELECT ADH_VILLE, ADH_NOM, ADH_PRENOM, ADH_DATENAIS FROM ADHERENT WHERE ADH_VILLE like 'BORDEAUX' OR ADH_VILLE like 'DAX'; Le nom de l'attribut doit être répété dans l'expression de la condition. R3 : Affiche la ville, le nom, le prénom et la date de naissance des adhérents qui habitent la ville de Bordeaux ou la ville de Dax. Sélection avec opérateur ET SELECT ADH_NOM, ADH_PRENOM, ADH_VILLE, ADH_COMPET FROM ADHERENT WHERE ADH_VILLE like 'BORDEAUX' AND ADH_COMPET= TRUE; R4 : Affiche le nom , le prénom, la ville et l'état de compétition des adhérent habitant Bordeaux et ayant déclarés participer à des compétitions. Les mots TRUE et FALSE sont des mots réservés et compris par SQL. Expression Null SELECT ADH_NOM, ADH_SEXE FROM ADHERENT WHERE ADH_SEXE Is Null; R5 : Une donnée non renseignée dans une Base de Données Relationnelle est considérée comme NULL. La requête précédente affiche le nom et le sexe des adhérents pour lesquels le code du sexe n'a pas été renseigné. Négation SELECT ADH_NOM, ADH_PRENOM, ADH_SEXE FROM ADHERENT WHERE not(ADH_SEXE=1); R6 : Affiche les nom, prénom et sexe des Adhérents dont le sexe est différent de 1. Si la codification est celle de l'INSEE, on affiche les informations des ADHERENTES. Appartenance à un intervalle. SELECT ADH_NOM, ADH_PRENOM, ADH_COPOST FROM ADHERENT WHERE ADH_COPOST Between '40000' And '40999'; R7 : Affiche le nom, le prénom et le Code Postal des Adhérents habitant le département des Landes (Code Postal compris entre 40000 et 40999). Sélection d'occurrences appartenant à un ensemble de valeurs. (R8) SELECT ADH_VILLE, ADH_NOM, ADH_PRENOM FROM ADHERENT WHERE UPPER(ADH_VILLE) in ('BORDEAUX','DAX','ARCACHON'); Dans sa forme élémentaire, IN peut être remplacé par une condition utilisant l'opérateur OR. (R9) © Jacques Chambon 5/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL WHERE ADH_VILLE LIKE 'BORDEAUX' OR ADH_VILLE LIKE 'DAX' OR ADH_VILLE ='ARCACHON'); Lorsqu'on teste le contenu d'un attribut alphanumérique, on ne sait jamais sous quelle forme l'utilisateur a frappé les informations (majuscules ou minuscules). Il est donc raisonnable de convertir le contenu des attributs en majuscules avant d'en tester le contenu : c'est le rôle de la fonction UPPER. Recherche alphanumérique LIKE doit être suivi d'un masque 'chaîne de caractères'. Le séparateur de chaîne de caractères est l'apostrophe. les symboles autorisés sont : % qui signifie "quel que soit le nombre de caractères! _ qui remplace un caractère quelconque. Exemple R10 : Affiche les nom et prénom des Adhérents dont le nom commence par la lettre L majuscule. SELECT ADH_NOM, ADH_PRENOM FROM ADHERENT WHERE ADH_NOM Like 'L%'; R11 :Affiche le prénom des Adhérents dont la troisième lettre du nom est un E minuscule. (attention la casse est importante : SQL distingue « e » et « E ») SELECT ADHERENT, ADH_PRENOM FROM ADHERENT WHERE ADH_NOM Like '__E%'; Tri des résultats d'une requête (R12) SELECT DISTINCT ADH_NOM, ADH_VILLE FROM ADHERENT WHERE ADH_VILLE LIKE 'BORDEAUX' ORDER BY ADH_NOM; Affiche la liste des noms des adhérents et de leur ville respective, triée par ordre alphabétique Croissant des noms d'adhérent. Le mot clé « ASC » est facultatif. L'ordre de tri par défaut est l'ordre ascendant. SELECT DISTINCT ADH_NOM, ADH_VILLE FROM ADHERENT WHERE ADH_VILLE LIKE 'BORDEAUX' ORDER BY ADH_NOM DESC; R13 : Affiche la liste des noms des adhérents et de leur ville respective, triée par ordre alphabétique Décroissant des noms d'adhérent. Il est tout à fait possible de faire des tris sur plusieurs attributs en mélangeant l'ordre Exemple ORDER BY ADH_NOM, ADH_PRENOM, ADH_VILLE DESC ; Sélection d'attributs calculés Les attributs calculés peuvent apparaître derrière un SELECT ou dans une condition de base derrière un WHERE. Exemple R14 : Affichage du tarif en vigueur en fonction du nombre d'adhérents, de la redevance à verser aux activités sportives (15% de la valeur du tarif)et d'une augmentation éventuelle de 10%. SELECT TAR_NB_PERS, TAR_VALEUR, TAR_VALEUR/1.85 AS Redevance, TAR_VALEUR*1.1 AS Augmentation FROM TARIF_COTISER; © Jacques Chambon 6/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Exemple R15 : Liste des Dirigeants qui ont quitté leur fonction depuis plus d'un demi siècle. SELECT ADH_CODE, ASS_DATE_FIN_RESP FROM Assumer_Responsabilite WHERE ASS_DATE_FIN_RESP < Year(current_date)-50; Il existe des fonctions de gestion des dates dont la syntaxe dépend du SGBD utilisé. La fonction CURRENT_DATE qui donne la date du jour, est normalisée et peut être utilisée avec tous les SGBDR. Gestion des Dates R16 : Liste des noms prénoms et age des Adhérents. SELECT ADH_NOM, ADH_PRENOM, YEAR(CURRENT_DATE)YEAR(ADH_DATENAIS) AS Age FROM ADHERENT; On calcule l'âge en faisant la différence entre l'année en cours (Year(CURRENT_DATE)) et l'année de la date de naissance (Year(ADH_DATE_NAIS)) Sélection en utilisant les fonctions intégrées Fonction COUNT Dénombre les lignes d'une table SUM Somme les valeurs des occurrences d'un attribut AVG Moyenne des valeurs d'un attribut MIN Valeur minimum de la liste des valeurs d'un attribut MAX Valeur maximum de la liste des valeurs d'un attribut R17 : Nombre de lignes de la table ADHERENT SELECT COUNT(*) FROM ADHERENT; La Fonction COUNT (*) permet de compter toutes les lignes, mais cette fonction peut s'appliquer sur un attribut particulier. Exemple SELECT COUNT(ADH_NOM) R18 : Montant des cotisations récupérées pour l'année courante SELECT SUM(Cotiser.COT_MONTANT) AS Paiement FROM Cotiser WHERE (COT_SAISON = Year (CURRENT_DATE); R19 : Calcul de la moyenne de l'age des adhérents SELECT AVG(Year(current_date)-Year(ADH_DATENAIS) )AS Moyenne_age FROM ADHERENT; L'argument utilisé avec SUM et AVG doit être de type numérique. On peut éventuellement faire précéder l'argument du mot clé DISTINCT pour éliminer les valeurs redondantes.. Si DISTINCT n'est pas spécifié, l'argument peut être une expression contenant des opérations. R20 : Age du plus jeune adhérent. SELECT MIN(Year(current_date)-Year(ADH_DATENAIS) )AS "Age Plus jeune" FROM ADHERENT; R21 : Age de l'adhérent le plus agé. SELECT MAX(Year(current_date)-Year(ADH_DATENAIS) )AS "Age plus agé" FROM ADHERENT; Sélection de groupe L'opérateur GROUP BY réarrange la table représentée par la clause FROM WHERE, en un nombre minimum de groupes dont les lignes contiennent une valeur commune, différente pour chacun des groupes. © Jacques Chambon 7/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Exemple R22 : Répartition des Adhérents par Sexe SELECT ADH_SEXE, COUNT(ADH_CODE) AS NB FROM ADHERENT GROUP BY ADH_SEXE; Affiche un liste composée de deux colonnes : la première donne la liste des codes Sexe,la seconde, le nombre d'adhérent du sexe correspondant. R23 : Répartition des Adhérents par Statut vivant ou décédé. SELECT ADH_DECEDE,COUNT(*) AS Nb FROM ADHERENT GROUP BY ADH_DECEDE; Dans l'association, on garde l'historique des adhérents. Lorsqu'un adhérent décède on bascule l'attribut ADH_DECEDE de Faux à Vrai. Lorsqu'une condition doit s'appliquer sur un attribut du SELECT lorsqu'un GROUP By est demandé, elle doit être déclarée derrière une clause HAVING. La clause HAVING est une clause WHERE pour les groupes. La clause HAVING implique la clause GROUP BY Exemple R24 : Nombre de membres Dirigeants depuis 1990 SELECT ASS_DATE_DEB_RESP, Count(ADH_CODE) As Nombre FROM Assumer_Responsabilite GROUP BY ASS_DATE_DEB_RESP HAVING ASS_DATE_DEB_RESP >1990 ORDER BY ASS_DATE_DEB_RESP ; Depuis 1990 les membres du bureaux sont élus pour trois ans. Cette requête doit montrer l'évolution du nombre de membres dirigeants. La jointure La jointure consiste à apparier les occurrences d'une table, dont la valeur de la clé étrangère est égale à la valeur de la clé primaire de l'autre table. Exemple Avec 2 tables R25 : Liste des Noms, prénoms et section dans laquelle sont inscrits les Adhérents. SELECT ADH_NOM, ADH_PRENOM, SEC_LIBELLE FROM SECTION, ADHERENT WHERE ADHERENT.SEC_CODE=SECTION.SEC_CODE ; On remarque que dans l'expression de l'égalité, il faut OBLIGATOIREMENT préciser le nom des tables pour lever l'ambiguïté sur le nom des attributs. R26 : Rapport des locations par bateau SELECT BATEAU.BAT_NOM, SUM(Louer.LOC_PRIX) FROM BATEAU, Louer WHERE BATEAU.BAT_NO = Louer.BAT_NO GROUP BY BATEAU.BAT_NOM; R27 : Liste des bateaux de locations qui ont rapportés moins de 20000 euros. SELECT BATEAU.BAT_NOM, SUM(Louer.LOC_PRIX) FROM BATEAU, Louer WHERE BATEAU.BAT_NO = Louer.BAT_NO GROUP BY BATEAU.BAT_NOM Having SUM(Louer.LOC_PRIX) < 20000; Avec plus de 2 tables R28 : Liste des bateaux, de leur type et de leur catégorie ordonnée par nom. SELECT BATEAU.BAT_NOM, TYPE_BATEAU.TYP_BAT_LIBELLE, CATEGORIE_BATEAU.CAT_BAT_LIBELLE © Jacques Chambon 8/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL FROM CATEGORIE_BATEAU,TYPE_BATEAU,BATEAU WHERE TYPE_BATEAU.TYP_BAT_CODE = BATEAU.TYP_BAT_CODE AND CATEGORIE_BATEAU.CAT_BAT_CODE = TYPE_BATEAU.CAT_BAT_CODE ORDER BY BATEAU.BAT_NOM; Le nombre de jointure est égal au nombre de tables concernées par la requête -1 Requêtes emboîtées En SQL de base, les requêtes ne peuvent pas être enchaînées. Si une requête nécessite de travailler sur les résultats d'une autre requête, il faut les emboîter. De façon pratique, une sous-requête (requête appelée) est une requête SQL (bloc SWF) encapsulée à l'intérieur d'une autre requête (requête appelante). L'opérateur = retourne une seule valeur à la requête « appelante », alors que l'opérateur IN retourne un ensemble de valeurs. Condition d'égalité La sous requête interne ne retourne qu’une seule valeur! Exemple On désire obtenir la liste des Adhérents qui habitent la même ville que celle où habite Georges GUFFLON. Comme on ne sait pas dans quelle ville habite Georges Gufflon, il faut dans un premier temps, trouver cette ville à l'aide de la requête : SELECT ADHERENT.ADH_VILLE FROM ADHERENT WHERE ADHERENT.ADH_NOM like ‘GUFFLON’ AND ADHERENT.ADH_PRENOM like ‘Georges’ Cette requête ne retourne qu'une seule valeur : le nom de la ville demandée (CESSAC). Le résultat de cette requête devient alors une valeur qui peut être utilisée comme condition dans une autre requête. SELECT ADHERENT.ADH_NOM, ADHERENT.ADH_PRENOM, ADHERENT.ADH_ADRESSE, ADHERENT.ADH_VILLE FROM ADHERENT WHERE ADHERENT.ADH_VILLE = (SELECT ADHERENT.ADH_VILLE FROM ADHERENT WHERE ADHERENT.ADH_NOM like “GUFFLON” AND ADHERENT.ADH_PRENOM like”Georges” ); Condition IN La sous requête interne retourne plusieurs valeurs! Exemple On recherche les Code, nom et prénom des adhérents qui ont payés une cotisation. SELECT ADHERENT.ADH_NOM, ADHERENT.ADH_PRENOM FROM ADHERENT WHERE ADHERENT.ADH_CODE In (SELECT Distinct COTISER.ADH_CODE FROM COTISER ); Le système commence par évaluer le bloc interne. SELECT Distinct COTISER.ADH_CODE_PAYEUR FROM COTISER ; © Jacques Chambon 9/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Puis le bloc externe SELECT ADHERENT.ADH_NOM, ADHERENT.ADH_PRENOM FROM ADHERENT WHERE ADHERENT.ADH_CODE In ( requete ) Description des Données DELETE Cette commande permet de supprimer des données contenues dans une table. Syntaxe DELETE [FROM] [table | [WHERE condition] table est le nom de la table contenant les lignes qui seront détruites. WHERE Détruit seulement les lignes satisfaisant la condition. Cette condition peut référencer la table et peut contenir des sous-requêtes. Si cette clause est omise, la commande détruit toutes les lignes de la table. Exemple Supprimer tous les adhérents qui n’ont pas renouvelés leur adhésion depuis trois ans. DELETE FROM ADHERENT WHERE YEAR(CURENT_DATE)-YEAR(ADH_DER_INSCRIPTION) > 3 ; INSERT Cette commande permet d’insérer des valeurs d’occurrence dans une table. Syntaxe INSERT INTO table [(champ1, champ2,…)] VALUES (val1, val2,…) Exemple Insérer les deux nouveaux arrivants Diane DUFRENE et Joe BAR INSERT INTO ADHERENT (ADH_NOM, ADH_PRENOM) VALUES (‘DUFRENE’,’Diane’); INSERT INTO ADHERENT (ADH_NOM, ADH_PRENOM) VALUES (‘BAR’,’Joe’); Il faut autant de commande INSERT que d’occurrences à ajouter. UPDATE Cette commande permet de modifier le contenu de certaines occurrences Syntaxe UPDATE table SET champ1 = expr1, champ2 = expr2,… WHERE prédicat Exemple Une erreur a été commise au moment de la saisie des données concernant Jean DUPONT. Il a été domicilié à bordeaux (33000), alors qu’il habite à Talence (33400). UPDATE ADHERENT SET ADH_COPOST = ‘33400’, ADH_VILLE = ‘TALENCE’ WHERE ADH_NOM =’DUPONT’ and ADH_PRENOM =’Jean’; © Jacques Chambon 10/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Mémento SQL standard Syntaxe générale SELECT… FROM… WHERE… GROUP BY… HAVING… ORDER BY…; PROJECTION SELECT [DISTINCT] expr1 [AS nom1], expr2 [AS nom2],… FROM table1 [alias1], table2 [alias2],… WHERE expr1 = / <> / < / > / <= / >= expr2 WHERE expr1 BETWEEN expr2 AND expr3 WHERE expr1 [NOT] LIKE chaîne1 RESTRICTION WHERE expr1 [NOT] IN (expr2, expr3, …) WHERE expr1 IS [NOT] NULL AND / OR prédicat JOINTURES NATURELLES SELECT expr1, expr2,… FROM table1, table2 WHERE table1.champ1 = table2.champ2 SELECT [expr1], …, SUM (expr2) [AS nom2] SELECT [expr1], …, MAX (expr2) [AS nom2] AGRÉGATS SELECT [expr1], …, MIN (expr2) [AS nom2] SELECT [expr1], …, AVG (expr2) [AS nom2] SELECT [expr1], …, COUNT (*) [AS nom2] GROUP BY expr1, expr2,… REGROUPEMENT HAVING prédicat CLASSEMENT ORDER BY expr1 [ASC / DESC], expr2 [ASC / DESC],… INTERSECTION WHERE table1.champ1 IN (SELECT table1.champ1 …) ; DIFFÉRENCE WHERE table1.champ1 NOT IN (SELECT table1.champ1 …) ; © Jacques Chambon 11/12 09-COURS_SI_SQL Système d'information de Gestion Le langage SQL Comment réaliser une requête ? Soit à réaliser la requête donnant la liste des Adhérents ( nom, prénom, adresse, code postal et ville) propriétaire d'un bateau de type 470. Il analyser la phrase de la requête en repérant : • les données à afficher ( celles qui apparaîtront derrière le mot clé SELECT) ; • Le critère qui sera exprimé dans le WHERE ; • le chemin à parcourir en partant des données du SELECT pour arriver au critère. SELECT ADH_NOM, ADH_PRENOM, ADH_ADRESSE, ADH_COPOST, ADH_VILLE FROM ADHERENT, Etre_Proprietaire, BATEAU, TYPE_BATEAU WHERE TYPE_BATEAU.TYP_BAT_LIBELLE like '470' AND ADHERENT.ADH_CODE = Etre_Proprietaire.ADH_CODE AND Etre_Proprietaire.BAT_NO = BATEAU.BAT_NO AND BATEAU.TYP_BAT_CODE = TYPE_BATEAU.TYP_BAT_CODE ; © Jacques Chambon 12/12 09-COURS_SI_SQL