Accueil du site > Les articles > Exemples de requêtes de type SELECT en SQL.
Version à imprimer Enregistrer au format PDF

Exemples de requêtes de type SELECT en SQL.

mardi 3 janvier 2006, par David Malle, Serge Gomes Visites  83262 Première mise en ligne le vendredi 18 mars 2005.

Pour aide mémoire, parceque c’est bien pratique, une série d’exemples de requêtes de type SELECT en SQL.

Cet article est bien sur évolutif. Il accueillera de nouveaux exemples régulièrement.


Quelques requêtes simples, mais pratiques

- Soit TABCDE la table des commandes clients.
- La table TABCDE cotient toutes les entêtes de commandes client. CODCLI est le code client.
- La table TABCLI cotient les clients. CODCLI est le code client. LIBCLI est le nom du client.

Comment sélectionner à partir d’un fichier entête de commandes, le code client qui à commandé le plus, et le nombre de commandes associées ?

1ère solution

SELECT CODCLI , COUNT(*) AS NBRCDE  
 FROM TABCDE
GROUP BY CODCLI      
ORDER BY NVRCDE DESC                
FETCH FIRST 1 ROWS ONLY        

2nde solution

WITH TMP AS
(
 SELECT CODCLI , COUNT(*) AS NBRCDE  
   FROM TABCDE
  GROUP BY CODCLI
)
SELECT * FROM TMP
ORDER BY NBRCDE DESC
FETCH FIRST 1 ROWS ONLY

La seconde solution apporte plus de souplesse et de clarté, si vous souhaitez compliquer le second select, pour récupérer le libellé du client sélectionné par exemple :

WITH TMP AS
(
 SELECT CODCLI , COUNT(*) AS NBRCDE  
   FROM TABCDE
  GROUP BY CODCLI
)
SELECT CODCLI, NBRCDE, LIBCLI FROM TMP
 LEFT
 JOIN TABCLI
   ON TMP.CODCLI = TABCLI.CODCLI
ORDER BY NBRCDE DESC
FETCH FIRST 1 ROWS ONLY

Comment sélectionner dans un fichier ligne de commandes, la 1ère ligne de chaque commandes

SELECT CODE A, LIBEL A FROM FICHIER  A    
WHERE RRN(A)  IN(SELECT MAX(RRN(B))        
FROM FICHIER B WHERE                        
A.CODE = B.CODE)                        
ORDER BY CODE                            

Pour avoir la dernière ligne créée on remplace MAX par MIN dans la requête.

Comment sélectionner l’article ayant la meilleure moyenne

SELECT CODART, AVG(QTE) AS QTE    
FROM ARTICLE GROUP BY CODART          
ORDER BY QTE  DESC                  
FETCH FIRST 1 ROWS ONLY              

Comment afficher la liste des articles ainsi que le nombre de commandes par code article

SELECT A.CODART , A.LIBART , COALESCE(B.NBR , 0)
FROM ARTICLE A
LEFT OUTER JOIN
(SELECT CODART , COUNT(NUMCDE) AS NBR
   FROM COMMANDES
  GROUP BY CODART ) AS B                    
     ON B.CODART = A.CODART  

Comment supprimer le zéros non significatifs à droite et à gauche

SELECT STRIP(TRIM(CHAR(VALEUR)), T, '0')
FROM FICHIER

Comment formater un nombre en 4 zones (signe, partie entière, caractère decimal, partie décimale). Pour transfert via des interfaces par exemple. Si, si, certains utilisent ce système.

Exemple : extraction du montant MTCDE ( au format 9 dont 3)de chaque commande client en 4 zones :
- ’+’ ou ’-’ selon que le montant est positif ou négatif
- la partie entière
- le caratère décimal
- la partie décimale

 SELECT
   CODCLI
   CASE SIGN(MTCDE)
     WHEN -1 THEN '-'
     ELSE '+'
   END SIGNE
   CAST(
   MTCDE AS DEC(6, 0)
   ) AS MTENT     ,
   '.'             ,
   CAST(                                
   (MTCDE - CAST(MTCDE AS DEC(6, 0))) * 1000 AS DEC(3, 0)
   ) AS MTDEC
   FROM TABCDE

Comment effectuer des comptages sur deux (ou plus) tables ?

Par exemple, le total des enregistrement des tables TABLE1 et TABLE2 pour le flag ACTIF est égal à ’O’.

