DÉVELOPPEMENT D'APPLICATIONS AVEC ...






COURS 11 - REQUÊTES SQL ...suite






Supposons qu'on travaille toujours avec la base de données SILC.db qui contient les tables suivantes (notez qu'on a ajouté la table PROFS depuis la dernière fois):

ETUDIANTS INSCRIPTIONS COURS PROFS Numetud Numetud Numcours NumProf Nometud Numcours Titre NomProf Sexe Dateinscrit HeuresTheorie DateNaissProf Datenaiss Frais HeuresLab BureauProf Rue NoteFinale Secteur Ville Prov Programme



LA REQUÊTE UNION


- Requête UNION utilisée lorsqu'il faut combiner des champs similaires de 2 tables qui n'ont pas de liens entre elles

Eg: Montrer la date de naissance de tous les étudiants et de tous les profs, dans une seule requête:

SELECT Nometud, Datenaiss FROM Etudiants
UNION
SELECT NomProf, DateNaissProf FROM Profs;




La requête UNION produit une liste de tous les enregistrements de la première table avec les enregistrements de la deuxième table

Les champs demandés dans les deux tables doivent être du même type mais, pas nécéssairement de la même taille

Le nom affiché par la requête sera celui de la première table: les colonnes seraient Nometud et Datenaiss; si on veut des noms génériques, on peut utiliser la clause AS

On peut aussi faire une sélection sur chaque table en utilisant la clause WHERE

SELECT Nometud AS Nom, datenaiss AS Anniversaire, ville AS Endroit
FROM Etudiants
UNION
SELECT NomProf, DateNaissProf, BureauProf
FROM Profs


La technique peut aussi être utilisée lorsqu'on veut produire une liste et des totaux dans la même requête:

SELECT String(Numcours) AS Cours, Titre,
      HeuresTheorie AS Theorie, HeuresLab AS Laboratoire
FROM Cours
UNION
SELECT 'Total', ' ', SUM(HeuresTheorie), SUM(HeuresLab)
FROM Cours


Points à remarquer au sujet de l'exemple précédent:



AUTRES JOINTURES


Dans les jointures précédentes, seulement les enregistrements qui existent dans les 2 tables seront retournés parce que par défaut, le JOIN exécuté est un INNER JOIN; on pourrait écrire toutes les requêtes de cette façon:

SELECT X.numetud, nometud, dateinscr, numcours
FROM etudiants X INNER JOIN inscriptions Y
ON X.numetud = Y.numetud
      WHERE Y.numetud = '1234';

Mais, si un étudiant n'est pas encore inscrit, il ne sort pas dans la liste car la condition dit que son numéro doit être et dans la table etudiants et dans la table inscriptions.
Cependant c,est possible de faire sortir les étudiants qui ne sont pas inscrits; on utilise un OUTER JOIN au lieu d'un INNER; on ajoute RIGHT ou LEFT pour spécifier quelle table doit être listée au complet; LEFT pour la table nommée à gauche, (la première) et RIGHT pour la table nommée à droite (on utilise RIGHT très rarement car on peut toujours construire le SELECT avec un LEFT).

La liste de tous les étudiants (incluant ceux qui ne sont pas inscrits) et les inscriptions:
SELECT X.numetud, nometud, dateinscr, numcours
FROM etudiants X LEFT OUTER JOIN inscriptions Y
ON X.numetud = Y.numetud;

La liste de toutes les inscriptions dans les cours incluant les cours qui sont vides:
SELECT X.numcours, TITRE, numetud, dateinscr
FROM cours X LEFT OUTER JOIN inscriptions Y
ON X.numcours = Y.numcours;




[ Page TITRE ]      [ PRÉCÉDENTE ]      [ SUIVANTE ]