Vous êtes sur la page 1sur 33

Utilisation avance de MapInfo sans MapBasic

Partie I

SQL dans sa fentre ou via la fentre MapBasic

Sbastien RODDIER
Gologue Spcialiste Sites et Sols Pollus & SIG. sebastien.roddier@caramail.com

Jacques Paris
professeur honoraire, principal Paris PC Consult Enr. jacques@paris-pc-gis.com

version initiale 3/10/2002 - Sbastien Roddier (Utilisation avance de MapInfo via la fentre MapBasic) version rvise avec nouveau titre 23/10/2002 Jacques Paris
document en format US Letter

Table des matires


La commande Select dans MapInfo Gnralits
1 Syntaxe gnrale
Condition avec oprateur de comparaison Condition avec oprateur de ressemblance Condition avec oprateur gographique Groupe de conditions Option INTO Option NOSELECT Option GROUP BY Option ORDER BY

1 2
2
3 3 4 5 6 6 6 7

2 Principes de construction des expressions


Ordre de priorit des oprateurs Fonctions utiles dans les expressions

7
8 8

3 Principes dutilisation dune sous-slection 4 Slection par caractristique graphique avec diffrents types dobjets 5 Systme de coordonnes lors dune slection 6 Jointure de plus de 2 tables dans le mme Select.

10 11 13 13

Exemples de mise en uvre


1 Slections attributaires

14
14
14 15 15 16 16 16 16 17 18 19 19 19 20 21 21

1 1 Sur une table 1 2 Sur plusieurs tables 1 3 Fusion de 2 tables par slection sur une colonne commune 1 4 Slection des enregistrements dune table ne se trouvant pas dans une autre 1 5 Slectionner les enregistrements qui nont pas dobjets

2 Requtes gographiques
2 1 Slection dobjets en intersection spatiale totale ou partielle. 2 2 Slection dobjets en intersection spatiale totale 2 3 Requtes gographiques multiples 2 4 Requtes bases sur ladjacence des objets 2 5 Requtes bases sur la proximit 2 6 Requtes bases sur les distances entre objets 2 7 Requtes base sur la position relative des objets. 2 8 Des points et des lignes 2 9 Slection des objets qui ne se trouvent pas dans une zone donne 2 10 Construction dune matrice dadjacence pour une table de rgions

16

3 Requtes utilisant des caractristiques gomtriques


3 1 Requtes retournant des informations surfaciques sur les objets. 3 2 Requtes retournant des informations linaires sur les objets.

22
22 23

4 Requtes utilisant des caractristiques graphiques


4 1 Slections bases sur les attributs graphiques des objets 4 2 Requtes sur les types dobjets 4 3 Requtes retournant des informations sur la gographie des objets

24
24 25 26

5 Travailler avec des objets et donnes textes


5 1 Slection dobjets textes en fonction de certaines de leurs caractristiques 5 2 Concantation / d-concantation de chane de caractres 5 3 Slection des cas dont un champ texte contient une chane donne 5 4 Extraction du dernier mot dune phrase

27
27 27 28 28

6 Groupement des rsultats par colonnes. 7 Triage des rsultats par ordre croissant ou dcroissant 8 Exemples hors catgories
8 1 Assignation de la plus grande frquence

29 30 30
30

La commande Select dans MapInfo

Nous allons tout dabord expliquer les lments principaux de la syntaxe de cette commande, et fournir certaines informations largissant le domaine dapplication de cette commande. Puis nous verrons comment mettre en uvre ces principes dans toute une srie dexemples, tirs dun peu partout et souvent adapts nos objectifs. Mais tout dabord, quelques remarques prliminaires. Le rsultat dune slection en MapInfo a toujours la forme dune table contenant les enregistrements qui ont satisfait aux conditions imposes et possdant les attributs (colonnes) tels que spcifis. Nous identifierons cette table comme rsultat_SQL ; elle est nomme initialement par MI selection et renomme QueryN si une utilisation en est faite (avec N de 1 ... durant une mme session) mais elle peut recevoir au moment de sa cration un nom choisi par lutilisateur. Une commande SQL peut tre compose et soumise directement dans la fentre MapBasic, ou le plus souvent aussi en entrant les divers lments dans les botes correspondant de la fentre SQL. Nous utiliserons ici la forme crite de la fentre MB, laissant lutilisateur ladaptation la fentre SQL; nous signalerons les cas o le recours la fentre MB est la seule possibilit. Nous devons cependant signaler une diffrence entre les deux techniques dentre des donnes: elle concerne la visualisation des rsultats. Lquivalent de cocher visualiser les rsultats dans la fentre SQL est obtenu par une seconde commande dans la fentre MapBasic : Browse * from <rsultat_SQL> <rsultat_SQL> selection ou nom attribu par lutilisateur avec INTO.

Conventions dcriture
SELECT <nom_table> "nouvelle_spc" { aaa | bbb } [ aaa ] [ aaa | bbb | ccc ] (majuscules) mots clefs requis remplacer (y compris les <>) par un mot remplacer mais les " " doivent tre conservs un des termes est requis terme optionnel (les crochets sont omis) un choix faire entre plusieurs termes optionnels exclusifs

Gnralits
1 Syntaxe gnrale
SELECT <liste_expressions> FROM <nom_table> [, ...] [ WHERE <groupe_conditions> ] [ INTO <table_rsultats> [ NOSELECT ] ] [ GROUP BY <liste_colonnes> ] [ ORDER BY <liste_colonnes> ]

<liste_expressions>
liste des colonnes qui seront prsentes dans la slection, dans lordre de cette liste et contenant les rsultats des expressions spcifies. Si une seule table est spcifie, le nom de ses colonnes peut tre utilis directement dans les expressions. Sil y a plus dune table, les rfrences aux colonnes doivent inclure le nom de la table (table_ A.colonne_1, table_B.colonne_6 ...) Si toutes les colonnes de la table spcifie sont conserves dans le mme ordre et sans changement, on peut remplacer liste_expressions par *. Comme lastrisque ne peut pas tre utilis en conjonction avec une autre expression, si plusieurs tables sont spcifies et lastrisque utilis, la slection contiendra toutes les colonnes de toutes les tables. Lexpression spcifiant le contenu dune colonne peut tre le nom dune colonne originale ou une formule impliquant une ou plusieurs colonnes originales (voir plus bas Principes de construction des expressions ). Ex. : Select country, Round(population,1000000), from world Cet nonc produit une table de 2 colonnes, le nom du pays et sa population en millions. Une expression peut aussi donner un nom (alias) la colonne quelle cre; le nom entre " " doit suivre alors directement la spcification du contenu. Ex. : Select country Pays, Round(population,1000000) Millions from world Les deux colonnes ont alors les noms de Pays et Millions (plutt que country et population de lexemple prcdent).

<nom_table>
nom dune table ouverte. Si les expressions font appel plusieurs tables, celles-ci doivent toutes tre spcifies ici, en les sparant par des virgules.

<groupe_conditions>
un cas est slectionn sil remplit les conditions spcifies dans un groupe de conditions (un groupe peut tre rduit une simple condition)

Une condition doit pouvoir tre value comme vraie ou fausse. Elles a deux formes possibles : - un terme unique: obj est vrai pour tous les enregistrements pour lesquels un objet existe, col_logic est vrai si le contenu de cette colonne de type LOGICAL est vrai une condition faisant appel deux termes relis par un oprateur : col1 > col2 est vrai pour tous les enregistrements pour lesquels le contenu de la colonne 1 est plus grand que celui de la colonne 2 Il y a deux types doprateurs utiliss dans ces conditions ; les oprateurs de comparaison, et les oprateurs gographiques.

conditions avec oprateur de comparaison


<terme calcul> { < | <= | = | >= | > | <> } <terme de rfrence>

<terme calcul>
peut tre : o une simple colonne. Si plusieurs tables sont spcifies, il faut utiliser la forme tableX.colN. o une expression mettant en jeu une ou plusieurs colonnes avec ou sans appel des fonctions MapBasic

<terme de rfrence>
peut tre : o une valeur fixe (12, ou oui ) o une simple colonne. Si plusieurs tables sont spcifies, il faut utiliser la forme tableY.colM. o une expression mettant en jeu une ou plusieurs colonnes avec ou sans appel des fonctions MapBasic Une condition peut tre nie en utilisant loprateur NOT NOT var1 > 2 quivaut var1<= 2

Les variables OBJ et ROWID (colonnes non visibles) peuvent tre utilises dans toute condition.

conditions avec oprateur de ressemblance


