Université de Lausanne
Ecole des Hautes Etudes Commerciales (HEC)
Cours de Bases de Données Avancées
TP2 - SQL
BFSH1 - 1015 Lausanne - Switzerland - Tel. +41 21 692.3420 - [Link]@[Link] - [Link]
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
Agenda
Introduction
Types de données
Opérateurs et fonctions
Langage SQL
– Definition de Données
– Manipulation de Données
– Requêtes
Exercice
Bases de Données Avancées – TP2 2
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
Introduction
SQL
– Structured Query Language
– Un langage normalisé
SQL99: ANSI X3.135-1999, ISO/IEC 9075:1999 "Database Language SQL"
– Standard d'accès aux bases de données relationnelles
Supporté par les principaux systèmes de bases de données relationnelles
Portabilité (en principe, peut nécessiter quelques petites modifications)
Bases de Données Avancées – TP2 3
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – Types de Données
Types de données principaux (Oracle)
– Chaînes de caractères: – Données brutes:
CHAR (taille) RAW
VARCHAR (taille) BLOB (Large Object Datatype)
– Nombres: BFILE
NUMBER (chiffres,decimales) – Types personnalisées (objets)
INT – Types XML
FLOAT – Types spatiales
DOUBLE – Types Média
– Date
DATE
TIMESTAMP
INTERVAL
Bases de Données Avancées – TP2 4
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – Opérateurs et fonctions
Quelques opérateurs et fonctions utiles
– Sur nombres – Comparison
+, -, *, /, POWER, SQRT >, <, =, !=
ABS, MOD, EXP, LOG ANY, SOME, ALL
SIN, COS, TAN IS NULL, LIKE, IN, EXISTS
ROUND, TRUNC… NOT, AND, OR
– Sur chaînes de caractères – Date
CONCAT, REPLACE CURRENT_DATE …
CURRENT_TIMESTAMP …
SUBSTR, LENGHT
TRIM, LTRIM, RTRIM,
– Fonction d’aggrégation
COUNT, SUM, MAX, MIN…
UPPER, LOWER ...
AVG, STDEV, VARIANCE
– Sur ensembles
– Et beaucoup d’autres
UNION, INTERSECT, MINUS
– Conversion
TO_CHAR, TO_DATE, TO_NUMBER …
Bases de Données Avancées – TP2 5
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – 1. Langage de définition de données
Langage de définition de données (LDD / DDL)
– Commandes pour créer, modifier et supprimer les éléments du schéma
relationnel tel que relations, vues, indexes, contraintes, database …
– CREATE | ALTER | DROP DATABASE
– CREATE | ALTER | DROP TABLE
– CREATE | ALTER | DROP VIEW
– CREATE | ALTER | DROP TRIGGER
– CREATE | ALTER | DROP INDEX
– CREATE | ALTER | DROP CONSTRAINT
– CREATE | ALTER | DROP ...
Bases de Données Avancées – TP2 6
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE DATABASE
CREATE DATABASE
– Syntaxe: CREATE DATABASE <nom>
– Effets: Crée une base de donnée vide et prête à l’emploi
Efface les éventuelles données présentes
ALTER DATABASE
– Syntaxe: ALTER DATABASE <nom>
– Effets: Permet d’effectuer des opérations de maintenance
DROP DATABASE <nom>
– Syntaxe: DROP DATABASE <nom>
– Effets: Efface la base de données entière
Example:
– CREATE DATABASE cd
Bases de Données Avancées – TP2 7
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE
CREATE TABLE nom_table (
nom-col type-col [ [CONSTRAINT] contrainte-col]*
[CONSTRAINT contrainte-table]*
);
– Effets: Crée une table vide en spécifiant son nom, ses attributs et ses
contraintes
– Légénde: […] = optionnel, CAPITALE = mot clé,
* = répétition possible (typiquement separés par des virgule)
CREATE TABLE AS requête-SQL
– Effets: Permet de créer et peupler une table à partir d’une requête SQL
Bases de Données Avancées – TP2 8
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE - Exercices
Créer une table Artiste contenant un Nom (identifiant), un genre
et une nationalité. Insérer un jeu de données et afficher la table.
Solution: CREATE TABLE Artiste (
Nom varchar(64) ,
Genre varchar(16) ,
Nationalite varchar(16) ,
CONSTRAINT ID_Artiste PRIMARY KEY (Nom)
);
Insérer un jeux de données et afficher la table
– Solution: INSERT INTO Artiste VALUES ('Joe Satriani','Rock','USA');
INSERT INTO Artiste VALUES ('Gordon Haskell','Jazz','GB');
SELECT * FROM Artiste;
Bases de Données Avancées – TP2 9
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE – Contraintes
NOT NULL
– Oblige l’attribut à avoir des valeur non nulle
– Contrainte sur colonne:
spécifier NOT NULL après la definition de l’attribut
DEFAULT
– Attribue une valeur par défaut à l’attribut à la place d’une valeur nulle.
– Contrainte sur colonne:
spécifier DEFAULT valeur après la definition de l’attribut
CHECK (condition)
– Spécifie une condition que chaque ligne de la table doit vérifier. La condition peut
porter sur plusieurs attributs et contenir des connecteurs logiques, mais ne peut pas
contenir de requêtes SQL, porter sur d’autres lignes de la table ou d’autres tables
– Contrainte sur colonne:
spécifier CHECK (condition) après la definition de l’attribut (1 seul attribut)
– Contrainte sur table:
spécifier en fin de requête CONSTRAINT nom CHECK (condition)
Bases de Données Avancées – TP2 10
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE – Contraintes
PRIMARY KEY
– Définit la clé primaire d’une table: deux lignes ne peuvent pas avoir le même
ensemble de valeurs pour les attributs définis par la clé primaire.
– Ne permet pas de valeur nulles.
– Contrainte sur colonne:
spécifier PRIMARY KEY après la definition de l’attribut (limité à 1 seul attribut)
– Contrainte sur table:
spécifier en fin de requête CONSTRAINT nom PRIMARY KEY (attr1, attr2,...,attrN)
UNIQUE
– Définit une clé secondaire d’une table: deux lignes ne peuvent pas avoir la même
ensemble de valeurs pour les attributs définis par la contrainte.
– Permet les valeurs nulles, mais NOT NULL peut aussi être spécifié.
– Contrainte sur colonne:
spécifier UNIQUE après la definition de l’attribut (limité à 1 seul attribut)
– Contrainte sur table:
spécifier en fin de requêten CONSTRAINT nom UNIQUE (attr1, attr2,...,attrN)
Bases de Données Avancées – TP2 11
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE – Contraintes
FOREIGN KEY
– Permet de garantir l’intégrité référentielle, c’est à dire que les valeurs des attributs
spécifiés comme clé étrangère référencent des tuples d’une autre table qui existent.
– Permet les valeurs nulles, mais NOT NULL peut aussi être spécifié.
– Contrainte sur colonne:
spécifier REFERENCES nom-table après la definition de l’attribut (limité à 1 seul attribut)
– Contrainte sur table:
Spécifier en fin de requête CONSTRAINT nom FOREIGN KEY (attr1, attr2,...,attrN)
REFERENCES table [(attr1, attr2,...,attrN)] [action]
– Note: référence par défaut la clé primaire de la table cible, ou une clé secondaire à
préciser à travers REFERENCES table (attr1, attr2,...,attrN)
– Note: action permet de spécifier une action à exécuter
Condition: ON DELETE : permet de spécifier l'action à réaliser en cas d'effacement
ON UPDATE : permet de spécifier l'action à réaliser en cas de modification
Action: SET NULL : remplace les valeurs par NULL
SET DEFAULT : remplace par la valeur par défaut si défini, sinon NULL
CASCADE : la mise à jour / déstruction est répercutée
RESTRICT : indique une erreur (ne permet pas l’action)
Bases de Données Avancées – TP2 12
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE – Contraintes – Exercices
Créer une table Album avec un Titre (identifiant), une Année (obligatoire, par
défaut 2004, comprise entre 1900 et 2100) et un Artiste (clé étrangère sur table
Artiste).
– Solution: CREATE TABLE Album (
Titre varchar(64) PRIMARY KEY,
Annee numeric(4) DEFAULT 2004 NOT NULL,
Artiste varchar(64),
CONSTRAINT CKAnnee CHECK (Annee BETWEEN 1900 AND 2100),
CONSTRAINT REF_Album_Artiste FOREIGN KEY (Artiste)
REFERENCES Artiste(Nom)
);
Insérer un jeux de données et afficher la table
– Solution: INSERT INTO Album VALUES('Surfing WTA',1987,'Joe Satriani');
INSERT INTO Album VALUES('Harry''s Bar',2002,'Gordon Haskell');
SELECT * FROM Album;
Bases de Données Avancées – TP2 13
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE TABLE – Contraintes – Exercices
Créer une table Chanson avec un Titre (identifiant) un Album (clé étrangère
référençant la table Album), un Numero (facultatif) et une durée. Le couple
Album et Numero doit être unique dans toute la table.
– Solution: CREATE TABLE Chanson (
Titre varchar(64),
Album varchar(64),
Numero numeric(2) ,
Duree numeric(4,2) ,
CONSTRAINT PK_Chanson PRIMARY KEY (Titre),
CONSTRAINT SID_Chanson UNIQUE (Album, Numero)
);
Insérer un jeux de données et afficher la table
– Solution: INSERT INTO Chanson VALUES('How wonderful','Harry''s Bar',1,3.07);
INSERT INTO Chanson VALUES('Always with me','Surfing WTA',4,6.4);
SELECT * FROM Chanson;
Bases de Données Avancées – TP2 14
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CONTRAINTES - CREATE TRIGGER
CREATE [OR REPLACE] TRIGGER nom-trigger
BEFORE|AFTER|INSTEAD OF
INSERT [OR] UPDATE [OF column] [OR] DELETE
ON nom-table
[FOR EACH ROW] [WHEN (condition)]
instructions pl/sql
– Permet de spécifier un traitement complexe pour garantir une contrainte d’intégrité
– Traité au TP suivant
Example:
– CREATE TRIGGER TR_InsertAlbum AFTER INSERT ON album FOR EACH ROW
DECLARE nb_artiste int;
BEGIN
select count(*) into nb_artiste from artiste where nom= :[Link];
if (nb_artiste < 1) then INSERT into artiste values(:[Link], :[Link], null);
end if;
end;
Bases de Données Avancées – TP2 15
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE VIEW
CREATE [OR REPLACE] VIEW nom_vue AS requête SQL
– Permet de créer une vue, soit une table virtuelle produite par une requête
SQL. La vue ne contient pas de données propres. Elle est construite au
moment de la requête avec les données des tables sous-jacentes.
– Après sa création, une vue peut être utilisée de la même façon qu'une table.
Des requêtes de sélection ou de manipulation peuvent y être appliquées.
– OR REPLACE: écrase l’ancienne vue de même nom si elle existait
Bases de Données Avancées – TP2 16
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – CREATE VIEW - Exercices
Exercice: Créer une table ChansonsUSA qui contient toutes les noms et durées
des chansons dont les artistes sont de nationalité USA.
– Solution: CREATE TABLE ChansonsUSA AS
SELECT [Link], [Link], duree
FROM chanson, album, artiste
WHERE [Link] = [Link] AND [Link] = [Link]
AND [Link] = 'USA';
Exercice: Créer une vue à partir de la même requête.
– Solution: CREATE VIEW VueChansonsUSA AS
SELECT [Link], [Link], duree
FROM chanson, album, artiste
WHERE [Link] = [Link] AND [Link] = [Link]
AND [Link] = 'USA';
Exercice: Modifiez les données dans la table originale. Affichez table et vue et
notez les différences entre eux.
Bases de Données Avancées – TP2 17
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – ALTER TABLE
ALTER TABLE nom-table action
– action: permet de spécifier la modification de la table à apporter
RENAME TO nouveau-nom-table
– Permet de changer le nom de la table
RENAME COLUMN old-name TO new-name
– Permet de changer le nom d’une colonne
ADD ( nom-col type-col [DEFAULT valeur] [contrainte-col])
– Permet d’ajouter une ou plusieurs colonnes ou contraintes
MODIFY ( nom-col type-col [DEFAULT valeur] [contrainte-col])
– Permet de modifier une ou plusieurs colonnes ou contraintes
DROP COLUMN nom-col [CASCADE CONSTRAINTS]
– Permet de modifier une ou plusieurs colonnes ou contraintes
RENAME: renommer une colonne ou une contrainte
Bases de Données Avancées – TP2 18
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – ALTER TABLE - Exercices
Modifier la table Chanson afin qu’elle contienne une colonne ‘Artiste’
– Solution: ALTER TABLE Chanson ADD (
Artiste varchar(64)
)
Modifier la table Chanson afin que numero soit obligatoire
– Solution: ALTER TABLE Chanson MODIFY (
Numero NOT NULL
)
Modifier la table Artiste afin que le genre soit limité à Rock, Hard Rock ou Jazz
– Solution: ALTER TABLE Artiste ADD (
CONSTRAINT CKGenre CHECK (Genre in ('Rock', 'Hard Rock', 'Jazz'))
);
Bases de Données Avancées – TP2 19
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – DROP TABLE, DROP VIEW
DROP TABLE nom_table [CASCADE CONSTRAINTS]
– Permet de supprimer une table et tout son contenu
– CASCADE CONSTRAINTS supprime toutes les contraintes de clé externe
référençant cette table. Si on cherche à détruire une table dont certains attributs
sont référencés sans spécifier CASCADE CONSTRAINT: refus
DROP VIEW nom_vue [CASCADE CONSTRAINTS]
– Permet de supprimer une vue
– CASCADE CONSTRAINTS supprime toutes les contraintes de clé externe
référençant cette vue: si on cherche à détruire une vue dont des attributs sont
référencés sans spécifier cette option une erreur est générée
Exercice: Détruisez la table ChansonsUSA et la vue VueChansonsUSA.
– Solution: DROP TABLE ChansonsUSA;
DROP VIEW VueChansonsUSA;
Bases de Données Avancées – TP2 20
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – Langage de manipulation de données
INSERT
– Insertion de tuples dans une table
UPDATE
– Mise à jour de tuples dans une table
DELETE
– Effacer des tuples dans une table
Bases de Données Avancées – TP2 21
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – INSERT
INSERT [INTO] nom-table [(nom-colonne*)]
{VALUES (valeur*) | requête | DEFAULT VALUES }
– Permet d’insérer des valeurs dans une table
– nom-colonnes: spécifie les colonnes visées par l’insertion. Peut être omis si
les valeurs concernent toutes les colonnes de la table dans le bon ordre.
– VALUES (valeurs): spécifie les valeurs à insérer:
INSERT nom-table VALUES (valeurs*)
– requête: les valeurs à insérer sont donnés par une requête qui doit renvoyer
les mêmes nombre, ordre et types de colonnes spécifiés par nom-colonnes
INSERT INTO nom-table requête
– DEFAULT VALUES: insère une ligne avec toutes les valeurs par défaut
Bases de Données Avancées – TP2 22
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – INSERT - Exercices
Insérez des nouveaux artistes, albums et chansons
– Solution: INSERT INTO Artiste VALUES ('Gotthard', 'Rock', 'CH' );
INSERT INTO Album VALUES('Gotthard',1992,'Gotthard');
INSERT INTO Chanson VALUES('Angel','Gotthard',8,7.25,null);
INSERT INTO Chanson VALUES('Hush','Gotthard',4,2.13,null);
Créez une table Genres avec un attribut Genre (identifiant).
Insérez ensuite les genres des artistes utilisés dans la base.
– Solution: CREATE TABLE Genres (Genre varchar(16) PRIMARY KEY);
INSERT INTO Genres SELECT DISTINCT Genre FROM Artiste;
Bases de Données Avancées – TP2 23
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – UPDATE
UPDATE nom-table
SET nom-colonne = expression *
[WHERE condition]
– Permet de mettre à jour les colonnes spécifiés d’une table selon une ou
plusieurs expressions qui peuvent être une constante, une expression
contenant des opérateurs ou une sous-requête SQL
– WHERE condition permet de spécifier de mettre à jour seulement les tuples
qui satisfassent cette condition. Par défault ce sont tous les tuples de toute
la table qui sont mis à jour
Bases de Données Avancées – TP2 24
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – UPDATE - Exercices
Mettre à jour la table Chanson en mettant le nom de l’artiste qui
est relié à la chanson
– Solution: UPDATE Chanson SET Artiste = (
SELECT [Link]
FROM ALBUM, ARTISTE
WHERE [Link]=[Link] AND
[Link]=[Link]
);
Mettre à jour la table Chanson en mettant la durée en secondes (il
faut d’abord modifier le type pour tenir compte de ça)
– Solution: ALTER Table Chanson modify Duree number(6,2);
UPDATE Chanson set Duree =
trunc(Duree) * 60 + ((Duree-trunc(Duree))*100);
Bases de Données Avancées – TP2 25
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – DELETE
DELETE FROM nom-table [WHERE condition]
– Efface tous les tuples qui répondent à la condition spécifiée
– Si aucune condition est spécifiée tous les tuples sont effacés
Exercice: effacer tous les artistes suisses de la base y compris
leur chansons et albums
– Solution: DELETE FROM Chanson WHERE Album in (
SELECT Titre FROM Album WHERE Artiste in (
SELECT Nom FROM Artiste WHERE Nationalite='CH'
)
);
DELETE FROM Album WHERE Artiste in (
SELECT Nom FROM Artiste WHERE Nationalite='CH'
);
DELETE FROM Artiste WHERE Nationalite = 'CH';
Bases de Données Avancées – TP2 26
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – langage de requête
SELECT [DISTINCT] nom-cols [AS nom-cols]
FROM nom-tables
[ WHERE conditions]
[ GROUP BY nom-cols]
[ HAVING conditions ]
[ ORDER BY nom-cols [ASC|DESC] ]
– Permet de récuperer l’information contenue dans la base de donnée qui satisfait les
conditions de la requête
– DISTINCT spécifie d‘enlever les doublons dans les résultats
– nom-cols spécifie quelles colonnes retenir (projection). Le caractère * récupère
toutes les colonnes des tables précisées dans la clause FROM.
– AS permet de donner un nom aux colonnes créées par la requête
– WHERE spécifie les conditions de sélection des tuples (sélection), qui peuvent être
n’importe quel prédicat qui doit pouvoir être évalué à vrai ou faux selon les valeurs:
Comparison à une valeur (<, <=, =, >=, >, <>), év. quantifiés (ALL, SOME, ANY)
Comparison à une fourchette ([NOT] BETWEEN), comparison partielle ([NOT] LIKE)
Opérateurs logiques: AND, OR, NOT
Conditions d’existence: nom-col IS [NOT] NULL, [NOT] EXISTS (sous-requête)
Conditions d’ensemble: nom-col [NOT] IN (liste-de-valeur ou sous-requête)
Bases de Données Avancées – TP2 27
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – langage de requête
SELECT [DISTINCT] nom-cols [AS nom-cols]
FROM nom-tables
[ WHERE conditions]
[ GROUP BY nom-cols]
[ HAVING conditions ]
[ ORDER BY nom-cols [ASC|DESC] ]
– GROUP BY permet de regrouper les données dans la table selon les
colonnes sélectionnées. Peut s’utiliser avec des fonctions d’aggrégation:
count, sum, avg, max, min,... dans la clause SELECT
– HAVING spécifie les conditions de retention des regroupements de lignes
– ORDER BY permet de trier les données dans la table selon les colonnes
sélectionnées en ordre ascendant (ASC) ou descendant (DESC)
– Note: les différents opérateurs et fonctions peuvent être utilisées dans la
selection ou ou dans les conditions...
Bases de Données Avancées – TP2 28
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – opérations sur requetes
requête-sql UNION requête-sql
requête-sql INTERSECT requête-sql
requête-sql MINUS requête-sql
Bases de Données Avancées – TP2 29
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – langage de requête – Exercices
Préparation: insérez un jeu de données dans la base (utiliser le script “TP2 –
[Link]”)
Requête de base avec selection et projection: obtenir les noms et la nationalite
des artistes qui font du Rock ou du Hard Rock
SELECT Nom, Nationalite FROM Artiste
WHERE Genre = 'Rock' OR Genre ='Hard Rock'
Requête sans doublons: obtenir la liste des albums dont on a répertorié des
chansons dans la base
SELECT DISTINCT Album FROM Chanson
Requête avec variable et ordonnancement: obtenir le contenu d’un certain
album (chanson, numero, durée) par ordre de numero
SELECT Titre, Numero, Duree FROM Chanson
WHERE Album = :Album
ORDER BY Numero ASC
Bases de Données Avancées – TP2 30
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – langage de requête – Exercices
Requête sur plusieurs tables avec jointure: obtenir une table avec les artistes,
les albums et leurs années, en ordre d’artiste et annee
– SELECT [Link] AS Artiste, Annee, [Link] AS Album
FROM Album, Artiste
WHERE [Link]=[Link]
ORDER BY Artiste, Annee
– SELECT [Link] AS Artiste, Annee, [Link] AS Album
FROM Album JOIN Artiste ON [Link]=[Link]
Outer Joins: obtenir la liste des Artistes avec leur album, en incluant même les
artistes pour lesquels on n’a pas d’album repertoriés
– SELECT Nom, Annee, [Link]
FROM artiste LEFT JOIN album ON [Link]=[Link];
Requête avec sous-requête: obtenir la liste d’artistes dont on n’a pas d’album
– SELECT nom from artiste where nom not in (SELECT artiste from album)
Bases de Données Avancées – TP2 31
Université de Lausanne > Ecole des HEC > Cours de Bases de Données Avancées > TP2
SQL – langage de requête – Exercices
Requête avec fonctions d’aggregation: obtenir la liste des albums
avec le numero de chansons qu’ils contiennent et leur durée totale
– SELECT [Link], count(Duree) AS Nombre_Chansons, sum(Duree) AS
Duree_Totale
FROM album JOIN chanson ON [Link]=[Link]
GROUP by [Link]
Requête avec fonctions d’aggregation et selection: obtenir la liste
des artistes avec le nombre d’album pour ceux dont on a plus d’un
seul album
– SELECT Nom, count(titre)
FROM artiste join album on artiste=nom
GROUP BY Nom
HAVING count(titre)>1
Bases de Données Avancées – TP2 32