Chapitres 1 et 2 Langage d`interrogation des données - Partie 1 -
Transcription
Chapitres 1 et 2 Langage d`interrogation des données - Partie 1 -
ALSI BTS Informatique de gestion 1€re ann•e Chapitres 1 et 2 Langage d’interrogation des donn•es - Partie 1 - 1. Introduction................................................................................................................ 2 2. Les bases de donn•es ................................................................................................. 2 2.1. D€finition .............................................................................................................. 2 2.2. Utilit€.................................................................................................................... 3 2.3. SGBD et SGBDR ..................................................................................................... 3 2.4. Les contraintes d’int€grit€ ....................................................................................... 4 3. Le langage SQL ........................................................................................................... 8 4. D•finition du LID......................................................................................................... 9 5. Interrogation simple d’une table .............................................................................. 10 5.1. Projection............................................................................................................ 10 5.2. Restriction de lignes ............................................................................................. 11 5.3. Trier le r€sultat d’une interrogation......................................................................... 17 6. Interrogation de plusieurs tables : les jointures ....................................................... 18 6.1. Equi-jointure........................................................................................................ 19 6.2. Jointure r€flexive ou auto-jointure .......................................................................... 6.3. Jointure externe ................................................................................................... 6.3.1. Jointure externe gauche ........................................................................... 6.3.2. Jointure externe droite ............................................................................. 6.3.3. Jointure externe compl€te......................................................................... 6.4. Jointure multi tables ............................................................................................. 7. 22 26 27 28 28 29 Exercices................................................................................................................... 32 ALSI_IG1_C02 - SQL LID Partie 1 1 ALSI BTS Informatique de gestion 1€re ann•e 1. Introduction Toute organisation a besoin d'informations pour coordonner ses actions en vue d'atteindre ses objectifs. Exemples : - Une biblioth€que maintient une liste de membres, de livres, … - Une soci‚t‚ maintient des informations sur ses salari‚s, ses services... Ces informations sont €labor€es ‚ partir de donn•es qui, pour ƒtre utilisables ais€ment, sont stock•es de faƒon structur•e et ordonn•e. Elles peuvent ƒtre stock€es sur diff€rents types de support et format comme : des fiches papiers, des tableaux €labor€s avec un tableur (tel que Microsoft Excel) ou des bases de donn€es. EMPLOYES SERVICE NumService 10 20 30 40 50 A B C D NomService Recherche Vente Direction Fabrication SAV matricule 26691 17574 26691 Lieu 35155 Rennes 36000 Metz Paris Toulon Metz NomEmploye DUPOND GARDARIN MARTIN DUPONT fonction commercial ing€nieur pr€sident adminsitratif E 1 2 3 4 5 6 7 8 9 Tableau Excel Fiches papier Base de donn•es 2. Les bases de donn•es 2.1. D•finition Le terme de base de donn€es (en anglais „ DB … signifie data base) correspond ‚ une entit• dans laquelle il est possible de stocker des donn•es de faƒon structur•e et avec le moins de redondance possible (c’est-„-dire •viter de retrouver les m…mes valeurs dans diff•rentes tables). Ces donn€es doivent pouvoir ƒtre utilis€es par des programmes, par des utilisateurs diff€rents. Ainsi, la notion de base de donn€es est g€n€ralement coupl€e ‚ celle de r€seau, afin de pouvoir mettre en commun ces informations, d'o† le nom de base. On parle g€n€ralement de syst‡me d'information pour d€signer toute la structure regroupant les moyens mis en place pour pouvoir partager des donn€es. ALSI_IG1_C02 - SQL LID Partie 1 2 ALSI BTS Informatique de gestion 1€re ann•e 2.2. Utilit• L’utilit• d’une base de donn•es est de mettre des donn€es ‚ la disposition d'utilisateurs pour une consultation, une saisie ou bien une mise ‚ jour, tout en s'assurant des droits accord€s ‚ ces derniers. Cela est d'autant plus utile que les donn€es informatiques sont de plus en plus nombreuses. Une base de donn€es peut ƒtre locale, c'est-‚-dire utilisable sur une machine par un utilisateur, ou bien r•partie, c'est-‚-dire que les informations sont stock€es sur des machines distantes et accessibles par r€seau. L'avantage majeur de l'utilisation de bases de donn€es est la possibilit€ de pouvoir ƒtre acc€d€es par plusieurs utilisateurs simultan€ment. 2.3. SGBD et SGBDR Afin de pouvoir contrˆler les donn€es ainsi que les utilisateurs, un syst‡me de gestion est n€cessaire. La gestion de la base de donn€es se fait gr‰ce ‚ un syst‡me appel€ SGBD (syst‡me de gestion de bases de donn€es) ou en anglais DBMS (Data base management system). Le SGBD est un ensemble de services (applications logicielles) permettant de g€rer les bases de donn€es, c'est-‚-dire : permettre l'acc‡s aux donn€es de faŠon simple, autoriser un acc‡s aux informations ‚ de multiples utilisateurs manipuler les donn€es pr€sentes dans la base de donn€es (insertion, suppression, modification). Le SGBD assure la coh•rence et l'acc€s aux informations stock€es dans un mod‡le physique de donn€es particulier : hi€rarchique, r€seau, relationnel, objet... Exemple IDS est un SGBD de type r‚seau qui a ‚t‚ utilis‚ pour la conquƒte spatiale am‚ricaine (programme Apollo). Il existe diff€rents mod‡les de bases de donn€es : les BD hi€rarchiques, les BD r€seaux, les BD objets et les BD relationnelles. Un SGBDR (Syst‡me de Gestion de Base de Donn€es Relationnel) est un SGBD assurant la coh€rence et l'acc‡s aux informations stock€es dans un mod€le physique de donn•es de type relationnel Exemple Paradox, MySQL, Oracle, DB2, Ingres, Informix, Sybase, SQL Server... ALSI_IG1_C02 - SQL LID Partie 1 3 ALSI BTS Informatique de gestion 1€re ann•e 2.4. Les contraintes d’int•grit• Ces contraintes, g•r•es en tant que s•curit• par les SGBDR, d€finissent les r‡gles ‚ respecter sur les donn€es. Ces r‡gles permettent de garantir l'int•grit• et la coh•rence des donn€es. Si l’on tente d’ins€rer des donn€es qui ne respectent pas les contraintes d’int€grit€ d€finies, le SGBDR retourne un message d’erreur et la mise ‚ jour des donn€es est interrompue. On parle alors de violation des contraintes d’int•grit•. Certaines de ces contraintes sont li€es aux r‡gles de gestion du syst‡me d’information repr€sent€. Par exemple, le stock actuel d’un article ne doit pas ƒtre inf€rieur ‚ son stock de s€curit€. Elles seront d€finies dans le SGBDR ‚ l’aide de triggers (vous €tudierez les triggers en 2‡me ann€e). D’autres contraintes sont li€es au mod‡le relationnel : La contrainte de relation ou contrainte d’entit• La contrainte d'entit• pr•cise qu’il n’y a pas de doublon de la cl• primaire, que la cl• primaire est toujours renseign•e et qu’elle ne peut pas changer de valeur au cours du temps Pour chaque tuple d’une relation, la valeur de la cl• primaire doit …tre : La contrainte de domaine La contrainte de domaine permet de restreindre l'ensemble des valeurs que peut prendre un attribut dans une relation : Exemple : pour un album, le m‚dia est „ Audio CD …, „ DVD …, „ K7 … ou „ Vinyle …. Cette contrainte est prise en charge par le SGBD par une contrainte de domaine. Il n’est pas possible d’associer ‡ un album une valeur qui n’appartient pas au domaine de d‚finition. ALSI_IG1_C02 - SQL LID Partie 1 4 ALSI BTS Informatique de gestion 1€re ann•e Les contraintes d’int•grit• r•f•rentielle (ou de cl• •trang€re) La contrainte d'int•grit• r•f•rentielle indique que la valeur d'un attribut d•fini comme cl• •trang€re doit exister comme valeur de cl• primaire d'une autre relation. Une relation peut avoir de aucune ‚ plusieurs cl€s €trang‡res. Exemple : SERVICE (numero, nomService, lieu) numero : cl€ primaire EMPLOYE (matricule, nomEmploye, fonction, dateEmbauche, salaire, numService) matricule : cl€ primaire numService : cl€ €trang‡re en r€f€rence ‚ numero de la relation SERVICE numService dans la relation EMPLOYE fait r‚f‚rence ‡ numero de la relation SERVICE. Cela signifie que la valeur de l’attribut numService de la relation EMPLOYE doit pr‚alablement exister comme valeur de cl‚ primaire d'une ligne de la table SERVICE. Il est n‚cessaire de cr‚er le service avant de cr‚er l’employ‚ rattach‚ ‡ ce service. La contrainte d’int€grit€ r€f€rentielle implique que : A NOTER : Certaines cl•s •trang€res peuvent …tre autoris•es „ admettre des valeurs NULL. Dans ce cas, la contrainte d'int•grit• r•f•rentielle n'est pas v•rifi•e par le SGBDR. ATTENTION, il ne faut pas confondre NULL et cha†ne vide (simple quotes) ! La cha‹ne vide est une cha‹ne ne contenant aucun caract‡re. La valeur NULL indique la pr€sence de donn€es manquantes dans un champ. ALSI_IG1_C02 - SQL LID Partie 1 5 ALSI BTS Informatique de gestion 1€re ann•e Exemple : On pr‚cise que chaque employ€ a un et un seul sup€rieur hi€rarchique parmi les autres employ‚s, sauf pour le dirigeant qui n’en a pas. Cette nouvelle d‚pendance fonctionnelle (la connaissance du matricule d’un salari‚ d‚termine le matricule unique de son sup‚rieur hi‚rarchique) entraˆne la cr‚ation d’une cl‚ ‚trang€re. SERVICE (numero, nomService, lieu) numero : cl€ primaire EMPLOYE (matricule, nomEmploye, fonction, dateEmbauche, salaire, numService, matrSuperieur) matricule : cl€ primaire numService : cl€ €trang‡re en r€f€rence ‚ numero de la relation SERVICE matrSuperieur : cl• •trang€re en r•f•rence „ matricule de la relation EMPLOYE A titre indicatif le mod‡le conceptuel €tait le suivant ALSI_IG1_C02 - SQL LID Partie 1 6 ALSI BTS Informatique de gestion 1€re ann•e Extrait de la table EMPLOYE matricule 26691 15155 16712 17574 ... nom Employe DUPONT GARDARIN MARTIN DUPOND ... fonction Commercial Ing€nieur Pr€sident Adminsitratif ... date Embauche 14/04/1992 07/08/1998 23/05/1990 03/05/1995 ... salaire numService 25 000 24 000 40 000 9 000 ... 20 10 30 30 ... matr Superieur 27047 24533 NULL 16712 ... DUPOND fait partie du service n‰ 30 c'est-‡-dire la Direction MARTIN n’a pas de sup‚rieur hi‚rarchique Extrait de la table SERVICE numero 10 20 30 40 50 nomService Recherche Vente Direction Fabrication SAV lieu Rennes Metz Nancy Toulon Metz Le sup‚rieur hi‚rarchique de DUPOND est le matricule 16712, ‡ savoir MARTIN Cons•quence : il est important, lorsque l'on cr€e une base de donn€es, de bien r€fl€chir si un attribut doit ou non autoriser les valeurs NULL car cela a des cons€quences non n€gligeables. A noter que la cl• primaire d’une relation n’admet pas de valeur nulle : elle doit toujours ƒtre renseign€e. ALSI_IG1_C02 - SQL LID Partie 1 7 ALSI BTS Informatique de gestion 1€re ann•e 3. Le langage SQL Le mod‡le relationnel, invent€ par A.F. Codd (Directeur de recherche du centre IBM de San Jos€) en 1970 a donn€ naissance au langage SQL, normalis€ en 1986 par l’ANSI (institut am€ricain de normalisation) pour donner SQL-86. Depuis, plusieurs versions ont vu le jour : SQL-89, SQL-92 nomm€e SQL2, SQL-99 nomm€e SQL3, puis SQL:2003 et enfin SQL:2008. Le SQL (Structured Query Language : langage de requƒte structur€) est un langage de communication avec les bases de donn€es relationnelles. Il pr€sente plusieurs subdivisions. Subdivision Sigle Langage d’interrogation des donn€es (Data Query Language) LID (DQL) Langage de manipulation des donn€es (Data Manipulation Language) LMD (DML) Modification du contenu de la base de donn€es : ajout, modification et suppression de donn€es Langage de d€finition des donn€es (Data Definition Language) LDD (DDL) Modification de la structure de la base de donn€es : ajout, modification et suppression des tables et de leurs relations (contraintes d’int€grit€ r€f€rentielles) Langage de contrˆle des donn€es (Data Controle Language) LCD Acquisition et r€vocation des privil‡ges d’acc‡s aux donn€es. (DCL) Description Extraction de donn€es r€pondant ‚ un besoin d€fini ‚ l’aide de crit‡res de restriction, d’op€rations et de tris. Il est possible d’inclure des requƒtes SQL dans un programme €crit dans un autre langage (en C# ou en PHP par exemple). ALSI_IG1_C02 - SQL LID Partie 1 8 ALSI BTS Informatique de gestion 1€re ann•e 4. D•finition du LID Le langage d’interrogation des donn€es (LID) permet, comme son nom l’indique, d’interroger une base de donn€es. Il sert ‚ rechercher, extraire, trier, mettre en forme des donn€es et calculer de nouvelles donn€es ‚ partir de donn€es existantes. Dans ce cours, nous utiliserons le mod‡le relationnel suivant. Mod€le relationnel SERVICE(numero, nomService, lieu) numero : cl‚ primaire EMPLOYE (matricule, nomEmploye, fonction, dateEmbauche, salaire, commission, numService, matrSuperieur) matricule: cl‚ primaire numService : cl‚ ‚trang€re en r‚f‚rence ‡ numero de la relation SERVICE matrSuperieur : cl‚ ‚trang€re en r‚f‚rence ‡ matricule de la relation EMPLOYE Mod€le physique Employe Service matricule nomEmploye fonction dateEmbauche salaire commission numService matrSuperieur numService = numero numero numService lieu matrSuperieur = matricule Extraits des tables Extrait de la table Employe Extrait de la table Service ALSI_IG1_C02 - SQL LID Partie 1 9 ALSI BTS Informatique de gestion 1€re ann•e Avec le langage SQL, c’est la commande SELECT qui constitue le langage d’interrogation de la base. Le r€sultat d’une requƒte d’interrogation sur des tables est lui-mƒme une table dont l’existence est temporaire (le temps de la requƒte). 5. Interrogation simple d’une table 5.1. Projection L’instruction SELECT permet de d€terminer les colonnes „ projeter (afficher) ‚ partir de tables pr€cis€es dans la clause FROM. La version la plus simple d’une requƒte d’interrogation est la suivante : SELECT * FROM nom_table * signifie que tous les champs de la table sont projet‚s Il est possible de limiter la projection ‚ certains champs en pr€cisant leur nom apr‡s l’instruction SELECT et en les s€parant par des virgules. SELECT nom_champ1, nom_champ2, … FROM nom_table Exemple 1 : Afficher toutes les informations sur les employ•s de l’entreprise. SELEC T * FROM Employe * se rapporte ‡ tous les champs de la table Employe puisque c’est la seule table sp‚cifi‚e dans la clause FROM Exemple 2 : Quels sont les diff•rents services (nom) de l’entreprise et oˆ sont-ils implant•s ? SELEC T nomService, lieu FROM Service ALSI_IG1_C02 - SQL LID Partie 1 10 ALSI BTS Informatique de gestion 1€re ann•e Par d€faut, l’instruction SELECT est associ€e au mot-cl€ ALL. Ainsi, mƒme s’il n’est pas sp€cifi€, l’ex€cution correspond ‚ SELECT ALL ce qui signifie que tous les enregistrements correspondant ‚ la demande seront affich€s, y compris ceux qui sont identiques. Ainsi les deux requƒtes ci-dessous produisent le mƒme r€sultat : SELECT fonction FROM Employe ou SELECT ALL fonction FROM Employe La clause DISTINCT (‚ sp€cifier puisqu’elle n’est pas ex€cut€e par d€faut), permet de ne projeter que les enregistrements diff€rents. Exemple 3 : Quelles sont les fonctions occup•es dans l’entreprise ? SELEC T DISTIN CT fonction FROM Employe Plusieurs employ‚s pouvant occuper la mƒme fonction, la clause distinct permet de n’afficher qu’une seule fois chaque fonction 5.2. Restriction de lignes La clause WHERE permet de sp€cifier des crit‡res de restriction. Cette clause est suivie d’une condition qui sera €valu€e pour chaque ligne de la table. Seules les lignes pour lesquelles le r€sultat de la condition est VRAI seront projet€es. SELECT * FROM nom_table WHERE condition ALSI_IG1_C02 - SQL LID Partie 1 11 ALSI BTS Informatique de gestion 1€re ann•e Les conditions sont construites ‚ partir : d’expressions constitu€es de noms de champs ou de valeur (de type num€rique, texte ou date) et €ventuellement d’op€rateurs arithm€tiques (+, -, /, *) ou de fonctions pr€d€finies. d’op€rateurs de comparaison : =, >, <, >=, <=, <> ou d’op€rateurs SQL expr BETWEEN val1 AND val2 Renvoie VRAI si la valeur d’expr est comprise entre les valeurs de val1 et val2 incluses expr IN (val1, val2, ...) Renvoie VRAI si la valeur d’expr est €gale ‚ l’une des valeurs de la liste entre parenth‡ses expr LIKE uneChaine Renvoie VRAI si la valeur d’expr est €gale ‚ la valeur de uneChaine qui est une cha‹ne de caract‡res pouvant contenir des caract‡res jokers („ _ … pour un caract‡re quelconque, „ % … pour plusieurs caract‡res quelconques) ATTENTION : toute valeur alphanum•rique ou de type date doit …tre plac•e entre simples quotes (ex : 'hello') Exemple 4 : Quels sont les noms des salari•s qui occupent la fonction de commercial ? On ne souhaite des r€sultats que sur les seuls employ€s dont la fonction est commercial : on effectue une restriction sur les lignes v•rifiant la condition fonction = 'commercial' matricule nom Employe fonction date Embauche salaire comm ission num Service matr Superieur 15155 16712 17574 17899 18444 19654 20000 24533 25381 25382 26691 27047 GARDARIN MARTIN DUPOND BULLE ANABEL ROUX PAPILOU JACOBI AMIN PERNOT DUPONT RAMARA Ing€nieur Pr€sident Administratif Commercial Commercial Chef de service Commercial Chef de service comptable comptable Commercial Chef de service 07/08/1998 23/05/1990 03/05/1995 03/01/2000 16/06/1990 30/05/1990 15/10/2004 30/03/1997 15/10/2006 15/10/2006 14/04/1992 18/08/2001 24000 40000 9000 18000 29000 35000 15000 30000 25000 25000 25000 28000 0 0 0 0 4000 0 2050 0 0 0 2500 0 10 30 30 10 20 20 20 10 30 30 20 20 24533 NULL 16712 24533 27047 16712 27047 16712 17574 17574 27047 16712 On veut seulement le nom de ces employ€s : donc r€alise une projection sur la colonne nomEmploye pour les seules lignes s€lectionn€es matricule 17899 18444 26691 20000 nom Employe fonction BULLE ANABEL DUPONT PAPILOU Commercial Commercial Commercial Commercial date Embauche salaire comm isssion num Service matr Superieur 03/01/2000 16/06/1990 14/04/1992 15/10/2004 18000 29000 25000 15000 0 4000 2500 2050 10 20 20 20 24533 27047 27047 27047 Requƒte permettant d'obtenir les noms des salari€s qui occupent la fonction de commercial : SELEC T nomEmploye FROM Employe WHERE fonction = 'Commercial' ALSI_IG1_C02 - SQL LID Partie 1 12 ALSI BTS Informatique de gestion 1€re ann•e Exemple 5 : Afficher les noms des salari•s embauch•s avant 2000 SELEC T nomEmploye FROM Employe WHERE dateEmbauche < '01/01/2000' matricule nom Employe 15155 16712 17574 17899 18444 19654 20000 24533 25381 25382 26691 27047 GARDARIN MARTIN DUPOND BULLE ANABEL ROUX PAPILOU JACOBI AMIN PERNOT DUPONT RAMARA fonction Ing€nieur Pr€sident Administratif Commercial Commercial Chef de service Commercial Chef de service comptable comptable Commercial Chef de service 2. Projection sur la colonne nomEmploye Le crit€re "avant 2000" est exprim‚ sous forme de date (certains SGBDR peuvent coder les dates au format yyyy/mm/jj). Un crit€re de restriction de type date est plac‚ entre quotes (apostrophes). date Embauche salaire Comm ission num Service matr Superieur 07/08/1998 23/05/1990 03/05/1995 03/01/2000 16/06/1990 30/05/1990 15/10/2004 30/03/1997 15/10/2006 15/10/2006 14/04/1992 18/08/2001 24000 40000 9000 18000 29000 35000 15000 30000 25000 25000 25000 28000 0 0 0 0 4000 0 2050 0 0 0 2500 0 10 30 30 10 20 20 20 10 30 30 20 20 24533 NULL 16712 24533 27047 16712 27047 16712 17574 17574 27047 16712 1. Restriction sur la date d'embauche La restriction peut porter sur un champ calcul• (r€sultat d'une op€ration sur des champs) Exemple 6 : Afficher les noms des salari•s dont la r•mun•ration annuelle brute (salaire et commission) d•passe 30 000 € matricule 15155 16712 17574 17899 18444 19654 20000 24533 25381 25382 26691 27047 Nom Employe GARDARIN MARTIN DUPOND BULLE ANABEL ROUX PAPILOU JACOBI AMIN PERNOT DUPONT RAMARA Fonction Ing€nieur Pr€sident Administratif Commercial Commercial Chef service Commercial Chef service comptable comptable Commercial Chef service Date Embauche salaire comm ission num Service matr Superieur champ calcul• 07/08/1998 23/05/1990 03/05/1995 03/01/2000 16/06/1990 30/05/1990 15/10/2004 30/03/1997 15/10/2006 15/10/2006 14/04/1992 18/08/2001 24000 40000 9000 18000 29000 35000 15000 30000 25000 25000 25000 28000 0 0 0 0 4000 0 2050 0 0 0 2500 0 10 30 30 10 20 20 20 10 30 30 20 20 24533 NULL 16712 24533 27047 16712 27047 16712 17574 17574 27047 16712 24000 40000 9000 18000 33000 35000 17050 30000 25000 25000 27500 28000 Pour chaque ligne de la table, le SGBDR d€termine le champ calcul€ puis teste la condition. La projection sur les colonnes choisies est ensuite r€alis€e. SELEC T nomEmploye FROM Employe WHERE salaire + commission > 30000 ALSI_IG1_C02 - SQL LID Partie 1 13 ALSI BTS Informatique de gestion 1€re ann•e Exemple 7 : Afficher les noms des salari•s embauch•s en 2004 SELEC T nomEmploye FROM Employe WHERE dateEmbauche BETWEEN ' 01/01/2004' AND '31/12/2004' Ou bien SELEC T nomEmploye FROM Employe WHERE YEAR(dateEmbauche) = 2004 La fonction pr‚d‚finie YEAR extrait l'ann‚e d'une date Notez que la fonction YEAR utilis‚e ici est une fonction propre au SGBDR Microsoft SQL Server. Chaque SGBDR propose une biblioth€que de fonctions. Lors de l'‚tude de cas, si l'on ne vous propose pas explicitement une fonction dans l'‚nonc‚ il est recommand‚ d'utiliser la premi€re syntaxe. Exemple 8 : Afficher les noms des salari•s dont la commission repr•sente plus de la moiti• du salaire SELEC T nomEmploye FROM Employe WHERE commission > salaire/2 Exemple 9 : Afficher les noms et fonctions des salari•s qui sont soit commercial, soit ing•nieur SELEC T nomEmploye, fonction FROM Employe WHERE fonction IN ('commercial', 'ing•nieur') Exemple 10 : Afficher les noms des salari•s dont le nom commence par M SELEC T nomEmploye FROM Employe WHERE nomEmploye LIKE 'M%' Exemple 11 : Afficher les noms des salari•s dont le nom se termine par T SELEC T nomEmploye FROM Employe WHERE nomEmploye LIKE '%T' Exemple 12 : Afficher les noms des salari•s dont le nom contient LA SELEC T nomEmploye FROM Employe WHERE nomEmploye LIKE '%LA%' ALSI_IG1_C02 - SQL LID Partie 1 14 ALSI BTS Informatique de gestion 1€re ann•e Exemple 13 : Afficher les noms des salari•s et leur r•mun•ration brute annuelle SELECT nomEmploye, salaire+commission FROM Employe Le r€sultat de cette requƒte n'est pas tr‡s explicite pour celui qui visualise les r€sultats. Il est possible de renommer le nom d'une colonne du r€sultat d'une requƒte en d€finissant un alias ‚ l'aide de la clause AS (des guillemets sont n€cessaires si l'alias comporte des espaces). SELEC T nomEmploye, salaire+commission AS "R•mun•ration brute" FROM Employe Exercice 1 ALSI_IG1_C02 - SQL LID Partie 1 15 ALSI BTS Informatique de gestion 1€re ann•e Par opposition aux conditions simples illustr€es pr€c€demment, il existe des conditions compos€es, form€es de plusieurs conditions simples combin€es gr‰ce aux op€rateurs logiques : AND (et), OR (l'un ou l'autre ou les deux), XOR (ou exclusif : l'un ou l'autre mais pas les deux). L'op€rateur NOT plac€ devant une condition en inverse le sens. L'op€rateur AND est prioritaire par rapport „ l'op•rateur OR. Des parenth‡ses peuvent ƒtre utilis€es pour imposer une priorit€ dans l'€valuation de la condition, ou simplement pour rendre l'expression plus claire. Exemple 14 : Afficher les noms des salari€s du service 30 ayant un salaire annuel d'au moins 25 000 €. SELEC T nomEmploye FROM Employe WHERE numServEmploye=30 AND salaire > 25000 Exemple 15 : Afficher les noms des salari€s qui sont commercial ou ing€nieur, et travaillant dans le service 20. SELEC T nomEmploye FROM Employe WHERE fonction IN ('commercial', 'ing•nieur') AND numServEmploye=20 Rappel : une valeur NULL est une valeur non renseign€e (ind€finie) pour un champ o† cela est autoris€. Attention, la valeur NULL est diff€rente de la valeur z€ro ou d'une chaine vide ('') qui sont des valeurs d€finies. L'op€rateur IS NULL permet de tester la valeur NULL. expr IS NULL renvoie VRAI si l'expression expr est vide. expr = NULL provoque une erreur de syntaxe Exemple 16 : Afficher les noms des salari•s qui n'ont pas de sup•rieur hi•rarchique. SELEC T nomEmploye FROM Employe WHERE MatrSuperieur IS NULL Exemple 17 : Afficher les noms des salari•s qui ont un sup•rieur hi•rarchique. SELEC T nomEmploye FROM Employe WHERE MatrSuperieur IS NOT NULL Exercice 2 ALSI_IG1_C02 - SQL LID Partie 1 16 ALSI BTS Informatique de gestion 1€re ann•e 5.3. Trier le r•sultat d’une interrogation Les enregistrements projet€s ‚ l'aide de l'instruction SELECT ne sont pas tri€s par d€faut. On peut sp€cifier jusqu'‚ 16 crit‡res de tris gr‰ce ‚ la clause ORDER BY plac€e apr‡s la clause WHERE. SELECT * FROM nom_table [WHERE condition] ORDER BY nom_champ1 [DESC], nom_champ2 [DESC], ... L'ordre des tris a lieu selon l'ordre des champs (ou des alias) sp€cifi€ dans la clause ORDER BY ou selon leur num€ro d'ordre dans la clause SELECT. Il est possible de sp€cifier un tri sur un champ non projet€ (absent de la clause SELECT). Pour chaque crit‡re de tri sp€cifi€, le tri peut ƒtre ascendant (ASC par d€faut) ou descendant (DESC ‚ sp€cifier). Si le tri porte sur un attribut contenant des valeurs NULL, ces valeurs sont toujours en t…te quel que soit l'ordre du classement (ascendant ou descendant). Exemple 18 : Afficher la liste des salari•s (nom, fonction, salaire), class•e par fonction, et pour chaque fonction, par salaire d•croissant. SELECT nomEmploye, fonction, salaire FROM Employe ORDER BY fonction, salaire DESC DESC ne s'applique qu'‡ salaire. fonction est ASC par d‚faut. Dans la clause ORDER BY on peut €galement utiliser le num€ro d'ordre du champ dans la liste SELECT ou l'alias Exemple 19 : Afficher la liste des salari•s (nom et r•mun•ration annuelle brute), tri•e par r•mun•ration d•croissante. SELECT nomEmploye, salaire+commission as R€mun€ration FROM Employe ORDER BY 2 DESC Le champ calcul‚ salaire+commission est le 2‚me de la liste des champs pr‚cis‚s dans le SELECT ou encore SELECT nomEmploye, salaire+commission as R€mun€ration FROM Employe ORDSC On utilise cette fois-ci l'alias pour d‚finir le crit€re de tri. Exercice 3 ALSI_IG1_C02 - SQL LID Partie 1 17 ALSI BTS Informatique de gestion 1€re ann•e 6. Interrogation de plusieurs tables : les jointures La jointure est une op€ration qui permet de combiner des informations venant de plusieurs tables. Il est possible de joindre jusqu'‚ 256 tables. Une jointure est obligatoire d‡s lors que plusieurs tables sont pr€sentes dans la clause FROM, c'est-‚-dire lorsque les projections, restrictions et/ou crit‡res de tris concernent les donn€es issues de plusieurs tables. Attention, en l'absence de jointure, le r€sultat renvoy€ par la requƒte correspond au produit cart•sien des enregistrements des deux tables (chaque enregistrement de la premi‡re table est associ€ ‚ tous les enregistrements de la seconde table). En effet, d‡s lors que le SGBDR rencontre plusieurs tables dans une requƒte, il r€alise un produit cart€sien. Exemple : On lance la requƒte suivante : SELECT nomEmploye, numService, SERVICE.* FROM EMPLOYE, SERVICE Cette requƒte va retourner toutes les combinaisons possibles : chaque service sera associ€ ‚ l’ensemble des employ€s. Lorsque plusieurs tables sont utilis€es, il est obligatoire de pr•fixer par le nom de la table : - les champs pour lesquels une ambigŠit• existe (deux champs portant le mƒme nom dans deux tables diff€rentes) - le caract€re * pour pr€ciser quelle table doit voir tous ses champs projet€s ALSI_IG1_C02 - SQL LID Partie 1 18 ALSI BTS Informatique de gestion 1€re ann•e 6.1. Equi-jointure Une €qui-jointure rapproche deux tables gr‰ce ‚ deux champs ayant un mƒme sens. Il s’agit g€n€ralement de lier la cl€ primaire d’une table avec la cl€ €trang‡re qui y fait r€f€rence dans l’autre table. On parle alors de jointure naturelle. La condition de jointure s'exprime ‚ l'aide de la clause WHERE (il s'agit bien d'une restriction) Exemple 20 : Afficher le nom des salari•s avec leur lieu de travail A chaque enregistrement de la table Employe on associe l’enregistrement de la table service v‚rifiant : numService=numServEmploye SELEC T nomEmploye, lieu FROM Employe, Service WHERE numService=numero Comment fonctionne le SGBDR pour r€pondre ‚ cette requƒte ? Il r€alise tout d'abord le produit cart•sien des deux tables (il associe chaque ligne de la table EMPLOYE avec chaque ligne de la table SERVICE) table EMPLOYE nom Employe 15155 GARDARIN Ing€nieur 07/08/1998 24000 0 10 24533 10 Recherche Rennes 16712 MARTIN Pr€sident 23/05/1990 40000 0 30 NULL 10 Recherche Rennes 17574 DUPOND Administratif 03/05/1995 9000 0 30 16712 10 Recherche Rennes 17899 BULLE Commercial 03/01/2000 18000 0 10 24533 10 Recherche Rennes 18444 ANABEL Commercial 16/06/1990 29000 4000 20 27047 10 Recherche Rennes 19654 ROUX Chef de service 30/05/1990 35000 0 20 16712 10 Recherche Rennes 20000 PAPILOU Commercial 15/10/2004 15000 2050 20 27047 10 Recherche Rennes 24533 JACOBI Chef de service 30/03/1997 30000 0 10 16712 10 Recherche Rennes 25381 AMIN comptable 15/10/2006 25000 0 30 17574 10 Recherche Rennes 25382 PERNOT comptable 15/10/2006 25000 0 30 17574 10 Recherche Rennes 26691 DUPONT Commercial 14/04/1992 25000 2500 20 27047 10 Recherche Rennes 27047 RAMARA Chef de service 18/08/2001 28000 0 20 16712 10 Recherche Rennes 15155 GARDARIN Ing€nieur 07/08/1998 24000 0 10 24533 20 Vente Metz 16712 MARTIN Pr€sident 23/05/1990 40000 0 30 NULL 20 Vente Metz 17574 DUPOND Administratif 03/05/1995 9000 0 30 16712 20 Vente Metz 17899 BULLE Commercial 03/01/2000 18000 0 10 24533 20 Vente Metz 18444 ANABEL Commercial 16/06/1990 29000 4000 20 27047 20 Vente Metz 17574 DUPOND Administratif 03/05/1995 9000 0 30 16712 50 SAV Metz 17899 BULLE Commercial 03/01/2000 18000 0 10 24533 50 SAV Metz 18444 ANABEL Commercial 16/06/1990 29000 4000 20 27047 50 SAV Metz 19654 ROUX Chef de service 30/05/1990 35000 0 20 16712 50 SAV Metz 20000 PAPILOU Commercial 15/10/2004 15000 2050 20 27047 50 SAV Metz 24533 JACOBI Chef de service 30/03/1997 30000 0 10 16712 50 SAV Metz 25381 AMIN comptable 15/10/2006 25000 0 30 17574 50 SAV Metz 25382 PERNOT comptable 15/10/2006 25000 0 30 17574 50 SAV Metz 26691 DUPONT Commercial 14/04/1992 25000 2500 20 27047 50 SAV Metz 27047 RAMARA Chef de service 18/08/2001 28000 0 20 16712 50 SAV Metz fonction date Embauche table SERVICE matri cule ALSI_IG1_C02 - SQL LID Partie 1 comm num matr salaire ission Service Superieur num ero nomService lieu 19 ALSI BTS Informatique de gestion 1€re ann•e Ensuite il applique la condition de jointure (la restriction) : seules les lignes v€rifiant numService=numero sont s€lectionn€es table EMPLOYE matri cule nom Employe date Embauche 15155 GARDARIN 16712 MARTIN Ing€nieur Pr€sident 17574 17899 DUPOND Administratif BULLE Commercial 18444 ANABEL 19654 20000 table SERVICE salaire comm ission num Service matr Superieur 07/08/1998 24000 0 10 24533 10 Recherche Rennes 23/05/1990 40000 0 30 NULL 30 Direction Nancy 03/05/1995 9000 0 30 16712 30 Direction Nancy 03/01/2000 18000 0 10 24533 10 Recherche Rennes Commercial 16/06/1990 29000 4000 20 27047 20 Vente Metz ROUX Chef de service 30/05/1990 35000 0 20 16712 20 Vente Metz PAPILOU Commercial 15/10/2004 15000 2050 20 27047 20 Vente Metz 24533 JACOBI Chef de service 30/03/1997 30000 0 10 16712 10 Recherche Rennes 25381 AMIN comptable 15/10/2006 25000 0 30 17574 30 Direction Nancy 25382 PERNOT comptable 15/10/2006 25000 0 30 17574 30 Direction Nancy 26691 DUPONT Commercial 14/04/1992 25000 2500 20 27047 20 Vente Metz 27047 RAMARA Chef de service 18/08/2001 28000 0 20 16712 20 Vente Metz fonction num nomService ero lieu Condition de s€lection numService = numero Enfin, il effectue la projection : seules les colonnes nomEmploye et lieu sont retenues nomEmploye lieu GARDARIN Rennes MARTIN Nancy DUPOND Nancy BULLE Rennes ANABEL Metz ROUX Metz PAPILOU Metz JACOBI Rennes AMIN Nancy PERNOT Nancy DUPONT Metz RAMARA Metz Une autre syntaxe existe pour exprimer la jointure (norme SQL 2): SELEC T nomEmploye, lieu FROM Employe INNER JOIN Service ON numService = numero ou encore SELECT nomEmp loye, lieu FROM Employ e JO IN Serv ic e O N numServ ice= num ero ALSI_IG1_C02 - SQL LID Partie 1 20 ALSI BTS Informatique de gestion 1€re ann•e Il est possible, bien entendu, d'appliquer des restrictions au r€sultat d'une jointure entre tables. Dans ce cas les restrictions sont ajout€es ‚ la clause WHERE, apr‡s la condition de jointure. Les diff€rentes conditions sont s€par€es par AND. SELECT liste_des_colonnes FROM table1, table2 WHERE condition_jointure AND condition_restriction AND autre_condition_restriction … Exemple 21 : Afficher le nom des salari•s embauch•s avant 2000 et travaillant „ Metz SELEC T nomEmploye FROM Employe, Service WHERE numService = numero AND dateEmbauche < '01/01/2000' AND lieu = 'Metz' Le SGBDR r€alise d'abord le produit cart•sien puis applique la condition de jointure matri cule nom Employe date Embauche salaire comm ission num Service matr Superieur 15155 GARDARIN Ing€nieur 07/08/1998 24000 0 10 24533 10 Recherche Rennes 16712 17574 MARTIN Pr€sident 23/05/1990 40000 0 30 NULL 30 Direction Nancy DUPOND Administratif 03/05/1995 9000 0 30 16712 30 Direction Nancy 17899 BULLE Commercial 03/01/2000 18000 0 10 24533 10 Recherche Rennes 18444 ANABEL Commercial 16/06/1990 29000 4000 20 27047 20 Vente Metz 19654 ROUX Chef de service 30/05/1990 35000 0 20 16712 20 Vente Metz 20000 PAPILOU Commercial 15/10/2004 15000 2050 20 27047 20 Vente Metz 24533 JACOBI Chef de service 30/03/1997 30000 0 10 16712 10 Recherche Rennes 25381 AMIN comptable 15/10/2006 25000 0 30 17574 30 Direction Nancy 25382 PERNOT comptable 15/10/2006 25000 0 30 17574 30 Direction Nancy 26691 DUPONT Commercial 14/04/1992 25000 2500 20 27047 20 Vente Metz 27047 RAMARA Chef de service 18/08/2001 28000 0 20 16712 20 Vente Metz fonction num nomService ero lieu Le SGBDR effectue ensuite les restrictions demand€es. matri cule nom Employe fonction date Embauche salaire comm ission num Service matr Superieur num nomService ero 4000 20 27047 20 Vente Metz lieu 18444 ANABEL Commercial 16/06/1990 29000 19654 ROUX Chef de service 30/05/1990 35000 0 20 16712 20 Vente Metz 26691 DUPONT Commercial 14/04/1992 25000 2500 20 27047 20 Vente Metz Le SGBDR effectue enfin la projection des colonnes demand€es nomEmploye ANABEL ROUX DUPONT Exercice 4 ALSI_IG1_C02 - SQL LID Partie 1 21 ALSI BTS Informatique de gestion 1€re ann•e 6.2. Jointure r•flexive ou auto-jointure Il peut ƒtre parfois n€cessaire de lier les informations d’une ligne d’une table avec les informations d’une autre ligne de la mƒme table. Pour cela il est n€cessaire de r€f€rencer deux fois la table dans la requƒte et l'on raisonne comme si l'on avait deux tables diff€rentes. Toutefois, il faut ƒtre capable de diff€rencier ces deux versions d'une mƒme table. Comment faire pour utiliser deux versions d'une m…me table dans une requ…te ? Nous avons vu qu'il €tait possible de d€finir un alias pour un nom de colonne gr‰ce ‚ la clause AS. De la mƒme mani‡re, il est possible de d€finir un alias sur un nom de table (cela est pratique pour €crire la requƒte plus rapidement). Exemple d'utilisation d'un alias Consid€rons le mod‡le relationnel suivant : CLASSE(numero, nom, prenom) numero : cl€ primaire ELEVE(numero, nom, idClasse) numero : cl€ primaire idClasse : cl€ €trang‡re en r€f€rence ‚ numero de la relation CLASSE La requƒte permettant d'obtenir la liste des €l‡ves ainsi que le nom de leur classe est la suivante : SELECT ELEVE.numero, ELEVE.nom, CLASSE.nom FROM ELEVE, CLASSE WHERE idClasse = CLASSE.numero Les colonnes numero et nom doivent obligatoirement ƒtre pr‚c‚d‚es du nom de la table car il y a ambigŠit‚ sur les noms des colonnes. Pour aller plus vite, on peut utiliser des alias pour les tables : SELECT E.numero, E.nom, C.nom FROM ELEVE AS E, CLASSE AS C WHERE idClasse = C.numero A noter que pour les tables, il n'est pas n€cessaire d'utiliser la clause AS pour d€finir un alias. On aurait pu €crire : SELECT E.numero, E.nom, C.nom FROM ELEVE E, CLASSE C WHERE idClasse = C.numero Pour utiliser deux fois une mƒme table dans une requƒte, il suffit d'utiliser des ALIAS. Exemple : FROM EMPLOYE, EMPLOYE AS CHEF ALSI_IG1_C02 - SQL LID Partie 1 22 ALSI BTS Informatique de gestion 1€re ann•e Exemple 22 : Indiquer pour chaque salari• le nom de son sup•rieur hi•rarchique Dans cette requƒte on a besoin de : une version de la table EMPLOYE pour obtenir les informations de chacun des employ€s table EMPLOYE une autre version de cette mƒme table pour obtenir les informations sur les sup€rieurs hi€rarchiques (qui sont aussi des employ€s). Nous appellerons cette deuxi‡me version CHEF table CHEF La lecture de ces deux tables nous permet de voir, par exemple, que le sup€rieur hi€rarchique de BULLE est JACOBI Une jointure est n€cessaire entre la colonne matrSuperieur de la table EMPLOYE et la colonne matricule de la table CHEF. ALSI_IG1_C02 - SQL LID Partie 1 23 ALSI BTS Informatique de gestion 1€re ann•e Le SGBDR doit tout d'abord r€aliser le produit cart•sien des deux tables (il associe chaque ligne de la table EMPLOYE avec chaque ligne de la table CHEF) table EMPLOYE matricule nom Employe fonction table CHEF … matr Superieur matricule nom Employe fonction 15155 GARDARIN Ing€nieur 24533 15155 GARDARIN Ing€nieur 15155 GARDARIN Ing€nieur 24533 16712 MARTIN Pr€sident 15155 GARDARIN Ing€nieur 24533 17574 DUPOND Administratif 15155 GARDARIN Ing€nieur 24533 17899 BULLE Commercial 15155 GARDARIN Ing€nieur 24533 18444 ANABEL Commercial 15155 GARDARIN Ing€nieur 24533 19654 ROUX Chef de service 15155 GARDARIN Ing€nieur 24533 20000 PAPILOU Commercial 15155 GARDARIN Ing€nieur 24533 24533 JACOBI Chef de service 15155 GARDARIN Ing€nieur 24533 25381 AMIN comptable 15155 GARDARIN Ing€nieur 24533 25382 PERNOT comptable 15155 GARDARIN Ing€nieur 24533 26691 DUPONT Commercial 15155 GARDARIN Ing€nieur 24533 27047 RAMARA Chef de service 16712 MARTIN Pr€sident NULL 15155 GARDARIN Ing€nieur 16712 MARTIN Pr€sident NULL 16712 MARTIN Pr€sident 16712 MARTIN Pr€sident NULL 17574 DUPOND Administratif 16712 MARTIN Pr€sident NULL 17899 BULLE Commercial 26691 DUPONT Commercial 27047 25382 PERNOT comptable 26691 DUPONT Commercial 27047 26691 DUPONT Commercial 26691 DUPONT Commercial 27047 27047 RAMARA Chef de service 27047 RAMARA Chef de service 16712 15155 GARDARIN Ing€nieur 27047 RAMARA Chef de service 16712 16712 MARTIN Pr€sident 27047 RAMARA Chef de service 16712 17574 DUPOND Administratif 27047 RAMARA Chef de service 16712 17899 BULLE Commercial 27047 RAMARA Chef de service 16712 18444 ANABEL Commercial 27047 RAMARA Chef de service 16712 19654 ROUX Chef de service 27047 RAMARA Chef de service 16712 20000 PAPILOU Commercial 27047 RAMARA Chef de service 16712 24533 JACOBI Chef de service 27047 RAMARA Chef de service 16712 25381 AMIN comptable 27047 RAMARA Chef de service 16712 25382 PERNOT comptable 27047 RAMARA Chef de service 16712 26691 DUPONT Commercial 27047 RAMARA Chef de service 16712 27047 RAMARA Chef de service ALSI_IG1_C02 - SQL LID Partie 1 … 24 ALSI BTS Informatique de gestion 1€re ann•e Ensuite, il applique la condition de jointure (restriction) : seules les lignes telles que matrSuperieur de la table EMPLOYE = matricule de la table CHEF sont s€lectionn€es table EMPLOYE matricule nom Employe fonction table temporaire CHEF … matr Superieur matricule nom Employe fonction 15155 GARDARIN Ing€nieur 24533 24533 JACOBI Chef de service 17574 DUPOND Administratif 16712 16712 MARTIN Pr€sident 17899 BULLE Commercial 24533 24533 JACOBI Chef de service 18444 ANABEL Commercial 27047 27047 RAMARA Chef de service 19654 ROUX Chef de service 16712 16712 MARTIN Pr€sident 20000 PAPILOU Commercial 27047 27047 RAMARA Chef de service 24533 JACOBI Chef de service 16712 16712 MARTIN Pr€sident 25381 AMIN comptable 17574 17574 DUPOND Administratif 25382 PERNOT comptable 17574 17574 DUPOND Administratif 26691 DUPONT Commercial 27047 27047 RAMARA Chef de service 27047 RAMARA Chef de service 16712 16712 MARTIN Pr€sident … Enfin, il effectue la projection : seules les colonnes nomEmploye des tables EMPLOYE et CHEF sont retenues table EMPLOYE table CHEF nomEmploye nomEmploye GARDARIN JACOBI DUPOND MARTIN BULLE JACOBI ANABEL RAMARA ROUX MARTIN PAPILOU RAMARA JACOBI MARTIN AMIN DUPOND PERNOT DUPOND DUPONT RAMARA RAMARA MARTIN On peut constater que le r€sultat n'est pas tr‡s explicite : on utilisera donc un alias pour renommer la deuxi‡me colonne. table EMPLOYE table CHEF nomEmploye ALSI_IG1_C02 - SQL LID Partie 1 Sup. hi•rarchique GARDARIN JACOBI DUPOND MARTIN BULLE JACOBI ANABEL RAMARA ROUX MARTIN PAPILOU RAMARA JACOBI MARTIN AMIN DUPOND PERNOT DUPOND DUPONT RAMARA RAMARA MARTIN 25 ALSI BTS Informatique de gestion 1€re ann•e Requƒte permettant d'obtenir pour chaque salari€ le nom de son sup€rieur hi€rarchique : SELEC T Employe.nomEmploye, Chef.nomEmploye AS 'Sup. hi•rarchique' FROM Employe, Employe AS Chef WHERE Employe.matrSuperieur = Chef.matricule 6.3. Jointure externe Lorsque la condition de jointure n’est pas satisfaite, aucune des lignes n’appara‹t dans le r€sultat. Les jointures externes permettent d’extraire des lignes d’une des 2 tables concern€es, mƒme si la condition est fausse. Dans ce cas, les donn€es de la seconde table ont la valeur NULL. SELECT champ1, champ2, … FROM table1 [WHERE condition] {LEFT|RIGHT|FULL} OUTER JOIN table2 ON table1.champ3=table2.champ4 Il existe 3 types de jointures externes : la jointure externe gauche (mot-cl€ LEFT), la jointure externe droite (mot cl€ RIGHT) et la jointure externe compl€te (mot cl€ FULL). Pour comprendre le principe des jointures externes, nous allons ajouter une table ‚ notre mod‡le relationnel : la table Affectation qui pr€cise les employ€s affect€s ‚ une affaire chez un client. Extrait de la table Employe Extrait de la table Service ALSI_IG1_C02 - SQL LID Partie 1 Extrait de la table Affectation 26 ALSI BTS Informatique de gestion 1€re ann•e Supposons que l’on souhaite obtenir pour chaque employ‚ la liste des affaires auxquelles il est affect‚. Le r€sultat : nomEmploye DUPONT DUPOND BULLE ROUX PAPILOU GARDARIN PAPILOU fonction Commercial Administratif Commercial Chef de service Commercial Ing€nieur Commercial numAffaire 1001 1002 1002 1003 1003 1005 1005 est obtenu par la requƒte suivante : SELECT nomEmploye, fonction, numAffaire FROM Employe, Affectation WHERE Employe.matricule = Affectation.matrEmplAffecte Toutefois, avec cette requƒte, on perd certaines informations : - le fait que certaines affaires ne sont pas encore affect•es „ un employ• (ex : affaire 1004) - le fait que certains employ•s ne sont affect•s „ aucune affaire (ex : ANABEL) Il est parfois important de disposer de ces informations. C'est ce que permettent les jointures externes. Pour faire simple, les jointures externes permettent d'obtenir les lignes d'une table qui sont li€es aux lignes d'une autre table (€qui-jointure) ainsi que celles qui ne sont pas li€es (condition de jointure non v€rifi€e). 6.3.1. Jointure externe gauche Une jointure externe gauche permet d’inclure dans le r•sultat les lignes de la table sp•cifi•e „ gauche de la jointure m…me s’il n’y a pas de ligne v•rifiant la condition dans la table sp•cifi•e „ droite de la jointure. Exemple 23 : D•tail des affectations pour l'ensemble des employ•s (y compris les employ•s sans affectation) SELEC T nomEmploye, fonction, numAffaire FROM Employe LEFT O UTER JOIN Affectation ON matricule = matrEmplAffecte donne le r€sultat suivant : nomEmploye GARDARIN MARTIN DUPOND BULLE ANABEL ROUX PAPILOU PAPILOU JACOBI DUPONT RAMARA fonction Ing€nieur Pr•sident Administratif Commercial Commercial Chef de service Commercial Commercial Chef de service Commercial Chef de service numAffaire 1005 NULL 1002 1002 NULL 1003 1003 1005 NULL 1001 NULL On retrouve cette fois, dans le r‚sultat de la requƒte, les employ‚s qui ne sont affect‚s ‡ aucune affaire. Le num‚ro d'affaire (table de droite) prend la valeur NULL lorsque la condition de jointure n'est pas r‚alis‚e. Toutes les lignes de la table sp€cifi€e ‚ gauche de la clause OUTER JOIN (Employe dans l’exemple) seront affich€es, que la condition de jointure soit r€alis€e ou non avec la table situ€e ‚ droite. ALSI_IG1_C02 - SQL LID Partie 1 27 ALSI BTS Informatique de gestion 1€re ann•e 6.3.2. Jointure externe droite Une jointure externe droite permet d’inclure dans le r•sultat les lignes de la table sp•cifi•e „ droite de la jointure m…me s’il n’y a pas de ligne v•rifiant la condition dans la table sp•cifi•e „ gauche. Exemple 24 : D•tail des affectations nom des employ•s et fonction) par affaire (y compris les affaires sans affectation) SELEC T nomEmploye, fonction, numAffaire FROM Employe RIGHT OUT ER JOIN Affectation ON matricule = matrEmplAffecte donne le r€sultat suivant : nomEmploye DUPONT DUPOND BULLE ROUX PAPILOU NULL GARDARIN PAPILOU fonction Commercial Administratif Commercial Chef de service Commercial NULL Ing€nieur Commercial numAffaire 1001 1002 1002 1003 1003 1004 1005 1005 On retrouve cette fois, dans le r‚sultat de la requƒte, les affaires qui ne sont affect‚es ‡ personne. Lorsque la condition de jointure n'est pas v‚rifi‚e, les champs de la table de gauche prennent la valeur NULL. Toutes les lignes de la table sp€cifi€e ‚ droite de la clause OUTER JOIN (Affaire dans l’exemple) seront affich€es, que la condition de jointure soit r€alis€e ou non dans la table situ€e ‚ gauche. 6.3.3. Jointure externe compl€te La jointure externe compl‡te permet de combiner une jointure externe gauche avec une jointure externe droite. Exemple 25 : D•tail des affectations y compris les affaires non encore affect•es et les employ•s affect•s „ aucune affaire SELEC T nomEmploye, fonction, numAffaire FROM Employe FULL OU TER JOIN Affectation ON matricule = matrEmplAffecte donne le r€sultat suivant : nomEmploye NULL GARDARIN MARTIN DUPOND BULLE ANABEL ROUX PAPILOU PAPILOU JACOBI DUPONT RAMARA fonction NULL Ing€nieur Pr•sident Administratif Commercial Commercial Chef service Commercial Commercial Chef de service Commercial Chef de service ALSI_IG1_C02 - SQL LID Partie 1 numAffaire 1004 1005 NULL 1002 1002 NULL 1003 1005 1003 NULL 1001 NULL On retrouve cette fois, dans le r‚sultat de la requƒte, les affaires qui ne sont affect‚es ‡ personne ainsi que les employ‚s qui ne sont affect‚s ‡ aucune affaire 28 ALSI BTS Informatique de gestion 1€re ann•e Toutes les lignes des deux tables seront affich€es et les colonnes pour lesquelles il n'y a pas de correspondance sont remplies avec la valeur NULL. 6.4. Jointure multi tables Il est possible de r€aliser la jointure de plus de 2 tables. Dans ce cas, pour chaque paire de tables de la jointure, il suffit d’indiquer une condition d€crivant la relation entre les colonnes. Pour n tables „ joindre, il faut d•crire n-1 conditions de jointure. D•marche pour construire les requ…tes multi-tables Une mƒme d€marche doit ƒtre appliqu€e pour construire vos requƒtes : Rep€rer les tables dont on a besoin c'est-‚-dire : o Pour lesquelles un champ doit ƒtre affich€ (SELECT) o Sur lesquelles une restriction doit ƒtre effectu€e (WHERE hors jointure) Rep€rer sur le mod‡le physique (‚ construire rapidement au brouillon s'il n'est pas fourni) les jointures (liens) ‚ r€aliser pour "passer d'une table ‡ une autre" Ecrire la requƒte o Projection : quels champs afficher ? (clause SELECT) o Liste des tables n€cessaires ‚ la requƒte (clause FROM) pour les champs ‚ afficher, les conditions de restrictions, les jointures o Jointures (WHERE ou JOIN) o Restrictions €ventuelles : quelles lignes doit-on s€lectionner ? (WHERE) Exemple 26 : liste des affectations (matricule et nom de l'employ•, num•ro et nom du service, num•ro d'affaire) des employ•s travaillant „ Metz L€gende Colonnes ‚ afficher dans la table r€sultat Colonnes sur lesquels une restriction est r€alis€e Jointures n€cessaires ALSI_IG1_C02 - SQL LID Partie 1 29 ALSI BTS Informatique de gestion 1€re ann•e Utilisation d'une clause WHERE SELEC T matricule, nomEmploye, numService, nomService, numAffaire FROM Employe, Affectation, Service WHERE numero = numService AND MatrEmplAffecte = matricule AND lieu = 'Metz' Utilisation d'une clause JOIN (norme SQL92) SELEC T matricule, nomEmploye, numService, nomService, numAffaire FROM Employe JOIN Affectation ON MatrEmplAffecte = matricule JOIN Service ON numero = numService WHERE lieu = 'Metz' Exemple 27 : liste des affectations (matricule et nom employ•, num•ro de service, num•ro d'affaire) pour les employ•s embauch•s avant le 06/10/2000 ATTENTION : on peut noter au travers de cet exemple, que contrairement ‚ ce que l'on pourrait penser au d€part, la table Service n'est pas indispensable ‚ la requƒte. R€gle : ne pas utiliser les tables qui ne sont pas indispensables „ l'obtention du r•sultat Utilisation d'une clause WHERE SELEC T matricule, nomEmploye, numService, numAffaire FROM Employe, Affectation WHERE MatrEmplAffecte = matricule AND dateEmbauche < '06/10/2000' ALSI_IG1_C02 - SQL LID Partie 1 30 ALSI BTS Informatique de gestion 1€re ann•e Utilisation d'une clause JOIN (norme SQL2) SELEC T matricule, nomEmploye, numService, numAffaire FROM Employe JOIN Affectation ON MatrEmplAffecte = matricule WHERE dateEmbauche < '06/10/2000' Exemple 28 : liste des affaires (num•ro affaire) affect•es aux employ•s travaillant „ Metz On notera ici, que pour utiliser des informations de la table Affectation (num€ro d'affaire) et de la table Service (lieu), il est n€cessaire de „ passer … par la table Employ€ afin d'€tablir les jointures n€cessaires, cela mƒme si aucun champ de cette table n'est a priori n€cessaire. Utilisation d'une clause WHERE SELEC T numAffaire FROM Employe, Affectation, Service WHERE numero = numService AND matricule = MatrEmplAffecte AND lieu = 'Metz' Utilisation d'une clause JOIN (norme SQL92) SELEC T numAffaire FROM Employe JOIN Affectation ON MatrEmplAffecte = matricule JOIN Service ON numero = numService WHERE lieu = 'Metz' ALSI_IG1_C02 - SQL LID Partie 1 31 ALSI BTS Informatique de gestion 1€re ann•e 7. Exercices L'ensemble des exercices qui suivent se rapportent au mod‡le relationnel ci-dessous : Adherent (numAdh, sexeAdh, civiliteAdh, nomAdh, prenomAdh, adrAdh, cpAdh, villeAdh) Cl€ primaire : numAdh Lecon (numLecon, niveauLecon, jourLecon, debutLecon, finLecon) Cl€ primaire : numLecon Cotisation (numCot, anneeCot, montantCot, dateReglement, numAdh) Cl€ primaire : numCot Cl€ €trang‡re : numAdh en r€f€rence ‚ numAdh de Adherent Inscription (numeroAdherent , numeroLecon) Cl€ primaire : numeroAdherent, numeroLecon Cl€s €trang‡res : numeroAdherent en r€f€rence ‚ numAdh de Adherent numeroLecon en r€f€rence ‚ numLecon de Lecon Remarques : Les champs debutLecon et finLecon correspondent respectivement aux heures de d‚but et de fin d'une le‹on. Les heures sont toujours pr‚cis‚es dans ces champs sont des nombres entiers. Le champ dateReglement contient la date du r€glement au format jj/mm/aaaa. Tant que le r€glement n'a pas ‚t‚ effectu‚, ce champ reste vide Le champ sexeAdh contient les valeurs "f‚minin" ou "masculin" Exercice 1 R•alisez les requ…tes suivantes en langage SQL 1. Pr€sentez la liste des adh€rents (nom et pr€nom). 2. Pr€sentez la liste des adh€rents (nom et pr€nom) de sexe "masculin". 3. Donnez la liste des leŠons (num€ro, heure d€but et heure fin de leŠon) ayant lieu le 29 avril 2007 4. Donnez la dur€e de la leŠon n• 31. 5. Cherchez les adh€rents (num€ro) ayant r€gl€ une cotisation en 2006 6. Donnez la liste des adh€rents (nom et pr€nom) dont le nom contient "epi". Exercice 2 En reprenant le mod€le relationnel de l'exercice pr•c•dent, r•alisez les requ…tes suivantes en langage SQL : 1. Cherchez les heures de d€but et de fin des leŠons de niveau "d€butant" ayant eu lieu le 10/12/2006, le 17/12/2006 ou le 14/01/2007. 2. Fournir la liste des cotisations non r€gl€es. 3. On souhaite obtenir la liste des adh€rents - habitant "Gouvieux" - ou qui habitent les villes commenŠant par S et dont le code postal commence par "60". ALSI_IG1_C02 - SQL LID Partie 1 32 ALSI BTS Informatique de gestion 1€re ann•e Exercice 3 En reprenant le mod€le relationnel de l'exercice 1, r•alisez les requ…tes suivantes en langage SQL : 1. Donnez la liste des adh€rents de sexe f€minin tri€e par ville puis par nom d'adh€rent 2. Pr€senter la liste des leŠons donn€es au mois d'avril 2007. Cette liste sera tri€e par jour puis heure de d€but de la leŠon. Exercice 4 En reprenant le mod€le relationnel de l'exercice 1, r•alisez les requ…tes suivantes en langage SQL : 1. Cherchez les noms et pr€noms des adh€rents ayant cotis€ (r‡glement effectu€ ou non) en 2006. 2. Indiquez le niveau des leŠons auxquelles s'est inscrit Jean LABALLE (on suppose qu'il n'y a pas d'homonyme). 3. D€terminez les noms et pr€noms des adh€rents n'habitant pas Gouvieux et ayant suivi une leŠon le 17 d€cembre 2006. 4. Triez par ordre alphab€tique les adh€rents (nom et pr€nom) ayant r€gl€ leur cotisation pour la saison 2007 et s'€tant inscrit ‚ une leŠon pour le mois de janvier 2008. ALSI_IG1_C02 - SQL LID Partie 1 33