Attention, sur AS400, uniquement à partir de la V5R2.

SELECT
 COUNT(*) + (
 SELECT COUNT(*) FROM TABLE2
  WHERE ACTIF = 'O' )
 FROM TABLE1
WHERE ACTIF = 'O'

Supprimer les caractères doublés dans un libellé

Exemple : On veut remplacer toutes les occurences "" par " « Produit ""A"" » doit devenir « Produit "A" »

UPDATE TABLE                              
SET ZONLIB = SUBSTR(ZONLIB , 1,                  
LOCATE('""', ZONLIB, 2) ) CONCAT                  
SUBSTR(ZONLIB , LOCATE('""', ZONLIB, 2) + 2 ,    
LENGTH(ZONLIB) - LOCATE('""', ZONLIB, 2) + 1 )    
WHERE ZONLIB LIKE '%""%'                          

Cette requête doit être lancée plusieurs fois pour prendre en compte les doublons répétés.

Comparer rapidement la structure de deux tables

SELECT                                                          
   A.DBIFIL AS TABLE
 , B.DBIFIL AS TABLE    
 , A.DBIFLD AS CHAMP
 , B.DBIFLD AS CHAMP  
 , A.DBIPOS AS POSITION
 , B.DBIPOS AS POSITION  
 , A.DBITXT AS TEXTE
 , B.DBITXT AS TEXTE  
 , A.DBITYP AS TYPE
 , B.DBITYP AS TYPE  
 , COALESCE(CAST(A.DBICLN AS CHAR(4)), CAST(A.DBINLN AS CHAR(4))) AS LNG1
 , COALESCE(CAST(B.DBICLN AS CHAR(4)), CAST(B.DBINLN AS CHAR(4))) AS LNG1  
 , COALESCE(CAST(A.DBINSC AS CHAR(1)), ' ') AS LNG2
 , COALESCE(CAST(B.DBINSC AS CHAR(1)), ' ') AS LNG2
 FROM QADBIFLD A
 LEFT OUTER JOIN QADBIFLD B
   ON B.DBIFIL = 'TABLE1'
  AND B.DBILIB = 'REFDTA'
  AND B.DBIPOS = A.DBIPOS
WHERE                                                          
      A.DBIFIL = 'TABLE2'                                            
  AND A.DBILIB = 'REFDTA'                                        
ORDER
   BY A.DBIFIL, B.DBIFIL ,                                  
      A.DBIPOS, B.DBIPOS    

Vote table a subit des modification de données et vous ne vous y retrouvez plus ?

Exemple avec les tables TABLE1 et TABLE2 dont la structure est identique :
- Les champs C1, C2 et C3 qui constituent la clé unique du fichier
- Le champ C4

- La requête sql suivante vérifie si le contenu des deux fichiers sont identiques à rrn égal.

SELECT COUNT(*)
 FROM TABLE1 A , TABLE2 B
WHERE RRN(A) = RRN(B)
  AND A.C1 <> B.C1
   OR A.C2 <> B.C2
   OR A.C3 <> B.C3
   OR A.C4 <> B.C4    

- La requête SQL suivante isole les éléments dont la clé est identique, mais qui diffèrent dans la valeur des zones associées.

WITH TMP AS (                                      
 SELECT A.C1, A.C2, A.C3, A.C4 AS VAL1, B.C4 AS VAL2
   FROM TABLE1 A                        
   JOIN TABLE2 B                            
     ON B.C1 = A.C1
    AND B.C2 = A.C2
    AND B.C3 = A.C3
)                                                  
 SELECT * FROM TMP
  WHERE VAL1 <> VAL2

Savoir si une zone alpha ne contient que des numériques

SELECT count(*) FROM Table
WHERE TRANSLATE(C1, ' ' , '1234567890') = ' '

Cette requête renvoie le nombre d’ enregistrements dont la zone C1 (qui est alphabétique) ne contient que des caractères numériques.

Autres exemples sur le site

- Des couleurs dans le résultat d’une requête SQL
- Créer un fichier Excel à partir d’une requête SQL
- Sélections sur les dates
- Comment gérer dans une requêtes SQL, des notions qui ne figurent pas dans une table ?
- Traiter des données soumises à date d’effet, avec et sans SQL.
- Comment ajouter un code retour chariot ou saut de ligne dans une chaine de caractères ?