SQL : Dans l article précédent sur le langage de manipulation



Documents pareils
Pour les débutants. langage de définition des données

Le langage SQL Rappels

1 Introduction et installation

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Langage SQL : créer et interroger une base

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

SOMMAIRE. Travailler avec les requêtes... 3

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Le Langage SQL version Oracle

Création de Sous-Formulaires

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Cours: Les Jointures 1

Bases de données relationnelles

1. Introduction Création d'une requête...2

16H Cours / 18H TD / 20H TP

TD n 10 : Ma première Base de Données

Base de données relationnelle et requêtes SQL

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Dossier I Découverte de Base d Open Office

MODE OPERATOIRE OPENOFFICE BASE

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Access et Org.Base : mêmes objectifs? Description du thème : Création de grilles d écran pour une école de conduite.

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Whitepaper. Méthodologie de création de rapports personnalisés SQL Server Reporting Services

Europresse.com. Pour bibliothèque d enseignement Pour bibliothèque publique. Consulter facilement la presse. Guide version 1.

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Bases de données élémentaires Maude Manouvrier

Cours SQL. Base du langage SQL et des bases de données

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Bases de Données. Plan

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

Excel avancé. Frédéric Gava (MCF)

SQL Historique

ZOTERO Un outil gratuit de gestion de bibliographies

EXCEL TUTORIEL 2012/2013

Utiliser un tableau de données

Les bases de données Page 1 / 8

Gestion du parc informatique matériel et logiciel de l Ensicaen. Rapport de projet. Spécialité Informatique 2 e année. SAKHI Taoufik SIFAOUI Mohammed

CREATION WEB DYNAMIQUE

Initiation à Excel. Frédéric Gava (MCF)

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

Excel 2007 Niveau 3 Page 1

MEDIAplus elearning. version 6.6

Table des matières L INTEGRATION DE SAS AVEC JMP. Les échanges de données entre SAS et JMP, en mode déconnecté. Dans JMP

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Europresse.com. Pour les bibliothèques publiques et de l enseignement. Votre meilleur outil de recherche en ligne. Guide version 1.

Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Créer le schéma relationnel d une base de données ACCESS

Tableau de bord. Tableau de bord. Statistiques des contenus de votre site (nb de pages, articles, commentaires...)

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

PHP 4 PARTIE : BASE DE DONNEES

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Devenez un véritable développeur web en 3 mois!

Zotero est une extension du navigateur Firefox. Il est possible de télécharger Firefox gratuitement sur le site:

FileMaker 13. Guide de référence SQL

Mysql avec EasyPhp. 1 er mars 2006

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Le Langage De Description De Données(LDD)

Optimisation SQL. Quelques règles de bases

Manuel d utilisateur du site de covoiturage «Etucovoiturage»

Stockage du fichier dans une table mysql:

S y m M a i l i n g. S o l u t i o n d e - m a i l i n g. SymMailing est un outil professionnel de création et de gestion de campagnes d ing.

PHP 5. La base de données MySql. A. Belaïd 1

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

GUIDE D UTILISATION DU CENTRE DE DONNÉES DE L ISU

SOMMAIRE... 1 ESPACE DU CLUB...

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

GEST_INSTANCES APPLICATION DE GESTION DES INSTANCES ET REUNIONS EN EPLE ETABLISSEMENT PUBLIC LOCAL D ENSEIGNEMENT

Créer une base de données

Guide d installation de Gael

Ouvrir le compte UQÀM

Thème : Gestion commerciale

Les bases de données

Auto-évaluation SQL. Document: f0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Olivier Mondet

Introduction au Système de Gestion de Base de Données et aux Base de Données

3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures

La Clé informatique. Formation Excel XP Aide-mémoire

Sommaire. I.1 : Alimentation à partir d un fichier Access (.mdb)...2

Tutoriel Drupal version 7 :

I. MySQL : Serveur et SGBD

Encryptions, compression et partitionnement des données

Les BASES de DONNEES dans WampServer

La présente publication est protégée par les droits d auteur. Tous droits réservés.

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

BIRT (Business Intelligence and Reporting Tools)

Utilisation du client de messagerie Thunderbird

Transcription:

SQL : extraire des données Les bases de données sont très utilisées dans les applications Web. La création, l interrogation et la manipulation des données de la base sont réalisées en SQL. Dans cet article, vous apprendrez à extraire des données d une table et à les trier avec SQL. Cet article explique : Comment extraire et trier des données. Ce qu il faut savoir : Aucun prérequis. Dans l article précédent sur le langage de manipulation des données, vous avez appris à insérer, modifier et supprimer des données d une base. Dans ce numéro, vous allez apprendre à extraire un sous-ensemble d informations des tables. Pour appliquer les notions présentées, vous devez utiliser un serveur de bases de données MySQL, de préférence la version 5, un serveur web avec PHP version 5 et le client graphique phpmyadmin. Les distributions XAMPP (Windows, Linux, Mac OS), WAMP (Windows), EasyPHP (Windows) ou MAMP (Mac OS) vous fourniront l environnement de travail nécessaire. Les requêtes présentées peuvent être testées via une console SQL ou en mode graphique dans phpmyadmin. Dans cet article, nous allons utiliser l exemple d une bibliothèque privée dont le schéma a été présenté dans un article paru dans le magazine précédent (N 11/2010 - SQL : langage de manipulation des données). Les données insérées dans les tables auteur et livre sont celles figurant dans les tableaux 1 et 2. Sélectionner les données La commande SQL SELECT suivie du caractère * permet d extraire toutes les données d une table : SELECT * FROM nom _ table; Par exemple, pour afficher toutes les lignes de toutes les colonnes de la table auteur (tableau 1), il faut utiliser la requête suivante : SELECT * FROM auteur; Trier les données Par défaut, les lignes extraites sont affichées dans l ordre d insertion. La clause ORDER BY suivie d'une ou plusieurs colonnes permet de faire un tri sur ces colonnes. Par défaut, elle trie par ordre croissant (ASC), mais la condition DESC permet un tri décroissant. La clause OR- DER BY est toujours placée en fin d instruction. SELECT * FROM nom _ table ORDER BY col1 [ASC DESC][, col2 [ASC DESC], ]; L instruction suivante trie les informations de la table auteur par ordre alphabétique sur la colonne nom : SELECT * FROM auteur ORDER BY nom; Si plusieurs colonnes sont citées après la clause ORDER BY, le tri sera d abord effectué sur la première colonne renseignée, puis sur la deuxième, etc. Par exemple pour trier la table auteur suivant leurs noms dans l ordre croissant, puis suivant leurs prénoms dans l ordre décroissant, il faut utiliser la commande : SELECT * FROM auteur ORDER BY nom ASC, prenom DESC; Sélectionner un sous-ensemble de colonnes Il est possible d afficher un sous-ensemble de colonnes d une table en effectuant une projection. Celle-ci est obtenue en indiquant une liste de colonnes devant la clause FROM, en les séparant par des virgules. Derrière 36 1/2011

SQL Select le FROM sera indiquée la table concernée. Le résultat d une projection est une table comportant uniquement les colonnes indiquées. Afin d'éviter l'affichage des doublons, il faut utiliser le mot-clé DISTINCT. SELECT [DISTINCT] col1[, col2, ] FROM nom _ table; L affichage de tous les livres insérés dans la base, ainsi que leur genre et leur date de parution, triés par ordre de parution (tableau 3), est possible grâce à l instruction suivante : SELECT titre, genre, date _ parution FROM livre ORDER BY date _ parution; Pour afficher les genres présents dans la base, on peut utiliser la requête : SELECT genre FROM livre; Cette requête renvoie les genres pour chaque livre inséré dans la base. Il apparaîtra donc plusieurs fois roman et theatre. Pour afficher une liste ne comprenant qu une unique fois chaque genre, il faut utiliser DISTINCT : SELECT DISTINCT genre FROM livre; Sélectionner un sous-ensemble de lignes La clause WHERE permet de définir une condition afin de sélectionner un sous-ensemble de lignes d'une table. Celle-ci est une expression comportant un ou plusieurs opérateurs (tableau 4) dont les opérandes sont des noms de colonnes, des fonctions ou des constantes. MySQL propose un grand nombre de fonctions sur les dates, les nombres et les chaînes de caractères. La restriction affichera toutes les lignes de la table qui répondent à la condition. SELECT col1[, col2,...] FROM nom _ table WHERE condition; Nombres Pour indiquer une condition quant à une colonne numérique, il est possible d utiliser des opérateurs relationnels, logiques, ainsi que les opérateurs BETWEEN ou IN. L instruction suivante affiche les livres parus après 1950, triés par date de parution : SELECT titre, date _ parution FROM livre WHERE date _ parution > 1950 ORDER BY date _ parution; Les opérateurs logiques permettent de combiner des conditions. Par exemple, pour afficher les livres parus entre 1950 et 1980 : Figure 1. Extraire des données depuis phpmyadmin SELECT titre, date _ parution FROM livre WHERE date _ parution >= 1950 AND date _ parution <= 1980; La requête précédente peut également être écrite grâce à l expression nb BETWEEN min AND max qui retourne vrai si le nombre nb est compris entre les bornes min et max : SELECT titre, date _ parution FROM livre WHERE date _ parution BETWEEN 1950 AND 1980; Par contre, pour comparer les champs d une colonne à une liste, il faut utiliser l expression nb IN (val1[, val2, ]) qui retourne vrai si nb appartient à une des valeurs indiquées. L instruction suivante permet d afficher seulement les livres parus en 2008 ou en 2010 : SELECT titre, date _ parution FROM livre WHERE date _ parution IN (2008,2010); Chaînes de caractères La restriction peut porter sur des chaînes de caractères. Par exemple, pour afficher tous les romans : SELECT titre, genre FROM livre WHERE genre = 'roman'; L expression ch IN (val1[, val2, ]) fonctionne aussi pour les chaînes. Ainsi, l instruction suivante permet d afficher les romans et les livres historiques : SELECT titre, genre FROM livre WHERE genre IN ('roman','historique'); Il est également possible d effectuer des comparaisons sur des chaînes en utilisant l opérateur LIKE. L expression chaine LIKE motif retourne vrai si la chaîne indiquée correspond au motif spécifié. Le motif peut être composé de lettres et/ou de symboles : le % représente www.phpsolmag.org 37