<variable_texte> LIKE chane_de caractres Ne peut sappliquer qu du texte. La chane peut contenir des caractres spciaux qui permet dtendre les combinaisons spcifies par les caractres donnes : % (pourcentage) reprsente zro ou un nombre indtermin de caractres %fle% est vrai pour tout mot contenant fle reprsente un seul caractre __fle_ est vrai pour tout mot de 6 caractres ayant fle en position 3 5

_ (sous lign)

conditions avec oprateur gographique


<objetA> <oprateur_gographique> <objetB> une seule table est spcifie <objetA> = <objetB> =

obj une variable objet, dfinie au pralable dans la fentre MapBasic

au moins deux tables sont spcifies <objetA> = tableA.obj <objetB> = tableB.obj Il y a 7 oprateurs gographiques objetA objetA objetA objetA objetA objetA objetA Contains objetB Contains Part objetB Contains Entire objetB Within objetB Partly Within objetB Entirely Within objetB Intersects objetB objetA contient le centrode de objetB objetA contient en partie objetB objetA contient entirement objetB le centrode de objetA est dans objetB une partie de objetA est dans objetB objetA est entirement dans objetB les 2 objets se rencontrent

Les diagrammes ci-dessus peuvent prter confusion. Les explications du premier gauche ne sont vraies que si les 2 centrodes sont situs dans la partie commune aux 2 objets. Comme il est possible que les centrodes ne soient pas l o on peut les attendre, un tel diagramme ne montrant pas la position des centrodes ne peut pas servir de base sre une telle estimation. Il faut aussi remarquer que la rencontre (intersects, diagramme du milieu) peut tre dtecte si les 2 objets nont quun seul point en commun comme dans le diagramme suivant o lobjet B est soit lextrieur soit lintrieur de A, et ceci sapplique aussi contains part et partly within:

Toute une srie dquivalences ( vrai pour toutes), dexclusions ( vrai pour une, faux pour lautre) ou dexistences simultanes (ltat de lune ne permet pas de conclure sur ltat de lautre) entre expressions peut tre imagine. Si A contains entire B == B entirely within A ces 2 expressions excluent les suivantes A partly within B == B partly within A == A contains part B == B contains part A == A intersects B == B intersects A Mais A contains B nimplique pas que A intersects B ni que B contains A (qui nimplique pas que B intersects A)

groupe de conditions
Les conditions impliquant oprateurs de comparaison ou oprateurs gographiques peuvent tre assembles en un groupe en utilisant les oprateurs AND (les 2 conditions doivent tre vraies pour que le cas soit choisi) et OR (une des deux conditions doit tre vraie pour que le cas soit choisi). Lutilisation des parenthses est souvent ncessaire pour contrler exactement ces assemblages de conditions. (var1>4 AND var2) OR area(obj, sq km)>100 slectionne les cas pour lesquels var1 est plus grand que 4 et var2 (logique) est vrai , et les cas pour lesquels lobjet correspondant a une superficie suprieure 100 km carrs (sans ddoublement des cas o les 2 conditions sont vraies) Simplification de groupes de conditions avec oprateurs de comparaisons Le groupe de conditions var1 >= 12 AND var1 <= 23 peut tre remplac par var1 BETWEEN 12 AND 23 Noter que les valeurs extrmes sont retenues dans la nouvelle expression. Le groupe de conditions var1 = 1 OR var1 = 4 OR var1 = 6 peut tre remplac par var1 = ANY (1,4,6) ou var1 IN (1,4,6) Noter que ANY() est une fonction alors que IN est un mot cl.

Option INTO
INTO <table_rsultats> [ NOSELECT ] <table_rsultats> nom attribuer la table <rsultats_SQL> Si ayant fait une slection, un quelconque usage est fait de son rsultat, par dfaut MI conservera temporairement (pour la dure de la session, moins quelle ne soit ferme spcifiquement) le rsultat de la slection avec le nom de table QueryN (N commence 1 avec une nouvelle session et augmente chaque slection qui est utilise ). Pour viter laugmentation continue de N (et le risque den atteindre la valeur maximum acceptable par MI) ainsi que daccumuler les tables correspondantes pouvant occuper un espace utile prcieux, il est recommand de donner la slection un nom particulier, mme si ce nom navait pas dusage particulier par la suite. Option NOSELECT Elle permet de ne pas annuler une slection dj existante tout en faisant cette nouvelle slection; sans NOSELCT, la nouvelle slection remplacerait la prcdente. Cette option nest disponible que dans le cadre de loption INTO. Elle offre aussi lavantage de ne pas ncessiter de rafrachissement de lcran (fentre carte et/ou tableau) avec la nouvelle slection do un gain de temps apprciable dans certaines conditions.

Option GROUP BY
GROUP BY <liste_colonnes> Quand cette option est utilise, la table <rsultats_SQL> est diffrente en structure des tables ordinaires. En effet elle ne contient pas dobjets, et elle compte un nombre de cas (lignes) gal au nombre de valeurs diffrentes trouves dans la colonne qui sert faire le groupement (ou au nombre de combinaisons de valeurs trouves dans les colonnes de groupement sil y en a plus quune) et les colonnes telles que dfinies dans <liste_expressions> avec certaines diffrences compares une requte sans GROUP BY. <liste_expressions> pour cette option Cette liste doit contenir - la ou les colonnes servant au groupement sous une forme simple ou utilise comme argument de certaines fonctions, select county, state ... donne une table de tous les comts distingus par tat select month(colonne_date) ... donne une table par mois prsent dans colonne_date des colonnes pour recueillir les rsultats des agrgations. o Il peut y avoir une colonne Count(*) donnant le nombre de cas dans chaque catgorie de la table o une ou plusieurs colonnes dfinies comme suit : Avg(colonne) Max(colonne) Valeur moyenne pour la colonne spcifie par groupe. Valeur maximum pour la colonne spcifie par groupe.

Min(colonne) Valeur minimum pour la colonne spcifie par groupe. Sum(colonne) Somme des valeurs pour la colonne spcifie par groupe. WtAvg(colonne, colonne_poids) Moyenne pondre par groupe pour la colonne spcifie pondre par la colonne_poids <liste_colonnes> Si les colonnes sont utilises sous une forme simple, cest la liste de noms de colonnes utilises pour le regroupement, spares par des virgules si plus dune, tout comme dans <liste_expressions>. Si les colonnes de regroupement sont drives (obtenues par une fonction par exemple), il faut utiliser pour cette liste les indices des colonnes de la <liste_expressions> servant au regroupement sous la forme col1, col2 ou simplement 1, 2 . Noter quon peut toujours utiliser cette solution mme pour les colonnes listes sous forme simple.

Option ORDER BY
ORDER BY <liste_colonnes> Cette option permet de trier la table <rsultats_SQL> en fonction des valeurs contenues dans la ou les colonnes spcifies pour le tri. <liste_colonnes> Mme faon de construire la liste que pour ORDER BY. Le tri se fait par dfaut en ordre ascendant ou croissant. Si une colonne doit tre trie dans lautre manire, il faut ajouter un DESC aprs son nom. Ainsi Select * cities ORDER BY State, population DESC produit une table <rsultats_SQL> des tats en ordre alphabtique normal, et lintrieur de chaque tat des villes en ordre dcroissant de leurs populations

2 Principes de construction des expressions


Une expression contient les rgles de calcul dune nouvelle colonne (=variable) partir dune ou plusieurs colonnes originales. Elle peut tre aussi simple que le nom de la colonne originale. Elle peut impliquer une ou plusieurs colonnes dont lassemblage est fait laide doprateurs et/ou de fonctions, le tout structur par lutilisation de parenthses pour introduire une priorit respecter dans les calculs . Les oprateurs disponibles sont les suivants :

+ * / \

somme diffrence ngation multiplication division division en nombres entiers

a+b a-b -a a*b a/b a\b

Mod ^ &

(partie dcimale oublie) reste dune division en nombres entiers


( a = (a \ b) * b + a Mod b )

a Mod b a^b e&f

lev une puissance concantation de chanes de caractres (le + peut tre aussi utilis en MB)

- Ordre de priorit des oprateurs Lorsque MapInfo value des expressions, il doit savoir quels lments calculer en premier, autrement dit quelle est leur priorit. Par convention, les oprateurs ont des niveaux de priorit diffrents. Ceux dont la priorit est la plus leve sont calculs en premier. Le tableau qui suit indique l'ordre de priorit des divers oprateurs de MapInfo. Les oprateurs ayant la mme priorit sont valus selon leur place dans lexpression de la gauche vers la droite. Priorit la plus haute () ^ * / \ Mod +-& parenthses puissance ngation multiplication, division addition, soustraction

