Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| sio:bloc1:3:sql [2023/11/30 11:28] – supprimée - modification externe (Date inconnue) 127.0.0.1 | sio:bloc1:3:sql [2024/01/10 11:12] (Version actuelle) – [LIMIT] jcheron | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== SQL ====== | ||
| + | ===== Data Query Language DQL ===== | ||
| + | Langage d' | ||
| + | |||
| + | ==== SELECT... FROM... ==== | ||
| + | |||
| + | Permet d' | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT champ1, | ||
| + | FROM Table1, | ||
| + | </ | ||
| + | |||
| + | **Exemple :** | ||
| + | |||
| + | Obtenir l' | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT nom, prenom | ||
| + | FROM questionnaire; | ||
| + | </ | ||
| + | |||
| + | **Exemple :** | ||
| + | |||
| + | Obtenir uniquement les noms : | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT nom | ||
| + | FROM questionnaire; | ||
| + | </ | ||
| + | |||
| + | |||
| + | **Exemple :** | ||
| + | |||
| + | Obtenir toutes les informations de la table questionnaire : | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire; | ||
| + | </ | ||
| + | |||
| + | ==== ...WHERE... ==== | ||
| + | Le WHERE Permet de poser une condition pour sélectionner les enregistrements à afficher : | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT nomChamp(s) | ||
| + | FROM table(s) | ||
| + | WHERE condition(s); | ||
| + | </ | ||
| + | |||
| + | où **condition** est une expression booléenne | ||
| + | |||
| + | **Exemple :** | ||
| + | Affichage de toutes les informations relatives aux questionnaires de Caen | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | WHERE ville=' | ||
| + | </ | ||
| + | |||
| + | **Exemple :** | ||
| + | Affichage de toutes les informations relatives aux questionnaires de Caen dont le nom commence par un B | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | WHERE ville=' | ||
| + | </ | ||
| + | |||
| + | === Opérateur logiques et arithmétiques === | ||
| + | |||
| + | |< 100% >| | ||
| + | ^Opérateur ^Rôle ^Exemple ^ | ||
| + | |= |Comparaison (égalité) | Ville=' | ||
| + | |!= ou <> |Comparaison (différence) | Ville!=' | ||
| + | |< | Inférieur à | age<10 | | ||
| + | |> | Supérieur à | age>10 | | ||
| + | |<= | Inférieur ou égal à | < | ||
| + | |>= | Supérieur ou égal à | age>=10 | | ||
| + | |IN | Dans un ensemble de valeurs | age IN 10,11,12 | | ||
| + | |NOT IN | Nom compris dans un ensemble | NOT IN 20,21,22,23 | | ||
| + | |BETWEEN..AND | Entre une valeur et une autre | age BETWEEN 10 AND 20 | | ||
| + | |NOT BETWEEN..AND | Non compris entre une valeur et une autre | age NOT BETWEEN 10 AND 20 | | ||
| + | |LIKE | Comme... permet d' | ||
| + | |NOT LIKE | Pas comme... permet d' | ||
| + | |IS | Est... Utilisable avec False/ | ||
| + | |Is NOT | N'est pas... | Password IS NOT NULL | | ||
| + | |AND | Et logique | Ville=' | ||
| + | |OR | Ou logique | Ville!=' | ||
| + | |||
| + | ==== SELECT FROM multi-tables ==== | ||
| + | Il est possible d' | ||
| + | |||
| + | === -- Jointure exprimée dans le WHERE (Ancienne norme)=== | ||
| + | **Exemple :**\\ | ||
| + | {{: | ||
| + | |||
| + | Affichage des questions et de leur catégorie : | ||
| + | <sxh sql; | ||
| + | SELECT Categorie.libelle, | ||
| + | FROM question, Categorie | ||
| + | WHERE question.idCategorie=categorie.id; | ||
| + | </ | ||
| + | Le champ **idCategorie** de la **Question** correspond au champ **id** de la **Categorie** | ||
| + | |||
| + | === Jointure exprimée par un JOIN (Nouvelle norme)=== | ||
| + | **Exemple :**\\ | ||
| + | Affichage des questions et de leur catégorie : | ||
| + | <sxh sql; | ||
| + | SELECT Categorie.libelle, | ||
| + | FROM question JOIN Categorie | ||
| + | ON question.idCategorie=categorie.id; | ||
| + | </ | ||
| + | Le champ **idCategorie** de la **Question** correspond au champ **id** de la **Categorie** | ||
| + | |||
| + | |||
| + | **Exemple :**\\ | ||
| + | Affichage des questions, de leur catégorie et des réponses par question : | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT Categorie.libelle, | ||
| + | FROM (question JOIN Categorie ON question.idCategorie=categorie.id) | ||
| + | JOIN Reponse | ||
| + | ON reponse.idQuestion=Question.id; | ||
| + | </ | ||
| + | Le champ **idCategorie** de la **Question** correspond au champ **id** de la **Categorie**\\ | ||
| + | Le champ **idQuestion** de la **Reponse** correspond au champ **id** de la **Question** | ||
| + | ==== GROUP BY==== | ||
| + | La clause **GROUP BY** permet de regrouper les résultats sur la valeur commune d'un champ, pour effectuer des calculs,\\ | ||
| + | en utilisant les fonctions de regroupement ci-dessous : | ||
| + | |< 100% >| | ||
| + | ^Opérateur ^Rôle ^Exemple ^ | ||
| + | |COUNT(*) |Calcul le nombre d' | ||
| + | |COUNT(DISTINCT nomChamp) |Calcul le nombre d' | ||
| + | |AVG(nomChamp) |Calcul de la moyenne des valeurs de nomChamp | SELECT Ville, AVG(age) FROM Etudiant GROUP BY Ville| | ||
| + | |SUM(nomChamp) |Calcul de la somme des valeurs de nomChamp | SELECT YEAR(DateFacture), | ||
| + | |MIN(nomChamp) |Calcul du minimum des valeurs de nomChamp | SELECT MIN(age) FROM Etudiant | | ||
| + | |MAX(nomChamp) |Calcul du maximum des valeurs de nomChamp | SELECT MAX(age) FROM Etudiant | | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | Tous les champs intégrés dans le < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | **Exemples :** | ||
| + | |||
| + | Calcul du nombre de questionnaires : | ||
| + | <sxh sql; | ||
| + | SELECT COUNT(*) | ||
| + | FROM questionnaire; | ||
| + | </ | ||
| + | |||
| + | Calcul du nombre de questionnaires par Ville : | ||
| + | <sxh sql; | ||
| + | SELECT Ville, COUNT(*) | ||
| + | FROM questionnaire | ||
| + | GROUP BY Ville; | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== HAVING ==== | ||
| + | |||
| + | La clause **HAVING** permet de poser une condition (comme le WHERE), mais en utilisant l'une des fonctions de regroupement. | ||
| + | |||
| + | **Exemples :** | ||
| + | |||
| + | Calcul du nombre de questionnaires pour les villes ayant plus de 5 questionnaires | ||
| + | <sxh sql; | ||
| + | SELECT Ville, COUNT(*) | ||
| + | FROM questionnaire | ||
| + | GROUP BY Ville | ||
| + | HAVING COUNT(*)> | ||
| + | </ | ||
| + | |||
| + | Si une partie de la condition à poser n’intègre pas de fonction de regroupement, | ||
| + | |||
| + | Calcul du nombre de questionnaires pour les villes commençant par un C et ayant plus de 5 questionnaires | ||
| + | <sxh sql; | ||
| + | SELECT Ville, COUNT(*) | ||
| + | FROM questionnaire | ||
| + | WHERE Ville LIKE ' | ||
| + | GROUP BY Ville | ||
| + | HAVING COUNT(*)> | ||
| + | </ | ||
| + | |||
| + | ==== ORDER BY ==== | ||
| + | La clause **ORDER BY** permet d' | ||
| + | |||
| + | **Exemples :**\\ | ||
| + | Affichage des questionnaires classés par ordre de date de naissance du candidat : | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | ORDER BY dNaiss; | ||
| + | </ | ||
| + | |||
| + | Il est possible de préciser l' | ||
| + | Affichage des questionnaires classés par ordre décroissant de date de naissance du candidat : | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | ORDER BY dNaiss DESC; | ||
| + | </ | ||
| + | |||
| + | Sur plusieurs champs : par ordre alphabétique croissant des villes, et par ordre de date de naissance décroissant : | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | ORDER BY Ville ASC,dNaiss DESC; | ||
| + | </ | ||
| + | |||
| + | En utilisant les numéro d' | ||
| + | <sxh sql; | ||
| + | SELECT Ville, dNaiss, nom | ||
| + | FROM questionnaire | ||
| + | ORDER BY 1 ASC,2 DESC; | ||
| + | </ | ||
| + | ==== LIMIT ==== | ||
| + | La clause **LIMIT** permet de spécifier le nombre d' | ||
| + | |||
| + | **Exemples :** | ||
| + | |||
| + | Elle peut s' | ||
| + | Affichage des 10 premiers questionnaires | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | LIMIT 10; | ||
| + | </ | ||
| + | |||
| + | Utilisée avec 2 arguments, le premier désigne l' | ||
| + | Affichage des 10 premiers questionnaires | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | LIMIT 0,10; | ||
| + | </ | ||
| + | |||
| + | Affichage des 10 suivants : | ||
| + | <sxh sql; | ||
| + | SELECT * | ||
| + | FROM questionnaire | ||
| + | LIMIT 10,10; | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP important> | ||
| + | L' | ||
| + | - SELECT | ||
| + | - FROM | ||
| + | - WHERE | ||
| + | - GROUP BY | ||
| + | - HAVING | ||
| + | - ORDER BY | ||
| + | - LIMIT | ||
| + | </ | ||
| + | ==== UNION ==== | ||
| + | Le mot clé **UNION** permet de combiner plusieurs résultats de SELECT pour en obtenir 1 seul :\\ | ||
| + | L' | ||
| + | |||
| + | Affichage des 10 premiers questionnaires et des questionnaires dont le nom commence | ||
| + | <sxh sql; | ||
| + | SELECT * FROM questionnaire LIMIT 10 | ||
| + | UNION | ||
| + | SELECT * FROM questionnaire WHERE nom LIKE ' | ||
| + | </ | ||
| + | |||
| + | Les enregistrements ne proviennent pas forcément des mêmes tables :\\ | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT Categorie.libelle from Categorie | ||
| + | UNION | ||
| + | SELECT Question.libelle From Question; | ||
| + | </ | ||
| + | |||
| + | ==== VIEW ==== | ||
| + | Une vue permet de stocker dans la BDD une instruction SQL correspondant à un résultat | ||
| + | |||
| + | **Création :**\\ | ||
| + | <sxh sql; | ||
| + | CREATE VIEW `Q_Caen` AS | ||
| + | SELECT * from Questionnaire | ||
| + | WHERE ville=' | ||
| + | </ | ||
| + | |||
| + | La vue produit un résultat dynamique, mis à jour en fonction des modifications effectuées dans la base. | ||
| + | |||
| + | **Suppression :**\\ | ||
| + | <sxh sql; | ||
| + | DROP VIEW `Q_Caen`; | ||
| + | </ | ||
| + | |||
| + | **Mise à jour :**\\ | ||
| + | <sxh sql; | ||
| + | ALTER VIEW `Q_Caen` AS | ||
| + | SELECT * from Questionnaire | ||
| + | WHERE ville=' | ||
| + | </ | ||
| + | |||
| + | ===== Opération CRUD sur les enregistrements d'une base ===== | ||
| + | * C : Create | ||
| + | * R : Read | ||
| + | * U : Update | ||
| + | * D : Delete | ||
| + | ==== Create : insertion de données ==== | ||
| + | |||
| + | INSERT INTO... | ||
| + | |||
| + | === Insertion complète === | ||
| + | Le nombre de valeurs à insérer est égal au nombre de champs | ||
| + | <sxh sql: | ||
| + | INSERT INTO parution | ||
| + | VALUES (1," | ||
| + | </ | ||
| + | |||
| + | === Insertion incomplète === | ||
| + | Le nombre de valeurs à insérer est inférieur au nombre de champs.\\ | ||
| + | Vous devez dans ce cas préciser les champs concernés par l' | ||
| + | <sxh sql; | ||
| + | INSERT INTO parution(numP, | ||
| + | VALUES(2," | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | <ul> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ul> | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Read : Lecture de données ==== | ||
| + | |||
| + | SELECT... | ||
| + | |||
| + | __L' | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT * FROM parution | ||
| + | WHERE numP=1; | ||
| + | </ | ||
| + | |||
| + | Compter le nombre d' | ||
| + | |||
| + | <sxh sql; | ||
| + | SELECT COUNT(*) as nb FROM Parution; | ||
| + | </ | ||
| + | ==== Update : Modification de données ==== | ||
| + | |||
| + | UPDATE... | ||
| + | |||
| + | __La mise à jour d'un enregistrement spécifique__ ne doit se faire que par condition sur la clé primaire, pour être certain en réponse de n' | ||
| + | |||
| + | <sxh sql; | ||
| + | UPDATE parution SET titre=" | ||
| + | WHERE numP=1; | ||
| + | </ | ||
| + | |||
| + | **__Mise à jour de plusieurs champs :__** | ||
| + | <sxh sql; | ||
| + | UPDATE parution SET titre=" | ||
| + | WHERE numP=1; | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Delete : Suppression de données ==== | ||
| + | |||
| + | DELETE... | ||
| + | |||
| + | __La suppression d'un enregistrement spécifique__ ne doit se faire que par condition sur la clé primaire, pour être certain en réponse de ne supprimer qu'un seul enregistrement. | ||
| + | |||
| + | **__Suppression d'un enregistrement :__** | ||
| + | <sxh sql; | ||
| + | DELETE FROM parution | ||
| + | WHERE numP=1; | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | Suppression d'un enregistrement père associé à des enregistrements fils (En l' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | **__Suppression de plusieurs enregistrements :__** | ||
| + | <sxh sql; | ||
| + | DELETE FROM parution | ||
| + | WHERE titre like " | ||
| + | </ | ||
| + | |||
| + | |||
| + | **__Suppression de tous les enregistrements :__** | ||
| + | <sxh sql; | ||
| + | DELETE FROM parution; | ||
| + | </ | ||
| + | ou | ||
| + | <sxh sql; | ||
| + | DELETE FROM parution | ||
| + | WHERE 1=1; | ||
| + | </ | ||