Cours 9
REQUÊTES COMBINÉES
Quelques exemples utiles
Référence: Exemples de SELECT
Pour trouver le plus gros salaire dans Authors:
SELECT max(salary) FROM authors;
Mais il n'y a pas de façon simple de trouver le nom de la personne qui a le plus gros salaire - les fonctions stats ne fonctionnent que sur des groupes.
Dans d'autres implantations de SQL, on utilise un "embedded SELECT", comme:
SELECT lname, fname
FROM authors
WHERE salary = (SELECT max(salary) FROM authors);
FROM authors
WHERE salary = (SELECT max(salary) FROM authors);
Pour les cours qui suivent, nous allons utiliser l'interface MS-ACCESS pour accéder à la base de données BookStore en MySQL.
Il faut d'abord créer un DSN approprié en Windows. Voir: Notes de cours 11.
Après avoir établi la connection, il suffit de lier les tables MySQL à l'application Access.

Le "embedded SELECT" n'existe pas en MySQL, ce qui rend le travail un peu plus compliqué.
D'abord, il faut créer une table temporaire en utilisant la commande SELECT ... INTO ... pour mettre des données dans cette table temporaire.
Puis on peut regarder le résultat et après, se débarasser de la table temporaire.
SELECT max(auSalary) AS MaxSalary INTO tmp FROM authors
SELECT auFname, auLname, auState
FROM authors, tmp
WHERE auSalary = MaxSalary
DROP TABLE tmp
SELECT auFname, auLname, auState
FROM authors, tmp
WHERE auSalary = MaxSalary
DROP TABLE tmp

On peut même le faire plus complexe.
Affichez le(s) auteur(s) avec le plus gros salaire dans chaque état.
SELECT auState as MaxState, max(auSalary) as MaxSal INTO tmp FROM authors
GROUP BY auState
SELECT aufname, aulname, maxstate, maxsal
FROM authors, tmp
WHERE auSalary = maxsal
AND auState = maxstate
DROP TABLE tmp
GROUP BY auState
SELECT aufname, aulname, maxstate, maxsal
FROM authors, tmp
WHERE auSalary = maxsal
AND auState = maxstate
DROP TABLE tmp
Par exemple, trouver les auteurs qui ont un salaire plus grand que la moyenne:
SELECT avg(auSalary) as SalMoy INTO tmp FROM authors
SELECT aufname, aulname, austate, SalMoy, ausalary
FROM authors, tmp
WHERE ausalary > SalMoy
DROP TABLE tmp
SELECT aufname, aulname, austate, SalMoy, ausalary
FROM authors, tmp
WHERE ausalary > SalMoy
DROP TABLE tmp
La requête UNION
Pour pouvoir exécuter des requêtes UNION, vous devez télécharger la version 4 de MySQL. Cette version est maintenant disponible sur le site MySQL.com à MySQL 4.0.
La requête UNION est une technique qui permet d'afficher dans une même requête des tables qui n'ont pas de relations.
En fait, UNION est une concaténation de requêtes.
Par exemple, en supposant que nous avons une table etudiants et une autre table profs qui contiennent des champs similaires mais qui n'ont pas de lien direct entre elles, on pourrait afficher l'information des deux tables comme ceci:
SELECT enom, erue, eville, edatenaiss FROM etudiants
UNION
SELECT pnom, prue, pville, pdaten FROM profs
UNION
SELECT pnom, prue, pville, pdaten FROM profs
Une application intéressante de ceci consiste à afficher des totaux de colonnes dans une requête. Il n'y a pas d'autre façon de le faire.
Étudiez l'exemple qui suit:
