Formation M2i - Comprendre les neurosciences pour développer son leadership
4-TP BD.pptx
1. Module Base de données
Travaux Pratiques
Yahya Benkaouz
y.benkaouz@um5r.ac.ma
Departement Informatique
2. Objectifs
• Maitriser les concepts de base du langage SQL.
• Se familiariser avec le SGBDR MySQL.
• Etudier en détail les instructions de base de SQL.
• Maitriser la déclaration, la manipulation, et l’interrogation des tables.
2
3. Plan
• Concepts de base
• Définition de données
• Evolution d’un schéma
• Manipulation de données
• Interrogation des données
3
5. Base de données
• Une collection d’informations organisées
• afin d’être facilement consultables, gérables et mises à jour.
• Elles sont utilisées dans un grand nombre d’entreprises pour
• stocker, manipuler et analyser les données.
• Au sein d’une BD relationnelle,
• l'information est organisée dans des tableaux à deux dimensions appelés des relations ou tables.
• Une BD relationnelle consiste en une ou plusieurs relations.
• Les lignes de ces relations sont appelées des nuplets ou enregistrements.
• Les colonnes sont appelées des attributs.
5
6. Base de données
• Les BD sont utilisées par de nombreuses entreprises dans toutes les industries.
• Compagnies aériennes pour gérer les réservations.
• Les enregistrements médicaux dans les hôpitaux.
• Les agences gouvernementales.
• Les universités.
• …
6
7. SGBD
• SGBD:
• Un système de gestion de base de données.
• Un ensemble de logiciels qui manipulent le contenu des bases de données.
• Ex: IBM DB2, Oracle Database, MySQL, PostgreSQL et Microsoft SQL Server
• Objectif: Garantir la cohérence du contenu de le BD
BD
SGBD
• Assure un accès facile aux données
• Accès simultanés de plusieurs utilisateurs
• Manipulation de données faciles
SGBDR: SGBD implémentant la théorie des BD relationnelles => Garantir l’intégrité des données
7
8. SGBD
• MySQL:
• L’un des SGBD les plus populaires.
• Il est distribué sous double licence, une licence publique générale GNU et une propriétaire.
• Il est développé, distribué et pris en charge par Oracle Corporation.
• Les bases de données MySQL sont des bases de données relationnelles.
8
9. SQL
• SQL: Structured Query Language.
• “Un langage informatique normalisé servant à exploiter des bases de données
relationnelles”. wikipedia
9
SQL
Langage de manipulation des données
(INSERT, UPDATE, DELETE)
Langage de contrôle
Langage de définition des données
(CREATE, ALTER, DROP)
de données
(GRANT, REVOKE)
de transactions
(COMMIT, DRAWBACK)
10. SQL
• Il comprend trois domaines :
• Langage de définition des données
• permet de créer et de modifier l'organisation des données dans la base de données
• Langage de manipulation des données
• permet de rechercher, d'ajouter, de modifier ou de supprimer des données dans les bases de
données relationnelles.
• Langage de contrôle
• Contrôle de transaction: commencer et terminer des transactions
• Contrôle de donnée: autoriser ou interdire l'accès à certaines données à certaines personnes
10
11. SQL
Insertion des commentaires:
• Sur une ligne en utilisant --
• Sur plusieurs lignes entre /* et */
• Nomenclature:
• Tous les noms d’objets (Table, attributs,….) doivent respecter les règles suivantes:
• Commencer par une lettre
• Ne pas contenir un espace
• Ne pas dépasser 128 caractères parmi: Lettres non accentués, chiffres, @, $, #, _
11
14. Création d’une base de données
• Pour créer une base de données qui sera appelé “ma_base” il suffit d’utiliser la requête suivante
qui est très simple:
• Avec MySQL, si une base de données porte déjà ce nom, la requête retournera une erreur. Pour
éviter d’avoir cette erreur, il convient d’utiliser la requête suivante pour MySQL:
• L’option IF NOT EXISTS permet juste de ne pas retourner d’erreur si une base du même nom existe
déjà. La base de données ne sera pas écrasée.
CREATE DATABASE ma_base;
CREATE DATABASE IF NOT EXISTS ma_base;
14
15. • En SQL, la commande DROP DATABASE permet de supprimer totalement une base de données et tout ce
qu’elle contient.
• Pour supprimer la base de données “ma_base”, la requête est la suivante:
• Par défaut, si le nom de base utilisé n’existe pas, la requête retournera une erreur. Pour éviter d’obtenir cette
erreur si vous n’êtes pas sûr du nom, il est possible d’utiliser l’option IF EXISTS.
• La syntaxe sera alors la suivante:
Suppression d’une base de données
DROP DATABASE ma_base;
DROP DATABASE IF EXISTS ma_base;
15
16. Création de tables
• Une table est une entité qui est contenu dans une base de données pour stocker des données ordonnées
dans des colonnes.
• La création d’une table sert à définir les colonnes et le type de données qui seront contenus dans chacun
des colonne (entier, chaîne de caractères, date, valeur binaire …).
• La syntaxe générale pour créer une table est la suivante :
CREATE TABLE nom_de_la_table (
colonne1 type_donnees,
colonne2 type_donnees,
colonne3 type_donnees,
colonne4 type_donnees
);
16
17. Création de tables
• La syntaxe générale pour créer une table est la suivante :
• Type de données:
17
CREATE TABLE nom_de_la_table (
colonne1 type_donnees,
colonne2 type_donnees,
colonne3 type_donnees,
colonne4 type_donnees
);
Numériques Textuelles Temporelles
TINY INT, SMALL INT, INT,
BIGINT, INTEGER
FLOAT, REAL, DOUBLE
DECIMAL
CHAR(n)
VARCHAR(n)
TEXT
ENUM
SET
DATE
TIME
DATETIME
YEAR
18. Création de tables
• Nombres entiers:
18
Numériques Nombre d’octets Minimum Maximum
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
19. Création de tables
• Nombres entiers:
• Possibilité d’indiquer qu’un entire est UNSIGNED
- Pour les TINYINT, on pourra par exemple aller de 0 à 255
• Limiter la taille à l’affichage et l’attribut ZEROFILL
- Préciser le nombre de chiffres minimum à l'affichage d'une colonne de type INT
- Ex: INT(3)
- Même avec un INT(3), nous pouvons avoir la valeur 29003
- Le caractère ajouté par défaut est espace
- L’attribut ZEROFILL ajoute des zéros à gauche
du nombre lors de l’affichage
19
INT(4) ZEROFILL
Nombre stocké Nombre affiché
45 0045
4156 4156
785164 785164
20. Création de tables
• Nombres décimaux :
• Cinq mots-clés permettent de stocker des nombres décimaux dans une
colonne: DECIMAL, NUMERIC, FLOAT, REAL et DOUBLE
• NUMERIC et DECIMAL sont équivalents et acceptent deux paramètres : la précision et l'échelle.
• La précision définit le nombre de chiffres significatifs stockés, donc les 0 à gauche ne comptent pas.
• En effet, 0024 est équivalent à 24. Il n'y a donc que deux chiffres significatifs dans 0024.
• L'échelle définit le nombre de chiffres après la virgule.
• Dans un champ DECIMAL(5,3), on peut donc stocker des nombres de 5 chiffres significatifs au maximum, dont 3
chiffres sont après la virgule.
• Par exemple : 12.354, -54.258, 89.2 ou -56.
• DECIMAL(4) est DECIMAL(4, 0) sont deux écritures équivalentes.
• MySQL ne respecte pas toujours cette règle, et utilise parfois l’octet du signe (-) pour stocker les chiffres.
20
21. Création de tables
• Nombres décimaux :
• FLOAT, DOUBLE et REAL:
• Le mot-clé FLOAT peut s'utiliser sans paramètres, auquel cas quatre octets sont utilisés pour
stocker les valeurs de la colonne.
• Il est possible de spécifier une précision et une echelle d’un FLOAT.
• Quant à REAL et DOUBLE, ils ne supportent pas de paramètres.
• DOUBLE est normalement plus précis que REAL (stockage dans 8 octets, contre stockage
dans 4 octets)
• Mais ce n'est pas le cas avec MySQL qui utilise 8 octets dans les deux cas
21
22. Création de tables
• Nombres décimaux :
• Valeurs exactes vs valeurs approchées:
• Les nombres stockés en tant que NUMERIC ou DECIMAL sont stockés sous forme de chaînes
de caractères. => Valeurs exactes qui sont stockées
• Les types FLOAT,DOUBLE et REAL sont stockés sous forme de nombres. => Valeurs
approchées qui sont stockées (56,678900000000000001 au lieu de 56,6789)
• S'il est nécessaire de conserver la précision exacte de vos données (données bancaires),
• il est donc conseillé d'utiliser un type numérique à valeur exacte
22
23. Création de tables
• Données textuelles:
• CHAR vs VARCHAR:
• Pour stocker un texte relativement court (moins de 255 caractères), vous pouvez utiliser les
types CHAR et VARCHAR.
• Ces deux types s'utilisent avec un paramètre qui précise la taille que peut prendre votre texte (entre 1
et 255).
• Un CHAR(x) stockera toujours x caractères, en remplissant si nécessaire le texte avec des espaces vides
pour le completer.
• Un VARCHAR(x) stockera jusqu'à x caractères (entre 0 et x), et stockera en plus en mémoire la taille du
texte stocké.
23
24. Création de tables
• Données textuelles:
• CHAR vs VARCHAR:
• Les caractères accentués occupent deux octets en mémoire.
• Il est donc possible, pour un CHAR(5), d'occuper plus de 5 octets en mémoire (mais impossible d'y stocker plus que 5
caractères).
24
Texte CHAR(5)
Mémoire
requise
VARCHAR(5)
Mémoire
requise
'' ' ' 5 octets '' 1 octet
'tex' 'tex ' 5 octets 'tex' 4 octets
'texte' 'texte' 5 octets 'texte' 6 octets
'texte trop long' 'texte' 5 octets 'texte' 6 octets
25. Création de tables
• Données textuelles:
• TEXT :
• On peut utiliser le type TEXT, ou un de ses dérivés TINYTEXT, MEDIUMTEXT ou LONGTEXT pour stocker
des textes de plus de 255 caractères.
25
Type Longueur maximale Mémoire occupée
TINYTEXT 28 octets Longueur de la chaîne + 1 octet
TEXT 216 octets Longueur de la chaîne + 2 octet
MEDIUMTEXT 224 octets Longueur de la chaîne + 3 octet
LONGTEXT 232 octets Longueur de la chaîne + 4 octet
26. Création de tables
• Données textuelles:
• ENUM :
• Une colonne de type ENUM est une colonne pour laquelle on définit un certain nombre de
valeurs autorisées, de type "chaîne de caractères”
• Si vous essayez d'introduire une chaîne non autorisée, MySQL stockera une chaîne vide ’’ dans le
champ.
• Pour remplir un champ de type ENUM, deux possibilités s'offrent à vous :
• soit remplir directement avec la valeur choisie (ex. "chat”) ;
• soit utiliser l'index de la valeur
26
espece ENUM('chat', 'chien')
Valeurs NULL ‘’ ‘chat’ ‘chien’
Index NULL 0 1 2
27. Création de tables
• Données textuelles:
• SET :
• Une colonne SET est en effet une colonne qui permet de stocker une chaîne de caractères
dont les valeurs possibles sont prédéfinies par l'utilisateur.
• La différence avec ENUM, c'est que l'on peut stocker dans la colonne plusieurs valeurs.
• On pourra stocker dans cette colonne :
• '' (chaîne vide ) ;
• 'chat';
• ‘chien' ;
• 'chat,chien’;
27
espece SET('chat', 'chien')
SET et ENUM sont des types propres à MySQL.
28. Création de tables
• Données temporelles:
• Quelques types temporels de MySQL : DATE, DATETIME, TIME et YEAR.
• Les vérifications faites par MySQL sont des verifications de base : le jour doit être compris entre 1 et 31
et le mois entre 1 et 12. NB: la date 30 Février est aussi acceptable.
• Date:
• Pour entrer une date, l'ordre des données est la seule contrainte.
• Il faut donner d'abord l'année (2 ou 4 chiffres), ensuite le mois (2 chiffres) , et, pour finir, le jour (2
chiffres), sous forme de nombre ou de chaîne de caractères.
• S'il s'agit d'une chaîne de caractères, n'importe quelle ponctuation peut être utilisée comme délimiteur.
28
• 'AAAA%MM%JJ'
• AAAAMMJJ (nombre)
• AAMMJJ (nombre)
• 'AAAA-MM-JJ' (c'est sous ce format-ci qu'une DATE est stockée dans MySQL)
• 'AAMMJJ'
• 'AAAA/MM/JJ'
• 'AA+MM+JJ'
29. Création de tables
• Données temporelles:
• DateTime :
• Ce type permet de stocker une heure, en plus d'une date.
• Pour la date, année-mois-jour, et pour l'heure, il faut donner d'abord l'heure, ensuite les
minutes, puis les secondes.
• Si l'on utilise une chaîne de caractères, il faut séparer la date et l'heure par une espace.
• Quelques exemples corrects :
29
• 'AAAA-MM-JJ HH:MM:SS' (c'est sous ce format-ci qu'un DATETIME est stocké dans
MySQL)
• 'AA*MM*JJ HH+MM+SS'
• AAAAMMJJHHMMSS (nombre)
30. Création de tables
• Données temporelles:
• Time :
• Il faut d'abord donner l'heure, puis les minutes, puis les seconds
• Chaque partie pouvant être séparée des autres par le caractère :
• Exemples:
30
• 'HH:MM:SS'
• 'HHH:MM:SS'
• 'MM:SS'
• 'HHMMSS'
• HHMMSS
31. Création de tables
• Données temporelles:
• Year :
• Un type à utiliser si besoin de stocker juste l’année.
• Il ne prend qu'un seul octet en mémoire.
• On ne peut y stocker que des années entre 1901 et 2155.
• On peut entrer une donnée de type YEAR sous forme de chaîne de caractères ou d'entiers,
avec 2 ou 4 chiffres.
31
32. Création de tables
• La syntaxe générale pour créer une table est la suivante :
• Pour chaque colonne, il est également possible de définir des options telles que :
• NOT NULL : empêche d’enregistrer une valeur nulle pour une colonne.
• DEFAULT : attribuer une valeur par défaut si aucune données n’est indiquée pour cette
colonne lors de l’ajout d’une ligne dans la table.
• PRIMARY KEY : indiquer si cette colonne est considérée comme clé primaire pour un index.
32
CREATE TABLE nom_de_la_table (
colonne1 type_donnees PRIMARY KEY,
colonne2 type_donnees NOT NULL,
colonne3 type_donnees DEFAULT valeur,
colonne4 type_donnees
);
33. Création de tables
• Exemple:
33
CREATE TABLE utilisateur (
id INT PRIMARY KEY NOT NULL,
nom VARCHAR(100),
prenom VARCHAR(100),
email VARCHAR(255),
date_naissance DATE
);
CREATE TABLE nom_de_la_table (
colonne1 type_donnees PRIMARY KEY,
colonne2 type_donnees NOT NULL,
colonne3 type_donnees DEFAULT valeur,
colonne4 type_donnees
);
34. Création de tables
• Clé Primaire :
• La clé primaire d'une table est une contrainte d'unicité, composée d'une ou plusieurs
colonnes.
• La clé primaire d'une ligne permet d'identifier de manière unique cette ligne dans la table.
34
CREATE TABLE nom_de_la_table (
colonne1 type_donnees,
colonne2 type_donnees,
colonne3 type_donnees,
colonne4 type_donnees,
PRIMARY KEY(colonne1) ou PRIMARY KEY(colonne1, colonne2)
);
35. Création de tables
• Auto-incrémentation:
• Il est possible de declarer que les valeurs d’une colonne s’auto-incrémente en utilisant le mot
clé AUTO_INCREMENT.
35
CREATE TABLE nom_de_la_table (
colonne1 type_donnees PRIMARY KEY AUTO_INCREMENT,
colonne2 type_donnees,
colonne3 type_donnees,
colonne4 type_donnees,
);
36. Création de tables
• Clé Etrangère :
• Les clés étrangères ont pour fonction principale la vérification de l'intégrité de votre base.
• Il est possible de declarer des clés étrangères composites.
36
CREATE TABLE nom_de_la_table (
colonne1 type_donnees,
colonne2 type_donnees,
colonne3 type_donnees,
CONSTRAINT nom_ctr FOREIGN KEY(colonne2) REFERENCES table2(colonneX)
);
Conditions:
• ColonneX doit être une clé primaire ou un index
• ColonneX et colonne2 doivent être exactement du même type
37. • Pour supprimer une table:
• Pour verification:
• SHOW DATABASES;
• SHOW TABLES;
• DESCRIBE ma_table;
• Autre possibilité de création de table:
Suppression d’une table
DROP TABLE ma_table;
37
CREATE TABLE ma_table LIKE autre_table ;
CREATE TABLE ma_table AS SELECT * FROM autre_table ;
Copie la structure uniquement
Copie Structure et Contenu
39. • Différents types de modifications sont possibles sur :
• La table
• Les Colonnes
• Les Contraintes
Modification d’une table
ALTER TABLE nom_table
Instructions;
39
Table Renommer
Colonne Ajouter / Supprimer / Modifier / Renommer
Contraintes Ajouter / Supprimer
40. Modification d’une table
ALTER TABLE nom_table RENAME ………; -- Renommer une table
ALTER TABLE nom_table ADD ………; -- Ajouter une colonne ou une contrainte
ALTER TABLE nom_table DROP ………; -- Supprimer une colonne ou une contrainte
ALTER TABLE nom_table CHANGE ………; -- Remplacer une colonne par une autre
ALTER TABLE nom_table MODIFY ………; -- Modifier la description d’une colonne
40
41. Renommer une table
• La commande à utiliser pour changer le nom d’une table est la suivante:
• Il y a plusieurs formes d’écriture de cet instruction:
41
ALTER TABLE nom_table
RENAME TO nouveau_nom;
ALTER TABLE nom_table RENAME nouveau_nom;
RENAME TABLE nom_table TO nouveau_nom;
RENAME TABLE table_1 TO nouveau_nom_1 ,
table_2 TO nouveau_nom_2 ;
42. Ajout et Suppression d’une colonne
• Pour l’ajout d’une colonne, on utilise la syntaxe:
• Pour la suppression d’une colonne:
• Le mot ”Column” est facultatif
42
ALTER TABLE nom_table
ADD [Column] nom_colonne type options;
ALTER TABLE nom_table
DROP [Column] nom_colonne;
43. Modification d’une colonne
• Pour renommer une colonne:
• Pour modifier la description d’une colonne:
43
ALTER TABLE nom_table
RENAME COLUMN nom_colonne TO nouveau_nom;
ALTER TABLE nom_table
CHANGE nom_colonne nouveau_nom Type Options;
ALTER TABLE nom_table
MODIFY nom_colonne nouveau_Type Options;
RENAME Change le nom d’une colonne uniquement
CHANGE Change le nom et/ou la définition d’une colonne
MODIFY Change la définition de la colonne et pas le nom
44. Manipulation des contraintes
• Pour ajouter une contrainte:
• Clé étrangère:
• Clé primaire:
44
ALTER TABLE nom_table
ADD [CONSTRAINT nom_contrainte] definition_contrainte;
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte FOREIGN KEY(…) REFERENCES …(…) ;
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte PRIMARY KEY(…); /*Le nom est inutile*/
ALTER TABLE nom_table
ADD PRIMARY KEY(…);
Le nom de la contrainte est très utile lors de la suppression de la clé étrangère
45. Manipulation des contraintes
• Pour supprimer une contrainte:
• Clé étrangère:
• Clé primaire:
45
ALTER TABLE nom_table
DROP CONSTRAINT nom_contrainte;
ALTER TABLE nom_table
DROP CONSTRAINT nom_contrainte;
ALTER TABLE nom_table
DROP PRIMARY KEY;
ALTER TABLE nom_table
DROP KEY nom_contrainte;
46. Manipulation des contraintes
• CHECK:
• Valeur par défaut:
46
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte CHECK(expr);
ALTER TABLE nom_table
ALTER nom_colonne
SET DEFAULT valeur;
ALTER TABLE nom_table
DROP CONSTRAINT nom_contrainte;
ALTER TABLE nom_table
ALTER nom_colonne
DROP DEFAULT;
48. Manipulation des Données
• Opérations possibles sur les données:
• Insertion
• Suppression
• Modification
48
INSERT INTO……;
DELETE FROM……;
UPDATE ……;
49. Manipulation des Données
• Insertion d’enregistrements :
• Insertion en précisant une valeur pour chaque colonne de la ligne.
• Insertion en précisant les valeurs de certaines colonnes de la ligne.
49
INSERT INTO nom_table [(colonne1, colonne2,…)]
VALUES (valeur1, valeur2,…);
INSERT INTO nom_table
VALUES (valeur1, valeur2,…); /* NULL et DEFAULT sont aussi des valeurs
INSERT INTO nom_table (colonne3, colonne5)
VALUES (valeur3, valeur5);
50. Manipulation des Données
• Insertion d’enregistrements :
• Insertion multiple:
• Syntaxe propre à MySQL (Ne fait pas partie du langage SQL):
• + : Plus lisible
• - : Ne permet pas une insertion multiple
• - : Si on migre vers un autre SGBD, requête INSERT doivent être réecrites.
50
INSERT INTO nom_table [(colonne1, colonne2,…)]
VALUES (valeur1, valeur2,…),
(valeur1_1, valeur2_1,…),
(valeur1_2, valeur2_2,…);
INSERT INTO nom_table
SET colonne3 = valeur3, colonne5 = valeur5,…;
51. Manipulation des Données
• Suppression d’enregistrements :
• L’instruction permet de supprimer toutes les lignes satisfaisant la condition.
• Si aucune condition n’est spécifiée, toutes les lignes seront supprimés.
• Opérateurs supportées :
51
DELETE FROM nom_table
WHERE condition;
= <> != <
> <= >= IN
BETWEEN…AND LIKE ’…’ IS NULL IS NOT NULL
AND OR NOT XOR
52. Manipulation des Données
• Modification d’enregistrements :
• La modification est apportée à toutes les lignes satisfaisant la condition.
• Si aucune condition n’est spécifiée, toutes les lignes seront modifiées.
52
UPDATE nom_table
SET colonneA = valeurA, colonneB = valeurB,…
WHERE condition;
53. Manipulation des Données
• Importation et Exportation d’une Base de donnée:
• Exportation d’une Base de donnée:
• Importation d’une Base de donnée:
Il faut que la base de données soit créée avant l’éxecution de la commande shell.
• Execution d’un script SQL:
53
$ mysqldump –u username –p DBname > DBfilename.sql
$ mysql –u username –p DBname < DBfilename.sql
SOURCE path/DBfilename.sql
55. Interrogation des Données
• Syntaxe du SELECT :
• Permet d’afficher les données de la table.
• Pour récupérer toutes les colonnes d’une table, on peut utiliser un *.
• Permet aussi d’afficher le résultat de quelques opérations.
• Les opérations peuvent être effectuées sur les données d’une table.
55
SELECT colonne1, colonne2,……
FROM nom_table;
SELECT ‘Bonjour à tous';
SELECT 1+4;
56. Interrogation des Données
• Syntaxe du SELECT :
• Pour éliminer les doublons:
• Restreindre les résultats à l’aide de LIMIT; Elle admet deux options:
• le nombre de lignes que l'on veut récupérer ;
• le decalage qui indique à partir de quelle ligne on récupère les résultats.
56
SELECT colonne1, colonne2,……
FROM nom_table
LIMIT nombre_de_lignes [OFFSET decalage];
SELECT DISTINCT colonne1
FROM nom_table;
SELECT *
FROM etudiant
LIMIT 10;
57. Interrogation des Données
• Syntaxe du SELECT :
• Pour éliminer les doublons:
• La clause ORDER BY permet d’ordonner le résultat à l’affichage.
57
SELECT colonne1, colonne2,……
FROM nom_table
ORDER BY colonne1 [DESC], colonne2 [ASC];
SELECT DISTINCT colonne1
FROM nom_table;
58. Interrogation des Données
• Fonctions d’agrégation :
• Ces fonctions agissent sur une colonne et renvoient un résultat unique pour toutes les lignes
sélectionnées
• Il existe plusieurs fonctions d’agrégation:
• COUNT()
• MIN()
• MAX()
• SUM()
• AVG()
• GROUP_CONCAT()
58
SELECT fct1(colonne1), fct2(colonne),…
FROM nom_table;
59. Interrogation des Données
• Regroupement :
• Calculer les fonctions d’agrégations selon les valeurs d’une colonne.
• Il est très utile de renommer les colonnes résultantes à l’affichage
59
SELECT fct1(colonne)
FROM nom_table
GROUP BY colonne;
SELECT colonne, fct1(colonne) AS nom_Affiché
FROM nom_table
GROUP BY colonne;
60. Interrogation des Données
• Regroupement :
• Pour appliquer des conditions sur le résultat d’un Regroupement.
• Il est conseillé d’utiliser la clause WHERE autant que possible.
• L’ordre des différents clauses est important.
60
SELECT fct1(colonne)
FROM nom_table
GROUP BY colonne
HAVING condition;
SELECT …
FROM …
WHERE …
GROUP BY …
HAVING …
ORDER BY …;
61. Interrogation des Données
• Jointure :
• Les jointures permettent d’utiliser plusieurs tables dans la même requête.
• Etant donné les deux tables :
Etudiant(CNE, nom, code_filiere*)
Filiere(Code, Intitulé, NoDept)
Quel est le résultat de la requête?
61
SELECT *
FROM Etudiant, Filiere;
62. Interrogation des Données
62
SELECT *
FROM Etudiant, Filiere;
CNE Nom Code_filiere
1234567 Ahmed SMI
8901234 Ali SMI
5678912 Mohammed SMA
Code Intitule NoDept
SMI Math Info 1
SMA Math Application 2
SMP Physique 3
Etudiant Filiere
CNE Nom Code_filiere Code Intitule NoDept
1234567 Ahmed SMI SMI Math Info 1
1234567 Ahmed SMI SMA Math Application 2
1234567 Ahmed SMI SMP Physique 3
8901234 Ali SMI SMI Math Info 1
8901234 Ali SMI SMA Math Application 2
8901234 Ali SMI SMP Physique 3
5678912 Mohammed SMA SMI Math Info 1
5678912 Mohammed SMA SMA Math Application 2
5678912 Mohammed SMA SMP Physique 3
Que faut il modifier dans cette requête
pour avoir des informations cohérentes ?
63. Interrogation des Données
63
SELECT *
FROM Etudiant, Filiere
WHERE Code_filiere = Code;
CNE Nom Code_filiere
1234567 Ahmed SMI
8901234 Ali SMI
5678912 Mohammed SMA
Code Intitule NoDept
SMI Math Info 1
SMA Math Application 2
SMP Physique 3
Etudiant Filiere
CNE Nom Code_filiere Code Intitule NoDept
1234567 Ahmed SMI SMI Math Info 1
1234567 Ahmed SMI SMA Math Application 2
1234567 Ahmed SMI SMP Physique 3
8901234 Ali SMI SMI Math Info 1
8901234 Ali SMI SMA Math Application 2
8901234 Ali SMI SMP Physique 3
5678912 Mohammed SMA SMI Math Info 1
5678912 Mohammed SMA SMA Math Application 2
5678912 Mohammed SMA SMP Physique 3
64. Interrogation des Données
• Jointure :
• Syntaxe:
• Colonne_A, Colonne_B sont les colonnes sur lesquelles se fait la jointure.
• Les clauses habituelles tel que GROUP BY, ORDER BY,…. sont toujours utilisables.
• Une autre syntaxe possible est la suivante:
• INNER indique le fait qu'il s'agit d'une jointure interne, mais c'est facultative.
• La clause ON sert à préciser la condition de la jointure 64
SELECT colonne,…,… ou * ou fct(…)
FROM TableA, TableB
WHERE ColonneA = ColonneB;
SELECT colonne,…,… ou * ou fct(…)
FROM TableA INNER JOIN TableB ON ColonneA = ColonneB;
65. Interrogation des Données
• Jointure :
• Il est possible d’utiliser plusieurs conditions pour lier les deux tables et aussi différentes opérateurs.
• Il est possible de faire plusieurs jointures dans la même requête. Dans ce cas il faudra spécifier les
conditions pour les tables deux à deux.
65
SELECT colonne,…,… ou * ou fct(…)
FROM TableA, TableB
WHERE ColonneA=ColonneB (logicOp) ColonneA2 (=,>,<,…) ColonneB2;
SELECT colonne,…,… ou * ou fct(…)
FROM TableA, TableB, TableC
WHERE ColonneA = ColonneB AND ColonneB2 = ColonneC;
SELECT colonne,…,… ou * ou fct(…)
FROM TableA
JOIN TableB ON ColonneA = ColonneB
JOIN TableC ON ColonneB2 = ColonneC;
66. Interrogation des Données
• Jointure :
• Il se peut qu’on a des colonnes portant le même nom dans les deux tables.
• Dans une telle situation, il faut indiquer d’où provient chaque colonne.
66
SELECT colonne,…,… ou * ou fct(…)
FROM TableA, TableB
WHERE TableA.Colonne = TableB.Colonne;
67. Interrogation des Données
• Jointure :
• Si la requête est trop longue, utiliser des alias.
67
SELECT …
FROM TableA AS TA, TableB TB
WHERE TA.Colonne = TB.Colonne;
SELECT …
FROM TableA JOIN TableB USING(Colonne);
SELECT …
FROM TableA NATURAL JOIN TableB ;
68. Interrogation des Données
• Jointure interne et Jointure externe :
• Les jointures que nous avons vu jusqu’à maintenant sont des jointures internes.
• Une jointure interne exige de ne retourner que les lignes respectant la condition de jointure.
• Une jointure externe permet de retourner également les enregistrements pour lesquelles il n’y a pas de
correspondence dans l’autre table.
• Le mot clé OUTER, comme le INNER est facultatif.
68
SELECT …
FROM TableA LEFT OUTER JOIN TableB ON ColonneA = ColonneB;
SELECT …
FROM TableA RIGHT OUTER JOIN TableB ON ColonneA = ColonneB;
69. Interrogation des Données
• Jointure interne et Jointure externe :
69
INNER JOIN
FULL JOIN
LEFT JOIN
RIGHT JOIN
SELECT *
FROM A CROSS JOIN B;
CROSS JOIN
SELECT *
FROM A, B;
70. Interrogation des Données
• Auto-Jointure :
• Il est parfois utile de faire une jointure de la table avec elle même
70
SELECT …
FROM TableA JOIN TableA
ON ColonneA = ColonneB;
SELECT …
FROM TableA A1, TableA A2
WHERE A1.ColonneA = A2.ColonneB;
71. Interrogation des Données
• Sous requêtes :
• Le langage SQL supporte l’imbrication des requêtes sur plusieurs niveaux.
• Une sous-requête: une requête executée à l’intérieur d’une autre.
• L’imbrication est supportée au niveau des requêtes de type:
• SELECT
• INSERT
• UPDATE
• DELETE
• …
• Nous allons traiter l’imbrication au niveau des requêtes de type SELECT.
71
72. Interrogation des Données
• Sous requêtes :
• Au niveau d’une requête SELECT, il est possible d’imbriquer une sous requêtes au niveau des
clauses:
• FROM
• WHERE
• HAVING
• Imbrication au niveau du FROM:
72
SELECT …
FROM (SELECT …
FROM …
…) AS nom_table_intermediaire
WHERE …
GROUP BY …
HAVING …
ORDER BY …;
Le résultat d’un SELECT est une table
sur laquelle nous pouvons exécuter des
requêtes.
Règles:
- Parenthèses et Alias obligatoires
73. Interrogation des Données
• Sous requêtes :
• Imbrication au niveau du WHERE et du HAVING:
• Les sous requêtes auxquels nous pouvons faire appel au niveau d’une condition doivent
renvoyées soit:
• Une ligne, ou
• Une colonne, ou
• Une valeur
• Les sous requêtes renvoyés
Une table ne peuvent être imbriqués
qu’au niveau de la clause FROM.
73
SELECT …
FROM …
WHERE … (SELECT …
FROM …
…)
GROUP BY …
HAVING …(SELECT …
FROM …
…)
ORDER BY …;
74. Interrogation des Données
• Sous requêtes :
• Imbrication au niveau du WHERE et du HAVING:
74
SELECT …
FROM …
WHERE colonne = (SELECT id_Colonne
FROM …);
Ex: Requête renvoyant une valeur
Opérateurs: =, <, >, <=, >=, <>, !=, <=>
SELECT …
FROM …
WHERE (col1, col2) = (SELECT (ColA, ColB)
FROM …);
Ex: Requête renvoyant une ligne
Opérateurs: =, <>, !=
SELECT …
FROM …
WHERE col1 IN (SELECT ColA
FROM …);
Ex: Requête renvoyant une colonne
Opérateurs: IN , NOT IN, < ANY, < ALL,
> ANY, > ALL, <> ALL
75. Interrogation des Données
• Sous requêtes :
• Sous requêtes corrélées:
• Une sous-requête corrélée est une sous-requête qui fait référence à une colonne (ou une table) qui
n'est pas définie dans sa clause FROM, mais bien ailleurs dans la requête dont elle fait partie.
• Si MySQL rencontre une table inconnue dans une sous-requête, il va aller chercher dans
les niveaux supérieurs uniquement si cette table existe.
75
SELECT col1
FROM table1
WHERE col1 = (SELECT col2
FROM table2
WHERE table1.col1 = col2);
76. Interrogation des Données
• Sous requêtes :
• EXISTS et NOT EXISTS:
• Syntaxe:
• La condition EXISTS est vraie si la sous requête renvoie une résultat différent de NULL.
• La condition NOT EXISTS est vraie si la sous requête renvoie NULL.
76
SELECT …
FROM tables
WHERE EXISTS (sous requête);
77. Interrogation des Données
• Sous requêtes :
• L’imbrication est supportée au niveau des requêtes : INSERT, UPDATE, DELETE
77
INSERT INTO nom_table (colonne1, colonne2, ...)
SELECT colonne1, colonne2, ...
FROM nom_table2 …;
UPDATE nom_table
SET colonne1 = (sous requête)
WHERE colonne2 = (sous requête);
DELETE FROM nom_table
WHERE colonne2 = (sous requête);