• Aucun résultat trouvé

Bases de données

N/A
N/A
Protected

Academic year: 2021

Partager "Bases de données"

Copied!
11
0
0

Texte intégral

(1)

5.1

Chapitre V

Bases de données

1.

Description d’une base de données

1.1

Introduction

Chacun d’entre nous utilise quotidiennement, mais sans souvent en avoir conscience, des bases de données. Ces dernières regroupent des informations relatives à un domaine précis, souvent ordonnées sous une forme très structurée. Les exemples sont innombrables : gestion des stocks (magasins en ligne, bibliothèques, . . .), gestion des réservations (trains, avions, spectacles . . .), gestion du personnel d’une entreprise, création de listes diverses (vos playlists musicales préférées par exemple), etc.

Prenons l’exemple du site de réservation de la SNCF. Les clients peuvent réaliser un certain nombre de tâches, parmi lesquelles :

– la consultation des trains répondants à certains critères (date, trajet, places disponibles, etc) ; – la réservation d’une place dans le train choisi ;

– l’annulation d’une réservation.

Le personnel de la SNCF, outre les opérations précédentes, peut en outre : – modifier la composition ou les horaires des trains ;

– ajouter des trains supplémentaires ; – supprimer des trains.

À l’exception de la consultation, les autres opérations sont complexes car elles doivent gérer le principe de simultanéité qui régit les bases de données : plusieurs clients peuvent chercher à réserver en même temps des places dans le même train, et il ne s’agit pas d’attribuer la même place à plusieurs personnes différentes. Il en va de même de la suppression d’un train, qui doit tenir compte des personnes ayant déjà réservé dans celui-ci. C’est pourquoi nous nous limiterons, dans ce cours d’introduction aux bases de données, à la simple consultation des données.

1.2

Structure d’une base de données

L’accès à une base de données se fait usuellement par l’intermédiaire d’une application qui traduit les demandes de l’utilisateur (en général via une interface graphique) dans un langage dédié à la communication avec une base de données. Ce langage, le SQL (Structured Query Language) est devenu un standard disponible sur presque tous les systèmes de gestion des bases de données (SGBD).

SGBD SQL BDD

Utilisateur Utilisateur Utilisateur

Figure1 – Communication avec une base de données. Le SQL comporte des instructions relatives :

– à l’interrogation de bases de données ; – à la création et la modification des données ; – au contrôle d’accès des données.

Comme indiqué dans le préambule, nous nous intéresserons uniquement aux instructions de la première catégorie.

(2)

Dans la suite de ce cours j’utiliserai MySQL comme système de gestion pour interroger une base de données inti-tuléeworld.sql. Cette base de donnée contient un certain nombre d’informations géographiques et politiques mondiales (en 2001).

Commençons par observer son contenu :

mysql> show tables; +−−−−−−−−−−−−−−−−−+ | Tables_in_world | +−−−−−−−−−−−−−−−−−+ | city | | country | | countrylanguage | +−−−−−−−−−−−−−−−−−+

Une base de données est un ensemble detables (ou de relations, les deux termes étant synonymes dans ce contexte) que l’on peut représenter sous forme de tableaux bi-dimensionnels. Dans l’exemple qui nous intéresse, notre base de données est composée de trois tables :

– city, qui contient des informations relatives à certaines villes du monde ; – country, qui contient des informations relatives aux pays ;

– countrylanguage, qui contient des informations relatives aux langues parlées dans le monde. Examinons le contenu de la première, ou plutôt un extrait de son contenu qui est très important :

mysql> select * from city limit 10;

+−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | ID | Name | CountryCode | District | Population | +−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−+−−−−−−−−−−−−+

| 1 | Kabul | AFG | Kabol | 1780000 |

| 2 | Qandahar | AFG | Qandahar | 237500 |

| 3 | Herat | AFG | Herat | 186800 |

| 4 | Mazar−e−Sharif | AFG | Balkh | 127800 |

| 5 | Amsterdam | NLD | Noord−Holland | 731200 | | 6 | Rotterdam | NLD | Zuid−Holland | 593321 | | 7 | Haag | NLD | Zuid−Holland | 440900 | | 8 | Utrecht | NLD | Utrecht | 234323 | | 9 | Eindhoven | NLD | Noord−Brabant | 201843 | | 10 | Tilburg | NLD | Noord−Brabant | 193238 | +−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−+−−−−−−−−−−−−+

