Nouveautés SQL en V4R40 (hors orientation objet)

BoTTom |    Changer de couleur
 
Rappels de quelques nouveautés SQL VRAIMENT importantes :
 
V4R20
 
 
 - Expressions conditionnelles
 
   une expression en SQL représente un traitement sur une/plusieurs zones
   (concaténation/extraction, calcul, ...)
 
   il s'agit ici, de pouvoir donner des conditions à ces traitements :
 
...................................................................
:  Select cours, texte, case dispo                                :
:                            when 1 then 'lecture'                :
:                            when 2 then 'Impression'             :
:                            when 3 then 'Les deux'               :
:                       end AS Disponible                         :
:       from AF4MBRP1                                             :
:.................................................................:
 


|    Changer de couleur
...........................................................................
:  Select noart, qtecde, puart, case                                      :
:                                when codepays <> 'F' then puart          :
:                                when dep = 97        then puart *1,09    :
:                                else                     puart *1,206    :
:                               end as TTC                                :
:       from cdecli                                                       :
:.........................................................................:
 
 
- CAST = fonction de changement de type
 
         CAST(expression as type(lg))
 
 
  select CAST(codchar as DEC(6, 0))
 
 Attention, CAST de numérique en Alpha élimine les zéros de gauche,
 
            DIGITS() les conserve
 
 


|    Changer de couleur
 
 - Sous sélection admise dans l'ordre UPDATE
 
  la notion de sous-sélection permettait de mettre un ordre SELECT dans la
     clause WHERE d'un ordre SQL.
 
  SUPPRIMER les clients sans commande :
 
            Delete from client C where not exists
               ( select * from commande where nocli = C.nocli )
 
            supprimer les commandes quand la clause SELECT ne trouve
             pas de ligne (NOT EXISTS)
             ayant le n° de client lu dans le fichier client (C.nocli)
 
 
  Cette synatxe est maintenant (V4R3) acceptée dans la clause SET de UPDATE 
 
  UPDATE command C set priha = (select pritarif from article
                                       WHERE codart = C.codart )
         WHERE  priha = 0
 


|    Changer de couleur
 
 mettre à jour le fichier command, mettre dans priha la valeur retournée
   par la clause select qui dit
 
      (je vais chercher le pritarif dans le fichier article, 
          de la ligne ayant le code article lu dans le fichier commande )
 
 
 
  UPDATE recap R set SALAIRAN = (select sum(salair + primes)
                                  from personp1
                                  where matricule = R.matricule)
 
 mettre à jour le fichier recap, mettre dans salairAN la valeur retournée
   par la clause select qui dit
 
      (je vais chercher la somme du calcul (salair * primes)
          dans le fichier du personnel 
          des lignes ayant le matricule lu dans le fichier RECAP )
 
 
 


|    Changer de couleur
 
 Nouveautés SQL en V4R40 (hors orientation objet)
 
 1/ les expressions sont maintenant admises sur les clauses
 
     GROUP BY
 
     ORDER BY
 
 à condition qu'elles soient indiquées aussi (et à l'identique) sur la
    clause SELECT.
 
 soit bdist dans le fichier clients contenant dep+bureau (44000 par ex.)
 
 
 SELECT substr(digits(bdist), 1, 2), COUNT(distinct NOCLI)
 
         from clients
 
        group by substr(digits(bdsit), 1, 2)
 
 donne le nombre de clients par département.


|    Changer de couleur
 
 SELECT bdist, COUNT(distinct NOCLI)
 
         from clients
 
        group by substr(digits(bdsit), 1, 2)
 
est invalide, l'expression n'étant pas présente sur le SELECT.
 
 
ORDER BY offre rigoureusement les mêmes possibilités.
 
 tout en conservant la possibilité d'indiquer un N° de colonne
      (N° dans le select bien sur)
 
 SELECT codcli, left(raisoc, 20)
         from clients
        GROUP BY 2
 
 2/ une nouvelle fonction LOWER ou LCASE
 
        transforme en minuscules (le contraire de UCASE donc)


|    Changer de couleur
 
3/ tables dérivées :
 
  on peut indiquer un ordre SELECT dans la clause from d'un ordre SELECT
 
     ou bien déclarer juste avant le SELECT une "vue temporaire" par WITH.
 
 
   cela permet d'éviter des créations de vues dans les cas complexes.
 
 
 deux écritures sont donc possibles
 ----------------------------------
 
 WITH correlation AS ( select ... from)
 
      SELECT ... from correlation
 
ou
 
 SELECT ... FROM   (select ... from ...)
 


|    Changer de couleur
 
 exemple , soit un fichier des cours, chaque cours est enregistré sous
             module de cours.
 
 je veux le nombre de cours du module qui en a le plus.
 ....................................................................
 : with  temp as                                                    :
 :  (select count(*) as nbr from Fmodules group by codmodul)        :
 :                                                                  :
 : select max(nbr)                                                  :
 :   from temp                                                      :
 :..................................................................:
 
est l'équivalent de :
 
 create view v1 as select count(*) as nbr .... from ...
 
puis
 
 select max(nbr) from v1
 
cela permet d'imbriquer des fonctions MAX(COUNT( ..)) étant invalide.


|    Changer de couleur
 
 deuxième écriture directement dans la clause FROM
 
 soit le fichier cours (vu plus haut),
  le fichier des modules (donnant un texte explicatif à chaque module)
  un fichier des exemples, permettant d'attacher x exemples à un cours.
                                                 (x pouvant être 0)
 je veux obtenir pour chaque module
 
................................................
: nom | texte | nbr de cours | nbr d'exemples  :
:..............................................:
 
 
Nous allons donc écrire
 
     un select qui donne le nombre de cours par module   ( C )
 
     un select qui donne le nombre d'exemples par module ( E )
 
et réaliser une jointure entre le fichier des modules, C et E.
 


|    Changer de couleur
 
La jointure module -> C est interne (on doit avoir au moins un cours)
 
La jointure C -> E est externe, il peut ne pas y avoir d'exemples
 
 select m.codmodul, texte, nbcours, nbexemples
  from Fmodules  m
 
       join
 
 (select codmodul, count(*) as nbcours
         from Fcours
         group by codmodul) as C
 on m.codmodul = c.codmodul
 
  left join
 
 (select codmodul, count(*) as nbexemples
         from Fexemples
         group by codmodul) as E
 on C.codmodul = e.codmodul
 


|    Changer de couleur
                             Affichage des données 
                                              Largeur des données  . . :  79
 Première ligne à afficher . .            Première colonne à afficher  .
 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+
 MODULE      TEXTE                                    NBCOURS      NBEXEMPLE
 
 £CURSUSTCP  Cursus TCP/IP et INTRANET                     13            14
 £CURSUS00   AF400 : présentation du produit                3              -
 £CURSUS01   Initiation à l'AS/400 & OS/400                19             5
 £CURSUS02   Base de données integrée et requête           21            13
 £CURSUS03   Développement en RPG (RPG,PRTF,DSPF           30            28
 £CURSUS04   Programmation système (CL et principes)       20            15
 £CURSUS05   Télécommunications sur AS/400 .               20             6
 £CURSUS06   Programmation COBOL/400                       28            25
 £CURSUS220  OS/400 - V2R20                                18            42
 £CURSUS230  OS/400 - V2R30                                32            66
 £CURSUS3PR  Préparation à la V3R10 (études/système)       18            15
 £CURSUS3PX  Préparation V3R10 (orienté exploitation)       9            10
 £CURSUS310  OS/400 - V3R10                                58            47
 £CURSUS320  OS/400 - V3R20                                19            20
 £CURSUS370  OS/400 - V3R60 / V3R70                        24            28
                                                                 A suivre...





©AF400