Tous les articles par Nicolas Maurin

1- Les variables

Merci à David Roche pour son travail que vous pouvez retrouver sur son site.

Le langage que nous allons utiliser en NSI est Python, pour écrire nos programmes nous devons utiliser un éditeur (IDE , Integrated Development Environment).

Il en existe une multitude, nous utiliserons Thonny. Vous pouvez l’installer chez vous en suivant les indications sur le site thonny.org.

Prise en main de Thonny

Thonny lancé, à l’écran vous devriez avoir ceci:

Thonny possède plusieurs fenêtres. Pour les faire apparaitre ou disparaitre, cliquer dans le menu Affichage et cochez celles qui vous intéressent. Nous en utiliserons 3 en particulier, la fenêtre Éditeur (qui permet de saisir les lignes de programme), la fenêtre Console (interpréteur interactif qui permet l’interaction entre le programme et l’utilisateur) et la fenêtre Variables (qui affiche l’état des variables).

À faire vous-même 1

Dans la fenêtre « Éditeur« , saisir le programme suivant :

print("hello world !")

puis lancer votre programme (en appuyant sur F5 ou en cliquant sur la flèche blanche sur fond vert) (avant la première exécution on vous demandera d’enregistrer votre programme, faites attention ou vous stockez vos fichiers…)

le message hello world ! doit apparaître dans la console:

Notion de variable

Définition du mot ordinateur d’après « Le Petit Larousse » :

« Machine automatique de traitement de l’information, obéissant à des programmes formés par des suites d’opérations arithmétiques et logiques. »

Qui dit « traitement de l’information », dit donc données à manipuler. Un programme « passe » donc son temps à traiter des données. Pour pouvoir traiter ces données, l’ordinateur doit les ranger dans sa mémoire (RAM – Random Access Memory). La RAM se compose de cases dans lesquelles nous allons ranger ces données (une donnée dans une case). Chaque case a une adresse (ce qui permet au processeur de savoir où sont rangées les données).

Alors, qu’est-ce qu’une variable ?

Eh bien, c’est une petite information (une donnée) temporaire que l’on stocke dans une case de la RAM. On dit qu’elle est « variable », car c’est une valeur qui peut changer pendant le déroulement du programme.

Une variable est constituée de 2 choses :

  • Elle a une valeur : c’est la donnée qu’elle « stocke » (par exemple le nombre entier 5)
  • Elle a un nom : c’est une étiquette qui permet de la reconnaître. Nous n’aurons pas à retenir l’adresse de mémoire, nous allons juste indiquer des noms de variables à la place.
i = 12			

Grâce à cette ligne, nous avons défini une variable qui porte le nom i et qui « contient » le nombre entier 12. Plus précisément, nous dirons que la variable i référence le nombre entier 12.

À faire vous-même 2

Dans la partie « éditeur » de Thonny, saisir le code suivant :

point_de_vie = 15			

Après avoir exécuté le programme en cliquant sur Executer le script courant, il est possible de connaître la valeur référencée par une variable en utilisant la partie « console » de Thonny.

Dans le cas qui nous intéresse ici, taper point_de_vie dans la console

Après avoir appuyé sur la touche « Entrée« , vous devriez voir la valeur référencée par la variable point_de_vie s’afficher dans la console.

N.B. : Dans la suite, la procédure sera toujours la même :

  • Vous utiliserez la partie « éditeur » pour saisir votre programme
  • vous utiliserez la partie « console » pour afficher la valeur référencée par une variable

À faire vous-même 3

Écrire un programme dans lequel on attribue la valeur 12 à la variable point_de_force. La valeur référencée par la variable point_de_force devra ensuite être affichée dans la console.


Nous venons de voir qu’une variable peut référencer un nombre entier, mais elle peut aussi référencer un nombre à virgule :

i = 5.2			

Prenez bien garde, nous utilisons un point à la place d’une virgule (convention anglo-saxonne).

Une variable peut donc référencer plusieurs types d’entités (pour l’instant nous n’en avons vu que deux, mais nous en verrons d’autres plus loin) : les nombres entiers (« integer » en anglais, abrégé en « int« ) et les nombres à virgule (« float » en anglais). Il est possible de connaitre le type de l’entité référencé par une variable à l’aide de l’instruction « type« .

À faire vous-même 4

Tester le programme suivant :

a = 5.2
b = 12			

taper type(a) puis type(b) dans la console