Nous pouvons constater qu’une table est un tableau bi-dimensionnel : les en-têtes des différentes colonnes sont appelés desattributs, les lignes des enregistrements. Ainsi, la tablecity possède 5 attributs :ID,Name (le nom d’une ville),CountryCode(le code du pays dans lequel se trouve cette ville),District(sa région d’appartenance) etPopulation(son nombre d’habitants).

Précisons maintenant les caractéristiques de chacun de ces attributs :

mysql> describe city;

+−−−−−−−−−−−−−+−−−−−−−−−−+−−−−−−+−−−−−+ | Field | Type | Null | Key | +−−−−−−−−−−−−−+−−−−−−−−−−+−−−−−−+−−−−−+ | ID | int | NO | PRI | | Name | char(35) | NO | | | CountryCode | char(3) | NO | | | District | char(20) | NO | | | Population | int | NO | | +−−−−−−−−−−−−−+−−−−−−−−−−+−−−−−−+−−−−−+

Nous constatons qu’un attribut est un objettypé (dans ce contexte, le type d’un attribut est son domaine).ID etPopulationsont des entiers,Nameune chaîne d’au plus 35 caractères,CountryCodeune chaîne d’au plus 3 caractères, etDistrictune chaîne d’au plus 20 caractères. Ces caractéristiques sont fixées lors de la création d’une table et influent sur les opérations que nous serons susceptibles de réaliser sur les valeurs de ces attributs :

(3)

+,−,*,*pour les entiers et les nombres flottants,=,<>,<,<=,>,>=pour les comparaisons (pour les chaînes de caractères, l’ordre lexicographique est utilisé).

La colonne suivante indique que tous les attributs doivent posséder une valeur ; enfin, la troisième colonne apporte une information importante : chaque enregistrement d’une table doit pouvoir être identifié de manière unique ; c’est le rôle de laclef primaire, constitué d’un ou plusieurs attributs. Ici, la clef primaire est constituée de l’unique attributID. Il ne peut donc y avoir deux enregistrements ayant le mêmeID.

Regardons maintenant le contenu de la tablecountry:

mysql> describe country;

+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−+

| Field | Type | Null | Key |

+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−+

| Code | char(3) | NO | PRI |

| Name | char(52) | NO | |

| Continent | enum('Asia','Europe','North America', | NO | |

| | 'Africa','Oceania','Antarctica','South America') | | |

| Region | char(26) | NO | |

| SurfaceArea | decimal(10,2) | NO | |

| IndepYear | smallint | YES | |

| Population | int | NO | |

| LifeExpectancy | decimal(3,1) | YES | |

| GNP | decimal(10,2) | YES | |

| GovernmentForm | char(45) | NO | |

| HeadOfState | char(60) | YES | |

| Capital | int | YES | |

+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−+−−−−−+ Ici, la clef primaire est l’attributCode, qui est une chaîne de trois caractères. On constate en outre que certaines données ne sont pas obligatoires : les attributsIndepYear,LifeExpectancy,GNP,HeadOfStateetCapital peuvent être absents, auquel cas la valeur qui leur est attribuée estNULL.

Voyons un extrait de cette table, par exemple l’enregistrement qui concerne la France :

mysql> select * from country where Name = 'France';

+−−−−−−+−−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−−−+ | Code | Name | Continent | Region | SurfaceArea | IndepYear | Population | +−−−−−−+−−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−−−+ | FRA | France | Europe | Western Europe | 551500.00 | 843 | 59225700 | +−−−−−−+−−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−+−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−+

| LifeExpectancy | GNP | GovernmentForm | HeadOfState | Capital | +−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−+ | 78.8 | 1424285.00 | Republic | Jacques Chirac | 2974 | +−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−+

