🧰 SQLite#

sqlite logo

Qu’est ce que SQLite ?#

Note

SQLite (prononcĂ© [ɛs.ky.ɛl.ajt]) est une bibliothĂšque Ă©crite en C qui propose un moteur de base de donnĂ©es relationnelle accessible par le langage SQL. SQLite implĂ©mente en grande partie le standard SQL-92 et des propriĂ©tĂ©s ACID.

Contrairement aux serveurs de bases de donnĂ©es traditionnels, comme MySQL ou PostgreSQL, sa particularitĂ© est de ne pas reproduire le schĂ©ma habituel client-serveur mais d’ĂȘtre directement intĂ©grĂ©e aux programmes. L’intĂ©gralitĂ© de la base de donnĂ©es (dĂ©clarations, tables, index et donnĂ©es) est stockĂ©e dans un fichier indĂ©pendant de la plateforme.

La simplicité de ce SGBDR en fait le parfait candidat pour des sites web avec peu de données.

Propriétés ACID#

En informatique, les propriĂ©tĂ©s ACID sont un ensemble de propriĂ©tĂ©s qui garantissent qu’une transaction informatique est exĂ©cutĂ©e de façon fiable.

Dans le domaine des bases de données, une opération sur les données est appelée une transaction ou transaction informatique.

Exemple

Un transfert de fonds d’un compte de banque Ă  un autre, mĂȘme s’il implique plusieurs actions comme le dĂ©bit d’un compte et le crĂ©dit d’un autre, est une seule transaction.

Elles sont au nombre de 4 pour chaque lettre de l’acronyme:

Atomique

la suite d’opĂ©rations est indivisible, en cas d’échec en cours d’une des opĂ©rations, la suite d’opĂ©rations doit ĂȘtre complĂštement annulĂ©e (rollback) quel que soit le nombre d’opĂ©rations dĂ©jĂ  rĂ©ussies.

Cohérente

le contenu de la base de donnĂ©es Ă  la fin de la transaction doit ĂȘtre cohĂ©rent sans pour autant que chaque opĂ©ration durant la transaction donne un contenu cohĂ©rent. Un contenu final incohĂ©rent doit entraĂźner l’échec et l’annulation de toutes opĂ©rations de la transaction.

Isolée

lorsque deux transactions \(A\) et \(B\) sont exĂ©cutĂ©es en mĂȘme temps, les modifications effectuĂ©es par \(A\) ne sont ni visibles par \(B\), ni modifiables par \(B\) tant que la transaction \(A\) n’est pas terminĂ©e et validĂ©e (commit).

Durable

Une fois validĂ©, l’état de la base de donnĂ©es doit ĂȘtre permanent, et aucun incident technique (exemple: crash) ne doit pouvoir engendrer une annulation des opĂ©rations effectuĂ©es durant la transaction.

Historique de SQLite#

Ce moteur est développé depuis 2000 D. Richard Hipp.

La BibliothĂšque ainsi que son code source sont sous la licence du domaine public.

Note

Sa particularitĂ© est de ne pas reproduire le schĂ©ma habituel client-serveur mais d’ĂȘtre directement intĂ©grĂ©e aux programmes.

L’intĂ©gralitĂ© de la base de donnĂ©es (dĂ©clarations, tables, index et donnĂ©es) est stockĂ©e dans un fichier indĂ©pendant de la plateforme.

Il s’agit d’un des moteurs de bases de donnĂ©es les plus utilisĂ©s au monde, celui-ci est notamment utilisĂ© par Firefox, Skype, Google Gears, Android, iOS, des sites web, etc.

Une des raisons de son succĂšs est qu’elle est intĂ©grĂ©e dans les bibliothĂšques standards de nombreux langages comme Python, Ruby, PHP, C#, C++, etc.

De plus son extrĂȘme lĂ©gĂšretĂ© (moins de 600 Kio), la rende populaire sur les systĂšmes embarquĂ©s.

La premiĂšre version de SQLite est publiĂ©e en aoĂ»t 2000, celle-ci utilise gdbm (GNU Database Manager) pour manipuler des arbres. Par la suite SQLite 2.0 supprime la dĂ©pendance Ă  gdbm et ajoute le support des transactions. Enfin SQLite 3.0, produite avec l’aide d’AOL, est publiĂ©e en 2004.

