Cours 6
INTERROGATION - LA COMMANDE 'SELECT'
La base de données GESTPROJ
Avant d'aller plus loin avec les commandes SQL, il serait bon que vous ayez la bd GestProj à niveau.
Pour l'instant, la bd normalisée au cours précédents devrait avoir l'air de ceci:

Le modèle n'est pas encore parfait - il n'est pas de la forme maître/détails comme nous avons discuté plus tôt. Mais pour le moment il est suffisant. De toute façon, nous pourrons ajouter les détails au fur et à mesure que nous en aurons besoin.
Chaque table devrait contenir environ 10 enregistrements, ce qui permettra de réaliser des tests signficatifs.
Plusieurs des exemples qui suivent ont été fait l'an passé ou avant en utilisant le client MySQLGUI qui était alors le seul disponible.
Depuis, il y a eu le Control Center et maintenant, Administrator. On ne reste pas à rien faire chez MySQL AB!
Cependant, ça ne change rien dans l'exécution du code. Ce n'est que l'affichage.
Avant de continuer avec les instructions SQL, téléchargez le MySQL Administrator qui est le client visuel pour la gestion du serveur et le MySQL Query Browser pour l'exécution des requêtes.
Vous trouverez les logiciels au site suivant: Downloads
Voici un exemple de Select simple avec des titres pour l'affichage des résultats:

Autre exemple avec la condition WHERE ...:

En Access on a fait des Requêtes de regroupement. On fait cela en SQL en utilisant les fonctions statistiques du langage. En anglais ça se nomme: aggregation ou Group by.
| Fonctions | |
|---|---|
| SUM (expression) | valeur totale de l'expression |
| AVG (expression) | valeur moyenne de l'expression |
| COUNT (expression) | le nombre de valeur non-null |
| COUNT (*) | le nombre d'enregistrements (lignes) |
| MAX (expression) | la plus grande valeur dans expression |
| MIN (expression) | la plus petite valeur dans expression |
En plus des fonctions, on peut aussi calculer des expressions dans la requête.
Important: quand on ajoute une colonne calculée dans la requête, on ne change pas le contenu de la table. Une requête ne fait qu'afficher l'information, dans tous les cas.
SELECT NUMPROD, PRIX, (PRIX + (PRIX * .10)) FROM PRODUITS;
SELECT NUMPROD, PRIX, COUT,
(PRIX - COUT) AS Profit FROM PRODUITS;

SELECT MAX(PRIX) FROM PRODUITS;
SELECT COUNT(*) FROM PRODUITS;
SELECT COUNT(*) FROM PRODUITS
WHERE (PRIX - COUT) > 50;
SELECT AVG(PRIX) FROM PRODUITS;
SELECT SUM(COUT) FROM PRODUITS;
La clause DISTINCT identifie tous ceux qui sont différents
Pour savoir si le fichier contient des DESC répétées:
SELECT COUNT(DESCRIPTION) FROM PRODUITS;
SELECT COUNT(DISTINCT DESCRIPTION) FROM PRODUITS;
Pour établir la séquence d'affichage, on utilise la clause: ORDER BY ...
SELECT NUMPROD, PRIX FROM PRODUITS
ORDER BY PRIX DESC;
ASC spécifie en ordre croissant
DESC spécifie en ordre décroissant
si pas spécifié, c'est ASC
SELECT * FROM CLIENTS
ORDER BY NOM, PRENOM;
liste en ordre de nom d'abord,
en ordre de prenom à l'intérieur des noms identiques
Il est impossible de construire une application commerciale sans utiliser des champs de type date. Date de naissance, date de facture, date d'envoi, etc. SQL se prête très bien à l'utilisation de dates dans les tables et les requêtes.
Comme vous pouvez voir, il existe une tonne de fonctions pour traiter les valeurs de type date et/ou heure. Cependant, dans la plupart des applications vous en utiliserez 7 ou 8.
D'abord, il faut avoir les paramètres de départ:
La plus grosse date est la plus récente
- la personne avec la date de naissance la plus petite est la plus vieille
- pour trier en ordre croissant d'âge, on peut trier en ordre décroissant de date de naissance
Les opérateurs = < > fonctionne comme en maths:
- 'date1' > 'date2' signifie que date1 est plus récente que date2
curdate() retourne la date actuelle, curtime() retourne l'heure actuelle, now() retourne la date et l'heure
Les fonctions les plus utiles:
SELECT ADDDATE(CURDATE(), INTERVAL 5 day);
retourne une date 5 jours de plus qu'aujourd'hui
SELECT (ADDDATE(edateemb, INTERVAL 10 YEAR)) as Anniversaire10
from employe;
retourne la date du 10e anniversaire d'emploi des employés

SELECT eId, eNom, eDateemb FROM employe
WHERE eDateemb > SUBDATE(CURDATE(), INTERVAL 2 MONTH);
retourne ?
On peut aussi utliser l'expression:
SELECT eId, eNom, eDateemb FROM employe
WHERE (TO_DAYS(CURDATE()) - TO_DAYS(eDateemb) ) <= 60;
TO_DAYS(expr_date) retourne le nombre de jours depuis la date 0
TO_DAYS(NOW() ) retourne 731876 si NOW() est '2003-10-23'
pour spécifier une date on ne met pas les séparateurs, comme: TO_DAYS(20031015)
MONTH(expr_date) retourne le numéro du mois de la date
MONTHNAME(expr_date) retourne le nom du mois
YEAR(expr_date) retourne l'année de la date
DATE_FORMAT(expr_date, format) permet de formatter une date - voir la Référence
Rédigez la formule pour calculer l'âge d'un employé, en supposant que vous avez une colonne eDateN qui contient sa date de naissance.