FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL



Documents pareils
Base de données relationnelle et requêtes SQL

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

Langage SQL : créer et interroger une base

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

1 Introduction et installation

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Bases de données relationnelles

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

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

Le langage SQL Rappels

SQL Historique

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

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

Encryptions, compression et partitionnement des données

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

Le Langage De Description De Données(LDD)

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Les BASES de DONNEES dans WampServer

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

CREATION WEB DYNAMIQUE

Olivier Mondet

Les bases de données

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

MODE OPERATOIRE OPENOFFICE BASE

16H Cours / 18H TD / 20H TP

Faculté des sciences de gestion et sciences économiques BASE DE DONNEES

Les bases de données Page 1 / 8

Le Langage SQL version Oracle

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

FileMaker 13. Guide de référence SQL

Création et Gestion des tables

Écriture de journal. (Virement de dépense)

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

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

SQL MAP. Etude d un logiciel SQL Injection

Gestion de références bibliographiques

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

Information utiles. webpage : Google+ : digiusto/

Le langage SQL (première partie) c Olivier Caron

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

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

Bases de Données relationnelles et leurs systèmes de Gestion

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

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Mysql avec EasyPhp. 1 er mars 2006

Bases de Données. Plan

Création de Sous-Formulaires

Introduction aux Bases de Données 2004/2005

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

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

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Introduction aux Bases de Données

MEDIAplus elearning. version 6.6

«Manuel Pratique» Gestion budgétaire

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

Rappel sur les bases de données

A QUOI SERVENT LES BASES DE DONNÉES?

STATISTICA Version 12 : Instructions d'installation

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

Présentation du module Base de données spatio-temporelles

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

Exploiter les statistiques d utilisation de SQL Server 2008 R2 Reporting Services

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

Cours Bases de données 2ème année IUT

Guide d installation de Gael

Modélisation et Gestion des bases de données avec mysql workbench

Objectifs du TP : Initiation à Access

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

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

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

Première étape : créer le fichier de données - extraire les données de PMB et les transférer dans Excel

Gestion des utilisateurs et de leurs droits

Les Utilisateurs dans SharePoint

Notes de cours : bases de données distribuées et repliquées

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

Méthode de préparation du fichier texte d import depuis Excel, via Access jusqu à Drupal.

Groupe Eyrolles, 2003, ISBN : X

Cyberclasse L'interface web pas à pas

Bases de données Cours 1 : Généralités sur les bases de données

FACTURATION. Menu. Fonctionnement. Allez dans le menu «Gestion» puis «Facturation» 1 Descriptif du dossier (onglet Facturation)

Manuel d utilisation du site web de l ONRN

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

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

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

La base de données dans ArtemiS SUITE

TP Contraintes - Triggers

Optimisation SQL. Quelques règles de bases

420-PK6-SL Banques de données Avancées UTILISATEURS

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

I. MySQL : Serveur et SGBD

Dossier I Découverte de Base d Open Office

SQL Server Installation Center et SQL Server Management Studio

et de la feuille de styles.

Guide du RDAQ. Comment saisir des descriptions de fonds et collections dans le Réseau de diffusion des archives du Québec (RDAQ)

hager Logiciel PC pour configurateur Radio Tebis TX 100 Manuel d utilisation 6T7266

Transcription:

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL Cette création est mise à disposition selon le Contrat Paternité-Pas d'utilisation Commerciale-Partage des Conditions Initiales à l'identique 2.0 Belgique disponible en ligne http://creativecommons.org/licenses/by-ncsa/2.0/be/ ou par courrier postal à Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. Sommaire 1 Introduction... 1 2 Notions et histoire autour des bases de données... 1 2.1 Quelques éléments historiques... 2 2.2 BD relationnelle : définition... 2 2.3 BD relationnelle : les étapes de la conception... 2 2.4 Les identifiants : la clef de voûte des BD relationnelles... 4 3 SQL : éléments d information de base... 6 3.1 SQL : quelques prérequis sur l accès et des fonctions de base... 6 3.1.1 Les différentes façons d accéder à des tables de la BD de PMB... 6 3.1.2 Des fonctions de base en SQL... 7 3.2 SQL : les 4 commandes principales... 8 3.2.1 La commande SELECT... 8 3.2.2 La commande UPDATE... 9 3.2.3 La commande INSERT... 10 3.2.4 La commande DELETE... 10 3.3 SQL : la fonction de join et les sous-requêtes... 11 3.3.1 Utilisation des alias pour interroger deux tables simultanément... 11 3.3.2 Les commandes join... 11 3.3.3 Utilisation des sous-requêtes... 14 3.4 SQL : quelques fonctions d agrégat et autres fonctions avancées... 16 3.4.1 Fonctions de regroupement ou de tri... 16 3.4.2 Fonctions arithmétiques... 18 3.4.3 Traitement de chaînes de caractères... 18 3.5 Pour aller plus loin à propos de (My)SQL... 20 1 Introduction Ce document a pour but de présenter brièvement les bases de données relationnelles et de donner quelques notions et requêtes de base en SQL. 2 Notions et histoire autour des bases de données Cette partie décrit le contexte dans lequel sont nées les BDs, donne la définition des BD relationnelles, quelques éléments d information à propos de leur conception et finalement, présente les identifiants, clefs de voûte des BD relationnelles. Cécile GASS juillet 2007 cecile_gass@yahoo.com 1

2.1 Quelques éléments historiques Les bases de données (BD) ont des ancêtres : les systèmes de fichiers. Avant l avènement des bases de données telles qu on les connaît aujourd hui, les données étaient rassemblées sous forme de listes ou fichiers plus ou moins organisés. Ceux-ci étaient crées par des programmes, qui pouvaient les modifier. Le partage de ces données entre plusieurs applications, ou la mise à jour simultanée par plusieurs programmes étaient difficiles. Au fur et à mesure des progrès en informatique, les fichiers furent de plus en plus structurés, ils étaient mis en réseau et plusieurs modèles d organisation se faisaient concurrence. Finalement, les BD relationnelles se sont petit à petit imposées dans les années 70. Les années 80 virent les premières grosses applications basées sur des BD relationnelles, qui finirent par dominer largement dans les années 90. Depuis les années 80, le SQL (Structured Query Language), langage utilisé pour manipuler les données de ces BD, s est imposé en raison de sa simplicité mais il existe plusieurs SQL : des SQL propriétaires (comme oracle, sybase ou IBM) ; et d autres qui sont libres (tels mysql ou firebird) ; ils sont de plus en plus performants et robustes ; c est un langage qui convient particulièrement aux petites applications de la microinformatique. Entre les données de la BD ; et le langage SQL qui permet aux applications de les manipuler, le Système de gestion de la BD (SGBD) détermine comment réagir aux requêtes SQL exprimées dans les applications. PMB, logiciel libre, est nativement conçu pour fonctionner avec Mysql qui est tout à la fois: - un SGBD ; - un serveur de BD relationnelles ; - un logiciel ouvert compatible avec de nombreuses applications et plateformes, supportant un grand nombre de pilotes, et des standards ouverts. 2.2 BD relationnelle : définition Une base de données est une collection organisée de données i.e. il existe une structure logique qui lie ces données entre elles pour en faciliter l'accès et le traitement. A une BD est normalement associée la notion de dépôt, c est-à-dire que : - les informations sont disponibles pour tous à partir d'un endroit unique ; - l'observation des données du dépôt renseigne sur la structure et les états du domaine d'application qui est décrit ; - des applications s'y connectent généralement pour mettre à jour les données de la BD. Une BD relationnelle est un ensemble de fichiers ou tables de données liées entre elles, en particulier par des données particulières, les identifiants (encore appelés clef primaire) 1. Un certain nombre de fonctions simples, comme la gestion de l espace de stockage pour les tables, sont prises en charge par le SGBD, indépendamment des applications qui traitent les données. Avantages des BD relationnelles : indépendance des données par rapport aux applications ; suppression des redondances de données : les requêtes SQL permettent de présenter ensemble des données appartenant à des tables différentes ; simplicité du modèle. Faiblesses des BD relationnelles : peu de types de données différents sont admis, et ils sont fixés à l'avance ; les transactions longues ou interactives sont mal prises en charge ; certaines contraintes doivent être prises en charge par les applications alors qu'elles auraient pu être prises en charge par le SGBD. Par ailleurs, la complexification des systèmes aujourd hui semble imposer une évolution des BD relationnelles vers la technologie objet. 2.3 BD relationnelle : les étapes de la conception Une BD se conçoit généralement en trois phases, qui sont autant de points d observation ou représentation des données relatives à un domaine de la vie réelle : 1 Plus d informations dans la partie 2.4 Les identifiants : la clef de voûte des BD relationnelles. Cécile GASS juillet 2007 cecile_gass@yahoo.com 2