Priorit la plus basse

- Fonctions utiles dans les expressions Fonctions trigonomtriques


Cos( num ) Sin( num) Tan( num ) Acos( num ) Asin( num ) Atan( num ) Cosinus d'un nombre num est exprim en radians. Sinus d'un nombre num est exprim en radians. Tangente d'un nombre num est exprim en radians. Angle en radians dont le cosinus est num Angle en radians dont le sinus est num Angle en radians dont la tangente est num

Fonctions de troncation numrique


Fix( num ) Int( num ) Round( num1, num2 ) Partie entire d'un nombre Entier le plus proche <= num Nombre arrondi de num1 la valeur la plus proche de num2 (par ex., si num2 =10, num1 est arrondi la dizaine la plus proche).

Autres fonctions mathmatiques


Abs( num ) Exp( num ) Log( num ) Maximum( num1 , num2 ) Minimum( num1 , num2 ) Rnd( 1 ) Sgn( num ) Sqr( num ) Valeur absolue d'un nombre. e la puissance (num) Logarithme naturel (base de e) de num (doit tre >0). Pour obtenir le logarithme dans la base 10, calculer: log(num) / log(10) Le plus grand de deux nombres. Le plus petit de deux nombres. Nombre au hasard 1, 0 ou 1 selon le signe de lexpression calcule Racine carre de num (doit tre >0).

Fonctions pour chanes de caractres


Asc( chane ) Chr$( num ) DeformatNumber$( ch ) Format$( num , modle ) FormatNumber$( num ) Code du premier caractre de ( chane ) Caractre qui correspond au code caractre (Chr$(65) >> "A"). Chane ne comportant pas de sparateur de milliers Chane reprsentant un nombre mis en forme selon le modle donn. Par exemple, Format$( 12345.678, "$,#.##") retourne "$12,345.68". Chane reprsentant un nombre mis en forme selon les spcifications du systme doprations local. Cette fonction plus simple utiliser que Format$ offre un contrle moindre sur le format Position dans la chane ch1 partir de la position num, de loccurrence de la chane ch2 (zro si cette chane ch2 est introuvable). Pour commencer la recherche au dbut de la chane, attribuez num la valeur un (1). Chane ch en caractres minuscules. Les num premiers caractres de la chane ch. Nombre de caractres d'une chane, y compris les espaces du dbut, entre les mots et de la fin. Chane sans les espaces ventuels au dbut de ch Chane des num2 caractres de la chane ch partir de la position num1. Chane avec la premire lettre de chaque mot en majuscules. Chane des num derniers caractres de la chane ch. Chane sans les espaces ventuels la fin de ch Chane de num espaces Chane reprsentant un nombre , le type dun objet (Line, Text...) ou une date ctite selon les spcifications du systme doprations local Chane forme de num rptitions de lexpression expr Chane ch en caractres majuscules. Valeur numrique de la chane ch. Par exemple, Val("18 rue X") retourne le nombre 18.

InStr( num , ch1 , ch2 )

LCase$( ch ) Left$( ch , num ) Len( ch ) LTrim$( ch ) Mid$( ch, num1, num2 ) Proper$( ch ) Right$( ch , num ) RTrim$( ch ) Space$( num ) Str$( expr ) String$( num, expr ) UCase$( ch ) Val( ch )

Fonctions gographiques
Area( obj , unit ) Superficie d'un objet. Unit de superficie, telle que "sq km" ou "hectare". AreaOverlap( obj1, obj2) Surface commune deux objets ferms, en units courantes. CentroidX( obj ) Abscisse (coordonne x) du centrode d'un objet. CentroidY( obj ) Ordonne (coordonne y) du centrode d'un objet. Distance( num_x1, num_y1, Distance entre deux points. Coordonnes x et y du point de dpart puis num_x2, num_y2, unit) celles du point d'arrive. Unit de distance, telle que "mi" ou "km". ObjectLen( obj , unit) Longueur de l'objet. Unit de distance, telle que "mi" ou "km". Seuls les objets lignes, polylignes et arcs de cercle ont une longueur. Perimeter( obj , unit) Primtre d'un objet. Unit de distance, telle que "mi" ou "km". Seuls les objets polygones, ellipses et rectangles ont un primtre ProportionOverlap( obj1, obj2) Proportion de lobjet obj1 recouvert par lobjet obj2.

A partir de la version 5.5, MapInfo a introduit de nouvelles faons de calculer certaines valeurs Ainsi Area(), Distance(), ObjectLen() et Perimeter() existent aussi en deux variantes : CartesianArea(), CartesianDistance(), CartesianObjectLen() CartesianPerimeter() and SphericalArea(),SphericaDistance(),SphericaObjectLen(), SphericaPerimeter(). Les algorithmes de calculs tiennent compte du systme de coordonnes de la table. Les cartesian appliqus des tables non projetes (en degrs) retournent la valeur 1. Les spherical appliqus des tables non-earth (ne pouvant pas tre converties en coordonnes sphriques) retournent la valeur 1. Les fonctions originales utilisent un algorithme spherical sauf si la table est en non-earth .

Fonctions concernant les dates


Une variable dimensionne Date est emmagasine dans MI sous la forme AAAAMMDD. Une telle variable peut tre utilise dans des calculs trs limits : date + ou constante numrique date1 date2 ( Date ) est une valeur reprsentant une date dans le format AAAAMMDD ( chane_date) est une date dans le format du systme doprations local sous la forme dune chane de caractres.
CurDate() Day( date ) FormatDate$( date ) Month( date ) StringToDate( chane_date ) Weekday( date ) Year( date ) Date courante dans le format AAAAMMDD Quantime du mois (1 - 31) Date mis en forme selon les spcifications du systme doprations local. Mois (1 - 12). Date dans le format AAAAMMDD Jour de la semaine (1 - 7). 1 reprsente le dimanche Anne (par exemple, 1994).

Fonctions retournant des objets


Les fonctions qui retournent des objets ne peuvent pas tre utilises dans un Select , la liste des expressions ne pouvant contenir spcifiquement la colonne OBJ. Ne pouvant utiliser SQL pour crer des objets par transformation, il faut passer par UPDATE qu lon applique ventuellement sur une slection pralable.

3 Principes dutilisation dune sous-slection


Le Select permet dutiliser ce que MI appelle une sous-slection, qui devrait plutt tre appele une pr-slection, dans des conditions bien dfinies. Dabord elle ne peut tre quun des termes dune comparaison; ensuite la comparaison doit tenir compte de la nature des rsultats de cette sous-slection; finalement il ne peut y en avoir quune par Select Je prfrerais le terme pr-slection parce que quand elle est prsente dans un Select , Mi commence par la calculer, cest dire prpare une table contenant les rsultats, et se sert ensuite de cette table comme un terme constant dans la comparaison correspondante. Une consquence de cette faon de fonctionner est quil importe peu techniquement que la sousslection soit dans le premier ou le deuxime terme de la comparaison puisquelle est toujours calcule en premier. Voici un exemple tout simple : pour connatre les dpartements dune table (dep) qui n'ont pas d'tangs (dfinis dans une table etang): select * from dep where not obj contains any (select obj from etang) La sous-slection (select obj from etang) est contenue entre parenthses et entre comme argument de la fonction ANY() dans la dfinition du second terme dune comparaison nie (prcde de loprateur NOT) et utilisant un oprateur gographique contains .

10

Une sous-slection extrait une table temporaire (invisible) avec une seule variable qui doit tre en rapport avec le premier terme de la comparaison; cette variable peut tre une des colonnes de la table spcifie ou obj une expression base sur une ou plusieurs colonnes une valeur agrge (il nest pas ncessaire dutiliser GROUP BY dans ce contexte) (select col2 from tableC) (select area(obj,sq,km) from regions) (select avg(population) from depart) Toute combinaison est possible; ainsi, pour slectionner toutes les rgions dont la surface est suprieure la moyenne (non connue), une possibilit est la suivante select * from tab_1 where area(obj,sq,km) > (select avg(area(obj,sq,km)) from tab_1) Une sous-slection peut contenir des conditions prcdes dun WHERE . Le rsultat dune sous-slection peut aussi tre dirig vers une nouvelle table visible avec un INTO , mais cela est probablement pas bien efficace et nest pas recommand. Loprateur doit pouvoir accepter les rsultats de la sous-slection. Si le rsultat est une valeur unique (comme avec la valeur agrge par la fonction AVG() ) une comparaison directe peut tre faite (<, <=, ...). Si le rsultat contient plusieurs valeurs, on doit utiliser alors des oprateurs plus complexes comme = ANY (sous-sl,) <> ALL (sous-sl.) pour trouver les cas dune table ayant la mme cl dans une autre table pour trouver les cas dune table absent dans lautre sur la base dune cl