Deux attributs sont remarquables : l’attributCode(clef primaire de la table) correspond à l’attributCountryCode de la tablecity. Cette remarque est importante car c’est elle qui nous permettra de chercher des informations croisées dans ces deux tables. L’attributCapitalest plus intriguant : pourquoi la capitale de la France est-elle désignée par un entier ? Il se trouve que cet attribut correspond à l’attributIDde la tablecity, comme on peut s’en convaincre en consultant l’enregistrement dont l’attributIDvaut2974:

mysql> select * from city where ID = 2974;

+−−−−−−+−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | ID | Name | CountryCode | District | Population | +−−−−−−+−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | 2974 | Paris | FRA | Île−de−France | 2125246 | +−−−−−−+−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ Regardons enfin le contenu de la troisième et dernière table :

(4)

mysql> describe countryLanguage;

+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−+−−−−−−+−−−−−+

| Field | Type | Null | Key |

+−−−−−−−−−−−−−+−−−−−−−−−−−−−−−+−−−−−−+−−−−−+ | CountryCode | char(3) | NO | PRI | | Language | char(30) | NO | PRI | | IsOfficial | enum('T','F') | NO | | | Percentage | decimal(4,1) | NO | | +−−−−−−−−−−−−−+−−−−−−−−−−−−−−−+−−−−−−+−−−−−+

Cette table décrit les langues utilisées dans les différents pays en précisant le pourcentage de locuteurs et si cette langue est officielle ou non. Une même langue peut être parlée dans différents pays, et dans un même pays plusieurs langues peuvent être pratiquées. Ainsi, aucun des attributs ne peut prétendre être une clef primaire, c’est pourquoi nous avons ici un couple d’attributs en guise de clef primaire : le couple (CountryCode, Language).

Ainsi, pour pouvoir efficacement interroger une base de données, il importe de connaître avec précision le contenu de chacune des tables, et les attributs qui vont nous permettre de les relier entre elles. Cet ensemble d’informations est appelé leschéma de la base de donnée ; celui de notre exemple est représenté figure 2.

Code Name Continent Region SurfaceArea IndepYear Population LifeExpectancy GNP GovernmentForm HeadOfState Capital country CountryCode Language IsOfficial Percentage countrylanguage ID Name CountryCode District Population city

Figure2 – le schéma de la base de donnéesworld.

2.

Requêtes SQL

Nous allons maintenant nous intéresser à la syntaxe des requêtes qui vont nous permettre d’interroger la base de données. Cette syntaxe est proche de la langue anglaise ; en général, la lecture d’une requête permet d’en comprendre le sens. Elle n’en reste pas moins assez rigide dans sa structure, et les mots clefs que nous allons utiliser doivent être rangés dans un ordre bien précis :

SELECT... FROM... WHERE...GROUP BY...HAVING... ORDER BY... LIMIT ... OFFSET...

Seuls les deux premiers (SELECTetFROM) sont indispensables, les autres sont optionnels, mais s’ils sont présents ils doivent être placés dans cet ordre.

Notons enfin que ces noms de commandes sont insensibles à la casse. Autrement dit, vous pouvez les écrire indifféremment en majuscules ou en minuscule.

(5)

2.1

Sélection des attributs et des enregistrements

On sélectionne un ou plusieurs attributs d’une table par la syntaxe : SELECT a1 , a2 , . . . , an FROM t a b l e

SELECT DISTINCT a1 , a2 , . . . , an FROM t a b l e

Le mot-clefDISTINCTpermet d’éviter l’apparition de doublons parmi les résultats obtenus.

En algèbre relationnelle, cette opération s’appelle uneprojection et se note π(A1,...,An)(R) où A1, . . . , Ansont

les attributs sélectionnés dans la relation R. R A B C a1 b1 c1 a2 b2 c2 a1 b1 c3 π(A,B)(R) A B a1 b1 a2 b2

Exemple. La liste des différentes langues présentes dans la base de donnéeworlds’obtient en écrivant :

mysql> SELECT DISTINCT Language FROM countrylanguage; +−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | Language | +−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | Dutch | | English | | Papiamento | | Spanish | ... | Bemba | | Chewa | | Lozi | | Nsenga | +−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 457 rows in set (0,00 sec)

457 langues sont présentes dans la base de données.

On sélectionne les enregistrements d’une table qui satisfont une expression logique par la syntaxe : SELECT * FROM t a b l e WHERE e x p r e s s i o n _ l o g i q u e