Tableau 1. Contenu de la table AUTEUR id_auteur nom prenom date_naissance 1 Follett Ken 1949-06-05 2 Dickens Charles 1812-06-09 3 Tolkien J. R. R. 1892-01-03 4 Molière Jean Baptiste 1622-01-15 5 Herbouiller Sophie NULL 6 Massonaud Christophe NULL Tableau 2. Contenu de la table LIVRE isbn titre genre date_parution langue nb_pages preface code_zone 128-5-56985-5 Fall of giants historique 2010 anglais 255 oui c20 952-5-15632-0 Un bunker à la Baule roman 2008 francais 226 non c10 320-2-02365-5 Le bourgeois gentilhomme theatre 1670 francais 152 NULL NULL 152-5-55695-2 Le seigneur des anneaux fantastique 1954 francais 832 non c8 523-5-65472-9 David Copperfield roman 1850 anglais 458 oui s8 320-2-02225-6 Amphitryon theatre 1668 francais 120 oui c18 Tableau 3. Sélection et tri d un sous-ensemble de colonnes. titre genre date_parution Amphitryon theatre 1668 Le bourgeois gentilhomme theatre 1670 David Copperfield roman 1850 Le seigneur des anneaux fantastique 1954 Un bunker à la Baule roman 2008 Fall of giants historique 2010 Tableau 4. Opérateurs Opérateurs SQL Opérateurs arithmétiques + Addition - Soustraction * Multiplication / Division Opérateurs logiques AND Et (x AND y vrai uniquement si x vrai et y vrai) OR Ou (x OR y faux uniquement si x faux et y faux) NOT Non Opérateurs relationnels = Egal à <> Différent de < Inférieur à <= Inférieur ou égal à > Supérieur à >= Supérieur ou égal à Autres opérateurs chaine LIKE motif Vrai si la chaine suit le motif exp IN (val1, val2,...) Vrai si l expression appartient à une des valeurs exp BETWEEN min AND max Vrai si l expression est comprise entre les deux bornes exp IS NULL Vrai si l expression a la valeur NULL exp IS NOT NULL Vrai si l expression n a pas la valeur NULL 38 1/2011

SQL Select n importe quelle chaîne et le _ représente un unique caractère quelconque. L instruction suivante affiche tous les livres dont le code zone commence par un C suivi de deux caractères quelconques (dans le tableau 2, les livres qui ont les codes zone : c10, c18 et c20) : SELECT titre FROM livre WHERE code _ zone LIKE 'c '; Par contre, la requête suivante renvoie tous les livres dont le code zone commence par un C, quel que soit le nombre de caractères (les livres dont le code zone est c10, c18, c20 ou c8) : SELECT titre FROM livre WHERE code _ zone LIKE 'c%'; Il est possible de définir des conditions sur des colonnes de type numérique et alphanumérique dans une même requête. Pour afficher les romans parus après 1950, il faut exécuter : SELECT titre FROM livre WHERE genre = 'roman' AND date _ parution > 1950; Dates La restriction peut porter sur des colonnes de type date. Par exemple, pour afficher tous les auteurs nés au XIXème siècle : SELECT nom FROM auteur WHERE YEAR(date _ naissance) BETWEEN 1800 AND 1899; La fonction MySQL YEAR retourne l année de la date passée en argument. La fonction MONTH retourne un numéro entre 1 et 12 correspondant au mois. Pour lister les auteurs nés en juin : SELECT nom FROM auteur WHERE MONTH(date _ naissance) = 6; NULL L opérateur IS NULL permet de sélectionner les lignes dont les champs ne sont pas renseignés. Pour extraire les lignes dont le code zone n a pas été défini : SELECT titre FROM livre WHERE code _ zone IS NULL; L opérateur inverse serait IS NOT NULL. La requête suivante extrait tous les livres dont le code zone est renseigné : SELECT titre FROM livre WHERE code _ zone IS NOT NULL; Tableau 5. Colonne dérivée et tri titre Amphitryon 343 David Copperfield 161 Fall of giants 1 Le bourgeois gentilhomme 341 Le seigneur des anneaux 57 Un bunker à la Baule 3 Tableau 6. Colonne dérivée avec alias et tri titre Fall of giants 1 Un bunker à la Baule 3 Le seigneur des anneaux 57 David Copperfield 161 Le bourgeois gentilhomme 341 Amphitryon 343 Tableau 7. Regroupement de données ecrivain YEAR(NOW())-date_parution anciennete annee K. Follett 1949 C. Dickens 1812 J. Tolkien 1892 J. Molière 1622 S. Herbouiller NULL C. Massonaud NULL Créer des colonnes dérivées Il est également possible d extraire des informations de manière personnalisée en créant des colonnes qui ne sont pas présentes dans la base. Ces colonnes peuvent prendre des valeurs retournées par des fonctions ou des calculs. Ces colonnes ne sont pas ajoutées dans la base de données, elles apparaissent uniquement lors de l'affichage du résultat de la requête. Par exemple, on peut vouloir extraire l ancienneté d un livre (tableau 5). Pour ce faire, il suffit de retrancher la date de parution à la date du jour : SELECT titre, YEAR(NOW())-date _ parution FROM livre ORDER BY titre; La requête retourne un tableau de deux colonnes dont la première est intitulée titre et l autre YEAR(NOW())-date_parution. Pour renommer cette colonne (tableau 6), il faut utiliser un alias (AS).. Il est aussi possible de faire un tri sur cette nouvelle colonne : SELECT titre, (YEAR(NOW())-date _ parution) AS anciennete FROM livre ORDER BY anciennete; www.phpsolmag.org 39

Tableau 8. Quelques fonctions MySQL prédéfinies Fonctions MySQL Fonctions sur les dates DATEDIFF(date1, date2) Retourne le nombre de jour entre date1 et date2 MONTH(date) Retourne le mois de la date NOW() Retourne la date courante YEAR(date) Retourne l année de la date Fonctions sur les chaînes de caractères CONCAT(ch1, ch2,...) Retourne la concaténation des chaînes ch1, ch2,... LENGTH(ch) Retourne la longueur de la chaîne ch SUBSTRING(ch, pos, lg) Retourne la sous-chaîne de ch débutant à l indice pos et de taille lg TRIM(ch) Retourne la chaîne ch sans les espaces ni à droite ni à gauche Fonctions mathématiques MOD(nb1,nb2) Retourne le reste de la division de nb1 par nb2 (modulo) SQRT(nb) Retourne la racine carrée de nb TRUNCATE(nb,dec) Retourne nb tronqué en fonction de la decimale dec La requête suivante crée une colonne 'ecrivain' qui contient la liste des auteurs comprenant seulement la première lettre de leur prénom suivi d un point et de leur nom (format : C. Dickens ) ainsi qu une colonne contenant leur année de naissance, comme dans le tableau 7 : SELECT CONCAT(SUBSTRING(prenom,1,1),'. ',nom) AS ecrivain, YEAR(date _ naissance) AS annee FROM auteur; Extraire des données avec phpmyadmin L interface Web phpmyadmin permet d extraire des données via l utilisation d un formulaire. Une fois la base sélectionnée sur la page d accueil, il faut choisir la table concernée dans le cadre de gauche. Un clic sur l icône Rechercher dans le menu du cadre de droite permet d afficher le formulaire d extraction (figure 1). Il est proposé une liste de conditions spécifiques à chaque champ. Sous le bouton Options, une liste à choix multiples permet de réaliser une projection en choisissant quelles colonnes devront s afficher. La soumission du formulaire génère automatiquement la requête, l affiche et l envoie à MySQL. Sur la figure 1, il a été rempli pour répondre à la requête : SELECT titre, date _ parution FROM livre WHERE date _ parution > 1950 ORDER BY date _ parution; Sur Internet http://www.phpmyadmin.net - phpmyadmin http://www.mysql.fr MySQL, Cependant, cette interface ne permet pas actuellement de faire de conditions multiples sur un champ. Il est notamment impossible de donner deux bornes à une date de parution. Conclusion Vous avez appris dans cet article à extraire et trier des données provenant d une table. Grâce aux connaissances acquises dans cette série d articles, vous êtes à présent à même de réaliser des bases de données simples, d y insérer des données et de les interroger. L article sur les jointures vous permettra d interroger plusieurs tables simultanément à la suite de quoi vous verrez comment vous connecter à la base via PHP avec PDO. CILIA MAURO, MAGALI CONTENSIN Cilia Mauro est gestionnaire de bases de données et développeur d applications web au CNRS. Elle enseigne les bases de données et PHP à l université. Contact : cilia.mro@gmail.com Magali Contensin est chef de projet en développement d applications au CNRS. Elle enseigne depuis plus de dix ans le développement d applications web à l université et est l auteur de nombreux articles sur le développement web en PHP. Contact : http://magali.contensin.online.fr 40 1/2011

SQL : les jointures Les bases de données sont très utilisées dans les applications Web. La création, l interrogation et la manipulation des données de la base sont réalisées en SQL. Dans cet article, vous apprendrez à extraire des données issues de plusieurs tables avec SQL. Cet article explique : Comment extraire des données de plusieurs tables simultanément. Ce qu il faut savoir : Avoir lu l'article SQL : extraire des données (de ce même numéro). Dans les articles précédents vous avez appris les bases du langage SQL. Vous êtes capables de réaliser des bases de données simples, d y insérer des données et de les interroger. Dans l article précédent (dans ce numéro : SQL : extraire des données), vous avez vu comment extraire des données d une table. Cet article explique comment interroger plusieurs tables en même temps. Afin d appliquer les prochaines notions, il est nécessaire que vous utilisiez l environnement de travail présenté dans l article précédent. L'interface Web phpmyadmin utilisée jusqu ici ne permet pas de générer graphiquement des jointures, aussi les requêtes suivantes devront être testées via une console SQL. Cet article sera illustré par l'exemple d'une bibliothèque privée (Figure 1) dont les données insérées dans les tables auteur et livre sont les mêmes que dans l article sur l extraction des données. Les données des tables zone et ecrit apparaissent dans les tableaux 1 et 2. Jusqu à présent, vous avez extrait des données d une seule table. Parfois il est nécessaire de faire une extraction sur plusieurs tables. Par exemple, pour afficher tous les livres présents dans une pièce donnée, une solution est de passer par deux requêtes. La première extrait les codes zone d intérêt, ici pour une chambre : SELECT code _ zone FROM zone WHERE piece = 'chambre'; Figure 1. Schéma de la base de données biblio www.phpsolmag.org 41

SQL Jointure La seconde utilise le résultat de la première pour afficher les titres des livres présents dans cette pièce : SELECT titre FROM livre WHERE code _ zone IN ('c10','c18','c20','c8'); Une solution plus efficace de procéder est de regrouper les données des tables livre et zone grâce à une jointure. Après avoir présenté le produit cartésien sur lequel reposent les jointures, vous verrez quels types de jointures existent et comment les utiliser. Produit cartésien La jointure consiste à faire le produit cartésien de deux tables puis de restreindre les lignes grâce à une condition. La syntaxe JOIN avec ON permet d indiquer le type de jointure (interne ou externe, détaillées plus tard) et la condition : SELECT col1[, col2, ] FROM table1 [NATURAL] [LEFT RIGHT] JOIN table2 ON condition; Le produit cartésien de deux tables est l ensemble de tous les couples possibles entre les lignes de ces tables. Il associe à chaque ligne de la table livre la première ligne de la table zone, puis il associe à chaque ligne de la table livre la seconde ligne de la table zone, etc. Le tableau 3 montre le produit cartésien d un sousensemble de colonnes des tables livre et zone. Pour l afficher, il suffit d extraire les deux tables sans condition de jointure : SELECT livre.titre, livre.date _ parution, livre.code _ zone AS code1, zone.code _ zone AS code2, zone.piece FROM livre JOIN zone; Le caractère point permet d'indiquer la table d'où provient la colonne et évite les ambiguïtés possibles quant à savoir s'il s'agit du code_zone de la table livre ou de celui de la table zone. Pour diminuer le nombre de caractère d'une requête, il est possible de donner un alias aux tables. Dans la requête suivante, équivalente à la précédente, la table livre a été renommée en L et la table zone en Z : SELECT L.titre, L.date_parution, L.code_zone AS code1, Z.code_zone AS code2, Z.piece FROM livre L JOIN zone Z; Tableau 1. Contenu de la table zone code_zone piece meuble c10 chambre armoire en pin c18 chambre armoire en pin c20 chambre bibliothèque noire c8 chambre commode s11 salon bibliothèque noire s8 salon buffet en chêne Tableau 2. Contenu de la table ecrit isbn 128-5-56985-5 1 523-5-65472-9 2 152-5-55695-2 3 320-2-02225-6 4 320-2-02365-5 4 952-5-15632-0 5 952-5-15632-0 6 id_auteur Jointure interne Le produit cartésien du tableau 3 a généré toutes les possibilités de couples, les seuls qui nous intéressent sont ceux dont les codes zone sont identiques (lignes du tableau 3 marquées d'un dans la dernière colonne). Pour afficher tous les livres présents dans une pièce, il faut donc indiquer que la comparaison porte sur la colonne code_zone de la table livre et la colonne code_zone de la table zone : SELECT L.titre, L.date _ parution, L.code _ zone AS code1, Z.code _ zone AS code2, Z.piece FROM livre L JOIN zone Z ON L.code _ zone = Z.code _ zone; Cette requête est une jointure interne. Elle s'exerce par défaut si le type de jointure n'est pas précisé ou si IN- NER JOIN est utilisé. Ce type de jointure, le plus fréquemment rencontré, suit la syntaxe : SELECT col1[, col2, ] FROM table1 [INNER] JOIN table2 ON condition; La requête de l'exemple retourne cinq lignes. Le livre non référencé (code_zone à NULL) n'apparaît pas. Pour afficher tous les livres présents dans une chambre, il suffit d'ajouter une restriction à la requête : SELECT L.titre, L.date_parution, L.code_zone AS code1, Z.code_zone AS code2, Z.piece FROM livre L JOIN zone Z ON L.code_zone = Z.code_ zone WHERE Z.piece = 'chambre'; Une notation plus ancienne peut être rencontrée pour réaliser une jointure : SELECT col1[, col2, ] FROM table1, table2 WHERE condition; La condition de jointure est spécifiée après la clause WHERE et les tables sont listées après le FROM séparées 42 1/2011