4 Slection par caractristique graphique avec diffrents types dobjets


Les caractristiques graphiques sont celles que lon peut obtenir avec certaines fonctions MapBasic comme ObjectInfo(), ObjectGeography()... . Elles ont trait des donnes gomtriques (coordonnes de nuds ...), de style de prsentation (Pen, Brush...) mme de contenu (le texte dun objet texte). Problme : certaines caractristiques graphiques nexistent pas pour tous les types dobjets. Ainsi select * from polys where str$(objectinfo(obj,3))<>"Brush (2, 0, 16777215)" into sel entrane une erreur objectinfo argument 2 out off range si la table contient dautres objets que des rgions et des textes (la valeur 3 du deuxime argument nest reconnue que pour les rgions comme brosse et pour les textes comme chane de caractres). On pourrait imaginer rajouter une condition quant au type de lobjet comme dans select * from polys where str$(objectinfo(obj,3))<>"Brush (2, 0, 16777215)" and int(objectinfo(obj,1))=7 into sel La mme erreur apparatrait car dans MI les deux comparaisons du groupe sont values pour chaque cas indpendamment et cela quel que soit leur ordre.

11

Une premire solution consiste procder par tape, une premire slection fait sortir les objets du type voulu, une deuxime faite sur les rsultats de la premire ceux avec la caractristique recherche. select * from polys int(objectinfo(obj,1))=7 into sel1 select * from sel1 where str$(objectinfo(obj,3))<>"Brush (2, 0, 16777215)" into sel2 Une deuxime solution fait appel une sous-slection et na donc pas besoin dune table intermdiaire. select * from polys where col1 in (select col1 from polys where str$(objectinfo(obj,1))="7")) and str$(objectinfo(obj,3))<>"Brush (2, 0, 16777215)" into sel Il faut utiliser col1 (qui existe toujours dans une table MI) et non obj parce que si on utilise obj, on obtient une erreur du type Data mismatch ; il faut se rappeler que MI ne peut pas faire de comparaisons entre objets, seulement sur des valeurs attributaires et loprateur in implique quil y a comparaison. La colonne spcifie dans lexpression de sous-slection nest ici quun prtexte pour permettre la construction de la sous-table sur la base du where . La table Lines contient des polylignes, la table Areas des rgions. Il faut trouver les polylignes dont le point de dpart est dans une des rgions. SELECT * FROM Lines WHERE CreatePoint(ObjectNodeX(obj,1,1),ObjectNodeY(obj,1,1)) WITHIN ANY (SELECT obj FROM Areas) Pour trouver les polylignes finissant dans une des rgions, il faut faire lhypothse que ce sera la fin de la premire section si la polyligne a plusieurs sections. SELECT * FROM Lines WHERE CreatePoint(ObjectNodeX(obj,1,objectinfo(obj,22)), ObjectNodeY(obj,1,objectinfo(obj,22))) WITHIN ANY (SELECT obj FROM Areas) Il nest pas possible de travailler avec des fins de polylignes ayant plusieurs sections car il faudrait alors encastrer un autre niveau de fonction et Mapinfo ne laccepte pas, comme dans lextrait suivant ObjectNodeX(obj,objectinfo(obj,21), objectinfo(obj,objectinfo(obj,21)+1)) objectinfo() dans le deuxime argument est acceptable mais pas celui qui est enchss dans le troisime.

12

5 Systme de coordonnes lors dune slection


Par dfaut, MapBasic/MapInfo utilise le systme de coordonnes non-projetes en degrs dcimaux de longitude et latitude; ce systme peut tre modifi par lutilisateur (ou par des applications lances par lui) mais il ny a pas de fonction permettant de savoir exactement quel est le systme courant.. Tout appel une fonction produisant des coordonnes retournera les coordonnes dans le systme courant, toute constants passe pour des calculs sera lue dans ce mme systme. Pour tre sr que le bon systme est actif , il suffit de faire excuter dans la fentre MapBasic, la commande suivante : Set coordsys <spcification du systme de coordonnes> Si on veut utiliser le systme tel que dfini dans une table ouverte en particulier, la commande se simplifie en Set coordsys table <nom_de_la_table>

6 Jointure de plus de 2 tables dans le mme Select.


Il faut pour cela dans le Where tablir d abord une relation entre 2 tables, puis une relation entre la deuxime et la troisime. Il est fortement recommand de lister les tables dans lordre avec lequel les relations sont tablies. Select * from pointtable, regiontable, pointable2 where pointtable.obj within regiontable.obj and regiontable.obj contains pointtable2.obj

13

Exemples de mise en uvre


Remarques importantes :
Nous employons les termes Requtes et Slections pour diffrencier deux finalits diffrentes mais complmentaires dans certains cas de lutilisation de Select . Le rsultat dune slection est une table ne contenant que les cas qui ont t retenus par le <groupe_conditions> utilis. Une requte produit une table dont les colonnes sont diffrentes de celles dans la(es) table(s) originale(s) , soit parce quelles ne sy retrouvent pas toutes (quand * nest pas utilise), soit parce que certaines ont t ajoutes selon la <liste_expressions> (colonnes drives). Il est bien entendu que les deux finalits peuvent exister dans une mme commande. Dans tous les cas, la nouvelle table devra tre sauvegarde, quelle ait reu un nom (avec loption INTO) ou non. Cette possibilit qui existe toujours nest pas mentionne dans les exemples qui suivent pour ne pas encombrer le texte. Ds quune colonne drive est dfinie dans liste_expressions, toutes les autres colonnes que lon veut conserver dans la table drive doivent tre explicitement prsentes dans la liste car lutilisation de * (= toutes les colonnes) est incompatible avec la spcification dune seule, drive ou non. Sil sagit donc de rajouter une colonne drive une table, le plus efficace serait alors dajouter une colonne et de la mettre jour avec Update .

1 Slections attributaires
1 1 Sur une table
Objectif : slectionner des donnes/objets en fonction de la valeur de un ou plusieurs attributs provenant dune seule table. Syntaxe : SELECT {liste_expressions|*} FROM <nom_table> WHERE <groupe_conditions> select * from lithologie where Code = 1 select col1, col3, col4 from lithologie where Code <> 1 and (Rowid between 25 and 50) select * from villes where (pop_91 pop_81)/pop_81>1.2

Exemple1 :

Exemple2

Slectionne les villes dont la population a augment de plus de 20% entre 1981 et 1991 Exemple3 : select Nom, pop_91 pop_81 Evolution 1981-91 from villes

Retourne une table contenant le nom des villes et la diffrence entre les populations de 1981 et 1991.

14

Objectif : slectionner des donnes/objets en fonction dun attribut-caractres Syntaxe : SELECT {liste_expressions|*} FROM <nom_table> WHERE <colonne_caractres> LIKE <rfrence> select * from MaTable where Nom_Rue LIKE "%Avenue%"

Exemple1 :

Trouve toutes les rues dont le nom contient Avenue Exemple2 : select * from MaTable where Nom_Rue LIKE "Avenue%"

Trouve toutes les rues dont le nom commence par Avenue Exemple3 : select * from MaTable where Nom_Rue LIKE "%Avenue"

Trouve toutes les rues dont le nom finit par Avenue Noter que LIKE est insensible la casse.

1 2 Sur plusieurs tables


Syntaxe : SELECT {liste_expressions|*} FROM <Table_1>, <Table_2> WHERE < table_1.ChampX > {oprateur} < table_2.ChampY > Select lithologie.Code, Lithologie_code.Libell_ from lithologie, Lithologie_code where lithologie.Code = Lithologie_code.Code

Exemple1 :

Retourne une table contenant le code lithologique (pris dans la table lithologie) et le libell de la lithologie (pris dans la table lithologie_code). Ces deux tables ont pour champ commun Code . Exemple2 : Select lithologie.Code, Lithologie_code.Libell_ from lithologie, Lithologie_code where lithologie.Code = Lithologie_code.Code and Lithologie_code.Code = 1

Retourne une table contenant le code lithologique (pris dans la table lithologie) et le libelle de la lithologie (pris dans la table lithologie_code) incluant les cas ayant pour valeur de Code 1. Exemple3 : Select * from lithologie where not Code in (select Code from Lithologie_code)

