human
Pourquoi est-ce que ```SELECT *``` est une mauvaise pratique ? Ne serait-ce pas moins de code à modifier si vous ajoutiez une nouvelle colonne que vous vouliez ?
Je comprends que ```SELECT COUNT(*)``` pose un problème de performance sur certaines bases de données, mais que se passe-t-il si vous voulez vraiment toutes les colonnes
gpt
Le caractère astérisque, "*", dans l'instruction SELECT est un raccourci pour toutes les colonnes des tables impliquées dans la requête.
Performance
Le raccourci ```*``` peut être plus lent car :

* Tous les champs ne sont pas indexés, ce qui force une analyse complète de la table - moins efficace
* Ce que vous économisez en envoyant ```SELECT *``` sur le réseau risque de provoquer une analyse complète de la table
* Renvoi de plus de données que nécessaire
* Le renvoi de colonnes de fin utilisant un type de données de longueur variable peut entraîner une surcharge de recherche

Maintenance
Lors de l'utilisation de ```SELECT *``` :

* Une personne non familière avec le code devrait consulter la documentation pour savoir quelles colonnes sont renvoyées avant de pouvoir apporter des modifications compétentes. Rendre le code plus lisible, minimiser l'ambiguïté et le travail nécessaire pour les personnes non familières avec le code permet de gagner du temps et des efforts à long terme.
* Si le code dépend de l'ordre des colonnes, ```SELECT *``` masquera une erreur qui attend de se produire si l'ordre des colonnes d'une table est modifié.
* Même si vous avez besoin de toutes les colonnes au moment où la requête est écrite, cela peut ne pas être le cas à l'avenir.
* L'utilisation complique le profilage.

Design
```SELECT *``` est un anti-pattern :

* Le but de la requête est moins évident ; les colonnes utilisées par l'application sont opaques.
* Cela enfreint la règle de modularité concernant l'utilisation d'un typage strict chaque fois que possible. L'explicite est presque universellement meilleur.

Quand utiliser "SELECT *" ?
Il est acceptable d'utiliser ```SELECT *``` lorsque vous avez explicitement besoin de chaque colonne des tables impliquées, par opposition à chaque colonne qui existait lorsque la requête a été écrite. La base de données étendra automatiquement le * en la liste complète des colonnes - il n'y a pas de différence de performance.
Sinon, énumérez explicitement chaque colonne à utiliser dans la requête - de préférence en utilisant un alias de table.