1) un schéma entité-relation (ou entité-association) présente, dans une forme en principe compréhensible par un être humain, la façon dont les données de la BD sont structurées en différentes tables, leurs domaines de définition, les relations qui lient ces tables entre elles, les contraintes qui s'appliquent sur ces données et relations ; 2) le schéma entité-relation peut ensuite être traduit en un modèle relationnel, grâce, en particulier, à la théorie des ensembles. Ce modèle traduit les entités, relations et certaines contraintes du schéma entité-relation en tables concrètes ; 3) le modèle relationnel conduit, souvent par l intermédiaire d un logiciel, à la création effective de la BD, qui devient interrogeable par les applications, via SQL. Cette représentation précise comment sont physiquement stockées les données : taille des fichiers, fichiers d'indexe, positions, etc. Les développeurs de PMB mettent à disposition des utilisateurs, des informations à propos de la structure de la BD relationnelle sur laquelle est basé le logiciel ; en particulier : le fichier Répertoire_de_PMB\doc\noyau\scheme.gif présente le schéma entité-relation de la BD de PMB, il est en principe mis à jour à chaque nouvelle version de PMB ; dans PMB, via l onglet Administration, menu gauche Outils, le menu supérieur Description des tables donne le modèle relationnel de la BD de PMB. A titre d exemple, des parties du schéma entité-relation ; du modèle relationnel ; et de la BD relationnelle de PMB sont reproduites ci-dessous : Extrait du schéma entité-relation de la BD de PMB, version 3.0.21 Extrait du modèle relationnel de la BD PMB, version 3.0.21 (table exemplaires) Cécile GASS juillet 2007 cecile_gass@yahoo.com 3

Extrait de la BD de PMB, version 3.0.21 (table collections) 2.4 Les identifiants : la clef de voûte des BD relationnelles Véritable clef de voûte de toutes les BD relationnelles, les identifiants sont présents dans chaque table de chaque BD et sont toujours des nombres entiers, et uniques au sein de chaque table. Cécile GASS juillet 2007 cecile_gass@yahoo.com 4

En fait, chaque enregistrement d une table est reconnu par un tel identifiant unique (au sein de cette table). Et les relations entre les tables de la BD s établissent sur base de ces identifiants, comme l illustre le schéma ci-dessous, qui reprend : - un extrait (fictif) de deux notices de PMB, telles qu elles pourraient apparaître à l OPAC ou dans l interface administrateur de PMB ; - les extraits des tables (très partiellement reproduites) correspondant à ces notices, pour ce qui concerne les auteurs et les éditeurs, i.e. les tables de la BD de PMB impliquées sont : notices, publishers, responsibility et authors. Dans ce schéma, les colonnes des tables concernées correspondant aux identifiants sont systématiquement remplies en couleurs (rouge pour les identifiants des notices, vert pour les identifiants des auteurs et mauve pour les identifiants des éditeurs). Ce schéma montre par exemple que l auteur Langlois, Claudie est reconnu, dans la table authors par l identifiant (author_id) 2. PMB permet d associer un grand nombre d auteurs aux notices, grâce à la table responsability. Notre auteur est ainsi reconnu dans cette table par son identifiant (ici intitulé responsability_author), et est lié à la notice d identifiant responsability_notice égal à 1, ce qui correspond à la notice de titre Nimitz. On retrouve également cet auteur dans la notice d identifiant 2, puisque la table responsability y associe également cette notice à cet auteur. Ainsi, à chaque fois que PMB devra associer un auteur avec d autres données n appartenant pas à la table authors, il se servira de l identifiant de cet auteur (author_id = 2) pour mettre ces éléments en relation. Extrait des Notices telles qu elles pourraient apparaître dans un OPAC Numéro Not. Titre Auteur Editeur 1 Nimitz Robinson, Patrick; A. Michel Langlois, Claudie 2 L'adagio d'albino Favulier, Jacques; A. Michel; Forlane Langlois, Claudie Extrait de la table Notices notice_id tit1 ed1_id Ed2_id 1 Nimitz 1 2 L'adagio d'albino 1 2 Extrait de la table Publishers ed_id ed_name 1 A. Michel 2 Forlane Extrait de la table Responsability responsability_notice responsability_author 1 1 1 2 2 3 2 2 Extrait de la table Authors author_id author_name 1 Robinson, Patrick 2 Langlois, Claudie 3 Favulier, Jacques Comme nous pouvons le voir dans l exemple ci-dessus, la présence des identifiants permet d enregistrer dans des tables différentes, les données qui représentent par essence des entités Cécile GASS juillet 2007 cecile_gass@yahoo.com 5

différentes. Ainsi, la BD de PMB comporte une table notices, une table authors, une troisième table publishers, etc. ; ce sont les identifiants qui nous permettent de retrouver quel auteur, quel éditeur, vont avec quelle notice. Ces identifiants seront donc naturellement largement utilisés dans les requêtes SQL que nous allons voir maintenant. 3 SQL : éléments d information de base Nous avons déjà signalé qu il existait plusieurs SQL ; en réalité, les différences résident d avantage dans les performances pour les très grands volumes de données, ainsi que certaines fonctions ajoutées dans l une ou l autre des versions. Sur le fond, les commandes les plus utilisées ont la même signification à travers les différents langages SQL. Le travail présenté ici se base sur le langage MySQL (version 4.1.9). Cette partie énonce premièrement quelques prérequis concernant l accès à une BD dans MySQL et des fonctions de base ; décrit ensuite les commandes principales en SQL ; puis elle aborde la fonction de join entre tables ; et des fonctions d agrégation. Quelques requêtes et commandes typiques sont finalement présentées. Le lecteur trouvera également quelques références pour aller plus loin en fin de partie. 3.1 SQL : quelques prérequis sur l accès et des fonctions de base D une façon générale, nous allons voir dans cette partie comment modifier des données de la BD de PMB. ATTENTION : à l exception des requêtes de sélection, qui ne peuvent engendrer, au pire, qu un blocage temporaire de PMB lorsqu une requête retournant un très grand nombre de résultats est exécutée, il est TRES dangereux de modifier, via des requêtes SQL, le contenu de la BD. En effet, un certain nombre de règles encodées dans la partie applicative de PMB, garantit la cohérence de la base ; ces règles ne seront pas vérifiées si vous exécutez une requête qui va modifier la base ; vous risquez donc de la corrompre, et par la même, de perdre tout votre catalogue. Il est donc fortement conseillé d essayer les requêtes de mise à jour de la BD que vous souhaitez appliquer sur un PMB de TEST. 3.1.1 Les différentes façons d accéder à des tables de la BD de PMB Il est possible d interagir avec la BD de PMB, directement à partir du logiciel, par deux voies différentes : via les procédures d action s appliquant aux contenus des Paniers de PMB : le menu Gestion des procédures permet en effet, via des requêtes écrites en SQL, de visualiser, modifier, ou effacer des notices et/ou des exemplaires du catalogue 2, ou ; via les Actions personnalisables (de l onglet Administration, menu gauche Outils) : le bibliothécaire peut créer ici toute requête en SQL permettant d agir directement sur le contenu de la BD, pour virtuellement tout faire 3. Ceci permet par exemple de construire des requêtes permettant de sortir des inventaires pour le recollement ou le désherbage. Attention : si les requêtes sont exécutées directement dans PB, aucun saut de ligne n est admis entre le début et la fin de la requête (qui doit se terminer par ;). Si votre configuration le permet, vous pouvez accéder à la BD de PMB via l interface de MySQL. Lorsque l installation s est faite via EasyPHP, l accès se fait via le menu Administration d EasyPHP, en cliquant sur le menu GESTION BDD. L utilisateur n a plus qu à choisir la BD de PMB (par défaut, il s agit de bibli) pour accéder à l ensemble des tables et données contenues dans la BD. 2 Certaines procédures sont déjà définies dans PMB. 3 Quelques Actions personnalisables sont déjà encodées dans PMB. Cécile GASS juillet 2007 cecile_gass@yahoo.com 6

Enfin, lorsque PMB est installé sous Windows, il est possible d accéder à la BD de PMB via la fenêtre de commande DOS, par la commande c:\répertoire_où_est_installé_mysql\mysql u bibli pbibli (si PMB a été installé en respectant les paramètres par défaut). Cette interface n étant pas graphique, elle peut sembler beaucoup plus aride à utiliser, mais c est celle qui est la moins gourmande en ressources 3.1.2 Des fonctions de base en SQL Quelques remarques préliminaires : les commandes répertoriées dans cette partie sont essentiellement utiles lorsque MYSQL est accédé via une fenêtre de commande DOS ; par défaut, les résultats d'une requête sont présentés en tableau, dont la 1ère ligne contient le nom des colonnes participant à la requête. Après les résultats, MySQL indique le nombre de lignes concernées et le temps 'logiciel' d'exécution de la requête 4 ; les mots des requêtes sont insensibles à la casse utilisée, mais les noms des bases de données, tables et colonnes peuvent l'être (en fonction du système d'exploitation, p.e. sur Unix, la casse est importante) ; toutes les commandes SQL doivent se terminer par point-virgule. Une requête peut être écrite sur plusieurs lignes : MySQL ne tente d'exécuter une requête que lorsqu'il trouve un ; une date doit être encodée en suivant le format AAAA-MM-JJ. Le tableau ci-dessous répertorie quelques commandes pouvant être utiles : Commande Mysql mysql --help mysql -h hote -u utilisateur -p nomdelabase quit Action donne la liste des options possibles pour mysql (ou de toute autre fonction) connection au serveur MySQL (nomdelabase est optionnel). Le mot de passe sera demandé par la commande quitte MySQL \c annule une requête SQL en cours d'édition USE nomdelabase utilise spécifiquement la base de donnée nomdelabase. Si la commande est réussie, mysql retourne le message database changed SHOW DATABASES SHOW TABLES CREATE nomdelabase DATABASE CREATE TABLE nomtable (nomcol1 TYPE, nomcol2 TYPE, etc.) DESCRIBE nomtable LOAD DATA LOCAL INFILE "nomfichier.txt" INTO TABLE nomtable montre les BDs existantes sur le serveur MySQL montre les tables déjà crées dans la base utilisée crée la base de données nomdelabase. crée la table nomtable : il faut indiquer le nom de chaque colonne de la table (i.e. nomcol1, etc.), et préciser son type 5 ; peuvent aussi être précisés : une valeur par défaut ; si une valeur doit être incrémentée, etc. indique les colonnes ; leurs types ; si aucune valeur n'est encore encodée ; s'il s'agit d'une clef (ou identifiant) ; la valeur par défaut éventuellement encodée, etc. de la table nomtable insère directement le contenu d'un fichier dans la table nomtable qui doit déjà exister 6 * remplace toutes les colonnes d une table (p.e. SELECT *) 4 Il ne s agit que d une indication, et n est pas lié au temps d'exécution machine 5 Quelques types courants : text, varchar, enum, etc. 6 Le fichier doit respecter l ordre, le nombre, et le type de données attendus dans la table. Cécile GASS juillet 2007 cecile_gass@yahoo.com 7

3.2 SQL : les 4 commandes principales Les 4 commandes principales en langage SQL sont : SELECT, UPDATE, INSERT et DELETE, que nous allons aborder successivement. 3.2.1 La commande SELECT La commande SELECT permet de visualiser le contenu ou une partie de celui-ci d'une ou plusieurs 7 tables d'une BD relationnelle. Une requête SELECT doit respecter la syntaxe suivante : SELECT liste_colonnes FROM nomtable WHERE liste_conditions 8, où : liste_colonnes est la liste des colonnes qui apparaîtront dans la réponse à la requête. S il y a plusieurs colonnes, elles doivent être séparées par des virgules ; nomtable indique sur quelle table la requête SELECT va porter ; liste_conditions est une liste de conditions, séparées par des virgules, que doivent vérifier les valeurs de la table pour répondre à la requête SELECT. Ces conditions peuvent arborer des opérateurs de comparaisons (p.e. pour n afficher que les personnes d une table joueurs pour lesquelles l âge est >=5) ; des opérateurs logiques entre colonnes qui sont : AND, OR, NOT (n affichera que les enregistrements ne vérifiant pas la condition qui succède à cet opérateur) et XOR (n affiche que les résultats qui vérifient uniquement l une des 2 conditions séparées par l opérateur) ; p.e. pour n afficher que les personnes d une table joueurs pour lesquelles l âge est >=5 ET dont l état de santé est bon. A propos de liste_conditions : sont listées ici les principales conditions, en dehors des opérateurs de comparaison et des opérateurs logiques entre colonnes, susceptibles d être utilisées dans les requêtes SQL : IN et NOT IN : permet de spécifier un intervalle de valeurs possibles (ou impossibles si NOT IN est utilisé). La syntaxe est : IN (valeur1, valeur2, valeur3) (ou NOT IN ). Attention, si les valeurs de l intervalle considéré sont du texte, il faudra écrire : IN ( valeur1, valeur2, valeur3 ). Ce type de condition est utile p.e. pour n afficher que les personnes de la table joueurs qui habitent IN ( Bruxelles, Gand, Namur ). LIKE et NOT LIKE : ce type de condition est utilisé en combinaison avec % pour représenter une chaîne de caractère de longueur quelconque ; ou avec _ pour remplacer un caractère unique. La syntaxe est : NOT LIKE 'chainedecarac%' ; une requête utilisée avec cette condition retournera tous les enregistrements où les valeurs d une colonne particulière ne commencent pas par chainedecarac. Ce type de condition est essentiellement utilisé pour des valeurs de type chaîne de caractères, et requiert dans ce cas aussi l utilisation de guillemets 9. La condition LIKE 'b%' permet p.e. de retrouver toutes les personnes de la table joueurs dont le nom commence par b ; BETWEEN : ce type de condition est utilisé pour retrouver les enregistrements dont la valeur d une colonne se situe entre deux valeurs extrèmes. La syntaxe est : BETWEEN 7 AND 10. A propos de liste_colonnes les alias : l utilisation d alias permet de faire afficher les résultats des requêtes en SQL avec des intitulés plus explicites que les noms des colonnes de la table concernée. La 7 Les requêtes s appliquant sur plusieurs tables simultanément sont abordées dans la partie 3.3 la fonction de join. 8 Les fonctions d agrégat GROUP BY liste de colonnes, HAVING liste de conditions et ORDER BY liste de colonnes peuvent être ajoutées à cette syntaxe. Ces fonctions sont abordées dans la partie 3.4 SQL : quelques fonctions d agrégat. 9 Attention, il convient d utiliser les guillemets simples. Cécile GASS juillet 2007 cecile_gass@yahoo.com 8

syntaxe est : vrai_nom_colonne AS NouveauNomPlusExplicite ; p.e. jname AS NomJoueur permet d afficher l intitulé NomJoueur plutôt que jname pour les joueurs répondant à une requête ; utilisation du mot réservé DISTINCT : ce mot réservé permet de supprimer les doublons des résultats à afficher répondant à une requête. Il suffit pour cela d ajouter ce mot avant l énumération de liste_colonnes. Exemples de requête SELECT La requête suivante sélectionne les titres et nombre de pages des documents catalogués qui arborent moins de 50 pages (pour les lecteurs débutants!). Seront affichés les titres des documents concernés et leur nombre de pages respectifs, sous les intitulés Titre et NombreDePages. SELECT tit1 AS Titre, npages AS NombreDePages FROM notices WHERE npages < 100; La requête suivante sélectionne les titres comportant le mot Loire et ayant plus de 50 pages : SELECT tit1, npages FROM notices WHERE tit1 like ' %Loire%' AND npages > 50; La requête suivante sélectionne les différentes dates de naissance et mort des auteurs du catalogue : SELECT DISTINCT author_date FROM authors; Remarque : des fonctions assez élaborées de formatage des chaînes de caractères sont également susceptibles d être utilisées ; elles sont décrites dans la partie 3.4 SQL : quelques fonctions d agrégat et autres requêtes avancées. 3.2.2 La commande UPDATE La commande UPDATE permet de mettre à jour le contenu ou une partie de celui-ci d'une ou plusieurs 10 tables d une BD relationnelle. Attention : l utilisation de la commande UPADTE peut entièrement corrompre la BD de PMB ; elle doit être utilisée avec une grande précaution, préférablement sur un PMB de test. Une requête UPDATE doit respecter la syntaxe suivante : UPDATE nomtable SET mises_a_jour_col WHERE liste_conditions 11, où : nomtable indique sur quelle table la requête UPDATE va porter ; mises_a_jour_col indique les colonnes à modifier et les nouvelles valeurs qu il faut leur attribuer. La syntaxe est : nom_col1_a_modifier = nouvelle_valeur1, nom_col2_a_modifier = nouvelle_valeur2, etc. Les chaînes de caractères requièrent l utilisation de guillemets 12 ; liste_conditions est une liste de conditions, séparées par des virgules, que doivent vérifier les valeurs de la table pour répondre à la requête UPDATE. Les mêmes conditions que pour la commande SELECT peuvent être utilisées. Exemple de requête UPDATE La requête suivante remplace le ed_pays par la valeur France pour tous les éditeurs dont la ed_ville vaut Paris. UPDATE publishers SET ed_pays='france' WHERE ed_ville='paris'; 10 Les requêtes s appliquant sur plusieurs tables simultanément sont abordées dans la partie 3.3 la fonction de join. 11 Les fonctions d agrégat GROUP BY liste de colonnes, HAVING liste de conditions et ORDER BY liste de colonnes peuvent être ajoutées à cette syntaxe. Ces fonctions sont abordées dans la partie 3.4 SQL : quelques fonctions d agrégat et autres requêtes avancées. 12 Attention, il convient d utiliser les guillemets simples. Cécile GASS juillet 2007 cecile_gass@yahoo.com 9

3.2.3 La commande INSERT La commande INSERT permet d ajouter un enregistrement où certaines valeurs de celui-ci à une table d une BD relationnelle ; elle peut aussi créer une nouvelle table (voir plus bas). L utilisation de la commande INSERT nécessite de bien connaître la table dans laquelle l enregistrement doit être inséré, à la fois pour l ordre des colonnes et le type de données à insérer. Une requête INSERT doit respecter la syntaxe suivante : INSERT INTO nomtable (liste_colonnes) VALUES (liste_valeurs), où : nomtable indique sur quelle table la requête INSERT va porter ; liste_colonnes indique les colonnes, séparées par des virgules, pour lesquelles des valeurs seront insérées ; liste_valeurs est la liste des valeurs à attribuer à l enregistrement, séparées par des virgules, et dans le même ordre que la liste_colonnes. Les chaînes de caractères requièrent l utilisation de guillemets 13. Exemple de requête INSERT La requête suivante insère l auteur Vargas, Fred, avec l identifiant 50, le type personne physique (qui est connu par l identifiant 70), sans rejet, date de naissance, ni renvoi (donc 0), site web ni commentaire : INSERT INTO authors (author_id, author_type, author_name, author_rejete, author_date, author_see, author_web, index_author, author_comment) values (50, '70', 'Vargas, Fred', '', '', 0, '', '', ''); Attention : nous insérons ici un auteur ayant comme identifiant 50. Cette commande aurait échoué si un auteur reconnu par cet identifiant existait déjà dans la BD ; cette opération nécessite donc d aller vérifier quel est le dernier identifiant utilisé dans cette table 14. 3.2.4 La commande DELETE La commande DELETE permet d effacer un ou plusieurs enregistrement(s) d'une ou plusieurs 15 tables d une BD relationnelle. Attention : l utilisation de la commande DELETE peut entièrement corrompre la BD de PMB (p.e. en effaçant un enregistrement dont l identifiant est utilisé dans une autre table) ; elle doit être utilisée avec une grande précaution, préférablement sur un PMB de test. Une requête DELETE doit respecter la syntaxe suivante : DELETE FROM nomtable WHERE liste_conditions 16, où : nomtable indique sur quelle table la requête DELETE va porter ; liste_conditions est une liste de conditions, séparées par des virgules, que doivent vérifier les valeurs de la table pour répondre à la requête DELETE. Les mêmes conditions que pour la commande SELECT peuvent être utilisées. Exemple de requête DELETE La requête suivante efface de la table authors l auteur Vargas, Fred inséré précédemment. 13 Attention, il convient d utiliser les guillemets simples. 14 Pour accéder au contenu des tables de la BD de PMB, voir partie 3.1 SQL : quelques prérequis sur l accès et des fonctions de base. 15 Les requêtes s appliquant sur plusieurs tables simultanément sont abordées dans la partie 3.3 la fonction de join. 16 Les fonctions d agrégat GROUP BY liste de colonnes, HAVING liste de conditions et ORDER BY liste de colonnes peuvent être ajoutées à cette syntaxe. Ces fonctions sont abordées dans la partie 3.4 SQL : quelques fonctions d agrégat et autres requêtes avancées. Cécile GASS juillet 2007 cecile_gass@yahoo.com 10

DELETE FROM authors WHERE author_name ='Vargas, Fred'; Attention : nous effaçons ici un auteur ayant comme nom Vargas, Fred. Si l identifiant de cet auteur avait été utilisé dans une autre table (p.e. la table notices), nous aurions par cette action, corrompu la BD de PMB. 3.3 SQL : la fonction de join et les sous-requêtes Nous avons vu que l identifiant jouait, dans les BD relationnelles, un rôle fondamental de liant entre les tables ; c est lui qui va, p.e., nous permettre de relier les auteurs, éditeurs, etc. aux notices dans lesquelles ils sont censés apparaître. Du point de vue de la base de données, cette liaison s établit grâce aux fonctions de join et aux sous-requêtes, qui permettent d interroger simultanément deux (ou plus) tables. Cette partie donne d abord quelques prérequis qui nous seront utiles pour présenter ensuite les différentes fonctions de join existant en Mysql ; en dernière partie, nous verrons brièvement les sous-requêtes. 3.3.1 Utilisation des alias pour interroger deux tables simultanément Nous avons vu que les alias permettaient de faire afficher les résultats d une requête précédés de noms plus explicites que les noms des colonnes utilisés dans les tables de la BD 17. Nous allons voir ici un autre rôle utile des alias : un alias peut remplacer le nom d une table. Dès qu une requête fait appel à plusieurs tables simultanément, il est préférable de faire précéder chaque nom de colonne prenant part à la requête, du nom de la table de laquelle elle est issue, suivi d un point 18. Ainsi, si nous voulons parler de la colonne author_name de la table authors, nous préférerons utiliser authors.author_name pour désigner cette colonne dans notre requête. Cependant, pour raccourcir les requêtes, il est possible de remplacer le nom des tables par des alias, sorte de surnom de table, et qui seront beaucoup plus courts que le nom des tables elles-mêmes. La syntaxe est : pour définir l alias dans la requête : nomtable AS n ; où n est l alias de la table nomtable 19 ; pour utiliser l alias dans la requête : n.nomcolonne ; où nomcolonne est une colonne de la table nomtable qui participe à la requête. Exemple d utilisation d un alias dans une requête Nous pouvons réécrire notre première requête : SELECT tit1 AS Titre, npages AS NombreDePages FROM notices WHERE npages < 100; en utilisant l alias n pour la table notices : SELECT n.tit1 AS Titre, n.npages AS NombreDePages FROM notices AS n WHERE n.npages < 100; Evidemment, pour une requête simple portant sur une seule table, l utilisation d alias paraît compliquer les choses nous allons en fait voir comme il est utile dans la suite! 3.3.2 Les commandes join La commande join permet d interroger des tables, le plus souvent 2, simultanément, pour trouver les enregistrements, appartenant aux tables impliquées, qui sont liés par leurs 17 Voir la partie 3.2.1 La commande SELECT. 18 Cette bonne habitude trouvera tout son sens dès lors que plusieurs tables impliquées dans une requête de join arborent des colonnes portant le même nom. Dans ce cas, l alias est obligatoire, afin que le SGBD sache à quelle table appartiennent les colonnes homonymes. 19 Bien évidemment, l utilisateur est libre de choisir un alias de son choix! Cécile GASS juillet 2007 cecile_gass@yahoo.com 11

identifiants. Ainsi, on retrouvera généralement dans l une des tables impliquées, une colonne prenant pour valeurs, les identifiants de l autre (ou des autres) table impliquée. Exemple : retrouver le 1 er éditeur d une notice particulière dans PMB Nous avons vu, dans le schéma de la partie 2.4 Les identifiants : la clef de voûte des BD relationnelles, que, dans la BD de PMB : les coordonnées des éditeurs étaient enregistrées dans la table publishers. Un identifiant est associé à chaque éditeur ; il est stocké dans la colonne ed_id ; d autre part, la table notices recueille une majorité d information concernant les notices du catalogue. Dans cette table, la colonne ed1_id prend comme valeurs les identifiants enregistrés dans la table publishers, dans la colonne ed_id. Ainsi, la notice d identifiant notice_id 1, de titre Nimitz a pour 1 er éditeur, l éditeur d identifiant ed1_id égale à 1. Dans la table publishers, l éditeur d identifiant ed_id égale à 1 correspond à l éditeur de nom A. Michel. Nous aurions pu retrouver cette correspondance à l aide d une requête join mais il existe plusieurs façons d utiliser la commande join, ce que nous allons voir à présent. Les différentes commandes join En réalité, la première commande join ne fait pas appel à la commande join ; elle combine l interrogation de deux tables, et matérialise le lien d identifiants dans la commande where. La syntaxe est la suivante, en utilisant les alias pour remplacer les noms de tables : SELECT liste_colonnes FROM nomtable1 AS n1, nomtable2 AS n2 WHERE n1.colid_ref_t1=n2.collid_t2 AND liste_conditions 20, où : liste_colonnes est la liste des colonnes, séparées par des virgules, susceptibles d appartenir à l une et à l autre table, qui apparaîtront dans la réponse à la requête ; nomtable1 indique la première table sur laquelle va porter la requête SELECT, et nomtable2 est la seconde table concernée ; la condition n1.colid_ref_t1=n2.collid_t2, après le mot clef WHERE représente le lien qui existe entre les 2 tables, i.e. les égalités d identifiants que les enregistrements des deux tables devront vérifier pour répondre à la requête : collid_ref_t1 est la colonne de la table nomtable1 accueillant comme valeurs les identifiants de la table nomtable2 ; collid_t2 est la colonne des identifiants de la table nomtable2. Cette condition est obligatoire pour une commande de join ; liste_conditions est une liste de conditions, séparées par des virgules, que doivent vérifier les valeurs des tables pour répondre à la requête SELECT. Les mêmes conditions que pour la commande SELECT simple peuvent être utilisées. Cette commande n affiche que les enregistrements des 2 tables ayant en commun l identifiant repéré par la condition n1.colid_ref_t1=n2.collid_t2 : les enregistrements de la table nomtable1 n ayant pas comme valeur pour la colonne colid_ref_t1 la même valeur pour l un des enregistrements de la table nomtable2 n apparaîtront pas dans les résultats, et ; les enregistrements de la table nomtable2 n ayant pas comme identifiant (colonne collid_t2) une même valeur de la colonne colid_ref_t1 de la table nomtable1 n apparaîtront pas non plus dans les résultats à la requête de join entre ces tables. Par contre, Mysql permet de faire apparaître ces enregistrements exclus, lorsque l une des (autres) commandes de join est utilisée 21 ; plus précisément : 20 Les fonctions d agrégat GROUP BY liste de colonnes, HAVING liste de conditions et ORDER BY liste de colonnes peuvent être ajoutées à cette syntaxe. Ces fonctions sont abordées dans la partie 3.4 SQL : quelques fonctions d agrégat. 21 Nous ne mentionnons pas ici les commandes INNER JOIN (dont les résultats sont les mêmes que ceux de la première commande join décrite dans ce document : celle qui n utilise justement pas la commande join mais qui utilise directement la condition d égalité des identifiants entre les 2 tables) ; STRAIGHT_JOIN (est semblable à la commande JOIN mais la 1 ère table rencontrée est toujours lue en Cécile GASS juillet 2007 cecile_gass@yahoo.com 12

lorsque la commande FULL OUTER JOIN est utilisée : les enregistrements des deux tables impliquées apparaissent dans les résultats de la requête, mais les valeurs NULL sont renseignées pour tous les enregistrements pour lesquels un identifiant n existe que dans une des deux tables ; lorsque la commande LEFT OUTER JOIN est utilisée : tous les enregistrements de la 1 ère table rencontrée dans la requête apparaissent dans les résultats, et la valeur NULL apparaît pour tous les enregistrements de la seconde table pour lesquels un identifiant n existe que dans la 1 ère table ; lorsque la commande RIGHT OUTER JOIN est utilisée : tous les enregistrements de la seconde table rencontrée dans la requête apparaissent dans les résultats, et la valeur NULL apparaît pour tous les enregistrements de la 1 ère table pour lesquels un identifiant n existe que dans la seconde table. Pour ces trois commandes OUTER JOIN, la syntaxe, différente de la première commande décrite, est la suivante : SELECT liste_colonnes FROM nomtable1 AS n1 XXX OUTER JOIN nomtable2 AS n2 ON n1.colid_ref_t1=n2.collid_t2 WHERE liste_conditions 22, où : liste_colonnes est la liste des colonnes, séparées par des virgules, susceptibles d appartenir à l une ou à l autre table, qui apparaîtront dans la réponse à la requête ; nomtable1 indique la première table sur laquelle va porter la requête SELECT, et nomtable2 est la seconde table concernée ; XXX peut prendre au choix une valeur parmi les 3 citées plus haut, i.e. FULL, LEFT ou RIGHT en fonction des résultats souhaités ; ON n1.colid_ref_t1=n2.collid_t2 a le même rôle que celui qui est décrit dans la syntaxe de la première commande join décrite ; liste_conditions est une liste de conditions, séparées par des virgules, que doivent vérifier les valeurs des tables pour répondre à la requête SELECT. Les mêmes conditions que pour la commande SELECT simple peuvent être utilisées. La 1 ère forme de join sera utilisée lorsqu il s agit de reconstituer des enregistrements complets de données réparties entre plusieurs tables (p.e. les auteurs de certaines notices) ; l une ou l autre des autres commandes de join seront utilisées lorsqu il s agira, au contraire, d identifier les enregistrements n appartenant qu à l une ou l autre des tables impliquées (p.e. pour identifier les auteurs qui ne sont utilisés dans aucune notice). Exemples de requêtes utilisant des commandes JOIN La requête suivante affiche les titres et les auteurs des notices dont le nom d auteur comporte les lettres el : SELECT n.tit1, a.author_name FROM notices AS n, authors AS a, responsability AS r WHERE n.notice_id = r.responsability_notice AND r.responsability_author = a.author_id AND author_name like '%el%'; Cette requête nécessite la participation de 3 tables pour pouvoir associer un auteur à une notice. premier. Cette condition ne doit être utilisée que lorsque MySql commet une erreur de performance en commençant l exécution de la requête par la seconde table) ; ni NATURAL JOIN (qui ne concernent que les colonnes qui existent dans les 2 tables impliquées). Plus d information à propos de ces commandes sont disponibles sur http://dev.mysql.com/doc/refman/5.0/fr/join.html, http://dev.mysql.com/doc/refman/5.0/fr/left-join-optimization.html et http://www.laltruiste.com/document.php?rep=courssql&page=cmd_jointure&suivant.x=6&suivant.y=8 22 Les fonctions d agrégat GROUP BY liste de colonnes, HAVING liste de conditions et ORDER BY liste de colonnes peuvent être ajoutées à cette syntaxe. Ces fonctions sont abordées dans la partie 3.4 SQL : quelques fonctions d agrégat. Cécile GASS juillet 2007 cecile_gass@yahoo.com 13

La requête suivante affiche les identifiants, le titre des notices, et le descripteur pour les notices ayant été indexées avec un descripteur de thesaurus commençant par Littérature : SELECT n.notice_id, n.tit1, ca.libelle_categorie FROM notices AS n, notices_categories AS nc, noeuds AS no, categories AS ca WHERE n.notice_id = nc.notcateg_notice AND nc.num_noeud = no.id_noeud AND no.id_noeud = ca.num_noeud AND ca.libelle_categorie LIKE 'Littérature%'; Cette requête est relativement simple, bien qu elle mette en jeu 4 tables différentes (notices, categorie, nœuds et notice_categories) ; il convient de bien penser à ajouter toutes les conditions de join requises (3 conditions pour 4 tables). La requête suivante affiche les éditeurs définis dans le catalogue mais qui n appartiennent encore à aucune notice, avec suppression des doublons : SELECT DISTINCT p.ed_name FROM publishers AS p LEFT OUTER JOIN notices AS n ON p.ed_id = n.ed1_id; La requête suivante remplace la section des exemplaires dont le code barres commence par 33700004513 et ayant comme section Romans Jeunes par la section correspondant à Documentaires Jeunes : SELECT idsection FROM docs_section WHERE section_libelle= 'Documentaires Jeunes'; UPDATE exemplaires AS e, docs_section AS ds SET e.expl_section=25 WHERE e.expl_section = ds.idsection AND e.expl_cb like '33700004513%' AND ds.section_libelle like 'Romans Jeu%'; Cette requête se déroule en 2 temps : recuperation de l idsection de la table docs_section correspondant à Documentaires Jeunes (le résultat de cette 1 ère requête est 25) ; puis mise à jour, dans la table exemplaires de la section, pour les enregistrements qui satisfont aux 2 conditions énoncées. 3.3.3 Utilisation des sous-requêtes Les sous-requêtes permettent de sélectionner uniquement les enregistrements répondant à une liste de conditions d une table, et à une autre liste de conditions d une autre table ou d un sous-ensemble de la table impliquée. Deux types de sous-requêtes existent ; celui qui se base sur la commande EXISTS (ou NOT EXISTS), et celui qui inclut dans la liste de conditions de la clause WHERE, une requête SELECT qui s applique à une autre table, ou un sous ensemble de la table impliquée ; nous allons les aborder successivement ici. 3.3.3.1 La sous-requête avec la commande EXISTS (ou NOT EXISTS) Seule l existence (ou l absence) d enregistrements répondant aux critères de la sous requête contrôlée par la commande EXISTS (ou NOT EXISTS) permet d afficher des résultats à la requête principale, soit : pour la commande EXISTS : si aucun enregistrement ne répond à la sous requête contrôlée par la commande EXISTS, la requête principale ne retourne aucun résultat ; pour la commande NOT EXISTS : aucun enregistrement ne doit répondre à la sous requête contrôlée par la commande NOT EXISTS pour que la requête principale retourne des résultats. Autrement dit : la requête impliquant la commande EXISTS permet de déterminer si un enregistrement, caractérisé par son identifiant, se retrouve à la fois dans la table de la sous requête et dans celle de la requête principale. Notons qu une même table peut également être employée, dans la requête et la sous requête, s il s agit de retrouver un sous-ensemble d enregistrements de cette table répondant à certains critères dans la requête principale et à d autres dans la sous requête ; Cécile GASS juillet 2007 cecile_gass@yahoo.com 14

