<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 ?
----

----
### <i class="fa fa-table"></i> Tables / Relations
----

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
----

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
----

----
### <i class="fa fa-table"></i><i class="fa fa-link"></i> Tables de liaison
----

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.

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.

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

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
----

----
### <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}]"}