C01 SQL
C01 SQL
2 octobre 2022
Le but de ce chapitre est d’introduire cette structure fondamentale d’organisation qu’est la base de
données (BDD), et d’apprendre (un peu) à manipuler les bases de données en langage SQL (Structure
Query Language).
I Introduction
I.1 Intérêt des bases de données
Limites des structures de données "plates" :
Nous avons tous l’habitude de stocker des données simples dans, par exemple un fichier de type
excel. En Python on peut les stocker dans une liste (de listes ou de tuples).
Mais commençons par un exemple, pour montrer en quoi cela n’est pas toujours suffisant :
Considérons l’ensemble des classes de CPGE du lycée Berthollet. Chaque classe est identifiée par un
couple unique (filière,numéro). De plus, chaque classe admet une équipe professorale qui lui est propre.
Si l’on voulait stocker ces informations, on pourrait se dire qu’il suffirait d’un simple tableau, comme
par exemple le suivant, qui stocke dans une liste, l’ensemble des informations nécessaires à la définition
d’une classe, c’est-à-dire sa filière, son numéro et la liste des professeurs où l’on stocke des doublets
(nom,matière) :
lycee=[
("MPSI",1,[(’Mouton’,’Maths’),(’Desmarais,’Physique’),...]),
("MPSI",2,[(’Ruef’,’Maths’),(’Ory,’Physique’),...]),
("PCSI",1,[(’Duret’,’Maths’),(’Bourdaud,’Physique’),...]),
...
]
De la sorte, il est très simple de déterminer l’équipe professorale d’une classe donnée connaissant sa fi-
lière et son numéro (complexité linéaire dans le nombre de classes). En revanche, il devient plus difficile
de rassembler tous les professeurs d’une matière donnée, par exemple pour prévenir tous les profs de
maths de la tenue d’une réunion (complexité globalement quadratique).
Plus généralement, on peut se poser différents types de questions :
— Combien de classes y a-t-il au lycée ?
— Qui sont les profs de français ?
— Combien de profs interviennent sur plusieurs matières ?
— Quel est le prof qui a le plus de classes différentes ?
— ...
1
MP*, 2022/2023 Informatique commune Lycée Berthollet
On peut bien entendu écrire de petites fonctions Python pour répondre de ces questions, mais la struc-
ture même de la liste rend certaines recherches faciles et d’autres plus compliquées, et plus longues. Et
si cela reste rapide pour de petites listes, une complexité quadratique (ou plus) engendre un temps de
recherche très long pour un ensemble de données important.
Autres problèmes.
Ce n’est pas tout ! La structure de la liste précédente pose un certain nombre d’autres problèmes :
— Le format n’est pas standardisé (liste de tuples, de listes...), il n’y a pas de norme naturelle.
— Une partie de l’information est redondante. Cela prend de l’espace mémoire pour rien, et cela
n’est pas négligeable quand il s’agit d’une masse importante d’information.
— Non seulement la recherche d’information peut prendre du temps, mais il faut écrire une fonction
spécifique à chaque nouvelle recherche.
— Rien de permet de vérifier que les données sont cohérentes, (par exemple que les intitulés de
classes soient MPSI, PCSI ECE, ECS, HK, ... et non TOTO, TATA, TUTU ou encore que des
notes soient bien des nombres entre 0 et 20).
— Enfin, rien n’interdit d’entrer, suite à une erreur par exemple, deux lignes identiques, ou pire,
en contradiction. Dans notre exemple, on peut rentrer deux classes de MPSI 2 avec M. Mascaro
comme prof de maths dans la première, et M. Ruef dans la deuxième...
Bases de données
Une base de données (BDD) est :
— une collection d’informations ou de données qui existent sur une longue période de temps
et qui décrivent les activités d’une ou plusieurs organisations ;
— un ensemble de données modélisant les objets d’une partie du monde réel et servant de
support à une application informatique.
2
MP*, 2022/2023 Informatique commune Lycée Berthollet
efficacement des données spécifiques dans une grande masse d’informations (pouvant atteindre
plusieurs milliards d’octets) partagée par de multiples utilisateurs.
Concrètement, on peut interroger un SGBD via un logiciel dédié, en langage SQL, et on récupère le
résultat qu’on traite alors. Cette structure est appelée architecture client-serveur. Plusieurs utilisateurs
peuvent se connecter en même temps, et de manière indépendante.
Les SGBD existantes sont nombreuses : MySQL, PostgreSQL, Oracle, SQLite Manager, ... Toutes
fonctionnent sur un même système client-serveur, sauf SQLite, plus facile d’utilisation, mais plus limité.
Dans le cadre du cours et des TPs associés, nous nous limiterons à SQLite Manager.
3
MP*, 2022/2023 Informatique commune Lycée Berthollet
Dans la pratique, on a bien plus généralement une structure appelée architecture trois tiers :
— le tiers utilisateur,
— le tiers applicatif,
— le tiers BDD.
Le tiers utilisateur (nous, et notre ordinateur) ne communique qu’avec le serveur intermédiaire (en
effectuant une recherche Google par exemple), et c’est alors ce serveur qui va, via un programme, com-
muniquer avec la BDD.
En bref, en tant qu’utilisateur, il est rare de devoir écrire une requête en SQL pour interroger directe-
ment une BDD.
II Le modèle relationnel
II.1 Bases et vocabulaire
Pour illustrer toutes les définitions qui vont suivre, nous nous servirons de la base de données Musique
ci-dessous :
4
MP*, 2022/2023 Informatique commune Lycée Berthollet
Introduisons plus complètement nos premières définitions, en commençant par la notion centrale de
relation :
Une relation.
R a1 : D 1 ... aj : Dj ... an : Dn
Définition : attributs
Dans la relation, ou table définie par le tableau ci-dessus :
— R est le nom de la relation.
— a 1 ,. . . , a n sont appelés les attributs de la relation.
— Chaque attribut est d’un certain type (entier, flottant, chaine de caractère, ...). D j est alors
appelé le domaine de l’attribut, aussi noté dom(a j )). Autrement dit, le domaine D j est
l’ensemble des valeurs que peut prendre l’attribut a j .
— Le nombre total n d’attribut de la relation est appelé arité de la relation.
5
MP*, 2022/2023 Informatique commune Lycée Berthollet
Remarque : L’extension de relation est un ensemble, l’ordre des lignes est donc lui aussi sans importance.
Toujours en tant qu’ensemble, il est par contre interdit d’avoir deux fois exactement la même ligne.
Clef primaire
Définition
Pour R une relation, une clef primaire est un sous-ensemble K d’attributs vérifiant :
∀ u 1 , u 2 ∈ R, u 1 (K) = u 2 (K) ⇒ u 1 = u 2 .
Autrement dit, si deux tuples coïncident sur K, ils doivent être égaux. la projection de R sur K
est injective.
En pratique, la clef primaire est un identifiant, le plus simple possible, pour chaque tuple.
Une bonne clef primaire sera une clef qui possède le moins possible d’attributs. Souvent, les BDD af-
fectent à chaque tuple un numéro, appelé identifiant, qui sert de clef primaire. Dans certains ouvrages,
une clef est qualifiée de primaire si elle possède un seul attribut !
Exemples :
— Dans la table Albums, la clef primaire la plus judicieuse est (Artiste,Titre).
L’attribut Album n’est pas une clef primaire pour la table Chansons.
— Un numéro de sécurité sociale est une bonne clef primaire, pour une table référençant la popu-
lation française.
— Sur internet, l’adresse e-mail est souvent utilisée. Il est en général impossible de définir deux
comptes sur un même site en utilisant la même adresse e-mail.
Remarque : On définit pour chaque table en général une clef primaire, mais on peut aussi définir d’autres
clefs.
Exemple : Dans la BDD de notre exemple, il y a bien entendu un lien entre les deux tables.
La deuxième table Chansons nous dit sur quels albums se trouvent les chansons référencées. Il est
6
MP*, 2022/2023 Informatique commune Lycée Berthollet
donc naturel de demander à ce que tous les albums apparaissant dans cette table soient dans la table
Albums.
C’est la contrainte de référence, ou de clef étrangère.
Définition
Une contrainte de référence est une correspondance entre des attributs {a 1 , . . . , a k } d’un schéma R
et des attributs {a01 , . . . , a0k } d’un schéma R’, telle que :
1. Pour tout tuple t de R, il existe un tuple t0 de R’ tel que t[a 1 , . . . , a k ] = t0 [a01 , . . . , a0k ],
2. {a01 , . . . , a0k } est une clef de R’.
Exemple : (Album, Artiste) est une clef étrangère pour la table Chansons.
Enfin, on peut préciser les domaines des attributs par des contraintes booléennes. Cela se fait à la
création de la table.
Exemples :
— Pour la liste des classes de prépa du lycée, les filières (de première année) seront des chaînes de
caractères uniquement à valeurs dans {’MPSI’,’PCSI’,...},
— On va exiger d’une note qu’elle soit comprise entre 0 et 20.
Nous avons fini de décrire la structure de notre BDD. Il reste à apprendre comment s’en servir.
7
MP*, 2022/2023 Informatique commune Lycée Berthollet
— Création de toutes les tables (ou relations) de la BDD, c’est-à-dire pour chacune des tables, spé-
cification de tous les attributs et de leur domaine.
— Précision de la clef primaire pour chacune des tables.
— Précision, s’il y a lieu des contraintes des clefs étrangères.
— Précision, s’il y a lieu, des contraintes de domaines.
Le schéma de BDD étant créé, on peut alors remplir la BDD avec des tuples.
Voici quelques exemples de requêtes en langage courant que nous pouvons poser sur notre base :
— Qui a écrit la chanson "Le roi" ?
— Donner tous les chansons référencées de Radiohead.
— Quelles sont les chansons sortis avant 1980 ?
Ces requêtes mettent en jeu une ou plusieurs relations. Pour combiner les différentes relations et pour
les manipuler, on utilise des opérateurs ensemblistes ou relationnels.
Pour toutes les opérations qui suivent, nous présenterons successivement les notions abstraites, puis
leur traduction en langage de l’algèbre relationnelle et enfin leur traduction en langage SQL.
Précisons tout de suite que les requêtes SQL, auront toujours la même base concernant une syntaxe :
Remarque
Le langage SQL, contrairement à Python, n’est pas sensible à la casse (c’est-à-dire aux majuscules
et aux minuscules), mais par convention, on choisit de donner les instructions du langage SQL
en majuscules (comme SELECT, FROM, WHERE, etc.) alors que ce qui est du ressort des tables
(autant les attributs que les noms des tables) en minuscules.
Notons enfin que SQL est un langage déclaratif, c’est-à-dire que l’on dit au SGBD ce que l’on veut
faire, mais on ne lui dit pas (vraiment) comment il doit le faire. En interne, l’interpréteur va s’arranger
pour optimiser la requête pour obtenir le résultat en un minimum de temps. Les notions de complexité
abordées dans les précédents chapitre d’algorithmique n’ont donc pas vraiment de sens puisque même
une requête "mal formulée" peut s’exécuter très rapidement grâce à une reformulation interne.
8
MP*, 2022/2023 Informatique commune Lycée Berthollet
III.1.a Projection
La projection, permet d’éliminer des attributs, pour ne garder que ceux qui nous intéressent. Elle
est notée πattributs (Relation).
Elle renvoie donc une nouvelle table, obtenue en enlevant certaines colonnes.
OK Computer 1997
Fernande 1972
Oracular Spectacular 2007
In Rainbows 2007
Vive la prépa ! 2019
Requiem 1791
Si après la projection on retrouvait deux tuples (réduits) identiques, on n’écrirait qu’une seule fois le
tuple. L’application π n’est pas injective !
Toutefois, ce n’est pas ce que rend la requête SQL, qui garde le même nombre de tuples, et qui ne
fusionne pas les tuples réduits identiques.
Il est possible de forcer cette fusion, et donc de n’avoir que des tuples différents, à l’aide du mot-clef
"DISTINCT" :
Exemple :
Oracular Spectacular
Fernande
Vive la prépa !
OK Computer
Très souvent, seule une partie de l’ensemble des lignes d’une table nous intéresse, on va donc sélec-
tionner les lignes intéressantes d’après une certaine contrainte. En langage de l’algèbre relationnelle,
une telle sélection se note σcontrainte (Table).
La contrainte peut être de toute sorte, comme une vérification d’égalité (Titre="Fernande") ou d’égalité
approchée (Titre LIKE "Les maths%"), une inégalité (Année>2000), ...
9
MP*, 2022/2023 Informatique commune Lycée Berthollet
Remarque
— Si plusieurs attributs sont chiffrés, on peut effectuer des opération élémentaires dans les
contraintes. Par exemple, dans une BDD géographique ou population et surface sont
des attributs, on peut écrire "population/surface>200".
— On peut ordonner la table selon un attribut (chaîne de caractère ou nombre) à l’aide de la
commande ORDER BY att (ordre croissant) ou ORDER BY att DESC (ordre décroissant).
Exemple :
Remarque : D’autres opérations sont encore possibles : valeur manquante (mot-clef "IS NULL" ou "IS
NOT NULL"), vérification d’appartenance à un intervalle, à un autre ensemble (mot-clef : "IN"), vérifi-
cation de certaines propriétés (mot-clef : "EXISTS"), vérification de comment des données se comparent
à toutes celles d’une autre table (mot-clef : "ALL") ou seulement si la comparaison tient pour l’une ou
l’autre des données d’une autre table (mot-clef : "ANY""ou "SOME").
Pour plus de détails sur ces possibilités, on pourra par exemple consulter le site http://sql.sh
III.1.c Renommage
Il peut être utile de renommer un ou plusieurs attributs, en particulier lors d’un travail avec plu-
sieurs tables.
Par exemple, les deux tables de Musique ont un attribut Titre, qui correspond dans la première rela-
tion au titre de l’album, dans la seconde au titre de la chanson.
En algèbre relationnelle, un renommage se fera avec les notations : ρ A →B (R), ou pour plusieurs attri-
buts : ρ A 1 ,...,A n →B1 ,...,B n (R).
En language SQL, il suffit d’utiliser le mot-clef "AS".
Exemple :
10
MP*, 2022/2023 Informatique commune Lycée Berthollet
OK Computer Radiohead
Fernande Georges Brassens
Oracular Spectacular MGMT
In Rainbows Radiohead
Vive la prépa ! Les Taupins
Requiem Mozart
On peut effectuer les opérations ensemblistes habituels : l’union, l’intersection et la différence d’en-
sembles, si la structure le permet, c’est-à-dire si l’on peut rendre le résultat dans une même table. Il
faut donc le même schéma relationnel (dans le même ordre).
Union A ∪ B
Deux variantes sont possibles :
— soit deux requêtes distinctes, avec le mot-clef "UNION", entre les deux,
— soit une sélection de la forme "WHERE ... OR ...".
Exemple :
Intersection A ∩ B
De même que pour l’union, on peut utiliser les mots-clefs "INTERSECT" ou "AND" :
SELECT * FROM Chansons WHERE Album=’OK Computer’ AND Titre LIKE ’%ar%’ ;
s’écrit aussi
SELECT * FROM Chansons WHERE Album=’OK Computer’
INTERSECT
SELECT * FROM Chansons WHERE Titre LIKE ’%ar%’ ;
R Titre Album Artiste
11
MP*, 2022/2023 Informatique commune Lycée Berthollet
Différence A \ B
Pour la différence, la commande est "EXCEPT" 1 . Mais on peut souvent l’écrire plus simplement avec
un "AND" en notant que A \ B = A ∩ B.
Exemple :
III.2.a Jointure
Le premier outils complexe à notre disposition est la jointure (symétrique), noté en algèbre relation-
nelle R ./ A = A 0 R 0 = R[A = A 0 ]R 0 .
La jointure revient à associer les lignes d’une table aux lignes d’une autre table en se basant sur la
correspondance de valeurs dans une colonne de chaque table.
Les mots-clefs SQL sont "JOIN" et "ON" :
Exemple : Dans notre exemple, la jointure entre nos deux tables se fera sur Titre de la table Albums
et Album de la table.
Remarque : Si l’on ne fait pas de projection, les deux colonnes de la jointure apparaissent, mais sont
identiques, au titre près. Avec une projection supplémentaire judicieuse, une seule des deux colonnes
apparaît.
Exemple :
12
MP*, 2022/2023 Informatique commune Lycée Berthollet
Remarque
Si on ne souhaite pas renommer les attributs, mais que certains noms apparaissent dans chacune
des tables de la jointure, on peut/doit préfixer l’attribut par le nom de la table (c’est-à-dire écrire
"table.attribut" au lieu de "attribut") pour lever tout ambiguïté.
On aura :
13
MP*, 2022/2023 Informatique commune Lycée Berthollet
On a bien réalisé le produit cartésien, qui peut être pertinent dans certains cas. Mais on voit ici que
la table obtenue n’est pas bien sensée. On peut faire une sélection, pour retrouver, avec une syntaxe
différente, ce que l’on a obtenu précédemment avec une jointure :
Remarque
Il est, comme en maths, tout à fait possible de faire un auto-produit cartésien, c’est-à-dire de
considérer la table R × R. Le seul problème qui se présente alors est que les noms des attributs
sont dupliqués, donc ambigus.
Pour y remédier, le plus simple est de renommer les tables elles-mêmes, à l’aide de la commande
AS, et donc écrire une requête de type :
SELECT table1.att1,table2.att5 FROM R AS table1,R AS table2 WHERE ... ;
Remarque : En algèbre relationnelle, il existe une notion de division cartésienne, peu utile et n’ayant
pas de syntaxe simple en langage SQL.
Table Notes
Notes Matière Nom Notes
Info J.Bond 4
Info Astérix 3
Info L.Luke 14
Maths L.Luke 16
Maths J.Bond 12
Maths Astérix 14
Sport L.Luke 9
Sport Astérix 18
Physique J.Bond 7
Physique Astérix 13
14
MP*, 2022/2023 Informatique commune Lycée Berthollet
Nous avons vu sur les précédents exemples qu’il était assez facile de calculer des quantités "sur
une ligne" en combinant les informations que l’on peut y trouver. Néanmoins, il peut être intéressant
de calculer des quantités "sur une colonne" (dont le domaine est un ensemble de nombres), comme par
exemple déterminer la valeur moyenne, le maximum, ... des éléments d’une colonne.
On utilise pour cela les fonctions d’agrégation, notée γ en algèbre relationnelle.
Il en existe cinq différentes :
— comptage : compte le nombre de lignes (de n-uplets) d’un groupe. "COUNT" en SQL,
— max (resp. min) : détermine le plus grand (resp. le plus petit) élément d’un groupe . "MAX" et
"MIN" en SQL,
— moyenne : calcule la moyenne ! "AVG" en SQL,
— Enfin somme : calcule la somme, "SUM" en SQL.
La syntaxe en algèbre relationnelle est γ f ( A ) (R), où f est la fonction utilisée, A l’attribut concerné.
Exemple :
Astérix 18
Plus intéressant, on peut calculer des moyennes, sommes... non pas sur l’ensemble des valeurs de notre
attribut, mais sur des sous-groupes, des agrégats, en utilisant la commande "GROUP BY", qui regroupe
suivant les valeurs d’un autre attribut.
En algèbre relationnelle, la syntaxe sera B γ f ( A ) (R), où f est la fonction utilisée, A l’attribut concerné
regroupé selon les valeurs de B.
Un exemple valant mieux qu’un long discours :
Astérix 12
J.Bond 7.67
L.Luke 13
On peut souhaiter encore effectuer une sélection en aval de la fonction agrégative. L’instruction
"WHERE" sera alors remplacée par "HAVING", qui s’utilise exactement de la même manière.
Exemple :
15
MP*, 2022/2023 Informatique commune Lycée Berthollet
Astérix 12
L.Luke 13
IV Pour résumer
Pour finir, un résumé des requêtes SQL que nous avons vues :
Quoi Comment
Projection SELECT A1,A2,... FROM R
Rappelons tout de même que cette liste est loin d’être exhaustive.
16