Responsable de la Cellule Pédagogique et de Recherche en Informatique 01.64.15.3159 |
![]() |
mercredi 11 juillet 2001 |
Mode d'emploi des requêtes SQL sous MapInfo®
Avertissement : ce document reprend les informations
de l'Aide MapInfo®…
On trouvera la base correspondant à cette requête
au § 7…
Avertissement : ce document reprend les informations de l'Aide MapInfo®…
Table des matières
1) La boîte de dialogue "Sélection / Sélection SQL" *
Le champ "Tables" *
Le champ "Colonnes" *
Le champ "Critères" *
Le champ "Grouper par Colonnes" *
Le champ "Trier par Colonnes" *
Le champ "Résultat dans Table" *
La case d'option "Afficher les données résultat" *
Le bouton "Sauver Modèle" *
Le bouton "Charger Modèle" *
3) La sélection des champs de colonne *
Choisir la colonne qui apparaît dans la table des résultats *
Utiliser le champ "Colonnes" de la boîte de dialogue "Sélection SQL" *
Fusionner des tables d'après l'ordre des lignes *
Fusionner plusieurs tables *
Paramétrer des filtres *
Réaliser des sous-sélections *
Utiliser "Trier par Colonnes" pour trier la table de résultats *
Fonctions d'agrégation de MapInfo® *
Base de données sous MapInfo® *
Requête SQL n°1 : "recherche des numéros des trains passant par Champs-sur-Marne" *
Requête SQL n°2 : "nombre de trains passant par Vincennes" *
Requête SQL n°3 : "trains allant de Vincennes à Champs-sur-Marne (ligne directe)" *
Requête SQL n°3.1 : "trains passant par Vincennes" *
Requête SQL n°3.2 : "trains (venant de Vincennes) et passant par Champs-sur-Marne " *
Requête SQL n°4 : "Parmi les trains allant de
Vincennes à Champs-sur-Marne, quels sont ceux qui partent entre
7h45 et 8h15 et qui arrivent avant 8h20" *
Listes déroulantes ("Tables", "Colonnes", "Opérateurs", "Opérateurs", "Agréger" et "Fonctions")
Le champ "Grouper par Colonnes"
Le champ "Résultat dans Table"
La case d'option "Afficher les données résultat"
2) La procédure générale d'utilisation de la sélection SQL
La procédure générale d'utilisation de la sélection SQL est la suivante :
![]() |
![]() |
Cette table est appelée table source. Ainsi, par exemple, si vous effectuez une sélection sur la table Gares, celle-ci sera la table source.
2. Sélectionnez "Sélection / Sélection SQL". Renseignez les zones de la boîte de dialogue "Sélection SQL" correspondant à vos besoins. Lorsque vous cliquez sur OK, MapInfo® exécute la sélection.
![]() |
![]() |
MapInfo® extrait alors les données de votre table source, stocke les résultats de la sélection dans une table temporaire particulière, appelée table de résultats. La table de résultats contient uniquement les lignes et colonnes correspondant à vos critères. Le nom par défaut de la table de résultats est QueryN, mais vous pouvez indiquer un autre nom au niveau de la zone "Résultat dans table", dans la boîte de dialogue "Sélection SQL".
Par défaut, MapInfo® affiche automatiquement la table de résultats dans une fenêtre Données, à moins que vous n'enleviez la croix marquée dans la case "Afficher les données résultat" de la boîte de dialogue Sélection SQL.
![]() |
![]() |
3. MapInfo® sélectionne automatiquement toutes
les lignes de la table de résultats. Aussi, après avoir réalisé
votre sélection SQL, il vous est possible d'effectuer des opérations
sur l'ensemble des lignes sélectionnées. En général,
toutes les modifications effectuées sur la table de résultats
sont automatiquement dupliquées sur la table source. Ainsi, par
exemple, si vous utilisez la sélection SQL pour sélectionner
certaines lignes de la table "Gares", puis si vous effacez certaines lignes
de la table de résultats, MapInfo® effacera les lignes correspondantes
dans la table source ("Gares"). Cependant, si votre sélection produit
des sous-totaux, il est possible de modifier la table de résultats
sans affecter la table source.
![]() |
4. Sélectionnez "Fichier / Enregistrer Table Sous",
si vous voulez conserver une copie permanente de la table de résultats.
Si vous ne demandez pas "Enregistrer Table Sous", la table sera perdue
au moment de quitter MapInfo®.
3) La sélection des champs de colonne
Calculer des colonnes dérivées
La Sélection SQL permet de calculer des colonnes dérivées et de les afficher dans la table résultats. Une colonne dérivée est une colonne spéciale temporaire calculée par MapInfo® à partir du contenu d'une ou de plusieurs colonnes existant déjà dans la table source.
Par exemple, supposons que votre table "Billets" contienne
les variables "nb_passagers" et "prix" (représentant respectivement
le nombre de passagers et le prix du billet). Si vous voulez que les résultats
de la requête affichent une colonne "Prix par passager" (indiquant
le prix par passager), vous pouvez ajouter une colonne dérivée
au niveau du champ "Colonnes". Dans l'exemple présent, la colonne
dérivée aurait cette forme : "prix / nb_passagers".
![]() |
![]() |
Pour créer une colonne dérivée, vous devez saisir une expression dans le champ "Colonnes". Une expression est un ensemble de noms de colonne, d'opérateurs (tels que + et -) et de fonctions (telles que la fonction UCases$ qui transforme une chaîne en caractères majuscules). Lorsque les colonnes sont des chaînes, l'opérateur (+) permet d'effectuer une concaténation des chaînes plutôt qu'une addition de valeurs numériques. Par conséquent, l'expression Prénom + " " + Nom produit une chaîne composée du prénom suivi d'un espace, lui-même suivi du nom de famille.
Affectez un alias à l'expression, si nécessaire. Pour cela, saisissez un espace après l'expression, suivi du nom de l'alias entre guillemets. Les noms d'alias sont optionnels. Si vous attribuez un alias à votre expression, celui-ci apparaîtra en haut de la colonne au moment d'afficher la table résultats dans la fenêtre Données. Si vous n'attribuez pas de nom d'alias, MapInfo® utilisera le contenu de l'expression.
![]() |
![]() |
Choisir la colonne qui apparaît dans la table des résultats
Si vous entrez un ou plusieurs noms de colonne au niveau du champ "Colonnes", la table des résultats ne contiendra que ces colonnes. Ceci est utile lorsque vous travaillez sur une table comportant plusieurs colonnes, et que vous ne voulez utiliser que quelques unes de ces colonnes (ne serait-ce que parce que quelques colonnes seulement tiennent dans l'écran).
Pour saisir une liste de noms de colonnes :
1. Entrez un nom de table à la rubrique "Tables", si ce n'est pas déjà fait. Pour cela, vous pouvez soit saisir un nom de table soit choisir un nom parmi la liste déroulante proposée.
2. Cliquez dans le champ "Colonnes" de façon à ce que le point d'insertion apparaisse dans le champ.
3. Effacez l'astérisque. Le champ "Colonnes" peut en effet contenir soit une astérisque soit une liste de noms de colonnes, mais pas les deux.
4. Choisissez un nom de colonne dans la liste déroulante située à la droite de la boîte de dialogue. MapInfo® recopie le nom de la colonne dans le champ "Colonnes".
5. Si la requête doit inclure d'autres colonnes, choisissez les dans la liste déroulante "Colonnes". Au fur et à mesure que vous les sélectionnez, MapInfo® insère automatiquement des virgules pour séparer les noms de colonne.
Utiliser le champ "Colonnes" de la boîte de dialogue "Sélection SQL"
Le champ "Colonnes" permet de définir les colonnes qui doivent figurer dans la table résultats de la requête.
Si vous souhaitez que la table résultats contiennent les mêmes colonnes que la table originale, laissez l'astérisque (*) dans le champ "Colonnes".
En revanche, si vous désirez que la table résultats ne contienne pas les mêmes colonnes que la table originale, supprimez l'astérisque et entrez une liste de noms de colonne ou d'expressions séparés par des virgules, comme indiqué ci-dessous. Le champ "Colonne" peut contenir l'astérisque ou une liste d'expressions de colonnes, mais pas les deux. Complétez le champ "Tables" avant le champ "Colonnes".
Si votre requête concerne plusieurs tables, chaque
nom de colonne doit être précédé du nom de la
table correspondante, les noms de table et de colonne étant séparés
par un point. Par conséquent, si vous effectuez une requête
impliquant deux tables, l'une d'entre elles étant la table "Gares",
et si vous souhaitez que la requête contienne la colonne "nom" de
la table "Gares", vous devez utiliser la colonne "Gares.nom". La liste
déroulante "Colonnes" fait automatiquement précéder
les noms de colonne par les noms de table, chaque fois que vous utilisez
plusieurs tables.
Fusionner des tables à l'aide des opérateurs géographiques
Lorsque deux tables contiennent des objets graphiques, MapInfo® peut fusionner les tables en se basant sur les relations spatiales existant entre ces objets. Par conséquent, même si les tables n'ont pas de colonne commune, il est possible de les fusionner.
Les opérateurs géographiques permettent de sélectionner des objets en se basant sur leurs relations dans l'espace vis à vis d'autres objets. MapInfo® dispose d'un nom de colonne particulier à utiliser avec les opérateurs géographiques : "obj" ou "objet". Ce nom de colonne fait référence aux objets graphiques liés à la table.
Les opérateurs géographiques sont placés entre les objets spécifiés. Sélectionnez les dans la liste déroulante "Opérateurs".
Le tableau ci-dessous donne la liste des différents
opérateurs géographiques :
Contient | l'objet A contient l'objet B si le centroïde de B se situe quelque part à l'intérieur du polygone A. |
Contient entièrement | l'objet A contient entièrement l'objet B si le polygone B est entièrement inclus dans le polygone A. |
Dans | l'objet A est dans l'objet B si son centroïde se situe à l'intérieur du polygone B. |
Entièrement dans | l'objet A est entièrement dans l'objet B si le polygone A est inclus dans le polygone B. |
Rencontre | l'objet A rencontre l'objet B si les deux objets ont au moins un point en commun ou si l'un des objets est entièrement inscrit dans l'autre. |
La différence entre "Contient" et "Dans" d'une part, et "Contient entièrement" et "Entièrement dans" d'autre part, tient de la manière dont la comparaison s'appuie sur le centroïde de l'objet tandis que "Contient entièrement" et "Entièrement dans" prennent en compte l'intégralité de l'objet.
Le graphique suivant illustre ceci :
Dans chaque cas, l'objet A contient l'objet B parce que le centroïde de l'objet B est à l'intérieur du polygone de l'objet A. Cependant, dans la figure de gauche et dans celle du milieu, une partie de l'objet B est à l'extérieur de l'objet A. C'est uniquement dans la figure de droite que tout l'objet B se situe à l'intérieur de l'objet A. On peut alors affirmer que l'objet A contient entièrement l'objet B ou que l'objet B est entièrement inclus dans l'objet A. Ainsi, si A contient entièrement B, A contient B et si A est entièrement inclus dans B, alors A est dans B.
MapInfo® peut réaliser une simple comparaison de type "Contient" ou "Dans" plus rapidement qu'un "Contient entièrement" ou "Entièrement dans". Aussi, à moins de vouloir être absolument sûr que les objets sont totalement inclus dans d'autres objets, vous utiliserez de préférence les deux premiers opérateurs.
Les opérateurs géographiques permettent de fusionner des tables. Lorsque les tables ne contiennent pas de colonnes sur lesquelles vous pouvez baser la fusion, vous pouvez utiliser un opérateur géographique pour définir la fusion (dans la zone Critères). Si vous désirez réaliser une requête prenant en compte à la fois une table "Villes" et une table "Régions", vous pouvez fusionner les tables en utilisant l'une ou l'autre des expressions suivantes :
Ville.obj dans Région.obj
Région.obj contient Ville.obj
Dans les deux cas, MapInfo® recherche les villes situées dans chaque région et associe la ligne d'une ville à celle de sa région. Dans la même requête par sélection SQL, vous pouvez utiliser les fonctions d'agrégation pour comptabiliser le nombre de villes par région ou pour récapituler les données relatives aux villes en fonction des régions.
Si vous disposez d'une table des départements et d'une table des clients, où les départements sont représentés par des polygones et les clients par des points, vous pouvez spécifier une fusion géographique au moyen de l'une des expressions suivantes :
Client.obj dans Département.obj
Département.obj contient Client.obj
Fusionner des tables d'après l'ordre des lignes
Si deux tables n'ont pas de colonne en commun, vous pouvez malgré tout les fusionner en vous basant sur l'ordre des lignes. En effet, si vous savez que la première ligne d'une table correspond à la première ligne de l'autre table et si, en général, la Nième ligne d'une table correspond à la Nème ligne de l'autre table, il est possible de fusionner les deux tables en vous référant à une colonne particulière nommée LigneID.
La colonne LigneID contient une valeur entière représentant le numéro de ligne de chacune des lignes de la table. Par conséquent, la première ligne d'une table aura une valeur LigneID de 1, la seconde ligne aura la valeur 2, etc. ...
Pour fusionner deux tables de façon à ce que MapInfo® fasse correspondre la Nième ligne d'une table avec la Nième ligne de l'autre table, indiquez une expression du type suivant :
Critères : TABLE_1.LigneID = TABLE_2.LigneID
En général, vous conservez vos informations dans plusieurs tables différentes. Vous avez vos propres fichiers de données, mais vous pouvez également avoir diverses bases de données statistiques achetées avec le logiciel. La sélection SQL vous permet de créer des fusions relationnelles de façon à pouvoir réunir les informations des diverses tables dans une seule table de résultats. Lorsque vous voulez fusionner deux tables, vous devez tout d'abord vérifier si l'une des colonnes de la première table contient des valeurs correspondant à l'une des colonnes de la seconde table.
Lorsque vous fusionnez deux tables, le nombre de lignes dans la table de résultats dépend du degré de correspondance entre les deux tables. Supposons que la table "Gares" ait 13 lignes et que vous la fusionniez avec la table "Billets", qui a 3 lignes (en recherchant le nom des gares de départ ou d'arrivée). La table de résultats pourrait avoir jusqu'à 13 lignes. Cependant, si certaines lignes de la table "Gares" ne correspondent pas aux lignes de la table "Billets", la table de résultats contiendra moins de 13 lignes. Ainsi, si 4 lignes de la table "Gares" ne sont pas concernées par des billets, et si la fusion relationnelle se fait à partir de l'identifiant de la gare, la table de résultats n'aura que 9 lignes.
Lorsque vous fusionnez deux tables par l'intermédiaire de la boîte de dialogue "Sélection SQL", les clauses où vous indiquez comment fusionner les tables doivent précéder toute autre clause dans la rubrique "Critères". Vous pouvez utiliser "Mettre à jour colonne" pour modifier les résultats d'une fusion entre plusieurs tables par sélection SQL. Lorsque vous voulez mettre à jour une colonne dans une table à partir d'informations provenant d'une autre table, vous pouvez :
1. Fusionner les deux tables par sélection SQL.
2. Utiliser "Mettre à jour colonne" sur la sélection.
La mise à jour prend effet automatiquement dans la table source
appropriée.
Attention, un filtre est différent d'une sous-sélection…
Un filtre est une expression logique utilisée pour
comparer la valeur d'une colonne à une autre valeur. Par exemple,
le filtre suivant utilise l'opérateur supérieur à
(>) pour vérifier si la valeur de la colonne "Prix" est supérieure
à 300 : Prix > 300
![]() |
![]() |
Le champ "Condition" peut contenir plus de deux expressions logiques à condition qu'elles soient séparées par le mot "And" (Et) ou "Or" (Ou). Si l'opérateur "And" est utilisé, MapInfo® ne sélectionne que les lignes qui satisfont les deux critères. Si l'opérateur "Or" est utilisé, MapInfo® sélectionne les lignes qui satisfont l'un des critères.
Les critères de filtrage peuvent utiliser toute colonne des tables de la base de données, que vous ayez inclus ou non la colonne dans le champ "Colonnes".
Les colonnes peuvent être référencées
par un nom ou un numéro. Le numéro correspond à la
position de la colonne dans le champ "Colonnes". Par conséquent,
"col1" et "col6" correspondent respectivement à la première
et à la sixième colonne. Le numéro doit être
précédé des lettres "col".
Attention, une sous-sélection est différente d'un filtre…
MapInfo® autorise les sous-sélections dans les commandes "Sélection SQL". Une sous-sélection est une instruction de sélection qui est placée dans la zone "Critères" de la boîte de dialogue "Sélection SQL". MapInfo® calcule d'abord la sous-sélection et utilise ensuite ces valeurs dans la boîte de dialogue "Sélection SQL" principale.
Sur l'exemple précédent (calcul "du prix
par passager" des billets dont le prix est supérieur à 300
F), on obtient :
![]() |
![]() |
Choisir de trier par ordre croissant ou décroissant
Par défaut, MapInfo® trie une table par ordre croissant. Si vous effectuez le tri par ordre alphabétique, cela signifie que les A apparaîtront avant les B, etc. .. Si vous triez par valeurs numériques, l'ordre croissant signifie que les petits nombres apparaîtront avant les grands.
Si vous triez par ordre décroissant, cela signifie que les grands nombres apparaissent avant les petits, le mot "desc" s'affiche à la suite du nom de la colonne au niveau du champ "Trier par colonnes".
Si vous voulez effectuer le tri à partir d'une
colonne dérivée, et si la colonne dérivée a
un alias, vous pouvez saisir le nom de l'alias dans le champ "Grouper par
colonnes". Si la colonne dérivée n'a pas d'alias, saisissez
le numéro de la colonne (par exemple, 1).
Utiliser "Trier par Colonnes" pour trier la table de résultats
Le champ "Trier par Colonnes" permet de trier les lignes de la table de résultats. Le tri a une incidence sur l'ordre des lignes (de haut en bas) dans une fenêtre Données. Vous pouvez trier cette table si vous souhaitez imprimer la fenêtre Données sous forme d'état.
Le champ "Trier par Colonnes" est facultatif. Si vous ne le complétez pas, la table ne sera pas triée. Si vous entrez un nom de colonne dans ce champ, MapInfo® trie la table en fonction du contenu de cette colonne.
Si le champ "Trier par colonnes" contient deux ou plusieurs
noms de colonne, MapInfo® effectue un tri sur plusieurs niveaux.
Supposons que vous ayez une table "Billets". Chaque ligne de la table représente un billet de train. Une colonne de la table contient l'identifiant de la gare de départ, une autre contient l'identifiant de la gare d'arrivée tandis qu'une troisième contient le prix du billet.
Pour chaque gare d'arrivée, supposons que vous vouliez savoir :
· le nombre de billets qui concerne cette gare,
· le montant moyen de ces billets,
· la valeur totale des billets achetés.
![]() |
![]() |
Remarquez le champ "Grouper par colonnes" et les trois opérateurs d'agrégation (cf.§ suivant) dans la zone "Colonnes". MapInfo® procède comme suit :
1. Il recherche toutes les lignes concernant une gare d'arrivée donnée.
2. Il compte le nombre de lignes : Count(*)
3. Il calcule la valeur moyenne des prix des billets : Avg(prix)
4. Il calcule la valeur totale des prix des billets : Sum(prix).
MapInfo® fait de même pour chaque gare d'arrivée.
Il en résulte une table n'ayant qu'une ligne pour chaque gare d'arrivée.
Les opérateurs d'agrégation (Count, Avg et Sum) calculent
le sous-total des valeurs de toutes les lignes ayant une même valeur
pour la gare d'arrivée.
Toutes les colonnes du champ "Colonnes" qui ne sont pas basées sur des fonctions d'agrégation doivent être répertoriées dans la zone "Grouper par colonnes". Ce sont les colonnes que MapInfo® étudiera pour déterminer les groupements. Chaque groupe de valeurs uniques (dans ces colonnes) correspond à une seule ligne dans la table de requête. Les colonnes dérivées doivent être désignées par des numéros faisant référence à leur position respective : "1," "2," "5," pour première, deuxième et cinquième colonne, respectivement.
Remarque : les colonnes de la zone "Colonnes" basées sur les fonctions d'agrégation ne peuvent être répertoriées dans la zone "Grouper par colonnes". Cependant, chaque colonne de la zone "Colonnes" qui n'est pas une opération d'agrégation doit être répertoriée dans le champ "Grouper par colonnes".
Fonctions d'agrégation de MapInfo®
MapInfo® propose les fonctions d'agrégation suivantes :
Count(*) : compte simplement le nombre d'enregistrements d'un groupe. L'astérisque est considéré comme argument car il s'applique à l'ensemble de l'enregistrement et non à un champ spécifique de l'enregistrement.
Sum (<expression>) : calcule la somme des valeurs dans l'expression pour tous les enregistrements d'un groupe.
Avg (<expression>) : calcule la moyenne des valeurs dans l'expression pour tous les enregistrements d'un groupe.
Max (<expression>) : recherche la valeur maximale dans l'expression pour tous les enregistrements d'un groupe.
Min(<expression>) : recherche la valeur minimale dans l'expression pour tous les enregistrements d'un groupe.
7) Des requêtes sur une base de données de billets de train
Requête SQL n°1 : "recherche des numéros des trains passant par Champs-sur-Marne"
Requête SQL n°2 : "nombre de trains passant par Vincennes"
Requête SQL n°3 : "trains allant de Vincennes à Champs-sur-Marne (ligne directe)"
Requête SQL n°3.1 : "trains passant par Vincennes"
Enregistrement de la table de résultats "trainsvincennes_qry" dans une table "trainsvincennes"…
Requête SQL n°3.2 : "trains (venant de Vincennes) et passant par Champs-sur-Marne "
Ouverture de la table "trainsvincennes" et recherche
des trains (venant de Vincennes)
et passant par Champ-sur-Marne…
Requête SQL n°4 : "Parmi les trains allant de Vincennes à Champs-sur-Marne, quels sont ceux qui partent entre 7h45 et 8h15 et qui arrivent avant 8h20"
Enregistrement de la table de résultats précédente "trainsvincenneschamps_qry" dans une table "trainsvincenneschamps" et ouverture de cette table…