En algèbre relationnelle cette opération s’appelle unesélection et se note σE(R) où E est l’expression logique

et R une relation. R A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 σE(R) A B C a2 b2 c2 a4 b4 c4

Ces deux opérations peuvent bien entendu être combinées pour extraire de la table une sélection d’attributs et d’enregistrements :

SELECT a1 , . . . , an FROM t a b l e WHERE e x p r e s s i o n _ l o g i q u e ce qui se note en algèbre relationnelle : π(A1,...,An)(σE(R)).

(6)

mysql> SELECT Name, Population FROM city WHERE CountryCode = 'FRA'; +−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | Name | Population | +−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | Paris | 2125246 | | Marseille | 798430 | | Lyon | 445452 | | Toulouse | 390350 | ... | Argenteuil | 93961 | | Tourcoing | 93540 | | Montreuil | 90674 | +−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ 40 rows in set (0,00 sec)

Lerenommage permet la modification du nom d’un attribut d’une relation. Renommer l’attribut a en l’attribut b dans la relation R s’écrit ρa←b(R) en algèbre relationnelle et à l’aide du mot-clefASen SQL :

SELECT a AS b FROM t a b l e

La nécessité du renommage apparaîtra lorsque nous aborderons les sous-requêtes.

Filtrage des résultats

À la toute fin d’une requête il est possible de trier les résultats et de n’en renvoyer qu’une partie. Ces opérations se notent :

ORDER BYaASC/ DESCpour trier suivant l’attribut a par ordre croissant/décroissant ;LIMITn pour limiter la sortie à n enregistrements ;

OFFSETn pour débuter à partir du neenregistrement. Par exemple, les cinq villes mondiales les plus peuplées sont :

mysql> SELECT Name FROM city ORDER BY Population DESC LIMIT 5; +−−−−−−−−−−−−−−−−−+ | Name | +−−−−−−−−−−−−−−−−−+ | Mumbai (Bombay) | | Seoul | | São Paulo | | Shanghai | | Jakarta | +−−−−−−−−−−−−−−−−−+ et les cinq suivantes sont :

mysql> SELECT Name FROM city ORDER BY Population DESC LIMIT 5 OFFSET 5; +−−−−−−−−−−−−−−−−−−−+ | Name | +−−−−−−−−−−−−−−−−−−−+ | Karachi | | Istanbul | | Ciudad de México | | Moscow | | New York | +−−−−−−−−−−−−−−−−−−−+

(7)

Exercice 1

a. Rédiger une requête SQL donnant le nom des dix pays asiatiques les plus grands.

b. Rédiger une requête SQL donnant le nom et la date d’indépendance des dix pays les plus anciens. c. Rédiger une requête SQL donnant la liste des langues non officielles pratiquées en France, par ordre décroissant d’importance.

d. Rédiger une requête SQL donnant le nom des cinq pays européens les moins densément peuplés.

2.2

Jointures et sous-requêtes

Lajointure est une opération qui porte sur deux relations R1et R2et retourne une relation qui comporte les

enregistrements combinés de R1et de R2qui satisfont une contrainte logique E. Cette nouvelle relation se note

R1ZER2 .

En SQL on réalise une jointure par la requête :

SELECT * FROM t a b l e 1 JOIN t a b l e 2 ON e x p r e s s i o n _ l o g i q u e

R1 A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 R2 D E a1 e1 a2 e2 a2 e3 R1ZA=DR2 A B C D E a1 b1 c1 a1 e1 a2 b2 c2 a2 e2 a2 b2 c2 a2 e3

Seules les conditions d’égalité entre deux attributs figurent au programme.

Remarque. Deux tables reliées par une jointure peuvent posséder des attributs de même nom mais n’ayant rien à voir. C’est le cas par exemple de l’attributNameprésent dans les deux tablescityetcountry. Pour les distinguer lors d’une jointure il est nécessaire de faire précéder le nom de l’attribut par le nom de la table, séparé par un point. Par exemple, lors d’une jointure entre les deux tables de notre base de données exemple, le nom des villes est désigné parcity.nameet celui des pays parcountry.Name.

