Académique Documents
Professionnel Documents
Culture Documents
1. La commande SELECT
Le SELECT est la commande de base du SQL destinée à extraire des données d'une base
ou calculer de nouvelles données à partir d'existantes...
NOTA : dans cette syntaxe, les mots clef du SQL sont en gras, les paramètres en minuscule et
entre crochets on trouve les parties optionnelles
En fait l'ordre SQL SELECT est composé de 6 clauses dont 4 sont optionnelles.
Clauses de l'ordre SELECT :
Filtre portant sur les données (conditions à remplir pour que les lignes soient présentes dans le
WHERE
résultat)
GROUP
Définition d'un groupe (sous ensemble)
BY
HAVING Filtre portant sur les résultats (conditions de regroupement des lignes)
ORDER
Tri des données du résultat
BY
REMARQUE : pour spécifier une valeur littérale il faut l'entourer de guillemets simples. 1.2.
1.3. L'opérateur AS
Vous pouvez rajouter autant de colonnes que vous le désirez en utilisant le mot clef AS.
En principe l'opérateur AS sert à donner un nom à de nouvelles colonnes créées par la requête.
On, peut utiliser les opérateurs mathématiques de base pour combiner différentes colonnes
(,+,-, *, /,).
Il est possible de surnommer une table dans la clause FROM, dans ce cas, la syntaxe de la partie
FROM de la commande SELECT est la suivante :
Lorsqu'un nom d'un élément d'une base de données (table, colonne par exemple) est identique à
un mot clef du SQL, il convient de l'entourer de guillemets (double quote). En principe, les mots
réservés du SQL sont déconseillés pour nommer des objets du modèle physique de données...
NOM SELECT DATE NOT
------- ------ ------- ---
DURAND Oui 1999-11-12 F
DUVAL Non 1998-01-17 M
Exemple 8 : nous désirons sélectionner les colonnes SELECT et DATE lorsque la colonne NOT
vaut F...
SELECT SELECT, DATE
FROM JOIN ERREUR !
WHERE NOT = 'F'
SELECT "SELECT", "DATE"
FROM "JOIN" Correct : on entoure les mots clefs du SQL par des doubles côtes
WHERE "NOT" = 'F'
Cela est aussi nécessaire lorsque le nom (d'une colonne ou d'une table) est composé de caractères
particuliers tels que les blancs ou autres, ce qui est à éviter.
REMARQUE : les noms des identifiants d'objet de base de données doivent être écrit dans le jeux
de caractères restreint suivant :
[A..Z] + [a..z] + [0..9] + [_].
Ils ne doivent pas commencer par un chiffre et sont insensibles à la casse (indifférence entre
majuscule et minuscule).
2. La clause ORDER BY
ORDER BY colonne1 | 1 [ASC ou DESC ] [, colonne2 | 2 [ASC ou DESC ] ...
Cette clause permet de définir le tri des colonnes de la réponse, soit en précisant le nom littéral de
la colonne, soit en précisant son n° d'ordre dans l'énumération qui suit le mot clef SELECT.
ASC spécifie l'ordre ascendant et DESC l'ordre descendant du tri. ASC ou DESC peut être omis,
dans ce cas c'est l'ordre ascendant qui est utilisé par défaut.
Bien que la clause ORDER BY ne soit pas nécessaire, il est souvent utile de trier la réponse en
fonction des colonnes. En revanche le temps de réponse s'en ressent souvent.
Pour spécifier l'ordre de tri, on doit placer les noms des colonnes séparées par des virgules juste
après le mot clef "ORDER BY", dans l'ordre voulu. On peut aussi utiliser le rang de chaque colonne
dans l'ordre spécifié dans la clause SELECT.
Attention : le tri est un tri interne, il ne faut donc placer dans cette clause que les noms des
colonnes présentées dans la clause SELECT.
REMARQUE : les marqueurs NULL sont situés en premier dans l'ordre ainsi établi.
ATTENTION : la clause ORDER BY est la dernière clause de tout ordre SQL et ne doit figurer
qu'une seule fois dans le SELECT, même s'il existe des requêtes imbriquées ou un jeu de requêtes.
3. La clause WHERE
WHERE prédicats
Le prédicat doit contenir n'importe quelle expression logique renvoyant une valeur vrai.
Ainsi, une requête aussi stupide que la suivante, est supposée fonctionner :
WHERE valeur1 [NOT et] = ou < ou <= ou > ou >= ou <>valeur2 [OR ou AND ...]
3.2. Opérateur IN
L'opérateur IN permet de rechercher si une valeur se trouve dans un ensemble donné, quel que
soit le type des valeurs de référence spécifiées (alpha, numérique, date…). Bien entendu, il est
possible d'inverser le fonctionnement de l'opérateur IN en lui adjoignant l'opérateur NOT.
Le contenu de la parenthèse peut être remplacé par le resultat d'une requête possédant une
colonne unique. Dans ce cas on parle de requêtes imbriquées, ce que nous verrons plus loin.
L'opérateur BETWEEN permet de rechercher si une valeur se trouve dans un intervalle donné, quel
que soit le type des valeurs de référence spécifiées (alpha, numérique, date...).
NOTA : les opérateurs IN et BETWEEN sont très pratiques dans le cas où l'on désire effectuer des
requêtes où l'utilisateur peut saisir une liste de choix multiples (IN) ou une plage de valeur
(BETWEEN).
L'opérateur LIKE permet d'effectuer une comparaison partielle. Il est surtout employé avec les
colonnes contenant des données de type alpha. Il utilise les jokers % et _ (‘pour cent' et ‘blanc
souligné'). Le joker % remplace n'importe quelle chaîne de caractères, y compris la chaîne vide. Le
blanc souligné remplace un et un seul caractère.
Mais si vos données sont susceptibles de contenir un des deux caractères joker, alors il faut
recourir à une séquence d'échappement, à l'aide du mot clef ESCAPE...
Cherchons les clients dont l'enseigne contient au moins un caractère blanc souligné :
SELECT *
FROM T_CLIENT
WHERE CLI_ENSEIGNE
LIKE '%_%'
SELECT *
FROM T_CLIENT
WHERE CLI_ENSEIGNE
Pour traiter ce cas, on défini « # » comme caractère d'échappement. Le caractère qui suit ce
caractère d'échappement est donc interprété comme un caractère et non comme un joker.
NOTA : l'opérateur LIKE effectue une recherche en tenant compte de la différence entre lettres
majuscules et minuscules. Si vous voulez effectuer une recherche en ne tenant aucunement
compte de la différence entre majuscules et minuscules, il convient d'utiliser les opérateurs LOWER
et UPPER (voir ci dessous).
Voici une tableau résumant les principaux opérateurs utilisés pour la construction des prédicats :
parenthèses ( ... )
opérateurs mathématiques + - * /
4. Fonctions diverses
NOTA : pour effectuer une recherche en ne tenant aucunement compte de la différence entre
majuscules et minuscules, il faut utiliser l'opérateur UPPER (ou lower mais attention à la
transformation des accents !) :
La fonction SUBSTR permet d'extraire une sous chaîne d'une chaîne de caractère. Elle a besoin de
l'ordre du premier caractère et du nombre de caractères sur lequel elle doit opérer.
To_date (nom de colonne,’DD/MM/YYYY’ )
Il est possible de réaliser des comptages statistiques sur les colonnes, à l'aide des
opérateurs AVG (moyenne), MAX (maximum), MIN (minimum), SUM (total), COUNT (nombre).
On les appelent aussi fonctions d'aggrégations.
ATTENTION : l'utilisation des fonctions statistiques nécessite la plupart du temps la mise en place
d'une clause de groupage, afin de déterminé quel est le sous ensemble cible d'agrégation pour les
calculs.
II. Les jointures ou comment faire des requêtes sur plusieurs tables
La jointure est une opération permettant de combiner des informations venant de plusieurs tables.
- La plupart des jointures entre tables s'effectuent en imposant l'égalité des valeurs d'une
colonne d'une table à une colonne d'une autre table. On parle alors de jointure naturelle ou
équi-jointure.
- Mais on trouve aussi des jointures d'une table sur elle-même. On parle alors d'auto-
jointure.
- De même, il arrive que l'on doive procéder à des jointures externe, c'est-à-dire joindre une
table à une autre, même si la valeur de liaison est absente dans une table ou l'autre.
- Enfin, dans quelques cas, on peut procéder à des jointures hétérogènes, c'est-à-dire que
l'on remplace le critère d'égalité par un critère d'inégalité ou de différence.
Une jointure entre tables peut être mise en oeuvre, soit à l'aide des éléments de syntaxe SQL, soit
à l'aide d'une clause spécifique du SQL, la clause JOIN.
Cette requête ne possède pas de critère de jointure entre une table et l'autre. Dans ce cas, le
compilateur SQL calcule le produit cartésien des deux ensembles, c'est-à-dire qu'à chaque ligne de
la première table, il accole l'ensemble des lignes de la seconde à la manière d'une "multiplication
"!
Il faut donc définir absolument un critère de jointure.
Le fait de placer comme critère de jointure entre les tables, l'opérateur logique "égal" donne ce que
l'on apelle une "équi-jointure".
II-B. Différents type de jointures (naturelles, équi, non equi, auto, externes,
hétérogènes, croisée et union)
SELECT ...
SELECT ...
FROM <table gauche>
Jointure externe LEFT | RIGHT | FULL OUTER JOIN <table
droite>
ON condition de jointure
SELECT ...
Jointure FROM <table gauche>
naturelle NATURAL JOIN <table droite>
[USING <noms de colonnes>]
SELECT ...
Jointure croisée FROM <table gauche>
CROSS JOIN <table droite>
SELECT ...
Jointure d'union FROM <table gauche>
UNION JOIN <table droite>
Il existe un opérateur normalisé pour effectué en SQL la jointure naturelle des tables :
Mais cette syntaxe est rarement acceptée par les moteurs SQL actuels !
Comme il s'agit de la plus commune des jointures c'est celle qui s'exerce par défaut si on ne
précise pas le type de jointure. Après le mot clef ON on doit préciser le critère de jointure.
Les jointures externes sont extrêmement pratiques pour rapatrier le maximum d'informations
disponible, même si des lignes de table ne sont pas renseignées entre les différentes tables jointes.
Sans le savoir, nous faisons assez systématiquement l'hypothèse du monde clos. c'est-à-dire que
nous considérons que l'absence d'information, n'est pas une information.
L'hypothèse du monde clos : considérer que l'absence d'information doit être synonyme de critère
de discrimination... La jointure externe permet de contrer l'hypothèse du monde clos en
considérant qu'en cas d'absence de jointure entre une table et l'autre, on ne supprime par pour
autant l'information.
NOTA : il existe des équivalences entre différentes expressions logiques à base de jointures
externes. Les principales sont :
la jointure externe droite peut être obtenue par une jointure externe gauche dans laquelle
on inverse l'ordre des tables.
la jointure externe bilatérale peut être obtenue par la combinaison de deux jointures
externes unilatérales avec l'opérateur ensemblistes UNION.
Lorsqu'une ligne d'une table figurant dans une jointure n'a pas de correspondance dans les autres
tables, le critère d'équi-jointure n'est pas satisfait et la ligne est rejetée. C'est la jointure interne.
Au contraire, la jointure externe permet de faire figurer dans le résultat les lignes satisfaisant la
condition d'équi-jointure ainsi que celles n'ayant pas de correspondances.
La jointure croisée n'est autre que le produit cartésien de deux tables. Rappelons que le produit
cartésien de deux ensembles n'est autre que la multiplication généralisée. Dans le cas des tables,
c'est le fait d'associer à chacune des lignes de la première table, toutes les lignes de la seconde.
Ainsi, si la première table compte 267 lignes et la seconde 1214, on se retrouve avec un résultat
contenant 324 138 lignes. Bien entendu, s'il n'y a aucun doublon dans les tables, toutes les lignes
du résultat seront aussi uniques.
SELECT colonnes
FROM table_1 CROSS JOIN table_2
Ce qui est certainement l'expression la plus minimaliste de tous les ordres SELECT du SQL !
Les tables sont nommées selon les modules qui les utilisent.
- ACTB_* : transactions sur les comptes
- AETB_* :
- BCTB_*
- CATB_*
- CATM_*
- CFTB_*
- CFTM_*
- CSTB_*
- CSTM_*
- DETB_*
- FSTB_*
- GLTB_*
- GLTM_*
- ICTB_*
- ICTM_*
- LCTB_* >>>>>>>>> module LC (lettre de crédit)
- LDTB_* >>>>>>>>> module DC (lettre de débit)
- LMTB_*
- LSTB_*
- STTB_*
- STTM_*
- ETC…
-BALANCE A DATE
Ex:
select FLEXSETUP.FN_GL_CLOSE_BAL_AS_OF_DATE(cust_ac_no,date) from dual;
select cust_ac_no,ac_desc,FLEXSETUP.FN_GL_CLOSE_BAL_AS_OF_DATE(cust_ac_no,'11/04/2017')
from sttm_cust_account;
- ACCOUNT_OFFICER
select f_return_gestionnaire_sn(cust_ac_no) account_officer from sttm_cust_account;
- DESCRIPTION DE TRANSACTION
FUNCTION FLEXSETUP.NARRATION(trn IN actb_history.trn_ref_no%TYPE, dat IN actb_history.txn_init_date %TYPE,acc IN actb_history.ac_no
%TYPE ) RETURN varchar2