Caractéristiques de SQLite#

Base de données embarquée

La majoritĂ© des SGBD sont construit selon l’architecture Client-Serveur, SQLite s’intĂ©gre directement Ă  l’applicatif.

L’accĂšs Ă  une base de donnĂ©es avec SQLite se fait par l’ouverture du fichier correspondant Ă  celle-ci. Chaque base de donnĂ©es est enregistrĂ©e dans un fichier qui lui est propre, avec ses dĂ©clarations, ses tables et ses index mais aussi ses donnĂ©es.

Indication

Il n’y a pas d’extension propre aux fichiers de base de donnĂ©es de SQLite, il est courant de rencontrer des extensions comme .sqlite ou .db, parfois suivie du numĂ©ro de version de la bibliothĂšque (.sqlite3, .db2, etc.).

Notons qu’il est possible d’utiliser une base de donnĂ©es uniquement sauvegardĂ©e en mĂ©moire vive, sans crĂ©er de fichier de base de donnĂ©es sur le disque, via le nom de fichier spĂ©cial :memory:.

Gestion des droits

Avertissement

Il n’existe aucune gestion des droits d’accĂšs et de modification des donnĂ©es. Cela est dĂ©lĂ©guĂ©e au systĂšme de fichiers du systĂšme d’exploitation.

La gestion des droits avec les instructions GRANT et REVOKE est donc inexistante, bien que ceux-ci fassent partie de la spĂ©cification SQL-9210. Ainsi l’utilisation d’une base SQLite ne nĂ©cessite aucune procĂ©dure d’installation ou de configuration.

Portabilité

Étant entiĂšrement Ă©crite en C-ANSI, la version normalisĂ©e du langage de programmation C, celle-ci est compilable sans modification sur toutes les architectures,

Important

Ainsi les fichiers de base de donnĂ©es SQLite sont entiĂšrement indĂ©pendants du systĂšme d’exploitation et de l’architecture.

Gestion des types de données

Celle-ci se base sur l’utilisation d’un typage dynamique pour le contenu des cellules, contrairement Ă  la quasi-totalitĂ© des SGBD qui utilisent un typage statique.

Lors de la crĂ©ation de la table on ne peut que renseigner un type d’affinitĂ©. La convertion des donnĂ©es vers le type si possible se fait au moment de la saisie des donnĂ©es.

Type de données#

Il existe plusieurs types d’affinitĂ© dans SQLite, dĂ©finissant la façon dont celui-ci va travailler lors de l’entrĂ©e des nouvelles donnĂ©es.

TEXT
NUMERIC
INTEGER
REAL
NONE
TEXT

Permet d’enregistrer la donnĂ©e comme une chaine de caractĂšres, sans limite de taille. Si un nombre est entrĂ© dans une colonne de ce type, il sera automatiquement converti en une chaine de caractĂšres.

NUMERIC

Tente d’enregistrer la donnĂ©e comme un entier ou comme un rĂ©el, si cela s’avĂšre impossible la donnĂ©e sera enregistrĂ©e comme une chaine de caractĂšres.

INTEGER

Enregistre la donnĂ©e comme un entier si celle-ci peut ĂȘtre encodĂ©e sans perte, mais peut utiliser les types REAL ou TEXT si ça ne peut ĂȘtre fait.

REAL

Enregistre la donnĂ©e comme un rĂ©el, mĂȘme s’il s’agit d’un entier. Si la valeur est trop grande la donnĂ©e sera convertie en chaine de caractĂšres.

NONE

La donnée est enregistrée telle quelle sans conversion.

Et les dates ?

Il n’existe pas de type pour reprĂ©senter des dates bien qu’un ensemble de fonctions existe pour manipuler celles-ci. La convention Ă©tant de les stocker sous la forme d’une chaine de caractĂšres ou dans un entier sous la forme d’un timestamp UNIX.

Les contraintes#

La gestion des contraintes est possible et se fait sur une ou plusieurs colonnes.

Exemple de contraintes déclarées sur une colonne#
NULL
NOT NULL
DEFAULT
Exemple de contraintes pouvant ĂȘtre dĂ©clarĂ©s sur une ou plusieurs colonnes:#
PRIMARY KEY
UNIQUE
FOREIGN KEY

Indication

La contrainte UNIQUE crée automatiquement un index sur la ou les colonnes sur lesquelles elle est appliquée.

Contraintes plus complexe#

Les contraintes CHECK nous permettent de définir des vérifications supplémentaires sur les données au-delà de UNIQUE ou de NOT NULL.

Syntaxe sur une colonne#
CREATE TABLE table_name(
   ...,
   column_name data_type CHECK(expression),
   ...
);
Syntaxe au niveau de la table#
CREATE TABLE table_name(
   ...,
   CHECK(expression)
);
Exemple#
CREATE TABLE contacts (
   contact_id INTEGER PRIMARY KEY,
   first_name TEXT    NOT NULL,
   last_name  TEXT    NOT NULL,
   email      TEXT,
   phone      TEXT    NOT NULL CHECK (length(phone) >= 10)
);

CREATE TABLE products (
   product_id   INTEGER         PRIMARY KEY,
   product_name TEXT            NOT NULL,
   list_price   DECIMAL (10, 2) NOT NULL,
   discount     DECIMAL (10, 2) NOT NULL
   DEFAULT 0,
   CHECK (list_price >= discount AND
   discount >= 0 AND
   list_price >= 0)
);

PRIMARY KEY#

Permet la crĂ©ation d’une contrainte UNIQUE sur la ou les colonnes concernĂ©es, il est de plus conseillĂ© de rajouter la contrainte NOT NULL Ă  la dĂ©claration d’une clĂ© primaire.

ROWID#

Chaque ligne d’une table est identifiĂ©e par un entier signĂ© de 64 bits appelĂ© ROWID. Une colonne ayant Ă©tĂ© dĂ©clarĂ© en INTEGER PRIMARY KEY est un alias du ROWID.

Si la table est vide le premier identifiant prendra comme valeur 1 lors de l’insertion de du premier enregistrement. Celui-ci sera incrĂ©menter pour chaque enregistrement jusqu’à la limite d’un entier signĂ© de 64 bits (\(2^{63} - 1\)).

AUTOINCREMENT#

Le mot clĂ© AUTOINCREMENT modifie lĂ©gĂšrement l’algorithme d’attribution de la clĂ© primaire. Une fois la limite d’un entier atteinte il ne sera plus possible d’insĂ©rer un nouvel enregistrement.

Ceci permet de garantir qu’un mĂȘme identifiant ne sera jamais portĂ© par deux enregistrements distincts, mĂȘme s’ils ne coexistent pas Ă  un mĂȘme moment.

FOREIGN KEY#

La version 3 a apportĂ© le support et la gestion des contraintes de clĂ© Ă©trangĂšre depuis la version 3. Toutefois celle-ci est dĂ©sactivĂ© par dĂ©faut. Toute colonne rĂ©fĂ©rencĂ©e par une clĂ© Ă©trangĂšre doit ĂȘtre dĂ©clarĂ©e comme UNIQUE.

Il est possible de l’activer via le pragma suivant:

PRAGMA foreign_keys;

Pragma#

L’instruction PRAGMA est une extension SQL de SQLite et permet de modifier le fonctionnement de la bibliothĂšque SQLite. Nous aurons l’occasion de dĂ©tailler leurs fonctionnement dans la suite de ce document.

Déclencheurs#

SQLite intégre la gestion des déclencheurs:

BEFORE
AFTER
INSTEAD OF

Vue#

Note

Une vue est une synthĂšse d’une requĂȘte d’interrogation de la base. Il s’agit d’une sorte de table virtuelle, dĂ©finie par une requĂȘte.

Et évideement, SQLite intégre le support des vues.

Transaction#

Toutes les instructions hormis le SELECT implique la crĂ©ation d’une transaction lors du requĂȘtage sur la base. Les instructions sont ainsi toutes atomiques.

Comment utiliser SQLite ?#

SQLite embarque une interface en ligne de commande (CLI) simple et pratique pour crĂ©er et requĂȘter sur une base de donnĂ©es SQLite. Son utilisation se fait simplement par la commande sqlite3

Note

Une interface en ligne de commande (en anglais command line interface, couramment abrĂ©gĂ© CLI) est une interface homme-machine dans laquelle la communication entre l’utilisateur et l’ordinateur s’effectue en mode texte au sein d’un terminal (console).

$ sqlite3 -version
3.26.0 2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238alt1
Quelques commandes utiles#
.exit       --Permet de quitter la commande CLI
.table      --Liste l'ensemble des tables de la base
.dbinfo     --Information sur la base
.dump       --Obtenir un dump sql de la base
.schema     --Obtenir le code de création de la base
.headers (on, off) --Affichage ou non des entĂȘtes
.mode (list, column, csv, ..) --Affichage en liste, etc.
.version    --Information de version
.import     --Import de données dans la base

Pour se connecter Ă  une base de donnĂ©es SQLite, il suffit d’indiquer le nom du fichier de base de donnĂ©es en argument de la commande sqlite3

$ sqlite3 boardgames.sqlite3

Attention

Si le fichier existe alors la commande ouvre la base de données sinon celle-ci est créée avant ouverture.

Exemple d’utilisation#
$ sqlite3 boardgames.sqlite3
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.

sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
COMMIT;

sqlite> .version
SQLite 3.26.0 2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238alt1
zlib version 1.2.11
gcc-8.3.1 20190223 (Red Hat 8.3.1-2)

sqlite> .exit

$

Indication

Voici quelques astuces utiles avec la commande sqlite3 Ă  faire aprĂšs chaque lancement de la commande:

$ sqlite3 boardgames.sqlite3
sqlite> .headers on -- Display column name
sqlite> .mode columns -- Change display mode, try it
sqlite> .tables -- Show all db tables
sqlite> PRAGMA table_info(nom_table); -- Show structure of nom_table

SQLiteBrowser#

Astuce

Nous pouvons utiliser un utilitaire, SQLiteBrowser , en mode GUI pour crĂ©er une base de donnĂ©es de type SQLite. Il s’agit d’un logiciel permettant de crĂ©er et de manipuler trĂšs simplement des BDD SQLite.

Lancer DB Browser for SQLite puis cliquer sur New Database, sauvegarder la dans le dossier data de votre site web sous le nom data.sqlite.

Lors de la crĂ©ation de votre BDD, vous ĂȘtes invitĂ© Ă  crĂ©er une premiĂšre table qui pourrait ressembler Ă  ceci:

capture d'écran de sqlitebrowser

Enfin ajouter quelques enregistrements dans cette table. Avant de quitter le logiciel n’oubliez pas de sauvegarder votre base via Write Changes.

Un peu de pratique avec quelques exemples#

🛬 AĂ©roports#

Note

Un aĂ©roport est l’ensemble des bĂątiments et des installations qui servent au traitement des passagers ou du fret aĂ©rien situĂ©s sur un aĂ©rodrome. Le bĂątiment principal est, gĂ©nĂ©ralement, l’aĂ©rogare par oĂč transitent les passagers (ou le fret) entre les moyens de transport au sol et les avions.

image du concorde et d'une ds

Nous allons au cours de cet exercice utiliser une base de donnĂ©es d’aĂ©roport autour du monde. Cette base de donnĂ©e a Ă©tĂ© compilĂ© Ă  partir de plusieurs sources du domaine public dont un listing se trouve sur le site http://ourairports.com/data/ <http://ourairports.com/data/>.

La base de donnée « airport »#

Ci-dessous le schéma UML de la base de données airport

https://www.plantuml.com/plantuml/svg/VP9DQWCn38NtSmgTe8j2Drcbcz9Lhr1KM_68QAH1rWH2oDshb49_c8bNDj-ptvDasFT0ZsMIOO1UK0WU7vvoUsITqN623op7vhPeBIRc48xQ4v76Rrcb0ouIBwRnXXF1QruRGEWG40RERGoex5I2JOSqAuAzmpFxR1uTBWFSrkN09FKAN7V06jJ8_uCqta4FPsr_KPndMYUQYTO92Ptm5cd3hcGzh9kMtEszP6_2pzi2f_PbiCQdHRdmZCAnyKARUrhKZVoCWNUmM8xq3YzcNbangFy8hZcTCViC4yLejN-V2diHIhOdhVbXFW4=

Diagramme UML de la base de données airport#

Point culture

Un code d’aĂ©roport peut faire rĂ©fĂ©rence au code IATA, un code Ă  trois lettres utilisĂ© dans les systĂšmes de rĂ©servation de billets et de traitement des bagages. Ou au code OACI, qui est un code Ă  quatre lettres utilisĂ© par les systĂšmes ATC et les aĂ©roports n’ayant pas de code IATA.

