diff --git a/README.md b/README.md index 7ccd307a2e341affaafe5766342f2a1d020bf50a..4188d1d9b78da0f7dc5acecbfc7da95a694bf8b0 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,8 @@ res = [ s.lastname for s in students if s.age >= 18 ] ### Semaine 6 - 29 mars et 1 avril :hatching_chick: -- programme planifié - - [alg] chapitre 1 +- [alg] chapitre 1 +- [alg] exercices 1.2, 1.3, 1.4 et 1.5 (version 1) (**à terminer pour la prochaine fois**) ### Semaine 7 diff --git a/sqlite/QUICK-REF-SQLITE.md b/sqlite/QUICK-REF-SQLITE.md new file mode 100644 index 0000000000000000000000000000000000000000..c48f3ccbb57577e2e7f7f73403313add0d4b1385 --- /dev/null +++ b/sqlite/QUICK-REF-SQLITE.md @@ -0,0 +1,190 @@ +# SQLITE 3.38 + +## Prérequis + +- Dernière version sqlite 3.38 + +## Resources + +- https://www.sqlite.org/ +- https://www.sqlitetutorial.net +- https://www.tutorialspoint.com/sqlite + + +## Démarrer sqlite + +```bash +~$ sqlite3 +SQLite version 3.38.2 2022-03-26 13:51:10 +Enter ".help" for usage hints. +Connected to a transient in-memory database. +Use ".open FILENAME" to reopen on a persistent database. +sqlite> +``` + +puis, configurer **à chaque fois** les instructions suivantes pour avoir des contraintes strictes et pour forcer l'emploi des clés étrangères + +```bash +sqlite> PRAGMA foreign_keys = ON; +sqlite> PRAGMA strict = ON; +sqlite> .mode column +sqlite> .headers on +``` + +enfin, pour un peu de cosmétique afin de mieux lire le résultat des requêtes + +```bash +sqlite> .mode column +sqlite> .headers on +``` + +### Ouvrir ou créer une base de données + +```bash +sqlite> .open test.db +``` + +### Exécuter un script sql + +```bash +sqlite> .read monscript.sql +``` + +### Autres commandes + +```bash +sqlite> .tables # liste les tables +sqlite> .fullschema # liste les schémas détaillés des tables +sqlite> .schema Conference # liste le schéma d'une table spécifique +sqlite> ATTACH conf.db as conference # Utiliser une base de données +sqlite> DETACH conference # Fermer une base de données +``` + + +# Création d'une base de données + +## Création d'un table + +```sql +CREATE TABLE Test ( + i INTEGER NOT NULL PRIMARY KEY, + t TEXT NOT NULL, + r REAL +) +``` + +## Création d'un table avec contraintes + +```sql +CREATE TABLE Test ( + i INTEGER NOT NULL PRIMARY KEY, + j INTEGER NOT NULL, + k INTEGER NOT NULL, + CHECK (j > 0 && j < 100), + UNIQUE (j,k), + FOREIGN KEY (k) REFERENCES Table(k) +); +``` + +## Suppression d'une table avec ses enregistrements + +```sql +DROP TABLE Test; +``` + +## Trigger + +- https://www.sqlite.org/lang_createtrigger.html +- https://www.sqlitetutorial.net/sqlite-trigger/ + +### Syntaxe générale + +```sql +CREATE TRIGGER [IF NOT EXISTS] trigger_name + [BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE] + ON table_name + [WHEN condition] +BEGIN + statements; +END; +``` + +Suppression + +```sql +DROP TRIGGER trigger_name; +``` + +### Exemple 1 + +L'insertion est possible si la valeur de l'attribut `j` du nouvel enregistrement n'existe pas dans la table `Table`. + +```sql +CREATE TRIGGER trigger_name BEFORE INSERT ON Test +BEGIN +SELECT + CASE WHEN NEW.j IN (SELECT j FROM Table) THEN RAISE(ABORT, 'valid') + END; +END; +``` + +`RAISE` est une fonction. + +ce trigger réalise exactement la même chose + +```sql +CREATE TRIGGER trigger_name BEFORE INSERT ON Test WHEN NEW.i == 10 +BEGIN +SELECT + Raise(ABORT, 'valid'); +END; +``` + +### Exemple 2 + +CREATE TRIGGER trigger_name BEFORE UPDATE ON Test +BEGIN + INSERT INTO Log VALUES (NEW.i, OLD.i); +END; + + +# View + +Une vue est un moyen d'enregistrer une requête dans une base de données. Elle peut être ensuite accessible aux utilisatateurs de la base. + +Elle permette de cacher la complexité d'une requête ou de réduire la visibilité de certains champs. + + +## Syntaxe + +Crétation + +```sql +CREATE [TEMP] VIEW [IF NOT EXISTS] view_name[(column-name-list)] +AS +select-statement; +``` + +Suppression + +```sql +DROP VIEW view_name; +``` + +## Exemple + +```sql +CREATE VIEW IF NOT EXISTS conf_price +AS SELECT id_conference, price FROM Conference; +... +SELECT * FROM conf_price; +``` + +ou + +```sql +CREATE VIEW IF NOT EXISTS conf_price(id, price, topic) +AS SELECT id_conference, price, title FROM Conference; +... +SELECT id, topic FROM conf_price; +``` diff --git a/sqlite/chinook/chinook.db b/sqlite/chinook/chinook.db new file mode 100644 index 0000000000000000000000000000000000000000..38a98b391b7a6e8e740cae9681b5f0b295848fcc Binary files /dev/null and b/sqlite/chinook/chinook.db differ diff --git a/sqlite/chinook/run.sql b/sqlite/chinook/run.sql new file mode 100644 index 0000000000000000000000000000000000000000..014bfc12dfc2478d48b0eab49fa8d5aefb14065c --- /dev/null +++ b/sqlite/chinook/run.sql @@ -0,0 +1,6 @@ +PRAGMA foreign_keys = ON; +PRAGMA strict = ON; +.mode column +.headers on +.open chinook.db + diff --git a/sqlite/conf/README.md b/sqlite/conf/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f23776944fabb911a58e00d61b5debcc90fc70d9 --- /dev/null +++ b/sqlite/conf/README.md @@ -0,0 +1,12 @@ + + + +creer la bd ou ouvre la bd +PRAGMA foreign_keys = ON; +.open conf.db + +peuple en lisant le script +.read conf.sqlite.sql + +.schema albums +.fullschema diff --git a/sqlite/conf/conf.db b/sqlite/conf/conf.db new file mode 100644 index 0000000000000000000000000000000000000000..67a8f8ac1a54ab3fe61d4c62183b43d500b03322 Binary files /dev/null and b/sqlite/conf/conf.db differ diff --git a/sqlite/conf/create-and-populate.sql b/sqlite/conf/create-and-populate.sql new file mode 100644 index 0000000000000000000000000000000000000000..ebf03a86817ec51ee49b048c437c2299c65419f4 --- /dev/null +++ b/sqlite/conf/create-and-populate.sql @@ -0,0 +1,390 @@ +.mode column +.headers on +PRAGMA foreign_keys = ON; + +CREATE TABLE Topic ( + title TEXT NOT NULL PRIMARY KEY +); + +INSERT INTO Topic (title) VALUES +('blockchain'), +('cloud'), +('databases'), +('lambda calculus'), +('microservices'); + +CREATE TABLE Conference ( + id_conference INTEGER NOT NULL PRIMARY KEY, + name TEXT NOT NULL, + start_date TEXT NOT NULL, + end_date TEXT NOT NULL, + price NUMERIC NOT NULL, + title TEXT NOT NULL, + FOREIGN KEY (title) REFERENCES Topic(title) +); + +INSERT INTO Conference (id_conference, name, start_date, end_date, price, title) VALUES +(1, 'Scala Days 2016', '2016-06-01', '2016-06-03', 800, 'microservices'), +(2, 'Scala Days 2017', '2017-05-14', '2017-05-16', 850, 'databases'), +(3, 'Devoxx', '2017-08-04', '2017-08-04', 550, 'blockchain'), +(4, 'Lambda Days', '2019-02-03', '2019-02-04', 150, 'lambda calculus'), +(5, 'CurryOn', '2019-03-03', '2019-03-07', 400, 'databases'); + +CREATE TABLE Visitor ( + login TEXT NOT NULL PRIMARY KEY, + firstname TEXT NOT NULL, + lastname NOT NULL +); + +INSERT INTO Visitor (login, firstname, lastname) VALUES +('agillibrandc', 'Alfonso', 'Gillibrand'), +('apendockq', 'Adela', 'Pendock'), +('asustin1d', 'Alair', 'Sustin'), +('bgliddery', 'Banky', 'Glidder'), +('bscroxton1', 'Bessy', 'Scroxton'), +('bstempg', 'Burg', 'Stemp'), +('cbalassaj', 'Corey', 'Balassa'), +('ciliffeb', 'Chancey', 'Iliffe'), +('clavignew', 'Calvin', 'La Vigne'), +('dfoden12', 'Dieter', 'Foden'), +('ebirtle17', 'Elisa', 'Birtle'), +('ekeasey15', 'Esme', 'Keasey'), +('elidgeye', 'Esteban', 'Lidgey'), +('eshierr', 'Emlynne', 'Shier'), +('esoggx', 'Ewen', 'Sogg'), +('etowllo', 'Emmanuel', 'Towll'), +('ggrigolond', 'Geraldine', 'Grigolon'), +('gloadwickt', 'Granville', 'Loadwick'), +('gmattiazzi18', 'Georgetta', 'Mattiazzi'), +('gmcspirronv', 'Gerrilee', 'McSpirron'), +('hasaaf11', 'Harper', 'Asaaf'), +('hcoldrickm', 'Harriet', 'Coldrick'), +('hlarway1b', 'Hilario', 'Larway'), +('hweymouth9', 'Heath', 'Weymouth'), +('hwyonl', 'Hagen', 'Wyon'), +('jtowheyi', 'Julianna', 'Towhey'), +('kburnip10', 'Kacy', 'Burnip'), +('kcove16', 'Karissa', 'Cove'), +('kironsu', 'Kira', 'Irons'), +('kwinterbourne1a', 'Kenn', 'Winterbourne'), +('lambrosini0', 'Lilly', 'Ambrosini'), +('lclewa', 'Loren', 'Clew'), +('mbraggintonf', 'Mag', 'Bragginton'), +('memeneyk', 'Maddie', 'Emeney'), +('mgodbold19', 'Mario', 'Godbold'), +('mmattia6', 'Modestia', 'Mattia'), +('mtackettn', 'Mallorie', 'Tackett'), +('ocoutts13', 'Oona', 'Coutts'), +('pbennallck4', 'Percy', 'Bennallck'), +('pmunsey3', 'Phillie', 'Munsey'), +('ptrinder5', 'Petrina', 'Trinder'), +('rjizhakip', 'Roth', 'Jizhaki'), +('rmanueli8', 'Richmond', 'Manueli'), +('scullip1c', 'Sande', 'Cullip'), +('sdundridge2', 'Sawyere', 'Dundridge'), +('skonkeh', 'Starla', 'Konke'), +('ssiveyers', 'Susanne', 'Siveyer'), +('stregunna14', 'Sven', 'Tregunna'), +('tdwerryhouse7', 'Tanner', 'Dwerryhouse'), +('wmontfortz', 'Windy', 'Montfort'); + +CREATE TABLE Fidelity ( + login TEXT NOT NULL PRIMARY KEY, + loyalty_points INTEGER NOT NULL, + FOREIGN KEY(login) REFERENCES Visitor(login) +); + +INSERT INTO Fidelity VALUES +('agillibrandc',50), +('hweymouth9', 100), +('lambrosini0', 100), +('ocoutts13', 40), +('rmanueli8', 250), +('wmontfortz', 30); + + +CREATE TABLE Hotel ( + id_hotel INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + address TEXT NOT NULL, + city TEXT NOT NULL +); + +INSERT INTO Hotel (id_hotel, `name`, address, city) VALUES +('1', 'Luxurious Hotel City', 'Joachimstaler Str. 4', 'Berlin'), +('2', 'Hotel SuperStar', 'Flughafenstrasse 88', 'Berlin'), +('3', 'Centrum Hotel', 'ul. Polarna 141', 'Krakow'), +('4', 'Hotel Ibis', '15 Rue Joseph Vernet', 'Lausanne'), +('5', 'Rolex Hotel', '92 boulevard Amiral Courbet', 'Lausanne'), +('6', 'Hotel Cornavin', 'Boulevard de Cornavin 22', 'Genève'); + +CREATE TABLE Speaker ( + login TEXT NOT NULL PRIMARY KEY, + firstname TEXT NOT NULL, + lastname TEXT NOT NULL +); + +INSERT INTO Speaker (login, firstname, lastname) VALUES +('amalyon0', 'Aluin', 'Malyon'), +('bagius3', 'Blair', 'Agius'), +('bmeenan2', 'Barty', 'Meenan'), +('carrell6', 'Cam', 'Arrell'), +('cbaszniak8', 'Candie', 'Baszniak'), +('djurgensone', 'Duncan', 'Jurgenson'), +('fbaakeb', 'Flora', 'Baake'), +('gmcspirronv', 'Gerrilee', 'McSpirron'), +('gyeoc', 'Georgena', 'Yeo'), +('kgatlin1', 'Katharine', 'Gatlin'), +('kredan4', 'Kelley', 'Redan'), +('lambrosini0', 'Lilly', 'Ambrosini'), +('mfokerd', 'Merilee', 'Foker'), +('mhartfield7', 'Marcile', 'Hartfield'), +('pcroysdale9', 'Preston', 'Croysdale'), +('prulera', 'Patrizius', 'Ruler'), +('stregunna14', 'Sven', 'Tregunna'), +('zjordan5', 'Zorana', 'Jordan'); + +CREATE TABLE Participation ( + login TEXT NOT NULL, + id_conference INTEGER UNSIGNED NOT NULL, + signatureDate TEXT NOT NULL, + fees NUMERIC NOT NULL, + PRIMARY KEY (login, id_conference), + FOREIGN KEY (login) REFERENCES Speaker(login), + FOREIGN KEY (id_conference) REFERENCES Conference(id_conference) +); + +INSERT INTO Participation (login, id_conference, signatureDate, fees) VALUES +('amalyon0', 1, '2017-05-23', 0), +('amalyon0', 2, '2017-02-04', 500), +('bagius3', 1, '2016-04-11', 2500), +('bagius3', 2, '2017-03-01', 0), +('bagius3', 5, '2018-12-01', 500), +('bmeenan2', 1, '2016-03-06', 1000), +('bmeenan2', 4, '2016-04-14', 3000), +('bmeenan2', 5, '2016-03-26', 3000), +('carrell6', 1, '2016-03-18', 3000), +('carrell6', 2, '2017-04-27', 0), +('carrell6', 3, '2016-03-31', 500), +('cbaszniak8', 2, '2017-03-31', 2500), +('cbaszniak8', 4, '2017-05-01', 1000), +('cbaszniak8', 5, '2017-05-20', 500), +('djurgensone', 3, '2017-07-21', 1000), +('djurgensone', 4, '2016-04-10', 2500), +('djurgensone', 5, '2019-01-10', 2000), +('fbaakeb', 1, '2017-02-18', 1500), +('fbaakeb', 2, '2017-03-07', 2000), +('fbaakeb', 4, '2018-11-07', 500), +('fbaakeb', 5, '2019-01-22', 1000), +('gmcspirronv', 1, '2016-04-07', 1000), +('gmcspirronv', 2, '2017-07-15', 2500), +('gmcspirronv', 3, '2017-02-16', 3000), +('gmcspirronv', 5, '2018-12-20', 1000), +('gyeoc', 1, '2018-11-13', 2000), +('gyeoc', 2, '2017-04-23', 0), +('gyeoc', 4, '2016-04-14', 3000), +('gyeoc', 5, '2018-12-20', 1500), +('kgatlin1', 1, '2016-03-04', 2500), +('kgatlin1', 3, '2017-07-24', 3000), +('kgatlin1', 4, '2019-01-19', 2000), +('kgatlin1', 5, '2017-07-15', 500), +('kredan4', 2, '2017-05-19', 2000), +('lambrosini0', 3, '2017-05-09', 2000), +('mfokerd', 1, '2018-12-08', 1500), +('mfokerd', 3, '2017-04-24', 0), +('mfokerd', 5, '2019-02-17', 0), +('mhartfield7', 2, '2017-04-17', 3000), +('pcroysdale9', 2, '2017-04-13', 0), +('pcroysdale9', 3, '2019-02-10', 1000), +('pcroysdale9', 4, '2018-11-06', 2000), +('stregunna14', 2, '2017-04-29', 2000), +('stregunna14', 3, '2017-05-10', 0), +('stregunna14', 4, '2018-12-13', 500), +('stregunna14', 5, '2017-03-01', 2000), +('zjordan5', 2, '2017-04-15', 0), +('zjordan5', 3, '2017-05-06', 0); + +CREATE TABLE Registration ( + login TEXT NOT NULL, + id_conference INTEGER NOT NULL, + PRIMARY KEY (login, id_conference), + FOREIGN KEY (login) REFERENCES Visitor(login), + FOREIGN KEY (id_conference) REFERENCES Conference(id_conference) +); + +INSERT INTO Registration (login, id_conference) VALUES +('agillibrandc', 1), +('apendockq', 1), +('asustin1d', 1), +('bscroxton1', 1), +('bstempg', 1), +('ekeasey15', 1), +('eshierr', 1), +('ggrigolond', 1), +('gloadwickt', 1), +('gmcspirronv', 1), +('hcoldrickm', 1), +('hlarway1b', 1), +('jtowheyi', 1), +('kburnip10', 1), +('kironsu', 1), +('kwinterbourne1a', 1), +('lambrosini0', 1), +('lclewa', 1), +('mbraggintonf', 1), +('memeneyk', 1), +('mgodbold19', 1), +('mmattia6', 1), +('pbennallck4', 1), +('ptrinder5', 1), +('rmanueli8', 1), +('scullip1c', 1), +('sdundridge2', 1), +('skonkeh', 1), +('stregunna14', 1), +('tdwerryhouse7', 1), +('bscroxton1', 2), +('ciliffeb', 2), +('elidgeye', 2), +('etowllo', 2), +('ggrigolond', 2), +('gmcspirronv', 2), +('hweymouth9', 2), +('hwyonl', 2), +('jtowheyi', 2), +('kburnip10', 2), +('kcove16', 2), +('kironsu', 2), +('lambrosini0', 2), +('memeneyk', 2), +('mgodbold19', 2), +('mmattia6', 2), +('mtackettn', 2), +('ocoutts13', 2), +('pbennallck4', 2), +('pmunsey3', 2), +('ptrinder5', 2), +('rjizhakip', 2), +('rmanueli8', 2), +('ssiveyers', 2), +('tdwerryhouse7', 2), +('agillibrandc', 3), +('bgliddery', 3), +('bscroxton1', 3), +('bstempg', 3), +('cbalassaj', 3), +('ciliffeb', 3), +('dfoden12', 3), +('ebirtle17', 3), +('ekeasey15', 3), +('eshierr', 3), +('etowllo', 3), +('ggrigolond', 3), +('hcoldrickm', 3), +('hlarway1b', 3), +('hweymouth9', 3), +('hwyonl', 3), +('kburnip10', 3), +('kwinterbourne1a', 3), +('lclewa', 3), +('memeneyk', 3), +('mgodbold19', 3), +('skonkeh', 3), +('ssiveyers', 3), +('stregunna14', 3), +('agillibrandc', 4), +('apendockq', 4), +('asustin1d', 4), +('bscroxton1', 4), +('bstempg', 4), +('cbalassaj', 4), +('clavignew', 4), +('dfoden12', 4), +('ebirtle17', 4), +('eshierr', 4), +('gmattiazzi18', 4), +('hasaaf11', 4), +('hlarway1b', 4), +('hweymouth9', 4), +('kburnip10', 4), +('mtackettn', 4), +('ocoutts13', 4), +('pmunsey3', 4), +('rmanueli8', 4), +('scullip1c', 4), +('sdundridge2', 4), +('ssiveyers', 4), +('asustin1d', 5), +('bscroxton1', 5), +('bstempg', 5), +('clavignew', 5), +('dfoden12', 5), +('ekeasey15', 5), +('elidgeye', 5), +('eshierr', 5), +('ggrigolond', 5), +('gmattiazzi18', 5), +('gmcspirronv', 5), +('hlarway1b', 5), +('jtowheyi', 5), +('kcove16', 5), +('kironsu', 5), +('lambrosini0', 5), +('mgodbold19', 5), +('ocoutts13', 5), +('pmunsey3', 5), +('rjizhakip', 5), +('stregunna14', 5), +('tdwerryhouse7', 5); + +CREATE TABLE Stay ( + id_stay INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + login TEXT NOT NULL, + id_hotel INTEGER NOT NULL, + start_date TEXT NOT NULL, + end_date TEXT NOT NULL, + UNIQUE (login, start_date), + FOREIGN KEY (login) REFERENCES Speaker(login), + FOREIGN KEY (id_hotel) REFERENCES Hotel(id_hotel) +); + +INSERT INTO Stay (login, id_hotel, start_date, end_date) VALUES +('cbaszniak8', '3', '2019-02-03', '2019-02-05'), +('lambrosini0', '6', '2017-08-04', '2017-08-05'), +('carrell6', '6', '2017-08-04', '2017-08-05'), +('bmeenan2', '3', '2019-02-03', '2019-02-05'), +('djurgensone', '5', '2019-03-03', '2019-03-05'), +('gmcspirronv', '6', '2017-08-04', '2017-08-06'), +('gyeoc', '1', '2016-06-01', '2016-06-03'), +('kgatlin1', '3', '2019-02-03', '2019-02-05'), +('fbaakeb', '4', '2019-03-03', '2019-03-05'), +('bagius3', '2', '2017-05-14', '2017-05-15'), +('pcroysdale9', '2', '2017-05-14', '2017-05-16'), +('djurgensone', '3', '2019-02-03', '2019-02-05'), +('gmcspirronv', '1', '2016-06-01', '2016-06-03'), +('gyeoc', '5', '2019-03-03', '2019-03-04'), +('bmeenan2', '1', '2016-06-01', '2016-06-03'), +('pcroysdale9', '3', '2019-02-03', '2019-02-04'), +('kgatlin1', '1', '2016-06-01', '2016-06-02'), +('cbaszniak8', '2', '2017-05-14', '2017-05-16'), +('bagius3', '4', '2019-03-03', '2019-03-04'), +('stregunna14', '6', '2017-08-04', '2017-08-05'), +('fbaakeb', '3', '2019-02-03', '2019-02-05'), +('djurgensone', '6', '2017-08-04', '2017-08-05'), +('mfokerd', '6', '2017-08-04', '2017-08-05'), +('fbaakeb', '1', '2017-05-14', '2017-05-16'), +('zjordan5', '2', '2017-05-14', '2017-05-16'), +('carrell6', '1', '2016-06-01', '2016-06-02'), +('pcroysdale9', '6', '2017-08-04', '2017-08-06'), +('carrell6', '2', '2017-05-14', '2017-05-16'), +('mhartfield7', '2', '2017-05-14', '2017-05-16'), +('kgatlin1', '5', '2019-03-03', '2019-03-05'), +('amalyon0', '1', '2016-06-01', '2016-06-02'), +('gmcspirronv', '2', '2017-05-14', '2017-05-15'), +('mfokerd', '2', '2016-06-01', '2016-06-03'), +('gyeoc', '3', '2019-02-03', '2019-02-05'), +('bmeenan2', '5', '2019-03-03', '2019-03-05'), +('zjordan5', '6', '2017-08-04', '2017-08-05'), +('stregunna14', '1', '2017-05-14', '2017-05-16'), +('kredan4', '2', '2017-05-14', '2017-05-16'), +('mfokerd', '4', '2019-03-03', '2019-03-04'); diff --git a/sqlite/conf/run.sql b/sqlite/conf/run.sql new file mode 100644 index 0000000000000000000000000000000000000000..2f4630ad973238f32a830cc4d53bbb05332007b9 --- /dev/null +++ b/sqlite/conf/run.sql @@ -0,0 +1,5 @@ +PRAGMA foreign_keys = ON; +.mode column +.headers on +.open conf.db +