
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
La technique peut aussi être utilisée lorsqu'on veut produire une liste et des totaux dans la même requête: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
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:
- On peut afficher des constantes dans un SELECT, par exemple, 'Total' et ' '
- Les deux SELECT doivent afficher le même nombre de colonnes, c'est pourquoi on affiche un espace dans la ligne Total
- le data type des colonnes doit être le même dans les deux SELECT; puisque Numcours est défini comme Integer dans la table, il faut le convertir à un type String pour pouvoir l'afficher dans la même colonne que le string 'Total'; la fonction STRING( ) sert à convertir un champ de type numérique à type caractères
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, numcoursMais, 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.
FROM etudiants X INNER JOIN inscriptions Y
ON X.numetud = Y.numetud
WHERE Y.numetud = '1234';
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, numcoursLa liste de toutes les inscriptions dans les cours incluant les cours qui sont vides:
FROM etudiants X LEFT OUTER JOIN inscriptions Y
ON X.numetud = Y.numetud;
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 ]