Faire des recherches dans une
base de données (requêtes)
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
Requêtes
Exemple : pour afficher la totalité d'une table :
SELECT * FROM patient;
Exemple : pour afficher un attribut (= une colonne) d'une table :
SELECT nom FROM patient;
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";
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;
_ 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 :
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");
Pour éliminer les doublons : SELECT DISTINCT
Requêtes
Pour trier les résultats : ORDER BY attribut
ASC et DESC permettent d'indiquer l'ordre :
ascendant (par défaut) ou descendant
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
AVG() : moyenne MIN() : minimum MAX() : maximum SUM() : somme
COUNT() : compte le nombre de ligne
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;
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;
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
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
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
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
Exemple : dans quel service est monsieur X ?
SELECT ID_lit FROM patient WHERE nom = "X";
=> 2
SELECT service FROM lit WHERE ID = 2;
=> Pneumologie
ID service
1 Cardiologie 2 Pneumologie 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 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
Exemple : dans quel service est monsieur X ?
SELECT lit.service FROM patient, lit
WHERE patient.nom = "X" AND lit.ID = patient.ID_lit;
ID service
1 Cardiologie 2 Pneumologie 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
Exemple : dans quel service est monsieur X ?
SELECT lit.service FROM patient, lit
WHERE patient.nom = "X" AND lit.ID = patient.ID_lit;
ID service
1 Cardiologie 2 Pneumologie 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
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
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;
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 à 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
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;
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
Rechercher le nom latin du poisson zèbre
SELECT nom_latin FROM espece
WHERE nom = "Poisson zèbre";
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
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
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;
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
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
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;
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
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
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;
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
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
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;
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 »
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
* *
Quels sont les parasites de l'homme ?
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
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
Lister les noms des espèces parasites ?
ID nom nom_latin
1 Homme Homo sapiens
2 Palludisme Plasmodium falciparum
parasite
* *
ID_parasite ID_hote
2 1
2 35
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
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;
=>
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 !
Quel est la longueur de la plus longue séquence d'ADN ?
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
Quel est le nom du gène le plus long ?
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 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
Quel est l'espèce qui a le gène le plus long ?
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 ? 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
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 !
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
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
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.
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
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 ?
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).
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