64
6.1 Introduction aux Bases de Données 2004/2005 Christian Wolf [email protected] Ecole Nationale Supérieur de Physique de Strasbourg Chapitre 6: Le langage SQL

Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.1

Introduction aux Bases de Données 2004/2005

Christian [email protected]

Ecole Nationale Supérieur de Physique de Strasbourg

Chapitre 6:Le langage SQL

Page 2: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.2Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Le langage SQL

Le modèlerelationnel

Modélisation conceptuelle

IntroductionLes anciensmodèles logiquesPlan

Film

numFilmTitrePays

Client

numClientNom

*

DateDeDateAMagasin

*

location

Client

Location

C-L F-L

Film

Normalisation

SELECT FROM WHERE

=

F.Titre

Fonction

GroupeEmploye

Stockage physique

SELECT titreFROM film NATURAL JOIN distributeurWHERE nom = 'Constance Film';

Page 3: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.3

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é)

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 4: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.4

mySQL

Documentation mySQL sur le web:http://dev.mysql.com/doc/mysql/en/index.html

Documentation en ligne:Commande

• 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 …

HELP <commande>TP: mySQL 4.1

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 5: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.5

SQL: champs d’application

Définition de données• Création et suppression de BD, de tables, d’indexes

etc.• Modification de la structure

Manipulation de données• Consultation de données• Modification de données

CREATE TABLE Film (Nom CHAR(10) …

SELECT Nom FROM Film WHERE Annee = 2004;

UPDATE Film SET Pays=‘USA’ WHERE titre =‘Casablanca’;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 6: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.6

Gestion des BD

CREATE DATABASE <nom-bd>;

Création:

Suppression:DROP DATABASE [ IF EXISTS ] <nom-bd>;

USE <nom-bd>

Utilisation:

<nom-bd>.<nom-table>

Référencer une table hors de la BD « utilisée » à un moment donné:

show tables;

Liste de tables de la BD:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 7: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.7

Création / Suppression d’une table

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:

DROP TABLE [ IF EXISTS ] <nom-table>;

Suppression:

CREATE TABLE <nom-table> LIKE <nom-table-existant>;

Création avec modèle:

CREATE TABLE <nom-table> SELECT …;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 8: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.8

Types de données (1)

TINYINT [(M)] 8 bit entierSMALLINT [(M)] 16 bit entierINT [(M)] 32 bit entierBIGINT [(M)] 64 bit entierFLOAT [(M,D)] 32 bit réelleDOUBLE [(M,D)] 64 bit réelleDECIMAL [(M,D)] réelle, format fixeDATE date, format aaaa-mm-jjTIME heure, format hh:mm:ssDATETIME date et heure,

format aaaa-mm-jj hh:mm:ss

M … taille d’affichage – totalD … taille d’affichage – chiffres après virgule

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 9: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.9

Types de données (2)CHAR(<longeur>) texte max. 255o, longueur fixeVARCHAR(<longeur>) texte max. 255o, longueur variableTEXT texte max 216-1oMEDIUMTEXT texte max 224-1oLONGTEXT texte max 232-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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 10: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.10

Options d’un attribut

PRIMARY KEY 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.

NOT NULL Valeur NULL interdite. Utilisation fortement recommandée.

UNIQUE Valeurs doubles interdites (valeur NULL permise)

DEFAULT <valeur> Spécification de la valeur par défautAUTO_INCREMENT La valeur est incrémentée par défaut

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 11: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.11

Modifier une table

ALTER TABLE <nom-table>ADD COLUMN <nom-attr> <type> [ <options> ][FIRST | AFTER <nom-attr-i> ]…;

Ajouter un attribut:

ALTER TABLE <nom-table>DROP COLUMN <nom-attr>…;

Supprimer un attribut:

ALTER TABLE <nom-table>RENAME TO <nouveau-nom-table>;

Renommer:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 12: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.12

Modifier / Afficher une table

ALTER TABLE <nom-table>CHANGE COLUMN <ancien-nom-attribut> <nom-attr><type> [ <options> ][ FIRST | AFTER <nom-attr-i> ]…;

Changer un attribut:

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)

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 13: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.13

Insertion (1)

INSERT INTO <nom-table> VALUES (<valeur-1>, <valeur-2>, …);

INSERT INTO <nom-table> (<nom-attr-i>, <nom-attr-j> …)VALUES (<valeur-i>, <valeur-j>, …);

Insertion de valeurs constantes:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 14: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.14

Insertion (2)

INSERT INTO <nom-table> SELECT <expr-1>, <expr-2>,…

