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 :

"select *" ou "select champ1, champ2, etc." ?


Sujet :

Langage SQL

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut "select *" ou "select champ1, champ2, etc." ?
    Bonjour

    Pour récupérer toutes les colonnes d'une table, quelle que soit le SGBD, quelle est à votre avis la meilleure syntaxe ?

    select * from matable ?

    select matable.* from matable ?

    select matable.Champ1, matable.Champ2, matable.Champ3 from matable ?

    autre ?

    Papy !

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    La meilleure de quel point de vue ?

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    performance, rapidité

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Alors il vaut mieux éviter l'étoile et citer explicitement les colonnes (afin de ne pas obliger le SGBD à consulter son dictionnaire de données).

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ajouterai à l'excellente réponse d'Antoun que le préfixage des noms de colonne par le nom ou l'alias de la table n'est utile qu'en cas d'une requête impliquant plusieurs tables. Dans ce cas c'est même très fortement recommandé car il peut y avoir confusion entre colonnes de même nom dans plusieurs tables (ça ne devrait pas exister à mon avis mais bon...).

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    @antoun : l'analyseur ne vérifie pas dans le dictionnaire lorsque tu lui précises les colonnes ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    @antoun : l'analyseur ne vérifie pas dans le dictionnaire lorsque tu lui précises les colonnes ?
    Celui de quel SGBD ?

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Allez, au pif : Oracle !
    De ce que j'imagine être les mécanismes d'accès, je vois mal comment il pourrait te renvoyer un résultat sans accéder à la description de la table d'une manière ou d'une autre...

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Comme j'ai moins d'imagination que toi, je ne peux que t'inviter à aller voir chez les oraclistes...

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Extrait de mon blog :
    Les 10 meilleures pratiques pour développer avec un SGBDR
    http://blog.developpez.com/sqlpro?ti...s_sur_ms_sql_s

    COMMANDEMENT N°3

    Évitez impérativement "SELECT *"

    Moins les données circulent, plus les temps d'exécution sont écourtés. Mieux vaut donc mettre dans la liste des colonnes uniquement celles nécessaires, pour ne pas renvoyer systématiquement tout.
    Moins le serveur à d'effort à faire pour retrouver les informations dans les tables systèmes (nom et type des colonnes par exemple, mais aussi privilèges...) plus la préparation de la requête est écourtée.
    Même si vous voulez renvoyer actuellement toutes les colonnes pour les afficher toutes, que ferez-vous si la table est remaniée ultérieurement notamment en ajoutant une colonne ? Le risque de voir votre code client ne plus fonctionner est assez important.

    Mais il arrive parfois, et même de plus en plus, que le développeur de bonne foi, soit confronté à des SELECT * qu'il n'a pourtant pas demandé. Ce sont en général de merveilleux outils de développement, dont le choix a été fait « à la va-vite » et plus sur leur aspect que sur leurs qualités, qui en sont la cause. A l'heure du développement Web rapide, ce genre de chose est de plus en plus courant...

    Le pire en ce domaine est l'utilisation d'Access en frontal de MS SQL Server. Ceux qui se sont contenté d'utiliser le RAD d'Access sans tenir compte de ce que faisait le moteur JET derrière ont dû avoir de très mauvaises surprises lors des montées en charge. Il y a quelques temps j'ai dû rendre un "arrêt de mort" sur un logiciel développé par un grand éditeur. Celui-ci avait été racheté à une petite boîte qui avait réalisé cela « à la va vite » avec Access et eût l'idée ingénieuse de porter cela en SQL Server à l'aide de 3 clics. Le résultat était particulièrement catastrophique. En effet Access a une conception curieuse de l'accès aux données : pour afficher une seule information, il fait un SELECT * sur la table et filtre sur le client. Imaginez le temps d'attente lorsque la table passe de 300 lignes à quelques centaines de milliers...

    Seule exception à cette règle, les sous requêtes corrélées encapsulées par le prédicat EXISTS. Préférez lorsque cela est possible le SELECT *. SQL Server remplacera cette étoile par une constante quelconque la mieux calibrée pour pulser les performances. Mais sachez que cela n'est pas toujours possible... Tiens ... Dans quel cas ? Je vous y laisse réfléchir.


    A +

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 572
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    +1 pour le fait d'éviter l'utilisation de SELECT *. En effet SELECT * signifie récupérer toutes les données de la table, or il est rare le cas où toutes les données de la table seront utiles. C'est donc, gain en performance évident mis à part, une question de pragmatisme. On ne récupère pas d'information inutile et on facilite ainsi la compréhension du code. SELECT * peut il est vrai affecter lourdement une application lors de son évolution mais pas toujours. SSIS, l'ETL de Microsoft s'y adaptant en signalant une màj nécessaire des métadonnées.

    a+, =)
    -=Clement=-

  12. #12
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Merci pour toutes ces précisions

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

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. [MySQL] select where champ1+champ2 ?
    Par maxence64 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/05/2012, 21h03
  3. [struts][JSP][select] problème avec le select
    Par redge_touch dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/01/2004, 10h05

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