la requête impliquant la commande NOT EXISTS permet de déterminer si un enregistrement, caractérisé par son identifiant, est dans la table de la requête principale mais pas dans celle de la sous requête. Notons qu une même table peut également être employée, dans la requête et la sous requête, s il s agit de retrouver un sous-ensemble d enregistrements de cette table répondant à certains critères dans la requête principale mais ne remplissant pas d autres conditions exprimées dans la sous requête. La sous requête avec la commande (NOT)EXISTS forme généralement l une des conditions vérifiées par le mot réservé WHERE d une requête quelconque. Exemples de requêtes utilisant la commande (NOT)EXISTS La requête suivante utilise la commande NOT EXISTS ; elle retrouve les lecteurs qui n appartiennent encore à aucun groupe : SELECT e.empr_cb, e.empr_nom, e.empr_prenom FROM empr AS e WHERE NOT EXISTS (SELECT * FROM empr_groupe AS eg WHERE e. id_empr=eg. empr_id); La commande EXISTS pourrait aussi être utilisée pour constituer un panier avec les descripteurs du thesaurus qui font l objet d un voir aussi, p.e. pour s assurer que la réciproque est également vraie (i.e., si une relation voir aussi est ajoutée au descripteur A vers le descripteur B ; le descripteur B a-t-il aussi une relation voir aussi vers le descripteur A?). Notons que PMB a amélioré la gestion des relations voir aussi dans le thesaurus depuis sa version 2.2 : aujourd hui, le bibliothécaire a la possibilité d imposer qu une relation voir aussi ajoutée à un descripteur devienne réciproque ; il suffit, dans la définition de ce descripteur, de cocher la petite case se trouvant en regard de la définition d une relation voir aussi, comme le montre l écran reproduit ci-dessous : La requête suivante retrouve tous les descripteurs du thesaurus pour lesquels une relation voir aussi a été définie : SELECT c.num_noeud, c.libelle_categorie FROM categories AS c WHERE EXISTS (SELECT * FROM voir_aussi AS v WHERE c.num_noeud=v.num_noeud_orig); 3.3.3.2 La sous-requête SELECT Une requête comportant une sous requête SELECT ne vérifie plus seulement l existence d au moins un enregistrement vérifiant certaines conditions (comme dans les requêtes comportant la commande EXISTS), mais retrouve le ou les enregistrements (ou des champs particuliers de ces enregistrements) vérifiant les conditions définies dans la sous requête. Cécile GASS juillet 2007 cecile_gass@yahoo.com 15

La sous requête SELECT, dont la syntaxe est la même que celle décrite dans la partie 3.2.1La commande SELECT, peut être utilisée partout où une colonne peut se retrouver, p.e. cela peutêtre une condition WHERE ou l un des résultats à afficher d une requête principale SELECT, la nouvelle valeur d une colonne dans une requête UPDATE, etc. Exemple de requêtes utilisant une sous requête SELECT Nous pourrions transformer les 2 requêtes qui nous avaient été nécessaires à la fin de la partie 3.3.2 Les commandes join pour «remplacer la section des exemplaires dont le code barres commence par 33700004513 et ayant comme section Romans Jeunes par la section correspondant à Documentaires Jeunes» par une seule requête, qui ferait l inverse des deux requêtes précédentes (i.e. remplacement de la section Documentaires Jeunes par la section Romans Jeunes) : UPDATE exemplaires AS e SET e.expl_section= (SELECT ds1.idsection FROM docs_section AS ds1 WHERE ds1.section_libelle= 'Documentaires Jeunes') WHERE e.expl_cb like '33700004513%'; 3.4 SQL : quelques fonctions d agrégat et autres fonctions avancées Un certain nombre de commandes ou fonctions peuvent également être utilisées dans les requêtes : des fonctions de regroupement ou de tri ; arithmétiques ; de traitement de chaînes de caractères, qui sont abordées ci-après. 3.4.1 Fonctions de regroupement ou de tri 3.4.1.1 Fonction ORDER BY liste_colonnes DESC/ASC La fonction ORDER BY liste_colonnes DESC/ASC, ajoutée en fin de requête, classe les résultats, sur les colonnes, séparées par des virgules, successivement indiquées dans la liste_colonnes (i.e. : le classement se fait d abord sur la 1 ère colonne de la liste, puis, à valeurs égales de cette colonne, sur la seconde colonne de la liste, etc.). Si l option DESC (resp ASC) est utilisée, les résultats seront classés en ordre alphabétique / numérique descendant (resp ascendant) ; l option ASC est utilisée par défaut. Chaque colonne de la liste_colonne est susceptible d utiliser une option DESC/ASC différente (i.e. il est possible de classer les résultats de colonne1 en ordre ascendant ; et ceux de la colonne2, en ordre ascendant). Attention : pour pouvoir utiliser cette option, la requête doit obligatoirement faire afficher au minimum les colonnes indiquées dans la liste_colonnes liée à la fonction ORDER BY. Exemple de requête utilisant la fonction ORDER BY : la requête suivante affiche les noms et prénoms des lecteurs par ordre alphabétique inverse. SELECT empr_nom, empr_prenom FROM empr ORDER BY empr_nom DESC ; 3.4.1.2 Fonction GROUP BY liste_colonnes La fonction ORDER BY liste_colonnes DESC/ASC, ajoutée en fin de requête, classe les résultats, sur les colonnes, séparées par des virgules, successivement indiquées dans la liste_colonnes (i.e. : le classement se fait d abord sur la 1 ère colonne de la liste, puis, à valeurs égales de cette colonne, sur la seconde colonne de la liste, etc.). Si l option DESC (resp ASC) est utilisée, les résultats seront classés en ordre alphabétique / numérique descendant (resp ascendant) ; l option ASC est utilisée par défaut. Chaque colonne de la liste_colonne est susceptible d utiliser une option DESC/ASC différente (i.e. il est Cécile GASS juillet 2007 cecile_gass@yahoo.com 16

possible de classer les résultats de colonne1 en ordre ascendant ; et ceux de la colonne2, en ordre ascendant). Attention : pour pouvoir utiliser cette option, la requête doit obligatoirement faire afficher au minimum les colonnes indiquées dans la liste_colonnes liée à la fonction ORDER BY. Exemple de requête utilisant la fonction ORDER BY : la requête suivante affiche les noms et prénoms des lecteurs par ordre alphabétique inverse. SELECT empr_nom, empr_prenom FROM empr ORDER BY empr_nom DESC ; 3.4.1.3 Fonction COUNT(nom_colonne) La fonction AVG calcule la valeur moyenne des valeurs de la colonne nom_colonne des enregistrements répondant à la requête. Exemple de requête utilisant la fonction AVG : la requête suivante détermine l année de naissance moyenne des lecteurs encodés dans PMB. SELECT AVG(empr_year) FROM empr WHERE empr_year <> 0; 3.4.1.4 Fonction HAVING (nom_colonne) La fonction AVG calcule la valeur moyenne des valeurs de la colonne nom_colonne des enregistrements répondant à la requête. Exemple de requête utilisant la fonction AVG : la requête suivante détermine l année de naissance moyenne des lecteurs encodés dans PMB. SELECT AVG(empr_year) FROM empr WHERE empr_year <> 0; SELECT C1, C2, C3, COUNT (*) FROM TABLE WHERE C1= Value1 AND C2= Value2 AND C3= Value3 GROUP BY C1, C2, C3 SELECT C1, C2, C3, COUNT (*) FROM TABLE GROUP BY C1, C2, C3 HAVING COUNT (*) > 1 Cécile GASS juillet 2007 cecile_gass@yahoo.com 17

