======Langage SQL : requêtes d’interrogation et de mise à jour d’une base de données======
Si vous ne comprenez pas le résumé, cliquez sur la commande qui vous conduira a sa page sur ce wiki.
=====I. Résumé=====
[[les_fiches_revisions:bases_de_donnees:sql#III. Créer une relation|*CREATE TABLE*]] => Créer une relation
CREATE TABLE nom
(attribut1 domaine1, attribut2 domaine2);
[[les_fiches_revisions:bases_de_donnees:sql#A) SELECT|*SELECT*]] => Montre la relation
SELECT attributs
FROM table1
[[les_fiches_revisions:bases_de_donnees:sql#B) SELECT DISTINCT|*SELECT DISTINCT*]] => Montre la relation sans doublons
SELECT DISTINCT attribut
FROM nom_table
[[les_fiches_revisions:bases_de_donnees:sql#C) WHERE|*WHERE*]] => Ajout de conditions ("filtre") - Ajouté à **SELECT**, **UPDATE** et **REMOVE**
WHERE condition
WHERE condition1 AND condition2
WHERE condition1 OR condition2
Rappel: Les //conditions// sont sous cette forme: attribut=valeur
[[les_fiches_revisions:bases_de_donnees:sql#D) ORDER BY|*ORDER BY*]] => Ajout à **SELECT** pour trier
ORDER BY attribut
ORDER BY attribut1, attribut2
ORDER BY attribut DESC
[[les_fiches_revisions:bases_de_donnees:sql#E) JOIN|*INNER JOIN*]] => Jointure de deux bases de donnée - Ajout à **SELECT**
SELECT attributs
FROM table1
INNER JOIN table2 ON table1.attribut = table2.attribut
**SELECT complexe** - Exemple
SELECT attributs
FROM table1
INNER JOIN table2 ON table1.attribut = table2.attribut
WHERE condition1 AND (condition2 OR condition3)
ORDER BY table1.attribut, table2.attribut DESC
[[les_fiches_revisions:bases_de_donnees:sql#A) INSERT|*INSERT*]] => Ajoute des lignes à une relation
INSERT INTO nom_table
(attribut1, attribut2, attribut3)
VALUES
("valeur1", "valeur2", "valeur3")
[[les_fiches_revisions:bases_de_donnees:sql#B) UPDATE|*UPDATE*]] => Change certaines lignes d'une relation
UPDATE nom_table
SET attribut1="valeur1", attribut2="valeur2"
WHERE condition
[[les_fiches_revisions:bases_de_donnees:sql#C) DELETE|*DELETE*]] => Supprimes certaines lignes d'une relation
DELETE FROM nom_table
WHERE condition
=====II. Création d'une base de donnée (sur DB Browser for SQLite)=====
- Allumez //DB Browser for SQLite//
- Cliquez sur **''nouvelle base de donnée''**
- Donnez lui un nom
- Cette page devrais s'ouvrir: {{https://www.loutrel.fr/cours_nsi/img/nsi_term_bd_sql_2.png?400}}
- Cliquez alors sur **''Annuler''**
Pour exécuter des commandes (pour les prochaines catégories) cliquez sur **''Exécuter le SQL''**
L'exemple utiliser tous au long de ce wiki est le suivant:
* Relation CLIENTS
On connait leur prénom, nom, ville, age, salaire et leur abonnement
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 1 | Annie | Martin | Paris | 25 | 3 |
| 2 | Jean | Simon | Nantes | 34 | 3 |
| 3 | Marc | Duval | Paris | 56 | 1 |
| 4 | Margot | Fournier | Lyon | 24 | 2 |
| 5 | Paul | Ledoux | Nantes | 31 | 1 |
| 6 | Anne | Lacroix | Paris | 47 | 4 |
| 7 | Chloé | Olivier | Lyon | 67 | 3 |
| 8 | Marie | Arnaud | Paris | 33 | 4 |
| 9 | Frank | Guillet | Paris | 22 | 1 |
| 10 | John | Gilles | Lyon | 39 | 2 |
* Relation ABONEMENTS
On connait le tarif mensuel, durée de l'abonnement, nombres de session
^ id ^ nom ^ prix ^ durée_mois ^ session ^
| 1 | Eco | 10 | 27 | 2 |
| 2 | Famille | 15 | 27 | 5 |
| 3 | Simple | 20 | 12 | 3 |
| 4 | Pro | 40 | 24 | 20 |
=====III. Créer une relation=====
**CREATE TABLE** est la commande qui permet de créer un relation, en lui attribuant des attributs et leur domaine
====A) Code====
CREATE TABLE nom
(attribut1 domaine1, attribut2 domaine2);
__Attribut :__ Correspond au nom de la colone \\
__Domaine :__ Type de l'attribut:\\
* __INT :__ Entiers\\
* __TEXT :__ Chaine de charactères
====B) Exemple====
Création de la relation //CLIENTS//
CREATE TABLE CLIENTS
(id INT, prenom TEXT, nom INT, ville INT, age INT, id_abonnement INT);
=====IV. Visualiser une relation=====
====A) SELECT====
Cette commande permet de voir une relation (sous forme de tableau).
D'autres commandes peuvent être rajouter en plus pour rajouter des spécification sur quel élément à afficher
===1. Code===
SELECT attribut1, attribut2
FROM nom_table
__Attribut :__ Le nom des attributs qu'il faut affiché\\
Peut également être remplacé par *\\
Cela montrera toutes les colones de la relation
__nom_table :__ Le nom de la relation qui sera affiché
===2. Exemples===
==a) Avec *==
Pour voir toutes les charactéristiques des abonnements
SELECT *
FROM ABONNEMENT
^ id ^ nom ^ prix ^ durée_mois ^ session ^
| 1 | Eco | 10 | 27 | 2 |
| 2 | Famille | 15 | 27 | 5 |
| 3 | Simple | 20 | 12 | 3 |
| 4 | Pro | 40 | 24 | 20 |
==b) Avec le nom d'une des colones (attribut)==
Pour voir la liste des abonnements et leur prix
SELECT nom, prix
FROM ABONNEMENT
^ nom ^ prix ^
| Eco | 10 |
| Famille | 15 |
| Simple | 20 |
| Pro | 40 |
====B) SELECT DISTINCT====
En rajoutant **DISTINCT** après **SELECT**, on peut éviter d'avoir des doublons.
===1. Code===
SELECT DISTINCT attribut
FROM nom_table
===2. Exemple===
Pour voir la liste de toutes les villes dans lequel habite les clients sans les avoir en double
SELECT DISTINCT ville
FROM CLIENTS
^ ville ^
| Paris |
| Nantes |
| Lyon |
====C) WHERE===
Cette commande rajoute un/des filtre(s)
===1. Code===
SELECT attributs
FROM nom_table
WHERE condition
===2. Conditions===
==a) Les opérateurs==
^ Opérateur ^ Description ^
| = | Egal |
| != | Pas egal |
| < | Inférieur à |
| > | Supérieur à |
| %%<=%% | Inférieur ou égale à |
| >= | Supérieur ou égale à |
==b) Plusieurs conditions==
En utilisant **AND** et **OR** il possible de préciser plusieurs conditions.
**AND**\\
Les deux conditions doit être vraie
condition1 AND condition2
**OR**\\
Soit:
Au moins une condition doit être vraie
condition1 OR condition2
===3. Exemple===
Pour voir les clients vivant à Paris qui ont 30 ans ou plus
SELECT *
FROM CLIENTS
WHERE ville="Paris" AND age>=30
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 3 | Marc | Duval | Paris | 56 | 1 |
| 6 | Anne | Lacroix | Paris | 47 | 4 |
| 8 | Marie | Arnaud | Paris | 33 | 4 |
Pour voir le nom et prénom des clients qui ont plus 50 ans ou qui vive à Nantes
SELECT prenom, nom
FROM CLIENTS
WHERE age>50 OR ville="Nantes"
^ prenom ^ nom ^
| Jean | Simon |
| Marc | Duval |
| Paul | Ledoux |
| Chloé | Olivier |
====D) ORDER BY====
Permet de mettre de trier le tableau affiché selon les attributs précisé
===1. Code simple===
SELECT attributs
FROM nom_table
ORDER BY attribut
===2. Plusieurs conditions===
**ORDER BY** va trier le tableau d'abbord par l'//attribut1// puis par l'//attribut2// puis enfin par l'//attribut3// etc...
SELECT attributs
FROM nom_table
ORDER BY attribut1, attribut2, attribut3
===3. Sens de "triage"===
En rajoutant **DESC** ou **ASC**
En rajoutant **DESC** après l'attribut il est possible de trier le tableau dans __l'ordre inverse__.\\
Si l'attribut à pour domaine **INT** alors ce sera trié par __ordre décroissant__.\\
Si l'attribut à pour domaine **TEXT** alors ce sera trié __de Z à A__.
**DESC**
SELECT attributs
FROM nom_table
ORDER BY attribut DESC
**ASC**
ORDER BY attribut ASC
Revient à écrire
ORDER BY attribut
===4. Exemples===
==a) Plusieurs conditions==
Affiche le tableau des clients en les trieant, par leur ville, puis leur nom et enfin leur prénom (tous dans l'ordre alphabétique)
SELECT *
FROM CLIENTS
ORDER BY ville, nom, prenom
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 4 | Margot | Fournier | Lyon | 24 | 2 |
| 10 | John | Gilles | Lyon | 39 | 2 |
| 7 | Chloé | Olivier | Lyon | 67 | 3 |
| 5 | Paul | Ledoux | Nantes | 31 | 1 |
| 2 | Jean | Simon | Nantes | 34 | 3 |
| 8 | Marie | Arnaud | Paris | 33 | 4 |
| 3 | Marc | Duval | Paris | 56 | 1 |
| 9 | Frank | Guillet | Paris | 22 | 1 |
| 6 | Anne | Lacroix | Paris | 47 | 4 |
| 1 | Annie | Martin | Paris | 25 | 3 |
==b) Avec DESC==
Affiche le tableau des clients vivant à Paris en les trieant, par leur age décroissant puis par leur nom
SELECT nom, age
FROM CLIENTS
WHERE ville="Paris"
ORDER BY age DESC, nom
^ nom ^ age ^
| Duval | 56 |
| Lacroix | 47 |
| Arnaud | 33 |
| Martin | 25 |
| Guillet | 22 |
====E) JOIN====
Il est possible de joindre deux relations ensemble grâce à **JOIN**.\\
En réalité il y a plusieurs type de jointure possible mais pour le bac on ne voit que **INNER JOIN**
**INNER JOIN** permet de rajouter une autre table via un attribut.\\
En général une des deux tables aura un clé étrangère qui pourra être relier à la table pour lequel la clé étrangère correspond.
===1. Code===
SELECT attributs
FROM table1
INNER JOIN table2 ON table1.attribut = table2.attribut
Sur la première ligne:
* Pour voire un attribut de la //table1// il suffit de mettre son nom
* **__SAUF__** si il y a un attribut dans la //table2// qui s'appelle pareil
* Dans ce cas ou pour voire un attribut de la //table2// il faut alors le présenter comme ce ci: ''table.attribut''
===2. Exemples===
==a) Exemple concret==
Voire le prénom, nom, l'abonnement et le prix qu'il paye pour
SELECT prenom, CLIENTS.nom, ABONNEMENT.nom, ABONNEMENT.prix
FROM CLIENTS
INNER JOIN ABONNEMENT ON CLIENTS.id_abonnement = ABONNEMENT.id
^ prenom ^ nom ^ nom ^ prix ^
| Frank | Guillet | Eco | 10 |
| Marc | Duval | Eco | 10 |
| Paul | Ledoux | Eco | 10 |
| John | Gilles | Famille | 15 |
| Margot | Fournier | Famille | 15 |
| Annie | Martin | Simple | 20 |
| Chloé | Olivier | Simple | 20 |
| Jean | Simon | Simple | 20 |
| Anne | Lacroix | Pro | 40 |
| Marie | Arnaud | Pro | 40 |
==b) Dans un sens==
SELECT *
FROM CLIENTS
INNER JOIN ABONNEMENT ON CLIENTS.id_abonnement = ABONNEMENT.id
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^ id ^ nom ^ prix ^ durée_mois ^ session ^
| 3 | Marc | Duval | Paris | 56 | 1 | 1 | Eco | 10 | 27 | 2 |
| 5 | Paul | Ledoux | Nantes | 31 | 1 | 1 | Eco | 10 | 27 | 2 |
| 9 | Frank | Guillet | Paris | 22 | 1 | 1 | Eco | 10 | 27 | 2 |
| 4 | Margot | Fournier | Lyon | 24 | 2 | 2 | Famille | 15 | 27 | 5 |
| 10 | John | Gilles | Lyon | 39 | 2 | 2 | Famille | 15 | 27 | 5 |
| 1 | Annie | Martin | Paris | 25 | 3 | 3 | Simple | 20 | 12 | 3 |
| 2 | Jean | Simon | Nantes | 34 | 3 | 3 | Simple | 20 | 12 | 3 |
| 7 | Chloé | Olivier | Lyon | 67 | 3 | 3 | Simple | 20 | 12 | 3 |
| 6 | Anne | Lacroix | Paris | 47 | 4 | 4 | Pro | 40 | 24 | 20 |
==c) Dans l'autre==
SELECT *
FROM ABONNEMENT
INNER JOIN CLIENTS ON ABONNEMENT.id= CLIENTS.id_abonnement
WHERE condition
^ id ^ nom ^ prix ^ durée_mois ^ session ^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 1 | Eco | 10 | 27 | 2 | 3 | Marc | Duval | Paris | 56 | 1 |
| 1 | Eco | 10 | 27 | 2 | 5 | Paul | Ledoux | Nantes | 31 | 1 |
| 1 | Eco | 10 | 27 | 2 | 9 | Frank | Guillet | Paris | 22 | 1 |
| 2 | Famille | 15 | 27 | 5 | 4 | Margot | Fournier | Lyon | 24 | 2 |
| 2 | Famille | 15 | 27 | 5 | 10 | John | Gilles | Lyon | 39 | 2 |
| 3 | Simple | 20 | 12 | 3 | 1 | Annie | Martin | Paris | 25 | 3 |
| 3 | Simple | 20 | 12 | 3 | 2 | Jean | Simon | Nantes | 34 | 3 |
| 3 | Simple | 20 | 12 | 3 | 7 | Chloé | Olivier | Lyon | 67 | 3 |
| 4 | Pro | 40 | 24 | 20 | 6 | Anne | Lacroix | Paris | 47 | 4 |
| 4 | Pro | 40 | 24 | 20 | 8 | Marie | Arnaud | Paris | 33 | 4 |
=====V. Modifier une relation=====
====A) INSERT====
**INSERT INTO** permet de rajouter des lignes à une relation
===1. Code===
INSERT INTO nom_table
(attribut1, attribut2, attribut3)
VALUES
("valeur1", "valeur2", "valeur3")
===2. Exemple===
INSERT INTO CLIENTS
(id, prenom, nom, ville, age, id_abonnement)
VALUES
(1, 'Annie', 'Martin', 'Paris', 25, 3),
(2, 'Jean', 'Simon', 'Nantes', 34, 3),
(3, 'Marc', 'Duval', 'Paris', 56, 1),
(4, 'Margot', 'Fournier', 'Lyon', 24, 2),
(5, 'Paul', 'Ledoux', 'Nantes', 31, 1),
(6, 'Anne', 'Lacroix', 'Paris', 47, 4),
(7, 'Chloé', 'Olivier', 'Lyon', 67, 3),
(8, 'Marie', 'Arnaud', 'Paris', 33, 4),
(9, 'Frank', 'Guillet', 'Paris', 22, 1),
(10, 'John', 'Gilles', 'Lyon', 39, 2);
Cela rajoutera à la relation ceci (visible grace à [[les_fiches_revisions:bases_de_donnees:sql#IV. Visualiser une relation|SELECT]]):
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 1 | Annie | Martin | Paris | 25 | 3 |
| 2 | Jean | Simon | Nantes | 34 | 3 |
| 3 | Marc | Duval | Paris | 56 | 1 |
| 4 | Margot | Fournier | Lyon | 24 | 2 |
| 5 | Paul | Ledoux | Nantes | 31 | 1 |
| 6 | Anne | Lacroix | Paris | 47 | 4 |
| 7 | Chloé | Olivier | Lyon | 67 | 3 |
| 8 | Marie | Arnaud | Paris | 33 | 4 |
| 9 | Frank | Guillet | Paris | 22 | 1 |
| 10 | John | Gilles | Lyon | 39 | 2 |
====B) UPDATE====
Update est un mot anglais qui veut dire mettre à jour.\\
**UPDATE** permet de changer certaines valeurs d'une relation en précisant une condition grâce à [[les_fiches_revisions:bases_de_donnees:sql#C) WHERE|WHERE]]
===1. Code===
UPDATE nom_table
SET attribut1="valeur1", attribut2="valeur2"
WHERE condition
Si vous ne préciser pas WHERE toutes les lignes seront modifiés !!!
===2. Exemple===
Scénario: L'abonnement Simple à changé de prix, il est passé de 20€ à 15€
Si la relation ABONNEMENT ressemblait à ceci (visible grâce à : [[les_fiches_revisions:bases_de_donnees:sql#IV. Visualiser une relation|SELECT]]
^ id ^ nom ^ prix ^ durée_mois ^ session ^
| 1 | Eco | 10 | 27 | 2 |
| 2 | Famille | 15 | 27 | 5 |
| 3 | Simple | 20 | 12 | 3 |
| 4 | Pro | 40 | 24 | 20 |
Après ce code
UPDATE ABONNEMENT
SET prix=15
WHERE id=3
Elle ressemblera à ça
^ id ^ nom ^ prix ^ durée_mois ^ session ^
| 1 | Eco | 10 | 27 | 2 |
| 2 | Famille | 15 | 27 | 5 |
| 3 | Simple | 15 | 12 | 3 |
| 4 | Pro | 40 | 24 | 20 |
====C) DELETE====
Delete est un mot anglais qui veut dire supprimer.\\
**DELETE FROM** permet de supprimer certaines lignes d'une relation en précisant lesquels grâce à [[les_fiches_revisions:bases_de_donnees:sql#C) WHERE|WHERE]]
===1. Code===
DELETE FROM nom_table
WHERE condition
Si une condition n'est pas préciser, alors toutes les lignes seront supprimée.\\
===2. Exemple===
Scénario: Le client //Jean Simon// n'a pas renouvelé son abonnement donc il est supprimé de la relation
Si la relation ABONNEMENT ressemblait à ceci (visible grâce à : [[les_fiches_revisions:bases_de_donnees:sql#IV. Visualiser une relation|SELECT]]
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 1 | Annie | Martin | Paris | 25 | 3 |
| 2 | Jean | Simon | Nantes | 34 | 3 |
| 3 | Marc | Duval | Paris | 56 | 1 |
| 4 | Margot | Fournier | Lyon | 24 | 2 |
| 5 | Paul | Ledoux | Nantes | 31 | 1 |
| 6 | Anne | Lacroix | Paris | 47 | 4 |
| 7 | Chloé | Olivier | Lyon | 67 | 3 |
| 8 | Marie | Arnaud | Paris | 33 | 4 |
| 9 | Frank | Guillet | Paris | 22 | 1 |
| 10 | John | Gilles | Lyon | 39 | 2 |
Après ce code
DELETE FROM CLIENTS
WHERE id=2
Elle ressemblera à ça:
^ id ^ prenom ^ nom ^ ville ^ age ^ id_abonnement ^
| 1 | Annie | Martin | Paris | 25 | 3 |
| 3 | Marc | Duval | Paris | 56 | 1 |
| 4 | Margot | Fournier | Lyon | 24 | 2 |
| 5 | Paul | Ledoux | Nantes | 31 | 1 |
| 6 | Anne | Lacroix | Paris | 47 | 4 |
| 7 | Chloé | Olivier | Lyon | 67 | 3 |
| 8 | Marie | Arnaud | Paris | 33 | 4 |
| 9 | Frank | Guillet | Paris | 22 | 1 |
| 10 | John | Gilles | Lyon | 39 | 2 |