Base de données des aéroport en Gréce#

Colosse de rhodes

Attention

La base de données comptant plus de 57 000 aéroports, nous utiliserons dans un premier temps une partie de cette base de données ne contenant que les aéroport de Gréce.

Quelques rappels sur les commandes SQLite

Ouvrir une connexion sur une base de données SQLite#
$ sqlite3 airport_greece.sqlite3
Afficher les colonnes lors du retour des requĂȘtes#
sqlite> .headers on
Changer le mode d’affichage du retour des requĂȘtes#
sqlite> .mode columns
Afficher la liste des tables#
sqlite> .tables
Afficher la structure d’une table#
sqlite> PRAGMA table_info(nom_table);

Exercice sur les aéroports de Gréce#

Avant de vous lancer dans cet exercice pensez à télécharger la base de données des aéroports de Gréce en cliquant ici.

Important

Pour chaque question pensez Ă  Ă©crire la version de la requĂȘte en algĂšbre relationnel puis en SQL que vous sauvegarderez dans un fichier avec le rĂ©sultat de chaque appel.

À faire

  1. Lister les noms des aéroports,

  2. Lister les régions,

  3. Lister les municipalités,

  4. Lister les diffĂ©rents types d’aĂ©roports,

  5. Lister les aéroports avec leurs noms, régions et types,

  6. Lister les rĂ©gions oĂč se trouvent un hĂ©liport,

  7. Lister les noms, rĂ©gions et municipalitĂ©s des aĂ©roports Ă  plus de 1000m d’altitude,

  8. Lister les noms, rĂ©gions et municipalitĂ©s des aĂ©roports entre 1000m et 1600m d’altitude,

  9. Lister les aéroports (nom, code iata et code local) qui posséde un code iata,

  10. Lister les aéroports dont le code de région est GR-U-A,

  11. Lister les aéroports dont le code de région est GR-U-A avec une altitude supérieur à 1,

  12. Lister les aéroports dont le nom commence par la lettre « M »,

  13. Lister les aĂ©roports dont l’identification commence par « GR »,

  14. Lister les aĂ©roports dont l’identification commence par « LG »,

  15. Lister les aéroports qui sont fermées,

  16. Lister les aĂ©roports d’AthĂ©nes,

  17. Lister les aéroports dont la ville commence par la lettre A.

🃏 Keyforge#

Logo de keyforge

Note

KeyForge est un JCE à Deck unique créé par Richard Garfield (le papa de Magic!) et publié par Fantasy Flight Games.

Dans ce jeu, les joueurs jouent le rĂŽle d’Archontes dans le monde du Creuset. Le premier joueur Ă  collecter suffisamment dâ€œÂ«Â Ă†mber » pour forger trois clĂ©s est dĂ©clarĂ© vainqueur.

Le jeu dans sa version de lancement comporte 371 cartes différentes.

https://www.plantuml.com/plantuml/svg/fL9DQm913BtdLuGz2Ywrq8ideL0yzTHxoSvar-1yI2QB5V6_TzNMrh9UR6xpNl9U7fD5CLBhOm0eZWBZO_q4PIrfGqeH6tBhJdEVlCiXAvfIAWF5oNvrUMwf3_QIaxrIP5mEKn2uDRICAjtAq8koCya9A8IyVO_o8Qa301Ue57mczRW776hV2WT_GF5pb6JSiLxXQN2OOp4zpbyHVHp5bLHiDqeHnuPrt6UJjxSeqfXlKOq4CU5oyJjyPtpRRVYUZ3y2IcB_KbZcljox0vp-g9fLE9rYDQdEOd_GsO0VStx13tKzkVIVrWTOYMUCRAlio_dXH5rWM73omo5-0W==

Diagramme UML de la base de données keyforge#

Important

Pour chaque question pensez Ă  Ă©crire la version de la requĂȘte en algĂšbre relationnelle puis en SQL que vous sauvegarderez dans un fichier avec le rĂ©sultat de chaque appel.

Avant de vous lancer dans cet exercice pensez à télécharger la base de données Keyforge en cliquant ici.

