Un simple petit cours sur les BASES du SQL que j'ai pu donner récemment à des étudiants de troisième bachelier (Ingénieurs Civils, orientation Informatique & Gestion)
2. SQL ?
3 catégories de commandes :
DML (data manipulation language)
Lire, écrire, modifier, …
DDL (data definition language)
DCL (data control language)
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 2
3. Table « students »
Matricule Nom Prénom Option Année
001 Cambier Romain IG 3
002 El Mouhafidi Youness SDM 2
003 Honoré Marc IG 3
004 Baudinet Élodie MECA 3
005 Fontaine Simon IG 4
006 Kosciesza Kamil ELEC 4
007 Infantino Giuliano ELEC 5
008 Ozdemir Eren MINES 2
009 Colassin Benjamin MECA 5
010 Goudemant Thomas ELEC 2
011 Regnier Guillaume SDM 5
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 3
4. DML: SELECT
Utilité: récupérer des données
Syntaxe: "SELECT #columns# FROM #table#"
Exemples:
Récupérer toutes les infos de tous les étudiants:
SELECT * FROM students
Récupérer tous les noms & prénoms:
SELECT nom, prenom FROM students
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 4
5. DML: SELECT
Distinct: récupérer des données sans doublon
Syntaxe: "SELECT DISTINCT #columns# FROM #table#"
Exemples:
« SELECT DISTINCT Name FROM Students »
Id (BIGINT) Name Name
(VARCHAR) (VARCHAR)
1 Riri Fifi
2 Fifi Riri
3 Riri
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 5
6. DML: FONCTIONS
Fonctions scalaires
N entrées N sorties
FONCTION SYNTAXE USAGE
UPPER/UCASE UPPER(column) Renvoi le champs en majuscule
LOWER/LCASE LOWER(column) Renvoi le champs en minuscule
LENGTH/LEN LEN(column) Renvoi le nombre de caractères dans le
champs
ROUND ROUND(column, decimals) Renvoi les valeurs arrondies à la
décimale la plus proche
« SELECT #function(param)# AS #var# FROM
#table# »
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 6
7. DML: FONCTIONS
Fonctions d’agrégat
N entrées 1 sortie
FONCTION SYNTAXE USAGE
COUNT COUNT(*/(DISTINCT) column) Renvoi le nombre d’entrées
AVG AVG(column) Renvoi la moyenne des entrées
SUM SUM(column) Renvoi la somme des entrées
MIN MIN(column) Renvoi la valeur minimum
MAX MAX(column) Renvoi la valeur maximum
FIRST FIRST(column) Renvoi la première entrée
LAST LAST(column) Renvoi la dernière entrée
« SELECT #function(param)# AS #var# FROM #table# »
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 7
8. CLAUSES: WHERE
Utilité: récupérer certaines données (condition)
Syntaxe: "SELECT #columns# FROM #table#« WHERE
#column# = #value# "
Exemples:
Récupérer tous les IG:
SELECT * FROM students WHERE option=‘IG’
Récupérer tous les noms des BA2:
SELECT nom FROM students WHERE annee=‘BA2’
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 8
9. CLAUSES: WHERE
Opérateurs
Comparatifs: <, <=, <>, >=, >, =, <=>
Mathématiques: +, -, *, /
Logiques: OR, AND, NOT, IS
Valeurs: TRUE, FALSE, UNKNOWN, NULL, int, ‘char’
Exemple:
« SELECT Id FROM Purchases WHERE (Stock IS NOT
NULL) AND ((5*Price)>=25) »
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 9
10. CLAUSES: WHERE
Mots de contrôle
Like: permet d’approximer une recherche.
Note: ‘_’ remplace une lettre alors que ‘%’ remplace
plusieurs lettres
Exemple:
« SELECT * FROM Students WHERE Name LIKE
‘Ro%’ »
Id (BIGINT) Name (VARCHAR) Id (BIGINT) Name (VARCHAR)
1 Romain 1 Romain
2 Raoul 3 Robin
3 Robin
4 Marc
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 10
11. CLAUSES: WHERE
Mots de contrôle
Contains: est l’équivalent de LIKE ‘%word%’.
Exemple:
« SELECT * FROM Students WHERE
CONTAINS(Name, ‘o’) »
Id (BIGINT) Name (VARCHAR) Id (BIGINT) Name (VARCHAR)
1 Romain 1 Romain
2 Raoul 2 Raoul
3 Robin 3 Robin
4 Marc
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 11
12. CLAUSES: WHERE
Mots de contrôle
Between… And : permet d’obtenir un intervalle
(bornes incluses)
Exemple:
« SELECT * FROM Purchases WHERE Date BETWEEN
‘20130101’ AND ‘20130315’ »
Id Date(DATETIME) Article Id (BIGINT) Date(DATE Article(INT)
(BIGINT) (INT) TIME)
1 2013-02-25 03:12:21 24 1 2013-02-25 24
2 2013-03-15 11:24:00 32 03:12:21
3 2013-05-12 08:00:50 12 2 2013-03-15 32
11:24:00
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 12
13. CLAUSES: WHERE
Id Id_student Moyenne
Comment obtenir les
1 124 12
2 88 11 moyennes des étudiants de
3 62 7 Charleroi en une seule
4 12 15
requête?
5 73 9
Id Nom Ville
12 Derp Charleroi
62 Herp Mons
73 Lill’ Derp Charleroi
88 Derpina Mons
124 Derpington Mons
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 13
14. CLAUSES: WHERE
Id Id_student Moyenne En décomposant le problème en
1 124 12 sous-requêtes:
2 88 11
« SELECT * FROM Students
3 62 7
WHERE Ville=‘Charleroi’ »
4 12 15
5 73 9
+
Id Nom Ville « SELECT Moyenne FROM Notes »
12 Derp Charleroi =
62 Herp Mons
« SELECT Moyenne FROM Notes
73 Lill’ Derp Charleroi
WHERE Id_student = (SELECT Id
FROM Students WHERE
88 Derpina Mons Ville=‘Charleroi’) »
124 Derpington Mons
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 14
15. CLAUSES: WHERE
Queryception
Les opérateurs de sous-requêtes
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 15
16. CLAUSES: WHERE
Mots de contrôle
In: à la condition d’être inclus dans la liste.
Peut être remplacé par ‘= Any’
Exemple:
« SELECT * FROM Employees WHERE Salary IN
(800,1300,1500) »
Id (BIGINT) Name (CHAR) Salary(INT) Id (BIGINT) Name (CHAR) Salary(INT)
1 Miss Fortune 800 1 Miss Fortune 800
2 Garen 1500 2 Garen 1500
3 Viktor 2400
4 Shaco 950
5 Amumu 3100
6 Sona 1100
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 16
17. CLAUSES: WHERE
Mots de contrôle
All: la condition doit être respectée pour toute la liste.
L’intérêt est qu’on ne connait pas le résultat de la sous-requête.
Exemple:
« SELECT * FROM Employees WHERE Salary
>ALL(950,1300,1500) »
Id (BIGINT) Name (CHAR) Salary(INT) Id (BIGINT) Name (CHAR) Salary(INT)
1 Miss Fortune 800 3 Viktor 2400
2 Garen 1500 5 Amumu 3100
3 Viktor 2400
4 Shaco 950
5 Amumu 3100
6 Sona 1100
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 17
18. CLAUSES: WHERE
Mots de contrôle
Any/Some: la condition doit être respectée pour au moins un
élément de la liste.
Exemple:
« SELECT * FROM Employees WHERE Salary
<ANY(950,1300,1500) »
Id (BIGINT) Name (CHAR) Salary(INT) Id (BIGINT) Name (CHAR) Salary(INT)
1 Miss Fortune 800 1 Miss Fortune 800
2 Garen 1500 4 Shaco 950
3 Viktor 2400 6 Sona 1100
4 Shaco 950
5 Amumu 3100
6 Sona 1100
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 18
19. CLAUSES: WHERE
Mots de contrôle
Exists: Renvoie un résultat si la condition de la sous-requête est
vérifiée (possède au moins un résultat)
Exemple:
« SELECT * FROM Employees WHERE NOT EXISTS( SELECT *
FROM Employees WHERE Salary < 4000) »
Id (BIGINT) Name (CHAR) Salary(INT) Id (BIGINT) Name (CHAR) Salary(INT)
1 Miss Fortune 800
2 Garen 1500
3 Viktor 2400
4 Shaco 950
5 Amumu 3100
6 Sona 1100
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 19
20. CLAUSES: GROUP BY
Utilité: Regrouper les résultats d’une fonction d’agrégat
Syntaxe: « SELECT #columns# #function()# FROM #table#
GROUP BY #columns# »
Exemples:
SELECT Id_customer SUM(Price) FROM purchases
GROUP BY Id_customer
Id (BIGINT) Price (INT) Id_customer Id_customer SUM(Price) (INT)
(BIGINT) (BIGINT)
1 50 1 1 80
2 80 2 2 100
3 60 3
3 60
4 30 1
5 20 2
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 20
21. CLAUSES: ORDER BY
Utilité: Ordonner les données affectées
Syntaxe: « SELECT #columns# FROM #table# ORDER
BY #columns# #ASC/DSC#
Exemples:
Récupérer les noms par ordre alphabétique
SELECT nom FROM students ORDER BY
nom ASC
Récupérer les noms par ordre anti-alphabétique
SELECT nom FROM students ORDER BY
nom DSC
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 21
22. CLAUSES: LIMIT
Utilité: limiter le nombre de données affectées
Syntaxe: « SELECT #columns# FROM #table# LIMIT
#start#,#number#
Exemples:
Récupérer les noms des 5 plus vieux étudiants:
SELECT nom FROM students ORDER BY
annee DESC LIMIT 0,5
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 22
23. DML: INSERT
Utilité: insérer des données
Syntaxe: « INSERT INTO #table#(#columns#) VALUES
(#val1#, #val2#, …)
Exemples:
Insérer un étudiant:
INSERT INTO students(nom, prenom, option,
annee) VALUES(‘Honore’, ‘Julie’, ‘GEN’, 1)
= INSERT INTO students(prenom, option, nom,
annee) VALUES(‘Julie’, ‘GEN’, ‘Honore’, 1)
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 23
24. DML: UPDATE
Utilité: modifier des données
Syntaxe: « UPDATE #table# SET #colum# = #val#
Exemples:
Tout le monde réussit, et passe à l’année suivante:
UPDATE students SET annee = annee + 1
Youness (matricule = 2, en SDM) change d’option:
UPDATE students SET option = ‘IG’
WHERE mat = 2
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 24
25. DML: DELETE
Utilité: effacer des données
Syntaxe: « DELETE FROM #table#
Exemples:
Julie (matricule = 12) abandonne polytech:
DELETE FROM students WHERE mat = 12
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 25
26. Plus loin avec SQL ?
Problème: Créons un « mini-moodle » :
• On a une liste de cours avec titulaires/année
• On a une liste de fichiers (liés aux cours)
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 26
27. Table « cours »
Id Nom Année Titulaire
001 Thermique BA3 Prof.A
002 Physique BA2 Prof.B
003 ITR MA1 Prof.C
004 BDD BA3 Prof.C
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 27
28. Table « fichiers »
Id Nom Taille Timestamp Cours
001 Formulaire_examen.pdf 2097152 … 1
002 Diagrames.pdf 9971418415 … 1
003 Video_effet_doppler.avi 58416483964 … 2
004 syllabus_optique.doc 6848851 … 2
005 Informatique_distribuee.pdf 6848468 … 3
006 Objectifs_cours_ITR 68413518 … 3
007 theorie_bdd_relationnelles.pdf 348441184 … 4
008 SQL_to_NoSQL.pdf 43874577 … 4
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 28
29. Plus loin avec SQL ?
Cahier des charges:
• Affichage des différents profs
• Affichage des différents cours
• Affichage des fichiers d’un cours
• Affichage des fichiers par cours
• Affichage des fichiers par année
• Nombre de cours par prof
• Nombre de fichiers par prof
• Volume (stockage) utilisé par un prof
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 29
30. Plus loin avec SQL ?
Fonction: Affichage des différents profs
SELECT Titulaire FROM Cours GROUP BY Titulaire
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 30
31. Plus loin avec SQL ?
Fonction: Affichage des différents cours
SELECT Nom FROM Cours
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 31
32. Plus loin avec SQL ?
Fonction: Affichage des fichiers par cours
SQL> SELECT Id AS cours_id, Nom AS cours_nom FROM Cours;
for each cours_nom
SQL> SELECT Nom FROM Fichiers WHERE Cours=cours_id
end
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 32
33. Les jointures à la rescousse !
Jointures ?
Jointures ?
Jointures ?
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 33
34. Les jointures à la rescousse !
Jointures:
« (…) la jointure est une opération qui consiste à
effectuer un produit cartésien des
enregistrements de deux tables (…) Le résultat
de l'opération est une nouvelle table. » (wikipedia.org)
« Une jointure (ou θ-jointure) est un produit
cartésien de deux tables. » (commentcamarche.net)
« Une jointure permet de lire des données depuis
des tables liées. » (moi)
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 34
35. Les jointures, c’est puissant !!!
Fonction: Affichage des fichiers par cours
SELECT * FROM Cours, Fichiers WHERE
Fichiers.Cours = Cours.Id
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 35
36. Plus loin avec SQL ?
Fonction: Affichage des fichiers d’un cours
SQL> SELECT Id AS cours_id FROM Cours WHERE Nom=‘Physique’;
for each cours_id
SQL> SELECT Nom FROM Fichiers WHERE Cours=cours_id
end
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 36
37. Les jointures, c’est puissant !!!
Fonction: Affichage des fichiers d’un cours
SELECT * FROM Cours, Fichiers WHERE
(Cours.Nom=‘Physique’ AND Fichiers.Cours = Cours.Id)
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 37
38. Les jointures, c’est puissant !!!
Fonction: Affichage des fichiers par année
SELECT Fichiers.Nom, Cours.annee FROM Cours, Fichiers
WHERE Fichiers.Cours = Cours.Id ORDER BY Cours.Année
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 38
39. Les jointures, c’est puissant !!!
Fonction: Nombre de cours par prof
SELECT COUNT(*), titulaire FROM Cours GROUP BY Titulaire
ORDER BY Titulaire
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 39
40. Les jointures, c’est puissant !!!
Fonction: Nombre de fichiers par prof
SELECT COUNT(Fichiers.ID), titulaire FROM Fichiers, Cours
WHERE Fichiers.Cours=Cours.Id GROUP BY Cours.Titulaire
ORDER BY Cours.Titulaire
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 40
41. Les jointures, c’est puissant !!!
Fonction: Volume (stockage) utilisé par un prof
SELECT SUM(Fichiers.Taille), titulaire FROM Fichiers, Cours
WHERE Fichiers.Cours=Cours.Id GROUP BY Cours.Titulaire
ORDER BY Cours.Titulaire
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 41
42. BONUS
Affichez tous les fichiers auxquels à accès
Romain Cambier (en ne connaissant que son
nom/prénom)
TIPS: CONCAT(‘a’, ‘b’) == ‘ab’
Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 42
43. Université de Mons Le SQL pour les nuls | Romain Cambier & Youness El Mouhafidi 43