Précisions utiles à l'écriture des commandes SQL

Chapitre parent Chapitre précédent Chapitre suivant

Pages d'aide les plus intéressantes pour la commande SQL SELECT


Pour débuter avec le langage SQL ou pour approfondir un point plus précis, nous vous conseillons la lecture des pages ci-dessous.


Sujet

Page

Syntaxe générale de la commande SELECT

http://sql.sh/cours/select

Les conditions avec la clause WHERE

http://sql.sh/cours/where

Le tri avec la clause ORDER BY

http://sql.sh/cours/order-by

Renommer une colonne ou un fichier : AS (ALIAS)

http://sql.sh/cours/alias

L'instruction CASE

http://sql.sh/cours/case



Le groupage avec la clause GROUP BY

http://sql.sh/cours/group-by

Opérer un comptage de lignes

http://sql.sh/fonctions/agregation/count

Opérer des sommes

http://sql.sh/fonctions/agregation/sum

Les sélections sur les groupes : la clause HAVING

http://sql.sh/cours/having



Les jonctions entre plusieurs fichiers

http://sql.sh/cours/jointures

La jointure « classique » LEFT OUTER JOIN

http://sql.sh/cours/jointures/left-join



Concaténer des rubriques de type Chaine : CONCAT

Dans LDSQL, l'opérateur + est aussi utilisable :
Rubrique1+Rubrique2 est équivalent à   CONCAT(Rubrique1,Rubrique2)

http://sql.sh/fonctions/concat

Extraire une partie d'une rubrique de type Chaine
Dans LDSQL, les deux fonctions SUBSTR et SUBSTRING sont acceptées.

http://sql.sh/fonctions/left

http://sql.sh/fonctions/right

http://sql.sh/fonctions/substring

Convertir une chaine en majuscule ou minuscule

http://sql.sh/fonctions/upper

http://sql.sh/fonctions/lower

Quelques éléments à connaître

Lors de la rédaction des commandes SQL, prenez garde aux pièges les plus fréquents :

SELECT CPTG AS "Compte général", LIBC AS "Libellé du compte" FROM CPTPLA
Attention : le libellé utilisé en tant qu'alias ne doit pas comporter de point, en raison d'une anomalie dans l'interpréteur SQL HyperFile : si l'alias comporte un point, lors de l'affichage de la requête, aucune donnée n'est affichée dans la colonne et l'on voit en lieu et place une suite de caractères #######.

Dans cet exemple, la commande aurait donné le même résultat si la valeur 607000 n'avait pas été inscrite entre apostrophes, car les deux opérandes de la comparaison n'étant pas du même type, l'interpréteur SQL inclus dans WINDEV réalise automatiquement une conversion avant d'effectuer la comparaison. Mais en règle générale, il est préférable de renseigner les apostrophes pour garantir le bon fonctionnement des opérateurs de comparaison.

SELECT *  FROM CPTHIS WHERE DATE BETWEEN '20170101 AND '20170228'        


Aide pour les jonctions entre fichiers

Un des problèmes les plus délicats, dès lors qu'on veut interroger une base de données, est le problème des jonctions entre les différents fichiers de la base. En effet, un des premiers principes des bases de données relationnelles est d'éviter toute redondance. La conséquence est que les données sont « morcelées » dans de multiples fichiers.

Prenons un exemple simple : les écritures comptables. Elles sont enregistrées dans un fichier Ecritures comptables nommé CPTHIS. Chaque écriture comptable mouvemente un compte comptable, mais le libellé du compte mouvementé n'est pas répété sur chaque écriture comptable : il est enregistré dans un fichier « dédié », ici le fichier Plan comptable nommé CPTPLA. Lorsqu'on interroge ces écritures comptables, on souhaite bien souvent afficher le libellé du compte mouvementé par chaque écriture. Il faut donc opérer une jonction entre ces deux fichiers CPTHIS et CPTPLA. La rubrique permettant de faire cette jonction entre les deux fichiers est la rubrique N° de compte général, nommée CPTG. La syntaxe à utiliser pour faire la jonction sera donc :
       SELECT CPTHIS.*, CPTPLA.LIBC FROM CPTHIS LEFT OUTER JOIN CPTPLA ON CPTHIS.CPTG=CPTPLA.CPTG