INSERT INTO <nom-table> (<nom-attr-i>, <nom-attr-j> …)SELECT <expr-1>, <expr-2>, …

Insertion de valeurs à partir d’une requête:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 15: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.15

Suppression du contenu

DELETE FROM <nom-table> WHERE <expr-condition>;

• > < >= <= <>• BETWEEN X AND Y• IN (X, Y, Z, ...)

Quelques conditions:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 16: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.16

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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 17: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.17

Insertion/Suppression/Modification : ODBC

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 18: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.18

ExpressionsL’expression de base est un attribut d’une table ou une constante.<nom-table>.<nom-attribut>

<nom-attr>

ou

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,LOGPI,POW,RAND,ROUND,SIGN,SQRT,RAND

Les espaces sont interdits entre la fonction et la parenthèse!!Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 19: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.19

Expressions

NOT <expr><expr1> AND <expr2><expr1> OR <expr2><expr1> XOR <expr2>

Opérateurs logiques:

= <> > >= < <=

Comparaisons:

BETWEEN <expr-1> AND <expr-2><expr-1> [NOT] IN (<expr-2>, <expr-3>, …)INTERVAL (<expr-1>, <expr-2>, …)

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 20: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.20

Expressions : fluxUne 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

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

La partie ELSE est facultative.

Page 21: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.21

Expressions : la valeur NULL

ISNULL(<expr>)<expr> IS NULL<expr> IS NOT NULLIFNULL(<expr-1>,<expr-2>)NULLIF (<expr-1>,<expr-2>)

Une expression contenant NULL produit NULL quelque soit la valeur des autres parties de l’expression.

COALESCE (<expr-1>, <expr-2>, …)Renvoie la première expression non-nulle:

X <=> Y

Comparaison avec traitement de NULL (NULL<=>NULL s’évalue à 1):

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 22: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.22

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

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 23: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.23

Expressions : date, heureCURRENT_DATE, CURRENT_TIME

ADDDATE(<expr>, INTERVAL <expr> <type>)SUBDATE(<expr>, INTERVAL <expr> <type>)

day,month,year,hour,minute,second

YEAR(<expr>), MONTH(<expr>), WEEK(<expr>), DAYOFMONTH(<expr>), DAYOFYEAR(<expr>), WEEKDAY(<expr>), DATE(<expr-date-heure>), TIME(<expr-date-heure>)

Extraction des champs:

Types de champs:

Modifier des dates

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 24: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.24

Expressions : précédence

OR, XOR AND BETWEEN, CASE, WHEN, THEN, ELSE =, <=>, >=, >, <=, <, <>, LIKE, IN <<, >> -, + *, / ^ NOT

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 25: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.25

Requête à partir d’une tableStructure de base :SELECT [ DISTINCT | ALL ]<expr-i>, <expr-j>, …FROM <nom-table>WHERE <expr-condition>ORDER BY <expr-l> [ ASC | DESC ], … ;

Les clauses WHERE et ORDER BY sont optionnelles!

SELECT * …

Chercher tous les attributs :

SELECT … LIMIT <entier>;

Limiter le nombre de lignes renvoyées :

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 26: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.26

Les opérateurs ensemblistesSELECT ...FROM …WHERE …

UNION

SELECT …FROM …WHERE …

ORDER BY …;

∪ -

SELECT ...FROM …WHERE …

MINUS

SELECT …FROM …WHERE …

ORDER BY …;

SELECT ...FROM …WHERE …

INTERSECT

SELECT …FROM …WHERE …

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!!Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 27: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.27

Produit cartésien

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

X

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 28: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.28

Les alias

SELECT <expr-i> as <alias-attribut-1>, <expr-j> as <alias—attribut-2>, …FROM …WHERE …ORDER … ;

SELECT …FROM <nom-table-1> <alias-table-1>,<nom-table-2> <alias-table-2>WHERE …ORDER … ;

Alias d’un attribut :

Alias d’une table :

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 29: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.29

Jointure interneAjout d’une condition de jointure dans la clause WHERE de la commande SQL.

La condition doit être du type :Ai θ Bj

Ai … un attribut de la première tableBj … un attribut de la deuxième table

Possibilité de combiner plusieurs conditions (AND et OR)

SELECT <expr-i>, <expr-j>, …FROM <nom-table-1>, <nom-table-2>, …WHERE <expr-condition-jointure>ORDER BY <nom-attr-k>, <nom-attr-l>, …;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 30: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.30

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>, …;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 31: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.31

Autres types de jointure

Jointure externe: OUTER JOIN

Jointure externe gauche: LEFT JOIN