Notons que le mot-clefASpermet de renommer les tables ainsi que les attributs afin d’éviter d’écrire des noms à rallonge.

Exemple. Les deux tablescityetcountrypossèdent deux jointures naturelles :

– on peut identifier les attributscity.countryCodeetcountry.Code. Dans ce cas, la table résultante de la jointure possédera autant d’entrées que la tablecityet permettra de relier à chaque ville de la base les informations du pays auquel elle appartient ;

– on peut identifier les attributscity.IDetcountry.Capital. Dans ce cas, la table résultante de la jointure possédera autant d’entrées que la tablecountryet à chaque pays sera attaché les informations relatives à sa capitale. En revanche, les villes qui ne sont pas des capitales ne seront pas présentes dans cette jointure. Par exemple, si on souhaite connaître la capitale de l’Ouzbekistan et son nombre d’habitants on écrira :

mysql> SELECT city.Name, city.Population

-> FROM city JOIN country ON city.ID = country.Capital

-> WHERE country.Name = 'Uzbekistan'; +−−−−−−−−−+−−−−−−−−−−−−+

| Name | Population | +−−−−−−−−−+−−−−−−−−−−−−+ | Toskent | 2117500 | +−−−−−−−−−+−−−−−−−−−−−−+

(8)

Exercice 2

a. Rédiger une requête SQL donnant la liste des pays ayant adopté le Français parmi leurs langues officielles. b. Rédiger une requête SQL donnant les cinq villes les plus peuplées d’Europe.

c. Rédiger une requête SQL donnant les cinq villes les plus peuplées d’Europe parmi celles qui ne sont pas des capitales.

d. Rédiger une requête SQL donnant les capitales des pays dans lesquels l’allemand est langue officielle.

 Sous-requêtes

Revenons au problème consistant à déterminer la capitale de L’Ouzbekistan. Nous l’avons résolu à l’aide d’une jointure, mais il aurait aussi été possible de procéder à deux requêtes successives : une première requête pour déterminer l’identifiant de la capitale de l’Ouzbekistan, une seconde pour connaître le nom de cette ville. Il est possible d’imbriquer la première au sein de la seconde pour n’en faire qu’une seule ; on parle alors de sous-requête. Celle-ci doit impérativement être délimitée par des parenthèses, et peut être située :

– en lieu et place d’une table après leFROM;

– ou au sein d’une expression logique après leWHERE.

Par exemple, la détermination de la capitale de l’Ouzbekistan peut être obtenue par la requête :

mysql> SELECT city.Name FROM city

-> WHERE ID = (SELECT Capital FROM country WHERE name = 'Uzbekistan'); +−−−−−−−−−+ | Name | +−−−−−−−−−+ | Toskent | +−−−−−−−−−+ Exercice 3

Rédiger une requête SQL donnant la liste des pays dont l’espérance de vie est supérieure ou égale à celle de la France.

Notons enfin que lorsqu’une sous-requête prend la place d’une table, il est impératif de renommer les attributs de la sous-requête pour qu’ils soient utilisés dans la requête principale.

2.3

Fonctions d’agrégation

SQL possède un certain nombre de fonctions statistiques (voir la liste figure 3) qui par défaut s’appliquent à l’ensemble des enregistrements sélectionnés par la clause duWHERE.

COUNT( ) nombre d’enregistrements MAX( ) valeur maximale d’un attribut MIN( ) valeur minimale d’un attribut SUM( ) somme d’un attribut

AVG( ) moyenne d’un attribut

Figure3 – Fonctions statistiques. Par exemple, pour obtenir la population de l’Europe on pourrait écrire :

mysql> SELECT SUM(Population) FROM country WHERE Continent = 'Europe'; +−−−−−−−−−−−−−−−−−+

| SUM(Population) | +−−−−−−−−−−−−−−−−−+

| 730074600 |

(9)

Exercice 4

Rédiger une requête SQL déterminant la ville la moins peuplée de la base de données.

Mais il est aussi possible de regrouper les enregistrements d’une table paragrégation à l’aide du mot-clef GROUP BY. Ce regroupement permet d’appliquer la fonction statistique à chacun des groupes : le résultat de la requête est l’ensemble des valeurs prises par la fonction statistique sur chacun des regroupements.

R A B C a1 b1 c1 a1 b2 c2 a2 b3 c3 a3 b4 c4 a3 b5 c5 group by A −−−−−−−−−−−−→ R A B C a1 b1 c1 a1 b2 c2 a2 b3 c3 a3 b4 c4 a3 b5 c5

On utilise la syntaxe suivante (dans laquelle a1et a2sont des attributs et f une fonction d’agrégation) :

SELECT f ( a1 ) FROM t a b l e WHERE e x p r e s s i o n _ l o g i q u e GROUP BY a2

Cette requête sélectionne les enregistrements de la table qui vérifient l’expression logique, les regroupe selon la valeur de l’attribut a2, puis applique la fonction f sur l’attribut a1à chacun des groupes obtenus.

Notons enfin que le mot-clefHAVINGpermet d’imposer des conditions sur les groupes à qui on applique la fonction d’agrégation. La syntaxe générale de la requête prend alors la forme suivante :

SELECT f ( a1 ) FROM t a b l e WHERE e1 GROUP BY a2 HAVING e2

Cette requête sélectionne les enregistrements de la table qui vérifient l’expression logique e1, les regroupe selon

la valeur de l’attribut a2, puis applique la fonction f sur l’attribut a1à chacun des groupes vérifiant l’expression

logique e2.

Par exemple, pour obtenir les populations de chacun des continents on écrira :

mysql> SELECT Continent, SUM(Population) FROM country

-> GROUP BY Continent; +−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−+ | Continent | SUM(Population) | +−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−+ | North America | 482993000 | | Asia | 3705025700 | | Africa | 784475000 | | Europe | 730074600 | | South America | 345780000 | | Oceania | 30401150 | | Antarctica | 0 | +−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−+

Si on veut ordonner cette liste, il est nécessaire de renommer l’attribut calculant la population totale de chaque continent :

mysql> SELECT Continent, SUM(Population) AS Pop FROM country

-> GROUP BY Continent ORDER BY Pop DESC; +−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | Continent | Pop | +−−−−−−−−−−−−−−−+−−−−−−−−−−−−+ | Asia | 3705025700 | | Africa | 784475000 | | Europe | 730074600 | | North America | 482993000 | | South America | 345780000 | | Oceania | 30401150 | | Antarctica | 0 | +−−−−−−−−−−−−−−−+−−−−−−−−−−−−+

(10)

Enfin, si on veut se restreindre aux continents qui comportent plus de 40 pays, on écrira :

mysql> SELECT Continent, SUM(Population), COUNT(*) FROM country

-> GROUP BY Continent HAVING COUNT(*) > 40; +−−−−−−−−−−−+−−−−−−−−−−−−−−−−−+−−−−−−−−−−+ | Continent | SUM(Population) | COUNT(*) | +−−−−−−−−−−−+−−−−−−−−−−−−−−−−−+−−−−−−−−−−+ | Asia | 3705025700 | 51 | | Africa | 784475000 | 58 | | Europe | 730074600 | 46 | +−−−−−−−−−−−+−−−−−−−−−−−−−−−−−+−−−−−−−−−−+ Exercice 5

a. Rédiger une requête SQL donnant la liste des districts des États-Unis dont la population totale est supérieure à 3 000 000.

b. Rédiger une requête SQL déterminant les cinq langues les plus parlées au monde. c. Rédiger une requête SQL déterminant, pour chaque continent, le pays le plus peuplé.

2.4

Opérateurs ensemblistes

On peut procéder à des opérations ensemblistes entre deux tables (en général le résultat de requêtes) à condition que celles-ci aient même structure. Ces opérations sont :

UNIONpour calculer la réunion A ∪ B de deux requêtes ; – INTERSECTpour calculer l’intersection A ∩ B de deux requêtes ; – EXCEPTpour calculer la différence A \ (A ∩ B) de deux requêtes.

Ces opérations présentent surtout un intérêt lorsque les deux requêtes sont issues de deux tables différentes. MySQL (ainsi que d’autres SGBD) n’implémente d’ailleurs que l’union, les deux autres opérations ensemblistes pouvant être aisément remplacées par des requêtes équivalentes :

