<style> .reveal { font-size: 30px; } </style> # <i class="fa fa-database"></i> SQL <img src="https://i.imgur.com/9Fc7MKC.png" height="300px" /> ##### Présentateur: https://people.epfl.ch/alexandre.javet ###### *Cette présentation a été faite en markdown sur hackmd.io :)* <img src="https://i.imgur.com/k7hq46a.png" height="80px" /> --- ## <i class="fa fa-bars"></i> Sommaire ---- 1. **Qu'est ce qu'est SQL ?** 1.1 *Qui a créé SQL et quand ?* 1.2 *Pourquoi as-t-on créé SQL ? / Syntaxe de SQL* 1.3 *Quelques systèmes de gestion de BD avec SQL* 1.4 *Quelques clients SQL* 2. **À quoi ressemble une BD SQL ?** 2.1 *Tables / Relations* 2.2 *Liaison* 2.3 *Tables de liaison* ---- ## <i class="fa fa-bars"></i> Sommaire ---- 3. **Apprendre à faire du SQL / Commandes** 3.1 *SELECT FROM* 3.2 *WHERE* 3.3 *COUNT* 3.4 *LIKE* 3.5 *BETWEEN* 3.6 *ORDER BY* 3.7 *LEFT JOIN* 3.8 *INSERT* 3.9 *UPDATE* 4.0 *DELETE* ---- ## <i class="fa fa-bars"></i> Sommaire ---- 4. **Former une DB en SQL** 4.1 *Créer une table* 4.2 *Lier deux tables* 5. **Bibliographie** 6. **Questions** 7. **Démo** --- ## <i class="fa fa-question-circle"></i> Qu'est ce qu'est SQL ? ---- **SQL** (*Structured Query Language*) est un **language normalisé**[^one] visant à manipuler les **bases de données relationnelles.**[^two] [^one]: Langage approuvé par **ISO** (*International Organization for Standardization*) [^two]: BD de tableaux à 2 dimensions. ---- ### <i class="fa fa-clock-o"></i> Qui a créé SQL et quand ? ---- SQL a été crée à **IBM** par **Donald D. Chamberlin** et **Raymond F. Boyce** en **1974**. La première version de SQL Server (v1.0) est sortie en **1989**. ---- ### <i class="fa fa-pencil-square-o"></i> Pourquoi as-t-on créé SQL ? / Syntaxe de SQL ---- **SQL** a une syntaxe ressemblant à des **phrases ordinaires anglaises**[^three] facilitant l'**apprentissage**. **SQL** s'appelait **SEQUEL** originellement. (*Structured English QUEry Language*) Certaines personne continuent d'employer ce terme. [^three]: (<i class="fa fa-exclamation-circle"></i> *RUMEUR*) - Conçu pour être utilisable par des gens non-familiers au code dans leur métier (*ex: Scientifiques*) ---- ### <i class="fa fa-tasks"></i> Quelques systèmes de gestion de BD avec SQL ---- * MariaDB <i class="fa fa-star"></i> * MySQL <i class="fa fa-star"></i> * MsSQL * PostgreSQL <i class="fa fa-star"></i> * Microsoft Access 💩 * SQLite <i class="fa fa-star"></i> * *etcaetera...* <i class="fa fa-star"></i> = OpenSource 💩 = Self-explanatory... ---- ### <i class="fa fa-rocket"></i> Quelques clients SQL ---- * phpmyadmin * Adminer * DBeaver * MySqlWorkbench * DataGrip (**PAYANT**) ---- #### phpmyadmin ---- <img src="https://i.imgur.com/tVZSNuL.png" height="400px" /> ---- #### Adminer ---- <img src="https://i.imgur.com/LfyZN5j.png" height="400px" /> ---- #### DBeaver ---- <img src="https://i.imgur.com/TrL9R2d.png" height="400px" /> ---- #### MySqlWorkbench ---- <img src="https://i.imgur.com/IWQpSHR.png" height="400px" /> ---- #### DataGrip ---- <img src="https://i.imgur.com/Nl4xtZw.jpg" height="400px" /> --- ## <i class="fa fa-eye"></i> À quoi ressemble une BD SQL ? ---- <img src="https://i.imgur.com/Tq5zqaE.png" height="400px" /> ---- ## <i class="fa fa-eye"></i> À quoi ressemble une BD SQL ? ---- ![](https://i.imgur.com/jzUvIxV.png) ---- ### <i class="fa fa-table"></i> Tables / Relations ---- ![](https://i.imgur.com/CoDtU3O.png) Une **table** ou **relation** contient: * **Clé primaire**[^six] * **Clé étrangère** (Optionnel)[^seven] * **Attributs** [^six]: ID unique d'une **entrée** [^seven]: Contient la primary key d'une entrée sur une autre table. ---- ### <i class="fa fa-link"></i> Liaison ---- ![](https://i.imgur.com/7rfHq6N.png) Dans une liaison on lie l'entrée d'une table à l'entrée d'une autre. Ici les users possède tous **une** accreditation. ---- ### <i class="fa fa-table"></i><i class="fa fa-link"></i> Tables de liaison ---- ![](https://i.imgur.com/qGR6aJD.png) ---- ### <i class="fa fa-table"></i><i class="fa fa-link"></i> Tables de liaison ---- ![](https://i.imgur.com/jf7geCA.png) Une **table de liaison** sert à lier une entrée d'un tableau **à plusieurs entrées** d'une autre (*et vice versa*) Contient **au minimum** 2 clé étrangères. --- ## <i class="fa fa-heart"></i> Apprendre à faire du SQL / Commandes ---- <img src="https://i.imgur.com/fjUVLSc.jpg" height="300px" /> ---- ### <i class="fa fa-code"></i> SELECT ... FROM ... ---- SELECT FROM est la commande de base pour récupérer des datas. ![](https://i.imgur.com/CoDtU3O.png) Qui est dans users? ```sql= SELECT * FROM Users; ``` Je veux que le pseudo et le prénom des Users ```sql= SELECT Username, Firstname FROM Users; ``` ---- ### <i class="fa fa-code"></i> WHERE ---- WHERE est l'équivalent des conditions dans les langages de programmation. Quels users s'appellent Jimmy? ```sql= SELECT * FROM Users WHERE FirstName = 'Jimmy'; ``` ---- ### <i class="fa fa-code"></i> COUNT ---- COUNT permet de compter le nombre d'entrée qu'une requête va nous ressortir Combien de users s'appellent Jimmy? ```sql= SELECT COUNT(FirstName) FROM Users WHERE FirstName = 'Jimmy'; ``` ---- ### <i class="fa fa-code"></i> LIKE ---- LIKE matche une pseudo-regex (Il est d'ailleurs possible d'utiliser REGEXP_LIKE pour utiliser des vrai Regex) avec les entrées et ressort seulement les valeurs qui contiennent les infos qu'on veut. ![](https://i.imgur.com/rp9AwFk.png) Quels users ont un pseudo commençant par "J"? ```sql= SELECT * FROM Users WHERE Username LIKE 'j%'; ``` ---- ### <i class="fa fa-code"></i> BETWEEN ---- BETWEEN sert à sortir les entrées avec un attribut qui a une valeur entre deux paramètres qu'on définit (Entre deux dates, deux nombres, ou même deux textes (avec l'ordre alphabètique)) Quels users sont nés entre 1999 et 2002? ```sql= SELECT * FROM Users WHERE DateOfBirth BETWEEN '1999-01-01' AND '2002-12-31'; ``` ---- ### <i class="fa fa-code"></i> ORDER BY ---- ORDER BY trie les entrées par ordre de grandeur, ordre alphabétique ou ordre de date Liste des users tré alphabétiquement par leur pseudo ```sql= SELECT * FROM Users ORDER BY Username ASC; ``` Et pour trier inversement ```sql= SELECT * FROM Users ORDER BY Username DESC; ``` ---- ### <i class="fa fa-code"></i> LEFT JOIN ---- LEFT JOIN sert à joindre les entrées d'une autre table sous condition. Ce qui nous permet justement de lier des tables avec des clés étrangère ![](https://i.imgur.com/7rfHq6N.png) Quels accreditation ont chaque User? ```sql= SELECT Accreditation.Accred, Users.Username FROM Users LEFT JOIN Accreditation ON Users.AccredId = Accreditation.Id; ``` Ici on verifie justement on veut que l'Id de l'entrée de la table Accreditation correspond à la clé étrangère de l'entrée de la table Users ```sql= ON Users.AccredId = Accreditation.Id ``` ---- ### <i class="fa fa-code"></i> INSERT ---- INSERT sert à rajouter des données dans une table Rajoutons un User ```sql= INSERT INTO Users (Id, AccredId, Username, FirstName, DateOfBirth) VALUES (null, 1, 'Xx_DarkSasuke', 'Kevin', '2004-06-23'); ``` Deux Users ```sql= INSERT INTO Users (Id, AccredId, Username, FirstName, DateOfBirth) VALUES (null, 1, 'Xx_DarkSasuke', 'Kevin', '2004-06-23'), (null, 1, 'KobaLover', 'Killian', '2006-07-10'); ``` ---- ### <i class="fa fa-code"></i> UPDATE ---- UPDATE sert à modifier des entrées Renommons les Killian en Jean ```sql= UPDATE Users SET FirstName = 'Jean' WHERE FirstName = 'Killian'; ``` ---- ### <i class="fa fa-code"></i> DELETE ---- DELETE sert à supprimer des entrées Supprimons tout les Kevin ```sql= DELETE FROM Users WHERE FirstName = 'Kevin'; ``` --- ## <i class="fa fa-table"></i> Formation de tables ---- ![](https://i.imgur.com/uZWsgAX.png) ---- ### <i class="fa fa-table"></i> Créer une table ---- ```sql= CREATE TABLE `Users` ( `Id` int NOT NULL, `TokenId` int NOT NULL `Username` text NOT NULL, `DateOfBirth` datetime NOT NULL, ) CREATE TABLE `Accreditation` ( `Id` int NOT NULL, `Accred` text NOT NULL, ) ALTER TABLE `Accreditation` ADD PRIMARY KEY (`Id`); ALTER TABLE `Users` ADD PRIMARY KEY (`Id`); ``` ---- ### <i class="fa fa-table"></i> Lier deux tables ---- ```sql= ALTER TABLE `Users` ADD PRIMARY KEY (`Id`), ADD KEY `fk_accredid` (`AccredId`), -- Création du lien -- ADD CONSTRAINT `fk_accredid_accred` FOREIGN KEY (`AccredId`) REFERENCES `Accreditation` (`Id`); ``` --- ### <i class="fa fa-book"></i> Bibliographie ---- 1. [Wikipedia SQL](https://en.wikipedia.org/wiki/SQL) 2. [Wikipedia DBMS](https://en.wikipedia.org/wiki/Database#Database_management_system) (DataBase Management System) 3. **Liste des DBMS** 3.1 [MariaDB](https://mariadb.org) 3.2 [MySQL](https://www.mysql.com) 3.3 [MsSQL](https://www.microsoft.com/en-us/sql-server/sql-server-downloads) 3.4 [PostgreSQL](https://www.postgresql.org) 3.5 ~~[MS Access](https://www.microsoft.com/en-ww/microsoft-365/access)~~ 3.6 [SQLite](https://www.sqlite.org/index.html) 4. **Liste des clients SQL** 4.1 [phpmyadmin](https://www.phpmyadmin.net) 4.2 [Adminer](https://www.adminer.org) 4.3 [DBeaver](https://dbeaver.io) 4.4 [MySqlWorkBench](https://www.mysql.com/products/workbench/) 4.5 [DataGrip](https://www.jetbrains.com/datagrip/?source=google&medium=cpc&campaign=1700946476&gclid=CjwKCAjw2P-KBhByEiwADBYWCkmF6rTq9lwG2VKkU5LVRXhofb3ejWGFchAGB-iVpaYjZ0ulZs44-BoCRTcQAvD_BwE) (**PAYANT**) --- ### <i class="fa fa-commenting"></i> Avez-vous des questions ? ---- <img src="https://i.imgur.com/MHWBFva.png" height="300px" /> --- ### <i class="fa fa-space-shuttle"></i> DEMO <img src="https://i.imgur.com/1ktynnH.jpg" height="400px" />
{"metaMigratedAt":"2023-06-16T11:51:25.484Z","metaMigratedFrom":"YAML","title":"SQL Presentation","breaks":true,"description":"View the slide with \"Slide Mode\".","lang":"fr-FR","slideOptions":"{\"theme\":\"moon\",\"progress\":true,\"transition\":\"fade\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"96fb5b7d-9eb2-426c-a31f-2b7bd934198d\",\"add\":16467,\"del\":6414}]"}
    619 views