Changeset 18
- Timestamp:
- 10/03/05 22:57:36 (4 years ago)
- Location:
- traduc/branches/bv747/sgml
- Files:
-
- 2 modified
-
problems.sgml (modified) (22 diffs)
-
queries.sgml (modified) (64 diffs)
Legend:
- Unmodified
- Added
- Removed
-
traduc/branches/bv747/sgml/problems.sgml
r13 r18 8 8 <para> 9 9 Lorsque vous trouvez un bogue dans <productname>PostgreSQL</productname>, 10 nous voulons en entendre parler. Vos rapports de bogues jouent un rôle11 important pour rendre <productname>PostgreSQL</productname> plus fiable car12 même avec la plus grande attention, nous ne pouvonspas garantir que chaque13 partie de <productname>PostgreSQL</productname> fonctionnera sur toute s les14 plates-forme s et dans toutes les circonstances.10 il faut que nous le sachions. Vos rapports de bogues sont essentiels pour 11 rendre <productname>PostgreSQL</productname> plus fiable. En effet 12 même la plus grande attention ne pas garantir que chaque 13 partie de <productname>PostgreSQL</productname> fonctionnera sur toute 14 plates-forme en toute circonstance. 15 15 </para> 16 16 17 17 <para> 18 18 Les suggestions suivantes ont pour but de vous former à la saisie d'un 19 rapport de bogue qui pourra ensuite être géré ede façon efficace. Il n'est20 pas requis de les suivre mais ce serait à l'avantage de tous.19 rapport de bogue qui pourra ensuite être géré de façon efficace. Il n'est 20 pas obligatoire de les suivre mais tout le monde en tirera profit. 21 21 </para> 22 22 23 23 <para> 24 Nous ne p ouvons pas promettrede corriger tous les bogues immédiatement. Si24 Nous ne promettons pas de corriger tous les bogues immédiatement. Si 25 25 le bogue est évident, critique ou affecte un grand nombre d'utilisateurs, il 26 26 y a de grandes chances pour que quelqu'un s'en charge. Il peut aussi arriver 27 que nous vous demand ons d'utiliser une version plus récente pour voir si le28 bogue est toujours présent. Ou nous pourrionsdécider que le bogue ne peut29 être corrigé avant qu'une réécriture massive, que nous avions planifiée, ne30 soit faite. Ou peut-être est-il trop difficile et que des choses plus31 importantes nous attendent. Si vous avez besoin d'aide immédiatement,32 considérez l'obtention d'un contrat de support commercial.27 que nous vous demandions d'utiliser une version plus récente pour voir si le 28 bogue est toujours présent. Nous pourrions aussi décider que le bogue ne peut 29 être corrigé avant qu'une réécriture massive, que nous planifierions, ne 30 soit réalisée. Peut-être encore cette correction est-elle trop difficile et 31 des choses plus importantes sont prévues. Si vous avez un besoin d'aide immédiat, 32 il vous faudra considérer la souscription d'un contrat de support commercial. 33 33 </para> 34 34 … … 38 38 <para> 39 39 Avant de rapporter un bogue, merci de lire et re-lire la documentation pour 40 vérifier que vous pouvez réellement faire ce que vous essayez de faire. Si41 ce n'est pas clair, rapportez-le aussi ; c'est un bogue dans la42 documentation. S'il s'avère que le programme fait différemment de ce43 qu'indique la documentation, c'est un bogue. Ceci peut inclure les44 circonstances suivantes, sans s'y limiter :40 vérifier que ce que vous essayez de faire est réellement prévu. Si 41 la documentation n'est pas claire sur ce point, faites également remonter cette 42 information ; c'est un bogue dans la documentation. S'il s'avère que le 43 programme se déroule différemment de ce qu'indique la documentation, c'est un bogue. 44 Ceci peut inclure les circonstances suivantes, sans s'y limiter : 45 45 46 46 <itemizedlist> 47 47 <listitem> 48 48 <para> 49 Un programme se termin antavec un signal fatal ou un message d'erreur du50 système d'exploitation qui indiquerait un problème avecle programme.49 Un programme se termine avec un signal fatal ou un message d'erreur du 50 système d'exploitation indiquant un problème dans le programme. 51 51 (Un contre-exemple pourrait être le message <quote>disk full</quote>, 52 52 disque plein, car vous devez le régler vous-même.) … … 56 56 <listitem> 57 57 <para> 58 Un programme produit une mauvaise sortie pour une entrée donnée.58 Un programme produit une sortie erronnée pour une entrée donnée. 59 59 </para> 60 60 </listitem> … … 70 70 <para> 71 71 Un programme accepte une entrée invalide sans information ou message 72 d'erreur. Mais gardez en tête que votre idée d'entrée invalide pourrait73 êtrenotre idée d'une extension ou d'une compatibilité avec les72 d'erreur. Il est toutefois possible que ce que vous estimez être une entrée 73 invalide soit en fait notre idée d'une extension ou d'une compatibilité avec les 74 74 pratiques traditionnelles. 75 75 </para> … … 85 85 </itemizedlist> 86 86 87 Ici, <quote>programme</quote> fait référence à un exécutable, pas au moteur88 du serveur.87 Ici, <quote>programme</quote> fait référence à un exécutable, pas uniquement 88 au moteur du serveur. 89 89 </para> 90 90 … … 92 92 Une lenteur ou une accaparation des ressources n'est pas nécessairement un 93 93 bogue. Lisez la documentation ou demandez sur une des listes de discussion 94 pour de l'aide concernant l'optimisation devos applications. Ne pas se94 de l'aide pour optimiser vos applications. Ne pas se 95 95 conformer au standard <acronym>SQL</acronym> n'est pas nécessairement un 96 96 bogue sauf si une telle conformité est indiquée explicitement. … … 98 98 99 99 <para> 100 Avant de continuer, vérifiez sur la liste des choses à faireainsi que dans101 la FAQ pour voir si votre bogue n'est pas déjà connu. Si vous n'arrivez pas à102 décoder les informations sur la liste des choses à faire, écrivez un rapport.100 Avant de continuer, vérifiez sur la liste des tâches, ainsi que dans 101 la FAQ, pour voir si votre bogue n'est pas déjà connu. Si vous n'arrivez pas à 102 décoder les informations sur la liste des tâches, écrivez un rapport. 103 103 Le minimum que nous puissions faire est de rendre cette liste plus claire. 104 104 </para> … … 107 107 <sect2> 108 108 <title>Que rapporter ?</title> 109 110 <para> 111 Le point le plus important à se rappeler avec les rapports de bogues est de 112 donner tous les faits et seulement les faits. Ne spéculez pas sur ce que vous 113 pensez qui ne va pas, sur ce qu'<quote>il semble faire</quote> ou sur quelle 114 partie le programme a une erreur. Si vous n'êtes pas familier avec 109 <para> 110 Le point le plus important lors d'un rapport de bogues est de se souvenir de 111 rapporter tous les faits et seulement les faits. Ne spéculez pas sur ce que vous 112 pensez être le dysfonctionnement, sur ce qu'<quote>il semblait faire</quote> ou 113 sur la partie du programme qui contient une erreur. Si vous n'êtes pas familier de 115 114 l'implémentation, vous vous tromperez probablement et vous ne nous aiderez 116 pas. Et même si vous avez raison, des explications complètes sont un bon117 supplément mais elles ne doivent pas se substituer aux faits. Si nous pensons115 pas. Même si vous aviez raison, des explications complètes sont un bon 116 complément mais elles ne doivent pas se substituer aux faits. Si nous décidons de 118 117 corriger le bogue, nous devons toujours le reproduire nous-même. Rapporter 119 les faits stricts est relativement simple (vous pouvez probablement 118 les faits stricts est relativement simple (vous pouvez probablement les 120 119 copier/coller à partir de l'écran) mais, trop souvent, des détails importants 121 120 sont oubliés parce que quelqu'un a pensé qu'ils n'avaient pas d'importance ou … … 131 130 <para> 132 131 La séquence exacte des étapes nécessaires pour reproduire le problème 133 <emphasis>à partir du lancement du programme</emphasis>. Ceci devrait se 134 suffire ; il n'est pas suffisant d'envoyer une simple instruction 132 <emphasis>à partir du lancement du programme</emphasis>. Ceci doit se 133 suffire ; si la sortie doit dépendre des données contenues dans 134 les tables, il n'est pas suffisant d'envoyer une simple instruction 135 135 <command>SELECT</command> sans les commandes 136 136 <command>CREATE TABLE</command> et <command>INSERT</command> 137 qui ont précédé, si la sortie devrait dépendre des données contenues dans 138 les tables. Nous n'avons pas le temps de comprendre le schéma de votre 139 base de données. Si nous sommes supposés créer nos propres données, nous 140 allons probablement ne pas voir le problème. 141 </para> 142 143 <para> 144 Le meilleur format pour un test suite à un problème relatif à SQL est un 137 qui ont précédé. Nous n'avons pas le temps de comprendre le schéma de votre 138 base de données et si nous sommes supposés créer nos propres données, nous 139 allons probablement passer à côté du problème. 140 </para> 141 142 <para> 143 Le meilleur format de jeu de test pour les problèmes relatif au SQL est un 145 144 fichier qui peut être lancé via l'interface 146 145 <application>psql</application> et qui montrera le problème. 147 146 (Assurez-vous de ne rien avoir dans votre fichier de lancement 148 <filename>~/.psqlrc</filename>.) Un début facilepour ce fichier est147 <filename>~/.psqlrc</filename>.) Un bon début pour ce fichier est 149 148 d'utiliser <application>pg_dump</application> pour récupérer les 150 149 déclarations des tables ainsi que les données nécessaires pour mettre en … … 157 156 <para> 158 157 Si votre application utilise une autre interface client, telle que 159 <application>PHP</>, alors essayez d'isoler le problème auxrequêtes160 erronées. Nous n'allons certainement pas mettre en place un serveur web161 pour reproduire votre problème. Dans tous les cas, rappelez-vous162 d'apporterles fichiers d'entrée exacts ; n'essayez pas de deviner158 <application>PHP</>, essayez alors d'isoler les requêtes 159 posant problème. Nous n'allons certainement pas mettre en place un serveur web 160 pour reproduire votre problème. Dans tous les cas, n'oubliez pas de fournir 161 les fichiers d'entrée exacts ; n'essayez pas de deviner 163 162 que le problème se pose pour les <quote>gros fichiers</quote> ou pour les 164 163 <quote>bases de données de moyenne taille</quote>, etc. car cette 165 information est trop inexacte, subjectivepour être utile.164 information est trop inexacte, voire subjective, pour être utile. 166 165 </para> 167 166 </listitem> … … 171 170 La sortie que vous obtenez. Merci de ne pas dire que cela <quote>ne 172 171 fonctionne pas</quote> ou s'est <quote>arrêté brutalement</quote>. S'il 173 existe un message d'erreur, montrez-le même si vous ne le comprenez pas.172 existe un message d'erreur, montrez-le, même si vous ne le comprenez pas. 174 173 Si le programme se termine avec une erreur du système d'exploitation, 175 174 dites-le. Même si le résultat de votre test est un arrêt brutal du 176 175 programme ou un autre soucis évident, il pourrait ne pas survenir sur 177 176 notre plateforme. Le plus simple est de copier directement la sortie du 178 terminal , sipossible.177 terminal quand cela est possible. 179 178 </para> 180 179 <note> 181 180 <para> 182 181 Si vous rapportez un message d'erreur, merci d'obtenir la forme la plus 183 verbeuse de ce message. Avec <application>psql</>, exécutez <literal>\set184 VERBOSITY verbose</> avant tout. Si vous récupérez le message des traces185 du serveur, initialisez la variable d'exécution186 <varname>log_error_verbosity</> avec<literal>verbose</> pour que tous les182 verbeuse de ce message. Avec <application>psql</>, exécutez avant tout <literal>\set 183 VERBOSITY verbose</>. Si vous récupérez le message des traces 184 du serveur, positionnez la variable d'exécution 185 <varname>log_error_verbosity</> à <literal>verbose</> pour que tous les 187 186 détails soient tracés. 188 187 </para> … … 193 192 pourrait ne pas contenir toutes les informations disponibles. Jetez aussi un 194 193 œil aux traces du serveur de la base de données. Si vous ne 195 conservez pas les traces de votre serveur, c'est le bon moment pour194 conservez pas les traces de votre serveur, c'est peut-être le bon moment pour 196 195 commencer à le faire. 197 196 </para> … … 207 206 est correct car cela correspond exactement à ce que nous attendions. Nous 208 207 ne devrions pas avoir à passer du temps pour décoder la sémantique exacte 209 de vos commandes. Tout spécialement, ne vous contentez pas de dire que208 de vos commandes. En particulier, ne vous contentez pas de dire que 210 209 <quote>Ce n'est pas ce que SQL spécifie/Oracle fait.</quote> Rechercher le 211 210 comportement correct à partir de <acronym>SQL</acronym> n'est pas … … 220 219 Toutes les options en ligne de commande ainsi que les autres options de 221 220 lancement incluant les variables d'environnement ou les fichiers de 222 configuration que vous avez modifié. Encore une fois, soyez exact. Si223 vous utilisez une distribution pré- packagée qui lance le serveur au221 configuration que vous avez modifié. Encore une fois, soyez précis. Si 222 vous utilisez une distribution pré-empaquetée qui lance le serveur au 224 223 démarrage, vous devriez essayer de retrouver ce que cette distribution 225 224 fait. … … 229 228 <listitem> 230 229 <para> 231 Tout ce que vous avez fait d e différent à partirdes instructions d'installation.230 Tout ce que vous avez fait différement des instructions d'installation. 232 231 </para> 233 232 </listitem> … … 240 239 aussi d'une option <option>--version</option> ; 241 240 <literal>postmaster --version</literal> et <literal>psql --version</literal> 242 devraient au moinsfonctionner.241 au moins devraient fonctionner. 243 242 Si la fonction ou les options n'existent pas, alors votre version est bien 244 trop ancienne et vous devez mettre à jour. Si vous avez lancé une version245 préparée sous forme de paquets, tel que les RPM, dites-le en incluant la246 sous-version que le paquet pourrait avoir. Si vous êtes sur une version247 CVS, mentionnez-le en indiquant la date et l'heure.243 trop ancienne et vous devez la mettre à jour. Si vous avez lancé une version 244 préparée sous forme de paquets, tels que des RPM, dites-le en incluant la 245 sous-version que le paquet aurait éventuellement. Si vous travaillez avec 246 une version CVS, mentionnez-le en indiquant la date et l'heure de la capture CVS. 248 247 </para> 249 248 250 249 <para> 251 250 Si votre version est antérieure à &version;, nous allons certainement 252 vous demander de mettre à jour. Il existe des tonnes de corrections à251 vous demander de la mettre à jour. Il existe des tonnes de corrections à 253 252 chaque mise à jour, ce qui explique pourquoi nous faisons de nouvelles 254 253 versions. … … 265 264 tout le monde sait ce que <quote>Debian</quote> contient ou que tout le 266 265 monde utilise des Pentiums. Si vous avez des problèmes à l'installation, 267 des informations sur le compilateurs, make, etc. sont aussi nécessaires.266 les informations concernant le compilateurs, make, etc. seront aussi nécessaires. 268 267 </para> 269 268 </listitem> 270 269 </itemizedlist> 271 270 272 N 'ayez pas peursi votre rapport de bogue devient assez long. C'est un fait.273 Il est mieux de tout rapporter la première fois plutôt que nous ayonsà vous274 demander tous les faits. D'un autre côté, si vos fichiers d'entrée sont trop271 Ne vous inquiétez pas si votre rapport de bogue devient assez long. C'est un fait. 272 Il est préférable de tout rapporter la première fois plutôt que de nous obliger à vous 273 demander tous les faits. D'un autre côté, si vos fichiers en entrée sont trop 275 274 gros, il est préférable de demander si quelqu'un souhaite s'y plonger. 276 275 </para> 277 276 278 277 <para> 279 Ne passez pas tout votre temps à vous demander quelles modifications apport ées280 pour que le problème s'en aille. Ceci ne nous aidera probablement pas à le281 résoudre. S'il arrive que le bogue ne peut pas être corrigé immédiatement,282 vous aurez toujours l'opportunité de chercher ceciet de partager vos trouvailles.283 De même, encore une fois, ne perdez pas votre temps à deviner pourquoi le284 bogue existe. Nous le trouveronsassez rapidement.278 Ne passez pas tout votre temps à vous demander quelles modifications apporter 279 aux données en entrée pour faire disparaître le problème. Ceci ne nous aidera 280 probablement pas à le résoudre. S'il se trouve que le bogue ne puisse pas être 281 corrigé instantanément, vous aurez toujours le temps de chercher et de partager vos trouvailles. 282 Encore une fois, ne perdez pas votre temps à deviner pourquoi le 283 bogue existe. Nous trouverons cela assez rapidement. 285 284 </para> 286 285 287 286 <para> 288 287 Lors de la rédaction d'un rapport de bogue, merci de choisir une terminologie 289 qui ne laisse pas place aux confusions. Le paquet logiciel entotalité est290 appelé <quote>PostgreSQL</quote>, quelque fois <quote>Postgres</quote> en court.288 qui ne laisse pas de place à l'ambiguité. Le paquet logiciel dans sa totalité est 289 appelé <quote>PostgreSQL</quote>, parfois <quote>Postgres</quote> en abrégé. 291 290 Si vous parlez spécifiquement du serveur, mentionnez-le mais ne dites pas 292 291 seulement <quote>PostgreSQL a planté</quote>. Un arrêt brutal d'un seul processus 293 292 serveur est assez différent de l'arrêt brutal du 294 293 <quote>postmaster</> père ; merci de ne pas dire que <quote>le postmaster 295 a planté</> lorsque vous voulez dire qu'un seul processus s'est arrêté, et non296 pasvice versa. De plus, les programmes clients tels que l'interface interactive294 a planté</> lorsque vous voulez dire qu'un seul processus s'est arrêté, et 295 vice versa. De plus, les programmes clients tels que l'interface interactive 297 296 <quote><application>psql</application></quote> sont complètement séparés du 298 297 moteur. Essayez d'être précis sur la provenance du problème : client ou … … 306 305 <para> 307 306 En général, envoyez vos rapports de bogue à la liste de discussion des 308 rapports de bogue (<email>pgsql-b ogues@postgresql.org</email>).309 Nous vous demandons d'utiliser un sujet descriptif pour votre courrier310 électronique, par exempleune partie du message d'erreur.307 rapports de bogue (<email>pgsql-bugs@postgresql.org</email>). 308 Il est recommandé d'utiliser un sujet descriptif pour votre courriel, pourquoi 309 pas une partie du message d'erreur. 311 310 </para> 312 311 … … 315 314 site web du projet 316 315 <ulink url="http://www.postgresql.org/">http://www.postgresql.org/</ulink>. 317 Saisir un rapport de bogue de cette façon fait que celui-ci est envoyéà la318 liste de discussion <email>pgsql-b ogues@postgresql.org</email>.316 Saisir un rapport de bogue de cette façon implique son envoi à la 317 liste de discussion <email>pgsql-bugs@postgresql.org</email>. 319 318 </para> 320 319 … … 323 322 préfériez qu'il ne soit pas immédiatement visible dans les archives 324 323 publiques, ne l'envoyez pas sur <literal>pgsql-bugs</literal>. Les problèmes 325 de sécurité peuvent être rapportés de façon privé sur324 de sécurité peuvent être rapportés en privé sur 326 325 <email>security@postgresql.org</email>. 327 326 </para> 328 327 329 328 <para> 330 N'envoyez pas de rapports de bogue aux listes de discussion d esutilisateurs,329 N'envoyez pas de rapports de bogue aux listes de discussion d'utilisateurs, 331 330 comme <email>pgsql-sql@postgresql.org</email> ou 332 331 <email>pgsql-general@postgresql.org</email>. 333 332 Ces listes de discussion servent à répondre aux questions des utilisateurs et 334 les abonnés ne souhaitent pas recevoir de rapports de bogues. Plus important,335 il s ont peu de chance de les corriger.333 les abonnés ne souhaitent pas, en général, recevoir de rapports de bogues. Plus important, 334 il y a peu de chance qu'ils les corrigent. 336 335 </para> 337 336 … … 341 340 Cette liste sert aux discussions concernant le développement de 342 341 <productname>PostgreSQL</productname> et il serait bon de conserver les 343 rapports de bogue séparément. Nous pou rrions choisir de discuter de votre342 rapports de bogue séparément. Nous pouvons toujours décider de discuter de votre 344 343 rapport de bogue sur <literal>pgsql-hackers</literal> si le problème 345 nécessite que plus de personnes s'en occupent.344 nécessite plus de personnes pour s'en occuper. 346 345 </para> 347 346 … … 362 361 <note> 363 362 <para> 364 D û, malheureusement, au grand nombre de pourriels (spam), toutes les363 Du fait du grand nombre de pourriels (spam) qui circulent, toutes les 365 364 adresses de courrier électronique ci-dessus appartiennent à des listes 366 365 de discussion fermées. C'est-à-dire que vous devez être abonné pour être 367 autorisé à y envoyer un courrie r. Néanmoins, vous n'avez pas besoin de vous366 autorisé à y envoyer un courriel. Néanmoins, vous n'avez pas besoin de vous 368 367 abonner pour utiliser le formulaire web de rapports de bogue. Si vous 369 souhaitez envoyer des courrie rs mais ne pas recevoir le trafic de la liste,368 souhaitez envoyer des courriels mais ne pas recevoir le trafic de la liste, 370 369 vous pouvez vous abonner et configurer l'option <literal>nomail</>. 371 Pour plus d'information, envoyez un courrie rà370 Pour plus d'information, envoyez un courriel à 372 371 <email>majordomo@postgresql.org</email> 373 372 avec le seul mot <literal>help</> dans le corps du message. -
traduc/branches/bv747/sgml/queries.sgml
r13 r18 13 13 14 14 <para> 15 Les précédents chapitres ont expliqué comme créer des tables, comment15 Les précédents chapitres expliquaient comme créer des tables, comment 16 16 les remplir avec des données et comment manipuler ces données. 17 Maintenant, nous discutons enfin dela façon de récupérer ces données17 Il est temps d'aborder maintenant la façon de récupérer ces données 18 18 depuis la base de données. 19 19 </para> … … 24 24 25 25 <para> 26 Le processus et la commande de récupération des données sont appelés une26 Le processus de récupération des données et la commande elle-même sont appelés 27 27 <firstterm>requête</firstterm>. En SQL, la commande 28 <command>SELECT</command> est utilisé pour spécifier des requêtes. La28 <command>SELECT</command> est utilisée pour spécifier des requêtes. La 29 29 syntaxe générale de la commande <command>SELECT</command> est <synopsis> 30 SELECT <replaceable>liste_select</replaceable> FROM 31 <replaceable>expression_table</replaceable> 32 <optional><replaceable>_specification_tri</replaceable></optional> 33 </synopsis> 34 Les sections suivantes décrivent le détail de la liste de sélection, 35 l'expression des tables et la spécification du tri. 30 SELECT <replaceable>liste_select</replaceable> FROM <replaceable>expression_table</replaceable> <optional><replaceable>specification_tri</replaceable></optional> 31 </synopsis> 32 Les sections suivantes décrivent en détails la liste de sélection, 33 l'expression de tables et la spécification du tri. 36 34 </para> 37 35 … … 44 42 commande récupérera toutes les lignes et toutes les colonnes de 45 43 <literal>table1</literal>. (La méthode de récupération dépend de l'application 46 client e. Par exemple, le programme <application>psql</application> affichera47 une table, façon art ASCII, alors que les bibliothèques du client offriront 48 des fonctions d'extraction de valeurs individuelles à partir du résultat de49 la requête.) <literal>*</literal> comme liste de sélection signifie que toutes50 les colonnes de l'expression de table seront récupérées. Une liste de sélection51 peut aussi être un sous-ensemble des colonnes disponibles ou effectuer 52 un calcul en utilisant les colonnes. Par exemple, si <literal>table1</literal>53 dispose des colonnes nommées <literal>a</>, <literal>b</> et <literal>c</> (et54 peut-être d'autres), vous pouvez lancer la requête suivante :44 client. Par exemple, le programme <application>psql</application> affichera 45 une table, façon art ASCII, alors que les bibliothèques client offriront 46 des fonctions d'extraction de valeurs individuelles à partir du résultat de 47 la requête.) <literal>*</literal> utilisé comme liste de sélection désigne toutes 48 les colonnes que l'expression de la table fournie. Une liste de sélection 49 peut aussi sélectionner un sous-ensemble des colonnes disponibles ou effectuer 50 un calcul en utilisant les colonnes. Par exemple, si <literal>table1</literal> 51 dispose des colonnes nommées <literal>a</>, <literal>b</> et <literal>c</> (et 52 peut-être d'autres), la requête suivante peut être effectuée : 55 53 <programlisting> 56 54 SELECT a, b + c FROM table1; … … 62 60 <para> 63 61 <literal>FROM table1</literal> est un type très simple d'expression de 64 tables : il lit une seule table. En général, les expressions de tables65 sont des constructions complexes de tables de base, de jointures et de66 sous-requêtes. Mais vous pouvez aussi entièrementomettre l'expression de table67 etutiliser la commande <command>SELECT</command> comme une calculatrice :62 tables : il lit une seule table. En général, les expressions de tables 63 sont des constructions complexes de tables de base, de jointures et de 64 sous-requêtes. Il est également possible d'omettre l'expression de table 65 et d'utiliser la commande <command>SELECT</command> comme une calculatrice : 68 66 <programlisting> 69 67 SELECT 3 * 4; 70 68 </programlisting> 71 69 Ceci est plus utile si les expressions de la liste de sélection renvoient des 72 résultats varia nts. Par exemple, vous pouvezappeler une fonction de cette70 résultats variables. Il est, par exemple, possible d'appeler une fonction de cette 73 71 façon : 74 72 <programlisting> … … 90 88 L'expression de table contient une clause <literal>FROM</> qui peut être 91 89 suivie des clauses <literal>WHERE</>, <literal>GROUP BY</> et 92 <literal>HAVING</>. Les expressions de table triviales réfèrent simplementà93 une table sur le disque, une table de base, mais des expressions plus90 <literal>HAVING</>. Les expressions de table triviales font simplement référence à 91 une table sur le disque, appelée table de base, mais des expressions plus 94 92 complexes peuvent être utilisées pour modifier ou combiner des tables de base 95 de différentes façon .93 de différentes façons. 96 94 </para> 97 95 98 96 <para> 99 97 Les clauses optionnelles <literal>WHERE</>, <literal>GROUP BY</> et 100 <literal>HAVING</> dans l'expression de table spécifient un tubede98 <literal>HAVING</> dans l'expression de table spécifient un enchaînement de 101 99 transformations successives réalisées sur la table dérivée de la 102 100 clause <literal>FROM</>. Toutes ces transformations produisent une table 103 101 virtuelle fournissant les lignes à passer à la liste de sélection qui 104 choisira les lignes à afficher de la requête.102 choisira les lignes à afficher en sortie de la requête. 105 103 </para> 106 104 … … 110 108 <para> 111 109 La clause <literal>FROM</> dérive une table à partir d'une ou plusieurs 112 tables données dans une liste de référence dont les tables sont séparées par 113 des virgules. 110 tables, spécifiées dans une liste de référence dont le séparateur est une virgule. 114 111 <synopsis> 115 112 FROM <replaceable>reference_table</replaceable> <optional>, … … 117 114 </synopsis> 118 115 119 Une référence de table pourrait être un nom de table (avec en option 120 le nom du schéma) ou une table dérivée comme une sous-requête, une table 121 jointe ou une combinaison complexe de celles-ci. Si plus d'une référence de 122 tables est listé dans la clause <literal>FROM</>, elle sont jointes pour 123 former une table virtuelle intermédiaire qui pourrait être le sujet des 124 transformations des clauses <literal>WHERE</>, <literal>GROUP BY</>, 125 et <literal>HAVING</> et est finalement le résultat des expressions de 126 table. 116 Une référence de table peut être un nom de table (optionnellement préfixé par 117 le nom du schéma) ou une table dérivée. Une table dérivée peut-être une sous-requête, 118 une jointure de tables ou toute combinaison complexe de celles-ci. Si plusieurs 119 références de tables sont listées dans la clause <literal>FROM</>, elles sont 120 jointes (voir plus bas) pour former la table virtuelle intermédiaire, sujet possible de 121 transformations par les clauses <literal>WHERE</>, <literal>GROUP BY</> et 122 <literal>HAVING</>. et qui est finalement le résultat de l'expression des tables globale. 127 123 </para> 128 124 … … 132 128 133 129 <para> 134 Lorsqu'une référence de table nomme une table qui est la table parentd'une135 table suivant la hiérarchie de l'héritage, la référence de table produit les130 Lorsqu'une référence de table fait référence à une table supertable d'une 131 hiérarchie d'héritage, la référence de table produit les 136 132 lignes non seulement de la table mais aussi des successeurs de cette table 137 sauf si le mot clé <literal>ONLY</> précède le nom de la table. Néanmoins,133 sauf si le mot clé <literal>ONLY</> précède le nom de la table. Toutefois, 138 134 la référence produit seulement les colonnes qui apparaissent dans la table 139 nommée ...toute colonne ajoutée dans une sous-table est ignorée.135 nommée --- toute colonne ajoutée dans une sous-table est ignorée. 140 136 </para> 141 137 … … 175 171 176 172 <indexterm> 177 <primary>cross ed joind</primary>173 <primary>cross join</primary> 178 174 </indexterm> 179 175 … … 185 181 <para> 186 182 Pour chaque combinaison de lignes provenant de 187 <replaceable>T1</replaceable> et <replaceable>T2</replaceable>, la188 table dérivée contiendra une ligne cons istantde toutes les colonnes de183 <replaceable>T1</replaceable> et de <replaceable>T2</replaceable>, la 184 table dérivée contiendra une ligne constituée de toutes les colonnes de 189 185 <replaceable>T1</replaceable> suivies de toutes les colonnes de 190 186 <replaceable>T2</replaceable>. Si les tables ont respectivement N et M … … 196 192 <replaceable>T2</replaceable></literal> est équivalent à 197 193 <literal>FROM <replaceable>T1</replaceable>, 198 <replaceable>T2</replaceable></literal>. C'est aussi équivalent à194 <replaceable>T2</replaceable></literal>. C'est aussi équivalent à 199 195 <literal>FROM <replaceable>T1</replaceable> INNER JOIN 200 196 <replaceable>T2</replaceable> ON TRUE</literal> (voir ci-dessous). … … 233 229 <para> 234 230 Les mots <literal>INNER</literal> et 235 <literal>OUTER</literal> sont optionnel les dans toutes les formes.231 <literal>OUTER</literal> sont optionnels dans toutes les formes. 236 232 <literal>INNER</literal> est la valeur par défaut ; 237 233 <literal>LEFT</literal>, <literal>RIGHT</literal> et … … 240 236 241 237 <para> 242 La <firstterm>condition de lajointure</firstterm> est spécifiée dans243 la clause <literal>ON</> ou <literal>USING</> ou implicitement par le238 La <firstterm>condition de jointure</firstterm> est spécifiée dans 239 la clause <literal>ON</> ou <literal>USING</>, ou implicitement par le 244 240 mot <literal>NATURAL</>. La condition de jointure détermine les lignes 245 des deux tables source considérées comme <quote>correspondante</quote>,241 des deux tables sources <quote>correspondantes</quote>, 246 242 comme l'explique le paragraphe ci-dessous. 247 243 </para> … … 249 245 <para> 250 246 La clause <literal>ON</> est le type le plus général de condition de 251 jointure : ilprend une expression booléenne du même genre que252 cel ui utilisée dans une clause <literal>WHERE</>. Une pairesde lignes247 jointure : elle prend une expression booléenne du même genre que 248 celle utilisée dans une clause <literal>WHERE</>. Une paire de lignes 253 249 de <replaceable>T1</> et <replaceable>T2</> correspondent si 254 250 l'expression <literal>ON</> est évaluée à vraie (true) pour ces deux … … 257 253 258 254 <para> 259 <literal>USING</> est lanotation raccourcie : elle prend une260 liste de noms de colonnes séparées par des virgules, que les tables261 jointes onten commun, et forme une condition de jointure spécifiant255 <literal>USING</> est une notation raccourcie : elle prend une 256 liste de noms de colonnes, séparés par des virgules, que les tables 257 jointes doivent avoir en commun, et forme une condition de jointure spécifiant 262 258 l'égalité de chacune de ces paires de colonnes. De plus, la sortie de 263 <literal>JOIN USING</> a une colonne pour chaque paire s égales des264 colonnes en entrée ,suivies par toutes les autres colonnes de chaque265 table. D u coup, <literal>USING (a, b, c)</literal> est équivalent à266 <literal>ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)</literal> avec267 l 'exception que si <literal>ON</> est utilisé, il y aura deux colonnes259 <literal>JOIN USING</> a une colonne pour chaque paire égalée de 260 colonnes en entrée. Ces colonnes sont suivies par toutes les autres colonnes de chaque 261 table. De ce fait, <literal>USING (a, b, c)</literal> est équivalent à 262 <literal>ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)</literal> à 263 la différence que si <literal>ON</> est utilisé, il y a deux colonnes 268 264 <literal>a</>, <literal>b</>, puis <literal>c</> dans le résultat, alors 269 qu'avec <literal>USING</>, il n'y en aura it euqu'une de chaque.265 qu'avec <literal>USING</>, il n'y en aura qu'une de chaque. 270 266 </para> 271 267 … … 287 283 Enfin, <literal>NATURAL</> est un format raccourci de 288 284 <literal>USING</> : il forme une liste <literal>USING</> 289 cons istant exactement des noms decolonnes apparaissant à la fois dans290 deux tables en entrée. Comme avec <literal>USING</>, ces colonnes291 apparaissent seulementune fois dans la table de sortie.285 constituée exactement des noms des colonnes apparaissant à la fois dans 286 les deux tables en entrée. Comme avec <literal>USING</>, ces colonnes 287 n'apparaissent qu'une fois dans la table de sortie. 292 288 </para> 293 289 … … 301 297 <listitem> 302 298 <para> 303 Pour chaque ligne R1 de T1, la table jointe a une ligne pour chaque304 ligne de T2 satisfaisant la condition de jointure avec R1.299 Pour chaque ligne L1 de T1, la table jointe a une ligne pour chaque 300 ligne de T2 satisfaisant la condition de jointure avec L1. 305 301 </para> 306 302 </listitem> … … 330 326 <listitem> 331 327 <para> 332 Tout d'abord, une jointure interne est réalisée. Puis, pour chaque333 ligne de T1 qui ne satisf ont pas la condition de jointure avec toutes334 les lignes de T2, une ligne jointe est ajoutée avec des valeurs328 En premier lieu, une jointure interne est réalisée. Puis, pour chaque 329 ligne de T1 qui ne satisfait à la condition de jointure avec aucune 330 des lignes de T2, une ligne jointe est ajoutée avec des valeurs 335 331 nulles dans les colonnes de T2. Du coup, la table jointe a au moins 336 une ligne pour chaque ligne de T1 quelque soient les conditions.332 une ligne pour chaque ligne de T1 quelques soient les conditions. 337 333 </para> 338 334 </listitem> … … 362 358 <listitem> 363 359 <para> 364 Tout d'abord, une jointure interne est réalisée. Puis, pour chaque365 ligne de T2 qui ne satisfait pas la condition de jointure avecune366 lignede T1, une ligne jointe est ajoutée avec des valeurs nulles360 En premier lieu, une jointure interne est réalisée. Puis, pour chaque 361 ligne de T2 qui ne satisfait à la condition de jointure avec aucune 362 des lignes de T1, une ligne jointe est ajoutée avec des valeurs nulles 367 363 dans les colonnes de T1. C'est l'inverse d'une jointure gauche : 368 la table résultante aura une ligne pour chaque ligne de T2 quelque 364 la table résultante aura une ligne pour chaque ligne de T2 quelques 369 365 soient les conditions. 370 366 </para> … … 377 373 <listitem> 378 374 <para> 379 Tout d'abord, une jointure interne est réalisée. Puis, pour chaque380 ligne de T1 qui ne satisfait pas la condition de jointure avecune381 ligne de T2, une ligne jointe est ajoutéavec des valeurs nulles dans382 les colonnes de T2. De plus, pour chaque ligne de T2 qui ne satisfait383 pas la condition de jointure avec les lignes de T1, une ligne jointe375 En premier lieu, une jointure interne est réalisée. Puis, pour chaque 376 ligne de T1 qui ne satisfait à la condition de jointure avec aucune 377 des lignes de T2, une ligne jointe est ajoutée avec des valeurs nulles dans 378 les colonnes de T2. Enfin, pour chaque ligne de T2 qui ne satisfait 379 à la condition de jointure avec aucune des lignes de T1, une ligne jointe 384 380 est ajoutée avec des valeurs nulles dans les colonnes de T1. 385 381 </para> … … 393 389 394 390 <para> 395 Les jointures de tous les types peuvent être chaînées ensemble ou396 imbriquées : soit les deux soit une des deux, parmi397 <replaceable>T1</replaceable> et <replaceable>T2</replaceable>, pourraient398 être des tables. Les parenthèses peuvent être utilisées autour des clauses391 Des jointures de tout type peuvent être chaînées ou imbriquées : 392 <replaceable>T1</replaceable> et <replaceable>T2</replaceable> peuvent 393 être des tables jointes (l'une, l'autre ou les deux). 394 Des parenthèses peuvent être utilisées autour des clauses 399 395 <literal>JOIN</> pour contrôler l'ordre de jointure. En l'absence de 400 parenthèses, les clauses <literal>JOIN</> s ont imbriquéesde gauche à396 parenthèses, les clauses <literal>JOIN</> s'imbriquent de gauche à 401 397 droite. 402 398 </para> 403 399 404 400 <para> 405 Pour r assembler tout ceci, supposons que nous avons une table401 Pour résumer, supposons que nous ayons une table 406 402 <literal>t1</literal> 407 403 <programlisting> 408 num | n ame404 num | nom 409 405 -----+------ 410 406 1 | a … … 414 410 et une table <literal>t2</literal> 415 411 <programlisting> 416 num | val ue412 num | valeur 417 413 -----+------- 418 414 1 | xxx … … 420 416 5 | zzz 421 417 </programlisting> 422 nous obtenons les résultats suivants des différentes jointures :418 nous obtenons les résultats suivants pour les différentes jointures : 423 419 <screen> 424 420 <prompt>=></> <userinput>SELECT * FROM t1 CROSS JOIN t2;</> 425 num | n ame | num | value426 -----+----- -+-----+-------427 1 | a | 1 | xxx428 1 | a | 3 | yyy429 1 | a | 5 | zzz430 2 | b | 1 | xxx431 2 | b | 3 | yyy432 2 | b | 5 | zzz433 3 | c | 1 | xxx434 3 | c | 3 | yyy435 3 | c | 5 | zzz421 num | nom | num | valeur 422 -----+-----+-----+------- 423 1 | a | 1 | xxx 424 1 | a | 3 | yyy 425 1 | a | 5 | zzz 426 2 | b | 1 | xxx 427 2 | b | 3 | yyy 428 2 | b | 5 | zzz 429 3 | c | 1 | xxx 430 3 | c | 3 | yyy 431 3 | c | 5 | zzz 436 432 (9 rows) 437 433 438 434 <prompt>=></> <userinput>SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;</> 439 num | n ame | num | value440 -----+----- -+-----+-------441 1 | a | 1 | xxx442 3 | c | 3 | yyy435 num | nom | num | valeur 436 -----+-----+-----+------- 437 1 | a | 1 | xxx 438 3 | c | 3 | yyy 443 439 (2 rows) 444 440 445 441 <prompt>=></> <userinput>SELECT * FROM t1 INNER JOIN t2 USING (num);</> 446 num | n ame | value447 -----+----- -+-------448 1 | a | xxx449 3 | c | yyy442 num | nom | valeur 443 -----+-----+------- 444 1 | a | xxx 445 3 | c | yyy 450 446 (2 rows) 451 447 452 448 <prompt>=></> <userinput>SELECT * FROM t1 NATURAL INNER JOIN t2;</> 453 num | n ame | value454 -----+----- -+-------455 1 | a | xxx456 3 | c | yyy449 num | nom | valeur 450 -----+-----+------- 451 1 | a | xxx 452 3 | c | yyy 457 453 (2 rows) 458 454 459 455 <prompt>=></> <userinput>SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;</> 460 num | n ame | num | value461 -----+----- -+-----+-------462 1 | a | 1 | xxx463 2 | b | |464 3 | c | 3 | yyy456 num | nom | num | valeur 457 -----+-----+-----+------- 458 1 | a | 1 | xxx 459 2 | b | | 460 3 | c | 3 | yyy 465 461 (3 rows) 466 462 467 463 <prompt>=></> <userinput>SELECT * FROM t1 LEFT JOIN t2 USING (num);</> 468 num | n ame | value469 -----+----- -+-------470 1 | a | xxx471 2 | b |472 3 | c | yyy464 num | nom | valeur 465 -----+-----+------- 466 1 | a | xxx 467 2 | b | 468 3 | c | yyy 473 469 (3 rows) 474 470 475 471 <prompt>=></> <userinput>SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;</> 476 num | n ame | num | value477 -----+----- -+-----+-------478 1 | a | 1 | xxx479 3 | c | 3 | yyy480 | | 5 | zzz472 num | nom | num | valeur 473 -----+-----+-----+------- 474 1 | a | 1 | xxx 475 3 | c | 3 | yyy 476 | | 5 | zzz 481 477 (3 rows) 482 478 483 479 <prompt>=></> <userinput>SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;</> 484 num | n ame | num | value485 -----+----- -+-----+-------486 1 | a | 1 | xxx487 2 | b | |488 3 | c | 3 | yyy489 | | 5 | zzz480 num | nom | num | valeur 481 -----+-----+-----+------- 482 1 | a | 1 | xxx 483 2 | b | | 484 3 | c | 3 | yyy 485 | | 5 | zzz 490 486 (4 rows) 491 487 </screen> … … 494 490 <para> 495 491 La condition de jointure spécifiée avec <literal>ON</> peut aussi contenir 496 des conditions sans relation directe avec la jointure. Ceci peut prouver 497 son utilité pour quelques requêtes mais son utilisation doit avoir été 498 réfléchie. Par exemple : 492 des conditions sans relation directe avec la jointure. Par exemple : 499 493 <screen> 500 494 <prompt>=></> <userinput>SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';</> 501 num | n ame | num | value502 -----+----- -+-----+-------503 1 | a | 1 | xxx504 2 | b | |505 3 | c | |495 num | nom | num | valeur 496 -----+-----+-----+------- 497 1 | a | 1 | xxx 498 2 | b | | 499 3 | c | | 506 500 (3 rows) 507 501 </screen> … … 524 518 <para> 525 519 Un nom temporaire peut être donné aux tables et aux références de tables 526 complexe, qui sera ensuite utilisé pour référencer la table dérivée dans la 527 suite de l'exécution. Cela s'appelle un <firstterm>alias de 528 table</firstterm>. 529 </para> 530 531 <para> 532 Pour créer un alias de table, écrivez 533 <synopsis> 534 FROM <replaceable>reference_table</replaceable> AS 535 <replaceable>alias</replaceable> 536 </synopsis> 537 or 520 complexes. Celui-ci sera ensuite utilisé pour faire référence à la table dérivée dans la 521 suite de l'exécution. On appelle cela un <firstterm>alias de table</firstterm>. 522 </para> 523 524 <para> 525 Pour créer un alias de table, il suffit d'écrire 526 <synopsis> 527 FROM <replaceable>reference_table</replaceable> AS <replaceable>alias</replaceable> 528 </synopsis> 529 ou 538 530 <synopsis> 539 531 FROM <replaceable>reference_table</replaceable> <replaceable>alias</replaceable> 540 532 </synopsis> 541 Le mot clé <literal>AS</literal> est du bruit.542 <replaceable>alias</replaceable> peut être toutidentifiant.533 Le mot clé <literal>AS</literal> n'est pas nécessaire. 534 <replaceable>alias</replaceable> peut être n'importe quel identifiant. 543 535 </para> 544 536 545 537 <para> 546 538 Une application typique des alias de table est l'affectation d'identifiants 547 cour s pour les noms de tableslongs, ce qui permet de garder des clauses de539 courts pour les noms de table longs, ce qui permet de garder des clauses de 548 540 jointures lisibles. Par exemple : 549 541 <programlisting> 550 SELECT * FROM nom_de_table_tres_tres_long s JOIN un_autre_nom_trs_long a ON 551 s.id = a.num; 542 SELECT * FROM nom_de_table_tres_long n JOIN un_autre_nom_assez_long u ON n.id = u.num; 552 543 </programlisting> 553 544 </para> … … 560 551 SELECT * FROM ma_table AS m WHERE ma_table.a > 5; 561 552 </programlisting> 562 n'est pas valide pour une syntaxe SQL. Ce qui va réellement se passer 563 (c'est une extension de <productname>PostgreSQL</productname> au standard) 564 est qu'une référence de table implicite est ajoutée à la clause 565 <literal>FROM</literal>, de façon à ce que la requête soit exécutée comme 566 si elle était écrite ainsi 553 n'est pas une syntaxe SQL valide. En réalité, (c'est une extension du standard 554 proposée par <productname>PostgreSQL</productname>) une référence de table 555 implicite est ajoutée à la clause <literal>FROM</literal>, de façon à ce 556 que la requête soit exécutée comme si elle était écrite ainsi 567 557 <programlisting> 568 558 SELECT * FROM ma_table AS m, ma_table AS ma_table WHERE ma_table.a > 5; 569 559 </programlisting> 570 ce qui résultera en une jointure croisée, ce quin'est habituellement pas571 ce qu e vous voulez.572 </para> 573 574 <para> 575 Les alias de table sont disponibles principalement pour aider àl'écriture576 de requête mais ils deviennent nécessaires pour joindre une table avec560 ce qui aboutira à une jointure croisée. Et ce n'est habituellement pas 561 ce qui est attendu. 562 </para> 563 564 <para> 565 Les alias de table sont essentiellement disponibles pour faciliter l'écriture 566 de requêtes mais ils apparaissent nécessaires pour joindre une table avec 577 567 elle-même, par exemple 578 568 <programlisting> 579 569 SELECT * FROM ma_table AS a CROSS JOIN ma_table AS b ... 580 570 </programlisting> 581 De plus, un alias est requis si la référence de latable est une571 De plus, un alias est requis si la référence de table est une 582 572 sous-requête (voir <xref linkend="queries-subqueries">). 583 573 </para> 584 574 585 575 <para> 586 Les parenthèses sont utilisées pour résoudreles ambiguités. L'instruction587 suivante affectera l 'alias <literal>b</literal> au résultat de la jointure588 contrairement à l'exemple précédent e :576 Les parenthèses sont utilisées pour lever les ambiguités. L'instruction 577 suivante affectera le résultat de la jointure à l'alias <literal>b</literal>, 578 contrairement à l'exemple précédent : 589 579 <programlisting> 590 580 SELECT * FROM (ma_table AS a CROSS JOIN ma_table) AS b ... … … 596 586 des tables : 597 587 <synopsis> 598 FROM <replaceable>reference_table</replaceable> <optional>AS</optional> 599 <replaceable>alias</replaceable> ( <replaceable>colonne1</replaceable> 600 <optional>, <replaceable>colonne2</replaceable> <optional>, 601 ...</optional></optional> ) 602 </synopsis> 603 Si le nombre d'alias de colonnes spécifié est plus petit que le nombre 604 de colonnes dont dispose la table réelle, les colonnes suivantes ne sont 605 pas renommées. Cette syntaxe est particulièrement utile dans le cas de 606 jointure de même table ou dans le cas de sous-requêtes. 607 </para> 608 609 <para> 610 Quand un alias est appliqué à la sortie d'une clause <literal>JOIN</> en 611 utilisant n'importe laquelle de ces formes, l'alias cache le nom original à 612 l'intérieur du <literal>JOIN</>. Par exemple, 588 FROM <replaceable>reference_table</replaceable> <optional>AS</optional> <replaceable>alias</replaceable> ( <replaceable>colonne1</replaceable> <optional>, <replaceable>colonne2</replaceable> <optional>,...</optional></optional> ) 589 </synopsis> 590 Si le nombre d'alias de colonnes spécifiés est plus petit que le nombre 591 de colonnes dont dispose la table réelle, les colonnes résiduelles ne sont 592 pas renommées. Cette syntaxe est particulièrement utile dans le cas 593 d'auto-jointures ou dans le cas de sous-requêtes. 594 </para> 595 596 <para> 597 Quand un alias est appliqué à la sortie d'une clause <literal>JOIN</>, 598 quelqu'en soit la forme, l'alias cache le nom original à l'intérieur du 599 <literal>JOIN</>. Par exemple, 613 600 <programlisting> 614 601 SELECT a.* FROM ma_table AS a JOIN ta_table AS b ON ... 615 602 </programlisting> 616 is valid SQL, but603 est du SQL valide, mais 617 604 <programlisting> 618 605 SELECT a.* FROM (ma_table AS a JOIN ta_table AS b ON ...) AS c … … 631 618 632 619 <para> 633 Une sous-requête spécifiant une table dérivée doit être enfermée634 dans des parenthèses et <emphasis>doit</emphasis> se voir affecté un alias620 Une sous-requête spécifiant une table dérivée doit être écrite entre 621 parenthèses et <emphasis>doit</emphasis> se voir affecter un alias 635 622 de table. (Voir <xref linkend="queries-table-aliases">.) Par exemple : 636 623 <programlisting> … … 640 627 641 628 <para> 642 Cette exemple est équivalent à <literal>FROM table1 AS 643 nom_alias</literal>. Des cas plus intéressants, qui ne peuvent pas être 644 réduit à une jointure pleine, arrivent quand la sous-requête implique un 645 groupement ou une agrégat. 629 Cet exemple est équivalent à <literal>FROM table1 AS nom_alias</literal>. 630 Des cas plus intéressants, qui ne peuvent pas être réduits à une jointure 631 pleine, surviennent quand la sous-requête implique un groupement ou un agrégat. 646 632 </para> 647 633 </sect3> … … 659 645 <para> 660 646 Les fonctions de table sont des fonctions produisant un ensemble de 661 lignes composées de types de données de base(types scalaires) ou de types662 de données compos és (lignes de table). Elles sont utilisées comme une663 table, une vue ou une sous-requête de la clause <literal>FROM</> d'une664 requête. Les colonnes re nvoyées par les fonctions de table peuvent être647 lignes composées de types de données basiques (types scalaires) ou de types 648 de données composites (lignes de table). Elles sont utilisées de la même façon 649 qu'une table, une vue ou une sous-requête de la clause <literal>FROM</> d'une 650 requête. Les colonnes retournées par les fonctions de table peuvent être 665 651 incluses dans une clause <literal>SELECT</>, <literal>JOIN</> ou 666 652 <literal>WHERE</> de la même manière qu'une colonne de table, vue ou … … 669 655 670 656 <para> 671 Si une fonction de table renvoie un type de données de base, la colonne657 Si une fonction de table renvoie un type de données basique, la colonne 672 658 de résultat est nommée comme la fonction. Si la fonction renvoie un type 673 composite, les colonnes résultant s ont le même nom que les attributs659 composite, les colonnes résultantes ont le même nom que les attributs 674 660 individuels du type. 675 661 </para> 676 662 677 663 <para> 678 Une fonction de table pourrait avoir un alias dans la clause 679 <literal>FROM</> mais elle pourrait être laissée sans alias. Si une 680 fonction est utilisée dans la clause <literal>FROM</> sans alias, le nom de 681 la fonction est utilisé comme nom de table résultante. 664 Une fonction de table peut avoir un alias dans la clause <literal>FROM</>. 665 Dans le cas contraire, le nom de la fonction est utilisé comme nom de table résultante. 682 666 </para> 683 667 … … 687 671 CREATE TABLE truc (trucid int, trucsousid int, trucnom text); 688 672 689 CREATE FUNCTION recuptruc(int) RETURNS SETOF fooAS '673 CREATE FUNCTION recuptruc(int) RETURNS SETOF truc AS ' 690 674 SELECT * FROM truc WHERE trucid = $1; 691 675 ' LANGUAGE SQL; … … 703 687 704 688 <para> 705 Dans certains cas, il est utile de définir des fonctions de table pouvant706 renvo yer des ensembles de colonnes différentes suivant la façon dont elles707 sont appelées. Pour supporter ceci, la fonction de table est déclarée comme689 Dans certains cas, il est utile de définir des fonctions de table qui 690 renvoient des ensembles de colonnes différents suivant la façon dont elles 691 sont appelées. Pour ce faire, la fonction de table est déclarée comme 708 692 renvoyant le pseudotype <type>record</>. Quand une telle fonction est 709 693 utilisée dans une requête, la structure de ligne attendue doit être 710 spécifiée dans la requête elle-même , de façon à ce que le système sache711 comment analyser et planifier la requête. Considérez cetexemple :694 spécifiée dans la requête elle-même. De cette façon, le système saura 695 comment analyser et planifier la requête. Par exemple : 712 696 <programlisting> 713 697 SELECT * … … 717 701 </programlisting> 718 702 La fonction <literal>dblink</> exécute une requête distante (voir 719 <filename>contrib/dblink</>). Elle déclare renvoyer le type 720 <type>record</> car elle pourrait être utilisée pour tout type de requête. 721 L'ensemble de colonnes réelles doit être spécifié dans la requête appelant 722 de façon à ce que l'analyseur sache, par exemple, ce que comment 723 étendre <literal>*</>. 703 <filename>contrib/dblink</>). Elle a été déclarée avec un type de retour 704 <type>record</>, puisqu'elle peut être utilisée pour tout type de requête. 705 L'ensemble de colonnes réelles doit être spécifié dans la requête appelante 706 de sorte que l'analyseur sache, par exemple, comment étendre <literal>*</>. 724 707 </para> 725 708 </sect3> … … 738 721 WHERE <replaceable>condition_recherche</replaceable> 739 722 </synopsis> 740 où <replaceable>condition_recherche</replaceable> est toute expression de741 valeur définie dans <xref linkend="sql-expressions"> et renvoyant une valeur742 de type <type>boolean</type>.743 </para> 744 745 <para> 746 Après l a réalisationde la clause <literal>FROM</>, chaque ligne de la747 table virtuelle dérivée est vérifiée avecla condition de recherche. Si le748 résultat de la vérification est positi ve(true), la ligne est conservée dans749 la table de sortie, sinon (c'est-à-dire si le résultat est faux ou nul ,la750 ligne est abandonnée. La condition de recherche référence typiquement au751 moins quelques colonnes de la table générée dans la clause752 <literal>FROM</> ; ceci n'est pas requis mais, dans le cas contraire,753 la clause <literal>WHERE</> n'aurait aucune utilité.723 où <replaceable>condition_recherche</replaceable> est une expression de 724 valeur, telle que définie dans <xref linkend="sql-expressions">, qui retourne 725 une valeur de type <type>boolean</type>. 726 </para> 727 728 <para> 729 Après le traitement de la clause <literal>FROM</>, chaque ligne de la 730 table virtuelle dérivée est confrontée à la condition de recherche. Si le 731 résultat de la vérification est positif (true), la ligne est conservée dans 732 la table de sortie, sinon (c'est-à-dire si le résultat est faux ou nul) la 733 ligne est abandonnée. La condition de recherche fait, en général, référence 734 à une colonne de la table engendrée dans la clause <literal>FROM</> ; 735 ceci n'est pas impératif mais, dans le cas contraire, la clause <literal>WHERE</> 736 s'avère inutile. 754 737 </para> 755 738 … … 758 741 Avant l'implémentation de la syntaxe <literal>JOIN</>, il était nécessaire 759 742 de placer la condition de jointure d'une jointure interne dans la clause 760 <literal>WHERE</>. Par exemple, ces expressions de tables sont 761 équivalentes : 743 <literal>WHERE</>. Les expressions de tables suivantes sont équivalentes : 762 744 <programlisting> 763 745 FROM a, b WHERE a.id = b.id AND b.val > 5 … … 767 749 FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5 768 750 </programlisting> 769 ou même peut-être751 ou même 770 752 <programlisting> 771 753 FROM a NATURAL JOIN b WHERE b.val > 5 772 754 </programlisting> 773 L aquelle vous utilisez est plutôt uneaffaire de style. La syntaxe774 <literal>JOIN</> dans la clause <literal>FROM</> n'est p robablement pas775 aussiportable vers les autres systèmes de gestion de bases de données SQL.776 Pour les jointures externes, il n'y a pas d'autres choix : elles777 doivent être faites dans la clause <literal>FROM</> clause. Une clause755 L'utilisation de l'une par rapport à l'autre est affaire de style. La syntaxe 756 <literal>JOIN</> dans la clause <literal>FROM</> n'est pas forcément très 757 portable vers les autres systèmes de gestion de bases de données SQL. 758 Pour les jointures externes, il n'y qu'une seule possibilité : elles 759 doivent être faites dans la clause <literal>FROM</>. Une clause 778 760 <literal>ON</>/<literal>USING</> d'une jointure externe n'est 779 761 <emphasis>pas</> équivalente à une condition <literal>WHERE</> parce 780 qu'elle détermine l'ajout de lignes (pour les lignes qui ne correspondent 781 pas en entrée) ainsi que pour la suppression de lignes dans le résultat 782 final. 762 qu'elle détermine l'ajout de lignes (pour les lignes en entrée sans 763 correspondance) ainsi que la suppression de lignes dans le résultat final. 783 764 </para> 784 765 </note> … … 802 783 <literal>FROM</>. Les lignes qui ne correspondent pas à la condition de la 803 784 recherche de la clause <literal>WHERE</> sont éliminées de la table 804 <literal>fdt</literal>. Notez l'utilisation de sous-requêtes scalaires en 805 tant qu'expressions de valeurs. Comme n'importe quelle autre requête, les 806 sous-requêtes peuvent employer des expressions de tables complexes. Notez 807 aussi comment <literal>fdt</literal> est référencée dans les sous-requêtes. 808 Qualifier <literal>c1</> comme <literal>fdt.c1</> est seulement nécessaire 809 si <literal>c1</> est aussi le nom d'une colonne dans la table d'entrée 810 dérivée de la sous-requête. Mais qualifier le nom de colonne ajoute à la 811 clarté même lorsque cela n'est pas nécessaire. Cet exemple montre comment 812 le nom de colonne d'une requête externe est étendue dans les requêtes 813 internes. 785 <literal>fdt</literal>. On peut noter l'utilisation de sous-requêtes scalaires 786 comme expressions de valeurs. A l'instar de n'importe quelle autre requête, les 787 sous-requêtes peuvent employer des expressions de tables complexes. On peut 788 également noter la façon dont <literal>fdt</literal> est référencée dans les 789 sous-requêtes. Qualifier <literal>c1</> sous la forme <literal>fdt.c1</> n'est 790 nécessaire que si <literal>c1</> est aussi le nom d'une colonne dans la table 791 dérivée en entrée de la sous-requête. Mais qualifier le nom de colonne, même lorsque cela 792 n'est pas nécessaire, ajoute à la clarté. Cet exemple montre comment le nommage 793 de colonne d'une requête externe est étendu dans les requêtes internes. 814 794 </para> 815 795 </sect2> … … 830 810 <para> 831 811 Après avoir passé le filtre <literal>WHERE</>, la table d'entrée dérivée 832 peut être sujette à un regroupement en utilisant la clause <literal>GROUP833 BY</> et à une élimination de groupe de lignes avecla clause812 peut faire l'objet d'un regroupement par l'utilisation de la clause 813 <literal>GROUP BY</> et d'une élimination de lignes groupées par la clause 834 814 <literal>HAVING</>. 835 815 </para> … … 839 819 FROM ... 840 820 <optional>WHERE ...</optional> 841 GROUP BY <replaceable>reference_colonne_regroupement</replaceable> 842 <optional>, 843 <replaceable>reference_colonne_regroupement</replaceable></optional>... 844 </synopsis> 845 846 <para> 847 La clause <literal>GROUP BY</> est utilisée pour regrouper des lignes d'une 848 table partageant les mêmes valeurs dans toutes les colonnes précisées. 821 GROUP BY <replaceable>reference_colonne_regroupement</replaceable> <optional>, <replaceable>reference_colonne_regroupement</replaceable></optional>... 822 </synopsis> 823 824 <para> 825 La clause <literal>GROUP BY</> est utilisée pour regrouper les lignes d'une 826 table qui partagent les mêmes valeurs pour toutes les colonnes précisées. 849 827 L'ordre dans lequel ces colonnes sont indiquées importe peu. Le but est de 850 réduire chaque groupe de lignes partageant des valeurs communes en un seul851 groupe de ligne représentant toutes les lignes du groupe. Ceci se fait en852 éliminantles redondances dans la sortie et/ou pour calculer les agrégats828 réduire chaque groupe de lignes partageant des valeurs communes en une seule 829 ligne de groupe représentative de toutes les lignes du groupe. Ceci est fait 830 pour éliminer les redondances dans la sortie et/ou pour calculer les agrégats 853 831 s'appliquant à ces groupes. Par exemple : 854 832 <screen> … … 873 851 874 852 <para> 875 Dans la seconde requête, nous n'aurions pas puécrire <literal>SELECT *876 FROM test1 GROUP BY x</literal> parce qu'il n'existe pas une seule valeur877 pour la colonne <literal>y</> pouvant être associé avec chaque autre groupe.853 Dans la seconde requête, il n'est pas possible d'écrire <literal>SELECT * 854 FROM test1 GROUP BY x</literal> parce qu'il n'existe pas de valeur unique 855 pour la colonne <literal>y</> pouvant être associée avec chaque autre groupe. 878 856 Les colonnes de regroupement peuvent être référencées dans la liste de 879 857 sélection car elles ont une valeur constante connue par groupe. … … 881 859 882 860 <para> 883 En général, si une table est groupée, les colonnes qui ne sont pas884 utilisées dans le regroupement ne peuvent pas être référencées saufdans les861 En général, si une table est groupée, il ne peut pas être fait référence aux 862 colonnes qui ne sont pas utilisées dans le regroupement sinon dans les 885 863 expressions d'agrégats. Voici un exemple d'expressions d'agrégat : 886 864 <screen> … … 893 871 (3 rows) 894 872 </screen> 895 Ici, <literal>sum</literal> est la fonction d'agrégat qui calcule une seule 896 valeur pour le groupe entier. Plus d'informations sur les fonctions 897 d'agrégats disponibles sont proposées dans <xref 898 linkend="functions-aggregate">. 873 Ici, <literal>sum</literal> est une fonction d'agrégat qui calcule une 874 valeur unique pour tout le groupe. On pourra touver plus d'informations sur 875 les fonctions d'agrégats disponibles dans <xref linkend="functions-aggregate">. 899 876 </para> 900 877 901 878 <tip> 902 879 <para> 903 Le regroupement sans expressions d'agrégats calcule effectivement 904 l'ensemble les valeurs distinctes d'une colonne. Ceci peut aussi se faire 905 en utilisant la clause <literal>DISTINCT</> (voir <xref 906 linkend="queries-distinct">). 880 Le regroupement sans expression d'agrégats calcule effectivement 881 l'ensemble des valeurs distinctes d'une colonne. Le même résultat peut être obtenu 882 à l'aide de la clause <literal>DISTINCT</> (voir <xref linkend="queries-distinct">). 907 883 </para> 908 884 </tip> 909 885 910 886 <para> 911 Voici un autre exemple : il calcule les vantes totales pour chaque912 produit (plutôt quele total des ventes sur tous les produits).887 L'exemple suivant calcule les ventes totales pour chaque produit (plutôt que 888 le total des ventes sur tous les produits). 913 889 <programlisting> 914 890 SELECT produit_id, p.nom, (sum(v.unite) * p.prix) AS ventes … … 917 893 </programlisting> 918 894 Dans cet exemple, les colonnes <literal>produit_id</literal>, 919 <literal>p.nom</literal> et <literal>p.prix</literal> doivent êtredans la895 <literal>p.nom</literal> et <literal>p.prix</literal> doivent se trouver dans la 920 896 clause <literal>GROUP BY</> car elles sont référencées dans la liste de 921 897 sélection de la requête. (Suivant la façon dont est conçue la table 922 produits, le nom et le prix p ourraient être totalement dépendants de l'ID du923 produit , donc des regroupements supplémentaires pourraient théoriquement924 être inutiles mais ceci n'est pas encore implémenté.) La colonne898 produits, le nom et le prix peuvent être totalement dépendants de l'ID du 899 produit et de ce fait, les regroupements supplémentaires ne sont théoriquement pas 900 nécessaires. Mais ceci n'est pas encore implémenté.) La colonne 925 901 <literal>s.unite</> n'a pas besoin d'être dans la liste <literal>GROUP 926 BY</> car elle est seulement utiliséedans l'expression de l'agrégat902 BY</> car elle est utilisée uniquement dans l'expression de l'agrégat 927 903 (<literal>sum(...)</literal>) représentant les ventes d'un produit. Pour 928 904 chaque produit, la requête renvoie une ligne de résumé sur les ventes de ce … … 931 907 932 908 <para> 933 En SQL strict, <literal>GROUP BY</> peut seulement grouper les colonnes de934 la table source mais <productname>PostgreSQL</productname> étend ceci en935 autorisant <literal>GROUP BY</> à grouper aussi lescolonnes de la liste de936 sélection. Grouper par expressions de valeurs au lieu desimples noms de937 colonne s est aussi permis.909 La norme SQL standard ne définit pour <literal>GROUP BY</> que le groupement 910 par colonnes de la table source. <productname>PostgreSQL</productname> autorise 911 également <literal>GROUP BY</> à grouper par colonnes de la liste de 912 sélection. Grouper par expressions de valeurs plutôt que par simples noms de 913 colonne est également autorisé. 938 914 </para> 939 915 … … 943 919 944 920 <para> 945 Si une table a été groupée en utilisant la clause <literal>GROUP 946 BY</literal> mais que seul certains groupes sont intéressants, la clause 947 <literal>HAVING</literal> peut être utilisée, plus comme une clause 948 <literal>WHERE</>, pour éliminer les groupes d'une table groupée. Voici la 949 syntaxe : 950 <synopsis> 951 SELECT <replaceable>liste_selection</replaceable> FROM ... <optional>WHERE 952 ...</optional> GROUP BY ... HAVING 953 <replaceable>expression_booléenne</replaceable> 954 </synopsis> 955 Les expressions de la clause <literal>HAVING</> peuvent référer à la fois 956 aux expressions groupées et aux expressions non groupées (ce qui impliquent 921 Si une table a été groupée en utilisant la clause <literal>GROUP BY</literal> 922 mais que seuls certains groupes ont un intérêt, la clause 923 <literal>HAVING</literal> peut être utilisée, à l'instar d'une clause 924 <literal>WHERE</>, pour éliminer les groupes d'une table groupée. La syntaxe 925 est la suivante : 926 <synopsis> 927 SELECT <replaceable>liste_selection</replaceable> FROM ... <optional>WHERE ...</optional> GROUP BY ... HAVING <replaceable>expression_booléenne</replaceable> 928 </synopsis> 929 Les expressions de la clause <literal>HAVING</> peuvent faire référence autant 930 à des expressions groupées qu'à des expressions non groupées (impliquant 957 931 nécessairement une fonction d'agrégat). 958 932 </para> … … 978 952 979 953 <para> 980 De nouveau, un exempleplus réaliste :954 L'exemple suivant est plus réaliste : 981 955 <programlisting> 982 956 SELECT produit_id, p.nom, (sum(v.unite) * (p.prix - p.cout)) AS profit … … 984 958 WHERE v.date > CURRENT_DATE - INTERVAL '4 weeks' 985 959 GROUP BY produit_id, p.nom, p.prix, p.cout 986 HAVING sum(p.prix * s.unite) > 5000;960 HAVING sum(p.prix * v.unite) > 5000; 987 961 </programlisting> 988 962 Dans l'exemple ci-dessus, la clause <literal>WHERE</> sélectionne les 989 lignes parune colonne qui n'est pas groupée (l'expression est vraie963 lignes à partir d'une colonne qui n'est pas groupée (l'expression est vraie 990 964 seulement pour les ventes des quatre dernières semaines) alors que la 991 965 clause <literal>HAVING</> restreint la sortie aux groupes dont le total des 992 966 ventes dépasse 5000. Notez que les expressions d'agrégats n'ont pas besoin 993 d'être identiques dans toutes les parties d'une requête.967 d'être les mêmes dans toutes les parties d'une requête. 994 968 </para> 995 969 </sect2> … … 1006 980 1007 981 <para> 1008 Comme montré dans la section précédente, l'expression de table pour la 1009 commande <command>SELECT</command> construit une table virtuelle intermédiaire 1010 en combinant les tables, vues, en éliminant les lignes, en groupant, etc. Cette 1011 table est finalement passée à la réalisation de la <firstterm>liste de 1012 sélection</firstterm>. Cette liste détermine les <emphasis>colonnes</emphasis> 1013 de la table intermédiaire à afficher. 982 Comme cela a été vu dans la section précédente, l'expression de table 983 pour la commande <command>SELECT</command> construit une table virtuelle 984 intermédiaire en combinant les tables et les vues, en éliminant des lignes, en 985 réalisant des groupements, etc. Cette table est finalement transmise pour 986 traitement à la <firstterm>liste de sélection</firstterm>. 987 Cette liste détermine les <emphasis>colonnes</emphasis> de la table intermédiaire 988 à afficher. 1014 989 </para> 1015 990 … … 1025 1000 émet toutes les colonnes que l'expression de table produit. Sinon, une liste 1026 1001 de sélection est une liste d'expressions de valeurs séparées par des 1027 virgules (comme défini dans <xref linkend="sql-expressions">). Par exemple,1028 cela pourrait être une liste desnoms de colonnes :1002 virgules (comme défini dans <xref linkend="sql-expressions">). Cela peut, par 1003 exemple, être une liste de noms de colonnes : 1029 1004 <programlisting> 1030 1005 SELECT a, b, c FROM ... 1031 1006 </programlisting> 1032 Les noms de colonnes <literal>a</>, <literal>b</> et <literal>c</> sont 1007 Les noms de colonnes <literal>a</>, <literal>b</> et <literal>c</> sont, 1033 1008 soit les noms actuels des colonnes des tables référencées dans la clause 1034 <literal>FROM</> soit les alias qui leur ont été donnés (voir l'explication1009 <literal>FROM</>, soit les alias qui leur ont été donnés (voir l'explication 1035 1010 dans <xref linkend="queries-table-aliases">). L'espace de nom disponible 1036 1011 dans la liste de sélection est le même que dans la clause <literal>WHERE</> 1037 sauf si leregroupement est utilisé, auquel cas c'est le même que dans la1012 sauf si un regroupement est utilisé, auquel cas c'est le même que dans la 1038 1013 clause <literal>HAVING</>. 1039 1014 </para> 1040 1015 1041 1016 <para> 1042 Si plus d'une table a une colonne du même nom, le nom de la table doit1043 aussi être donnécomme dans1017 Si plusieurs tables ont une colonne du même nom, le nom de la table doit aussi 1018 être donné, comme dans 1044 1019 <programlisting> 1045 1020 SELECT tbl1.a, tbl2.a, tbl1.b FROM ... 1046 1021 </programlisting> 1047 En travaillant avec plusieurs tables, il est aussi utile de demander toutes1048 les colonnes d'une table particulière :1022 En travaillant avec plusieurs tables, il peut aussi être utile de demander 1023 toutes les colonnes d'une table particulière : 1049 1024 <programlisting> 1050 1025 SELECT tbl1.*, tbl2.a FROM ... … … 1055 1030 <para> 1056 1031 Si une expression de valeur arbitraire est utilisée dans la liste de 1057 sélection, il ajoute conceptuellement une nouvelle colonne virtuelle dansla1032 sélection, cela ajoute conceptuellement une nouvelle colonne virtuelle à la 1058 1033 table renvoyée. L'expression de valeur est évaluée une fois pour chaque 1059 ligne avec une substitution des valeurs de lignes avec les référencesde1034 ligne, les valeurs de lignes étant substituées pour chaque référence de 1060 1035 colonnes. Mais les expressions de la liste de sélection n'ont pas à 1061 référencer les colonnes dans l'expression de la table de la clause1062 <literal>FROM</> ; elles pourrai t être des expressions arithmétiques1063 constantes, par exemple.1036 faire référence aux colonnes de l'expression de table issue de la clause 1037 <literal>FROM</> ; elles pourraient, par exemple, aussi bien être des 1038 expressions arithmétiques constantes. 1064 1039 </para> 1065 1040 </sect2> … … 1075 1050 <para> 1076 1051 Les entrées dans la liste de sélection peuvent se voir affecter des noms 1077 pour la suite d e l'exécution. La <quote>suite de l'exécution</quote> dans ce1078 cas est une spécification optionnelle du tri et l'application client1079 ( c'est-à-dire les en-têtes de colonne pour l'affichage). Par exemple :1052 pour la suite du traitement. La <quote>suite du traitement</quote> dans le 1053 cas présent est une spécification optionnelle du tri et l'application client 1054 (les en-têtes de colonne pour l'affichage, par exemple). Ainsi : 1080 1055 <programlisting> 1081 1056 SELECT a AS value, b + c AS sum FROM ... … … 1084 1059 1085 1060 <para> 1086 Si aucun nom de colonne en sortie n'est spécifié en utilisant1087 <literal>AS</>, le système affecte un nom par défaut. Pour les références de1088 c olonne simple, c'est le nom de la colonne référencée. Pour les appels de1061 Si aucun nom de colonne en sortie n'est spécifié par l'utilisation de <literal>AS</>, 1062 le système affecte un nom par défaut. Pour les références de colonne simple, 1063 c'est le nom de la colonne référencée. Pour les appels de 1089 1064 fonction, il s'agit du nom de la fonction. Pour les expressions complexes, 1090 le système générera un nom générique.1065 le système engendrera un nom générique. 1091 1066 </para> 1092 1067 1093 1068 <note> 1094 1069 <para> 1095 Le nom des colonnes en sortie est différent ici de cequi est fait dans la1070 Le nommage des colonnes en sortie est ici différent de celui qui est fait dans la 1096 1071 clause <literal>FROM</> (voir <xref linkend="queries-table-aliases">). Ce 1097 tube vous permettra en fait de renommer deux fois la même colonne mais le1098 nom choisi dans la liste de sélection est celui qui sera passé.1072 tube vous permettra en fait de renommer deux fois la même colonne, mais le 1073 nom choisi dans la liste de sélection est celui qui sera retenu. 1099 1074 </para> 1100 1075 </note> … … 1113 1088 1114 1089 <para> 1115 Après l a réalisation de la liste de sélection, la table résultant pourrait1116 être optionnellement sujet à l'élimination des duplications. Le mot clé1090 Après le traitement de la liste de sélection, la table résultante peut 1091 faire optionnellement l'objet de l'élimination des duplicats. Le mot clé 1117 1092 <literal>DISTINCT</literal> est écrit directement après 1118 <literal>SELECT</literal> pour activer ce ci :1093 <literal>SELECT</literal> pour activer cela : 1119 1094 <synopsis> 1120 1095 SELECT DISTINCT <replaceable>liste_selection</replaceable> ... 1121 1096 </synopsis> 1122 (A u lieude <literal>DISTINCT</>, le mot <literal>ALL</literal> peut être1097 (A la place de <literal>DISTINCT</>, le mot <literal>ALL</literal> peut être 1123 1098 utilisé pour sélectionner le comportement par défaut, la récupération de 1124 1099 toutes les lignes.) … … 1126 1101 1127 1102 <para> 1128 <indexterm><primary>valeur nulle</><secondary sortas="DISTINCT"> dans1103 <indexterm><primary>valeur nulle</><secondary sortas="DISTINCT">avec 1129 1104 DISTINCT</></indexterm> 1130 1105 Évidemment, les deux lignes sont considérées distinctes si elles diffèrent 1131 dansau moins une valeur de colonne. Les valeurs nulles sont considérées1106 par au moins une valeur de colonne. Les valeurs nulles sont considérées 1132 1107 égales dans cette comparaison. 1133 1108 </para> 1134 1109 1135 1110 <para> 1136 Alternativement, une expression arbitraire peut déterminer quelles lignes 1137 doivent être considérées distinctes : 1138 <synopsis> 1139 SELECT DISTINCT ON (<replaceable>expression</replaceable> <optional>, 1140 <replaceable>expression</replaceable> ...</optional>) 1141 <replaceable>liste_selection</replaceable> ... 1111 Alternativement, une expression arbitraire peut permettre de déterminer les 1112 lignes à considérer distinctes : 1113 <synopsis> 1114 SELECT DISTINCT ON (<replaceable>expression</replaceable> <optional>, <replaceable>expression</replaceable> ...</optional>) <replaceable>liste_selection</replaceable> ... 1142 1115 </synopsis> 1143 1116 Ici, <replaceable>expression</replaceable> est une expression de valeur 1144 1117 arbitraire, évaluée pour toutes les lignes. Les lignes dont toutes les 1145 expressions sont égales sont considérées commedupliquées et seule la1146 première ligne de cet ensemble est conservée dans la sortie. Notez que la1147 <quote>première ligne</quote> d'un ensemble est nonprévisible sauf si la1118 expressions sont égales sont considérées dupliquées et seule la 1119 première ligne de cet ensemble est conservée dans la sortie. Il est notable 1120 que la <quote>première ligne</quote> d'un ensemble est imprévisible sauf si la 1148 1121 requête est triée sur assez de colonnes pour garantir une ordre unique des 1149 colonnes arrivant dans le filtre <literal>DISTINCT</>. (Le traitement de1150 <literal>DISTINCT ON</> parvient après le tri de<literal>ORDER BY</>.)1151 </para> 1152 1153 <para> 1154 La clause <literal>DISTINCT ON</> ne fait pas partie du standard SQL etest1155 quelque fois considéré comme étant un mauvais style à causede la nature1156 potentiellement indéterminée de ses résultats. Avec l'utilisation judicieuse1157 de <literal>GROUP BY</> et de sous-requêtes dans <literal>FROM</>, la1158 construction peut être évitéemais elle représente souvent l'alternative la1159 plus agréable.1122 colonnes arrivant dans le filtre <literal>DISTINCT</>. (Le traitement par 1123 <literal>DISTINCT ON</> survient après le tri par <literal>ORDER BY</>.) 1124 </para> 1125 1126 <para> 1127 La clause <literal>DISTINCT ON</> ne fait pas partie du standard SQL. Elle est 1128 souvent considérée comme de mauvais style du fait de la nature 1129 potentiellement indéterminée de ses résultats. L'utilisation judicieuse 1130 de <literal>GROUP BY</> et de sous-requêtes dans la clause <literal>FROM</> 1131 permet d'éviter cette construction, mais elle représente souvent l'alternative la 1132 plus pratique. 1160 1133 </para> 1161 1134 </sect2> … … 1190 1163 <para> 1191 1164 Les résultats de deux requêtes peuvent être combinés en utilisant les 1192 opérations d'ensemble : union, intersection et différence. La syntaxe1165 opérations ensemblistes : union, intersection et différence. La syntaxe 1193 1166 est 1194 1167 <synopsis> … … 1201 1174 </synopsis> 1202 1175 <replaceable>requete1</replaceable> et 1203 <replaceable>requete2</replaceable> sont les requêtes pouvant utiliser 1204 toutes les fonctionnalités discutées ici. Les opérations d'ensemble peuvent 1205 aussi être combinées et chaînées, par exemple 1206 <synopsis> 1207 <replaceable>requete1</replaceable> UNION <replaceable>requete2</replaceable> 1208 UNION <replaceable>requete3</replaceable> 1209 </synopsis> 1210 signifie réellement 1211 <synopsis> 1212 (<replaceable>requete1</replaceable> UNION <replaceable>requete2</replaceable>) 1213 UNION <replaceable>requete3</replaceable> 1214 </synopsis> 1215 </para> 1216 1217 <para> 1218 <literal>UNION</> ajoute effectivement le résultat de 1176 <replaceable>requete2</replaceable> sont des requêtes pouvant utiliser 1177 toutes les fonctionnalités discutées jusqu'ici. Les opérations ensemblistes peuvent 1178 également être combinées et chaînées. Ainsi 1179 <synopsis> 1180 <replaceable>requete1</replaceable> UNION <replaceable>requete2</replaceable> UNION <replaceable>requete3</replaceable> 1181 </synopsis> 1182 qui signifie réellement 1183 <synopsis> 1184 (<replaceable>requete1</replaceable> UNION <replaceable>requete2</replaceable>) UNION <replaceable>requete3</replaceable> 1185 </synopsis> 1186 </para> 1187 1188 <para> 1189 <literal>UNION</> ajoute simplement le résultat de 1219 1190 <replaceable>requete2</replaceable> au résultat de 1220 <replaceable>requete1</replaceable> ( bien qu'il n'y ait pas de garantie1221 qu'il s'agit de l'ordre dans lequel les lignes sont réellement renvoyées). De1222 plus, il élimine toutes les lignes dupliquées, dans le sens de1223 <literal>DISTINCT</>, sauf si <literal>UNION ALL</> est utilisée.1191 <replaceable>requete1</replaceable> (il n'y a cependant aucune garantie 1192 sur l'ordre effectif de retour des lignes). De plus, toutes les lignes dupliquées 1193 sont éliminées, au sens de <literal>DISTINCT</>, à moins que <literal>UNION ALL</> 1194 ne soit utilisé. 1224 1195 </para> 1225 1196 … … 1227 1198 <literal>INTERSECT</> renvoie toutes les lignes qui sont à la fois dans le 1228 1199 résultat de <replaceable>requete1</replaceable> et dans le résultat de 1229 <replaceable>requete2</replaceable>. Les lignes dupliquées sont éliminées 1200 <replaceable>requete2</replaceable>. Les lignes dupliquées sont éliminées, 1230 1201 sauf si <literal>INTERSECT ALL</> est utilisé. 1231 1202 </para> … … 1233 1204 <para> 1234 1205 <literal>EXCEPT</> renvoie toutes les lignes qui sont dans le résultat de 1235 <replaceable>requete1</replaceable> mais pas dans le résultatde1236 <replaceable>requete2</replaceable>. ( Ceci est quelque fois appelé la1237 <firstterm>différence</> entre deux requêtes.) De nouveau, les lignes1238 dupliquées sont éliminées sauf si <literal>EXCEPT ALL</> est utilisé.1239 </para> 1240 1241 <para> 1242 Pour calculer l'union, l'intersection ou la différence de deux requêtes, les1243 deux requêtes doivent être <quote>compatibles pour une union</quote>, ce qui1244 signifie qu'elles doivent renvoyer le même nombre de colonnes et que les1206 <replaceable>requete1</replaceable> mais pas dans celui de 1207 <replaceable>requete2</replaceable>. (On parle parfois de 1208 <firstterm>différence</> entre deux requêtes.) Là aussi, les lignes 1209 dupliquées sont éliminées, sauf si <literal>EXCEPT ALL</> est utilisé. 1210 </para> 1211 1212 <para> 1213 Pour calculer l'union, l'intersection ou la différence de deux requêtes, il est 1214 impératif que les deux requêtes soient <quote>compatibles pour une union</quote>. 1215 Cela signifie qu'elles doivent renvoyer le même nombre de colonnes et que les 1245 1216 colonnes correspondantes doivent avoir des types de données compatibles, 1246 comme décrit dans <xref linkend="typeconv-union-case">.1217 comme cela est décrit dans <xref linkend="typeconv-union-case">. 1247 1218 </para> 1248 1219 </sect1> … … 1261 1232 1262 1233 <para> 1263 Après qu'une requête ait produit une table en sortie (après que la liste de 1264 sélection ait été traitée), elle peut être optionnellement triée. Si le tri 1265 n'a pas été choisi, les lignes sont renvoyées dans un ordre aléatoire. 1266 L'ordre réel dans ce cas dépendra des types de plan de parcours et de 1267 jointure et de l'ordre sur le disque mais vous ne devez pas vous y fier. Un 1268 tri particulier en sortie peut seulement être garantie si l'étape de tri est 1269 choisie explicitement. 1234 Après qu'une table de sortie ait été produite par une requête (après que la liste de 1235 sélection ait été traitée), elle peut être optionnellement triée. Dans le cas 1236 contraire, les lignes sont renvoyées dans un ordre aléatoire. 1237 L'ordre réel, dans ce cas, dépendra des types de plan de parcours et de 1238 jointure et de l'ordre des données sur le disque, mais on ne peut s'y fier. 1239 Seul le tri explicite permet de garantir un ordre particulier en sortie. 1270 1240 </para> 1271 1241 … … 1275 1245 SELECT <replaceable>liste_selection</replaceable> 1276 1246 FROM <replaceable>expression_table</replaceable> 1277 ORDER BY <replaceable>colonne1</replaceable> <optional>ASC | DESC</optional> 1278 <optional>, <replaceable>colonne2</replaceable> <optional>ASC | DESC</optional> 1279 ...</optional> 1280 </synopsis> 1281 <replaceable>colonne1</replaceable>, etc. réfèrent les colonnes de la liste 1282 de sélection. Ceci peut soit être le nom de sortie d'une colonne (voir 1283 <xref linkend="queries-column-labels">) ou le numéro d'une colonne. Voici 1284 quelques exemples : 1247 ORDER BY <replaceable>colonne1</replaceable> <optional>ASC | DESC</optional> <optional>, <replaceable>colonne2</replaceable> <optional>ASC | DESC</optional>...</optional> 1248 </synopsis> 1249 <replaceable>colonne1</replaceable>, etc. font référence aux colonnes de la liste 1250 de sélection. Il peut s'agir du nom de sortie d'une colonne (voir 1251 <xref linkend="queries-column-labels">) ou du numéro d'une colonne. Quelques exemples : 1285 1252 <programlisting> 1286 1253 SELECT a, b FROM table1 ORDER BY a; … … 1291 1258 1292 1259 <para> 1293 Comme une extension du standard SQL, <productname>PostgreSQL</productname>1294 autorise aussi l 'ordredes expressions arbitraires :1260 En extension au standard SQL, <productname>PostgreSQL</productname> 1261 autorise aussi le tri par des expressions arbitraires : 1295 1262 <programlisting> 1296 1263 SELECT a, b FROM table1 ORDER BY a + b; 1297 1264 </programlisting> 1298 Les références des noms de colonnes dans la clause <literal>FROM</>,1299 renommées dans la liste de sélection, sont aussi autorisées :1265 Sont également autorisées les références aux noms de colonnes de la clause 1266 <literal>FROM</> qui sont renommées dans la liste de sélection : 1300 1267 <programlisting> 1301 1268 SELECT a AS b FROM table1 ORDER BY a; 1302 1269 </programlisting> 1303 1270 Mais ces extensions ne fonctionnent pas dans les requêtes impliquant 1304 <literal>UNION</>, <literal>INTERSECT</> ou <literal>EXCEPT</> et ne sont 1305 pas portables dans les autres bases de données SQL. 1306 </para> 1307 1308 <para> 1309 Chaque spécification de colonne pourrait être suivie d'un 1310 <literal>ASC</> ou <literal>DESC</> optionnelle pour initialiser la 1311 direction du tri (ascendant ou descendant). L'ordre <literal>ASC</> est la 1312 valeur par défaut. L'ordre ascendant place les plus petites valeurs en 1313 premier où <quote>plus petit</quote> est défini en terme de l'opérateur 1314 <literal><</literal>. De façon similaire, l'ordre descendant est 1315 déterminé avec l'opérateur <literal>></literal>. 1271 <literal>UNION</>, <literal>INTERSECT</> ou <literal>EXCEPT</>. Elles ne sont, 1272 de plus, pas portables vers les autres bases de données SQL. 1273 </para> 1274 1275 <para> 1276 Chaque spécification de colonne peut être suivie d'un drapeau optionnel 1277 <literal>ASC</> ou <literal>DESC</> permettant de préciser la direction du tri 1278 (ascendant ou descendant). L'ordre <literal>ASC</> est la valeur par défaut. 1279 L'ordre ascendant place les plus petites valeurs en premier. <quote>Plus petit</quote> 1280 est défini conformément à l'opérateur <literal><</literal>. De façon similaire, 1281 l'ordre descendant est déterminé avec l'opérateur <literal>></literal>. 1316 1282 <footnote> 1317 1283 <para> 1318 1284 En fait, <productname>PostgreSQL</> utilise la <firstterm>classe 1319 d'opérateur B-tree par défaut</> pour le type de données de la colonne1320 pour déterminer l'ordre de tri avec <literal>ASC</> et <literal>DESC</>.1321 De façon conventionnelle, les types de données seront initialisés de1322 façon à ceque les opérateurs <literal><</literal> et1323 <literal>></literal> correspondent à cet ordre de tri mais un1324 concepteur des types de données définis par l'utilisateur pourrait choisir1325 de faire quelque chose de différent.1285 d'opérateur par défaut, B-tree</> pour le type de données de la colonne. 1286 Cette classe permet de déterminer l'ordre de tri utilisé par <literal>ASC</> 1287 et <literal>DESC</>. Par convention, les types de données sont 1288 initialisés pour que les opérateurs <literal><</literal> et 1289 <literal>></literal> correspondent à cet ordre de tri. Il est cependant 1290 possible qu'un concepteur de types de données utilisateur choisisse 1291 de procéder différement. 1326 1292 </para> 1327 1293 </footnote> … … 1329 1295 1330 1296 <para> 1331 Si plus d'une colonne de tri est spécifiée, les entrées suivantes sont1332 utilisées pour trier les lignes qui s ont égales sous l'ordre imposé par les1333 colonnes de tri précédent.1297 Si plusieurs colonnes de tri sont spécifiées, les dernières entrées seront 1298 utilisées pour trier les lignes qui seraient égales selon l'ordre imposé par 1299 les premières colonnes de tri. 1334 1300 </para> 1335 1301 </sect1> … … 1348 1314 1349 1315 <para> 1350 <literal>LIMIT</> et <literal>OFFSET</> vous permet de retrouver seulement1351 une portion des lignes générées par le reste de la requête :1316 <literal>LIMIT</> et <literal>OFFSET</> permettent de ne récupérer qu'une partie 1317 des lignes engendrées par le reste de la requête : 1352 1318 <synopsis> 1353 1319 SELECT <replaceable>liste_selection</replaceable> 1354 1320 FROM <replaceable>expression_table</replaceable> 1355 <optional>LIMIT { <replaceable>numero</replaceable> | ALL }</optional> 1356 <optional>OFFSET <replaceable>numero</replaceable></optional> 1357 </synopsis> 1358 </para> 1359 1360 <para> 1361 Si un nombre limite est donné, pas plus que ce nombre de lignes sera renvoyé 1362 (mais peut-être moins si la requête récupère moins de lignes). <literal>LIMIT 1363 ALL</> est indique à ne pas spécifier la clause <literal>LIMIT</>. 1364 </para> 1365 1366 <para> 1367 <literal>OFFSET</> indique de passer ce nombre de lignes avant de renvoyer 1368 les lignes restantes. <literal>OFFSET 0</> est identique à oublier la clause 1369 <literal>OFFSET</>. Si à la fois <literal>OFFSET</> et <literal>LIMIT</> 1370 apparaissent, alors les <literal>OFFSET</> lignes sont laissés avant de 1371 commencer le renvoi des <literal>LIMIT</> lignes. 1372 </para> 1373 1374 <para> 1375 Lors de l'utilisation de <literal>LIMIT</>, il est important d'utiliser une 1321 <optional>LIMIT { <replaceable>numero</replaceable> | ALL }</optional> <optional>OFFSET <replaceable>numero</replaceable></optional> 1322 </synopsis> 1323 </para> 1324 1325 <para> 1326 Si une limite de comptage est donnée, il ne sera pas retourné plus de lignes 1327 que ce nombre (peut-être moins si la requête complète retourne moins 1328 de lignes). <literal>LIMIT ALL</> revient à ne pas spécifier la clause <literal>LIMIT</>. 1329 </para> 1330 1331 <para> 1332 <literal>OFFSET</> indique un nombre de lignes à ignorer avant de commencer à 1333 retourner des lignes. <literal>OFFSET 0</> revient à oublier la clause 1334 <literal>OFFSET</>. Si <literal>OFFSET</> et <literal>LIMIT</> sont utilisés ensemble, 1335 <literal>OFFSET</> lignes sont ignorées avant de retourner <literal>LIMIT</> lignes. 1336 </para> 1337 1338 <para> 1339 Lors de l'utilisation de <literal>LIMIT</>, il est nécessaire d'utiliser une 1376 1340 clause <literal>ORDER BY</> contraignant les lignes résultantes dans un ordre 1377 unique. Sinon, vous obtiendrez un sous-ensemble non prévisible de lignes de 1378 la requête. Vous pourriez demander des lignes 10 à 20 mais dans quel 1379 ordre ? L'ordre est inconnu si vous ne spécifiez pas <literal>ORDER 1380 BY</>. 1381 </para> 1382 1383 <para> 1384 L'optimiseur de requêtes prend <literal>LIMIT</> en compte lors de la 1385 génération d'un plan de requêtes, de façon à ce que vous obtenez 1386 différents plans (avec différents ordres de lignes) suivant ce que vous 1387 donnez à <literal>LIMIT</> et <literal>OFFSET</>. Du coup, utiliser des 1388 valeurs <literal>LIMIT</>/<literal>OFFSET</> différentes pour sélectionner 1389 des sous-ensembles différents d'un résultat de requête <emphasis>donnera des 1390 résultats inconsistants</emphasis> sauf si vous forcez un ordre de 1391 résultat prévisible avec <literal>ORDER BY</>. Ceci n'est pas un bogue ; 1392 c'est une conséquence inhérente du fait que le SQL ne promette par de 1393 délivrer les résultats d'une requête dans un ordre particulier sauf si 1394 <literal>ORDER BY</> est utilisé pour contraindre l'ordre. 1341 unique. Dans le cas contraire, il est impossible de prévoir le sous-ensemble 1342 de lignes qui sera retourné. 1343 </para> 1344 1345 <para> 1346 L'optimiseur de requêtes tient compte de <literal>LIMIT</> lors de la 1347 génération d'un plan de requêtes. Ainsi, en fonction des valeurs précisées pour 1348 <literal>LIMIT</> et <literal>OFFSET</>, différents plans seront obtenus impliquant 1349 différents ordres de lignes. Sans l'utilisation de la clause <literal>ORDER BY</> 1350 pour forcer l'ordre des résultats, l'emploi de valeurs <literal>LIMIT</>/<literal>OFFSET</> 1351 différentes pour sélectionner des sous-ensembles différents du résultat d'une 1352 requête <emphasis>donnera des résultats incohérents</emphasis>. 1353 Ceci n'est pas un bogue, le SQL ne promettant pas de délivrer les résultats 1354 d'une requête dans un ordre particulier en l'absence de spécifications de tri. 1395 1355 </para> 1396 1356 </sect1>
