Introduction aux Bases de Données 2004/2005



Documents pareils
SQL Historique

Langage SQL : créer et interroger une base

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

Le Langage SQL version Oracle

Bases de données relationnelles

CREATION WEB DYNAMIQUE

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

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

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Le Langage De Description De Données(LDD)

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

1 Introduction et installation

Olivier Mondet

FileMaker 13. Guide de référence SQL

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

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

Le langage SQL Rappels

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

Historisation des données

Création et Gestion des tables

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

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

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

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

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

Les bases de données

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

Devoir Data WareHouse

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Les BASES de DONNEES dans WampServer

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

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

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

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

MySQL / SQL EXEMPLES

1/ Présentation de SQL Server :

LE LANGAGE SQL2 1. INTRODUCTION

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

OpenPaaS Le réseau social d'entreprise

Présentation Windows Azure Hadoop Big Data - BI

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

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

16H Cours / 18H TD / 20H TP

Magasins et entrepôts de données (Datamart, data warehouse) Approche relationnelle pour l'analyse des données en ligne (ROLAP)

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

Bible MySQL! La première version de MySQL est apparue en Cette première version est créée pour un usage personnel à partir de msql.

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

TP Contraintes - Triggers

1. Base de données SQLite

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

I. MySQL : Serveur et SGBD

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

WEB DEVELOPER SGBD SYSTEME DE GESTION DE BASES DE DONNEES L étudiant sera capable :

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

Gestion de base de données

A QUOI SERVENT LES BASES DE DONNÉES?

Encryptions, compression et partitionnement des données

Optimisation SQL. Quelques règles de bases

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

Bases de données élémentaires Maude Manouvrier

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

A QUOI SERVENT LES BASES DE DONNÉES?

Partie 0 : Gestion des tablespace et des utilisateurs... 3

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


Les bases fondamentales du langage Transact SQL

Bases de données cours 4 Construction de requêtes en SQL. Catalin Dima

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Bases de données et sites WEB

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

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

Mysql avec EasyPhp. 1 er mars 2006

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Intégrité sémantique dans les bases de données relationnelles

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

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

Structured Query Language

Gestion de stock pour un magasin

Introduction au langage C

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Exercices sur SQL server 2000

Bases de données avancées

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

TP Bases de données réparties

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Optimisations des SGBDR. Étude de cas : MySQL

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

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Mejdi BLAGHGI & Anis ASSÈS

Support de Cours REQUÊTES TRANSACT-SQL DANS MICROSOFT SQL SERVER Stéphane N GUESSAN Groupe Pigier Abidjan Version 1.

Sybase Adaptive Server Enterprise 15

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Transcription:

Introduction aux Bases de Données 2004/2005 Chapitre 6: Le langage SQL Ecole Nationale Supérieur de Physique de Strasbourg Christian Wolf christian.wolf@ensps.u-strasbg.fr 6.1

Stockage physique Film numfil m Titre Pays * location Date De Date A Maga sin * Client numclien t Nom Modélisation conceptuelle Introduction Fonction Normalisation Plan Client C-L SELECT titre FROM film NATURAL JOIN distributeur WHERE nom = 'Constance Film'; F.Titre = Location Film F-L Les anciens modèles logiques Le modèle relationnel Groupe Employe SELECT FROM WHERE Le langage SQL 6.2

SQL «Structured Query Language» Langage de Manipulation, IBM 1981, San José Standard industriel (normalisé ISO 1988) Le plus diffusé au sein des SGBD relationnels (DB2,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) Implémentation d un système relationnel Versions interactives et intégrées (SQL embarqué) 6.3

mysql Cours et TP: mysql version 4.1 Open source et libre Véritable multi-plateforme: Linux, Windows, Mac OS X, Solaris, Free BSD, HP-UX, IBM AIX, SGI Irix, QNX, Novell Netware Interfaces: Ligne de commande (SQL) SQL embarqué (Langage C/C++) Driver ODBC Connections pour: Java,.NET, Perl, Ruby, Python Documentation mysql sur le web: http://dev.mysql.com/doc/mysql/en/index.html Documentation en ligne: Commande HELP <commande> TP: mysql 4.1 6.4

SQL: champs d application Définition de données Création et suppression de BD, de tables, d indexes etc. Modification de la structure CREATE TABLE Film (Nom CHAR(10) Manipulation de données Consultation de données Modification de données SELECT Nom FROM Film WHERE Annee = 2004; UPDATE Film SET Pays= USA WHERE titre = Casablanca ; 6.5

Création: Gestion des BD CREATE DATABASE <nom-bd>; Suppression: DROP DATABASE [ IF EXISTS ] <nom-bd>; Utilisation: USE <nom-bd> Liste de tables de la BD: show tables; Référencer une table hors de la BD «utilisée» à un moment donné: <nom-bd>.<nom-table> 6.6

Création / Suppression d une table Création: CREATE [ TEMPORARY ]TABLE <nom-table> ( <nom-attr-1> <type> [ <options> ], <nom-attr-2> <type> [ <options> ], PRIMARY KEY (<nom-attr-i>, <nom-attr-j>, ) ); Création avec modèle: CREATE TABLE <nom-table> LIKE <nom-table-existant>; CREATE TABLE <nom-table> SELECT ; Suppression: DROP TABLE [ IF EXISTS ] <nom-table>; 6.7

Types de données (1) TINYINT [(M)] SMALLINT [(M)] INT [(M)] BIGINT [(M)] FLOAT [(M,D)] DOUBLE [(M,D)] DECIMAL [(M,D)] DATE TIME DATETIME 8 bit entier 16 bit entier 32 bit entier 64 bit entier 32 bit réelle 64 bit réelle réelle, format fixe date, format aaaa-mm-jj heure, format hh:mm:ss date et heure, format aaaa-mm-jj hh:mm:ss M taille d affichage total D taille d affichage chiffres après virgule 6.8

Types de données (2) CHAR(<longeur>) texte max. 255o, longueur fixe VARCHAR(<longeur>) texte max. 255o, longueur variable TEXT texte max 2 16-1o MEDIUMTEXT texte max 2 24-1o LONGTEXT texte max 2 32-1o ENUM(<valeur-1>, <valeur-2>, ) une valeur parmi les valeurs de la liste SET(<valeur-1>, <valeur-2>, ) zéro ou plusieurs valeurs parmi les valeurs de la liste SET et ENUM: les valeurs sont représentées comme chaînes de caractères, mais stockées comme entiers. Les listes sont limitées à max. 64 membres. 6.9

Options d un attribut PRIMARY KEY NOT NULL UNIQUE DEFAULT <valeur> AUTO_INCREMENT Clef primaire, valeurs doubles et valeurs NULL interdites. Si plusieurs colonnes font partie de la clef primaire, utiliser la propriété PRIMARY KEY( ) de la table. Valeur NULL interdite. Utilisation fortement recommandée. Valeurs doubles interdites (valeur NULL permise) Spécification de la valeur par défaut La valeur est incrémentée par défaut 6.10

Renommer: Modifier une table ALTER TABLE <nom-table> RENAME TO <nouveau-nom-table>; Ajouter un attribut: ALTER TABLE <nom-table> ADD COLUMN <nom-attr> <type> [ <options> ] [FIRST AFTER <nom-attr-i> ] ; Supprimer un attribut: ALTER TABLE <nom-table> DROP COLUMN <nom-attr> ; 6.11

Modifier / Afficher une table Changer un attribut: ALTER TABLE <nom-table> CHANGE COLUMN <ancien-nom-attribut> <nom-attr> <type> [ <options> ] [ FIRST AFTER <nom-attr-i> ] ; Afficher la définition d une table: SHOW CREATE TABLE <nom-table>; DESCRIBE <nom-table>; (mysql seulement! Cette commande ne fait pas partie du standard SQL) 6.12

Insertion (1) Insertion de valeurs constantes: INSERT INTO <nom-table> VALUES (<valeur-1>, <valeur-2>, ); INSERT INTO <nom-table> (<nom-attr-i>, <nom-attr-j> ) VALUES (<valeur-i>, <valeur-j>, ); 6.13

Insertion (2) Insertion de valeurs à partir d une requête: INSERT INTO <nom-table> SELECT <expr-1>, <expr-2>, INSERT INTO <nom-table> (<nom-attr-i>, <nom-attr-j> ) SELECT <expr-1>, <expr-2>, 6.14

Suppression du contenu DELETE FROM <nom-table> WHERE <expr-condition>; Quelques conditions: > < >= <= <> BETWEEN X AND Y IN (X, Y, Z,...) 6.15

Modification du contenu UPDATE <nom-table1>, SET <nom-attr-i> = <expr-1>, <nom-attr-j> = <expr-2>, WHERE <expr-condition>; Les jointures avec d autres tables sont possibles. 6.16

Insertion/Suppression/Modification : ODBC 6.17

Expressions L expression de base est un attribut d une table ou une constante. <nom-table>.<nom-attribut> ou <nom-attr> Les opérateurs arithmétiques sont disponibles, l ordre peut être forcé par des parenthèses. -, + *, / Quelques fonctions mathématiques (voir la liste complète) : ABS,SIN,COS,TAN,ASIN,ACOS,ATAN,COT,EXP,LN,LOG PI,POW,RAND,ROUND,SIGN,SQRT,RAND Les espaces sont interdits entre la fonction et la parenthèse!! 6.18

Opérateurs logiques: NOT <expr> <expr1> AND <expr2> <expr1> OR <expr2> <expr1> XOR <expr2> Expressions Comparaisons: = <> > >= < <= BETWEEN <expr-1> AND <expr-2> <expr-1> [NOT] IN (<expr-2>, <expr-3>, ) INTERVAL (<expr-1>, <expr-2>, ) 6.19

Expressions : flux Une expression logique s évalue à 1 (=vrai) ou 0 (=faux). IF (<expr1>, <expr2>, <expr3>) CASE <expr> WHEN <expr-condition-1> THEN <expr-1> WHEN <expr-condition-2> THEN <expr-2> ELSE <expr-e> END La partie ELSE est facultative. 6.20

Expressions : la valeur NULL Une expression contenant NULL produit NULL quelque soit la valeur des autres parties de l expression. ISNULL(<expr>) <expr> IS NULL <expr> IS NOT NULL IFNULL(<expr-1>,<expr-2>) NULLIF (<expr-1>,<expr-2>) Renvoie la première expression non-nulle: COALESCE (<expr-1>, <expr-2>, ) Comparaison avec traitement de NULL (NULL<=>NULL s évalue à 1): X <=> Y 6.21

Expressions : chaînes de caractères CONCAT (<expr-1>,<expr-2>, ) INSERT (<str>,<pos>,<len>,<str-2>) LOCATE (<substr>,<str>) LEFT (<str>, <len>) LENGTH(<str>) LTRIM (<str>) Comparaisons : la conversion entre chaîne de caractères et type numérique est faite automatiquement si nécessaire. <expr> LIKE <modèle> Le modèle peut contenir les caractères spéciaux suivants: _ apparié avec un caractère quelconque % apparié avec un ou plusieurs caractères 6.22

Expressions : date, heure CURRENT_DATE, CURRENT_TIME Modifier des dates ADDDATE(<expr>, INTERVAL <expr> <type>) SUBDATE(<expr>, INTERVAL <expr> <type>) Types de champs: day,month,year,hour,minute,second Extraction des champs: YEAR(<expr>), MONTH(<expr>), WEEK(<expr>), DAYOFMONTH(<expr>), DAYOFYEAR(<expr>), WEEKDAY(<expr>), DATE(<expr-date-heure>), TIME(<expr-date-heure>) 6.23

Expressions : précédence OR, XOR AND BETWEEN, CASE, WHEN, THEN, ELSE =, <=>, >=, >, <=, <, <>, LIKE, IN <<, >> -, + *, / ^ NOT 6.24

Structure de base : Requête à partir d une table SELECT [ DISTINCT ALL ] <expr-i>, <expr-j>, FROM <nom-table> WHERE <expr-condition> ORDER BY <expr-l> [ ASC DESC ], ; Chercher tous les attributs : SELECT * Limiter le nombre de lignes renvoyées : SELECT LIMIT <entier>; Les clauses WHERE et ORDER BY sont optionnelles! 6.25

Les opérateurs ensemblistes SELECT... FROM WHERE UNION SELECT FROM WHERE SELECT... FROM WHERE MINUS SELECT FROM WHERE SELECT... FROM WHERE INTERSECT SELECT FROM WHERE ORDER BY ; ORDER BY ; ORDER BY ; - Supprime les doublons Supprime une requête et les doublons Supprime le tout sauf les doublons MINUS et INTERSECT ne sont pas disponibles dans mysql 4.1!! 6.26

Produit cartésien X Structure de base : SELECT <expr-i>, <expr-j>, FROM <nom-table-1>, <nom-table-2>, WHERE <expr-condition> ORDER BY <expr-k>, <expr-l>, ; Sans condition de jointure : produit cartésien 6.27

Les alias Alias d un attribut : SELECT <expr-i> as <alias-attribut-1>, <expr-j> as <alias attribut-2>, FROM WHERE ORDER ; Alias d une table : SELECT FROM <nom-table-1> <alias-table-1>, <nom-table-2> <alias-table-2> WHERE ORDER ; 6.28

Jointure interne Ajout d une condition de jointure dans la clause WHERE de la commande SQL. SELECT <expr-i>, <expr-j>, FROM <nom-table-1>, <nom-table-2>, WHERE <expr-condition-jointure> ORDER BY <nom-attr-k>, <nom-attr-l>, ; La condition doit être du type : Ai θ Bj Ai un attribut de la première table Bj un attribut de la deuxième table Possibilité de combiner plusieurs conditions (AND et OR) 6.29

Jointure interne : deuxième syntaxe Structure de base : SELECT <expr-i>, <expr-j>, FROM <nom-table-1> INNER JOIN <nom-table-2> ON <nom-table-1>.<nom-attr-r> θ <nom-table- 2>.<nom-attr-s> WHERE <expr-condition> ORDER BY <expr-k>, <expr-l>, ; 6.30

Autres types de jointure SELECT <expr-i>, <expr-j>, FROM <nom-table-1> INNER JOIN <nom-table-2> ON <nom-table-1>.<nom-attr-r> θ <nom-table- 2>.<nom-attr-s> WHERE <expr-condition> ORDER BY <expr-k>, <expr-l>, ; Jointure externe: Jointure externe gauche: Jointure externe droite: Jointure naturelle: Produit cartésien: OUTER JOIN LEFT JOIN RIGHT JOIN NATURAL JOIN CROSS JOIN X 6.31

Combiner les lignes d une table SELECT <expr-comb-1>, <expr-comb-2>, FROM WHERE ORDER ; Quelques expressions de combinaison: <expr> une expression avg(<expr>) moyenne des valeurs sum(<expr>) somme des valeurs min(<expr>) minimum des valeurs max(<expr>) maximum des valeurs count(*) nombre de lignes renvoyées count(<expr>) nombre de valeurs non NULL count (distinct <expr>) nombre de différentes valeurs (<> NULL) group_concat(<expr>) concaténer les chaînes de caractères stddev(<expr>) écart-type (ne fait pas partie du standard!) 6.32

Agrégations SELECT <expr-comb-1>, <expr-comb-2>, FROM WHERE GROUP BY <expr-i>, <expr-j>, WITH ROLLUP HAVING <expr-condition> ORDER BY ; Résultat : une ligne par groupe La clause HAVING permet d imposer des conditions sur les valeurs groupées SQL standard : les seuls attributs permis dans la clause select sont les attributs indiqués dans la clause GROUP BY. mysql : tous (attention!!) La clause ROLLUP ajoute une ligne contenant la valeur totale. 6.33

Utiliser une requête comme une table SELECT <expr-i>, <expr-j>, FROM <nom-table-1> INNER JOIN ( SELECT ) <alias-table> ON <expr-condition-jointure> ; Exemple: Chercher le film le plus vieux dans la base, ensemble avec les films de la même année. SELECT * FROM film f INNER JOIN (SELECT min(annee) as min_a FROM film) min_table ON f.annee = min_table.min_a; Cette construction fait partie du standard SQL. Néanmoins, elle n est pas disponible dans tous les dialectes SQL. 6.34

Utiliser une requête comme table : exemple Chercher la moyenne des nombres de film produit par les pays. Problème : deux agrégations sont nécessaires. Cependant, deux clauses GROUP BY sont impossibles en SQL. SELECT avg(nombre_film) FROM ( SELECT pays, count(*) as nombre_film FROM film GROUP BY pays ) f; 6.35

Sous requêtes : version simple Version simple (non corrélée) : la sous requête n utilise aucune information de la requête principale. SELECT FROM WHERE <expr-i>, <expr-j>, <comparaison> IN NOT IN ( SELECT <expr-r>, <expr-s>, FROM WHERE ) ORDER BY ; Version «NOT IN»: «Anti-Jointure» (terme introduit par Oracle) 6.36

Sous requêtes simples : exemples Chercher les films qui ne sont pas distribués par «Constance Film» SELECT * FROM film WHERE numdistributeur NOT IN (SELECT numdistributeur FROM Distributeur WHERE nom = Constance Film ); Chercher les films qui étaient produit dans la même année que le plus vieux film de la base. SELECT * FROM film WHERE annee = (SELECT min(annee) FROM film); 6.37

Sous requêtes : version corrélée Version corrélée : une condition dans la clause WHERE de la sous requête contient une liaison avec la requête principale. SELECT FROM WHERE <expr> <comparaison> IN NOT IN ( SELECT * FROM WHERE <expr-condition> ) ORDER BY ; 6.38

Sous requêtes corrélés : exemple Chercher les films dans lesquels joue au moins un acteur qui possède la nationalité du pays de production. SELECT * FROM film WHERE numfilm in ( SELECT numfilm FROM Joue INNER JOIN Artiste ON joue.numartiste = artiste.numartiste ); AND artiste.nationalite = film.pays 6.39

Sous requêtes : ALL et ANY SELECT FROM WHERE <expr-i>, <expr-j>, <opérateur-comparaison> ANY ALL ( SELECT ); ALL : La condition doit être satisfaite pour TOUTES les lignes de résultat de la sous requête. ANY : La condition doit être satisfaite pour AU MOINS UNE ligne du résultat de la sous requête. Attention! Ne pas «interpréter» la requête en langue Anglais, les mots ALL et ANY sont très ambiguës. 6.40

Sous requêtes : ALL et ANY, exemple Chercher les films dont tous les acteurs possèdent la nationalité du pays de production du film. SELECT * FROM film WHERE pays = ALL ( SELECT nationalite FROM artiste INNER JOIN joue ON artiste.numartiste = joue.numartiste AND film.numfilm = joue.numfilm); Chercher les films dont au moins un acteur possède une nationalité différente du pays de production du film. SELECT * FROM film WHERE pays <> ANY ( SELECT nationalite FROM artiste INNER JOIN joue ON artiste.numartiste = joue.numartiste AND film.numfilm = joue.numfilm); 6.41

Sous requêtes : EXISTS SELECT FROM WHERE [ NOT ] EXISTS ( SELECT * ); Pour chaque ligne de la requête extérieure, la sous requête est exécutée. Si la sous requête renvoie au moins une ligne, la ligne de requête extérieure est retenue. Sinon, elle est supprimée. La négation (NOT EXISTS) provoque le comportement inverse. 6.42

Sous requêtes : EXISTS, exemple Chercher les films qui n étaient jamais loués pendant la période 2000-2004. SELECT * FROM film WHERE NOT EXISTS ( SELECT * FROM location WHERE numfilm=film.numfilm AND year(datede) BETWEEN 2000 AND 2004 ); 6.43

Sous requêtes : condition dans HAVING Exemple Chercher les pays ayant produits plus de film que la moyenne. SELECT pays, count(*) FROM film GROUP BY pays HAVING count(*) > ( SELECT avg(nombre_film) FROM ( SELECT pays, count(*) as nombre_film FROM film GROUP BY pays ) f ); 6.44

Sous requête dans la clause SELECT SELECT titre, ( SELECT nom FROM distributeur WHERE numdistributeur = film.numdistributeur ) FROM film; La sous requête doit retourner une seule ligne seulement. 6.45

Sous requêtes ou jointure? Très souvent, une solution peut être trouvée en utilisant soit une sous requête, soit une jointure. En générale: Les sous requêtes sont préférables pour comparer des agrégations à d autres valeurs. Les jointures sont idéales pour afficher des résultats provenant de plusieurs tables. 6.46

Les indexes Création d un index: CREATE [ UNIQUE ] INDEX <nom-index> ON <nom-table> (<nom-attr-i>, <nom-attr-j>, ); Création d un index partiel: CREATE [ UNIQUE ] INDEX <nom-index> ON <nom-table> (<nom-attr-i>(<nombre-caractéres), ); Suppression d un index: DROP INDEX <nom-index> ON <nom-table>; Affichage des indexes d une table: SHOW INDEX FROM <nom-table>; 6.47

Indexes : usage Oui : Une colonne qui sert souvent dans une clause WHERE (restriction). Une colonne à laquelle on accède souvent dans un ordre trié Des colonnes régulièrement utilisées dans des jointures (e.g. les clefs étrangères!) Non: Des colonnes rarement utilisées Des colonnes qui ont que peu de valeurs Les petites tables (la BD favorise le balayage, «full table scan»). 6.48

Analyser une table : Analyser une table ANALYZE TABLE <nom-table>; La répartition des clefs de la table est stockée afin de pouvoir optimiser l ordre de jointure des tables dans une requête. Affichage du résultat de l analyse: SHOW INDEX FROM <nom-table>; 6.49

Exemples Donner les titres des films distribués par «Constance Film» SELECT titre FROM film NATURAL JOIN distributeur WHERE nom = 'Constance Film'; SELECT titre FROM film INNER JOIN distributeur ON film.numdistributeur = distributeur.nomdistributeur WHERE nom = 'Constance Film'; ou ou SELECT titre FROM film, distributeur WHERE nom = 'Constance Film AND film.numdistributeur = distributeur.nomdistributeur; 6.50

Exemples Donner les titres des films réalisés par un artiste ayant de l expérience professionnelle comme acteur aussi bien que comme réalisateur. SELECT titre FROM film WHERE numfilm IN ( SELECT realisation.numfilm FROM joue, realisation WHERE joue.numartiste = realisation.numartiste ) ; 6.51

Exemples Donner les noms des clients ayant loués des films dans lesquels apparaît l acteur «Michael Biehn» SELECT DISTINCT client.nom FROM joue NATURAL JOIN artiste NATURAL JOIN location NATURAL JOIN client WHERE artiste.nom = 'Michael Biehn'; ou SELECT NOM FROM client NATURAL JOIN location WHERE location.numfilm IN ( SELECT j.numfilm FROM joue j NATURAL JOIN artiste a WHERE nom = 'Michael Biehn' ); 6.52

Exemples Donner les adresses des magasins qui stockent au moins un film d horreur, aussi bien que les titres de ces films disponibles. Donner L adresse = Distributeur si le Magasin est un distributeur automatique. Donner une ligne distributeur au cas de plusieurs réponses de ce type. SELECT DISTINCT IFNULL(Magasin.adresse,'Distributeur') FROM film NATURAL JOIN categories NATURAL JOIN stock NATURAL JOIN Magasin WHERE code = 'H' AND copies>0; 6.53

Exemples La même requête que la suivante, mais donner au cas d un distributeur l adresse du Magasin gérant entre parenthèses et précédée par DIST. SELECT DISTINCT IFNULL(b1.adresse,CONCAT('DIST(',b2.adresse,')')) AS adresse FROM film NATURAL JOIN categories NATURAL JOIN stock NATURAL JOIN Magasin b1 LEFT JOIN Magasin b2 ON b1.nummagasingestion = b2.nummagasin WHERE code = 'H' AND copies>0; 6.54

Exemples Chercher une liste de toutes les magasins et de tous les films. Pour chaque couple (Magasin,film), donner le nombre de copies gérés par ce Magasin et le nombre de copies disponibles le jour 14 Juillet 2004. SELECT s.nummagasin as Magasin, f.titre as titre, s.copies as nombre_total, count(l.datede) as nombre_loue, s.copies-count(l.datede) as nombre_dispo FROM film f LEFT JOIN stock s ON f.numfilm = s.numfilm LEFT JOIN location l ON s.numfilm = l.numfilm AND s.nummagasin = l.nummagasin AND '2000-06-14' BETWEEN l.datede AND l.datea GROUP BY 1, 2, 3 ORDER BY 1, 2, 3; 6.55

Exemples Chercher les titres de films réalisés par plus qu un réalisateur, ensemble avec les noms de ces réalisateurs. SELECT f.titre, a.nom FROM artiste a NATURAL JOIN realisation NATURAL JOIN ( SELECT film.numfilm AS numfilm, film.titre as titre, count(*) as nombre FROM film NATURAL JOIN realisation group by 1,2 having count(*) >1 ) f ; 6.56

Exemple : modification Créer une table contenant pour chaque film le nombre de locations (dépendance!!). Créer une instruction de type UPDATE pour mettre à jour cette table. create table nombrelocations (numfilm int primary key, count int not null); insert into nombrelocations (numfilm, count) select numfilm, 0 from film; UPDATE nombrelocations n INNER JOIN ( SELECT numfilm, count(*) as count FROM location GROUP BY 1 ) temp ON n.numfilm = temp.numfilm SET n.count = temp.count; 6.57

Variables d utilisateur SQL permet de stocker des données dans des variables: SET @<nom-variable> = <expr>; SET @<nom-variable> = ( <Instruction-SQL> ); Exemples : SET @dateachanger = 2004-10-01 ; SET @maxnumarticle = ( SELECT max(numarticle) FROM Article ); SELECT * FROM Article WHERE numarticle = @maxnumarticle; 6.58

Fichier.pc Pré-processeur SQL embarqué Fichier.c Compilateur C/C++ SQL embarqué (C/C++) Les instructions SQL sont mélangées avec le code C/C++ dans un fichier.pc. Ce fichier est traité par un préprocesseur, qui traduit le code SQL en appels de fonctions d une libraire, donc en code C/C++. Fichier.o /.obj Linker Fichier exécutable 6.59

SQL embarqué : insertion EXEC SQL BEGIN DECLARE SECTION; static long varnumariste,varnumfilm; EXEC SQL END DECLARE SECTION; int main () { } EXEC SQL INSERT INTO Joue (numartiste, numfilm) VALUES (:varnumartiste, :varnumfilm) ; printf ("Une ligne inséré dans Joue "); Le passage de paramètres entre le langage hôte et les instructions SQL se fait à l aide des variables hôtes. Ces variables sont des variables standard du langage hôte. Néanmoins, une déclaration au pré-processeur par une instruction spéciale est nécessaire (DECLARE SECTION). 6.60

SQL embarqué : une ligne dans le résultat EXEC SQL BEGIN DECLARE SECTION; static long varvaleur; static short varindicateur; EXEC SQL END DECLARE SECTION; int main () { } EXEC SQL SELECT max(duree) INTO :varvaleur:varindicateur FROM Film; if (varindicateur<0) /* résultat NULL? */ printf("table vide!\n"); else printf ("Durée maximum: %smin\n«, varvaleur); 6.61

SQL embarqué : plusieurs lignes EXEC SQL BEGIN DECLARE SECTION; static long varnumfilm; EXEC SQL END DECLARE SECTION; int main () { } EXEC SQL DECLARE mycursor CURSOR FOR SELECT DISTINCT numfilm FROM Location; EXEC SQL OPEN mycursor; /* Execution */ while(1) { EXEC SQL FETCH mycursor INTO :varnumfilm; if (SQLCODE == 100) break; /* Fin */ printf ("Le film numero %d était loué.\n«, varnumfilm); } EXEC SQL CLOSE mycursor; 6.62

SQL embarqué : concepts avancés Préparation dynamique de l instruction: L instruction n est pas donnée explicitement dans le code source, mais préparée en temps d exécution dans une chaîne de caractères. L instruction SQL dépend donc de l exécution de l application. Nombre et types d attributs dans un résultat dynamique: Le nombre et les types des résultats sont déterminés par l application en temps d exécution. Afin d apparier les variables aux types de résultats, les résultats sont chargés dans une structure dynamique construite par l application. 6.63

Visual Basic for Applications + ODBC DIM ODBCDB as Database DIM ds as Recordset DIM sql as string Set ODBCDB = OpenDatabase ( ODBC;DSN=D:\mySQL.dsn & ;UID=chris;PWD=ibd;database=videoavenir ) Sql = SELECT DISTINCT numfilm FROM Location ; Set ds = ODBCDB.OpenRecordset(sql) If ds.recordcount > 0 Do Until ds.eof MsgBox ( Le film numero & ds( numfilm") & était loué. ); ds.movenext Loop End if ds.close 6.64