Comme vous pouvez le constater, le type de la grandeur référencée par la variable a et le type de la grandeur référencée par la variable b s’affichent dans la console


Un peu de calculs

Un ordinateur est bien évidemment capable d’effectuer des opérations mathématiques (arithmétiques).

Les signes utilisés sont classiques : +, – , * (multiplication), / (division), // (division euclidienne) ou encore % (modulo : reste d’une division euclidienne).

Il est tout à fait possible d’effectuer des opérations directement avec des nombres, mais il est aussi possible d’utiliser des variables.

À faire vous-même 5

Essayer d’écrire un programme qui additionnera le contenu de 2 variables (nom des variables : nombre_1 et nombre_2). Le résultat de cette opération devra être référencé par une troisième variable nommée resultat (attention pas d’accent dans les noms de variable). Tester votre programme en utilisant la console pour vérifier la valeur référencée par la variable résultat.


À faire vous-même 6

D’après vous, que fait ce programme ?

nombre = 11
nombre = nombre + 1			

Vérifier votre réponse en exécutant le programme (utilisation dans console pour déterminer la valeur référencée par la variable nombre à la fin du programme)


Détaillons ce qui se passe dans le « À faire vous-même 6« :

  • nous créons une variable nombre qui référence l’entier 11
  • nous affichons à l’écran la valeur référencée par nombre (c’est-à-dire 11)

La suite est un peu plus complexe, mais très importante à comprendre. Il va falloir lire la ligne  » nombre = nombre + 1″ de droite à gauche, décortiquons cette ligne :

  •  » nombre + 1″ : nous prenons la valeur actuelle de nombre (c’est-à-dire 11) et nous ajoutons 1 à 11, à droite de l’égalité nous avons donc maintenant la valeur 12
  • nous attribuons la valeur qui vient d’être calculée à la variable nombre
  • nous affichons à l’écran la nouvelle valeur référencée par nombre

Ce raisonnement peut être généralisé pour éviter des erreurs parfois difficiles à corriger : dans une égalité, commencer toujours par évaluer l’expression se trouvant à droite du signe égal.

Exposant, racine carrée, fonctions trigonométriques

Il est aussi possible d’effectuer des calculs plus complexes en utilisant par exemple des exposants, des racines carrées, des fonctions trigonométriques…

Pour utiliser ces fonctions mathématiques plus avancées, il est nécessaire d’ajouter une ligne au début de votre programme :

import math			

Cette ligne permet d’importer (et donc d’utiliser) le module « math » (ce module contient toutes les fonctions mathématiques « classiques »).

Voici quelques exemples :

  • math.pow(x,a) permet de calculer x à la puissance a
  • math.cos(x) permet de calculer le cosinus de l’angle x (l’angle x doit être en radian) (nous avons la même chose pour le sinus ou la tangente)
  • math.sqrt(x) permet de calculer la racine carrée de x

Si vous avez besoin d’autres fonctions mathématiques, consulter la documentation de Python : https://docs.python.org/3/library/math.html

À faire vous-même 7

Quelles sont les valeurs référencées par les variables d, e, f, g, h et i après l’exécution du programme suivant :

import math
a = 5
b = 16
c = 3.14 / 2
d = b / a
e = b // a
f = b % a
g = math.pow(a,2)
h = math.sqrt(b)
i = math.sin(c)			

Vérifiez vos réponses à l’aide de la console


À noter qu’il est tout à fait possible de « mélanger » des nombres entiers et des nombres à virgules (« 3.14 / 2 ») dans une opération.

À faire vous-même 8

Écrire un programme permettant de répondre à la question suivante : « Quel est le type du résultat d’une addition d’un integer et d’un float ? »


Chaînes de caractères

Les variables peuvent aussi référencer des suites de caractères, que l’on appelle « chaîne de caractères ».

À faire vous-même 9

Tester le code suivant :

ma_chaine = "Bonjour le monde !"			

Vérifiez que la variable ma_chaine référence la chaîne de caractères « Bonjour le monde ! »


Le signe + et les chaînes de caractères

L’utilisation du signe + ne se limite pas à l’addition. Il est aussi utilisé pour la concaténation.

D’après Wikipédia :

« Le terme concaténation (substantif féminin), du latin cum («avec») et catena(«chaîne, liaison»), désigne l’action de mettre bout à bout au moins deux chaînes. »

Comme vous avez pu le deviner en lisant la définition ci-dessus, la concaténation va concerner les chaînes de caractères.

À faire vous-même 10