À faire

  1. Lister les noms des différentes familles,

  2. Lister les différents types de cartes,

  3. Lister les différents types de traits,

  4. Lister les cartes dont le nom commmence par la lettre A,

  5. Lister les cartes dont le nom se termine par ain,

  6. Lister les cartes dont la puissance est supérieur à 5,

  7. Lister les cartes dont l’armure est supĂ©rieur Ă  3,

  8. Lister les 10 premiĂšres cartes de la base en suffixant chaque nom de colonne par _card,

  9. Lister les cartes dont l’identifiant est Ă©gal Ă  36, 80, 137, 195, 249, 298 ou 347,

  10. Lister le nom, nom de la maison et nom du type de la carte numĂ©ro 36 en effectuant une jointure entre les tables cards, types et houses; et en suffixant chaque champ par le nom de la table d’origine,

  11. Lister le nom, nom de la maison et nom du type des cartes numĂ©ro 36, 80, 137, 195, 249, 298 et 347 en effectuant une jointure entre les tables cards, types et houses; et en suffixant chaque champ par le nom de la table d’origine,

  12. Lister les cartes de la famille dis dont l’armure est supĂ©rieur Ă  0 et la puissance Ă  7,

  13. Lister les 10 premiÚres cartes « créatures » de la base de données,

  14. Lister les 10 premiÚres cartes « créatures » de la maison Mars,

  15. Lister les artefacts de la famille Logos,

  16. Lister les actions de la famille Dis,

  17. Lister les 10 premiÚres cartes « créatures » dont la puissance est supérieur à 7.

🃏 Keyforge Le Retour#

Important

Pour chaque question pensez Ă  Ă©crire la version de la requĂȘte en algĂšbre relationnelle puis en SQL que vous sauvegarderez dans un fichier avec le rĂ©sultat de chaque appel.

Avant de vous lancer dans cet exercice pensez à télécharger la base de données Keyforge en cliquant ici.

À faire

  1. Combien y’a t’il de familles diffĂ©rentes,

  2. Combien y’a t’il de types de cartes diffĂ©rentes,

  3. Combien y’a t’il de cartes,

  4. Combien y’a t’il de cartes qui commence par la lettre A,

  5. Quelle est la carte avec la puissance la plus élevée dans la famille brobnar,

  6. Quelle est la moyenne de puissance des cartes « créatures » de la famille mars,

  7. Quelle est la carte avec le moins de puissance dans la famille brobnar,

  8. Combien de cartes y a t’il par maison,

  9. Combien de cartes Artefact y’a t’il par maison,

  10. Combien de cartes CrĂ©atures y’a t’il par maison,

  11. Combien de cartes Action y’a t’il par maison,

  12. Quelle est la somme des puissances de la famille mars,

  13. Quelle est la somme des puissances de la famille brobnar,

  14. Combien de cartes font gagner une Æmber,

  15. Combien de cartes font gagner deux Æmber,

  16. Combien de cartes font gagner une ou deux Æmber,

  17. Combien de cartes font gagner une ou deux Æmber par maison,

  18. Combien de cartes possédent une armure,

  19. Combien de cartes possédent une armure par famille,

  20. Combien de cartes par niveau de rareté.

🩕 InGen#

Logo de Ingen

Note

La société InGen; spécialisée dans la création de créatures préhistoriques génétiquement modifiées; souhaite créer une base de données pour son SI.

La majeure partie de son activité consiste à faire naßtre des dinosaures et à les présenter au sein de Jurassic Park. Les dinosaures sont définis par un nom, une date de naissance et une espÚce. Une espÚce est définie par un nom.

https://www.plantuml.com/plantuml/svg/fP2nJWD134HxVuMr9LAGGAAvAWL2qAJX0v2pwxkpikUDR5-1elmxYu3eUag_iMT6tdkGnRfKy4oLyV7-2VmaUYQZ1O-KJvErLKjkjHc6aNgNM6EpLNYajSPBqpZGmlZQhw3o61WDJQOvi8Xn3caA0BcIEpwBDgVLy0A8U1c5QxcYb055WoUsBTPkEw27YKvRVXIBkT3dW8M2uVfd_dxcBFmlws_-iJ1fvpUz1y2jUBfBkDjXUaY_UGCcV7Ea131BOLmuvbRyPyXYkJB0dhNqTty1

Diagramme UML de la base de donnĂ©es d’InGen#

  • Quelle est la commande permettant de lancer l’utilitaire CLI de sqlite ?

  • CrĂ©er la la base de donnĂ©es d’InGen sous le nom ingen.sqlite3.

  • Dans un fichier sql (schema.sql par exemple), Ă©crivez la requĂȘte de crĂ©ation de la table species.

  • ÉxĂ©cutez le fichier via le pragma read