Jointure externe droite: RIGHT JOIN

Jointure naturelle: NATURAL JOIN

Produit cartésien: CROSS JOIN

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>, …;

X

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 32: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.32

Combiner les lignes d’une tableSELECT <expr-comb-1>, <expr-comb-2>, …FROM …WHERE …ORDER … ;

Quelques expressions de combinaison:<expr> une expressionavg(<expr>) moyenne des valeurssum(<expr>) somme des valeursmin(<expr>) minimum des valeursmax(<expr>) maximum des valeurscount(*) nombre de lignes renvoyéescount(<expr>) nombre de valeurs non NULLcount (distinct <expr>) nombre de différentes valeurs (<> NULL)group_concat(<expr>) concaténer les chaînes de caractèresstddev(<expr>) écart-type (ne fait pas partie du standard!)

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 33: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.33

AgrégationsSELECT <expr-comb-1>, <expr-comb-2>, …FROM …WHERE …GROUP BY <expr-i>, <expr-j>, …WITH ROLLUPHAVING <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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 34: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.34

Utiliser une requête comme une tableSELECT <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_tableON 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.Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 35: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.35

Utiliser une requête comme table :exemple

SELECT avg(nombre_film) FROM (

SELECT pays, count(*) as nombre_filmFROM film GROUP BY pays

) f;

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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 36: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.36

Sous requêtes : version simple

SELECT …FROM …WHERE <expr-i>, <expr-j>, …<comparaison> | IN | NOT IN( SELECT <expr-r>, <expr-s>, … FROM …

WHERE …)ORDER BY …;

Version simple (non corrélée) : la sous requête n’utilise aucune information de la requête principale.

Version « NOT IN »: « Anti-Jointure » (terme introduit par Oracle)

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 37: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.37

Sous requêtes simples : exemples

SELECT * FROM film WHERE annee = (SELECT min(annee) FROM film);

Chercher les films qui ne sont pas distribués par « Constance Film »SELECT * FROM film WHERE numDistributeur NOT IN (SELECT numDistributeurFROM DistributeurWHERE nom = ‘Constance Film’);

Chercher les films qui étaient produit dans la même année que le plus vieux film de la base.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 38: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.38

Sous requêtes : version corrélée

SELECT …FROM …WHERE <expr>

<comparaison> | IN | NOT IN( SELECT * FROM …

WHERE <expr-condition>)ORDER BY …;

Version corrélée : une condition dans la clause WHERE de la sous requête contient une liaison avec la requête principale.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 39: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.39

Sous requêtes corrélés : exempleChercher 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 ONjoue.numArtiste = artiste.numArtiste

AND

artiste.nationalite = film.pays

);

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 40: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.40

Sous requêtes : ALL et ANYSELECT …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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 41: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.41

Sous requêtes : ALL et ANY, exempleChercher les films dont tous les acteurs possèdent la nationalité du pays de production du film.

SELECT * FROM film WHERE pays <> ANY ( SELECT nationalite

FROM artiste INNER JOIN joue ON artiste.numArtiste = joue.numArtisteAND film.numFilm = joue.numFilm);

SELECT * FROM film WHERE pays = ALL ( SELECT nationalite

FROM artiste INNER JOIN joue ON artiste.numArtiste = joue.numArtisteAND film.numFilm = joue.numFilm);

Chercher les films dont au moins un acteur possède une nationalité différente du pays de production du film.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 42: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.42

Sous requêtes : EXISTSSELECT …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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 43: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.43

Sous requêtes : EXISTS, exemple

SELECT * FROM film WHERE NOT EXISTS(

SELECT * FROM location WHERE numFilm=film.numFilmAND year(datede) BETWEEN 2000 AND 2004

);

Chercher les films qui n’étaient jamais loués pendant la période 2000-2004.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 44: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.44

Sous requêtes : condition dans HAVINGExemple

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_filmFROM film GROUP BY pays

) f);

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 45: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.45

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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 46: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.46

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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 47: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.47

Les indexes

CREATE [ UNIQUE ] INDEX <nom-index> ON <nom-table>(<nom-attr-i>, <nom-attr-j>, …);

DROP INDEX <nom-index> ON <nom-table>;

Création d’un index:

Suppression d’un index:

SHOW INDEX FROM <nom-table>;Affichage des indexes d’une table:

CREATE [ UNIQUE ] INDEX <nom-index> ON <nom-table>(<nom-attr-i>(<nombre-caractéres), …);

Création d’un index partiel:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 48: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.48

Indexes : usageOui :• 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 »).

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 49: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.49

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.

Analyser une table :