Quelle est la chaîne de caractère référencée par la variable mon_expression après l’exécution du programme ci-dessous ? Validez votre réponse en testant ce programme.

a = "Hello"
b = "World"
mon_expression = a + b			

Chaînes de caractères et variables

Il est aussi possible de concaténer une chaîne de caractères et une ou plusieurs variables :

À faire vous-même 11

Tester le code suivant :

ma_chaine_1 = "Bonjour "
ma_chaine_2 = "le "
res = ma_chaine_1 + ma_chaine_2 + "monde!"		

Les 2 variables ma_chaine_1 et ma_chaine_2 référencent 2 chaînes de caractères, nous avons donc bien ici une concaténation.

Mais que se passe-t-il si la variable référence un nombre (entier ou flottant) ?

À faire vous-même 12

Tester le code suivant :


mon_nombre = 5
res = "Nombre de personnes : " + mon_nombre

Comme vous pouvez le constater, nous avons droit à une erreur. En effet, il n’est pas possible de concaténer une chaîne de caractères et un nombre.

Python nous offre 2 solutions :

  • l’utilisation de la méthode « str »
  • l’utilisation des « fstring »

La méthode (nous verrons plus loin la notion de méthode) « str » permet de transformer un nombre en chaîne de caractères (si la transformation n’est pas possible, nous aurons une erreur)

À faire vous-même 13

Tester le code suivant :

mon_nombre = 5
mon_nombre = str(mon_nombre)		

Quel est le type de la valeur référencée par la variable mon_nombre après l’exécution du programme ci-dessus ?


À faire vous-même 14

Tester le code suivant :

mon_nombre = 5
res = "Nombre de personnes : "  + str(mon_nombre)

Tout fonctionne, car maintenant nous avons bien une concaténation entre 2 chaînes de caractères.


Les « fstring » (nouveauté de Python 3.5), permettent de résoudre ce problème de combinaison variable-chaîne de caractères.

À faire vous-même 15

Tester le code suivant :

mon_nombre = 5
res = f"Nombre de personnes : {mon_nombre}"	

Notez la présence du « f » juste avant le guillemet et des accolades qui encadrent le nom de la variable. Il est possible, dans une même chaîne de caractères d’avoir plusieurs noms de variable.

Suite : les expressions et les booléens

Compresser des fichiers pour envoi sur dépôt pronote

Pour compresser des fichiers et les déposer sur pronote, ouvrir le dossier contenant les fichiers à compresser afin de ne faire qu’un seul fichier avec l’extension .zip.

Pour les sélectionner, faire un cliquer-glisser ou appuyer sur CTRL+A.

Cliquer alors avec le bouton droit et sélectionner : « Envoyer vers » – >  » Fichier compressé« 

Changer éventuellement le nom du fichier, et vous pouvez le déposer dans le dépôt Prononte !

Exercices de programmation complémentaires

Ces exercices vous permettront de vous entrainer en vue de l’évaluation sur la programmation.

Exercice 1

On dispose de la formule suivante pour convertir les degrés Fahrenheit en degrés Celsius :
C = 0,55556 × (F – 32)

où F est une température en degrés Fahrenheit et C la température correspondante en degrés Celsius.
1. Ecrire un programme qui convertit en degrés Celsius une température rentrée au clavier en degrés Fahrenheit.
2. Même question pour la conversion inverse.

Exercice 2

Écrire un programme qui affiche un triangle rempli d’étoiles (*) sur un nombre de lignes donné passé en paramètre, exemple :

1ère version : à l’aide de deux boucles for, en imprimant les * une par une.

On remarquera que, par défaut dans l’instruction print() , figure end = ‘\n’, qui fait passer à la ligne.

print(…, end =’’) ne fera donc pas passer à la ligne.