Permet de slectionner les cas de la table Lithologie qui nont pas de correspondance de lattribut Code dans la table Lithologie_code . Trs utile pour dterminer si tous les codes dune table ont t traduits en clair dans une table de correspondance.

1 3 Fusion de 2 tables par slection sur une colonne commune


Si deux tables ont une colonne contenant le mme identificateur unique (pas de rptitions dans lune ni dans lautre), on peut fusionner ces deux tables par un select Syntaxe : SELECT * FROM <table1>,<table2> WHERE <table1.col_ID> = <table2.col_ID>

15

Exemple :

select * from villes_1990, villes_2000 where villes_1900.code = villes_2000.code into sel_villes

La table sel_villes devra tre sauvegarde sous ce nom ou un autre. Elle contient toutes les colonnes des deux tables (y compris celles ayant servi faire la jointure) et tous les cas qui se retrouvent dans les 2 tables, lexclusion donc des cas prsents dans une seule table.

1 4 Slection des enregistrements dune table pas dans une autre


Deux tables contiennent au moins un champ commun pouvant avoir un nom diffrent dans chaque table, ici Champ_RefA dans une table, Champ_RefB dans lautre. Il sagit de trouver les enregistrements de TableA qui ne sont pas dans TableB. Syntaxe : SELECT * FROM <TableA> WHERE NOT <Champ_RefA> IN (SELECT <Champ_RefB> FROM TableB)

1 5 Slectionner les enregistrements qui nont pas dobjets


Syntaxe : SELECT * FROM <Table> WHERE NOT OBJ

2 Requtes gographiques
Objectifs : Slectionner des cas en fonction des relations spatiales qui les unissent.

2 1 Slection dobjets en intersection spatiale totale ou partielle.


Syntaxe : SELECT {liste_expressions|*} FROM <Table1>, <Table2> WHERE <Table1.obj> INTERSECTS <Table2.obj> Select * from Mailles, lithologie where Mailles.Obj Intersects lithologie.Obj

Exemple :

Tous les objets de la table mailles en intersection avec des objets de la table Lithologie sont slectionns.

2 2 Slection dobjets en intersection spatiale totale


Syntaxe : SELECT {liste_expressions|*} FROM <Table1, Table2> WHERE <Table1.obj> ENTIRELY WITHIN <Table2.obj>

Exemple :

Select * from Mailles, lithologie where Mailles.Obj Entirely Within lithologie.Obj

16

Tous les objets de la table mailles entirement contenus dans des objets de la table Lithologie sont slectionns.

2 3 Requtes gographiques multiples


Objectifs : Slectionner des cas en fonction des relations spatiales qui les unissent en spcifiant des sous-slections sur la valeur de un ou plusieurs attributs. Syntaxe : SELECT {liste_expressions|*} FROM <Table1, Table2> WHERE <Table1.obj> INTERSECTS <Table2.obj> AND <condition>

Exemple1:

Select * from lithologie, hydro where lithologie.Obj intersects hydro.Obj and hydro.TOPONYMIE = "LE TAGNONE"

Tous les objets de la table Lithologie en intersection avec la rivire Le Tagnone sont slectionns. Autre possibilit darriver au mme rsultat : Exemple2: Select * from lithologie where obj intersects any (select obj from hydro where hydro.TOPONYMIE = "LE TAGNONE")

Dans lexemple 1, la table rsultats_SQL contient les attributs des deux tables alors que dans le second exemple elle ne contient que les attributs de la table Lithologie . Exemple3 : Select * from Mailles, lithologie, hydro where Mailles.obj intersects lithologie.obj and lithologie.obj Intersects hydro.obj and hydro.TOPONYMIE = "LE TAGNONE"

Les objets de la table Mailles qui se trouvent en intersection mme partielle avec les objets de la table Lithologie eux mmes en intersection avec la rivire Le Tagnone sont slectionns. Dans cet exemple, les cellules de Mailles sont slectionnes autant de fois quelles se trouvent en intersection dune part avec les objets de la table Lithologie dautre part avec les objets de la table Hydro Exemple 4 : Select * from Mailles, lithologie, hydro where Mailles.obj intersects lithologie.obj and lithologie.obj Intersects hydro.obj and hydro.TOPONYMIE = "LE TAGNONE" group by Mailles.z

Pour saffranchir de la contrainte de lexemple 3, on demande de grouper la slection selon un identifiant de la table Mailles (champ : Mailles.z ). Le logiciel ne conserve alors que les occurrences uniques de cet identifiant par contre il perd la relation avec les objets graphique. La table rsultante est uniquement attributaire.

17

2 4 Requtes bases sur ladjacence des objets


Objectifs : Ce type de requte permet de trouver pour un objet donn lensemble des objets qui lui sont contigus. Sur lensemble dune table Pour se faire, nous allons crer une copie de la table dorigine pour comparer la position des objets de la table dorigine par rapport aux objets de la copie de la table dorigine. La colonne ID doit contenir des identificateurs uniques. Syntaxe : SELECT {liste_expressions|*} FROM <Table1>, <Copie de Table1> WHERE <Table1.obj> INTERSECTS <Copie de Table1.obj> AND <Table1.ID> <> <Copie de Table1.ID> Select Mailles.z, Mailles_bis.z from Mailles, Mailles_bis where Mailles.obj Intersects Mailles_bis.obj and Mailles.z <> Mailles_bis.z.

Exemple :

Le rsultat est une table deux colonnes o pour chaque identificateur de la table dorigine (Mailles.z), on a la liste des identificateurs des objets adjacents (Mailles_bis.z). Pour un objet donn Syntaxe1 : SELECT {liste_expressions|*} FROM <Table> WHERE OBJ INTERSECTS <variable objet> AND AREAOVERLAP(OBJ, <variable objet>) = 0

La variable objet est dfinie grce la fentre MapBasic en slectionnant dabord la rgion voulue. Exemple : select * from ma_table where obj intersects reg and areaoverlap(obj, reg)=0

Avec au pralable dans le fentre Mapbasic dim reg as object reg = selection.obj La slection contient toutes les rgions adjacentes par au moins un point celle choisie et exclue la rgion de rfrence. Syntaxe2 : SELECT {liste_expressions|*} FROM <Table> WHERE OBJ INTERSECTS ANY(SELECT OBJ FROM <Table> WHERE <cas_ID>) est une condition permettant didentifier un cas spcifique, comme le nom dune colonne avec identificateur unique = une valeur donne

<cas_ID>

Exemple :

Select * from matable where obj intersects any (select obj from matable where matable.CODE_DEPART = 46 )

La slection contient tous les dpartements limitrophes du 46 y compris le 46. Cette syntaxe exige de connatre la valeur de lidentificateur unique. Elle pourrait tre complte par une condition dexclusion de la rgion de rfrence telle que and matable.CODE_DEPART <> 46

18

2 5 Requtes bases sur la proximit


Objectifs : Trouver des objets se trouvant une distance donne dun objet slectionn. Syntaxe : SELECT {liste_expressions|*} FROM <Table> WHERE OBJ WITHIN ANY (SELECT BUFFER ( OBJ , <lissage du buffer>, <distance de slection> , "unit de distance" ) FROM SELECTION ) Select * from Forages where obj within any ( select buffer ( obj , 12 , 10 , "km" ) from selection ) into sel

Exemple :

Dans lexemple ci dessus tous les points de la table Forages se trouvant moins de 10 km de lobjet slectionn sont identifis.

2 6 Requtes bases sur les distances entre objets


Objectifs : Trouver les distances qui sparent les objets dune table par rapport un point slectionn. Le champ ID de la table contient des identificateurs uniques. Syntaxe : SELECT <Table.ID>, DISTANCE (<coordx de lobjet slectionn>, <coordy de lobjet slectionn>, CENTROIDX(obj), CENTROIDY(obj), "km") ["alias"] FROM <Table> [ORDER BY [ Distance | alias] ] Select Forages.INAT, distance (1166592.800, 1708088.100, centroidx(obj), centroidY(obj), "km") "Distance" from Forages order by DISTANCE

Exemple1 :

Dans lexemple ci dessus nous calculons les distances qui sparent lobjet de coordonnes (1166592.800, 1708088.100) des centrodes des objets de la table forage et nous trions les rsultats par distance croissante. Exemple2 : Select Forages.INAT, min(distance (1166592.800, 1708088.100, centroidx(obj), centroidY(obj), "km")) "Distance Min" from Forages where Forages.INAT <> "11147X0034"

Dans lexemple ci dessus nous slectionnons lobjet se trouvant le plus prs de lobjet de coordonnes (1166592.800, 1708088.100) en excluant le forage spcifi..

