• Aucun résultat trouvé

Faire des recherches dans une base de données (requêtes)

N/A
N/A
Protected

Academic year: 2022

Partager "Faire des recherches dans une base de données (requêtes)"

Copied!
64
0
0

Texte intégral

(1)

Faire des recherches dans une

base de données (requêtes)

(2)

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

(3)

Requêtes

Exemple : pour afficher la totalité d'une table :

SELECT * FROM patient;

(4)

Exemple : pour afficher un attribut (= une colonne) d'une table :

SELECT nom FROM patient;

(5)

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";

(6)

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;

(7)

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;

(8)

_ 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 :

(9)

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");

(10)

Pour éliminer les doublons : SELECT DISTINCT

(11)

Requêtes

Pour trier les résultats : ORDER BY attribut

ASC et DESC permettent d'indiquer l'ordre :

ascendant (par défaut) ou descendant

(12)
(13)

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

(14)

AVG() : moyenne MIN() : minimum MAX() : maximum SUM() : somme

COUNT() : compte le nombre de ligne

(15)

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;

(16)

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;

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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

(28)

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

(29)

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

(30)

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

(31)

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

(32)

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

(33)

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

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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 »

(41)

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

* *

(42)

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

(43)

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

(44)

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

(45)

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

(46)

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;

=>

(47)

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 !

(48)

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

(49)

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

(50)

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

(51)

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

(52)

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

(53)

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

(54)

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 !

(55)

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 !

(56)

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

(57)

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

(58)

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.

(59)

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

(60)

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 ?

(61)

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 ?

(62)

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).

(63)

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

(64)

laboratoire.

Écrire la requête SQL pour afficher la liste des glycémies du

patient Maurice Lefèbre, avec la date de chaque glycémie, et

en triant par date.

Références

Documents relatifs

Cliquer sur le lien « Tableau de bord », puis aller dans l’onglet « Cours » pour voir la liste des cours dont vous êtes gestionnaire. Cliquer sur le cours que vous voulez éditer..

En cas de redistribution du document ou d’une version dérivée, il doit être partagé à son tour sous licence Creative Commons BY SA. Le police cursive utilisée est « AA

Pour pouvoir ajouter ou supprimer une table à l’intérieur d’une base, il faut se trouver au niveau de la base dans l’arbo- rescence des entités sélectionnées. En

• Dans les différents types de jointure présentés ci-dessus, toutes les lignes de la première table qui n’ont pas de lignes dans la seconde table et qui vérifient la condition

 La clause LEFT JOIN permet de retourner toutes les entrées d’une première table avec, s’il y a correspondance, les entrées d’une deuxième, et NULL dans toutes les

Avec Likes(drinker, beer) et Frequents(drinker, bar), trouver les beers que Likes au moins un des clients du Joe’s Bar?.

Le SQL (Structured Query Language – langage de requêtes structuré) est un langage informatique de dialogue avec une base de données relationnelle.. Une requête est une question

[r]