Stéphane Pelle

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…
 
 


Mode d'emploi des requêtes SQL sous MapInfo®
 
 

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" *

  Listes déroulantes ("Tables", "Colonnes", "Opérateurs", "Opérateurs", "Agréger" et "Fonctions") *

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" *

2) La procédure générale d'utilisation de la sélection SQL *

3) La sélection des champs de colonne *

Calculer des colonnes dérivées *

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" *

4) Les critères de champs * Fusionner des tables à l'aide des opérateurs géographiques *

Fusionner des tables d'après l'ordre des lignes *

Fusionner plusieurs tables *

Paramétrer des filtres *

Réaliser des sous-sélections *

5) Les tris de colonnes * Choisir de trier par ordre croissant ou décroissant *

Utiliser "Trier par Colonnes" pour trier la table de résultats *

6) Les groupements * Grouper par colonnes *

Fonctions d'agrégation de MapInfo® *

7) Des requêtes sur une base de données de billets de train * Modélisation des données *

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" *
 
 


1) La boîte de dialogue "Sélection / Sélection SQL"












Listes déroulantes ("Tables", "Colonnes", "Opérateurs", "Opérateurs", "Agréger" et "Fonctions")


 
 

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"














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 :

  1. Ouvrez la table sur laquelle vous voulez effectuer une sélection.

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.
 
 

4) Les critères de champs

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
 
 

Fusionner plusieurs tables

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.
 
 

Paramétrer des filtres

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".
 
 

Réaliser des sous-sélections

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 :
 

 

5) Les tris de colonnes

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.
 
 

6) Les groupements

Grouper par colonnes

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.




(les chapitres 1 à 6, ci-dessus, reprennent la documentation en ligne de Mapinfo® pour expliquer comment écrire les requêtes SQL)

7) Des requêtes sur une base de données de billets de train

Modélisation des données
 
 












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"

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…