Tableau 3. Produit cartésien d un sous-ensemble de colonnes des tables livre et zone titre date_parution code1 code2 piece Fall of giants 2010 c20 c10 chambre Le seigneur des anneaux 1954 c8 c10 chambre Amphitryon 1668 c18 c10 chambre Le bourgeois gentilhomme 1670 NULL c10 chambre David Copperfield 1850 s8 c10 chambre Un bunker à la Baule 2008 c10 c10 chambre I Fall of giants 2010 c20 c18 chambre Le seigneur des anneaux 1954 c8 c18 chambre Amphitryon 1668 c18 c18 chambre I Le bourgeois gentilhomme 1670 NULL c18 chambre David Copperfield 1850 s8 c18 chambre Un bunker à la Baule 2008 c10 c18 chambre Fall of giants 2010 c20 c20 chambre I Le seigneur des anneaux 1954 c8 c20 chambre Amphitryon 1668 c18 c20 chambre Le bourgeois gentilhomme 1670 NULL c20 chambre David Copperfield 1850 s8 c20 chambre Un bunker à la Baule 2008 c10 c20 chambre Fall of giants 2010 c20 c8 chambre Le seigneur des anneaux 1954 c8 c8 chambre I Amphitryon 1668 c18 c8 chambre Le bourgeois gentilhomme 1670 NULL c8 chambre David Copperfield 1850 s8 c8 chambre Un bunker à la Baule 2008 c10 c8 chambre Fall of giants 2010 c20 s11 salon Le seigneur des anneaux 1954 c8 s11 salon Amphitryon 1668 c18 s11 salon Le bourgeois gentilhomme 1670 NULL s11 salon David Copperfield 1850 s8 s11 salon Un bunker à la Baule 2008 c10 s11 salon Fall of giants 2010 c20 s8 salon Le seigneur des anneaux 1954 c8 s8 salon Amphitryon 1668 c18 s8 salon Le bourgeois gentilhomme 1670 NULL s8 salon David Copperfield 1850 s8 s8 salon I Un bunker à la Baule 2008 c10 s8 salon Tableau 4. Afficher tous les livres et leur zone s ils sont référencés titre date_parution code1 code2 piece Fall of giants 2010 c20 c20 chambre Le seigneur des anneaux 1954 c8 c8 chambre Amphitryon 1668 c18 c18 chambre Le bourgeois gentilhomme 1670 NULL NULL NULL David Copperfield 1850 s8 s8 salon Un bunker à la Baule 2008 c10 c10 chambre www.phpsolmag.org 43

SQL Jointure par des caractères virgules. La requête précédente peut être réécrite : SELECT L.titre, L.date_parution, L.code_zone AS code1, Z.code_zone AS code2, Z.piece FROM livre L, zone Z WHERE L.code_zone = Z.code_ zone AND Z.piece = 'chambre'; La syntaxe avec JOIN et ON est plus claire car elle permet de différencier les conditions de jointure des restrictions, mais les résultats des deux sont équivalentes. Jointure naturelle. Lorsque les colonnes de la condition de jointure ont le même nom dans chaque table, la jointure peut être réalisée automatiquement en utilisant le mot-clé NATURAL devant le type de jointure. La requête, qui affiche les livres et la pièce dans laquelle ils sont stockés, aurait pu être écrite : Tableau 5. Afficher toutes les zones et les livres qu elles contiennent titre date_parution code1 code2 piece Un bunker à la Baule 2008 c10 c10 chambre Amphitryon 1668 c18 c18 chambre Fall of giants 2010 c20 c20 chambre Le seigneur des anneaux 1954 c8 c8 chambre NULL NULL NULL s11 salon David Copperfield 1850 s8 s8 salon SELECT L.titre, L.code _ zone AS code1, Z.code _ zone AS code2, Z.piece FROM livre L NATURAL JOIN zone Z; Jointure externe La jointure interne ne permet pas d obtenir les livres qui n ont pas été rangés dans une pièce, c est à dire ceux dont le code zone a la valeur NULL. Seules les lignes qui ont une correspondance dans l autre table sont affichées. Les jointures externes (OUTER JOIN) permettent d afficher des lignes qui n ont pas forcément de correspondance : SELECT col1[, col2, ] FROM table1 [NATURAL] [LEFT RIGHT] [OUTER] JOIN table2 ON condition; Jointure gauche Afin d'afficher tous les livres, référencés ou non, il faut réaliser une jointure externe gauche (LEFT [OUTER] JOIN) : SELECT L.titre, L.date_parution, L.code_zone AS code1, Z.code_zone AS code2, Z.piece FROM livre L LEFT JOIN zone Z ON L.code_zone = Z.code_zone; La requête retourne les lignes de la jointure interne plus les lignes de la table de gauche qui n'ont pas de correspondance dans la table de droite (zone). Dans ce cas, les colonnes de la table de droite comporteront la valeur NULL (tableau 4). Les colonnes de la condition de jointure ayant le même nom, il est possible de faire une jointure naturelle externe : SELECT L.titre, L.date _ parution, L.code _ zone AS code1, Z.code _ zone AS code2, Z.piece FROM livre L NATURAL LEFT JOIN zone Z; Figure 2. Organigramme Jointure droite Pour afficher toutes les zones et les livres qu elles contiennent, s il y en a, il faut utiliser une jointure externe droite : SELECT L.titre, L.date _ parution, L.code _ zone AS code1, Z.code _ zone AS code2, Z.piece FROM livre L RIGHT JOIN zone Z ON L.code _ zone = Z.code _ zone; La jointure retourne toutes les lignes de la jointure interne plus les lignes de la table de droite (zone) qui n'ont pas de correspondance dans la table livre (tableau 5). Une jointure droite peut s écrire sous la forme d une jointure gauche en inversant l ordre des tables. La requête suivante est équivalente à la jointure droite cidessus (tableau 5) : SELECT L.titre, L.date _ parution, L.code _ zone AS code1, Z.code _ zone AS code2, Z.piece FROM zone Z LEFT JOIN livre L ON L.code _ zone = Z.code _ zone; 44 1/2011

