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:





En passant, le diagramme a été créé avec un outil de modélisation qui s'appelle Sybase AppModeler. Remarquez que certains détails des attributs et des relations sont inclus dans le diagramme.

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.




Le client visuel de MySQL

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


Vous pouvez maintenant utiliser MySQL Query pour tous les tests que vous voulez faire sur la bd.




Variations du SELECT ...

Voici un exemple de Select simple avec des titres pour l'affichage des résultats:






Autre exemple avec la condition WHERE ...:







Les fonctions de regroupement


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.

Référence: Group by functions



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.








EXEMPLES:

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

SELECT DISTINCT DESCRIPTION FROM PRODUITS;

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







Travailler avec des dates

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:

Une date est toujours inscrite sous forme de: 'aaaa-mm-jj' comme: '2003-12-31'

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:

DATE_ADD ou ADDDATE et DATE_SUB ou SUBDATE
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



Petit exercice à faire en classe:

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.




Haut de la page