SHOW INDEX FROM <nom-table>;

Affichage du résultat de l’analyse:

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 50: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.50

ExemplesDonner les titres des films distribués par « Constance Film »SELECT titreFROM film NATURAL JOIN distributeurWHERE nom = 'Constance Film';

SELECT titreFROM film INNER JOIN distributeurON film.numDistributeur = distributeur.nomDistributeurWHERE nom = 'Constance Film';

SELECT titreFROM film, distributeurWHERE nom = 'Constance Film‘ AND film.numDistributeur = distributeur.nomDistributeur;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

ou

ou

Page 51: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.51

ExemplesDonner 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 titreFROM filmWHERE numFilm IN(

SELECT realisation.numFilmFROM joue, realisationWHERE joue.numArtiste = realisation.numArtiste

);

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 52: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.52

ExemplesDonner les noms des clients ayant loués des films dans lesquels apparaît l’acteur « Michael Biehn »SELECT DISTINCT client.nomFROM joueNATURAL JOIN artiste NATURAL JOIN location NATURAL JOIN client WHERE artiste.nom = 'Michael Biehn';

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

SELECT NOMFROM client NATURAL JOIN locationWHERE location.numFilm IN( SELECT j.numFilm

FROM joue j NATURAL JOIN artiste aWHERE nom = 'Michael Biehn'

);

ou

Page 53: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.53

ExemplesDonner 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 MagasinWHERE code = 'H' AND copies>0;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 54: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.54

ExemplesLa 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 adresseFROM 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;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 55: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.55

Exemples

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_dispoFROM film f LEFT JOIN stock s ON f.numfilm = s.numfilmLEFT JOIN location l ON s.numFilm = l.numFilm AND s.numMagasin = l.numMagasin AND '2000-06-14' BETWEEN l.datede AND l.dateaGROUP BY 1, 2, 3ORDER BY 1, 2, 3;

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 copiesdisponibles le jour 14 Juillet 2004.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 56: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.56

ExemplesChercher 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.nomFROM artiste a NATURAL JOIN realisationNATURAL JOIN (

SELECT film.numFilm AS numFilm, film.titre as titre, count(*) as nombre

FROM film NATURAL JOIN realisationgroup by 1,2 having count(*) >1

) f;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 57: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.57

Exemple : modificationCré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.

UPDATE nombrelocations n INNER JOIN (

SELECT numFilm, count(*) as countFROM location GROUP BY 1

) tempON n.numFilm = temp.numFilmSET n.count = temp.count;

create table nombrelocations(numFilm int primary key, count int not null);

insert into nombrelocations (numFilm, count)select numFilm, 0 from film;

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 58: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.58

Variables d’utilisateur

SET @<nom-variable> = <expr>;

SET @dateAChanger = ‘2004-10-01’;

Exemples :

SQL permet de stocker des données dans des variables:

SET @<nom-variable> = ( <Instruction-SQL> );

SET @maxNumArticle = ( SELECT max(numArticle) FROM Article );

SELECT *FROM ArticleWHERE numArticle = @maxNumArticle;

Page 59: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.59

SQL embarqué (C/C++)

Fichier .c

CompilateurC/C++

Fichier exécutable

Fichier .o / .obj

Linker

Fichier .pc

Pré-processeurSQL embarqué

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++.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 60: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.60

SQL embarqué : insertionEXEC SQL BEGIN DECLARE SECTION;static long varNumAriste,varNumFilm;EXEC SQL END DECLARE SECTION;

int main () {

EXEC SQLINSERT 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).Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 61: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.61

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 SQLSELECT max(duree) INTO :varValeur:varIndicateurFROM Film;

if (varIndicateur<0) /* résultat NULL? */printf("Table vide!\n");

elseprintf ("Durée maximum: %smin\n« ,

varValeur);}

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 62: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.62

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 numFilmFROM 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;

}

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 63: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.63

SQL embarqué : concepts avancésPré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.

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples

Page 64: Introduction aux Bases de Données 2004/2005 · • Le plus diffusé au sein des SGBD relationnels (DB2 ,ORACLE, Teradata, Informix, MS-SQL Server, MySQL, PostgreSQL, etc.) • Implémentation

6.64

Visual Basic for Applications + ODBC

DIM ODBCDB as DatabaseDIM ds as RecordsetDIM 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 > 0Do Until ds.EOF

MsgBox (“Le film numero” & ds(“numFilm")& “ était loué.”);

ds.MoveNextLoop

End ifds.close

Définition Expressions Sous requêtes IndexesMises à jour Requêtes EmbarquementExemples