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