2 7 Requtes base sur la position relative des objets.


Objectifs : Trouver des objets se trouvant dans une certaine position par rapport un autre objet. Syntaxe : SELECT {liste_expressions|*} FROM <Table> WHERE <groupe_expressions_position_relative>

<groupe_expressions_position_relative> Mmes rgles gnrales que pour <groupe_expressions > mais une expression est de la forme <mesure de position de OBJ> { < | <= | = | >= | > | <> } <mesure de rfrence>

19

La mesure de position est fournie par une des fonctions disponibles comme CentroidX() ou CentroidY(). Il faut sassurer avant que la mesure de rfrence soit exprime avec les units dont se sert MapBasic ce moment l. Exemple1 : Select INAT from Forages where CentroidY(obj) > 1708088.100 and INAT <> "11147X0034"

Dans lexemple ci dessus tous les objets de la table forages situs au nord du point de coordonnes (1166592.800, 1708088.100) et dont le numro didentificateur est diffrent de "11147X0034" sont slectionns. En combinant les expressions logiques sur CENTROIDX(OBJ) et sur CENTROIDY(OBJ) on peut arriver slectionner les objets dans nimporte quelle direction.

2 8 Des points et des lignes


Supposons quune table contient des polylignes (un rseau de quelque chose) et une autre des points reprsentant les intersections/jonctions de polylignes et leurs extrmits isoles. Comment slectionner les polylignes passant par un point donn, ou les points relis une polyligne ? Dans les 2 cas nous commenons par charger lobjet donn grce la fentre MapBasic dim o as object o = selection.obj Si un point est donn Syntaxe : SELECT * FROM <table polylignes> WHERE OBJ INTERSECTS BUFFER (<objet>, 6, <largeur>, unit)

<largeur> le rayon du tampon. Il suffit dtre certain que le tampon est rellement cr. La largeur est exprime en unit de distance Exemple : select * from aqueducs where obj intersects buffer(o, 6,1 , m)

Le nombre de 6 points pour former un cercle (ou le demi-cercle autour des extrmits) est bien suffisant et acclre le travail. Dans cette carte en projection mtrique, un mtre fera laffaire. En cas de doute, on peut jouer avec ce paramtre. La slection contient les polylignes passant par le point donn. Si une polyligne est donne Syntaxe : SELECT * FROM <table points> WHERE OBJ INTERSECTS BUFFER (<objet>, 6, <largeur>, unit)

<largeur> le rayon du tampon. Il suffit dtre certain que le tampon est rellement cr. La largeur est exprime en unit de distance Exemple : select * from extrmits where obj intersects buffer(o, 6,1 , m)

20

Le nombre de 6 points pour former un cercle (ou le demi-cercle autour des extrmits) est bien suffisant et acclre le travail. Dans cette carte en projection mtrique, un mtre fera laffaire. En cas de doute, on peut jouer avec ce paramtre. La slection contient les points aux extrmits et le long de la polyligne donne.

2 9 Slection des objets qui ne se trouvent pas dans une zone donne
Une table contient les objets, lautre une rgion donne. Rgions. Syntaxe : SELECT * FROM <table_rgions> WHERE NOT OBJ INTERSECTS ANY(SELECT OBJ FROM <Table_zone>)

Points. Syntaxe : SELECT * FROM <table_points> WHERE NOT OBJ WITHIN ANY(SELECT OBJ FROM <Table_zone>)

2 10 Construction dune matrice dadjacence pour une table de rgions


Ce problme ne peut tre rsolu que par une procdure itrative, ce qui nest pas lidal quand il ny a que la fentre MapBasic de disponible. Il implique aussi lexistence dune colonne (logical) par rgion ce qui limite le nombre de rgions 250. Mais cest une bonne occasion de montrer comment on peut raliser une boucle de la fentre MB. La table Rgions ne contient que des rgions et a t compacte auparavant et contient autant de colonnes Logical quil y a de rgions. Entrez dans la fentre MB et excutez les lignes suivantes (les numros ne sont que comme rfrence pour les explications ; ils ne font pas partie des commandes) 1 2 3 4 5 dim i as smallint dim colref as alias dim adjobj as object i=1 colref="col"+i Entrez les lignes suivantes sans les excuter. Puis slectionnez les toutes et excutez. En cliquant sur la barre de la fentre MB, ractivez ce bloc et excutez ; rptez jusqu la fin 6 7 8 9 10 11 fetch rec i from regions adjobj=polyson.obj select * from regions where rowid <> i and obj intersects adjobj into adjzons noselect update adjzons set colref=1 i=i+1 colref="col"+i

21

