IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Les boucles en sql, et comment naviguer dans un "tableau"?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut Les boucles en sql, et comment naviguer dans un "tableau"?
    Bonjour à tous,

    Je me pose quelques questions autant théoriques que pratiques.

    Sur les boucles:

    Que pensez vous des boucles en sql (cursor, while, foreach...), les éviter ou les utiliser à certaine occasion?
    Laquelle est la plus performante? (même si je suppose que ça dépend du contexte)
    Lesquelles éviter?



    La "navigation" : Forcément qui dit boucle dit se déplacer dans sa table, donc se déplacer de ligne en ligne mais aussi de colonne.

    Comment on peut faire cela, j'ai vu que ROW_NUMBER() (en sql server je pense) nous permet de récupérer le numéro de la ligne (quand on n'a pas d'id), comment on fait pour les colonnes ? Avec vous un exemple dans une boucle?

    Et avez vous un avis sur le fait d'utiliser ces méthode de déplacment dans les boucle pour retraiter des données en SQL?

    Et du coup à quoi faire attention pour que nos boucles ne soit pas trop gourmandes en ressources et temps?

    Merci d'avance
    BIOoOAG

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    De façon général, les boucles et les curseurs sont à éviter : utilisez des requêtes ensemblistes.

    Les curseurs sont plutôt à utiliser pour des taches particulières, comme des taches d'administration (reconstruction des index, ...).

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    SQL est un langage ensembliste par définition. La notion de boucle lui est donc étrangère.
    Ce sont les applicatifs qui traitent les résultats d'accès à un SGBDR qui introduisent ces notions de boucle, curseur, etc...
    Mais un SGBD n'est jamais aussi efficace que lorsqu'on lui demande de traiter un grand nombre de lignes à la fois, plutôt de les traiter une à une.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    D'accord je comprend mieux le concept.

    Mais par exemple si on veut faire un update sur une table où l'on insère des valeurs différentes pour chaque ligne, on est obligé de parcourir notre table ligne par ligne? (Enfin le SQL va regarder ligne par ligne les condition et updater nos données?)

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par BIOoOAG Voir le message
    Enfin le SQL va regarder ligne par ligne les condition et updater nos données?
    Avant de se lancer tête baissée, le moteur va chercher la façon qu'il estimera être la plus rapide pour répondre à la demande, en s'appuyant sur les statistiques dont il dispose, les contraintes,...

    C'est justement ce qui fait toute la différence avec les curseurs et les boucles : avec ça, vous obligez le moteur à traiter dans un ordre particulier (pas forcément le plus adéquat). Par ailleurs, dans de nombreux cas, vous le forcerez à faire plusieurs fois les mêmes opérations (lecture, calcul,...), là ou avec une requete, elle pourra n’être faite qu'une seule fois

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Oki!

    Si nous prenons un exemple concret que j'ai rencontré récemment.

    J'ai une requête comme ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Select...
    STUFF...
    FROM
    WHERE Valeur = 'industrie'
    Update...
     
    Select...
    STUFF...
    FROM
    WHERE Valeur = 'Mettre eu Oeuvre'
    Update...
     
    et cela 4 fois en tout
    (Je ne sais plus pour quelle raison on ne pouvait pas faire 1 seul update à la fin)

    Mais du coup avec ce code je me suis dit pourquoi ne pas faire une boucle avec une @Valeur qui me prend successivement 'Industrie', 'Mettre en Oeuvre' etc. puisque c'est uniquement cette valeur qui change finalement et répéter 4 fois le code ne me parait pas opti.

    Vous en pensez quoi?

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Dans ce cas, faire une requete dans un boucle ne sera pas plus optimal, (et pourra même l'être moins, car le même plan d’exécution sera utilisé...).

    Idéalement, il faudrait faire un seul UPDATE, dans lequel vous aller chercher par un SELECT les données nécessaires dans les autres tables.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Dans ton exemple qui n'est pas très précis, il serait possible de faire une procédure stockée si ton SGBD le supporte, et d'appeler la dite procédure 4 fois avec un paramètre @valeur qui change à chaque fois, mais ce n'est pas une boucle et il n'y a pas de Curseur.
    Cordialement
    Soazig

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par BIOoOAG Voir le message
    Oki!

    Si nous prenons un exemple concret que j'ai rencontré récemment.

    J'ai une requête comme ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Select...
    STUFF...
    FROM
    WHERE Valeur = 'industrie'
    Update...
     
    Select...
    STUFF...
    FROM
    WHERE Valeur = 'Mettre eu Oeuvre'
    Update...
     
    et cela 4 fois en tout
    (Je ne sais plus pour quelle raison on ne pouvait pas faire 1 seul update à la fin)
    Tout simplement parce que vous manquez de formation !

    Une seule requête SQL suffit à traiter tout problème en vertu du fait que SQL est un langage complet.

    Dans votre cas, il suffit d'écrire une requête avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE Matable
       SET MaColonne = CASE valeur
                          WHEN 'Industrie' 
                             THEN 390.2
                          WHEN 'Mettre eu Oeuvre' 
                             THEN -44
                       END
    WHERE  valeur IN ('Industrie', 'Mettre eu Oeuvre');
    Bref, formez-vous. Mon site web, comme mon livre peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Merci de ta réponse,

    Oui je me forme tous les jours et j'envisage de vraiment faire ces cours.

    Cependant, je dis pas les propos ci-dessous pour être désagréable ou autre c'est juste une remarque comme une autre

    Mais, les cours ne me semble pas trop à jour et quand on regarde la dernière update qui date de 2011 pour moi en informatique 3 ans c'est une éternité. Et ça m'étonne qu'en 3 ans il n'y a pas eu d'évolution du SQL.
    Et j'ai "peur" du coup de rater de nouveaux éléments importants et par la suite d'avoir des discours à mes collège qui n'ont plus lieu d'être.

    Je suis sûr que tu vas m'apporter la preuve du contraire!

  11. #11
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Citation Envoyé par BIOoOAG Voir le message
    Mais, les cours ne me semble pas trop à jour et quand on regarde la dernière update qui date de 2011 pour moi en informatique 3 ans c'est une éternité. Et ça m'étonne qu'en 3 ans il n'y a pas eu d'évolution du SQL.
    Et j'ai "peur" du coup de rater de nouveaux éléments importants et par la suite d'avoir des discours à mes collège qui n'ont plus lieu d'être.

    Je suis sûr que tu vas m'apporter la preuve du contraire!
    C'est un peu comme si tu disais que des cours d'algorithmique ne sont plus valables au bout de 3ans. La base du SQL ça ne change pas tous les jours. Les SGBD évoluent, apportent de nouvelles fonctionnalités que la majorité des gens ne vont pas utiliser (mais qui seront particulièrement utiles à ceux qui vont les utiliser) mais la base reste identique.

    Bref tu peux y aller sur ces cours
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  12. #12
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Je suis d'accord avec toi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Comment naviguer dans les résultats d'une requête ?
    Par DurDur dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/05/2015, 13h27
  2. Réponses: 2
    Dernier message: 21/08/2006, 21h27
  3. Réponses: 2
    Dernier message: 18/07/2005, 14h06
  4. Réponses: 4
    Dernier message: 02/07/2004, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo