• Aucun résultat trouvé

CHAPITRE 3. LANGAGE SQL

3.4. Les instructions de base

3.4.1. Instruction SELECT

SELECT [attribut] { * | table.* | [table.]champ1 [, [table.]champ2.[, ...]]} [AS pseudonyme1 [, pseudonyme2 [, ...]]]

FROM expression_de_table [, ...] [IN base_de_données_externe] [WHERE... ]

[GROUP BY... ] [HAVING... ] [ORDER BY... ]

[WITH OWNERACCESS OPTION]

• Access autorise les noms d’objets formés de chaîne jusqu’à 64 caractères contenant des caractères spéciaux, accentués et des espaces. Pour faire référence à ces noms dans une requête SQL, ils doivent être placés entre crochets. Par exemple :

SELECT [Numéro Client], [Nom du client], FROM [Table des clients];

Les noms qui respectent le standard SQL n’ont pas besoin d’être mis entre crochets.

• Si Access ne peut pas déterminer un élément de la requête, il ne provoque pas vraiment d’erreur, mais affiche une boîte de dialogue pour en demander la valeur. Cette caractéristique est très utile pour écrire des requête paramétrées. On peut par exemple écrire :

SELECT * FROM DEPOT

WHERE mont_dep < [Montant maximum];

où [Montant Maximum] n’est pas défini dans le système. Access affiche alors la boîte de dialogue suivante :

Fig3.1 : Saisie de la valeur du paramètre

En plus des attributs standards ALL et DISTINCT, Access en supporte deux autres : DISTINCTROW : élimine les lignes entièrement dupliquées, pas seulement sur un champ comme avec l’attribut DISTINCT.

TOP n : renvoie les n premiers enregistrements qui résultent d’une requête triée avec la clause ORDER BY. Par exemple, on désire les 3 dépôts avec les montants les plus élevés :

SELECT TOP 3 num_dep,mont_dep FROM DEPOT

ORDER BY mont_dep DESC;

La clause IN (pas dans la norme) permet de spécifier le chemin d’une base externe. Une instruction SELECT est donc capable d’extraire des enregistrements d’une table appartenant à n'importe quelle base de données à laquelle Access peut se connecter, qu'il s'agisse d'une base de données dBASE ou Paradox, ou encore d'une base de données Microsoft Access qui n'est pas la base de données active.

La syntaxe à utiliser pour extraire des enregistrements d’une table dBASE IV est la suivante (si cette dernière n’est pas attachée) :

SELECT * FROM employes IN 'c:\temp\test.dbf' "dBASE IV;" WHERE nom = "Bartoli";

dBASE IV est ici un identificateur qui indique à Access d’effectuer la requête dans le fichier c:\temp\test.dbf.

Les jointures

La clause FROM accepte un (ou des) nom(s) de table(s), conformément à la norme, mais elle permet également de spécifier une jointure entre plusieurs table. Access permet d’effectuer 3 types de jointures illustrées ci-dessous avec les tables simplifiées CLIENT et DEPOT suivantes :

No Client Nom Localité

1 ACHILLE MORGES 2 ROBERTO LAUSANNE 3 MORGAN SERVION 4 TCHUDI NYON 5 DUPOND CHAVANNES 6 BARTOLI CRISSIER 7 DUDRAGNE VEVEY 11 VUADENS LAUSANNE No de dépôt No Client Montant 1 5 SFr. 500.00 2 2 SFr. 700.00 3 6 SFr. 350.00 4 7 SFr. 900.00 5 5 SFr. 700.00 6 11 SFr. 750.00 7 7 SFr. 300.00

L’équijointure

La plus courante, cette jointure sélectionne tous les clients qui ont un dépôt :

SELECT distinct nom_cli, num_dep

FROM CLIENT INNER JOIN DEPOT ON CLIENT.num_cli= DEPOT.num_cli; Nom No de dépôt ROBERTO 2 DUPOND 1 DUPOND 5 BARTOLI 3 DUDRAGNE 4 DUDRAGNE 7 VUADENS 6 La jointure gauche

Cette jointure sélectionne tous les clients, y compris ceux qui n'ont pas de dépôts.

SELECT distinct nom_cli, num_dep

FROM CLIENT LEFT JOIN DEPOT ON CLIENT.num_cli= DEPOT.num_cli; Nom No de dépôt ACHILLE ROBERTO 2 MORGAN TCHUDI DUPOND 1 DUPOND 5 BARTOLI 3 DUDRAGNE 4 DUDRAGNE 7 VUADENS 6 La jointure droite

Cette jointure affiche tous les dépôts et leur propriétaire, même les dépôts qui n'appartiennent à personne (dans notre cas tous les dépôts ont un propriétaire).

SELECT distinct nom_cli, num_dep

FROM CLIENT RIGHT JOIN DEPOT ON CLIENT.num_cli= DEPOT.num_cli; Nom No de dépôt BARTOLI 3 DUDRAGNE 4 DUDRAGNE 7 DUPOND 1 DUPOND 5 ROBERTO 2 VUADENS 6

• Le renommage des champs ou des expressions sur les champs n’est pas conforme à la norme. La requête suivantes N’EST PAS acceptée :

SELECT moyenne=avg(mont_dep) FROM DEPOT;

Dans Access, le renommage des colonnes doit se faire avec le mot réservé AS. Mais cette opération ne sert qu’à modifier l’affichage dans la feuille de réponse. On ne peut pas faire référence à "moyenne" dans une clause WHERE, par exemple. On sera donc obligé de répéter "avg(mont_dep)".

SELECT avg(mont_dep) AS moyenne FROM DEPOT;

Le renommage des tables, par contre, est standard. La requête suivante est acceptée. Mais il est également possible d’utiliser le mot réservé AS (client AS c) :

SELECT c.num_cli, nom_cli, date_dep, mont_dep*2 AS DoubleMontant FROM CLIENT c, DEPOT d

WHERE c.num_cli=d.num_cli;

• Access permet d’effectuer des opérations de regroupement et de tri sur des expressions, même si ces dernières ne font pas partie de la sélection.

SELECT num_ag, max(mont_dep) AS maximum, min(mont_dep) AS minimum FROM DEPOT

GROUP BY num_ag ORDER BY avg(mont_dep);

• L’attribut DISTINCT n’est pas supporté dans une fonction de regroupement. Par exemple, il est impossible d’écrire :

SELECT count(DISTINCT num_ag) FROM DEPOT;

Mais l’attribut DISTINCT est tout de même supporté dans les autres cas. On peut donc écrire une requête nommée "DistDep" de la manière suivante :

SELECT DISTINCT num_ag FROM DEPOT;

Et utiliser cette dernière pour compter les départements :

SELECT count(num_ag) FROM DistDep;

Conditions de recherches

• Access supporte les opérateurs de comparaisons standards : =, <>, >, >=, <, <=

• Comme dans la norme, une requête utilisée dans une comparaison doit renvoyer une valeur unique. Mais la requête peut être placée à gauche de l’opérateur et il est possible de comparer deux sous requêtes.

Avec le prédicat "Between expr1 And expr2", la norme indique que expr1 doit être inférieur à expr2. Ce n’est pas le cas dans Access qui permet d’inverser les deux valeurs SANS QUE le résultat de la requête ne soit changé.

• Le prédicat "Like expression" est supporté, mais comme dans la plupart des SGBD commerciaux, les caractères jokers "%" et "_" sont remplacés par "*" et "?". Le tableau suivant donne quelques exemples de comparaisons :

Type de correspondance Modèle Correspondance

(l'expression retourne True)

Pas de correspondance (l'expression retourne False)

Plusieurs caractères "a*a" "aa", "aBa", "aBBBa" "aBC" Caractère spécial "a[*]a" "a*a" "aaa" Plusieurs caractères "ab*" "abcdefg", "abc" "cab", "aab" Un seul caractère "a?a" "aaa", "a3a", "aBa" "aBBBa" Un seul chiffre "a#a" "a0a", "a1a", "a2a" "aaa", "a10a" Plage de caractères "[a-z]" "f", "p", "j" "2", "&" Hors plage "[!a-z]" "9", "&", "%" "b", "a" Valeur autre qu'un chiffre "[!0-9]" "A", "a", "&", "~" "0", "1", "9" Combinaison "a[!b-m]#" "An9", "az0", "a99" "abc", "aj0"

Les prédicats IN, ALL-or-ANY, EXISTS et IS NULL sont supportés conformément à la norme. Le prédicat ANY n’exige pas que la condition soit vraie pour au moins une des valeurs.

Fonctions de regroupement

• Access supporte les fonctions de regroupement standard : COUNT, MIN, MAX, AVG, SUM et en propose 4 autres :

• StDevP / StDev : écart type d’une population / échantillon de population.

Documents relatifs