Les bases de données
- Bases de SQL -
Il existe plusieurs langages permettant d’interagir avec une base de données relationnelle. Le plus utilisé est le Structured Query Language ou SQL.
Ce langage peut être partagé en trois parties :
On utilise ci-dessous du SQL classique. On pourra à ce propos consulter avec intérêt les sites 1 et 2.
Remarque : sqlite, que nous utiliserons avec Python, diffère légèrement de SQL. On pourra consulter ce site.
Le SQL s’utilise soit dans l’interface de programmation d’un SGBD soit directement dans du code python avec sqlite3.
Nous allons dans cette partie utiliser le schéma relationnel suivant :
Nous pouvons donc créer une base de données lycee
:
La structure de base pour créer une table est la suivante :
CREATE TABLE nom_de_la_table
(
colonne1 type_donnees,
colonne2 type_donnees,
colonne3 type_donnees,
)
Il est aussi possible d’ajouter des contraintes, pour les clés primaires et étrangères par exemples.
Ci-dessous est donnée le code créant la table eleves
:
CREATE TABLE eleves
(
id INTEGER NOT NULL AUTO_INCREMENT,
nom VARCHAR(100),
prenom VARCHAR(100),
naissance VARCHAR(100),
classe INTEGER,
spe_1 INTEGER,
spe_2 INTEGER,
PRIMARY KEY (id)
FOREIGN KEY (classe) REFERENCES classes(id),
FOREIGN KEY (spe_1) REFERENCES cours(id),
FOREIGN KEY (spe_2) REFERENCES cours(id)
)
Le code est assez clair :
VARCHAR(100)
signifie que l’on utilise du texte comptant au maximum 100 caractèresLes tables étant créées il est intéressant de les peupler en insérant des lignes (row en anglais)
La fonction à utiliser est INSERT
et sa structure :
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN)
Dans bien des cas, il n’est pas nécessaire de fournir la valeur de la clé primaire si celle-ci est actualisée automatiquement
Par exemple :
INSERT INTO eleves (nom, prenom, naissance, classe, spe_1, spe_2)
VALUES ("Dupont", "Eric", "01/03/03", 1, 5, 2)
Une fois la base créée et peuplée, l’action la plus courante est de sélectionner des données.
La fonction à utiliser est SELECT
et sa structure :
id
est 8 :Le *
(appelé wildcard) signifie que l’on sélectionne toutes les colonnes.
Explication : le WHERE 1
est toujours vrai car 1 = True
.
On sélectionne ainsi les élèves dont l’id
est inférieur ou égal à 16 et la classe
est la 2
permettra de sélectionner les élèves dont le prénom commence par Jul
(les Julie, Julia, Julio, Julien…)
Imaginons que nous souhaitions sélectionner les élèves de la “Terminale 1”… Nous pourrions faire une requête du type
mais il faudrait être certain que l’identifiant de la “Terminale 1” est bien le numéro 1… Or voici la table classes
:
id | classe | prof_principal |
---|---|---|
1 | 2nde-1 | M. Ayrault |
2 | 2nde-2 | M. Beyrault |
… | … | … |
15 | Term-1 | M. Heyrault |
… | … | … |
La “Terminale 1” n’a pas l’id
numéro 1 !
Si l’on consulte le schéma proposé plus haut, on constate que la classe
de chaque élève correspond à un id
de la table classe
. Il est ainsi possible de préciser la classe en mettant en correspondance les tables eleves
et classes
. Comme nous souhaitons sélectionner les élèves pour lesquels la classe est exactement la “Terminale 1” et pas plus, nous allons faire une INNER JOIN
La structure est la suivante :
Dans le cas présent on fait :
Expliquons les choses :
SELECT * FROM eleves
: on sélectionne tous les attributs de la table eleves
…INNER JOIN classes
: … en indiquant que l’on souhaite utiliser des critères de la table classes
…ON eleves.classe = classes.id
: … en rappelant la relation entre les tables (la classe
de l’élève correspond à l’id
de la classe )…WHERE classes.nom = "Term-1"
:… et on ne prend que les lignes pour lesquelles le nom
de la classe est Term-1
On obtient avec cette requête le nombre d’élèves du lycée.
Là encore on compte le nombre d’élèves mais ce décompte est renvoyé dans la colonne nombre
.
ORDER BY ... ASC
(ordre croissant) ou ORDER BY ... DESC
(ordre décroissant) :Cette requête renvoie les noms de tous les élèves triés dans l’ordre alphabétique
GROUP BY ...
SELECT classes.nom, count(eleves.id) as nombre_eleves FROM eleves INNER JOIN classes ON eleves.classe = classes.id GROUP BY classes.nom
On a ainsi :
id
)classes
classes.nom
Comment faire si un élève change de classe ? On met à jour sa donnée avec UPDATE
:
Cela peut donner (en connaissant bien les id
des élèves et des classes)
En étant astucieux, on peut ainsi renommer tous les élèves :
On a parfois besoin de supprimer une entrée/ligne. On utilise :
Ainsi :
permet d’effacer l’élève d’id
numéro 9 s’il quitte le lycée.