Bonjour ! Comme d'habitude :
Shift-Entrée
pour exécuter une cellule.Noyau
> Rdémarrer
en cas de problème.D'après un TP du livre "Bases de données : de la modélisation au SQL" de Laurent Audibert et d’un TP de Franz Ridde.
On utilise une base de données de schéma relationnel :
C'est-à-dire qu'on dispose de 5 tables ($personne$, $jouer$, ...) et, par exemple, la table $personne$ a 3 attributs (=colonnes) : $idp$, $nom$, $prenom$. L'attribut souligné $idp$ est un identifiant unique, on parlera de clé primaire.
Une vue d'ensemble de la base de données est disponible : http://ljouhet.net/classes/python-1a/sql/recap-cinema.png. En général on n'a pas de vue d'ensemble de toute la base de données, mais seulement le schéma relationnel et quelques exemples.
Dans JupyterHub, créer un nouveau notebook Python 3, et commencez par une cellule qui permet de se connecter à la base de données cinema.db
# Pour pouvoir utiliser SQL dans JupyterHub
%reload_ext sql
%config SqlMagic.displaycon = False
%config SqlMagic.autolimit = 100
# Pour charger la base de données 'cinema'
%sql sqlite:////srv/db/cinema.db
Dans la suite, toutes les cellules devront commencer par %%sql
(sinon vous aurez une erreur de syntaxe) : c'est spécifique à JupyterHub, mais ça ne fait pas partie du tout du langage SQL :
SELECT *
FROM film
%%sql
SELECT *
FROM film
%%sql
en début de cellule...SELECT *
FROM personne;
SELECT prenom
FROM personne
ORDER BY prenom ASC; -- ASC : ascendant ou DESC : descendant
SELECT DISTINCT prenom
FROM personne;
SELECT *
FROM personne
WHERE prenom = "John"; -- attention aux guillemets, importants
SELECT idp
FROM personne
WHERE nom = "von Trier" AND prenom = "Lars"; -- attention, aux espaces, aux majuscules...
SELECT titre
FROM film
WHERE idr = (
SELECT idp
FROM personne
WHERE nom = "von Trier" AND prenom = "Lars"
);
-- Ici on fait un produit cartésien. On n'en fera plus jamais après, on fera des jointures !
SELECT *
FROM personne, film; -- (ou) FROM personne JOIN film
-- ici on fait un requête qui ressemble fortement à une jointure, on s'interdira de faire ça et on écrira des jointures
SELECT film.titre
FROM personne, film
WHERE personne.idp = film.idr
AND personne.nom = 'von Trier' AND personne.prenom = "Lars";
-- Une jointure : oui !
SELECT film.titre
FROM personne JOIN film
ON personne.idp = film.idr
WHERE personne.nom = 'von Trier' AND personne.prenom = "Lars";
SELECT
) ? une sélection (WHERE
ou HAVING
) ?Écrire des requêtes permettant de :
cinema.db
, communes.db
, triangles.db
:%sql sqlite:////srv/db/cinema.db
Pyzo
ou avec sqliteman
par exemple : http://ljouhet.net/outils/cinema.dbtriangles.db
SELECT * FROM triangles
INSERT
) qui n'est pas au programme.%config SqlMagic.autolimit = 100
%sql sqlite:////srv/db/triangles.db
%%sql
SELECT *
FROM triangles
%sql sqlite:////srv/db/cinema.db
%%sql
SELECT *
FROM film
communes.db
LIMIT 20
par exemple à la fin de vos requêtes pour ne pas avoir trop de résultats.%sql sqlite:////srv/db/communes.db
%%sql
SELECT c.nom, d.nom
FROM communes AS c JOIN departements AS d
ON c.dep = d.id