3.4.2 Fonctions arithmétiques MySQL supporte quelques fonctions arithmétiques s appliquant aux colonnes de résultats des requêtes qui concernent des grandeurs mathématique ; les principales sont présentées ici. Attention : ces fonctions ne peuvent être combinées avec des noms de colonnes, car elles s appliquent sur des ensembles d enregistrements, il n est donc pas possible d accéder simultanément à une valeur calculée sur un ensemble d enregistrements, et aux valeurs individuelles de ces enregistrements. Fonction MAX(nom_colonne) La fonction MAX affiche la valeur la plus grande de la colonne nom_colonne des enregistrements répondant à la requête. Exemple de requête utilisant la fonction MAX : la requête suivante détermine l année de naissance du plus jeune lecteur fréquentant la bibliothèque. SELECT MAX(empr_year) FROM empr WHERE empr_year <> 0; Fonction MIN(nom_colonne) La fonction MIN affiche la plus petite valeur de la colonne nom_colonne des enregistrements répondant à la requête. Exemple de requête utilisant la fonction MIN : la requête suivante détermine l année de naissance du lecteur le plus âgé qui fréquente la bibliothèque. SELECT MIN(empr_year) FROM empr WHERE empr_year <> 0; Fonction AVG(nom_colonne) La fonction AVG calcule la valeur moyenne des valeurs de la colonne nom_colonne des enregistrements répondant à la requête. Exemple de requête utilisant la fonction AVG : la requête suivante détermine l année de naissance moyenne des lecteurs encodés dans PMB. SELECT AVG(empr_year) FROM empr WHERE empr_year <> 0; Fonction SUM(nom_colonne) La fonction SUM additionne les valeurs de la colonne nom_colonne des enregistrements répondant à la requête. 3.4.3 Traitement de chaînes de caractères MySQL supporte quelques fonctions permettant de faire du traitement de chaînes de caractères s appliquant aux colonnes de résultats des requêtes qui concernent des chaînes de caractères. Certaines sont présentées ici ; le lecteur est invité à consulter le manuel de MySQL pour une liste exhaustive de ce type de commandes. Fonction CONCAT(liste_colonnes) La fonction CONCAT(liste_colonnes) affiche les valeurs concaténées des colonnes, séparées par des virgules, de la liste_colonnes des enregistrements répondant à la requête. Exemple de requête utilisant la fonction CONCAT : la requête suivante concatène les noms et prénoms des lecteurs dont les noms commencent par la lettre s : SELECT CONCAT(empr_nom, empr_prenom) FROM empr WHERE empr_nom like 's%'; Fonction SUBSTR(nom_colonne, pos_initiale, longueur) Cécile GASS juillet 2007 cecile_gass@yahoo.com 18

La fonction SUBSTR(nom_colonne, pos_initiale, longueur) permet d extraire une partie de chaque valeur d une colonne nom_colonne, de type chaîne de caractères, répondant à une requête ; cette partie est déterminée par la position du 1 er caractère de la chaîne de caractère qu il faudra extraire de chaque valeur, et sa longueur (i.e. nombre de caractères). Exemple de requête utilisant la fonction SUBSTR : la requête suivante extrait 6 caractères de la chaîne concaténée des nom et prénom des lecteurs dont les noms commencent par la lettre s. Ceci pourrait p.e. permettre de créer des login : SELECT SUBSTR(CONCAT(empr_nom, empr_prenom), 1, 6) FROM empr WHERE empr_nom like 's%'; SUBSTR(nom_colonne, position_départ, longueur) retourne une sous-chaîne de caractères extraite de la colonne spécifiée à partir d'une position de départ et jusqu'à une certaine longueur. Pour SQL Server, la fonction se dénomme SUBSTRING. INSTR(nom_colonne, jeu_caractères, position_départ, nb_occurrence) recherche le jeu de caractères dans une colonne et retourne la position de la première lettre du jeu de caractères. Pour SQL Server, il est possible d'utiliser CHARINDEX ou PATINDEX (voir MSDN). LTRIM(nom_colonne, jeu_caractères) supprime les caractères situés à la gauche de la chaîne de caractères. RTRIM(chaine, jeu_caractères) supprime les caractères situés à la droite de la chaîne de caractères. LENGTH(chaine) LPAD(nom_colonne, longueur, caractère) remplit à gauche des valeurs de la colonne un certain nombre du caractère indiqué pour arriver à la longueur voulue. RPAD(nom_colonne, longueur, caractère) remplit à droite des valeurs de la colonne un certain nombre du caractère indiqué pour arriver à la longueur voulue. Select o.type, Rtrim (o.name), u.name From sysobjects o, sysusers u Where type = "P" And o.uid = u.uid And o.name Like 'avi%' Order By 1, 2, 3; SELECT SE.CUSTOMER_ACCOUNT FROM SERVICES SE WHERE substring((convert (char(5), SE.CUSTOMER_ACCOUNT)),2,2)="41" select (right(('00000' + rtrim(convert(char(5), CALL_PRIM_MSISDN_NDC))),5)), (right(('0000000000' + rtrim(convert(char(10), CALL_PRIM_MSISDN_SN))),10)), (right(('000000' + rtrim(convert(char(6), START_TIMESTAMP_TIME))),6)), Cécile GASS juillet 2007 cecile_gass@yahoo.com 19

(right(('00' + rtrim(convert(char(2), REC_SEGMENT))),2)), (right(('000' + rtrim(convert(char(3), SEC_NUMB_CC))),3)), (right(('00000' + rtrim(convert(char(5), SEC_NUMB_NDC))),5)), (right(('0000000000' + rtrim(convert(char(10), SEC_NUMB_SN))),10)), (right(('000000' + rtrim(convert(char(6), ACTUAL_AIR_DUR))),6)) from CEC_PAR_BEF where START_TIMESTAMP_DATE=20020514 order by CALL_PRIM_MSISDN_NDC, CALL_PRIM_MSISDN_SN, START_TIMESTAMP_TIME, REC_SEGMENT, SEC_NUMB_CC, SEC_NUMB_NDC, SEC_NUMB_SN 3.5 Pour aller plus loin à propos de (My)SQL wiki Introduction SQL maintenu sur le site de PMB ; il répertorie des cours SQL de base et avancés : http://www.pmbservices.fr/wiki/wakka.php?wiki=introductionsql ; SQL sur Wikipedia en français : http://fr.wikipedia.org/wiki/sql et en anglais (un peu plus complet) : http://en.wikipedia.org/wiki/sql ; didacticiel SQL : http://sql.1keydata.com/fr/ ; manuel MySQL5.0 téléchargeable en PDF http://downloads.mysql.com/docs/refman-5.0- fr.pdf et en général, le site http://dev.mysql.com/doc/refman/5.0/fr. Cécile GASS juillet 2007 cecile_gass@yahoo.com 20