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; | ||
+ | </ |