sqlite> .read schema.sql

Attention

Pensez à activer le support des clé étrangéres via la PRAGMA foreign keys

VĂ©rification de l’activation des clĂ© Ă©trangĂ©res (ce n’est pas le cas)#
sqlite> PRAGMA foreign_keys;
foreign_keys
------------
0
Activation et vĂ©rification de l’activation des clĂ© Ă©trangĂ©res#
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
foreign_keys
------------
1

Danger

Le support des clĂ© Ă©trangĂ©res doit ĂȘtre rĂ©activĂ© Ă  chaque connexion, pensez pour cela Ă  indiquer PRAGMA foreign_keys = ON; en haut de tout vos fichiers .sql.

Ajoutez maintenant la création de la table dinosaurs dans votre fichier et éxécutez le.

Vérifiez que les tables ont bien étés créées.

sqlite> .tables

Ajoutez une colonne location de type TEXT Ă  la table dinosaurs.

Insérez les données suivante dans la table species

name         name_meaning
-----------  -----------------
Triceratops  Three-horned face
Stegosaurus  Roofed lizard
Tyrannosaur  Tyrant Lizard Kin
Diplodocus   Double beat

Mettez Ă  jour l’espĂšce diplodocus avec comme signification de nom « Double beam » au lieu de double beat.

Insérez les données suivante dans la table dinosaurs

name        birthday    specie_id
----------  ----------  ----------
Marie       1991/12/15  1
Louis       1993/05/05  2
Freddy      1994/04/03  3
Nessie      1991/11/20  4

Important

Pour chaque question pensez Ă  Ă©crire la version de la requĂȘte en algĂšbre relationnel puis en SQL que vous sauvegarderez dans un fichier avec le rĂ©sultat de chaque appel.

À faire

  • Lister les noms des dinosaures,

  • Lister les noms d’espĂšce et leur signification,

  • Lister les diffĂ©rents dinosaures avec leurs espĂšce.

🍿 Silence, Moteur, Action !#

Spirou Camera

Note

Cet exercice basĂ© sur un extrait d’un dataset de films a pour but de rĂ©capituler l’ensemble des notions vus jusqu’à aujourd’hui ensemble. A savoir crĂ©ation d’une base de donnĂ©e, insertion de donnĂ©es et requĂȘtage.

La base de donnĂ©es est orientĂ©e autour d’une table Movie qui contient l’ensemble des informations d’un film. À savoir son titre, sa catĂ©gorie, sa durĂ©e, son annĂ©e de sortie, s’il a Ă©tĂ© rĂ©compensĂ©, sa popularitĂ© mais aussi son directeur, son acteur et actrice principaux.

La table Category contient le nom de la catégorie et la table Person, qui servira aussi bien pour les acteurs/actrices que pour les directeurs contient le nom et le prénom de la personne.

Bien évidemment chaque table posséde un champ id.

https://www.plantuml.com/plantuml/svg/dPB1IWD138RlynHXZqe51IzxAYYY1yLNI6Uokw6pav9abQNqtTrsKInMKM_3V7_-FoHPcgFwqETW4JF1rSLri3MN3IhsiCAuRbM6ag9aKN35OXEYufzKYHeSijz9yIVi2Uwdgf2fSN01vRPpIAmKdQM44696CxX1frPqX6q0W7FODamvxO1J3LmcHdeCocHTWxboQSFktUQPrAJyp-I8DApcfpCUvONfrn7Edh_9o5HQxmvrns0ar1FV6zaC6PLzF07n5JLP3IkHJ5ZsxOQvq-giWiK2gilgOyerLF1W84trLJEFSA-uFMo94gp67tMJatS4FN81Z2xw5xMIMHL2nuaWiiPCyxidxoHP24igQJh8Dm==

Diagramme UML de la base de données de films#

  1. En vous aidant des informations ci-dessus créer le schéma de base de données via DB Browser for SQLite (penser au clé étrangére).

  2. InsĂ©rer les donnĂ©es dans les tables Category, Person et Movie grĂące Ă  trois requĂȘtes d’insertion et en vous servant du fichier de donnĂ©es disponible ici.