i (1, 4) est le compteur denregistrements et adjobj (3) lobjet permettant de faire les intersections. Colref est un alias (2, 5) qui nous permettra de choisir la bonne colonne par sa position de 1 jusquau nombre de rgions quel que soit lentte quelle ait dans la table. (6) On se positionne dabord sur le bon enregistrement (N.B. cette technique exige quil ny ait pas denregistrements sans objet graphique, ni vide ) pour saisir lobjet (7). Le Select (8) retient tous les objets qui touchent lobjet choisi lexclusion de lui-mme (N.B. intersects dtecte tout objet partageant lespace de lobjet de rfrence mme si ce nest que par un seul point en commun. Le rsultat de la slection est mis dans la table temporaire adjzons et loption NOSELECT est utilise car nous ne voulons pas ncessairement voir ces slections et elle no fera ainsi gagner du temps. La table temporaire est mis jour pour la colonne spcifie par lalias (9) Le compteur et lalias sont augments (10, 11) et la boucle peut reprendre.

3 Requtes utilisant des caractristiques gomtriques


3 1 Requtes retournant des informations surfaciques sur les objets.
Sur une table Objectifs : Slectionner des objets en fonction de leurs caractristiques surfaciques. Syntaxe : SELECT <liste_de_variables> , AREA(OBJ, "unit de surface") [alias] FROM <Table> Select ID_#, area(obj, "sq km") "surface" from lithologie

Exemple1 :

Retourne lidentificateur et la surface de chaque objet de la table Lithologie Exemple2 : Select Code, sum(area(obj, "sq km")) "surface" from lithologie group by Code order by Code

Retourne la surface totale des objets par occurrence de lattribut Code tri Sur plusieurs tables Objectifs : Trouver les surfaces dintersection dobjets se trouvant dans des tables diffrentes. Syntaxe1 : SELECT <Table1.ID>, <Table2.ID>, AREAOVERLAP (Table1.OBJ, Table2.obj) [alias] FROM <Table1> ,<Table2> WHERE Table1.OBJ INTERSECTS Table2.Obj SELECT <Table1.ID>, <Table2.ID>, PROPORTIONVERLAP (Table1.OBJ, Table2.obj) [alias] FROM <Table1> ,<Table2> WHERE Table1.OBJ INTERSECTS Table2.Obj

Syntaxe2 :

22

Exemple1 :

Select lithologie.Code, Mailles.z, areaoverlap(lithologie.obj, Mailles.obj) "Surface d'intersection" from lithologie, Mailles where lithologie.Obj Intersects Mailles.Obj

Retourne la surface dintersection des objets de la table Lithologie avec les objets de la table Mailles . Exemple2 : Select lithologie.Code, Mailles.z, proportionoverlap(lithologie.obj, Mailles.obj) from lithologie, Mailles where lithologie.Obj Intersects Mailles.Obj

Mme chose mais pour le pourcentage dintersection (syntaxe 2) Exemple3 : Select lithologie.Code, Mailles.z, ((ProportionOverlap(lithologie.obj, ailles.obj))*100)/ area(Mailles.obj, "sq km") "Pourcentage" from lithologie, Mailles where lithologie.Obj Intersects Mailles.Obj order by Pourcentage into Selection

Retourne le pourcentage dintersection entre chaque objet de la table Lithologie et les objets de la table Mailles Exemple4 : Select lithologie.Code, Mailles.z, round (((ProportionOverlap(lithologie.obj, Mailles.obj))*100)/area(Mailles.obj, "sq km"), 0.01) "Pourcentage" from lithologie, Mailles where lithologie.Obj Intersects Mailles.Obj order by Pourcentage asc into Selection

Retourne la mme chose que prcdemment mais avec des rsultats arrondis.

Exemple 5 :

Select lithologie.Code, Mailles.z from lithologie, Mailles where lithologie.Obj Intersects Mailles.Obj and (proportionoverlap(lithologie.obj, Mailles.obj)) = 1

Slectionne tous les objets de la table Lithologie entirement compris (proportion de recouvrement = 1) dans un objet de la table Mailles .

3 2 Requtes retournant des informations linaires sur les objets.


Objectifs : Trouver la longueur des objets linaires Syntaxe : SELECT <liste_de_variables>, OBJECTLEN(OBJ, "Unit de distance") FROM <Table> Select TOPONYMIE, ObjectLen(obj, "km") from hydro

Exemple1 :

Retourne la longueur en km de chaque objet de la table Hydro Exemple2 : Select TOPONYMIE, sum(ObjectLen(obj, "km")) from hydro group by TOPONYMIE

Retourne la longueur cumule des cours deau portant le mme nom.

23

Objectifs : Trouver le primtre des objets ferms Syntaxe : SELECT <liste_de_variables>, PERIMETER(OBJ, "Unit de distance") FROM <Table> Select TOPONYMIE, ObjectLen(obj, "km") from Lacs

Exemple1 :

Retourne le primtre en km de chaque objet de la table Lacs Exemple2 : Select TOPONYMIE, sum(Perimeter(obj, "km")) from Lacs group by TOPONYMIE

Retourne le primtre cumul des lacs portant le mme nom.

4 Requtes utilisant des caractristiques graphiques


4 1 Slections bases sur les attributs graphiques des objets
Objectifs : slectionner les objets en fonction de leurs attributs graphiques (couleur par ex) SELECT {liste_expressions|*} FROM <Table> WHERE Syntaxe : STYLEATTR(OBJECTINFO(OBJ, <Argument 1>), <Argument 2> ) <OPR><RF> <Argument 1> correspond aux arguments de la fonction Objectinfo() : Dans les fentres MapBasic ou SQL, utiliser le code numrique :
OBJ_INFO_PEN OBJ_INFO_SYMBOL OBJ_INFO_TEXTFONT OBJ_INFO_BRUSH 2 2 2 3 retourne le n de style de ligne retourne le n de symbole retourne la police courante retourne le n de trame courante

<Argument 2> correspond aux arguments de la fonction Styleattr() . Noter que tous les codes nexistent pas pour tous les styles. Dans les fentres MapBasic ou SQL, utiliser le code numrique :
PEN_WIDTH PEN_PATTERN PEN_COLOR BRUSH_PATTERN BRUSH_FORECOLOR BRUSH_BACKCOLOR FONT_NAME FONT_STYLE FONT_POINTSIZE FONT_FORECOLOR FONT_BACKCOLOR SYMBOL_CODE SYMBOL_COLOR SYMBOL_POINTSIZE 1 2 4 1 2 3 1 2 3 4 5 1 2 3 retourne lpaisseur dune ligne retourne le style de ligne retourne la couleur de la ligne retourne le style de trame retourne la couleur davant plan retourne la couleur darrire plan retourne le nom de la police retourne le style de police (1 = gras, etc) retourne la taille de la police retourne la couleur davant plan de la police retourne la couleur darrire plan de la police retourne le code du symbole utilis retourne la couleur du symbole retourne la taille des symboles ponctuels

24

SYMBOL_ANGLE SYMBOL_FONT_NAME SYMBOL_FONT_STYLE SYMBOL_KIND SYMBOL_CUSTOM_NAME SYMBOL_CUSTOM_STYLE

4 5 6 7 8 9

retourne langle du symbole retourne le nom du symbole retourne le style du symbole retourne le type de symbole (1=vecteur, 2=police, 3=personnalis) retourne le nom du symbole personnalis retourne le style du symbole personnalis

<OPR> <RF>

< , <= , = , >= , > , <> , LIKE valeur de rfrence approprie. Attention lorthographe, surtout aux espaces

Exemple :

Select * from forage where StyleAttr(ObjectInfo(obj, 2), 2) = 16711680

16711680 est le code interne MapInfo pour la couleur rouge traduite partir du code RGB en suivant la formule suivante : (red * 65536) + (green * 256) + blue

4 2 Requtes sur les types dobjets


Objectifs : slectionner des objets en fonction de leur type (points, polygones , polylignes, etc) Syntaxe1: Syntaxe2: Syntaxe3: SELECT * FROM <Table> WHERE STR$(OBJ) = type_en_caractres SELECT * FROM <Table> WHERE STR$(Ojectinfo(obj,1) = type_ en_numr. SELECT * FROM <Table> WHERE INT(Ojectinfo(obj,1) = type_ en_numrique

types dobjet (numrique et caractres) 1 Arc 2 Ellipse 4 Polyline 5 Point 8 Rectangle 9 Rounded Rectangle

3 Line 7 Region 10 Text

Exemple1 : Exemple1a : Exemple1b :

Select * from lithologie where str$(obj) = "line" Select * from lithologie where str$(Ojectinfo(obj,1)) = "4" Select * from lithologie where int(Ojectinfo(obj,1)) = 4

Les exemples ci dessus, tous quivalents, permettent de slectionner tous les objets de type ligne. Trs intressant quand on fait de la correction sur les couvertures ou pour utiliser certaines fonctions qui ne marchent que sur des types donns. (voir application dans la section prsentant les principes de la sous-slection)

Exemple2 :

Select count(*), str$(obj) "Type" from lithologie group by Type

Cet exemple permet de compter le nombre dobjets diffrents par type dobjet prsent

25

4 3 Requtes retournant des informations sur la gographie des objets


Objectifs : Retourne les caractristiques gographiques des objets dune couverture Syntaxe : <Argument> SELECT OBJECTGEOGRAPHY (OBJ, <argument>) FROM <Table>. un argument de la fonction Objectgeography() :

Dans les fentres MapBasic ou SQL, utiliser le code numrique :


OBJ_GEO_MINX OBJ_GEO_LINEBEGX OBJ_GEO_POINTX OBJ_GEO_MINY OBJ_GEO_LINEBEGY OBJ_GEO_POINTY OBJ_GEO_MAXX OBJ_GEO_LINEENDX OBJ_GEO_MAXY OBJ_GEO_LINEENDY OBJ_GEO_ARCBEGANGLE OBJ_GEO_TEXTLINEX OBJ_GEO_ROUNDRADIUS OBJ_GEO_ARCENDANGLE OBJ_GEO_TEXTLINEY 1 coordonnes xmin du rectangle englobant 1 coordonnes x du nud de dpart 1 coordonnes x du point 2 coordonnes ymin du rectangle englobant 2 coordonnes y du nud de dpart 2 coordonnes y du point 3 coordonnes xmax du rectangle englobant 3 coordonnes y du nud de fin 4 coordonnes ymax du rectangle englobant 4 coordonnes y du nud de fin 5 angle de dpart dun arc de cercle 5 coordonnes xmin dun label de type texte 5 diamtre du cercle dun rectangle arrondi 6 angle de fin dun arc de cercle 6 coordonnes ymin dun label de type texte

Syntaxe : <Argument>

SELECT OBJECTINFO (OBJ, <argument>) FROM <Table>. un argument de la fonction ObjectInfo() :

Dans les fentres MapBasic ou SQL, utiliser le code numrique :


OBJ_INFO_NPNTS OBJ_INFO_SMOOTH OBJ_INFO_NPOLYGONS OBJ_INFO_NPOLYGONS +N 20 retourne le nombre de nuds dun objet 4 retourne vrai si une polyligne est lisse 21 retourne le nombre de polygones dune rgion ou de sections dune polyligne 21 + N retourne le nombre de nuds du Nime polygone dune rgion, ou section dune polyligne

Exemple1 :

Select objectgeography(obj, 1) "xmin", objectgeography(obj, 2) "ymin", objectgeography(obj, 3) "xmax", objectgeography(obj, 4) "ymax" from Lithologie

Permet dafficher les coordonnes du rectangle englobant de chacun des objets de la table lithologie Exemple2 : Select objectinfo(obj, 20) "Nbr de points", objectinfo(obj, 21) "Nbr de multipolygones" from Lithologie

Permet dafficher le nombre de nuds de chaque objet ainsi que le nombre de polygones associ chaque objet.

26

5 Travailler avec des objets et donnes textes


5 1 Slection dobjets textes en fonction de certaines de leurs caractristiques
On peut utiliser les fonctions ObjectInfo() et ObjectGeography() pour atteindre dautres caractristiques que les lments de style (police, couleurs, ...)

Fonction ObjectInfo(OBJ,<argument>) <argument> (code numrique seulement)


OBJ_INFO_TEXTSTRING OBJ_INFO_TEXTSPACING OBJ_INFO_TEXTJUSTIFY OBJ_INFO_TEXTARROW 3 retourne une chane de caractres 4 retourne lespacement du texte (1, 1.5 ou 2) 5 retourne le code de justification du texte (0 = G, 1 = C, 2 = D) 6 retourne le code dexistence et de type de flche associe un texte : 0 pas de ligne, 1 ligne simple, 2 flche)

Fonction ObjectGeography(OBJ,<argument>) <argument> (code numrique seulement)


OBJ_GEO_TEXTANGLE 7 angle du texte

Trouver les enregistrements dont le texte contient une certaine chane. Syntaxe : Exemple1 : SELECT * FROM <table> WHERE OBJECTINFO(OBJ,3) LIKE rfrence select * from matable where objectinfo(obj,3) like %puits%

Trouve tous les objets textes dont la chane contient PUITS dans nimporte quelle position Trouver les enregistrements dont le texte nest pas horizontal. Syntaxe : Exemple2 : SELECT * FROM <table> WHERE OBJECTGEOGRAPHY(OBJ,7) <> 0 select * from matable where objectgeography(obj,7) <> 0

Trouve tous les objets textes dont le texte fait un angle avec lhorizontale.

5 2 Concantation / d-concantation de chane de caractres


Une table de renseignements sur les forages contient les variables Prnom (pour le prnom du propritaire) et Nom (pour le son nom de famille). Si vous souhaitez que la table des rsultats indique le nom complet de chaque propritaire, vous pouvez rajouter une colonne drive. Exemple 1 : Select Prnom + " " + Nom "Propritaire" from Forages

Retourne le nom complet du propritaire par concatnation des deux champs.

27

Il peut tre ncessaire dextraire des caractres particuliers dune chane de caractres. Ainsi, par exemple, les forages gologiques sont rpertoris sous le code BSS. Ce code (ex. 00041X0032) est compos de la manire suivante : les 5 premiers chiffres font rfrence la carte gologique au 50.000 o se trouve le forage ; la lettre est un code de reconnaissance interne; les derniers chiffres correspondent au numro denregistrement du forage la BSS. Si on veut que la table des rsultats indique seulement le numro de la carte au 50.000, on peut inclure une colonne drive dans le champ <liste_expressions>. Exemple 2 : Select left$(BSS,5) Numero carte 50000 from forages

Retourne dans la colonne Numero carte 50000 les 5 caractres de gauche de la chane de caractres du champ BSS .

5 3 Slection des cas dont un champ texte contient une chane donne
Syntaxe : Exemple : SELECT * FROM <table> WHERE INSTR(1,<col_texte>,chane_donne ) > 0 select * from ma_table where instr(1,nom_rue, )>0

Slectionne tous les cas de ma_table o il y a au moins un espace dans la colonne nom_rue. comparer avec Select * from ma_table where nom_rue like % %

5 4 Extraction du dernier mot dune phrase


Objectif : obtenir une colonne contenant le dernier mot dune phrase (ex. dune adresse)

Ceci pourrait se faire par un UPDATE de la colonne approprie avec Right$(Col_Texte,Len(Col_Texte)-InStr(InStr(1,Col_Text," ")+1,Col_Text," ")) seulement sil y avait toujours 2 noms dans la colonne texte. Comme il faut sattendre en avoir un nombre indfini chaque cas, on peut utiliser la procdure suivante qu fait appel un SELECTt dans une procdure itrative de rduction de la chane : 1 ajouter 2 colonnes ( Long Smallint, Droite Char(aussi large que loriginale) ) 2 mettre jour ces colonnes update <table> set droite = <col_texte> update <table> set long = len(droite) 3 4 select * from <table> where instr(1, droite, )> 0 into SEL update SEL set droite=right$( droite, long - instr(1, droite, )) update SEL set long = len(droite) select * from SEL where instr(1, droite, )> 0 into SEL Rpter 4 en bloc jusqu ce quil ny ait plus dobjets dans sel. Utiliser naturellement la fentre MapBasic pour au moins 4 -.

28

6 Groupement des rsultats par colonnes.


Supposons que vous ayez une table sur les commandes clients. Chaque ligne de la table reprsente une commande. Une colonne de la table contient le nom du vendeur (VENDEUR) ayant ralis la commande, une autre contient le nom du client (CLIENT) tandis quune troisime contient le montant de la commande (AMOUNT).

Pour chaque vendeur, supposons que vous vouliez savoir : le nombre de commande prises, le montant moyen de ses commandes, la valeur totale des commandes prises Syntaxe : SELECT <liste_expressions> FROM <Table> [ WHERE <groupe_conditions> ] GROUP BY <liste_colonnes> Select Vendeur, count(*), Avg(AMOUNT), Sum(AMOUNT) from Commandes Group By Vendeur

Exemple 1 :

Remarquez le champ Grouper par colonnes et les trois oprateurs dagrgation dans la zone Colonnes. MapInfo procde comme suit : 1. Il recherche toutes les lignes concernant un vendeur donn. 2. Il compte le nombre de lignes : Count(*) 3. Il calcule la valeur totale des commandes du vendeur : Sum(AMOUNT). 4. Il calcule la valeur moyenne des commandes du vendeur : Avg(AMOUNT) MapInfo fait de mme pour chaque vendeur. Il en rsulte une table nayant quune ligne pour chaque vendeur. Les oprateurs dagrgation (Count, Avg et Sum) calculent le sous-total des valeurs de toutes les lignes ayant une mme valeur par Vendeur.

Exemple 2 :

Select Client, Count(*), Avg(AMOUNT), Sum(AMOUNT) from Commandes Group by Client

Il sagit peu prs de la mme requte que prcdemment, sauf que nous souhaitons maintenant effectuer un regroupement par client et non plus par vendeur. La slection SQL effectuera les mmes calculs que ci-dessus pour chaque client.

Exemple 3 :

Select Vendeur, Client, count(*), average(AMOUNT), sum(AMOUNT) from Commandes group by Vendeur, Client

Deux noms de colonnes ont t indiqus dans la zone Colonnes. Dans ce cas, MapInfo groupera les lignes dabord par vendeur puis par client. La table de rsultat de cette requte contiendra une ligne pour chaque combinaison client/vendeur. Si un client a pass des commandes par lintermdiaire de plusieurs vendeurs, une ligne rsumera les commandes passes avec chaque vendeur. Les lignes seront dabord groupes par vendeur, puis pour chacun deux, par client.

29

7 Triage des rsultats par ordre croissant ou dcroissant


Par dfaut, MapInfo trie une table par ordre croissant. Si vous effectuez le tri par ordre alphabtique, cela signifie que les A apparatront avant les B, etc. ... Si vous triez par valeurs numriques, lordre croissant signifie que les petits nombres apparatront avant les grands nombres. Si vous voulez trier par ordre dcroissant, cela signifie que les grands nombres apparaissent avant les petits, il vous faut placer le mot DECR la suite du nom de la colonne dans liste_colonnes du Group by . Syntaxe : SELECT <liste_expressions> FROM <Table> WHERE <groupe_conditions> GROUP BY <liste_colonnes> ORDER BY <liste_colonnes> [DESC ] Select * from World order by Population desc

Exemple 1 :

entrane le tri de la table partir de la colonne Population, en ordre dcroissant.

Exemple 2 :

Select * from forage order by INAT , BSS Ddesc

Retourne une table o les enregistrements sont tris par numro INAT croissant et par BSS dcroissant. Lorsque MapInfo effectue un tri sur plusieurs niveaux, chaque niveau du tri dispose de ses propres paramtres croissant/dcroissant.

8 Exemples hors catgories


8 1 Assignation de la plus grande frquence
Une table de rgions (Polys), une de points (Points) contenant en particulier une colonne (Name) de noms (plusieurs points peuvent avoir le mme nom). On veut assigner une nouvelle colonne de Polys le nom le plus frquent dans chaque rgion. On procde dabord une double slection : SELECT Polys.ID, Points.Name, Count(*) "Cnt" INTO CountTab FROM Polys, Points WHERE Polys.Obj Contains Points.Obj GROUP BY Polys.ID, Points.Name Produit une table temporaire CountTab ayant les colonnes ID, Name, Cnt et une range pour chaque combinaison existante de ID de Polys et Name de Points SELECT ID, Name "Dominant", Max(Cnt) "DomCount" INTO DomTab FROM CountTab GROUP BY ID

30

Produit une table temporaire DomCount ayant les colonnes ID, Dominant, DomCount et une range pour chaque ID La mise jour de la table Polys doit se faire par lintermdiaire de Update (On suppose que la colonne PolyName qui recevra le nom dominant existe dj) UPDATE Polys SET Polys.PolyName = DomTab.Dominant WHERE Polys.ID = DomTab.ID

31