Tableau 6. Titre des livres et leurs auteurs titre Fall of giants Le seigneur des anneaux Amphitryon Le bourgeois gentilhomme David Copperfield Un bunker à la Baule Un bunker à la Baule nom Follett Tolkien Molière Molière Dickens Herbouiller Massonaud Tableau 7. Contenu de la table employe id nom chef 1 X NULL 2 Y 1 3 Z 1 4 A 2 5 B 2 6 C 3 Tableau 8. Affichage de tous les employés et de leur chef id nom chef 1 X NULL 2 Y X 3 Z X 4 A Y 5 B Y 6 C Z Jointure complète La norme SQL définit des jointures externes complètes qui retournent toutes les lignes de la table de gauche et de la table de droite (FULL JOIN). Celles-ci ne sont pas implémentées dans MySQL mais peuvent être obtenues grâce à une union du résultat de deux requêtes (LEFT + RIGHT) : SELECT col1[, col2, ] FROM table1 LEFT JOIN table2 ON condition UNION SELECT col1[, col2, ] FROM table1 RIGHT JOIN table2 ON condition; Pour effectuer une union, il faut que les deux requêtes renvoient le même nombre de colonnes et que celles-ci soient du même type. Jointure sur trois tables Il est parfois nécessaire de faire des jointures sur plus de deux tables. Dans l exemple, pour afficher les livres et le nom de leurs auteurs (tableau 6), il faut interroger trois tables. La table ecrit permet d associer un ou plusieurs auteurs à un livre. La requête s écrit donc : SELECT L.titre, A.nom FROM livre L JOIN ecrit E ON L.isbn = E.isbn JOIN auteur A ON E.id _ auteur = A.id _ auteur; Les jointures sont faites successivement. Le résultat de la jointure entre les tables livre et ecrit est joint à la table auteur. Comme précédemment, les conditions de jointure portent sur des colonnes de même nom, il est donc possible d écrire : SELECT L.titre, A.nom FROM livre L NATURAL JOIN ecrit NATURAL JOIN auteur A; Auto-jointure Dans certains cas, il peut s avérer nécessaire de joindre une table à elle-même. Par exemple pour retrouver des liens de parenté entre des personnes ou afficher le supérieur hiérarchique d un groupe d employés (Figure 2). Cet exemple sera utilisé pour présenter l auto-jointure. Une table stocke tous les employés d une entreprise et comporte une colonne chef qui référence l identifiant d un des employés de la même table, ou NULL si l employé n a pas de supérieur hiérarchique (tableau 7). Pour afficher la liste de tous les employés et de leur chef, il faut faire une jointure interne. Comme elle portera sur la même table, il faut lui donner deux alias différents : SELECT E.id, E.nom, C.nom AS chef FROM employe E JOIN employe C ON E.chef = C.id; La requête retourne cinq lignes et n affiche pas les employés qui n ont pas de supérieur hiérarchique (dans l exemple, celui dont l id est 1). Pour l afficher (tableau 8), il faut faire une jointure externe : SELECT E.id, E.nom, C.nom AS chef FROM employe E LEFT JOIN employe C ON E.chef = C.id; Conclusion Vous avez appris dans cet article à extraire des données provenant de plusieurs tables. Grâce aux connaissances acquises dans cette série d'articles, vous êtes à présent à même de réaliser des bases de données simples, d'y insérer des données et de les interroger. Le prochain article vous montrera comment interroger une base de données via PHP avec PDO. CILIA MAURO, MAGALI CONTENSIN Cilia Mauro est gestionnaire de bases de données et développeur d applications web au CNRS. Elle enseigne les bases de données et PHP à l université. Contact : cilia.mro@gmail.com Magali Contensin est chef de projet en développement d applications au CNRS. Elle enseigne depuis plus de dix ans le développement d applications web à l université et est l auteur de nombreux articles sur le développement web en PHP. Contact : http://magali.contensin.online.fr www.phpsolmag.org 45