À faire

  1. Lister les nom et idenfitiant de chaque catégorie.

  2. Combien de catégorie comporte la base, faites apparaßtre le résultat sous le nom total_category.

  3. Lister les nom, prénom et identifiant des personnes dont le nom commence par S.

  4. Lister les nom, prénom et identifiant des personnes dont le nom finit par ing.

  5. Combien de personnes y’a t’il dans la base (total_person).

  6. Quel est l’identifiant de Steven Spielberg.

  7. Lister les films (titre, année de sortie, durée, identifiant) dont le titre contient star et en les ordonnant par année de sortie.

  8. Combien de film y’a t’il dans la base (total_movie).

  9. Quelle est l’annĂ©e de sortie des aventuries de l’arche perdue (Raiders of the Lost Ark).

  10. Lister l’ensemble des films (titre, nom de la catĂ©gorie, durĂ©e, popularitĂ© et rĂ©compense) rĂ©alisĂ© par Steven Spielberg (attention il s’agit de faire une jointure entre les tables person et movie et non d’utiliser directement l’identifiant).

  11. Lister les films; titre, annĂ©e de sortie, durĂ©e, identifiant, nom de la catĂ©gorie, nom et prĂ©nom du rĂ©alisteur (director_name, director_firstname), nom et prĂ©nom de l’acteur et de l’actrice principaux (main_actor_name, main_actor_firstname, main_actress_name, main_actress_firstname); dont le titre contient star et en les ordonnant par annĂ©e de sortie.

  12. Quelle est la durée moyenne des films (avg_length).

  13. Quelle est la durée moyenne des films réalisé par Steven Spielberg (avg_length, director_name, director_firstname).

  14. Combien de film George Lucas a-t-il réalisé.

  15. Quelle est la durée moyenne des films par catégorie (avg_length, category).

  16. Combien de films ont reçu une récompense (total_rewarded).

  17. Combien de films ont reçu une récompense par catégorie (total_rewarded, category).

  18. Lister le nombre de films réalisé par directeur (total, director_name, director_firstname) dont le total est supérieur à 10 et ordonné décroissant par total.

  19. Combien de films ont une popularité supérieur à 60 (total).

  20. Combien de films ont été réalisé par leurs acteur principal (total).

Les vues en SQL#

Indication

C’est un ensemble des rĂ©sultats d’une requĂȘte stockĂ©e dans une entitĂ©. Elle offre la possibilitĂ© d’accĂ©der aux donnĂ©es des tables sous-jacentes via la vue. Les tables auxquelles fait rĂ©fĂ©rence la requĂȘte dans la dĂ©finition de la vue s’appellent des tables de base.

Une vue est utile dans certains cas :

  • Fournir une couche d’abstraction sur les tables. Ajout et suppression de colonnes dans la vue sans toucher au schĂ©ma des tables sous-jacentes.

  • Encapsulation des requĂȘtes complexes afin de simplifier l’accĂšs aux donnĂ©es.

Attention

Les vues sont en lecture seule. Cela signifie que vous ne pouvez pas utiliser les instructions INSERT, DELETE et UPDATE pour mettre à jour les données des tables de base via la vue.

Syntaxe de base:#
CREATE VIEW IF NOT EXISTS view_name
AS
select-statement;
CREATE VIEW v_boardgames
AS
SELECT id, boardgame.name, category.name AS category,
FROM boardgame, category
WHERE boardgame.category_id = category.id;
Suppression d’une vue#
DROP VIEW IF EXISTS view_name;

À faire

Créez une vue v_dinosaurs qui correspond au schéma UML ci-dessous:

https://www.plantuml.com/plantuml/svg/RP2nQWD134HxVOM-84KWpLKkWacLCgsHLxexuLsjaNI1OFplMMC8LwJKlD4Cp26IFBTM0Q9G5NnzUOEug5t9gU6PocNnlXcNNhjZEbaC99Ox5yjCMyrZj_oa9lWnlg3Ad9WTNPSraTMbf7O3W58f0h_UrNhGvdW3HBpDAfNlg3oXMieYlfTjv4uOwMhBNZ-hvyhqCo5JofvyYyVect2kdN9FuYf5_qrxajEZxDI4RE0_snrMPS4ckNQEvr7KInM0WnYF3Ny1

Diagramme UML de la base de données de dinosaurs#