Une même instruction SELECT permet de combiner Sélections, Projections, Jointures.
Soient les relations suivantes :
CLIENT(CodeClient, NomClient, AdrClient, TélClient)
COMMANDE(N°Commande, Date, CodeClient*)
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *
On désire obtenir le code et le nom des clients ayant commandé le 10/06/2020 :
SELECT DISTINCT CLIENT.CodeClient, NomClient
FROM CLIENT, COMMANDE
WHERE CLIENT.CodeClient=COMMANDE.CodeClient AND Date='10/06/2020';
ou avec la clause INNER JOIN :
SELECT DISTINCT CLIENT.CodeClient, NomClient
FROM CLIENT INNER JOIN COMMANDE ON CLIENT.CodeClient=COMMANDE.CodeClient
WHERE Date='10/06/2020';
Remarque :
Si l'on ne précisait pas CLIENT.CodeClient au niveau du SELECT, la commande SQL ne
pourrait pas s'exécuter. En effet, il y aurait ambiguïté sur le CodeClient à projeter
étant donné que 2 attributs CodeClient (celui de CLIENT et celui de COMMANDE)
sont présents à l'issue de la jointure.
Il y a encore 2 autres possibilités si le SGBDR les supportent, et dans la mesure où ici les attributs joints ont le même nom dans les 2 tables :
SELECT DISTINCT CodeClient, NomClient
FROM CLIENT INNER JOIN COMMANDE USING(CodeClient)
WHERE Date='10/06/2020';
SELECT DISTINCT CodeClient, NomClient
FROM CLIENT NATURAL JOIN COMMANDE
WHERE Date='10/06/2020';
Dans ces 2 dernières solutions, l'attribut CodeClient n'étant pas dupliqué, il n'est pas nécessaire de le préfixer avec le nom d'une table.