2ème version : avec une seul boucle for, et une chaîne de caractères où vous accumulerez
des étoiles (pour ceux qui vont un peu plus vite, print(« machin » end= ‘’) évite de passer
à la ligne.

Exercice 3

Programmation d’un petit jeu de devinette. L’ordinateur choisit au hasard un nombre compris entre 1 et 100.

Le but du jeu est de le deviner en un nombre d’essai minimal. À chaque tentative, l’ordinateur, indique « gagné », « trop petit » ou « trop grand ». L’utilisateur dispose d’un nombre d’essais limités.

Écrire l’algorithme en « langage naturel ». Programmer le jeu, et le tester.

Remarque : on utilisera la bibliothèque random.
Pour cela, on écrit « import random » en début de programme.
nombre = random.randint(a, b) renverra un nombre aléatoire tel que
a ≤ Nombre ≤ b

Exercice 4

Convertir une note scolaire N quelconque, entrée par l’utilisateur sous forme de points (par exemple 27 sur 85), en une note standardisée suivant le code ci-dessous :

Note NAppréciation
N >= 80 %A
80 % > N >= 60 %B
60 % > N >= 50 %C
50 % > N >= 40 %D
N < 40 %E

Exercice 5

Ecrire un programme qui affiche les carrés des entiers de 1 à 7 .

Exercice 6

Ecrire un programme qui affiche n fois la suite de symboles suivante :
A #Si n=1
AA #si n=2
AAA
etc…sans utiliser le * comme par exemple print(3* »A »).

n est donné par l’utilisateur.

Exercice 7

Ecrire un programme qui demande un prénom. Si ce prénom est Paul, le programme affiche « enfin c’est toi », sinon le programme redemande un nouveau prénom car ce n’est pas la personne qu’il attend (un genre de mot de passe non ?).

Exercice 8

Ecrire un programme qui additionne tous les nombres que vous entrez (tour à tour) et qui s’arrête lorsque la somme dépasse 100.

Langage SQL

Nous avons eu l’occasion d’étudier la structure d’une base de données relationnelle, nous allons maintenant apprendre à réaliser des requêtes, c’est-à-dire que nous allons apprendre à créer une base des données, créer des attributs, ajouter de données, modifier des données et enfin, nous allons surtout apprendre à interroger une base de données afin d’obtenir des informations.

Pour réaliser toutes ces requêtes, nous allons devoir apprendre un langage de requêtes : SQL (Structured Query Language). SQL est propre aux bases de données relationnelles, les autres types de bases de données utilisent d’autres langages pour effectuer des requêtes.

Pour créer une base de données et effectuer des requêtes sur cette dernière, nous allons utiliser le logiciel « DB Browser for SQLite » (il se stue dans echange\DB Browser for SQLite).

SQLite est un système de gestion de base de données relationnelle très répandu. Noter qu’il existe d’autres systèmes de gestion de base de données relationnelle comme MySQL ou PostgreSQL. Dans tous les cas, le langage de requête utilisé est le SQL (même si parfois on peut noter quelques petites différences). Ce qui sera vu ici avec SQLite pourra, à quelques petites modifications près, être utilisé avec, par exemple, MySQL.

Nous allons commencer par créer notre base de données :

À faire vous-même 1

Après avoir lancé le logiciel « DB Browser for SQLite », vous devriez obtenir ceci :

DB Browser for SQLite

Cliquez sur Nouvelle base de données. Après avoir choisi un nom pour votre base de données (par exemple « db_livres.db »), vous devriez avoir la fenêtre suivante :

DB Browser for SQLite

Cliquez alors sur Annuler

Notre base de données a été créée :

DB Browser for SQLite

mais pour l’instant elle ne contient aucune table (aucune relation), pour créer une table, cliquez sur l’onglet « Exécuter le SQL ». On obtient alors :

DB Browser for SQLite

Copiez-collez le texte ci-dessous dans la fenêtre « SQL 1 »

CREATE TABLE LIVRES
	(id INT, titre TEXT, auteur TEXT, ann_publi INT, note INT);

Cliquez ensuite sur le petit triangle situé au-dessus de la fenêtre SQL 1 Exécuter (ou appuyez sur F5), vous devriez avoir ceci :

DB Browser for SQLite

Comme indiqué dans la fenêtre, « Requête exécutée avec succès » !

Vous venez de créer votre première table.


Revenons sur cette première requête :

Le CREATE TABLE LIVRES ne devrait pas vous poser de problème : nous créons une nouvelle table nommée « LIVRES ».

La suite est à peine plus complexe :

nous créons ensuite les attributs :

  • id
  • titre
  • auteur
  • ann_pulbi
  • note

Nous avons pour chaque attribut précisé son domaine : id : entier (INT), titre : chaîne de caractères (TEXT), auteur : chaîne de caractères, ann_publi : entier et note : entier

L’attribut « id » va jouer ici le rôle de clé primaire. On peut aussi, par souci de sécurité (afin d’éviter que l’on utilise 2 fois la même valeur pour l’attribut « id »), modifier l’instruction SQL vue ci-dessus, afin de préciser que l’attribut « id » est bien notre clé primaire :

CREATE TABLE LIVRES
(id INT, titre TEXT, auteur TEXT, ann_publi INT, note INT, PRIMARY KEY (id));	

Notre système de gestion de base de données nous avertira si l’on tente d’attribuer 2 fois la même valeur à l’attribut »id ».

Nous allons maintenant ajouter des données :

À faire vous-même 2

Toujours dans l’onglet « Exécuter le SQL », après avoir effacé la fenêtre SQL 1, copiez-collez dans cette même fenêtre la requête ci-dessous :

INSERT INTO LIVRES(id,titre,auteur,ann_publi,note)
	VALUES
	(1,'1984','Orwell',1949,10),
	(2,'Dune','Herbert',1965,8),
	(3,'Fondation','Asimov',1951,9),
	(4,'Le meilleur des mondes','Huxley',1931,7),
	(5,'Fahrenheit 451','Bradbury',1953,7),
	(6,'Ubik','K.Dick',1969,9),
	(7,'Chroniques martiennes','Bradbury',1950,8),
	(8,'La nuit des temps','Barjavel',1968,7),
	(9,'Blade Runner','K.Dick',1968,8),
	(10,'Les Robots','Asimov',1950,9),
	(11,'La Planète des singes','Boulle',1963,8),
	(12,'Ravage','Barjavel',1943,8),
	(13,'Le Maître du Haut Château','K.Dick',1962,8),
	(14,'Le monde des Ā','Van Vogt',1945,7),
	(15,'La Fin de l’éternité','Asimov',1955,8),
	(16,'De la Terre à la Lune','Verne',1865,10);

Ici aussi, aucun problème, la requête a bien été exécutée :

DB Browser for SQLite

La table LIVRES contient bien les données souhaitées (onglet « Parcourir les données ») :

DB Browser for SQLite

Nous allons apprendre à effectuer des requêtes d’interrogation sur la base de données que nous venons de créer.

Toutes les requêtes se feront dans la fenêtre SQL 1 de l’onglet « Exécuter le SQL »

À faire vous-même 3

Saisissez la requête SQL suivante :

SELECT id, titre, auteur, ann_publi, note
FROM LIVRES	

puis appuyez sur le triangle (ou la touche F5)


Après un temps plus ou moins long, vous devriez voir s’afficher ceci :

DB Browser for SQLite

Comme vous pouvez le constater, notre requête SQL a permis d’afficher tous les livres. Nous avons ici 2 mots clés du langage SQL SELECT qui permet de sélectionner les attributs qui devront être « affichés » (je mets « affichés » entre guillemets, car le but d’une requête sql n’est pas forcément d’afficher les données) et FROM qui indique la table qui doit être utilisée.

Il est évidemment possible d’afficher seulement certains attributs (ou même un seul) :

À faire vous-même 4

Saisissez la requête SQL suivante :

SELECT titre, auteur
FROM LIVRES

Vérifiez que vous obtenez bien uniquement les titres et les auteurs des livres


À faire vous-même 5

Écrivez et testez une requête permettant d’obtenir uniquement les titres des livres.


N.B. Si vous désirez sélectionner tous les attributs, vous pouvez écrire :

SELECT *
FROM LIVRES

à la place de :

SELECT id, titre, auteur, ann_publi, note
FROM LIVRES

Pour l’instant nos requêtes affichent tous les livres, il est possible d’utiliser la clause WHERE afin d’imposer une (ou des) condition(s) permettant de sélectionner uniquement certaines lignes.

La condition doit suivre le mot-clé WHERE :

À faire vous-même 6

Saisissez et testez la requête SQL suivante :

SELECT titre, ann_publi
FROM LIVRES
WHERE auteur='Asimov'

Vérifiez que vous obtenez bien uniquement les livres écrits par Isaac Asimov.

À faire vous-même 7

Écrivez et testez une requête permettant d’obtenir uniquement les titres des livres écrits par Philip K.Dick.


Il est possible de combiner les conditions à l’aide d’un OR ou d’un AND

À faire vous-même 8

Saisissez et testez la requête SQL suivante :

SELECT titre, ann_publi
FROM LIVRES
WHERE auteur='Asimov' AND ann_publi>1953

Vérifiez que nous obtenons bien le livre écrit par Asimov publié après 1953 (comme vous l’avez sans doute remarqué, il est possible d’utiliser les opérateurs d’inégalités).

À faire vous-même 9

D’après vous, quel est le résultat de cette requête :

SELECT titre
FROM LIVRES
WHERE auteur='K.Dick' OR note>=8

À faire vous-même 10

Écrire une requête permettant d’obtenir les titres des livres publiés après 1945 qui ont une note supérieure ou égale à 9.


Il est aussi possible de rajouter la clause SQL ORDER BY afin d’obtenir les résultats classés dans un ordre précis.

À faire vous-même 11

Saisissez et testez la requête SQL suivante :

SELECT titre
FROM LIVRES
WHERE auteur='K.Dick' ORDER BY ann_publi

Nous obtenons les livres de K.Dick classés du plus ancien ou plus récent.


Il est possible d’obtenir un classement en sens inverse à l’aide de la clause DESC

À faire vous-même 12

Saisissez et testez la requête SQL suivante :

SELECT titre
FROM LIVRES
WHERE auteur='K.Dick' ORDER BY ann_publi DESC

Nous obtenons les livres de K.Dick classés du plus récent au plus ancien.

À faire vous-même 13

Que se passe-t-il quand la clause ORDER BY porte sur un attribut de type TEXT ?


Vous pouvez constater qu’une requête du type :

SELECT auteur
FROM LIVRES

affiche plusieurs fois certains auteurs (les auteurs qui ont écrit plusieurs livres présents dans la base de données)

Il est possible d’éviter les doublons grâce à la clause DISTINCT

À faire vous-même 14

Saisissez et testez la requête SQL suivante :

SELECT DISTINCT auteur
FROM LIVRES

Nous avons vu précédemment qu’une base de données peut contenir plusieurs relations (plusieurs tables).

À faire vous-même 15

Créez une nouvelle base de données que vous nommerez par exemple db_livres_auteurs.db


À faire vous-même 16

Créez une table AUTEURS(id INT, nom TEXT, prenom TEXT, ann_naissance INT, langue_ecriture TEXT) à l’aide d’une requête SQL.

À faire vous-même 17

Créez une table LIVRES(id INT, titre TEXT, id_auteur INT, ann_publi INT, note INT) à l’aide d’une requête SQL.

À faire vous-même 18

Ajoutez des données à la table AUTEURS à l’aide de la requête SQL suivante :

INSERT INTO AUTEURS
(id,nom,prenom,ann_naissance,langue_ecriture)
VALUES
(1,'Orwell','George',1903,'anglais'),
(2,'Herbert','Frank',1920,'anglais'),
(3,'Asimov','Isaac',1920,'anglais'),
(4,'Huxley','Aldous',1894,'anglais'),
(5,'Bradbury','Ray',1920,'anglais'),
(6,'K.Dick','Philip',1928,'anglais'),
(7,'Barjavel','René',1911,'français'),
(8,'Boulle','Pierre',1912,'français'),
(9,'Van Vogt','Alfred Elton',1912,'anglais'),
(10,'Verne','Jules',1828,'français');

À faire vous-même 19

Ajoutez des données à la table LIVRES à l’aide de la requête SQL suivante :

INSERT INTO LIVRES
(id,titre,id_auteur,ann_publi,note)
VALUES
(1,'1984',1,1949,10),
(2,'Dune',2,1965,8),
(3,'Fondation',3,1951,9),
(4,'Le meilleur des mondes',4,1931,7),
(5,'Fahrenheit 451',5,1953,7),
(6,'Ubik',6,1969,9),
(7,'Chroniques martiennes',5,1950,8),
(8,'La nuit des temps',7,1968,7),
(9,'Blade Runner',6,1968,8),
(10,'Les Robots',3,1950,9),
(11,'La Planète des singes',8,1963,8),
(12,'Ravage',7,1943,8),
(13,'Le Maître du Haut Château',6,1962,8),
(14,'Le monde des Ā',9,1945,7),
(15,'La Fin de l’éternité',3,1955,8),
(16,'De la Terre à la Lune',10,1865,10);

Nous avons 2 tables, grâce aux jointures nous allons pouvoir associer ces 2 tables dans une même requête.

En général, les jointures consistent à associer des lignes de 2 tables. Elles permettent d’établir un lien entre 2 tables. Qui dit lien entre 2 tables dit souvent clef étrangère et clef primaire.

Dans notre exemple l’attribut « id_auteur » de la tables LIVRES est bien une clé étrangère puisque cet attribut correspond à l’attribut « id » de la table « AUTEURS« .

À noter qu’il est possible de préciser au moment de la création d’une table qu’un attribut jouera le rôle de clé étrangère. Dans notre exemple, à la place d’écrire :

CREATE TABLE LIVRES
(id INT, titre TEXT, id_auteur INT, ann_publi INT, note INT, PRIMARY KEY (id));

on pourra écrire :

CREATE TABLE LIVRES
(id INT, titre TEXT, id_auteur INT, ann_publi INT, note INT, PRIMARY KEY (id), FOREIGN KEY (id_auteur) REFERENCES AUTEURS(id));

grâce à cette précision, sqlite sera capable de détecter les anomalies au niveau de clé étrangère : essayez par exemple d’ajouter un livre à la table LIVRES avec l’attribut « id_auteur » égal à 11 !

Passons maintenant aux jointures :

À faire vous-même 20

Saisissez et testez la requête SQL suivante :

SELECT *
FROM LIVRES
INNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id

Le « FROM LIVRES INNER JOIN AUTEURS » permet de créer une jointure entre les tables LIVRES et AUTEURS (« rassembler » les tables LIVRES et AUTEURS en une seule grande table). Le « ON LIVRES.id_auteur = AUTEURS.id » signifie qu’une ligne quelconque A de la table LIVRES devra être fusionnée avec la ligne B de la table AUTEURS à condition que l’attribut id de la ligne A soit égal à l’attribut id_auteur de la ligne B.

Par exemple, la ligne 1 (id=1) de la table LIVRES (que l’on nommera dans la suite ligne A) sera fusionnée avec la ligne 1 (id=1) de la table AUTEURS (que l’on nommera dans la suite B) car l’attribut id_auteur de la ligne A est égal à 1 et l’attribut id de la ligne B est aussi égal à 1.

Autre exemple, la ligne 1 (id=1) de la table LIVRES (que l’on nommera dans la suite ligne A) ne sera pas fusionnée avec la ligne 2 (id=2) de la table AUTEURS (que l’on nommera dans la suite B’) car l’attribut id_auteur de la ligne A est égal à 1 alors que l’attribut id de la ligne B’ est égal à 2.

Cette notion de jointure n’est pas évidente, prenez votre temps pour bien réfléchir et surtout n’hésitez pas à poser des questions.

À faire vous-même 21

Saisissez et testez la requête SQL suivante :

SELECT *
FROM AUTEURS
INNER JOIN LIVRES ON LIVRES.id_auteur = AUTEURS.id

Comme vous pouvez le constater, le résultat est différent, cette fois-ci ce sont les lignes de la table LIVRES qui viennent se greffer sur la table AUTEURS.


Dans le cas d’une jointure, il est tout à fait possible de sélectionner certains attributs et pas d’autres :

À faire vous-même 22

Saisissez et testez la requête SQL suivante :

SELECT nom, prenom, titre
FROM AUTEURS
INNER JOIN LIVRES ON LIVRES.id_auteur = AUTEURS.id

À faire vous-même 23

Saisissez et testez la requête SQL suivante :

SELECT titre,nom, prenom
FROM LIVRES
INNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id

Si un même nom d’attribut est présent dans les 2 tables (par exemple ici l’attribut id), il est nécessaire d’ajouter le nom de la table devant afin de pouvoir les distinguer (AUTEURS.id et LIVRES.id)

À faire vous-même 24

Saisissez et testez la requête SQL suivante :

SELECT titre,AUTEURS.id,nom, prenom
FROM LIVRES
INNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id

Il est possible d’utiliser la clause WHERE dans le cas d’une jointure :

À faire vous-même 25

Saisissez et testez la requête SQL suivante :

SELECT titre,nom, prenom
FROM LIVRES
INNER JOIN AUTEURS ON LIVRES.id_auteur = AUTEURS.id
WHERE ann_publi>1950

Enfin, pour terminer avec les jointures, vous devez savoir que nous avons abordé la jointure la plus simple (INNER JOIN). Il existe des jointures plus complexes (CROSS JOIN, LEFT JOIN, RIGHT JOIN), ces autres jointures ne seront pas abordées ici.

Nous en avons terminé avec les requêtes d’interrogation, intéressons-nous maintenant aux requêtes de mise à jour (INSERT, UPDATE, DELETE).

Nous allons repartir avec une base de données qui contient une seule table :

À faire vous-même 26

Créez une nouvelle base de données que vous nommerez par exemple db_livres2.db


À faire vous-même 27

Créez une table LIVRES à l’aide de la requête SQL suivante :

CREATE TABLE LIVRES
(id INT, titre TEXT, auteur TEXT, ann_publi INT, note INT, PRIMARY KEY (id));

À faire vous-même 28

Ajoutez des données à la table LIVRES à l’aide de la requête SQL suivante :

INSERT INTO LIVRES
(id,titre,auteur,ann_publi,note)
VALUES
(1,'1984','Orwell',1949,10),
(2,'Dune','Herbert',1965,8),
(3,'Fondation','Asimov',1951,9),
(4,'Le meilleur des mondes','Huxley',1931,7),
(5,'Fahrenheit 451','Bradbury',1953,7),
(6,'Ubik','K.Dick',1969,9),
(7,'Chroniques martiennes','Bradbury',1950,8),
(8,'La nuit des temps','Barjavel',1968,7),
(9,'Blade Runner','K.Dick',1968,8),
(10,'Les Robots','Asimov',1950,9),
(11,'La Planète des singes','Boulle',1963,8),
(12,'Ravage','Barjavel',1943,8),
(13,'Le Maître du Haut Château','K.Dick',1962,8),
(14,'Le monde des Ā','Van Vogt',1945,7),
(15,'La Fin de l’éternité','Asimov',1955,8),
(16,'De la Terre à la Lune','Verne',1865,10);

Nous avons déjà eu l’occasion de voir la requête permettant d’ajouter une entrée (utilisation d’INSERT)

À faire vous-même 29

Que va faire cette requête ? Vérifiez votre réponse en l’exécutant et en faisant une requête « SELECT * FROM LIVRES« .

INSERT INTO LIVRES
(id,titre,auteur,ann_publi,note)
VALUES
(17,'Hypérion','Simmons',1989,8);

À faire vous-même 30

Écrivez et testez une requête permettant d’ajouter le livre de votre choix à la table LIVRES.


« UPDATE » va permettre de modifier une ou des entrées. Nous utiliserons « WHERE« , comme dans le cas d’un « SELECT« , pour spécifier les entrées à modifier.

Voici un exemple de modification :

À faire vous-même 31

Que va faire cette requête ? Vérifiez votre réponse en l’exécutant et en faisant une requête « SELECT * FROM LIVRES« .

UPDATE LIVRES
SET note=7
WHERE titre = 'Hypérion'

À faire vous-même 32

Écrivez une requête permettant d’attribuer la note de 10 à tous les livres écrits par Asimov publiés après 1950. Testez cette requête.


« DELETE » est utilisée pour effectuer la suppression d’une (ou de plusieurs) entrée(s). Ici aussi c’est le « WHERE » qui permettra de sélectionner les entrées à supprimer.

À faire vous-même 33

Que va faire cette requête ? Vérifiez votre réponse en l’exécutant et en faisant une requête « SELECT * FROM LIVRES« .

DELETE FROM LIVRES
WHERE titre='Hypérion'

À faire vous-même 34

Écrivez une requête permettant de supprimer les livres publiés avant 1945. Testez cette requête.

Révisions de Première (2 séances)

Description

Un administrateur de réseau pédagogique a créé des comptes utilisateurs à partir de données issues des bases du rectorat.

Le format du fichier qu’il a ainsi récupéré est au format csv. Les utilisateurs sont classés par ordre alphabétique.

L’administrateur, par soucis de simplification, souhaite disposer d’un fichier csv par classe, avec les utilisateurs de cette classe par ordre alphabétique.

On vous demande de créer un programme python qui permettra ce traitement. Dans les fichiers de classe, on retrouvera les mêmes champs que dans le fichier original. Chaque fichier créé contiendra les noms des utilisateurs triés par ordre alphabétique.

Exemple à partir du fichier « utilisateurs_simple.csv » :

Le programme devra créer 3 fichiers : « 1RICIMTB.csv » – « 1TMA .csv » – « 1UFA.csv » contenant chacun les utilisateurs de la classe correspondante, classés dans l’ordre alphabétique.

1RICIMTB.csv
1CAPT.csv
1UFA

Fichier de tous les utilisateurs :

Fichier simplifié des utilisateurs (pour mise au point) :

Pour aller plus loin…

Le fichier original est sous la forme suivante (image ci-dessous). Les champs sont différemment organisés et les noms d’utilisateurs ne sont pas classés dans l’ordre alphabétique. Il s’agira donc de les classer par ordre alphabétique dans les fichiers de classe…z

Ressource :

« Utilisation du module csv dans Python » (issu du site https://pythonforge.com/module-csv-lire-ecrire/)