Quelques tp SQL (solutions)

BoTTom |    Changer de couleur
 
 Soit les tables suivantes :
 
 
 COURS       K   cours   char(10)    nom du cours
             K   module  char(10)    module de cours
                 texte   char(50)    texte du cours
                 sujet   char(10)    sujet
                 motcl1  char(10)    1er mot-clé associé à ce cours
                 motcl2  char(10)    2eme mot-clé associé à ce cours
                  ...
                 motcl5  char(10)    5eme mot-clé associé à ce cours
                 datref  dec(7, 0)   date de création ou de dernière modif
 
 il s'agit du fichier des cours disponibles
 
    chaque cours est enregistré sous un module de cours
 
 MODULES     K   module  char(10)
                 modtxt  char(50)
                 datcreation date
 


|    Changer de couleur
 
  CERTAINS cours sont de type cursus (la présence dans ce fichier l'indique)
 
 
 CURSUS      K   module  char(10)
                 but     char(100)   but du cursus
                 duree   dec(4,2)    temps estimé pour suivre ce cursus
 
  et enfin à chaque cours sont rattachés entre 0 et x exemples associés
 
 EXEMPLES    K   cours
             K   module
             K   noex    dec(3,0)    n° de l'exemple
                 fichier char(10)    fichier source
                 biblio  char(10)       "
                 membre  char(10)    membre  source
 
 
 la relation cours   <-> module est  (n,1)
             module  <-> cursus est  (0,1)
             cours   <-> exemples est (0,n)
 


|    Changer de couleur
 
 liste de tous les cours 
 
  SELECT * FROM COURS 
 
 liste des cours enregistrés sous le sujet SQL 
 
 
  SELECT * FROM COURS WHERE SUJET = 'SQL' 
 
 
 
 liste des cours ayant comme sujet SQL ou FICHIER ou QUERY 
 
 
 
  SELECT * FROM COURS WHERE SUJET IN ('SQL', 'FICHIER', 'QUERY') 
 
 ou
 
  SELECT * FROM COURS WHERE ucase(SUJET) IN ('SQL', 'FICHIER', 'QUERY') 
 


|    Changer de couleur
 
 
 liste des cours modifiés cette année 
 
   Select * from cours 
         where year( date(substr(digits(datref), 6, 2) 
                           concat '/' concat 
                          substr(digits(datref), 4, 2) 
                           concat '/' concat 
                          substr(digits(datref), 2, 2)) ) =year(now()) 
 
 
 
 liste des cours modifiés lors des douze mois précédents 
 
    Select * from cours where 
                days(current date) -  
                days( date(substr(digits(datref), 6, 2) 
                            concat '/' concat 
                           substr(digits(datref), 4, 2) 
                            concat '/' concat 
                           substr(digits(datref), 2, 2)) < 366 


|    Changer de couleur
 
 liste des modules de type cursus (le nom, le texte, le but) 
 
 
       SELECT module, modtxt, but from MODULES M, CURSUS C 
              WHERE m.module = c.module 
 
    ou bien
 
 
       SELECT module, modtxt, but from MODULE M JOIN CURSUS C 
                                                ON m.module = c.module 
 
 liste de tous les modules avec, pour les cursus, la durée. 
 
      SELECT module, modtxt, duree from MODULE M LEFT OUTER JOIN CURSUS C 
                                        ON  m.module = c.module 
 
 
 
 
 


|    Changer de couleur
 liste de tous les modules ayant au moins un cours sous le sujet SQL. 
  (avec toujours la durée pour les cursus). 
 
 
        SELECT module, modtxt, duree 
               FROM MODULE M LEFT OUTER JOIN CURSUS C 
                             ON m.module = c.module  
        WHERE EXISTS (SELECT * FROM COURS WHERE module = m.module 
                               and sujet = 'SQL') 
 
 MODULE      MODTXT                                              DUREE 
 £CURSUS02   Base de données integrée et requêtes                15,02
 £CURSUS220  OS/400 - V2R20                                       9,02
 £CURSUS3PR  Préparation à la V3R10 (études/système)              9,52
 £CURSUS3PX  Préparation V3R10 (orienté exploitation)             5,42
 £CURSUS310  OS/400 - V3R10                                      19,52
 COURS       Tous les cours AF400                                     -
 OUTILS      Outils AF400 (objets et sources)                         -
 PERF        Perfectionnement et suivi des nouveautés                 -
 V2R20       Nouveautés V2R20 de l'OS/400                             -
 V3R10       Nouveautés V3R10 de l'OS/400                             -
 


|    Changer de couleur
 refaite le même exercice en passant par une vue. 
 
        CREATE VIEW v1 AS  SELECT module, modtxt, duree  
                           FROM MODULE M LEFT OUTER JOIN CURSUS C 
                                ON m.module = c.module 
 
        Select * from v1 
               WHERE EXISTS (SELECT * FROM COURS WHERE module = m.module 
                                       and sujet = 'SQL') 
 
 
 
 quel est le nombre de cours par module 
 
 
      SELECT module, COUNT(*) from cours group by module 
 
 
 
 
 
 


|    Changer de couleur
 quel est le nombre de cours et la date de dernière révision par module 
 
 
 
     SELECT module, COUNT(*), max(datref) 
            from cours group by module 
 
 
 
 
 quel est le nombre de cours et la date de dernière révision par module 
 (uniquement les modules ayant plus de dix cours)
 
 
 
       SELECT module, COUNT(*), max(datref) 
               from cours group by module having count(*) > 10 
 
 
 
 
 


|    Changer de couleur
 quel est le nombre de cours et la date de dernière révision par module 
 (uniquement les modules ayant un cours parlant de SQL, pour être certain
   on considère comme traitant de SQL un cours ayant "SQL" dans son texte)
 
 MODULE        COUNT ( * )   MAX ( DATREF ) 
 £CURSUSTCP             13      16/07/98    ................................
 £CURSUS02              21      16/09/98    :  SELECT module, COUNT(*),    :
 £CURSUS220             18      16/06/95    :         max(datref)          :
 £CURSUS3PR             18      16/01/95    :                              :
 £CURSUS3PX              9      16/01/95    :  FROM   COURS c              :
 £CURSUS310             58      24/06/98    :                              :
 £CURSUS320             19      13/11/97    :  WHERE                       :
 £CURSUS370             24      12/02/98    :                              :
 COURS                 352      16/09/98    :       texte like '%SQL%'     :
 OUTILS                 59      30/10/97    :                              :
 PERF                  269      16/09/98    :                              :
 V2R20                  18      09/06/95    :  GROUP BY module             :
 V3R10                  65      31/03/98    :                              :
 V3R20                  18      15/07/97    :                              :
 V3R70                  16      16/07/98    :..............................:
 
 


|    Changer de couleur
 
 créer une vue transformant datref en date 
 
   create view formation0/coursv1 as 
    SELECT COURS, MODULE, TEXTE, SUJET, MOTCL1, DATE( 
     substr(digits(datref), 6, 2) concat '/' concat 
     substr(digits(datref), 4, 2) concat '/' concat 
     substr(digits(datref), 2, 2) ) as datref FROM cours 
 
 
 donner la liste des cours modifiés aujourd'hui. 
 
 select * from cours where datref = current date 
 
 
 donner la liste des MODULES (nom, texte) dont un cours a été modifié 
   aujourd'hui 
 
 select * from modules M where exists (select * from cours where module 
                                      = m.module and datref = current date) 
 
 


|    Changer de couleur
 
 donner la liste des MODULES (nom, texte) dont un cours a été modifié 
   ce mois ci 
 
 select * from modules M where exists (select * from cours where module 
   = m.module and month(datref) = month(current date) 
              and year(datref)  = year(current date)  ) 
 
 donner la liste des cours modifiés cette année en ajoutant un libellé 
 
 SELECT COURS, MODULE, TEXTE, DATREF, 
  case when week(datref) = week(current date) 
            then 'modifié cette semaine' 
       when month(datref) = month(current date) 
            then 'modifié ce mois-ci' 
       when quarter(datref) = quarter(current date) 
            then 'modifié ce trimestre' 
       else 'modifié cette année' 
 end from coursv1 
 where year(current date) = year (datref) 
 
 


|    Changer de couleur
 
  et pour finir,
 
   donner le nombre d'exemples par module.  (0 s'il n'y en a pas) 
 
 
 
 
    SELECT c.module, count(*) 
        FROM cours c join exemples e  on 
                         c.cours  = e.cours 
                     and c.module = e.module 
        GROUP BY c.module 
 
   UNION 
 
    SELECT module , 0 
        FROM cours c2 WHERE 
                     not exists 
                     (SELECT * FROM exemples where module = c2.module) 
 
 


|    Changer de couleur
 
  MODULE        COUNT ( * ) 
 
  £CURSUSRP4             13
  £CURSUSTCP             12
  £CURSUS00               0
  £CURSUS01               5
  £CURSUS02              13
  £CURSUS03              28
  £CURSUS04              15
  £CURSUS05               6
  £CURSUS06              25
  £CURSUS220             42
  £CURSUS230             66
  £CURSUS3PR             15
  £CURSUS3PX             10
  £CURSUS310             47
  £CURSUS320             17
  £CURSUS370             24
 
 
 


|    Changer de couleur
 Modification de données :
 
  a/ passer la transaction en mode UR (SET TRANSACTION)
 
      SET TRANSACTION ISOLATION LEVEL UR 
 
  b/ mettez la date du jour dans les cours portant le nom '£SQL400'
 
      update cours set datref = current date where cours = '£SQL400' 
 
 
  c/ demandez la liste des cours modifiés aujourd'hui
 
      select * from cours where datref = current date 
 
  d/ invalidez la transaction
 
      ROLLBACK 
 
  e/ demandez la liste des cours modifiés aujourd'hui
 
      (aucun cours)


|    Changer de couleur
 
  a/ passer la transaction en mode UR (SET TRANSACTION)
 
  b/ Supprimez le module '£CURSUS00' dans le fichier modules
 
            DELETE FROM modules where module = '£CURSUS00' 
 
                                  dans le fichier cours
 
            DELETE FROM cours   where module = '£CURSUS00' 
 
                                  dans le fichier exemples
 
            DELETE FROM exemples where module = '£CURSUS00' 
 
 
 
  validez
 
           COMMIT 
 
 


|    Changer de couleur
 
 passer la transaction en mode validation immédiate
 
      SET TRANSACTION ISOLATION LEVEL NC 
 
 Insérez un cours du module '£CURSUS00' dans le fichier des cours
 
 
 INSERT INTO TPSQL/COURS VALUES('essai', '£CURSUS00', 'texte', 
  'SQL', ' ', ' ', ' ', ' ', ' ', current date) 
 
 
 
 Insérez les modules manquant dans le fichiers des modules
 
 (le texte sera 'inséré automatiquement')
 
 INSERT INTO TPSQL/MODULES (MODULE, MODTXT) SELECT DISTINCT module, 
  'inséré automatiquement' FROM tpsql/cours c WHERE not exists 
   (SELECT * FROM modules WHERE module = c.module) 
 
 


|    Changer de couleur
 
a/ passer la transaction en mode ALL
 
b/ mettez comme date de création dans le fichier des modules , la date du
  cours le plus ancien pour ce module.
 
 update modules M set datcreation = (select min(datref) from coursv1 
                                      where module= m.module) 
 
c/ invalidez
 
 
refaite la même chose (b/) mais uniquement si la date de création du
 module est inférieure à la date que vous allez placer.
(pour vérifier vous attribuez au module '£CURSUSTCP' la date du jour)
 
 update modules set datcreation = current date where module = '£CURSUSTCP' 
 
 update modules M set datcreation = (select min(datref) from coursv1 
                                      where module= m.module) 
  where datcreation < (select min(datref) from coursv1 
                        where module= m.module) 





©AF400