AlgebreSQL Support - Tex
AlgebreSQL Support - Tex
Introduction
aux bases de données
et au langage SQL
I Introduction 1
1 Introduction 1
2 Pré-requis 1
5 Le langage SQL 6
6 Terminologie 7
BDSQL1 I
TABLE DES MATIÈRES
15 DML - update 22
15.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
15.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
18 Projection 26
18.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
18.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
19 Sélection : where 28
19.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
19.2 Opérateurs de comparaison et connecteurs logiques . . . . . . . . . . . . . . . . . . 29
19.3 Opérateur étendus SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
19.4 Exemples : opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . . . . . 30
19.5 Exemples : opérateurs SQL étendus . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
20 Renommage 35
20.1 Syntaxe : alias de table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
20.2 Syntaxe : alias de colonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
20.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
21 Union : union 38
21.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
21.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
22 Différence 40
22.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
BDSQL1 II
TABLE DES MATIÈRES
24 Intersection 45
24.1 Syntaxe SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
28 Division 59
29 Agrégats 60
29.1 Syntaxe générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
29.2 Agrégat global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
29.3 Agrégat par valeur de regroupement : group by . . . . . . . . . . . . . . . . . . . 63
29.4 Sélection après agrégat : having . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
30 Calculs et fonctions 66
30.1 Calculs de valeurs d’attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
30.2 Calculs à l’aide de fonctions intégrées . . . . . . . . . . . . . . . . . . . . . . . . . . 67
30.3 Choix d’une valeur selon une condition... . . . . . . . . . . . . . . . . . . . . . . . . 72
32 Sous-requêtes 75
32.1 Sous-requêtes indépendantes ou corrélées . . . . . . . . . . . . . . . . . . . . . . . 75
32.2 Formes de résultat d’une sous-requête . . . . . . . . . . . . . . . . . . . . . . . . . . 76
32.3 Utilisation de sous-requêtes à résultat unique . . . . . . . . . . . . . . . . . . . . . . 77
32.4 Utilisation de sous-requêtes à lignes multiples et colonne unique . . . . . . . . . . . 82
32.5 Utilisation de sous-requêtes à jeu de données quelconque : opérateur exists . . . 84
32.6 Application à la différence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
32.7 Application à l’intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
32.8 Application à la division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
33 Résumé select 92
BDSQL1 III
TABLE DES MATIÈRES
V Performance et sécurité 93
34 Organisation des index 93
34.1 Graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
34.2 Arbres binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
34.3 Arbres binaires de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
34.4 Arbres binaires de recherche équilibrés ou arbres AVL . . . . . . . . . . . . . . . . . 98
34.5 Application aux bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
35 Transactions 105
35.1 Démarrer une transaction : start transaction . . . . . . . . . . . . . . . . . 106
35.2 Valider les mises à jour effectuées : commit . . . . . . . . . . . . . . . . . . . . . . 106
35.3 Annuler les mises à jour effectuées : rollback . . . . . . . . . . . . . . . . . . . . 106
35.4 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
BDSQL1 IV
TABLE DES MATIÈRES
BDSQL1 V
TABLE DES FIGURES
BDSQL1 VI
LISTE DES TABLEAUX
BDSQL1 VII
Première partie
Introduction
1 Introduction
2 Pré-requis
Ce support considère comme acquises les notions fondamentales
• de modèle relationnel
• et d’algèbre relationnelle.
• sécurisée : l’accès aux données est contrôlé ; des privilèges d’accès spécifiques sont attribués
aux utilisateurs, ou groupes d’utilisateurs ;
• partagée : l’accès simultané aux données par plusieurs utilisateurs est permis : des méca-
nismes de contrôle sont mis en oeuvre afin de garantir la cohérence des données accédées ;
• cohérente : les données sont contrôlées en utilisant divers mécanismes comme le contrôle des
doublons de valeur dans une colonne (intégrité d’entité), le contrôle qu’une donnée d’une
table fait bien référence à une données identique dans une autre table (intégrité référentielle),
etc. ;
• fiable : la garantie de stabilité des données est assurée, même après incident ; des systèmes
de journalisation de toutes les modifications permettent le retour de la base de données à un
état antérieur cohérent ;
BDSQL1 1
3.3 SGBDR fichier
• performante : l’accès aux informations est réalisé en un temps optimal grâce à des structures
de données performantes (sous forme d’arbres) aussi bien pour stocker les données que pour
les interroger ;
• indépendante des programmes : assure une indépendance des données au regard des applica-
tions et des utilisateurs qui y accède (indépendance logique) et des systèmes qui les hébergent
(indépendance physique vis-à-vis des systèmes de gestion de fichiers)
Finalement, grâce à un langage standard, SQL, il est possible de décrire tous les objets d’une
base de données et définir les liens existant entre eux, d’ajouter, modifier et supprimer des données,
d’accéder aux données déjà mémorisées, etc.
Les SGBDR (R pour Relationnels) sont les SGBD des bases de données relationnelles (en anglais
: RDBMS, Relational Database Management System)
• intégrité de domaine : assure qu’une colonne contient une donnée d’un certain type ;
• intégrité d’entité : assure qu’il n’y a pas de doublons de lignes dans une table ;
• intégrité référentielle : assure qu’un ligne ne peut être supprimée si elle est référencée par une
autre ligne ;
• autres formes d’intégrité personnalisables (comme les déclencheurs (en anglais : triggers)).
BDSQL1 2
3.6 SGBD et norme ANSI/SPARC
Les contraintes sont les règles que le SGBDR devra contrôler afin de garantir l’intégrité des
données d’une base de données (voir section 7.1 en page 9).
• niveau externe : offrir une vue utilisateurs d’un sous-ensemble du schéma de la BD (vues)
• niveau conceptuel (ou logique) : organisation logiques de données et des liens (schémas de
bases de données : tables, contraintes)
• niveau interne (ou physique) : implantation des BD sur des supports physiques (fichiers)
Chacun des niveaux est indépendant des autres. Ainsi l’administrateur de la base de données
peut-il modifier
• le stockage des données (sur plusieurs disques par exemple) sans que cela n’influe sur la
représentation conceptuelle des données
• le schéma conceptuel (ajout de tables, par exemple) sans que cela n’influe sur les vues qu’ont
les utilisateurs sur la base de données.
BDSQL1 3
4.2 Choix du SGBD et types de données
Attention
Il faut néanmoins garder à l’esprit les domaines initiaux afin de ne pas effectuer d’opération
non compatibles dans les requêtes d’interrogation.
Conseil
utilisez uniquement les caractères : [ a .. z ] ou [ A .. Z], [ 0 .. 9 ], [ _ ] pour coder les noms de
tables et colonnes. Vous limiterez ainsi les problèmes de portage des requêtes d’une base de
données vers une autre .
Deux approches coexistent dans l’écriture des requêtes SQL et concernent la casse des carac-
tères :
BDSQL1 4
4.4 Représentation du Modèle Physique de Données
R
A char(1)
B char(1)
C char(1)
pilote
numpil int PK
vol numpil = numpil nompil varchar(20)
numvol int PK vilpil varchar(20)
numpil int FK salairepil numeric(10,2)
numav int FK
departvol date numav = numav
dureevol decimal(6,2) avion
vildepvol varchar(20)
numav int PK
vilarrvol varchar(20)
nomav varchar(20)
localisav varchar(20)
capamaxav int
BDSQL1 5
5 Le langage SQL
SQL (en anglais : Structured Query Language) est LE langage permettant de donner des ordres aux
SGBDR afin d’accéder aux services qu’il offre : créer les tables, gérer leur contenu et les interroger
mais aussi configurer la sécurité d’accès aux tables.
Le langage SQL s’appuie sur les opérateurs de l’algèbre relationnelle définis en 1970 par Ted
Codd, mathématicien, chercheur chez IBM (à l’époque : Sequel, Structured English as a QUery
Language).
SQL est un langage qui évolue :
• SQL1 (SQL89) : première version avec quelques défauts corrigés dans la suivante
• → SQL2 (SQL92) : la version la plus implantée actuellement (norme ANSI X3.135-1992, [Link]) ;
les versions suivantes vont étendre les possibilités
Requête
Une requête est un ordre transmis au SGBD(R) afin de modifier la structure ou le contenu de
la base de données, ou d’interroger les données qui y sont stockées.
Une requête retourne un résultat différent selon le type d’ordre : soit une information
signalant que l’ordre a bien été exécuté, soit les informations qui ont été demandées.
BDSQL1 6
Le langage SQL permet de couvrir tous les besoins d’accès aux bases de données relationnelles
grâce à 5 groupes d’ordres SQL :
• Data Definition Language (DDL), le Langage de Définition des Données (LDD), permet la ges-
tion des tables de la base de données (création, jouter des colonnes, supprimer des colonnes,
etc.)
• Data Manipulation Language (DML), le Langage de Manipulation des Données (LMD) donne
accès au contenu des tables : ajouter des lignes, modifier des valeurs de colonnes, supprimer
des lignes.
• Data Query Language (DQL), le Langage d’Interrogation des Données (LID) permet de construire
des requêtes d’interrogation des données à partir des tables.
• Data Control Language (DCL), le Langage de Contrôle des Données (LCD), permet la gestion
des privilèges d’accès aux tables par utilisateur (voir section 36 en page 107)
• Transaction Control Language (TCL), le Langage de Contrôle des Transactions, permet la ges-
tion de l’intégrité des données dans la base de données (voir section 35 en page 105)
D’autres ordres spécifiques peuvent compléter cet ensemble pour réaliser des tâches d’administra-
tion de la base de données.
Les requêtes SQL d’interrogation sont soumises au SGBDR qui effectue les traitement suivants :
1. analyse lexicale du texte de la requête : en cas d’erreur de syntaxe, une erreur est retournée
3. optimisation à partir des statistiques de volumétrie des tables utilisées et construction du plan
d’exécution
6 Terminologie
En passant de la théorie de Codd aux bases de données relationnelles, de nouveaux termes s’ap-
pliquent :
Table 2 – Terminologie relationnelle/bases de données
BDSQL1 7
Les langage SQL prend quelques libertés avec la théorie de l’algèbre relationnelle. Cela sera
précisé.
BDSQL1 8
Deuxième partie
• not null : assure qu’une colonne ne peut avoir une valeur nulle
• default : assure une valeur par défaut au cas où la valeur n’est pas renseignée pour une
colonne
• unique : assure que toutes les valeurs d’une colonne seront différentes (chacune sera unique...)
• foreign key : identifie une ligne d’une autre table (généralement) avec une valeur unique
• check : détermine les conditions de validité d’une valeur, les valeurs autorisées pour une
colonne
• la définition des ’contraintes’ que le SGBD aura à effectuer lors du stockage de valeurs dans
ces colonnes (les contraintes appliquées aux colonnes)
Le nommage explicite des contraintes permet également d’identifier clairement les problèmes
liés à celles-ci (messages d’erreurs), de les supprimer ou de les modifier.
1
Attention quand même : quand on supprime une table, son contenu disparait également !
BDSQL1 9
8 DDL - create database et drop database
L’ordre SQL create database crée une nouvelle base de données, l’ordre SQL drop database
supprime une base de données et tous les objets qu’elle contient.
Syntaxe SQL
Créer une base de données
1 create database nomBase
2 character set nomJeuDeCaracteres
3 ;
où :
Par défaut, un jeu de caractères est associé à une ’collation’ qui est la manière dont certains
caractères sont considérés lors des classements, par exemple ; on trouvera des collations ’CI’
pour ’case insensitive’, soit insensibles à la casse, d’autres ’CS’ pour ’case sensitive’, sensibles
à la casse.
Syntaxe SQL
Supprimer une base de données
1 drop database nomBase
2 ;
Attention
Attention à l’utilisation de l’ordre drop database qui supprime tous les objets de la base
de données et ses fichiers du disque dur.
2
la commande ’show character set’ liste tous les noms des jeux de caractères disponibles
BDSQL1 10
9 DDL - create table
L’ordre SQL create table permet la création d’une table.
Créer une table, c’est définir :
9.1 Syntaxe
Syntaxe SQL
Créer une table
1 create table nomTable (
2 nomColonne type [contrainte][auto_increment][defaut],
3 [nomColonne type [contrainte][defaut],etc.]
4 );
où :
• auto_increment : mot-clef précisant que la valeur de cette colonne sera, par défaut, in-
crémentée automatiquement
Syntaxe SQL
Créer une table à partir de la description d’une autre
1 create table nomTable like autreTable
2 ;
Lorsqu’on crée une table sous MySql, plusieurs fichiers sont créés sur le disque dur :
BDSQL1 11
9.2 Exemple
9.2 Exemple
Ici, on a volontairement ignoré les contraintes d’intégrité d’entité et référentielle. Elle pourront
être définies en utilisant l’ordre alter table.
Conseil
Séparer la définition du conteneur de celle des contraintes est une bonne pratique.
BDSQL1 12
nombres de lignes : 7
L’ordre show create table permet l’affichage d’ordre SQL de création de la table :
Listing 5 – Afficher de la description de la table ’personnel’
1 show create table personnel;
nombres de lignes : 1
10.1 Syntaxe
Syntaxe SQL
Modifier la structure ou des contraintes associées à une table
1 alter table nomTable
2 add constraint defContrainte
3 | add [column] defColonne
4 | alter [column] {set default valeur | drop default }
5 | modify [column] nomColonne defColonne
6 | change [column] nomColonne nouvColonne defColonne
7 | rename [to|as] nouvNomTable
8 | drop [constraint] nomContrainte
9 | drop foreign key nomContrainte
10 | drop primary key
11 | drop [column] nomColonne
12 ;
où :
• defContrainte : contrainte concernant une colonne ou une table : type, nom, etc.
BDSQL1 13
10.2 Définition des contraintes
Le maintien de l’intégrité d’entité consiste à s’assurer que chaque ligne d’une table possédera une
clef primaire différente.
La clef primaire peut être composée de plusieurs colonnes.
Listing 6 – Contrainte d’intégrité d’entité en SQL (MySQL)
1 constraint nomContrainte
2 primary key (colonnesClef)
où :
Le maintien de l’intégrité référentielle consiste à s’assurer que l’ensemble de colonnes formant une
clef étrangère existe bien comme clé primaire dans la table cible, généralement une autre table.
La clef étrangère peut être composée de plusieurs colonnes.
Listing 7 – Contrainte d’intégrité référentielle avec MySQL
1 constraint nomContrainte
2 foreign key (colonnesClef)
3 references nomTableRef (colonnesClef)
4 [on update {cascade | set null} ]
5 [on delete {cascade | set null} ]
6 [ [not] deferrable]
avec
BDSQL1 14
10.3 Exemples
• nomContrainte : nom que l’on donne à la contrainte (par exemple ’FK_x_y’ pour une contrainte
de la table source ’x’ vers la table cible ’y’)
10.3 Exemples
3
Sur les transactions, Cf section 35 en page ??.
4
cf. "set constraint nomContrainte deferred"
BDSQL1 15
10.3 Exemples
Listing 10 – Ordre SQL de suppression de la colonne ’stockMini’ : les données sont perdues
1 alter table produit
2 drop column stockMini
3 ;
L’ordre show columns permet l’affichage de la structure d’une table avec des informations sur
les index :
Listing 14 – Afficher de la description de la table ’personne’
1 show columns from personne;
• la colonne ’key’ contient : ’pri’ pour primary key, ’mul’ pour un index avec doublons
(une clef étrangère ou un index),
BDSQL1 16
• la colonne ’extra’ contient des informations complémentaires comme auto_increment.
Suppression de table
Les données sont perdues !
11.1 Syntaxe
Syntaxe SQL
Supprimer une table
1 drop table [if exists] nomTable;
où :
11.2 Exemple
Soient les tables ’produit’ et ’famille’, soit la clef étrangère Fk_Produit_Famille :
Listing 15 – Ordre SQL de suppression de la table ’famille’, cible d’une contrainte d’intégrité réfé-
rentielle
1 drop table famille
2 ;
Pour pouvoir supprimer la table, il faut d’abord supprimer les contraintes dont elle est la cible,
celle-ci se trouvant généralement dans d’autres tables.
BDSQL1 17
12 DDL - create index et drop index
Un index sert à accélérer les recherches portant sur une ou plusieurs colonnes d’une table, autres
que la clef primaire, pour laquelle un index est automatiquement créé. En général, l’index porte
sur des clefs candidates des relations d’origine.
Un index est une table système référençant toutes les valeurs d’une colonne (une clef) et l’adresse
de la ligne où elles se trouvent dans la table (cf. Section 34 en page ??. )
Par exemple, pour une table ’client’ où chaque ligne possède un numéro de client et un nom, le
numéro de client sera clef primaire mais il pourra être utile de créer un index sur le nom du client
si des recherches portent souvent sur cette colonne.
12.1 Syntaxe
Syntaxe SQL
Créer un index
1 create [unique] index nomIndex
2 on nomTable (nomColonne, ,nomColonne1,...)
3 ;
Syntaxe SQL
Supprimer un index
1 drop index nomIndex on nomTable
2 ;
où :
• nomIndex : nom de l’index à supprimer (parfois préfixé par ’IDX’ comme repère)
• nomColonne, nomColonne1 : nom d’une (ou plusieurs) colonne de la table sur laquelle porte
l’index
• l’option unique précise qu’on n’autorisera pas de doublons dans cette colonne : cela peut
être le cas d’un code INSEE, d’une adresse mail, etc. ; par contre dans le cas d’un index sur le
nom et le prénom, on pourra autoriser les doublons.
12.2 Exemple
BDSQL1 18
12.2 Exemple
Listing 16 – Ordre SQL de création d’un index sur le nom d’une personne
1 create index Idx_Nom_Personne
2 on personne (nom)
3 ;
BDSQL1 19
Troisième partie
• les mécanismes de gestion de transaction afin de garantir l’intégrité des données lors d’accès
concurrent aux données
• les mécanismes de journalisation permettant de garantir l’intégrité des données en cas d’erreur
en cours de transaction ou en cas de nécessité de restauration d’une base à un état antérieur
avec ré-application des transactions .
14.1 Syntaxe
Syntaxe SQL
Ajouter une ligne complète avec des valeurs fixes - non recommandé
1 insert into nomTable
2 values ( val1[,val2, val3, ...])[,
3 ( val1[,val2, val3, ...]),...]
4 ;
où :
• val1, val2, val3, ... : liste des valeurs associées chacune à une colonne de la table ; toutes les
colonnes doivent avoir une valeur qui leur correspond (dans l’ordre défini dans la table) ; on
peut ainsi ajouter plusieurs lignes
BDSQL1 20
14.1 Syntaxe
Attention
L’ordre des valeurs doir être identique aà celui des colonnes dans la table. En cas d’ajout de
nouvelles colonnes, la requête doit être modifiée.
Syntaxe SQL
Ajouter une ligne partielle avec des valeurs fixes - recommandé
1 insert into nomTable
2 (col1[, col2, col3, ...])
3 values ( val1[,val2, val3, ...])[,
4 ( val1[,val2, val3, ...]),...]
5 ;
où :
• col1, col2, col3, ... : liste des noms de colonnes dont les valeurs vont être précisées dessous
• val1, val2, val3, ... : liste des valeurs associées chacune à une colonne ; toutes les colonnes
doivent avoir une valeur qui leur correspond (dans l’ordre défini juste au dessus)
Syntaxe à privilégier
Cette syntaxe est la plus sûre :
• elle reste correcte même si des colonnes (non obligatoires) ont été ajoutées
Les colonnes pour lesquelles aucune valeur n’aura été précisée auront une valeur nulle (null) ;
l’insertion pourra être réalisée seulement si aucune contrainte not null n’est spécifiée pour
ces dernières.
Syntaxe SQL
Ajouter une ligne partielle ou complète à partir d’une requête d’interrogation (select)
1 insert into nomTable [(col1[, col2, col3, ...])]
2 requete
3 ;
BDSQL1 21
14.2 Exemple
où :
• col1, col2, col3, ... : liste des noms de colonnes dont les valeurs vont être précisées dessous
14.2 Exemple
La colonne ’ville’ n’a pas été renseignée : elle aura la valeur nulle autorisée lors de la création de
la table.
15 DML - update
L’ordre SQL update modifie les valeurs de colonnes dans une table, en tenant éventuellement
compte d’une condition de sélection des lignes à modifier grâce à une clause where (voir section
19 en page 28 pour l’expression des conditions).
Attention
un ordre de mise a jour sans clause where affecte toute les lignes de la table !
15.1 Syntaxe
Syntaxe SQL
Modifier les valeurs d’une ou plusieurs colonnes
1 update nomTable
2 set col1 = valeur1 [,col2 = valeur2, col3 = valeur3
,...]
3 [where condition]
4 ;
BDSQL1 22
15.2 Exemple
où :
15.2 Exemple
Listing 19 – Ordre SQL de modification de la colonne ’prenom’ d’une personne sélectionné sur son
numéro
1 update personne
2 set prenom = ’ j o h n ’
3 where numero = 4
4 ;
Listing 20 – Ordre SQL de modification de la colonne ’salaire’, augmentation de 10% pour tous
1 update personne
2 set salaire = salaire * 1.1
3 ;
Listing 21 – Ordre SQL de modification de la colonne ’salpil’, augmentation de 10% pour tous les
pilotes qui ont assuré un vol
1 update pilote
2 set salpil = salpil * 1.1
3 where numpil in (select numpil from vol)
4 ;
BDSQL1 23
16.1 Syntaxe
Attention
un ordre de suppression sans clause where supprime toute les lignes de la tablea
a
à moins que des contraintes d’intégrité référentielles l’en empêche...
16.1 Syntaxe
Syntaxe SQL
Supprimer des lignes d’une table
1 delete from nomTable
2 [where condition]
3 ;
où :
16.2 Exemple
Listing 22 – Ordre SQL de suppression des lignes de pilote dont le numero est 10
1 delete from pilote
2 where numpil = 10
3 ;
Listing 23 – Ordre SQL de suppression des lignes de pilote qui n’ont pas volé
1 delete from pilote
2 where numpil not in (
3 select distinct numpil
4 from vol
5 )
6 ;
BDSQL1 24
Quatrième partie
Syntaxe SQL
Interroger les lignes et colonnes des tables
1 select [distinct | all] {* | listeDeColonnes}
2 from table(s)
3 [where criteresDeSelection]
4 [group by listeDeColonnesDeRegroupement]
5 [having criteresDeSelectionApresRegroupement]
6 [order by criteresDeClassement]
7 ;
où :
• listeDeColonnes : colonnes retournées par la requête, séparées par une virgule (sauf la der-
nière)
• table(s) : la ou les tables (jointes de manière cohérente)
• criteresDeSelection : expression logique de sélection des lignes extraites
• listeDeColonnesDeRegroupement : noms des colonnes sur lesquelles appliquer le regroupe-
ment, séparées par une virgule, sauf la dernière
BDSQL1 25
• criteresDeSelectionApresRegroupement : nouvelle sélection appliquée généralement à des cal-
culs agrégés
• critèresDeClassement : noms des colonnes et type de classement, séparée par une virgule, sauf
le dernier
18 Projection
18.1 Syntaxe
Projection SQL
πxa,...,xz (R)
1 select distinct xa,...,xz
2 from R
3 ;
où :
• R : table d’origine
où :
• R : table d’origine
BDSQL1 26
18.2 Exemples
18.2 Exemples
18.2.1 Exemple1
18.2.2 Exemple2
resultat ville
arras
Aix
Pau
Arras
null
nombres de lignes : 5
BDSQL1 27
On peut constater que le doublon n’a pas été supprimé : par défaut, SQL ne respecte pas le socle
théorique de l’algèbre relationnelle.
resultat ville
arras
Aix
Pau
null
nombres de lignes : 4
19 Sélection : where
19.1 Syntaxe
Sélection SQL
σQ (R)
1 select *
2 from R
3 where Q
4 ;
où :
• R : table d’origine
BDSQL1 28
19.2 Opérateurs de comparaison et connecteurs logiques
La liste de l’opérateur in est une suite de valeurs séparées par une virgule, par exemple :
(1,3,8,9,2), ou (’calais’, ’paris’, ’brest’).
On peut ainsi effectuer les types de comparaison suivants, et tester que la valeur d’une colonne...
BDSQL1 29
19.4 Exemples : opérateurs de comparaison
Les opérateurs suivants sont particulièrement utilisés combinés à des requêtes imbriquées (voir
Section 32 en page 75)
Table 6 – Opérateurs étendus SQL (2)
R A B C
a b c
d a f
c b d
nombres de lignes : 3
Listing 27 – Sélection SQL (σB<>0 a0 (R))
1 select *
2 from R
3 where B <> ’ a ’
4 ;
resultat A B C
a b c
c b d
nombres de lignes : 2
19.4.2 Exemple2
BDSQL1 30
19.5 Exemples : opérateurs SQL étendus
nombres de lignes : 5
Listing 28 – les personnes dont le numéro est inférieur à 3
1 select *
2 from personne
3 where numero < 3
4 ;
BDSQL1 31
19.5 Exemples : opérateurs SQL étendus
BDSQL1 32
19.5 Exemples : opérateurs SQL étendus
Listing 36 – les personnes dont le nom commence par ’L’ : opérateur like
1 select *
2 from personne
3 where nom like ’ L% ’
4 ;
BDSQL1 33
19.5 Exemples : opérateurs SQL étendus
2 from personne
3 where numero between 2 and 5
4 ;
Listing 43 – les personnes dont la ville n’est pas renseignée : opérateur is null
1 select *
BDSQL1 34
2 from personne
3 where ville is null
4 ;
20 Renommage
L’opération de renommage est utilisée afin de rebaptiser des tables ou des colonnes afin de lever
une ambiguïté lorsque, dans une requête, un même identificateur de colonne est utilisé plusieurs
fois, ou un même nom de table apparait plusieurs fois (cf. le cas de l’auto-jointure : section ?? en
page 56 ).
où :
• R : table d’origine
• S : alias de la table
BDSQL1 35
20.2 Syntaxe : alias de colonne
Après qu’un alias a été défini dans une requête, on ne peut plus faire référence au nom originel de
la table dans la requête.
L’alias de table est utilisé essentiellement dans les jointures où des colonnes de noms identiques
proviennent de table différentes : un alias court, d’une seule lettre par exemple, permet de rendre
la requête plus lisible.
où :
• R : table d’origine
L’alias de colonne est donnée dans la clause select et ne peut être utilisé qu’après la clause
where.
20.3 Exemples
20.3.1 Exemple1 : alias de colonne
BDSQL1 36
20.3 Exemples
BDSQL1 37
21 Union : union
L’opération d’union en SQL regroupe les lignes de 2 requêtes (ou plus) qui doivent être
union-compatibles (même nombre de colonnes et même type de donnée pour chaque colonne).
21.1 Syntaxe
Union en SQL - sans doublons
(R ∪ S)
1 requete1
2 union
3 requete2
4 ;
où :
• requete1 et requete2 : toute requete SQL select valide, les 2 requêtes devant être union-
compatibles
• union : mot-clef de l’union de 2 requêtes
• all : optionnel, permet de conserver les doublons de lignes
21.2 Exemples
21.2.1 Exemple 1
R A B C
a b c
d a f
c b d
S A B C
nombres de lignes : 3 - b g a
d a f
nombres de lignes : 2
R et S sont union-compatibles.
BDSQL1 38
21.2 Exemples
resultat A B C
a b c
d a f
c b d
b g a
nombres de lignes : 4
Listing 48 – union all
1 select A,B,C
2 from R
3 union all
4 select A,B,C
5 from S
6 ;
resultat A B C
a b c
d a f
c b d
b g a
d a f
nombres de lignes : 5
21.2.2 Exemple 2
BDSQL1 39
4 and ’ 2007 −01 −31 ’
5 union
6 select *
7 from personne
8 where ville = ’ a r r a s ’
9 ;
22 Différence
L’opération de différence en SQL reprend les lignes d’une 1ère requête qui ne se trouvent pas
dans une 2ème requête.
22.1 Syntaxe
Différence en SQL
(R − S)
1 requete1
2 except
3 requete2
4 ;
BDSQL1 40
où :
• requete1 et requete2 : toute requete SQL select valide, les 2 requêtes devant être union-
compatibles
• except : mot-clef de la différence (on trouve parfois minus)
Le mot-clef except n’est pas implanté dans tous les SGBDR : il est alors nécessaire d’utiliser une
sous-requête pour mettre en oeuvre cette notion (voir section 32.6 en page 85).
Attention
Le résultat du produit cartésien n’a pas de sens : on y associe en effet des colonnes de tables
différentes sans conserver de lien sémantique entre elles.
23.1 Syntaxe
où :
BDSQL1 41
23.2 Exemples
où :
Danger
Éviter d’utiliser cette dernière notation qui ne met pas en évidence le choix d’un produit
cartésien dans la clause from, et qui, sans clause de sélection, peut être un simple oubli aux
conséquences non négligeables...
23.2 Exemples
23.2.1 Exemple 1
R A B C
a b c
d a f
c b d
V A D
nombres de lignes : 3 - b g
d a
nombres de lignes : 2
Listing 51 – Exemple de produit cartésien (R × V ) (SQL92)
1 select *
2 from R
3 cross join V
4 ;
résultat A B C A D
a b c b g
a b c d a
d a f b g
d a f d a
c b d b g
c b d d a
nombres de lignes : 6
Listing 52 – Exemple de produit cartésien (R × S) (SQL89)
1 select *
2 from R, V
3 ;
BDSQL1 42
23.2 Exemples
résultat A B C A D
a b c b g
a b c d a
d a f b g
d a f d a
c b d b g
c b d d a
nombres de lignes : 6
Danger
Attention au volume de données produit par cette opération...
23.2.2 Exemple 2
BDSQL1 43
23.2 Exemples
Attention
Ce résultat n’a pas de sens : il fournit toutes les possibilités de combinaison de chaque étudiant
avec toutes les inscriptions...
BDSQL1 44
24 Intersection
L’opération d’intersection en SQL reprend les lignes d’une 1ère requête qui se trouvent aussi dans
une 2ème requête.
Intersection en SQL
(R ∩ S)
1 requete1
2 intersect
3 requete2
4 ;
où :
• requete1 et requete2 : toute requete SQL select valide, les 2 requêtes devant être union-
compatibles
Le mot-clef intersect n’est pas implanté dans tous les SGBDR : il est alors nécessaire d’utiliser
une sous-requête pour mettre en oeuvre cette notion (voir section 32.7 en page 87).
25.1 Théta-jointure
25.1.1 Syntaxe
1 select *
2 from R
3 inner join S
4 on Q
5 ;
BDSQL1 45
25.1 Théta-jointure
1 select *
2 from R, S
3 where Q
4 ;
où :
Lorsque la(ou les) colonne(s) de jointure porte(nt) le même nom dans les 2 tables jointures, il est
possible d’utiliser une notation plus simple en SQL92, et qui supprime le doublon de colonne(s) de
jointure :
1 select *
2 from R
3 inner join S
4 using(x1,...,xn)
5 ;
Cette syntaxe est se rapproche de la jointure naturelle mais elle est plus sûre.
où :
BDSQL1 46
25.1 Théta-jointure
25.1.2 Exemples
Exemple : 1
R A B C
a b c
d a f
c b d
S A B C
nombres de lignes : 3 - b g a
d a f
nombres de lignes : 2
Listing 54 – Exemple de jointure interne d’égalité ((R ./ S))
R.B = S.A
1 select *
2 from R
3 inner join S
4 on R.B = S.A
5 ;
resultat A B C A B C
a b c b g a
c b d b g a
nombres de lignes : 2
Exemple : 2
BDSQL1 47
25.1 Théta-jointure
1 select *
2 from pilote
3 inner join vol
4 on [Link] = [Link]
5 ;
resultat numpil nompil vilpil datnaispil salairepil numvol numpil numav departvol dureevol vildepvol vilarrvol
3 Max Paris 1975-04-03 12000.00 1002 3 104 2015-09-01 09 :00 :00.0 20 Marseille Nice
4 Scott Marseille 1981-08-29 12000.00 1003 4 105 2015-09-01 15 :30 :00.0 65 Paris Nice
2 Peter Nice 1970-01-10 18000.00 1004 2 101 2015-09-01 16 :10 :00.0 60 Paris Marseille
3 Max Paris 1975-04-03 12000.00 1005 3 101 2015-09-02 10 :50 :00.0 45 Marseille Lyon
4 Scott Marseille 1981-08-29 12000.00 1006 4 107 2015-09-03 11 :10 :00.0 20 Nice Marseille
5 Mandy Marseille 1985-05-16 16000.00 1007 5 101 2015-09-03 15 :00 :00.0 45 Paris Lyon
6 John Nice 1982-06-11 20000.00 1008 6 101 2015-09-04 09 :30 :00.0 45 Lyon Marseille
7 Bill Marseille 1980-06-29 18000.00 1009 7 101 2015-09-05 08 :00 :00.0 60 Paris Marseille
2 Peter Nice 1970-01-10 18000.00 1010 2 108 2015-09-05 17 :00 :00.0 60 Nice Paris
nombres de lignes : 9
Listing 56 – les pilotes et leurs vols ((pilote ./ vol))
[Link] = [Link]
1 select *
2 from pilote
3 inner join vol
4 using (numpil)
5 ;
resultat numpil nompil vilpil datnaispil salairepil numvol numav departvol dureevol vildepvol vilarrvol
3 Max Paris 1975-04-03 12000.00 1002 104 2015-09-01 09 :00 :00.0 20 Marseille Nice
4 Scott Marseille 1981-08-29 12000.00 1003 105 2015-09-01 15 :30 :00.0 65 Paris Nice
2 Peter Nice 1970-01-10 18000.00 1004 101 2015-09-01 16 :10 :00.0 60 Paris Marseille
3 Max Paris 1975-04-03 12000.00 1005 101 2015-09-02 10 :50 :00.0 45 Marseille Lyon
4 Scott Marseille 1981-08-29 12000.00 1006 107 2015-09-03 11 :10 :00.0 20 Nice Marseille
5 Mandy Marseille 1985-05-16 16000.00 1007 101 2015-09-03 15 :00 :00.0 45 Paris Lyon
6 John Nice 1982-06-11 20000.00 1008 101 2015-09-04 09 :30 :00.0 45 Lyon Marseille
7 Bill Marseille 1980-06-29 18000.00 1009 101 2015-09-05 08 :00 :00.0 60 Paris Marseille
2 Peter Nice 1970-01-10 18000.00 1010 108 2015-09-05 17 :00 :00.0 60 Nice Paris
nombres de lignes : 9
Le doublon de colonne de jointure a été supprimé.
Exemple : 3
BDSQL1 48
25.2 Jointure naturelle
BDSQL1 49
25.2 Jointure naturelle
25.2.1 Syntaxe
où :
• si des attributs portent le même nom sans toutefois avoir le même sens, on obtient une
jointure incohérente...
25.2.2 Exemple
BDSQL1 50
25.2 Jointure naturelle
resultat A B C
a b c
d a f
c b d
nombres de lignes : 3
resultat A B C
a b c
d a f
c b d
nombres de lignes : 3
Listing 59 – jointure naturelle
1 select *
2 from R
3 natural join S
4 ;
resultat A B C
d a f
nombres de lignes : 1
Exemple : 2
BDSQL1 51
25.3 Exemple Non-equi-jointure
25.3.1 Exemple 1
BDSQL1 52
vol numvol numpil numav departvol dureevol vildepvol vilarrvol
1002 3 104 2015-09-01 09 :00 :00.0 20 Marseille Nice
1003 4 105 2015-09-01 15 :30 :00.0 65 Paris Nice
1004 2 101 2015-09-01 16 :10 :00.0 60 Paris Marseille
1005 3 101 2015-09-02 10 :50 :00.0 45 Marseille Lyon
1006 4 107 2015-09-03 11 :10 :00.0 20 Nice Marseille
1007 5 101 2015-09-03 15 :00 :00.0 45 Paris Lyon
1008 6 101 2015-09-04 09 :30 :00.0 45 Lyon Marseille
1009 7 101 2015-09-05 08 :00 :00.0 60 Paris Marseille
1010 2 108 2015-09-05 17 :00 :00.0 60 Nice Paris
nombres de lignes : 9
25.3.2 Exemple 2
Listing 61 – les pilotes et les vols avec vilpil différent de vildepvol (projection pour limiter le nombre
de colonnes)
1 select [Link], nompil, vilpil, numvol, [Link],
vildepvol
2 from pilote
3 inner join vol
4 on [Link] = [Link]
5 and vilpil <> vildepvol
6 ;
1 select *
2 from R
BDSQL1 53
3 [left | right | full] outer join S
4 on Q
5 ;
1 select *
2 from R
3 [left | right | full] outer join S
4 using (x1, x2, ..., xn)
5 ;
où :
• left, right et full : indique si on conserve les lignes de la table de gauche, de droite ou
des 2
La valeur des attributs des n-uplets de la relation ne satisfaisant pas critère de jointure ont pour
valeur null.
26.0.2 Exemples
Exemple : 1
R A B C
a b c
d a f
c b d
V A D
nombres de lignes : 3 - b g
d a
nombres de lignes : 2
BDSQL1 54
Listing 62 – R left outer join S
1 select *
2 from R
3 left outer join S
4 on R.B = S.A
5 ;
resultat A B C A B C
a b c b g a
d a f null null null
c b d b g a
nombres de lignes : 3
Exemple : 2
BDSQL1 55
resultat numero nom prenom dateNaissance code numero
1 Dupont Jacques 1990-01-15 INFO 1
1 Dupont Jacques 1990-01-15 MATH 1
1 Dupont Jacques 1990-01-15 PHCH 1
9 Durand Pierre 1999-07-20 INFO 9
23 Lambert Paul 1994-12-03 MATH 23
34 Durand Jacques 1994-12-15 INFO 34
34 Durand Jacques 1994-12-15 MATH 34
105 Lambert Paul 1995-10-20 null null
nombres de lignes : 8
Listing 64 – tous les etudiants et éventuellement les inscriptions (using)
1 select *
2 from etudiant
3 left outer join inscrire
4 using (numero)
5 ;
27.1 Auto-jointure
L’auto-jointure est un cas de jointure d’une relation avec elle-même, quelle soit interne ou
externe.
Les noms des attributs doivent être préfixés du nom de relation afin d’éviter toute ambiguïté ou
bien être renommés.
Listing 65 – autojointure en SQL
1 select *
2 from R
3 inner join R A
4 on Q
5 ;
BDSQL1 56
27.1 Auto-jointure
où :
• A : un alias sur R
• Q : critère de jointure
Exemple :
à partir de de la table ’Personne’, produire un résultat comportant tous les binômes possibles de
personnes d’une même ville :
Listing 66 – les binomes de personnes de la même ville)
1 select [Link], [Link], [Link] as nomBinome, [Link] as
prenomBinome
2 from personne P
3 inner join personne B
4 on [Link] = [Link]
5 ;
BDSQL1 57
27.2 Semi-jointure
27.2 Semi-jointure
La semi-jointure est une jointure à laquelle est appliquée une projection pour ne conserver que
les colonnes d’une des 2 tables.
Il n’existe pas d’opérateur spécifique pour cette forme de jointure : une simple projection permet
de conserver les colonnes d’une des 2 tables.
Listing 69 – Semi-jointure gauche en SQL ((R n S))
1 select R.*
2 from R
3 inner join S
4 on Q
5 ;
où :
Listing 70 – semi-jointure gauche (avec suppression des doublons : plusieurs inscription par étu-
diant...)
1 select distinct etudiant.*
2 from etudiant
3 inner join inscrire
4 using (numero)
5 ;
BDSQL1 58
27.3 Anti-jointure
27.3 Anti-jointure
L’anti-jointure est similaire à une semi-jointure, mais elle ne conserve que les lignes qui n’ont pas
été jointes.
Il n’existe pas d’opérateur spécifique pour cette forme de jointure : une simple projection permet
de conserver les colonnes d’une des 2 tables et une sélection permet de ne conserver que les
lignes qui n’ont pas été jointes.
Listing 71 – Antijointure gauche en SQL ((R S) )
1 select R.*
2 from R
3 left join S
4 on Q
5 where S.col1 is null [and S.col2 is null ...]
6 ;
où :
• Q : critère de jointure
28 Division
La division n’est pas implanté dans les SGBDR : il est nécessaire d’utiliser une sous-requête pour
mettre en oeuvre cette notion (voir section 32.8 en page 89).
BDSQL1 59
29 Agrégats
L’agrégat consiste à appliquer une fonction statistique à une ou plusieurs colonnes :
• ou en définissant une liste de colonnes de regroupement des lignes (calcul de sous-totaux par
valeurs différentes des colonnes de regroupement).
où :
La fonction count peut utiliser la valeur * pour signifier ’les lignes’ de la table :
1 count(*)
agrégats en SQL
1 select [a1, a2, ..., an]
2 fn1(x1), fn2(x2), ..., fnN(xn)
3 from table(s)
4 [where Q1]
5 [group by a1, a2, ..., an]
6 [having Q2]
7 ;
BDSQL1 60
29.2 Agrégat global
où :
où :
• fn1, fn2, ..., fnN sont des fonctions d’agrégation appliquées à des colonnes
• x1, x2, ... : colonnes auxquelles s’appliquent les fonctions
• table(s) : table(s)
• selection : critère de sélection des lignes à agréger
29.2.1 Exemples
Exemple : 1
W X Y N
a b 10
a c 30
b b 20
c b 20
nombres de lignes : 4
Listing 73 – Compter les valeurs (Gcount(X) (R))
1 select count(X)
2 from W
3 ;
BDSQL1 61
29.2 Agrégat global
resultat count(X)
4
nombres de lignes : 1
Listing 74 – Compter les valeurs distinctes
1 select count(distinct X)
2 from W
3 ;
resultat count(distinct X)
3
nombres de lignes : 1
Listing 75 – Somme (GSum(N )−>total (R))
1 select sum(N) AS total
2 from W
3 ;
resultat total
80
nombres de lignes : 1
personne numero nom prenom ville salaire dateEntree sexe
1 Dupont Max arras 1000.00 2007-01-01 h
2 Durand Tim Aix 1500.00 2007-03-15 h
3 Lambert Betty Pau 1350.00 2007-04-20 f
4 Bradford Jean Arras 1250.00 2007-09-07 h
5 Rigole Jean null 1300.00 2007-09-28 h
nombres de lignes : 5
Listing 76 – Somme des salaires
1 select sum(salaire) as totalDesSalaires,
2 count(*) as nombrePersonnes
3 from personne
4 ;
BDSQL1 62
29.3 Agrégat par valeur de regroupement : group by
où :
• a1, a2, ..., an sont les colonnes qui seront renvoyées (la liste correspond généralement à celle
du GROUP BY, mais peut-être vide dans certains cas où on souhaite obtenir simplement les
valeurs agrégées)
• fn1, fn2, ..., fnN sont des fonctions d’agrégation appliquées aux colonnes x1, x2, ..., xn
• R : table(s)
• group by a1, a2, ..., an : mot-clef SQL précisant les colonnes de regroupement
29.3.1 Exemples
Exemple : 1
BDSQL1 63
29.3 Agrégat par valeur de regroupement : group by
Listing 79 – W
1 select *
2 from W
3 ;
resultat X Y N
a b 10
a c 30
b b 20
c b 20
nombres de lignes : 4
Listing 80 – Compter le nombre de valeurs de la colonne X (X Gcount(X) (R))
1 select X , count(X)
2 from W
3 group by X
4 ;
resultat X count(X)
a 2
b 1
c 1
nombres de lignes : 3
Listing 81 – Compter le nombre de valeurs de la colonne X avec un alias
1 select X , count(X) as Nombre
2 from W
3 group by X
4 ;
resultat X Nombre
a 2
b 1
c 1
nombres de lignes : 3
Listing 82 – Somme des valeurs de la colonne N par regroupement de X X GSum(N )−>T otal (R)
1 select X, sum(N) as Total
2 from W
3 group by X
4 ;
resultat X Total
a 40
b 20
c 20
BDSQL1 64
29.4 Sélection après agrégat : having
nombres de lignes : 3
Listing 83 – Somme des salaires et nombre de lignes par ville et nombre de villes et nombre de villes
différentes
1 select ville, sum(salaire) as totalDesSalaires,
2 count(*) as nombrePersonnes,
3 count(ville) as nombreVilles,
4 count(distinct ville) as villesDiff
5 from personne
6 group by ville
7 ;
resultat totalDesSalaires
1300.00
1500.00
2250.00
1350.00
nombres de lignes : 4
On peut voir ci-dessus un agrégat par ville, sans mention des villes : pas très intéressant dans un
premier abord, mais ce résultat peut fournir une liste de valeurs utilisable dans une sélection avec
les opérateurs in, all ou any associée à une sous-requête (voir section 32 en page 75).
BDSQL1 65
Sélection après agrégat en SQL
1 select [a1, a2, ..., an]
2 fn1(x1), fn2(x2), ..., fnN(xn)
3 from table(s)
4 [where Q1]
5 group by a1, a2, ..., an
6 having Q2
7 ;
où :
Listing 85 – Somme des salaires par ville qui ont plus de 1 personne
1 select ville, sum(salaire) as totalDesSalaires,
2 count(*) as nombrePersonnes
3 from personne
4 group by ville
5 having (nombrePersonnes > 1)
6 ;
30 Calculs et fonctions
Les valeur retournées par une requête correspondent généralement à celles des colonnes des
tables. Elles peuvent être également provenir
BDSQL1 66
30.1 Calculs de valeurs d’attributs
• ou de fonctions spécifiques
• ou dans des expressions logiques pour limiter le nombre de lignes retournées (where)
opérateur signification
+ somme
- différence
* produit
/ rapport
% modulo (reste de la division euclidienne, ou entière)
Les opérateurs ont une priorités différente ; l’utilisation des parenthèses est fortement
recommandé dans les calculs complexes, ou pour simplement mettre en évidence la séquence des
calculs.
Listing 87 – liste des commandes avec calcul du montant et de l’écart de valeur
1 select idComm, (qteComm * prixComm) as montant,
2 (qteComm * (prixComm - prix)) as ecart
3 from commande
4 inner join produit
5 using (refProduit)
6 ;
BDSQL1 67
30.2 Calculs à l’aide de fonctions intégrées
Attention
Les fonctions sont mises en oeuvre dans la plupart des SGBD ; il arrive cependant que des
différences existent au niveau du nom d’une fonction, ou bien ses paramètres, ou encore de
leur mode de calcul.
Il est indispensable de consulter la documentation du sgbd sur lequel vous allez travailler
avant l’utilisation des fonctions
Voir une synthèse comparative des fonctions par SGBDcomparatif sur [Link]
Les fonctions présentées ici sont implantées sur le SGBDR MySql (Oracle).
Table 9 – Fonctions mathématiques
BDSQL1 68
30.2 Calculs à l’aide de fonctions intégrées
resultat x y x y distance
0.0 0.0 0.0 2.0 2.0
0.0 0.0 0.0 3.0 3.0
0.0 0.0 1.0 1.0 1.4142135623730951
0.0 2.0 0.0 3.0 1.0
1.0 1.0 0.0 3.0 2.23606797749979
nombres de lignes : 5
Table 10 – Fonctions de date
BDSQL1 69
30.2 Calculs à l’aide de fonctions intégrées
BDSQL1 70
30.2 Calculs à l’aide de fonctions intégrées
nombres de lignes : 6
Listing 90 – les membres en mieux bien présentés...
1 select upper(nom_memb) as NOM,
2 concat(upper(left(prenom_memb,1)),lower(right(
prenom_memb,(length(prenom_memb)-1)))) as Prenom
,
3 upper(concat(left(nom_memb,1), left(prenom_memb,1)))
as initiales
4 from membre
5 ;
BDSQL1 71
30.3 Choix d’une valeur selon une condition...
ou
Listing 95 – Syntaxe case : choix de valeur
1 case
2 when condition THEN valeurResultat
3 [when condition THEN valeurResultat] ...
4 [else valeurResultat]
5 end
BDSQL1 72
Listing 96 – date et heure du jour
1 select nom, prenom,
2 case sexe
3 when ’ f ’ then ’ femme ’
4 when ’ h ’ then ’homme ’
5 else ’ i n c o n n u ’
6 end as sexe
7 from personne
8 ;
31.1 Syntaxe
où :
• critere1, critere2, etc. sont des critères de classement comportant chacun un nom de colonne
suivi de :
31.2 Exemples
BDSQL1 73
31.2 Exemples
BDSQL1 74
nombres de lignes : 3
32 Sous-requêtes
Une sous-requête (en anglais : subquery), ou requête interne (en anglais : inner subquery), ou encore
requête imbriquée (en anglais : nested subquery), est une requête utilisée pour constituer un
résultat qui va être utilisé dans une requête principale, ou requête externe (en anglais : outer query),
de la manière suivante :
• en général comme élément de comparaison dans les clauses where ou having (dans les
ordres DML et DQL),
• parfois comme valeur d’une colonne dans la clause select.
• exceptionnellement en remplacement d’une table dans la clause from (SQL92).
Attention
La sous-requête n’est pas terminée par un point-virgule (’ ;’).
(1)
Requête principale sous-requête
(4) (2)
(3)
résultat resultat
BDSQL1 75
32.2 Formes de résultat d’une sous-requête
select nompil
from pilote
select distinct numpil
where numpil in ( (1) from vol
where vildepvol =
2,4
) "nice"
(3) (2)
2
(4) 4
Peter
Scott
Figure 6 – Sous-requête corrélée
Attention
Il faut absolument s’assurer que le résultat produit par la sous-requête sera toujours cohérent
par rapport à ce qu’attend la requête principale.
Dans le cas contraire, une erreur d’exécution serait générée.
BDSQL1 76
32.3 Utilisation de sous-requêtes à résultat unique
– dans un critère de sélection dans les clauses where et having, combinés avec un
opérateur de comparaison =, <, >, <=,>=, <>, ou l’opérateur étendu between
– pour constituer la valeur d’une colonne dans la clause select
• de plusieurs lignes mais une colonne unique (1 à N lignes – une seule colonne) : il pourra être
utilisé
– pour constituer un critère de sélection dans les clauses where et having : opérateurs
in, not in, opérateurs all, any combinés avec un opérateur de comparaison =, <,
>, <=,>=, <>,
– pour constituer un jeu de lignes utilisé dans la clause from en guise de table
– pour constituer un critère de sélection dans les clauses where et having : opérateur
exists
– pour constituer un jeu de lignes dans la clause from
personne count(*)
0
nombres de lignes : 1
Le résultat est toujours garanti : si aucune ligne est trouvée, le résultat vaudra 0.
Listing 101 – lister la dernière date d’entrée de personne
1 select max(dateEntree)
2 from personne
3 ;
personne max(dateEntree)
2007-09-28
nombres de lignes : 1
BDSQL1 77
32.3 Utilisation de sous-requêtes à résultat unique
On peut garantir la cohérence du résultat à condition qu’il y ait au moins une personne dans la
table. Sinon la valeur vaudra null est sera utilisée comme telle.
Listing 102 – la date d’entrée d’une personne
1 select dateEntree
2 from personne
3 where numero = 3
4 ;
personne dateEntree
2007-04-20
nombres de lignes : 1
On peut garantir la cohérence du résultat à condition que la personne de numéro 3 (clef primaire)
existe bien. Sinon la valeur vaudra null est sera utilisée comme telle.
32.3.2 Exemples : constituer la valeur d’une colonne
Le titre des peintures, leur largeur et la largeur moyenne de toutes les peintures)
resultat avg(largeur_peinture)
2.575000
nombres de lignes : 1
2. Requête complète :
1 select titre_oeuvre, largeur_peinture,
2 (select avg(largeur_peinture) from peinture)
3 as largeurMoyenne
4 from peinture
5 inner join oeuvre
6 on id_oeuvre_peinture = id_oeuvre
7 ;
BDSQL1 78
32.3 Utilisation de sous-requêtes à résultat unique
resultat avg(largeur_peinture)
2.575000
nombres de lignes : 1
2. Requête complète :
1 select titre_oeuvre, largeur_peinture
2 from peinture
3 inner join oeuvre
4 on id_oeuvre_peinture = id_oeuvre
5 where largeur_peinture >
6 (select avg(largeur_peinture) from peinture)
7 ;
Le titre et largeur des peintures, dont la largeur est autour de la moyenne plus ou moins
30 %
resultat avg(largeur_peinture)
2.575000
nombres de lignes : 1
2. Requête complète :
1 select titre_oeuvre, largeur_peinture
2 from peinture
3 inner join oeuvre
4 on id_oeuvre_peinture = id_oeuvre
5 where largeur_peinture between
6 (select avg(largeur_peinture) from peinture)*0.70
7 and
BDSQL1 79
32.3 Utilisation de sous-requêtes à résultat unique
BDSQL1 80
32.3 Utilisation de sous-requêtes à résultat unique
Le titre des peintures, leur largeur et la largeur moyenne des peintures du peintre
BDSQL1 81
32.4 Utilisation de sous-requêtes à lignes multiples et colonne unique
resultat avg(largeur_peinture)
2.575000
nombres de lignes : 1
Cette requête est dépendante d’une requête principale, elle ne peut fonctionner seule, elle
doit avoir accès à l’information ’OEUVRE.id_artiste’ qui est disponible dans la requête
principale qui suit (’–’ correspond à un commentaire à supprimer pour la véritable requête) ;
2. Requête complète :
1 select titre_oeuvre, largeur_peinture,
2 (select avg(largeur_peinture)
3 from peinture P
4 inner join oeuvre O
5 on (P.id_oeuvre_peinture = O.id_oeuvre)
6 where (O.id_artiste =
7 oeuvre.id_artiste)
8 )
9 as largeurMoyenne
10 from peinture
11 inner join oeuvre
12 on id_oeuvre_peinture = id_oeuvre
13 ;
BDSQL1 82
32.4 Utilisation de sous-requêtes à lignes multiples et colonne unique
resultat id_memb
1
4
nombres de lignes : 2
Listing 104 – les villes des membres dont le nom commence par D
1 select distinct ville_memb
2 from membre
3 where nom_memb like ’ d% ’
4 ;
resultat ville_memb
cachan
creteil
melun
nombres de lignes : 3
32.4.2 Utiliser dans une sélection
resultat id_memb
1
2
3
5
6
nombres de lignes : 5
BDSQL1 83
32.5 Utilisation de sous-requêtes à jeu de données quelconque : opérateur exists
nombres de lignes : 2
Listing 105 – les membres qui habitent moscou (résultat vide)
1 select *
2 from membre
3 where ville_memb = ’ moscou ’
4 ;
BDSQL1 84
32.6 Application à la différence
nombres de lignes : 0
resultat 1
nombres de lignes : 0
2. Requête principale :
1 select *
2 from membre
3 where exists (
4 select 1
5 from membre
6 where month(dateNaissance_memb) = month(now())
7 )
8 ;
nombres de lignes : 0
BDSQL1 85
32.6 Application à la différence
où :
• col1, col2, col3, ...colN : liste des attributs format une ligne de R qu’on ne doit pas trouver dans
S (ligne de S formée par colS1, colS2, colS3, ...colSN )
On pourra souvent simplifier en utilisant seulement des valeurs de clef primaire au lieu de tous
les attributs.
32.6.1 Exemples
R A B C
a b c
Exemple 1
d a f
c b d
S A B C
nombres de lignes : 3 - b g a
d a f
nombres de lignes : 2
Listing 107 – Exemple de différence à partir d’une sous-requête ((R − S))
1 select A,B,C
2 from R
3 where (A,B,C) not in
4 (select A,B,C
5 from S
6 )
7 ;
resultat A B C
a b c
c b d
nombres de lignes : 2
BDSQL1 86
32.7 Application à l’intersection
resultat numpil
3
4
2
5
6
7
nombres de lignes : 6
2. Requête complète
1 select numpil
2 from pilote
3 where numpil not in
4 (select numpil
5 from vol)
6 ;
resultat numpil
1
8
9
nombres de lignes : 3
soit : les pilotes dont le numéro n’est pas dans la liste de ceux qui ont volé
où :
• col1, col2, col3, ...colN : liste des attributs format une ligne de R qu’on doit trouver dans S
(ligne de S formée par colS1, colS2, colS3, ...colSN )
BDSQL1 87
32.7 Application à l’intersection
On pourra souvent simplifier en utilisant seulement des valeurs de clef primaire au lieu de tous
les attributs.
32.7.1 Exemples
R A B C
a b c
Exemple 1
d a f
c b d
S A B C
nombres de lignes : 3 - b g a
d a f
nombres de lignes : 2
Listing 108 – Exemple d’intersection SQL utilisant une sous-requête ((R ∩ S))
1 select A,B,C
2 from R
3 where (A,B,C) IN
4 (select A,B,C
5 from S)
6 ;
resultat A B C
d a f
nombres de lignes : 1
resultat numpil
3
4
2
5
6
7
nombres de lignes : 6
2. Requête complète
BDSQL1 88
32.8 Application à la division
1 select numpil
2 from pilote
3 where numpil in
4 (select numpil
5 from vol)
6 ;
resultat numpil
2
3
4
5
6
7
nombres de lignes : 6
soit : les pilotes sont le numéro est aussi dans la liste de ceux qui ont volé.
Remarque : une jointure répond également à cette question.
nombres de lignes : 6
inscrire id_memb id_activ date_inscrire
1 1 2005-02-10 00 :00 :00.0
1 2 2005-02-01 00 :00 :00.0
1 3 2005-04-10 00 :00 :00.0
1 4 2005-02-10 00 :00 :00.0
2 1 2005-02-15 00 :00 :00.0
2 3 2005-05-12 00 :00 :00.0
2 4 2005-02-10 00 :00 :00.0
3 1 2005-02-22 00 :00 :00.0
3 2 2005-02-12 00 :00 :00.0
5 2 2005-02-28 00 :00 :00.0
6 1 2005-03-15 00 :00 :00.0
6 2 2005-02-26 00 :00 :00.0
6 3 2005-05-16 00 :00 :00.0
nombres de lignes : 13
BDSQL1 89
32.8 Application à la division
Quels sont les membres tels qu’il n’existe pas d’activités pour lesquelles ces membres ne s’y
soient pas inscrits ?
Listing 109 – Division avec double négation
1 select id_memb, nom_memb, prenom_memb
2 from membre
3 where not exists
4 (select * from activite
5 where not exists
6 (select *
7 from inscrire
8 where id_memb = membre.id_memb
9 and id_activ = activite.id_activ
10 )
11 )
12 ;
Quels sont les membres pour lesquelles le nombre d’activités différentes auxquels ils ont participé
est égal au nombre total d’activités différentes ?
Listing 110 – Division avec un agrégat
1 select m.id_memb, nom_memb, prenom_memb
2 from membre m
3 inner join inscrire p
4 on m.id_memb = p.id_memb
5 group by id_memb, nom_memb, prenom_memb
6 having count(distinct id_activ) =
7 (select count(distinct id_activ)
8 from activite)
9 ;
BDSQL1 90
32.8 Application à la division
Quels sont les membres pour lesquelles le nombre d’activités différentes auxquels ils ont participé
est égal au nombre total d’activités différentes ?
Listing 111 – Division avec plusieurs sous-requêtes
1 select m.id_memb, nom_memb, prenom_memb
2 from membre m
3 where (select count(distinct id_activ)
4 from inscrire
5 where inscrire.id_memb = m.id_memb
6 )
7 = (select count(distinct id_activ)
8 from activite)
9 ;
BDSQL1 91
33 Résumé select
COUNT SUM AVG select liste
MIN MAX agregat de colonnes...
cross join,
oui plusieurs
inner join, from nom de table(s)
tables ?
outer join
oui
sélection ?
where condition
oui agrégat
par ?
group by liste
de colonnes...
oui
sélection ?
having condition
oui
classement ?
order by cri-
tere : liste de co-
lonnes+ASC ou DESC...
BDSQL1 92
Cinquième partie
Performance et sécurité
34 Organisation des index
Les index sont des tables "système" gérées par le SGBDR pour ses besoins propres : intégrité,
performance.
Ils sont implantés sous forme d’arbres, graphes de structure hiérarchique.
34.1 Graphes
Un graphe est un ensemble de points dont certains sont reliés 2 à 2. Les liaisons entre ces points
peuvent être orientées ou non. Les points sont appelés sommets (en anglais : vertice) ou noeuds
(en anglais : nodes), les liens sont appelés arêtes (en anglais : edge) ou arcs (orientés). Les graphes
peuvent être étiquetés : aux sommets ou arêtes sont associés des valeurs d’un ensemble (nombres,
couleurs, etc.)
Les graphes permettent la représentation de données complexes comme : les hyperliens du Web,
le réseau Internet, les réseaux sociaux, la succession des états d’un système, la planification
(exemple ici d’un graphe PERT), etc.
Figure 7 – Graphe
A1 A3 A6
3 4 4
Début
A2 A4 A7
Fin
2 2 4
A5 A8
6 4
BDSQL1 93
34.2 Arbres binaires
fils fils
gauche droit noeuds internes
racine
sous-arbre sous-arbre
racine racine
gauche droit
BDSQL1 94
34.2 Arbres binaires
25
43 32
100 1 6
77
10
110 96
120
Trois formes de parcours dits « en profondeur » sont proposées pour le parcours des noeuds d’un
arbre binaire (algorithmes récursifs) :
• le parcours préfixe
affiche : 25, 43, 100, 1, 32, 6, 77, 10, 110, 96, 120
BDSQL1 95
34.3 Arbres binaires de recherche
• le parcours infixe
affiche : 100, 43, 1, 25, 32, 6, 77, 110, 10, 96, 120
• toutes les clefs des noeuds du sous-arbre gauche lui soient inférieures
• toutes les clefs des noeuds du sous-arbre droit lui soient supérieures.
La localisation d’une valeur de clef dans un arbre binaire de recherche procède d’une manière
similaire à la recherche dichotomique.
BDSQL1 96
34.3 Arbres binaires de recherche
inférieur à b b supérieur à b
a c
25
6 32
1 10 43
77
100
96 110
120
34.3.1 Parcours
BDSQL1 97
34.4 Arbres binaires de recherche équilibrés ou arbres AVL
25
→
6 32
→
1 10 43
→
77
→
100
←
96 110
120
On voit donc que la performance de recherche dans cette forme d’arbre n’est pas garantie et
dépend essentiellement de sa hauteur.
La hauteur d’un arbre est le plus long chemin de la racine aux feuilles.
Ainsi l’arbre précédent peut être représenté sous forme équilibrée
6
vient du nom des 2 inventeurs : Adelson-Velsky et Landis
BDSQL1 98
34.4 Arbres binaires de recherche équilibrés ou arbres AVL
77
25 100
6 32 96 110
1 10 43 120
Le parcours infixe d’un arbre binaire de recherche fournit la séquence des clefs classées dans
l’ordre croissant : 1 - 6 - 10 - 25 - 32 - 43 - 77 - 96 - 100 - 110 - 120 .
L’équilibrage des noeuds d’un arbre est réalisé à chaque opération d’insertion ou de suppression
par un mécanisme de rotation (permutation) de 2 noeuds afin de maintenir la relation d’ordre des
sous-arbres et le facteur d’équilibrage.
L’insertion d’un noeud doit s’opérer en 2 ou 3 étapes :
• placer le nouveau noeud au bon endroit, pour maintenir la relation d’ordre entre les clefs
• remonter vers les arbres supérieurs afin de contrôler si l’insertion a été la cause d’un dés-
équilibre
BDSQL1 99
34.4 Arbres binaires de recherche équilibrés ou arbres AVL
34.4.2 Exemple
10
10
5 13
5 13
4 6 17
3 6 17
3
2 4
2
10
10
5 13
5 13
4 6 17
4 7 17
7
6 8
8
BDSQL1 100
34.4 Arbres binaires de recherche équilibrés ou arbres AVL
10
10
5 13
5 13
4 6 17
3 17
2
2 4
3
• puis de 3 avec 4
10
10
5 13
5 13
4 6 17
4 7 17
8
6 8
7
On a dans ce cas une double rotation :
• puis de 7 avec 6
BDSQL1 101
34.5 Application aux bases de données
Un B-arbre (en anglais : B tree, Balanced Tree) est une structure de données mise en oeuvre dans
les bases de données pour la construction des index.
Le B-arbre est un arbre de recherche toujours parfaitement équilibré.
Un B-arbre peut comporter plusieurs clefs par noeuds afin d’optimiser les accès aux données liées
aux clés.
Chaque noeud occupe une page7 de base de données.
L’évolution de la construction du B-arbre (ici chaque noeud possède 2 clés qui définissent 3
intervalles de valeurs) montre les différentes opérations réalisées afin de maintenir l’équilibre.
7
la page est l’unité de base de stockage des données d’une base de données ; sa capacité est de l’ordre de plusieurs
kio : 16 kio est une valeur courante ; une page peut contenir les noeuds d’un index ou des données
BDSQL1 102
34.5 Application aux bases de données
1 2
1 3
1 3 4
2 4
1 3 5
2 4
1 3 5 6
2 6
1 3 5 7
Le principe d’insertion est le suivant :
BDSQL1 103
34.5 Application aux bases de données
Dans un B-arbre, les noeuds internes et feuilles contiennent des clefs et les pointeurs vers les
données associées.
34.5.2 Arbres B +
• les feuilles stockent toutes les clefs et pointent vers les données dans les pages
• les noeuds internes et feuilles sont liées par une liste doublement chainée (chainage avant et
chainage arrière)
• les valeurs des clefs sont liées par une liste chainée
Figure 20 – Exemple de B +
page 0
first last ←− noeud racine
page 1 page 2
first last next first last ←− noeuds internes
previous
↓ pages de données
page 8 page 9
BDSQL1 104
Exemple simpliste d’un index primaire :
• taille d’un index sur une valeur de clef primaire de type int : 2*4 octets (un octet pour une
valeur de clef et 1 octet pour l’adresse de la page à accéder)
• nombre de clefs d’un noeud : 16*1024 / 8 octets par clef = 2048 clefs
– chaque noeud peut avoir 2048 fils, chacun ayant 2048 positions de clef, soit 2048 * 2048
= 4.194.304 valeurs de clefs.
• On voit donc, qu’en 2 accès disques, on peut accéder à plus de 4 millions de valeurs de clefs.
Ainsi pour localiser une ligne de données ayant une clef K, le serveur interroge le noeud racine
jusqu’à ce qu’il trouve une clef plus grande ou égale à K, puis il suit le pointeur vers le noeud fils
et ainsi de suite jusqu’à arriver à un noeud feuille. Ce noeud feuille contient les pointeurs vers les
pages de données où la ligne avec la clef K peut être trouvée.
35 Transactions
Une transaction est une unité de traitement qui doit être vue comme un tout : elle doit être
totalement validée ou totalement annulée si un des composants échoue.
Exemple d’une transaction bancaire :
• Cohérence (en anglais : consistency) : à la fin de la transaction, la base de donnée doit être à
nouveau dans un état cohérent
BDSQL1 105
35.1 Démarrer une transaction : start transaction
• Isolation (en anglais : isolation) : aucune autre transaction ne doit interférer (plusieurs ni-
veaux d’isolation (en anglais : isolation level) sont configurables, du plus souple au plus strict)
• Durabilité (en anglais : durability) : une fois la transaction validée, celle-ci est enregistrée de
manière permanente dans la base de donnée
TCL Transaction
Controle Language
start transaction
commit
rollback
Par exemple, lors de l’ajout d’une commande à un client, on souhaite insérer une ligne de
commande (insert into commande ...) puis mettre à jour le client (update client set ... where ...)
L’ordre set transaction permet de préciser le niveau d’isolation souhaité avant de démarrer
une transaction.
35.2 Valider les mises à jour effectuées : commit
Permet de confirmer la mise à jour des données dans la base de données (depuis le dernier ordre
commit)
Listing 113 – Syntaxe SQL ordre commit
1 commit [transaction];
BDSQL1 106
35.4 Exemple
35.4 Exemple
Ainsi pour assurer la validité de la transaction sur les comptes, il faut absolument gérer une
transaction.
Listing 115 – exemple d’algorithme
1 -- demarrer une transaction
2 start transaction;
3 -- lire le compte A
4 select * from compte where idCompte = ’A ’ ;
5 --
6 si le compte existe :
7 update compte set solde = solde - montant where
id_compte = ’A ’ ;
8 -- lire le compte B
9 select * from compte where idCompte = ’ B ’ ;
10 si le compte existe :
11 update compte set solde = solde + montant where
id_compte = ’ B ’ ;
12 -- valider la transaction
13 commit;
14 sinon
15 -- invalider la transaction
16 rollback;
17 finsi
18 sinon
19 -- invalider la transaction
20 rollback;
21 finsi
36 Utilisateurs et privilèges
La sécurité d’accès à une base de données est liée à des comptes d’utilisateurs auxquels des
privilèges d’accès peuvent être attribués.
BDSQL1 107
36.1 Créer un utilisateur : create user
DCL Data
Control Language
create user
drop user
grant
revoke
où :
• nom : compte de l’utilisateur sous la forme ’x’@’y’ :
– x : nom de l’utilisateur
– y : adresse IP à partir de laquelle cet utilisateur peut se connecter (localhot ou [Link],
%, etc.)
Listing 117 – Exemple de création de l’utilisateur, lié à une connexion locale, moi avec le mot de
passe (non crypté) toto
1 create user ’ moi ’ @ ’ l o c a l h o s t ’
2 identified by ’ t o t o ’ ;
BDSQL1 108
36.3 Attribuer des privilèges à un utilisateur : grant
où :
Listing 121 – Exemple d’attribution des droits de lecture, ajout et mise à jour des données de toutes
les tables de la base mabase
1 grant select, insert, update
2 on maBase.*;
3 to ’ moi ’ @ ’ l o c a l h o s t ’ ;
Listing 123 – Exemple de suppression des droits de lecture, ajout et mise à jour des données de tous
les tables de la base mabase
1 revoke insert, update
2 on mabase.*
3 from ’ moi ’ @ ’ l o c a l h o s t ’ ;
BDSQL1 109
37 Vues utilisateurs
Une vue (en anglais : view) est une requête pré-enregistrée dont le résultat peut être utilisé
comme une table dans une requête. Le contenu de la vue est actualisé à chaque utilisation dans
une requête.
L’utilisation d’une vue présente 2 avantages :
• elle est plus performante que la même requête soumise au SGBD car elle a déjà été vérifiée
et optimisée
• elle permet la gestion plus fine des droits d’accès aux données en donnant des droits sur une
vue (certaines colonnes) plutôt que sur une table complète (toutes ses colonnes)
où :
Exemple :
1 CREATE OR REPLACE VIEW lesSalaries
2 AS
3 SELECT matricule, nom, prenom
4 FROM salarie;
En MySQL, il est possible d’utiliser les ordres DML sur des vues à condition que le résultat soit en
concordance avec le contenu de la table
BDSQL1 110
38.1 Langage procédural
• Les procédures et fonctions : de la même manière que tout langage programmation, on peut
écrire des sous-programmes pour effectuer des actions trop complexes pour être réalisées en
SQL,
• Les déclencheurs : mécanisme qui permet l’exécution d’un bloc d’instructions lorsqu’un évè-
nement de modification du contenu d’une table se produit.
• des types de données : types de base du SGBD, types spécifiques pour manipuler les lignes
des tables, etc.,
• une gestion d’exception avec des instructions permettant de gérer les erreurs.
où :
• déclarations : déclaration des variables utilisées dans le bloc (ou les blocs imbriqués),
BDSQL1 111
38.1 Langage procédural
La commande DECLARE permet la déclaration de variables utilisées dans le corps d’un bloc
d’instructions.
où :
La commande DECLARE ...CURSOR déclare un curseur 8 qui permet le parcours d’une liste de
lignes renvoyées par une requête SQL.
Les déclarations de curseurs doivent se trouver après les déclarations des variables.
où :
8
un curseur est une variable pointant vers une des lignes d’un jeu de données ((en anglais : recordset))
BDSQL1 112
38.1 Langage procédural
38.1.4 SET
Syntaxe : DECLARE
1 SET variable = expression [,var2 = expr2,...]
où :
38.1.5 SELECT...INTO
Syntaxe : SELECT...INTO
1 SELECT nomColonne[,...]
2 INTO variable[,...]
3 tableExpression
4 [LIMIT 1]
où :
• tableExpression : origine des valeurs, soit la définition d’une requête SELECT à partir de la
clause FROM,
BDSQL1 113
38.1 Langage procédural
La structure de contrôle IF permet d’exécuter un bloc d’instructions si une condition est remplie.
Syntaxe : DECLARE
1 IF condition THEN instructions
2 [ELSEIF condition THEN instructions] ...
3 [ELSE instructions]
4 END IF;
où :
Syntaxe : DECLARE
1 [etiquette:] LOOP
2 instructions (avec LEAVE)
3 END LOOP [etiquette]
BDSQL1 114
38.1 Langage procédural
Syntaxe : REPEAT
1 [etiquette:] REPEAT
2 instructions
3 UNTIL conditionArret
4 END REPEAT [etiquette]
La structure de contrôle WHILE DO... permet de répéter un groupe d’instructions tant qu’une
condition est vraie.
Syntaxe : WHILE...DO
1 [etiquette:] WHILE condition DO
2 instructions
3 END WHILE [etiquette]
BDSQL1 115
38.1 Langage procédural
Remarque : DELIMITER permet de préciser le marqueur de fin d’instruction SQL pour éviter la
prise en compte des ’ ;’ ausein de la création de la procédure.
BDSQL1 116
38.2 Procédures et fonctions stockées
Exécution par :
1 call recopier;
où :
BDSQL1 117
38.4 Utiliser une procedure
où :
• Deterministic = fonction pure, qui retourne toujours le même résultat en fonction du para-
metre passé.
BDSQL1 118
38.5 Supprimer une procedure : DROP PROCEDURE
où :
où :
BDSQL1 119
38.7 Utiliser une fonction
Le nom DUAL représente unetable fictive permettant l’appel de fonctions système tout en
conservant la syntaxe de base du SELECT.
Les fonctions peuvent être utilisées pour simuler (de manière très complexe) les vues paramétrées
(non disponibles dans MySQL). Exemple : une fonction paramétre (le premier paramètre)’p1’
BDSQL1 120
38.8 Supprimer une fonction : DROP FUNCTION
1 SELECT M.*
2 FROM lesMembres M,
3 (SELECT @p1:=1 param) P;
où :
• des domaines de valeurs comme une liste de valeurs comprises entre des bornes qui néces-
sitent un accès à d’autres tables
• une cardinalité maximale n sous forme d’une valeur littérale précise : 1 étudiants peut s’ins-
crire à un nombre d’options de 1 à 3
• mettre en oeuvre les contraintes sur associations du modèle conceptuel (un étudiant qui passe
un examen doit d’abord avoir validé son inscription)
Les déclencheurs (en anglais : triggers), complètent les possibilités de maintien de l’intégrité des
données d’une base de données.
Ils permettent également de répondre à d’autres besoins :
BDSQL1 121
39.1 Créer un déclencheur : CREATE TRIGGER
• tracer les mises à jour effectuées sur les tables (audit des modifications de données)
Un déclencheur est un bloc de code associé à une table et déclenché ((en anglais : fired))
lorsqu’une instruction DML (INSERT, UPDATE, DELETE) est exécutée sur la table.
Il donne accès au contenu en cours de modification juste avant qu’il soit modifié et juste après
qu’il l’ait été.
Il offre un moyen :
• de définir des contraintes d’intégrité complexes, ou spécifiques, que les contrainte de co-
lonnes ou de tables n’ont pu prendre en compte,
• d’effectuer des traitements complémentaires lors de l’exécution d’un ordre DML : mettre à
jour des valeurs cumulées, journaliser les mises à jour d’informations sensibles, etc.
Le corps de la procédure peut faire référence aux anciennes et nouvelles valeurs des lignes mises
à jour en utilisant les préfixes OLD et NEW.
On souhaite conserver une trace des actions sur la table des membres. Chaque insertion, mise à
jour ou suppression de ligne dans la table ’membre’ va ajouter une ligne dans la table
’auditmembre’.
BDSQL1 122
39.1 Créer un déclencheur : CREATE TRIGGER
Cette table ne comporte par de contrainte d’intégrité, elle sert simplement de trace des
modifications.
BDSQL1 123
39.2 Lister les déclencheurs : SHOW TRIGGERS
prenom_memb) ;
29 --
30 -- supprimer un membre
31 --
32 DROP TRIGGER IF EXISTS membre_delete;
33
34 CREATE TRIGGER membre_delete
35 AFTER DELETE
36 ON membre
37 FOR EACH ROW
38 INSERT INTO auditMembre (utilisateur,date_maj,type_maj,
id_memb,
39 nom_memb_av,prenom_memb_av,nom_memb_ap,prenom_memb_ap
)
40 VALUES (USER(), now(), " supp " , OLD.id_memb ,
41 OLD.nom_memb,OLD.prenom_memb, NULL, NULL) ;
BDSQL1 124
40 Organisation physique des données : page
L’organisation des données sur les supports de persistance comme le disque dur :
• des pistes concentriques forment des cylindres (formé par une piste sur les plateaux d’un
disque dur)
• des secteurs forment l’unité d’accès aux données stockées : un secteur permet le stockage de
512 octets.
• des blocs regroupent 4 à 8 secteurs, soit 2048 à 4096 octets, afin d’optimiser l’accès disque (la
taille d’un fichier sera un multiple de 2048)
Afin d’améliorer les performances d’accès aux données, les SGBDs ont une structure logique de
page comportant plusieurs blocs. Lors d’un accès physique, plusieurs blocs consécutifs formant
une page seront récupérés.
Les pages relatives aux index comportent une organisation sous forme d’arbres dont les noeuds
comportent des clefs et les pages où se trouvent les lignes correspondantes.
Les pages relatives aux données comportent un index des clefs et la localisation de la ligne dans la
page.
BDSQL1 125
Sixième partie
BDSQL1 126
Septième partie
Annexes
41 Compléments à la création des tables
• PostgreSQL (libre) et l’outil d’administration pgAdmin (qui offre une aide SQL pour Post-
greSQL très complète) : solution complète, riche en possibilités, aide SQL, etc.
• MySQL (Oracle) : intégré dans un pack ? EasyPHP - séparément avec des outils d’administra-
tion
Vous pourrez construire des bases de données puis des applications qui pourront y accéder.
BDSQL1 127
43 Exemples d’intégration du SQL en programmation
BDSQL1 128
43.2 Exemple en PHP avec MySQL
33 lister(cur)
34
35
36 # fermer la connexion
37 [Link]()
BDSQL1 129
43.3 Exemple en C avec MySQL
• le fichier [Link]
• le fichier libmysqlclient.a
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <winsock.h>
4 #include " MYSQL / mysql . h "
5
6 int main(void)
7 {
8 // Déclaration d’un enregistrement de type MYSQL
9 MYSQL conn;
10 // Initialisation des données de la variable précédente
11 mysql_init(&conn);
12 //Options de connexion
13 mysql_options(&conn,MYSQL_READ_DEFAULT_GROUP, " o p t i o n " );
14
15 // si la connection s’est bien passée
16 if (mysql_real_connect(&conn, " l o c a l h o s t " , " r o o t " , " xxx " , "
mabase " ,0,NULL,0))
17 {
18 // soumission de la requête au SGBD
19 mysql_query(&conn, " s e l e c t nom , prenom from a c t e u r
where num_act between 1 and 1 0 ; " );
20
21 // Déclaration des variables résultat
22 MYSQL_RES *result = NULL;
23 MYSQL_ROW row;
24
25 unsigned int i = 0;
26 unsigned int num_champs = 0;
27
28 // affecter à result le jeu de données renvoyé par
le SGBD
29 result = mysql_use_result(&conn);
30
31 // récupérer le nombre de colonnes du jeu de ré
sultat
32 num_champs = mysql_num_fields(result);
BDSQL1 130
33
34 // tant qu’il y a des lignes dans le résultat
35 // affecter à la variable row la prochaine ligne
du jeu de résultat
36 while ((row = mysql_fetch_row(result))) {
37 //On déclare un pointeur long non signé pour y
stocker la taille des valeurs
38 unsigned long *lengths;
39
40 //On stocke ces tailles dans le pointeur
41 lengths = mysql_fetch_lengths(result);
42
43 //On fait une boucle pour accéder à la valeur
de chaque champs
44 for(i = 0; i < num_champs; i++)
45 {
46 //On ecrit toutes les valeurs
47
48 //printf("[%.*s] ", (int) lengths[i], row[i]
? row[i] : "NULL");
49 printf( " [ % . ∗ s ] " , (int) lengths[i], row[i] ?
row[i] : " NULL " );
50
51 }
52 printf( " \ n " );
53 }
54
55 // libération du jeu de résultat
56 mysql_free_result(result);
57
58 // libération de la connection au SGBD
59 mysql_close(NULL);
60 //mysql_close(&conn);
61 } else {
62 printf( " Une e r r e u r s ’ e s t p r o d u i t e l o r s de l a
c o n n e x i o n au SGBD " );
63 }
64
65 return 0;
66
67 }
44 Grammaire BNF
Lien vers la grammaire BNF (forme de Backus-Naur) pour SQL92.
BDSQL1 131
[Link]
BDSQL1 132
Index
*, 28, 60 date_format, 69
datediff, 69
abs, 68 day, 69
acos, 68 DECLARE, 112
all, 26, 30, 38, 39, 65, 77, 82, 84, 109 DECLARE ...CURSOR, 112
alter table, 6, 12, 13 DECLARE ...HANDLER, 113
and, 29 default, 9
any, 30, 65, 77, 82 deferrable, 15
as, 71 degrees, 68
asc, 73 DELETE, 122
asin, 68 delete from, 6, 23
atan, 68 DELIMITER, 116
auto_increment, 11, 17 desc, 73
avg, 60 distinct, 26
drop database, 10
between, 29, 33, 34, 77
drop index, 18
boolean, 4
drop table, 6, 17
case, 72 drop user, 108
cast, 71
except, 41
ceiling, 68
exists, 30, 77, 84
char, 4
exp, 68
char_length, 70
check, 9, 121 extract, 69
CLOSE, 116 FETCH, 116
coalesce, 71 floor, 68
commit, 106 foreign key, 9, 15, 121
concat, 70 from, 25, 41, 42, 45, 53, 75, 77, 80, 92
constraint, 14 full, 54
convert, 70
cos, 68 grant, 109
count, 60 group by, 25, 61, 63, 92
COUNT SUM AVG MIN MAX, 92
create database, 10 having, 25, 61, 65, 75, 77, 92
create index, 18
CREATE OR REPLACE TRIGGER, 122 IF, 114
create table, 6, 11 in, 29, 31, 32, 65, 77, 82
CREATE TRIGGER, 122 inner join, 45, 46, 92
create user, 108 INSERT, 122
cross join, 41, 92 insert into, 6, 20
current_date, 71 int, 4
current_time, 71 intersect, 45
interval, 69
date, 4 is not null, 29, 35
date_add, 69 is null, 29, 34
133
INDEX
BDSQL1 134