Faire des recherches dans une base de données (requêtes)
73
Requêtes
Les bases de données relationnelles permettent de rechercher des données très rapidement dans un très grand volume de données
Pour effectuer une requête (= recherche) dans une base de données en SQL :
SELECT attribut_1, attribut_2, attribut_3,...
FROM table_1, table_2, table_3,...
WHERE condition;
WHERE condition est optionnel
SELECT retourne une table avec les résultats
74
Requêtes
Exemple : pour afficher la totalité d'une table : SELECT * FROM patient;
Requêtes
Exemple : pour afficher un attribut (= une colonne) d'une table :
SELECT nom FROM patient;
76
Requêtes
Exemple : pour rechercher seulement certaines lignes, il faut utiliser WHERE condition :
SELECT * FROM patient WHERE nom = "Lamy";
Pour avoir seulement certains attributs :
SELECT taille, poids FROM patient WHERE nom = "Lamy";
77
Requêtes
Exemple : pour rechercher les noms des patients de plus de 70 kg : SELECT nom FROM patient WHERE poids > 70;
Pour rechercher les noms des patients en surpoids (IMC > 27) :
SELECT nom FROM patient WHERE poids / (taille * taille) > 0.0027;
Requêtes
Pour rechercher la valeur NULL, on utilise IS NULL
Pour rechercher des valeurs autres que NULL, on utilise IS NOT NULL Exemple : pour rechercher les noms des patients en ambulatoire (= sans lit) :
SELECT nom FROM patient WHERE ID_lit IS NULL;
79
Requêtes
LIKE permet de rechercher des motifs dans des chaînes de caractères :
% remplace zéro, un ou plusieurs caractères _ remplace un et un seul caractère
[…] restreint à certains caractères (ex : [0-9] pour un chiffre) Exemple : pour rechercher les patients dont le nom commence par Ben : SELECT * FROM patient WHERE nom LIKE "Ben%";
LIKE fonctionne aussi sur les dates !
Exemple : pour rechercher les patients nés en Février :
80
Requêtes
IN permet de rechercher une valeur parmi un ensemble de valeurs possibles (plusieurs noms,...)
Exemple : pour rechercher les patients dont le nom est X ou Y :
SELECT * FROM patient WHERE nom IN ("X", "Y");
Requêtes
Pour éliminer les doublons : SELECT DISTINCT
82
Requêtes
Pour trier les résultats : ORDER BY attribut ASC et DESC permettent d'indiquer l'ordre : ascendant (par défaut) ou descendant
83
Requêtes
Requêtes
Opérations :
+, -, * (multiplication), / (division)
+ permet aussi de concaténer des chaînes de caractères
Ex : "La" + "my"
Comparaisons :
=, >, <, >= (supérieur ou égal),
<= (inférieur ou égal), != (différent de) LIKE
IN
Opérateurs logiques : AND, OR, NOT
85
Requêtes
SQL propose aussi plusieurs fonctions : AVG() : moyenne
MIN() : minimum MAX() : maximum SUM() : somme
COUNT() : compte le nombre de ligne
86
Requêtes
Lorsque l'on utilise les fonctions COUNT(x), AVG(x), MIN(x), MAX(x) ou SUM(x), GROUP BY permet de grouper ensembles les lignes ont un attribut en commun
Exemple : rechercher le nombre de lit par service : SELECT service, COUNT(ID) FROM lit
GROUP BY service;
Requêtes
Autres fonctions SQL :
ROUND(x) : arrondi un nombre à l'entier le plus proche CURRENT_DATE() : retourne la date d'aujourd'hui
GREATEST(x, y, z,...) : retourne la plus grande valeur parmi x, y, z,...
LEAST(x, y, z,...) : retourne la plus petite valeur parmi x, y, z,...
LENGTH(texte) : retourne le nombre de caractères d'une chaîne de caractère
UPPER(texte) : retourne une chaîne de caractères en majuscule LOWER(texte) : retourne une chaîne de caractères en minuscule SUBSTR(texte, debut, longueur) : retourne une partie d'une chaîne de caractères, en commençant à debut et en prenant longueur caractères
NB cela marche aussi sur les dates : ex pour afficher les années de naissance :
SELECT SUBSTR(date_de_naissance, 1, 4) FROM patient;
88
Requêtes
Quel est le poids moyen des patients ?
Table patient
Identifiant Nom Date de
naissance Taille Poids
1 LAMY 18/06/1979 170 62
2 X 25/03/1957 165 54,5
3 Y 04/01/1982 180 90
89
Requêtes
Quel est le poids moyen des patients ? SELECT AVG(poids) FROM patient;
Table patient
Identifiant Nom Date de
naissance Taille Poids
1 LAMY 18/06/1979 170 62
2 X 25/03/1957 165 54,5
3 Y 04/01/1982 180 90
Requêtes
Quel est le poids moyen des patients, en séparant les hommes et les femmes ?
Table patient
Identifiant Nom Sexe Date de
naissance Taille Poids
1 LAMY Homme 18/06/1979 170 62
2 X Femme 25/03/1957 165 54,5
3 Y Homme 04/01/1982 180 90
91
Requêtes
Quel est le poids moyen des patients, en séparant les hommes et les femmes ?
SELECT sexe, AVG(poids) FROM patient GROUP BY sexe;
Table patient
Identifiant Nom Sexe Date de
naissance Taille Poids
1 LAMY Homme 18/06/1979 170 62
2 X Femme 25/03/1957 165 54,5
3 Y Homme 04/01/1982 180 90
92
Requêtes avec jointure
Pour l'instant nous n'avons fait que des recherches à l'intérieur d'une seule table !
Pour faire des recherches sur deux tables (ou plus) qui ont une relation, il faut faire des jointures entre les tables Exemple : dans quel service est monsieur X ?
=> on a besoin de regarder la table patient et la table lit
Table lit ID service 1 Cardiologie 2 Pneumologie Table patient
ID nom date_de_
naissance ID_lit
1 X 18/06/1979 2
2 Y 25/03/1957 7
3 Z 04/01/1982 1
Requêtes avec jointure
Exemple : dans quel service est monsieur X ? SELECT ID_lit FROM patient WHERE nom = "X";
=> 2
SELECT service FROM lit WHERE ID = 2;
=> Pneumologie
Table lit ID service 1 Cardiologie 2 Pneumologie Table patient
ID nom date_de_
naissance ID_lit
1 X 18/06/1979 2
2 Y 25/03/1957 7
3 Z 04/01/1982 1
94
Requêtes avec jointure
Exemple : dans quel service est monsieur X ? SELECT lit.service
FROM patient, lit
WHERE patient.nom = "X" AND lit.ID = patient.ID_lit;
Table lit ID service 1 Cardiologie 2 Pneumologie Table patient
ID nom date_de_
naissance ID_lit
1 X 18/06/1979 2
2 Y 25/03/1957 7
3 Z 04/01/1982 1
95
Requêtes avec jointure
Exemple : dans quel service est monsieur X ? SELECT lit.service
FROM patient, lit
WHERE patient.nom = "X" AND lit.ID = patient.ID_lit;
Table lit ID service 1 Cardiologie 2 Pneumologie Table patient
ID nom date_de_
naissance ID_lit
1 X 18/06/1979 2
2 Y 25/03/1957 7
3 Z 04/01/1982 1
On a besoin des tables patient et lit
Requêtes avec jointure
Exemple : dans quel service est monsieur X ? SELECT lit.service
FROM patient, lit
WHERE patient.nom = "X" AND lit.ID = patient.ID_lit;
Table lit ID service 1 Cardiologie 2 Pneumologie Table patient
ID nom date_de_
naissance ID_lit
1 X 18/06/1979 2
2 Y 25/03/1957 7
3 Z 04/01/1982 1
On recherche le service du lit
97
Requêtes avec jointure
Exemple : dans quel service est monsieur X ? SELECT lit.service
FROM patient, lit
WHERE patient.nom = "X" AND lit.ID = patient.ID_lit;
Table lit ID service 1 Cardiologie 2 Pneumologie Table patient
ID nom date_de_
naissance ID_lit
1 X 18/06/1979 2
2 Y 25/03/1957 7
3 Z 04/01/1982 1
Le nom du patient est X ET Le lit est celui du patient
98
Requêtes avec jointure
Rechercher toutes les séquences de gènes dans le génome humain
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
Requêtes avec jointure
Rechercher toutes les séquences de gènes dans le génome humain
SELECT gene.sequence FROM espece, gene
WHERE espece.nom = "Homme" AND gene.ID_espece = espece.ID;
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
100
Requêtes avec jointure
Rechercher à quelles espèces appartient le gène BMP2
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
101
Requêtes avec jointure
Rechercher à quelles espèces appartient le gène BMP2
SELECT espece.nom FROM espece, gene
WHERE gene.nom = "BMP2" AND gene.ID_espece = espece.ID;
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
Requêtes avec jointure
Rechercher le nom latin du poisson zèbre
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
103
Requêtes avec jointure
Rechercher le nom latin du poisson zèbre
SELECT nom_latin FROM espece
WHERE nom = "Poisson zèbre";
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
104
Requêtes avec jointure
Pour les relations *-*, il faut faire la jointure sur 3 tables
Dans quels environnements vit l'être humain ?
Table espèce Table environnement
ID nom nom_latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
ID nom 1 Forêt
tropicale 2 Mangrove ID_espece ID_environnement
1 1
1 2
2 2
Table habite
Requêtes avec jointure
Dans quels environnements vit l'être humain ?
SELECT environnement.nom FROM espece, environnement, habite WHERE espece.nom = "Homme"
AND habite.ID_espece = espece.ID
AND environnement.ID = habite.ID_environnement ;
Table espèce Table environnement
ID nom nom_latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
ID nom 1 Forêt
tropicale 2 Mangrove ID_espece ID_environnement
1 1
1 2
2 2
Table habite
106
Requêtes avec jointure
Quelles sont les espèces qui vivent dans la mangrove ?
Table espèce Table environnement
ID nom nom_latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
ID nom 1 Forêt
tropicale 2 Mangrove ID_espece ID_environnement
1 1
1 2
2 2
Table habite
107
Requêtes avec jointure
Quelles sont les espèces qui vivent dans la mangrove ?
SELECT espece.nom
FROM espece, habite, environnement WHERE environnement.nom = "Mangrove"
AND habite.ID_environnement = environnement.ID AND habite.ID_espece = espece.ID;
Table espèce Table environnement
ID nom nom_latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
ID nom 1 Forêt
tropicale 2 Mangrove ID_espece ID_environnement
1 1
1 2
2 2
Table habite
Requêtes avec jointure
Quel est le nombre d'espèces qui vivent dans chaque environnement ?
Table espèce Table environnement
ID nom nom_latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
ID nom 1 Forêt
tropicale 2 Mangrove ID_espece ID_environnement
1 1
1 2
2 2
Table habite
109
Requêtes avec jointure
Quel est le nombre d'espèces qui vivent dans chaque environnement ?
SELECT environnement.nom, COUNT(habite.ID_espece) FROM habite, environnement
WHERE habite.ID_environnement = environnement.ID GROUP BY environnement.ID;
Table espèce Table environnement
ID nom nom_latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
ID nom 1 Forêt
tropicale 2 Mangrove ID_espece ID_environnement
1 1
1 2
2 2
Table habite
110
Requêtes avec jointure
Cas des relations au sein d'une même table
Quel est le nom de la femme de monsieur Roméo ? Il y a une seule table, mais la recherche porte sur deux patients : Roméo et sa femme !
Table patient
est_marié_à
1 1
ID Nom Date de
naissance Taille ID_conjoint
1 Lamy 18/06/1979 170 NULL
2 Juliette 25/03/1957 165 3
3 Roméo 04/01/1955 180 2
Requêtes avec jointure
Quel est le nom de la femme de monsieur Roméo ?
SELECT femme.nom
FROM patient mari, patient femme WHERE mari.nom = "Roméo"
AND mari.ID_conjoint = femme.ID;
Table patient
est_marié_à
1 1
ID Nom Date de
naissance Taille ID_conjoint
1 Lamy 18/06/1979 170 NULL
2 Juliette 25/03/1957 165 3
3 Roméo 04/01/1955 180 2
On travaille sur deux lignes de la table patient : on appelle ces deux lignes « mari » et « femme »
112
Requêtes avec jointure
Quels sont les parasites de l'homme ?
Table espèce
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
113
Requêtes avec jointure
Quels sont les parasites de l'homme ?
Table espèce
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
Table parasitisme ID_parasite ID_hote
2 1
2 35
Requêtes avec jointure
Quels sont les parasites de l'homme ?
SELECT parasite.nom
FROM espece parasite, espece hote, parasitisme WHERE hote.nom = "Homme"
AND parasitisme.ID_hote = hote.ID AND parasitisme.ID_parasite = parasite.ID;
Table espèce
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
Table parasitisme ID_parasite ID_hote
2 1
2 35
115
Requêtes avec jointure
Lister les noms des espèces parasites ?
Table espèce
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
Table parasitisme ID_parasite ID_hote
2 1
2 35
116
Requêtes avec jointure
Lister les noms des espèces parasites ?
SELECT DISTINCT parasite.nom FROM espece parasite, parasitisme
WHERE parasitisme.ID_parasite = parasite.ID;
Table espèce
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
Table parasitisme ID_parasite ID_hote
2 1
2 35
Sous-requêtes
Il est possible d'imbriquer plusieurs requêtes
Les requêtes imbriquées sont placées entre parenthèses Elles sont remplacées par la valeur qu'elles retournent Exemple :
Quel est le patient le plus gros ? SELECT MAX(poids) FROM patient;
=> 90
SELECT * FROM patient WHERE poids = 90;
=>
118
Sous-requêtes
Exemple :
Quel est le patient le plus gros ?
SELECT MAX(poids) FROM patient;
SELECT * FROM patient WHERE poids = 90;
SELECT * FROM patient WHERE poids = ( SELECT MAX(poids) FROM patient);
Attention, la sous-requête ne doit retourner qu'une seule valeur !
119
Sous-requêtes
Quel est la longueur de la plus longue séquence d'ADN ?
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
Sous-requêtes
Quel est la longueur de la plus longue séquence d'ADN ?
SELECT MAX(LENGTH(sequence)) FROM gene;
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
121
Sous-requêtes
Quel est le nom du gène le plus long ?
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
122
Sous-requêtes
Quel est le nom du gène le plus long ? SELECT nom FROM gene
WHERE LENGTH(sequence) =
(SELECT MAX(LENGTH(sequence)) FROM gene);
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
Sous-requêtes
Quel est l'espèce qui a le gène le plus long ?
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
124
Sous-requêtes
Quel est l'espèce qui a le gène le plus long ? SELECT espece.nom
FROM gene, espece
WHERE gene.ID_espece = espece.ID AND LENGTH(gene.sequence) =
(SELECT MAX(LENGTH(sequence)) FROM gene);
Table espèce Table gène
ID nom sequence ID_espece
1 Aldostérone
synthase atggcactca... 1 2 Enveloppe
du VIH tgtacaagaccc... 1
3 BMP2 gtccgctaa... 2
ID nom nom latin 1 Homme Homo sapiens 2 Poisson
zèbre Danio rerio
125
Mettre à jour des lignes
Pour mettre à jour ou modifier des lignes dans une table : UPDATE nom_de_la_table
SET attribut_1 = valeur_1,...
WHERE conditions;
Le WHERE fonctionne de la même manière que pour la commande SELECT
Exemple : Mettre à jour le poids et la taille d'un enfant dans la table patient :
UPDATE patient
SET taille = 154, poids = 51 WHERE nom = "Calvin";
Attention, si les conditions sont vérifiées pour plusieurs lignes,
toutes lignes vérifiant les conditions sont modifiées !
Supprimer des lignes
Pour supprimer des lignes dans une table : DELETE FROM nom_de_la_table
WHERE conditions;
Le WHERE fonctionne de la même manière que pour la commande SELECT
Exemple : Supprimer monsieur X de la table patient : DELETE FROM patient
WHERE nom = "X"
Attention, si les conditions sont vérifiées pour plusieurs lignes, toutes lignes vérifiant les conditions sont supprimées !
127
Permissions
Les SGBDR gèrent les permissions : Pour chaque utilisateur
Pour chaque colonne, chaque table et chaque base de données
Pour chaque type d'opération : lecture ( SELECT), mise à jour (UPDATE), création de table (CREATE TABLE),...
GRANT permet de donner des permissions et REVOKE de les retirer
GRANT ALL PRIVILEGES ON base_de_données TO utilisateur@machine
Généralement, l'administrateur système a tous les droits sur la base de données, et il accorde les permissions aux différents utilisateurs
128
Sauvegarder une base en SQL
Le programme mysqldump permet de convertir une base de données en un (gros !) fichier SQL
mysqldump nom_de_la_base_de_données > fichier.sql
Ce fichier SQL peut ensuite être exécuté par MySQL mysql < fichier.sql
Attention, ce sont des programmes à utiliser en ligne de commande Unix, ce ne sont pas des commandes SQL !
Idéal pour :
faire une sauvegarde (un « dump ») d'une base de données transférer une base d'un ordinateur à un autre
transférer une base d'un logiciel de SGBDR à un autre logiciel
Exercice 1
On a créé une base de données des différentes espèces d'orchidées (plus de 25 000 !) avec MySQL.
La base de données doit contenir des informations sur les espèces d'orchidées, les genres d'orchidées, et les milieux dans lesquels les orchidées poussent.
Pour chaque espèce d'orchidée, on souhaite pouvoir indiquer son nom, ainsi que les critères suivants utilisés pour les distinguer : couleur des fleurs, nombre d'étamine, présence de rhizome.
Les milieux peuvent être humides ou secs, ensoleillés ou non.
130
Exercice 1
id nom rhyzome nb_etamines couleur id_genre 1 Épipactis
des marais 1 1 pourpre 1
2 ...
id nom humide ensoleille
1 Marais 1 0
2 ...
id nom 1 Épipactis 2 ...
Table espece
Table genre
Table milieu
id_espece id_milieu
1 1
2 ...
Table pousse_dans
131
Exercice 1
La base de données a ensuite été remplie avec des données issues de différents livres de botanique.
Écrire les requêtes SQL pour répondre aux questions suivantes:
La vanille a-t-elle un rhizome ?
Quel est(sont) le(s) nom(s) d'une orchidée
pourpre avec un rhizome et 2 étamines ?
Combien y a-t-il d'orchidées dans la base ?
Quel est le plus grand nombre d'étamine
parmi les orchidées ?
Exercice 1
Écrire les requêtes SQL pour répondre aux questions suivantes:
À quel genre appartient la vanille ?
Quels sont les noms des orchidées du genre épipactis ? Quels sont les milieux ensoleillés et secs ?
Dans quel(s) milieu(x) pousse la vanille ?
135
Exercice 2
Nous avons construit une base de données pour un laboratoire d'analyses médicales. Ce laboratoire emploie plusieurs biologistes, qui effectuent des prélèvements chez des patients, et ensuite analysent ces prélèvements.
Les biologistes sont identifiés par leur nom et leur prénom, et les patients par leur nom, leur prénom et leur date de naissance.
Pour chaque analyse, la base doit indiquer le patient, le ou les biologistes, la date d'analyse, le nom de l'analyse et le résultat (sous forme de chiffre).
136
Exercice 2
id nom prenom
1 Durand Leïla
2 ...
id nom prenom date_de_naissance 1 Martin Lefèbre 1958-04-05 2 ...
Table biologiste
Table analyse
Table patient
id date nom resultat id_patient
1 2011/01/31 Glycémie 0,9 1
2 ...
id_biologiste id_analyse
1 1
2 ...
Table analyse_réalisé_par