SELECTa FROMtable1INTERSECT SELECTbFROMtable2 est équivalent à SELECT a FROM t a b l e 1 WHERE a IN (SELECT b FROM t a b l e 2 ) – SELECTa FROMtable1EXCEPT SELECTbFROMtable2 est équivalent à

SELECT a FROM t a b l e 1 WHERE a NOT IN (SELECT b FROM t a b l e 2 ) Autrement dit, seule l’union présente un réel intérêt.

Il est enfin possible de réaliser le produit cartésien de deux tables (ou plus) en suivant la syntaxe SELECT A1 , A2 FROM table1 , t a b l e 2

mais la création d’un produit cartésien doit être réalisé avec prudence, car le cardinal du résultat est égal au produit des cardinaux des tables qui le composent :

mysql> select count(*) from city

-> union select count(*) from country

-> union select count(*) from countrylanguage

-> union select count(*) from city, country, countrylanguage; +−−−−−−−−−−−+ | count(*) | +−−−−−−−−−−−+ | 4079 | | 239 | | 984 | | 959282904 | +−−−−−−−−−−−+

(11)

3.

Exercices

On souhaite utiliser une base de données pour stocker les résultats obtenus par une communauté de joueurs en ligne. On suppose qu’on dispose d’une base de données comportant deux tables :Joueurs(id_j, nom, pays) etParties(id_p, date, duree, score, id_joueur)où :

– id_jde type entier, est la clef primaire de la tableJoueurs; – nomest une chaîne de caractères donnant le nom du joueur ; – paysest une chaîne de caractères donnant le pays du joueur ; – id_pde type entier, est la clef primaire de la tableParties; – dateest la date (AAAAMMJJ) de la partie ;

– dureede type entier, est la durée en secondes de la partie ;

– scorede type entier, est le nombre de points marqués au cours de la partie ; – id_joueurest un entier qui identifie le joueur de la partie.

Exercice 6

Rédiger une requête SQL qui renvoie la date, la durée et le score de toutes les parties jouées par Alice, listées par ordre chronologique.

Exercice 7

Alice vient de réaliser un score de n points. Rédiger une requête SQL qui renvoie la position qu’aura le score n dans le classement des parties par ordre de score (on suppose que la partie que vient de jouer Alice n’est pas encore insérée dans la base de données). En cas d’ex aequo pour le score n le rang sera le même pour tous les joueurs ayant ce score.

Exercice 8

Rédiger une requête SQL qui renvoie le record de France pour ce jeu.

Exercice 9

Rédiger une requête SQL qui renvoie le rang d’Alice, c’est-à-dire sa position dans le classement des joueurs par ordre de leur meilleur score.

Figure

Figure 1 – Communication avec une base de données.
Figure 2 – le schéma de la base de données world .
Figure 3 – Fonctions statistiques.

Références

Documents relatifs

Vous pouvez maintenant créer une base de données personnelle, dans le domaine de votre choix, mais qui satisfait aux conditions suivantes : au moins trois tables distinctes, avec

Système de Gestion de Bases de Données SGBD Rappel sur les niveaux d’abstraction MySQL Principaux types de données disponibles Créer une BD phpMyAdmin Pour finir... Système de

h) Nom et prime des joueurs sponsorisés par Peugeot entre 1985 et 1990. i) Nom et année de naissance des joueurs ayant participé au tournoi de Rolland Garros de 1989. j) Nom

Cette requête retourne exactement les mêmes colonnes qu’il y a dans la base de données. Pour en savoir plus sur le sujet il est recommandé de lire l’article avantage et

Rita Indonesia Asia Admiralty Residence Blok B N° 2, Jl.. Sugestiana Indonesia

La base de données (données primaires) est la matière première à partir de laquelle la bioinformatique va produire d'autres données (données secondaires) et

RUS Dr, Alexey Guzhva Makarov Medical Center, 1192148, litera D, house 43, Elizarova prospect, St-Petersburg 1 August 2018. RUS Dr, Pervishina Margarita Igorevna Makarov Medical

Ce chevauchement est par contre levé dans un bloc diagramme (non re- produit ici), construit dans le plan des axes 1-2 et 1-3, représentation qui met en évidence le regroupement des