CM1 : Introduction, rappels SQL

publicité
1
BASES DE DONNÉES ET
PROGRAMMATION WEB
Frey Gabriel
Licence 3 Informatique
Contenu général
2
— 
— 
— 
Bases de données I (licence 2 Informatique)
Bases de données et programmation web (licence 3
Informatique)
Banques de données multimédia, Entrepôts de
données et informatique décisionnelle, Fouilles de
données, Fouilles de données réparties, …
Organisation du module
3
¨ 
Séances
CM : 26h
¤  TD : 16h
¤  TP : 24h (projet)
¤  Fichiers : http://dpt-info.u-strasbg.fr/~g.frey/BDDPW
¤  Moodle : BDDPW
¤ 
¨ 
Evaluation
note 1 : épreuve écrite (40mn - 1h10), coef. 2/10
¤  note 2 : épreuve pratique, coef. 3/10
¤  note 3 : épreuve pratique, coef. 2/10
¤  note 4 : épreuve écrite (55mn - 1h45), coef. 3/10
¤ 
4
Rappels : Concepts de Bases de
Données
Système de Gestion de Fichiers
5
Programme 1 Données Programme 2 Système de gestion de fichiers Fichier 1 Données Fichier 2 Programme 3 Données Système de Gestion de Fichiers
6
Les données sont stockées dans des fichiers.
Inconvénients pouvant se produire lors du stockage d’une
grande masse de données, accessible par différents
utilisateurs et applications :
—  différents formats de fichier, dépendant des programmes
et généralement faiblement structurés,
—  difficulté d’accès à l’information (index),
—  pas de vérification sur la cohérence des données
(redondances, erreurs, …),
—  pas de contrôle des accès concurrents.
Approche Base de Données
7
Programme 1 Données SGBD Programme 2 Données Requêtes Transactions Programme 3 Données Bases de données Définition
8
— 
Base de données (BD)
Une base de données est un ensemble d’informations de grande taille,
structuré, mémorisé sur un support permanent.
— 
Système de gestion de Bases de Données (SGBD)
Un système de gestion de bases de données est un outil informatique
permettant aux utilisateurs de structurer, d’insérer, de modifier, de
rechercher de manière efficace des données spécifiques au sein d’une
grande quantité d’informations stockées sur mémoires secondaires
partagées de manière transparente par plusieurs utilisateurs.
Fonctions d’un SGBD
9
1. 
Persistance
¤ 
2. 
Stockage des données sur disque
Langage de requête sur la base
¤ 
¤ 
Les requêtes doivent être simples, déclaratives, optimisées avant
l’exécution
SQL (Structured Query Langage), OQL (Object Query Langage),
Xquery (XML Query Langage)
Fonctions d’un SGBD
10
Partage des données
3. 
Chaque utilisateur doit avoir l’impression d’être seul à accéder aux
données
— 
Ø 
Notion de transaction
Cohérence des mises à jour d’un utilisateur
Cohérence collective : sérialisabilité
— 
— 
Fiabilité des données
4. 
Vérification de contrainte d’intégrité
Atomicité des transactions : transaction complètement effectuée ou pas
du tout
Résistance aux pannes
— 
— 
— 
— 
— 
— 
En cas de panne mémoire: restauration automatique des dernières
transactions validées avant la panne
En cas de panne disque : restauration d’une sauvegarde, journal
Mécanisme de réplication des données (mirroring)
Fonctions d’un SGBD
11
Sécurité des données
5. 
Droits des utilisateurs sur la manipulation des données
— 
— 
— 
— 
Notion d’autorisation
Notion de groupe d’utilisateur
Granularité des autorisations
Gestion des disques
6. 
Répartition des données
Optimisation des performances
— 
— 
— 
— 
— 
— 
Index, hachage, bitmap
Regroupement des données
Optimisation des requêtes
Cache mémoire
Fonctions d’un SGBD
12
7. 
Indépendance logique/physique
¤ 
¤ 
Organisation physique de la BD transparente pour le
développeur d’application
Possibilité de changer la structure physique des données sans
changer le code de l’application
SGBD transactionnel
Exemple de transaction :
Begin
//
CEpargne
CCourant
Commit
//
début de la transaction
= CEpargne – 1000
= CCourant + 1000
fin de la transaction
Begin
CEpargne = CEpargne – 1000
>>>> panne
CCourant = CCourant + 1000
Commit T1
⇒ annuler le débit !
⇒ récupération de l’état précédent (panne ?)
13
Transaction : gestion des accès concurrents
14
Utilisateur 1
Lire(CCourant);
if (CCourant >= 100)
{
CCourant =
CCourant – 100;
Ecrire(CCourant);
}
¨ 
Quels sont les risques ?
Utilisateur 2
Lire(CCourant);
if (CCourant >= 100)
{
CCourant =
CCourant – 100;
Ecrire(CCourant);
}
Transaction : propriétés ACID
¨ 
¨ 
¨ 
¨ 
Atomicité : Une transaction est indivisible. Elle est soit complètement exécutée soit
pas du tout (unité atomique de traitement)
Cohérence : une transaction doit effectuer une transition d’un état cohérent de la
base à un autre état cohérent (par ex: pas de violation de contrainte d’intégrité). La
cohérence peut être non respectée pendant l'exécution d'une transaction. En cas
d’échec de la transaction, la base doit retourner dans l’état cohérent initial
Isolation : le résultat d’un ensemble de transactions concurrentes et validées
correspond à une exécution successive des mêmes transactions (pas d’inférence
entre les transactions)
Durabilité : après la fin d'une transaction, les mises à jour sont définitives même en
cas de problèmes matériels (mécanisme de reprise en cas de panne)
15
Architecture SGBD
Utilisateur 1 Utilisateur 2 Vue utilisateur 1 Utilisateur 3 Vue utilisateur 2 …… Utilisateur N Vue utilisateur N Schéma externe Vue conceptuelle Schéma logique Vue interne Schéma interne SGBD 16
Architecture
17
•  Niveau externe : Vues, Environnement de programmation (intégration avec un langage
de programmation), Interfaces conviviales, Outils d’aide (ex : conception de schémas)
•  Niveau logique : Définition de la structure de données, Langages de description des
données (LDD), Consultation et mise à jour des données : Langages de Requêtes (LR) et
Langage de Manipulation de Données (LMD), Gestion de la confidentialité (sécurité),
Intégrité des données
•  Niveau physique : Gestion sur mémoire secondaire (fichiers) des données, du schéma,
des index, Partage des données et gestion de la concurrence d’accès, Reprise sur
pannes (fiabilité), Distribution des données et interopérabilité (accès réseaux).
Types d’utilisateur :
-  Utilisateur de base
-  Concepteur d’application
-  Administrateur de la base
Modèle de données
18
Modèle conceptuel
—  Pour la conception d’applications
—  Merise, Modèle entité-association, UML, …
Modèle logique
—  Pour la définition de BD supportées par un SGBD
—  Modèle hiérarchique, réseau, relationnel, objet, …
Modèle physique
—  Implémentation du SGBD: fichier simple, base de faits, XML, …
—  Organisation et stockage des données : index, …
19
MODÈLE LOGIQUE DE
DONNÉE RELATIONNEL
Modèle Logique de Donnée
20
Définition : le modèle logique décrit la structure de données
Objectifs :
— 
— 
— 
— 
Éviter les incohérences dans les données :
Une personne n’a qu’une date de naissance, le prix d’un produit est unique, ….
Éviter la redondance d’information :
La même information est stockée dans différentes relations
Anomalies: insertion, suppression, modification
Éviter les valeurs nulles :
Difficiles à interpréter : inconnu, connu mais non disponible, inapplicable
Rend les jointures difficiles à spécifier
Éviter les jointures inutiles :
Améliorer les performances : la jointure est une opération coûteuse
Modèle Relationnel
21
¨ 
Modèle de niveau logique simple défini par Edgar
Frank Codd en 1970 (prix Turing en 1986)
¤  une
relation est une table à deux dimensions
¤  n-uplet ó ligne de la table
¤  attribut ó colonne de la table
SGBD Relationnel
22
Oracle database (≈47%), MySQL
¨  Microsoft SQL Server (≈17%), DB2 (≈21%)
¨  PostgreSQL, Firebird, Ingres
¨  SQLite
¨ 
23
ALTERNATIVE AUX SGBD
RELATIONNELS
XML
¨ 
XML (eXtensible Markup Language)
¤ 
Les balises définissent la structure et la sémantique
n 
¤ 
¤ 
Présentation à part (XSL)
Représentation de données semi-structurées
n 
¤ 
¨ 
conformité optionnelle à un schéma
Facilite le traitement informatique et humain
Format normalisé d’échange
¤ 
¨ 
Facilite l’interprétation des données (par programme ou humain)
couplage faible entre les données et les systèmes
Schémas
¤ 
DTD, XSD, XML schéma
24
XML
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!-- Catalogue de la pépinière Plein de Foin -->
<!DOCTYPE Catalogue [
<!ELEMENT Catalogue (Article)+>
<!ELEMENT Article (noArticle,description,prixUnitaire)>
<!ELEMENT noArticle (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT prixUnitaire (#PCDATA)>]>
<Catalogue>
<Article>
<noArticle>10</noArticle>
<description>Cèdre en boule</description>
<prixUnitaire>10.99</prixUnitaire>
</Article>
<Article>
<noArticle>20</noArticle>
<Catalogue>
<description>Sapin</description>
<prixUnitaire>12.99</prixUnitaire>
</Article>
…
<Article>
<Article>
</Catalogue>
<noArticle>
<description>
10
Cèdre en boule
<prixUnitaire>
10,99
<noArticle>
<description>
20
Sapin
...
<prixUnitaire>
12,99
25
OLTP
¨ 
On-Line Transaction Processing
¤  Requêtes
simples, rapides, fréquentes
¤  Mise à jour des n-uplets assez fréquentes
¤  Nombre de n-uplets relativement important
26
OLAP
¨ 
On-Line Application Processing
¤  Requête
analytique
¤  Très grand ensemble de données
¤  Peu de requêtes mais complexes et longues
¤  Pas nécessaire d’avoir une base de données totalement
à jour
27
Architecture d'entrepôt de données
BD
opérationnelle
(OLTP)
BD
opérationnelle
(OLTP)
Extraction :
épuration,
filtrage,
synthèse,
transformation,
fusion
Entrepôt de données
(« data wharehouse »)
Analyse
(OLAP),
prospection
Autre
source de
données
Chaîne de traitement : extraction, transformations, analyses
28
Schéma en étoile OLAP
<<Table>>
Client
<<PK>> noClient
nomVille
<<Table>>
Ventes
noClient
noArticle
dateVente
montant
<<Table>>
Article
<<PK>> noArticle
catégorie
Table de faits
Tables de dimensions
<<Table>>
Période
<<PK>> dateVente
mois
trimestre
année
29
Extensibilité
30
¨ 
En cas d’ajout de données, il est possible :
¤  d’augmenter
la taille des tables (extensibilité verticale)
¤  d’augmenter le nombre de serveurs de données et de
répartir les tables sur ces serveurs (extensibilité
horizontale)
Bases de données réparties
31
¨ 
¨ 
Bénéfices potentiels
¤  Performance
¤  Fiabilité et disponibilité
¤  Expansion graduelle (scalabilité)
Inconvénients
¤  Complexité accrue
¤  Transactions réparties
¤  Évaluation de requêtes réparties
¤  Répartition du dictionnaire de données
¤  Coût important
n  conception, administration, …
Théorème CAP
32
¨ 
¨ 
¨ 
Trois propriétés d’un système d’information distribué : cohérence
(Consistency), disponibilité (Availability) et distributivité (Partition)
Un système ne peut que garantir deux de ces propriétés à la fois
Lorsqu’un système d’information réparti s’agrandit, il doit choisir
entre la cohérence et la disponibilité :
¤ 
¤ 
Privilégie la cohérence : SGBD relationnel
Privilégie la disponibilité : NoSQL
NoSQL
33
¨ 
¨ 
¨ 
¨ 
Not Only SQL
Bases de données généralement non relationnelles
Schéma non normalisé, non fixé, pas forcément de jointure
Transaction : propriétés ACID pas nécessairement respectées
¤ 
« cohérent au bout d’un certain nombre d’évènements » : BASE
(Basically Available, Soft state, Eventual consistency)
¨ 
Exemple de solutions NoSQL : BigTable (Google),
Cassandra (Facebook, Reddit, …), couchDB, mongoDB
Types de base NoSQL
34
Key-Value data store
¨  Document based store
¨  Column based store
¨  Graph based store
¨ 
35
SQL
SQL
36
¨ 
¨ 
¨ 
¨ 
¨ 
¨ 
Structured Query Langage
Standard établi pour les SGBD relationnel
Dérivé de l’algèbre relationnel
SQL est un langage où l’utilisateur décrit le résultat à
obtenir (Quoi ?)
SQL est non-procédural : le SGBD détermine
l’enchaînement des traitements à effectuer afin d’obtenir le
résultat (Comment)
Avantage d’être un langage déclaratif : pas de boucles
infinies, pas d’explosion mémoire
Standard SQL
37
— 
— 
SQL est un standard ANSI/ISO
Plusieurs mises à jour du langage :
SQL1 : première version standardisée (1986,1987)
—  SQL2 : mise à jour majeure (type date, opérations
ensemblistes, …)
—  SQL3 : déclencheurs, types composites, fonctionnalités
orientées objets, …
—  SQL:2003, SQL:2006, SQL:2008, SQL:2011
— 
— 
Variations par rapport au SQL standard propre à
chaque SGBD
Langages de requêtes
38
— 
Langage de Définition de Données (LDD) :
— 
— 
— 
— 
— 
Langage de Contrôle de données (LCD) :
— 
— 
— 
Définition de relations, contraintes d’intégrité, …
Définition de vues
Définition d’index
UDF (User Defined Function), Procédure
Définitions des droits : GRANT, REVOKE
Contrôle de transaction : BEGIN, COMMIT, ROLLBACK
Langage de Manipulation de Données (LMD) :
— 
— 
Interrogation : SELECT
Définition, modification, suppression : INSERT, UPDATE, DELETE
39
Dictionnaire de données
— 
Tables contenant les informations sur les objets de la base (métadonnées)
— 
Normalisé dans le standard SQL :
— 
— 
— 
Sous Oracle, les vues du dictionnaires ont des noms de la forme :
— 
— 
— 
— 
— 
DEFINITION_SCHEMA (Tables, non directement accessibles)
INFORMATION_SCHEMA (Vues)
USER_<Objet> : objets appartenant à l’utilisateur courant
ALL_<Objet> : objets accessibles à l’utilisateur courant
DBA_<Objet> : tous les objets de la base (vue réservée à l’administrateur)
Exemples de tables du dictionnaires : DICTIONARY (DICT), USER_TABLES
(TABS), USER_TAB_COLUMNS (COLS), USER_USERS, …
Sous PostgreSQL : INFORMATION_SCHEMA (conforme SQL standard)
— 
— 
Liste des tables : SELECT * FROM INFORMATION_SCHEMA.TABLES;
ou \dt
40
Type SQL : Numérique
— 
INTEGER (ou INT)
— 
— 
Entier (précision non standardisée)
SMALLINT
— 
— 
exact
Petit entier (précision non standardisée)
NUMERIC(p, c) (ou DECIMAL(p, c) ou DEC(p, c)
— 
Nombre décimal avec p chiffres au total, dont c chiffres après la
virgule
Type SQL: Numérique Réel
41
¤  REAL
Point flottant (précision non standardisée)
n  Exemples : 3.27E-4, 24E5
n 
¤  DOUBLE
PRECISION
Point flottant à double précision (non standardisée)
n  Exemples : 3.27265378426E-4, 24E12
n 
Type SQL : Chaîne de caractères
42
— 
Chaîne de caractères (VARYING et NATIONAL : SQL2 intermédiaire)
— 
CHARACTER(n)
— 
— 
CHARACTER VARYING (n)
— 
— 
— 
Ensemble de caractères alternatif (autres langues)
NATIONAL CHARACTER VARYING(n)
— 
— 
Taille variable (max de n caractères)
NATIONAL CHARACTER(n)
— 
— 
Chaîne de caractère de taille fixe égale à n
Taille variable
TEXT
Sous Oracle :
—  CHARACTER ó CHAR
—  CHARACTER VARYING ó VARCHAR2
—  NATIONAL CHARACTER ó NCHAR
—  NATIONAL CHARACTER VARYING ó NVARCHAR2
Type SQL : Date
43
— 
Date et temps
— 
DATE
— 
— 
— 
TIME[(p)]
— 
— 
— 
— 
DATE + TIME
Exemple : TIMESTAMP '1998-08-25 14:04:32.25'
INTERVAL
— 
— 
heure (2 chiffres), minutes (2 chiffres), secondes (2 + p chiffres)
Exemple : TIME '14:04:32.25'
TIMESTAMP[(p)]
— 
— 
année (quatre chiffres), mois (2 chiffres) et jour (2 chiffres)
Exemple : DATE '1998-08-25'
Représente un intervalle de temps.
Sous Oracle :
—  DATE : précision jusqu’à la seconde, format par défaut dépend de la configuration du
SGBD (sous Codd : ‘DD-MON-YY’)
—  TIMESTAMP : précision jusqu’à la fraction de seconde
—  TIMESTAMP, TIMESTAMP WITH TIME ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY
TO SECOND
Type : autres
44
¨ 
Logique à 3 valeurs de vérité : TRUE, FALSE, UNKNOWN
¤ 
¤ 
¤ 
NULL = NULL ?
NULL OR TRUE ?
ROW(1, NULL) = ROW (1, NULL) ?
n 
¨ 
Binaire long (SQL3)
¤ 
¨ 
BINARY LARGE OBJECT (n) (BLOB(n))
Longue chaîne de caractère (SQL3)
¤ 
¤ 
¨ 
IS DISTINCT FROM
CHARACTER LARGE OBJECT (n) (CLOB(n))
NATIONAL CHARACTER LARGE OBJECT (n) (NCLOB(n))
Sous Oracle :
¤ 
¤ 
Pas de type booléen (NUMBER(1) avec contraintes)
BLOB, CLOB, NCLOB disponible (4GB),BFILE (External LOB)
Tableaux
45
Type tableau:
Type[]
Constante tableau:
{val1, val2, val3, …, valn}
Accès:
tab[n] (premier élément a comme indice 1)
Slice:
tab[start:end]
Les tableaux peuvent être concaténés pour obtenir un nouveau tableau
Les fonctions IN, NOT IN, ANY, ALL peuvent être utilisées pour vérifier si un élément
appartient à un tableau
Sous Oracle : VARRAY
Type personnalisé
46
CREATE TYPE rat AS (
p
int,
q
int
);
CREATE TABLE tabRat ( n rat );
INSERT INTO tabRat VALUES ( ROW(1,2) );
SELECT (n).p FROM tabRat;
SELECT (A.n::rat).p FROM (SELECT n FROM tabRat ) AS A;
Rappel SQL
47
CREATE TABLE (
NomCol1
TYPE,
…
NomColn
TYPE [<contraintes colonnes>],
PRIMARY KEY
(Col1, …),
FOREIGN KEY
(Col1, …)
REFERENCES tableEtrangères(ColEt1, …),
[<contraintes lignes>]
);
Mise à jour des données
¨ 
¨ 
¨ 
INSERT : insertion de lignes dans une table
¤  En précisant les lignes à insérer
¤  Les lignes à insérer sont le résultat d’une requête
UPDATE : modification de lignes d’une table
¤  En précisant les lignes à modifier
¤  Les lignes à modifier sont le résultat d’une requête
DELETE : suppression de lignes dans une table
¤  Suppression de toutes les lignes
¤  Suppression des lignes vérifiant une condition de sélection
48
INSERT
INSERT INTO <nom table> [(<nom de colonne>+)]
{ VALUES (<CONSTANTE>+) |
<commande de recherche> };
¨ 
¨ 
¨ 
Généralement dans une table
Si la liste des colonnes n’est pas indiquée, les valeurs doivent être fournies
dans l’ordre de déclaration des colonnes de la table
Les attributs pour lesquels aucune valeur n’est spécifiée auront comme valeur
NULL (l’insertion sera refusée si la valeur NULL n’est pas une valeur valide
pour ces attributs)
49
Exemples
INSERT INTO dpt
VALUES (5, 'Ressource humaine', 15001, 115423);
INSERT INTO dpt (deptno, dnom)
VALUES (6, 'Développement');
INSERT INTO
emp (empno, enom, eprenom, adresse, mgr, deptno)
( SELECT empno, enom, eprenom, adresse, mgr, deptno FROM stagiaire
WHERE duree > 12 );
INSERT ALL
WHEN order_total < 1000000
THEN INTO small_orders
WHEN order_total > 1000000 AND order_total < 2000000
THEN INTO medium_orders
WHEN order_total > 2000000
THEN INTO large_orders
SELECT order_id, order_total, sales_rep_id, customer_id FROM orders;
50
UPDATE
UPDATE <nom_table>
SET
<nom_de_colonne =
{ WHERE
< <valeur> | NULL
> >+
<condition_de_recherche> };
51
Exemples
UPDATE emp
SET mgr = 12;
UPDATE emp
SET salaire = salaire + 500
WHERE mgr = 12;
UPDATE emp
SET salaire = 60000, mgr IS NULL
WHERE empno = 12;
UPDATE emp E
SET (salaire,deptno) =
( SELECT salaire, deptno FROM emp M
WHERE M.empno=E.mgr )
RETURNING sum(salaire) INTO :varOracle;
52
DELETE
DELETE FROM <nom table>
[WHERE <condition de recherche>];
Exemple :
DELETE FROM projet;
DELETE FROM emp
WHERE deptno = 10;
53
TRUNCATE, MERGE (SQL standard)
54
¨ 
Supprimer les n-uplets d’une table et désallouer l’espace
mémoire correspondant
¤  TRUNCATE
¨ 
table1;
Les commandes MERGE ou <UPDATE OR INSERT INTO>
permettent d’ajouter à une relation des n-uplets s’ils ne
sont pas déjà présents dans cette relation et les mettre à
jour sinon :
merge into customers(id,name) c using (select id, name from
customers_delta where id > 10) cd on (c.id = cd.id)
when matched then update set name = cd.name
when not matched then insert (id, name) values (cd.id, cd.name);
55
SELECT
Exemples :
SELECT * FROM emp WHERE salaire > 35000 AND deptno BETWEEN 1 AND 5;
SELECT * FROM emp WHERE enom LIKE 'J%';
SELECT
56
Syntaxe
SELECT [DISTINCT] col1 AS alias_col1, …, coln
[INTO variables]
FROM table t1, …, table tn
WHERE … ;
¨ 
¨ 
Opérations ensemblistes sur le résultat des requêtes
SQL :
<req1> UNION| INTERSECT | EXCEPT <req2>
ORACLE :
<req1> UNION| INTERSECT | MINUS <req2>
UNION, INTERSECT, MINUS supprime les doublons (utiliser UNION ALL,
INTERSECT ALL ou MINUS ALL pour les conserver)
57
ORDER BY, LIMIT
¨ 
Tri des n-uplets résultats :
ORDER BY col1, …, col2 [ASC|DESC]
[NULLS FIRST | NULLS LAST]
¨ 
Ne sélectionner que N n-uplets à partir du Kième :
SELECT * FROM table ORDER BY col1
LIMIT n OFFSET k;
¨ 
Il est aussi possible d’utiliser ROWNUM, ROW_NUMBER() ou RANK() qui
contient l’indice du n-uplet courant (Oracle n’accepte que cette solution)
SELECT *
FROM
(SELECT row_number() OVER (ORDER BY col1)
AS rang FROM t order by t desc) AS tab1
WHERE rang <= 3;
58
— 
— 
— 
— 
— 
— 
— 
Jointure
SELECT * FROM dpt, emp WHERE emp.deptno = dpt.deptno;
Syntaxe jointure :
—  plus explicite sur le type de jointure utilisé
—  Extrait les conditions de jointures des critères de restrictions
Jointure naturelle : NATURAL JOIN
Exemple : SELECT * FROM dpt NATURAL JOIN emp;
Au mins une colonne de même nom doit exister dans les deux tables
Jointure naturelle partielle : JOIN … USING (…)
Exemple : SELECT * FROM dpt JOIN emp USING (deptno);
Jointure : JOIN/ INNER JOIN … ON
Exemple : SELECT * FROM emp e1 INNER JOIN emp e2 ON e1.mgr=e2.emp;
Jointure externe : LEFT/RIGHT/FULL OUTER JOIN
Exemple : SELECT * FROM emp LEFT OUTER JOIN dpt ON emp.deptno = dpt.deptno;
Tous les n-uplet de emp seront affichés même si la condition de jointure n’est pas réalisée. Dans ce cas, les
attributs de dpt associés aux valeurs de emp n’ayant pas de correspondance auront comme valeur NULL.
Produit cartésien : CROSS JOIN
Fonctions d’agrégation SQL
59
¨ 
Partition d’une table avec la clause GROUP BY
SELECT deptno, count(empno) AS nbEmp FROM emp
GROUP BY deptno;
empno
name
deptno
7639
SMITH
20
deptno
7521
CLARK
20
20
2
7834
KING
30
30
1
8456
SCOTT
40
40
2
6210
TURNER
40
50
1
9566
WARD
50
nbEmp
—  Colonnes résultats d’une requête GROUP BY, uniquement colonnes de groupage ou
résultats de fonctions d’agrégation
—  Fonctions d’agrégation : AVG, COUNT, MAX, MIN, SUM, …
Fonctions d’agrégation SQL
60
¨ 
Restriction des partitions sélectionnées avec la clause HAVING
SELECT deptno, count(empno) AS nbEmp FROM emp
GROUP BY deptno
HAVING count(empno) > 1;
empno
name
deptno
7639
SMITH
20
deptno
7521
CLARK
20
20
2
7834
KING
30
40
2
8456
SCOTT
40
6210
TURNER
40
9566
WARD
50
nbEmp
—  Attention à bien distinguer les conditions de restriction sur les n-uplets (WHERE …) des
conditions de restriction sur les groupes (HAVING …)
61
¨ 
¨ 
¨ 
Fonctions fenêtres
Les fonctions fenêtres permettent d’ajouter à un enregistrement les résultats d’une
fonction d’agrégation
Ecrire une requête permettant de visualiser pour chaque employé, son nom, sa fonction,
son âge ainsi que l’âge moyen des employés de l’entreprise :
¤  SELECT enom, job, age, avg(age) OVER () FROM emp;
Ecrire une requête permettant de visualiser pour chaque employé, son nom, sa fonction,
son âge ainsi que l’âge moyen des employés de son département :
¤  SELECT enom, job, age,
avg(age) OVER (PARTITION BY deptno) FROM emp;
¤ 
SELECT enom, deptno, age,
rank() OVER (PARTITION BY deptno ORDER BY age DESC)
FROM emp;
62
Sous-requêtes
¨ 
¨ 
Une sous-requête est une requête SQL imbriquée
dans une autre requête SQL
Une sous-requête peut apparaitre juste après :
¤ 
¤ 
¤ 
¤ 
¨ 
SELECT
FROM
WHERE
…
Si cela est possible, toujours préférer l’utilisation de
jointures à celle de requêtes imbriquées
63
Sous-requêtes dans le SELECT
SELECT E.enom, ( SELECT D.dnom
FROM dpt AS D
WHERE E.deptno=D.deptno )
FROM emp AS E;
—  Que se passe t-­‐il si la sous-­‐requête retourne plusieurs résultats ? —  Si possible, désimbriquer la requête
SELECT enom, dnom
FROM emp NATURAL JOIN dpt;
SELECT D.dnom, ( SELECT count(*)
FROM emp AS E
WHERE E.deptno=D.deptno )
FROM dpt AS D;
64
Sous-requête dans le FROM
SELECT E2.enom
FROM ( SELECT *
FROM emp AS E1
WHERE E1.salaire > 2000) AS E2
WHERE E2.salaire < 3000;
SELECT E.enom
FROM
emp AS E
WHERE E.salaire > 2000 AND E.salaire < 3000;
Sous-requête dans le WHERE
65
SELECT enom FROM emp
WHERE empno IN (SELECT mgr FROM emp);
SELECT E1.enom
FROM emp AS E1 JOIN emp AS E2
ON E1.empno = E2.mgr;
Requêtes corrélées
66
¨ 
Sous-requête corrélée à la requête principale
SELECT E1.empno, E1.enom
FROM emp AS E1
WHERE E1.salaire > (SELECT E2.salaire
FROM emp AS E2
WHERE E1.mgr = E2.empno);
SELECT E1.enom
FROM emp AS E1 JOIN emp AS E2
ON E1.mgr = E2.empno
WHERE E1.salaire > E2.salaire;
—  Il n’est pas forcément facile de désimbriquer toutes les requêtes
SELECT E1.empno, E1.enom
FROM emp AS E1
WHERE E1.salaire > (SELECT max(E2.salaire)
FROM emp AS E2
WHERE E2.mgr = E1.empno);
Tests d’existence
67
¨ 
EXISTS / NOT EXISTS
SELECT dnom FROM dpt
WHERE EXISTS (SELECT * FROM emp
WHERE emp.deptno = dpt.deptno)
SELECT dnom FROM dpt NATURAL JOIN emp;
68
Quantificateurs
— 
ALL : le résultat de la comparaison d’une valeur au résultat d’une sous-requête doit être vérifié pour tous les
n-uplets résultat d’une sous-requête.
SELECT empno, enom FROM emp e1
WHERE e1.salaire > ALL
( SELECT e2.salaire FROM emp e2
WHERE e2.mgr = e1.empno );
— 
SOME/ANY : le résultat de la comparaison d’une valeur au résultat d’une sous-requête doit être vérifié pour
au moins un des n-uplets résultat d’une sous-requête.
SELECT empno, enom FROM emp e1
WHERE e1.salaire > ANY
( SELECT e2.salaire FROM emp e2
WHERE e2.mgr = e1.empno );
¨ 
Transformer les requêtes imbriquées en jointures : ¤ 
¤ 
Facile pour les tests d’existences : IN, EXISTS, SOME Difficile pour les quantificateurs universels : NOT IN, NOT EXISTS, ALL Requête monotone
69
¨ 
¨ 
Une requête est monotone si lorsqu’on ajoute des n-uplets aux tables
en entrée, le nombre de n-uplets de la table résultat ne diminue pas
Parmi les opérations suivantes, lesquelles sont monotones ?
SELECT … FROM … WHERE …
¤  … JOIN …
¤  UNION, INTERSECT, MINUS
¤ 
Requête monotone
70
Emp
Travaille
Projet
¨ 
¨ 
¨ 
¨ 
(empno, enom, salaire, job, deptno)
(empno, projno)
(projno, pnom, deptno)
Les requêtes suivantes sont-elles monotones ?
¤  les employés qui travaillent sur un projet du département 10 mais pas sur
un projet du département 50
¤  les employés dont le métier est analyste et qui n’ont pas le salaire le plus
important de leur département
Les requêtes monotones peuvent être désimbriquées
Les requêtes monotones peuvent donc être résolues par un simple
SELECT
… FROM … WHERE …
Pour les requêtes qui ne sont pas monotones, il est nécessaire d’utiliser quelque
chose en plus : MINUS, NOT IN, ALL, partitionnement, …
Requête monotone
71
¨ 
Les requêtes suivantes sont-elles monotones ?
¤ 
les employés qui travaillent sur un projet du département 10
¤ 
les employés qui ne travaillent que sur des projets du département 10
¤ 
Les employés qui travaillent sur tous les projets du département 10
¤ 
Les employés qui ne travaillent sur aucun projet du département 10
¤ 
Les employés qui travaillent sur un projet qui n’est pas du département 10
Désimbriquation de requête utilisant des fonctions d’agrégation
72
SELECT DISTINCT D.deptno, (SELECT count(*)
FROM emp AS E
WHERE E.deptno=D.deptno)
FROM dpt AS D;
SELECT dnom, count(*)
FROM emp NATURAL JOIN dpt
GROUP BY deptno, dnom;
—  Les requêtes sont-elles équivalentes ?
SELECT dnom, count(*)
FROM emp RIGHT OUTER JOIN dpt
GROUP BY deptno, dnom;
Désimbriquation de requête utilisant des fonctions d’agrégation
73
SELECT DISTINCT E.enom FROM emp AS E
WHERE ( SELECT count(projno)
FROM projet AS P
WHERE P.empno=E.empno )
> 5;
SELECT enom
FROM emp NATURAL JOIN projet
GROUP BY empno
HAVING count(projno) > 5;
74
Sous-requête WITH
¨ 
Permet de déclarer une table temporaire (généralement le résultat d’une sousrequête qui n’existera que le temps de la requête) :
WITH temp1 AS (SELECT … FROM … WHERE … ),
…
tempN AS (SELECT … FROM … WHERE … )
SELECT … FROM temp1, …, tempN, … WHERE …;
¨ 
Exemple :
WITH partavg AS
(SELECT AVG(current_qt) AS avg_qt FROM part)
SELECT part_number, (SELECT avg_qt FROM partavg)
FROM part WHERE current_qt > (SELECT avg_qt FROM partavg);
Requêtes récursives (SQL)
75
Parcours d’arborescence/graphe
WITH RECURSIVE Chemin(x,y) AS
(SELECT x,y FROM Arc)
UNION
(SELECT C1.x, C2.y
FROM Chemin C1, Chemin C2
WHERE C1.y = C2.x)
SELECT * FROM Chemin;
Table Arc
x
y
1
3
2
3
3
4
3
5
Table Ch e m in
x
y
1
3
2
3
3
4
3
5
1
4
1
5
2
4
2
5
Requêtes récursives (Oracle)
76
Parcours d’arborescence/graphe
SELECT x, y
FROM Chemin
START WITH x in (1,2,3)
CONNECT BY PRIOR y=x;
Table Arc
x
y
1
3
2
3
3
4
3
5
Table Ch e m in
x
y
1
3
2
3
3
4
3
5
1
4
1
5
2
4
2
5
—  Possibilité d’utiliser l’attribut level pour connaitre la profondeur de récursivité
—  CONNECT BY NOCYCLE: permet d’éviter de boucler
Correspondance de texte
77
¨ 
LIKE
¤ 
¤ 
¨ 
SIMILAR TO permet d’utiliser des expressions régulières (REGEXP_LIKE sous ORACLE)
¤ 
¨ 
'CAT' LIKE 'C%'
'CAT' LIKE '_A_'
'CAT' SIMILAR TO '(C|R)%’ (préférer ~ sous postgreSQL)
Recherche texte dans des documents
¤ 
Il est préférable que le texte des documents soit indexé et que les termes recherchés soit
des lexèmes
¤ 
Exemple sous postgreSQL:
SELECT to_tsvector(document) @@ to_tsquery('running & dog')
FROM document_list;
Préparer une instruction SQL
78
¨ 
¨ 
¨ 
Avant l’exécution proprement dite d’une instruction SQL, les différents plans
d’évaluation possibles sont évalués. Cette opération est relativement couteuse.
Si une requête est exécutée plusieurs fois, il peut être avantageux de « préparer la
requête » : le meilleur de plan de requête ne sera recherché qu’une seule fois.
Exemple:
PREPARE planexec(text,int) AS
SELECT enom, salaire FROM emp
WHERE job=$1 AND salaire>=$2;
EXECUTE planexec('Analyst',3000);
EXECUTE planexec('Clerk',2000);
79
VUE
Vue : définition
80
¨ 
Table virtuelle de la base de données dont le
contenu est défini par une requête
La vue n’existe pas en tant qu’ensemble de données
stockées sur le disque
⇒  seule la requête décrivant la vue est stockée
¨ 
Vue : avantages
81
— 
indépendance logique
exemple:
infoDepartement_vue(idDept, nomDept, Loc, nbEmp, SalTot);
— 
simplification de requêtes
département de plus de 10 employés et dont la masse salariale
est inférieure à 20 K€ ?
— 
isolation des modifications
- - emp sans indiquer le salaire
emp_vue(idEmp, nom, prénom, job, idDept)
— 
sécurité
— 
intégrité des données
Vue : inconvénients
82
¨ 
performance
n  la
¨ 
traduction de la requête peut être longue
restriction des mises à jour
n  possibilité
de mise à jour qu’à partir de vues simples
Vue : syntaxe
83
CREATE [OR REPLACE]
VIEW nomvue [col,…]
AS SELECT …
[WITH CHECK OPTION [CONSTRAINT nom]];
DROP VIEW nomvue;
RENAME ancien_nom TO nouveau_nom;
84
Vue : exemple
CREATE VIEW emp_recherche
AS
SELECT * FROM emp NATURAL JOIN dpt
WHERE dnom='Recherche' ;
SELECT * FROM emp_recherche ;
Vue : mise à jour
85
— 
Conditions
— 
construite sur une seul table
— 
— 
— 
— 
— 
possible sur vue comportant une jointure si les modifications/
suppressions/insertions ne concernent qu’une table de la jointure
pas de GROUP BY
les colonnes résultats doivent être des colonnes réelles de la table
(non calculées)
la vue contient toutes les colonnes NOT NULL de la table
Permet
— 
— 
— 
d’insérer à travers la vue de nouvelles lignes
de supprimer des lignes de la table à partir de la vue
de mettre à jour la table par l’intermédiaire de la vue
Vue : contrôle d’intégrité
86
CHECK OPTION :
cette clause permet d’interdire d’insérer ou de modifier à travers
la vue des n-uplets qui ne satisferaient pas à la définition de la
vue.
Check Option: exemple
87
> CREATE OR REPLACE VIEW empInge AS
SELECT * FROM emp
WHERE job= 'Ingenieur'
WITH CHECK OPTION
CONSTRAINT Check_inge;
> UPDATE empInge
SET job='manager'
WHERE idEmp='1123' ;
> ORA-01402: view WITH CHECK OPTION
clause violation
Vue matérialisée
88
¨ 
¨ 
¨ 
Vue physique d'une table (SNAPSHOT)
Duplication des données
⇒ nécessité de synchroniser les données
⇒ à n’utiliser que pour des requêtes particulièrement
lourdes
La fréquence des mises à jour de la vue matérialisée est
à préciser
Vue matérialisée : syntaxe
89
CREATE MATERIALIZED VIEW <nomVue>
REFRESH <précisions mise à jour>
AS
<requête>;
Les données de la table sont copiées dans la vue matérialisée à sa
création
90
Vue matérialisée : mode de rafraichissement
Modes de rafraichissement de la vue :
— 
— 
sur commit : clause ON COMMIT
à la demande (asynchrone, mode par defaut) : clause ON DEMAND (utilise des procédures du package standard
DBMS_MVIEW).
execute DBMS_REFRESH.MAKE('group_vue', 'vueMat1');
execute DBMS_REFRESH.REFRESH('group_vue');
— 
périodique : clauses START WITH et NEXT, qui précise une date de début et une période de temps intermédiaire
CREATE MATERIALIZED VIEW vueMat1
REFRESH START WITH SYSDATE NEXT SYSDATE + 1
AS
SELECT * FROM emp
WHERE job = 'ANALYST';
91
LIMITES SQL
92
Embedded SQL
— 
Les manques de SQL
— 
— 
— 
— 
⇒ 
— 
structures de programme
structures de contrôle
structures de données
facilités pour les entrées/sortie
problème pour développer des applications
Approche « Embedded SQL » — 
— 
— 
Insertion de SQL dans un langage de programmation
technique de pré-compilation
normalisation (Pascal, C, …)
— 
— 
Pro*C/C++ pour Oracle
Inconvénients
— 
— 
— 
deux systèmes de types
correspondance ensembliste/unaire
deux styles de programmation
Exemple : JDBC
// Exemple de programme JAVA qui utilise le pilote JDBC OCI8 d'Oracle
// pour insérer une ligne dans la table Client
// Il faut importer le paquetage java.sql pour utiliser JDBC
import java.sql.*;
class ClientInsertJDBC
{
public static void main (String args [])
throws SQLException, ClassNotFoundException, java.io.IOException
{
// Charger le pilote JDBC d'Oracle
Class.forName ("oracle.jdbc.driver.OracleDriver");
// Connexion à une BD
Connection uneConnection =
DriverManager.getConnection ("jdbc:oracle:oci8:@", "Scott", "Tiger");
// Création d'un énoncé associé à la Connection
Statement unEnoncéSQL = uneConnection.createStatement ();
// Insertion d'une ligne dans la table Client
int n = unEnoncéSQL.executeUpdate
("INSERT INTO CLIENT " +
"VALUES (100, 'Smith', '911')");
System.out.println ("Nombre de lignes inserees:" + n);
// Fermeture de l'énoncé et de la connexion
unEnoncéSQL.close();
uneConnection.close();
93
}
}
Exemple: SQLJ (préprocesseur SQL)
// Définition de la classe IteratorClient avec liaison par nom
#sql iterator IteratorClient(int noClient, String nomClient);
// Création d'un objet itérateur
IteratorClient unIteratorClient;
// Liaison de l'énoncé SELECT de l'itérateur
#sql
unIteratorClient =
{ SELECT idClient, nomClient
FROM Client WHERE idClient > 40};
// Accès au résultat du SELECT par itération sur les lignes
while (unIteratorClient.next()){
System.out.println("Numéro du client : " + unIteratorClient.idClient());
System.out.println("Nom du client : " + unIteratorClient.nomClient());
}
// Fermer l'itérateur
unIteratorClient.close();
94
Annexe : SQL intégré dans un langage de programmation
⇒ LINQ (.net)
var ensemblePays = new Pays[]{
new Pays("France",
60000000,
550000),
new Pays("Turquie",
70000000,
750000),
new Pays("Chine",
1300000000, 9600000),
new Pays("USA",
300000000, 9000000),
new Pays("Maroc",
31000000,
450000),
new Pays("Suisse",
7500000,
40000) };
var grosPays = from p in ensemblePays
where p.Superficie > 1000000
select p;
…
foreach (var p in grosPays)
{
Console.WriteLine(p);
}
95
Extensions procédurales SQL
96
Principe :
¨  ajout à SQL de structures de contrôle
⇒ SQL + outils procéduraux
⇒ notion de « procédures stockées » Standardisation : PSM (Persistent Stored Modules)
¨  Exemples :
¤  MySQL
: SQL/PSM
¤  Oracle : PL/SQL
¤  PostgreSQL : PL/PSM et PLpgSQL
¤  SQLserver : Transact-SQL
Téléchargement