Ici, la jonction a été faite par LEFT OUTER JOIN. Cela garantit d'obtenir toutes les écritures comptables, même celles figurant dans un compte général qui ne serait pas défini dans le plan comptable (dans CPTPLA) (ce qui est quand même peu probable), alors que si on avait écrit FROM CPTHIS JOIN CPTPLA ON ..., on prenait ce risque.


En règle générale, pour opérer une jonction entre deux fichiers A et B, il faut utiliser la clé « unique » du fichier B qui doit être présente sous le même nom dans le fichier A. La clé « unique » (on dit aussi l'identifiant, abrégé souvent en Id.) du fichier B est très souvent la première rubrique de ce fichier. Sur l'onglet Structure de LDSQL, dans la liste des rubriques du fichier B, il suffit de vérifier que la première rubrique est bien déclarée en tant que Clé unique. Si c'est le cas, et si cette rubrique est présente également dans le fichier A (où là, il n'est pas nécessaire qu'elle soit déclaré en tant que clé), cela fonctionnera.


Il y a toutefois des cas plus complexes où la clé unique d'un fichier n'est pas composée d'une seule rubrique, mais de plusieurs. Un exemple courant est celui des salariés dans LDPaye : la clé permettant d'identifier de façon unique un salarié est composée du code société (COSO) et du N° matricule (NPPE). Dans ce cas de figure, il faut utiliser toutes les rubriques composant la clé unique pour réaliser la jonction, comme dans l'exemple ci-dessous, où l'on fait une jonction entre les en-têtes bulletins et le fichier du personnel :

       SELECT * FROM CAENBU LEFT OUTER JOIN PEPERS ON CAENBU.COSO=PEPERS.COSO AND CAENBU.NPPE=PEPERS.NPPE


Autre cas de figure un peu délicat à gérer : celui des tables de paramètres « divers » où l'on a enregistré, dérogeant quelque peu aux bonnes pratiques des bases relationnelles, dans un même fichier des données de nature un peu différentes. C'est le cas par exemple de la table des paramètres divers de LDCompta (fichiers CPTPDI et CPTPDJ) dans laquelle on enregistre les natures de pièce, les modes de paiement, les codes TVA, les codes de trésorerie... pour ce qui est du fichier CPTPDI, les groupes et familles de clients et fournisseurs dans le fichier CPTPDJ.

La clé d'un tel fichier est là aussi une clé composée de 2 rubriques, la première donnant un type d'enregistrement, la seconde étant le code clé « véritable ». Si on reprend l'exemple précédent avec les fichiers A et B, la clé du fichier B sera donc composée de 2 rubriques TYPE et CODE, et seule la rubrique CODE sera reprise dans le fichier A, bien souvent sous un autre nom plus explicite.

Un exemple : le fichier client de LDCompta dans lequel on trouve un mode de paiement (MOPM) et un code TVA (CACT), ces deux rubriques renvoyant sur la table des paramètres divers de laquelle on peut donc extraire le libellé du mode de paiement et le libellé du code TVA. Si on veut lister tous les clients avec ces deux libellés pour chaque client, et sachant que dans la table des paramètres divers (CPTPDI), les modes de paiement sont enregistrés avec un type P et les codes TVA avec un type T, la commande sera la suivante :

SELECT NOCL AS "Numéro", CPTCLI.RSSO AS "Raison sociale",

MOPM AS "MODE de paiement", CPTPDI1.LIBE AS "Libellé MODE de paiement",

CACT AS "Code TVA", CPTPDI2.LIBE AS "Libellé TVA"

FROM CPTCLI

LEFT OUTER JOIN CPTPDI AS CPTPDI1 ON CPTCLI.MOPM=CPTPDI1.CODE AND CPTPDI1.CENR='P'

LEFT OUTER JOIN CPTPDI AS CPTPDI2 ON CPTCLI.CACT=CPTPDI2.CODE AND CPTPDI2.CENR='T'

Notez l'usage des alias CPTPDI1 et CPTPDI2 rendu obligatoire du fait qu'on fait référence deux fois au fichier CPTPDI.