sql.html 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <!-- meta page description: SQL support in GRASS GIS -->
  2. GRASS can use various RDBMS
  3. (<a href="http://en.wikipedia.org/wiki/Relational_database_management_system">Relational
  4. database management system</a>) and embedded databases. SQL
  5. (<a href="http://en.wikipedia.org/wiki/Sql">Structured Query
  6. Language</a>) queries are directly passed to the underlying database
  7. system. The set of supported SQL commands depends on the RDMBS and
  8. database driver selected.
  9. <h2>Database drivers</h2>
  10. The list of available database drivers can vary in various binary
  11. distributions of GRASS:<br><br>
  12. <table class="border">
  13. <tr><td><a href="grass-dbf.html">dbf</a></td><td>DBF files. Data are stored in DBF files.</td>
  14. <td><a href="http://shapelib.maptools.org/dbf_api.html">http://shapelib.maptools.org/dbf_api.html</a></td></tr>
  15. <tr><td><a href="grass-sqlite.html">sqlite</a></td><td>SQLite embedded database (GRASS 7 default DB backend).</td>
  16. <td><a href="http://sqlite.org/">http://sqlite.org/</a></td></tr>
  17. <tr><td><a href="grass-pg.html">pg</a></td><td>PostgreSQL RDBMS.</td>
  18. <td><a href="http://postgresql.org/">http://postgresql.org/</a></td></tr>
  19. <tr><td><a href="grass-mysql.html">mysql</a></td><td>MySQL RDBMS.</td>
  20. <td><a href="http://mysql.org/">http://mysql.org/</a></td></tr>
  21. <tr><td><a href="grass-mesql.html">mesql</a></td><td>MySQL embedded database.</td>
  22. <td><a href="http://mysql.org/">http://mysql.org/</a></td></tr>
  23. <tr><td><a href="grass-odbc.html">odbc</a></td><td>UnixODBC. (PostgreSQL, Oracle, etc.)</td>
  24. <td><a href="http://www.unixodbc.org/">http://www.unixodbc.org/</a></td></tr>
  25. </table>
  26. <h2>NOTES</h2>
  27. <ul>
  28. <li> SQL does not support '.' (dots) in table names.
  29. <li> Supported table name characters are only: <br>
  30. <div class="code"><pre>[A-Za-z][A-Za-z0-9_]*</pre></div>
  31. <li> A table name must start with a character, not a number.
  32. <li> Text-string matching requires the text part to be 'single quoted'.
  33. When run from the command line multiple queries should be contained
  34. in "double quotes". e.g.<br>
  35. <div class="code"><pre>
  36. d.vect map where="individual='juvenile' and area='beach'"
  37. </pre></div>
  38. <li> An error message such as &quot;<tt>dbmi: Protocol
  39. error</tt>&quot; either indicates an invalid column name or an
  40. unsupported column type (then the GRASS SQL parser needs to be
  41. extended).
  42. <li> DBF column names are limited to 10 characters (DBF API definition)
  43. </ul>
  44. <h2>EXAMPLES</h2>
  45. Display all vector points except for <i>LAMAR</i> valley
  46. and <i>extensive trapping</i> (brackets are superfluous in this
  47. example):
  48. <div class="code"><pre>
  49. d.vect trapping_sites_points fcol=black icon=basic/diamond col=white size=13 \
  50. where="valley &lt;&gt; 'LAMAR' OR (valley = 'LAMAR' AND description = 'extensive trapping')"
  51. </pre></div>
  52. <p>
  53. Select all attributes from table where <i>str1</i> column values are not 'No
  54. Name':
  55. <div class="code"><pre>
  56. echo "SELECT * FROM archsites WHERE str1 &lt;&gt; 'No Name'" | db.select
  57. </pre></div>
  58. <p>
  59. <p>Example of subquery expressions from a list (does not work
  60. for DBF driver):
  61. <div class="code"><pre>
  62. v.db.select mysites where="id IN ('P04', 'P05')"
  63. </pre></div>
  64. <p>Example of pattern matching:
  65. <div class="code"><pre>
  66. # field contains string:
  67. # for DBF driver:
  68. v.extract rivers out=rivers_noce where="DES LIKE 'NOCE'"
  69. # for SQLite driver:
  70. v.extract rivers out=rivers_noce where="DES LIKE '%NOCE%'"
  71. # match exactly number of characters (here: 2), does not work for DBF driver:
  72. v.db.select mysites where="id LIKE 'P__'"
  73. #define wildcard:
  74. v.db.select mysites where="id LIKE 'P%'"
  75. </pre></div>
  76. <p>Example of null handling:
  77. <div class="code"><pre>
  78. v.db.addcolumn map=roads col="nulltest int"
  79. v.db.update map=roads col=nulltest value=1 where="cat &gt; 2"
  80. d.vect roads where="nulltest is null"
  81. v.db.update map=roads col=nulltest value=2 where="cat &lt;= 2"
  82. </pre></div>
  83. <p>Examples of complex expressions in updates (using <tt>v.db.*</tt>
  84. modules):
  85. <div class="code"><pre>
  86. v.db.addcolumn map=roads col="exprtest double precision"
  87. v.db.update map=roads col=exprtest value=cat/nulltest
  88. v.db.update map=roads col=exprtest value=cat/nulltest+cat where=cat=1
  89. </pre></div>
  90. <p>Examples of complex expressions in updates (using <tt>db.*</tt>
  91. modules):
  92. <div class="code"><pre>
  93. echo "UPDATE roads SET exprtest=null"
  94. echo "UPDATE roads SET exprtest=cat/2" | db.execute
  95. echo "UPDATE roads SET exprtest=cat/2+cat/3" | db.execute
  96. echo "UPDATE roads SET exprtest=NULL WHERE cat&gt;2" | db.execute
  97. echo "UPDATE roads SET exprtest=cat/3*(cat+1) WHERE exprtest IS NULL" | db.execute"
  98. </pre></div>
  99. <p>
  100. Instead of creating and updating new columns with an expression, you
  101. can use the expression directly in a command:
  102. <div class="code"><pre>
  103. d.vect roads where="(cat/3*(cat+1))&gt;8"
  104. d.vect roads where="cat&gt;exprtest"
  105. </pre></div>
  106. <p>Example of changing a SQL type (type casting, does not work
  107. for DBF driver):
  108. <div class="code"><pre>
  109. # North Carolina data set: convert string column to double precision
  110. # copy map into current mapset
  111. g.copy vect=geodetic_pts,mygeodetic_pts
  112. v.db.addcolumn mygeodetic_pts col="zval double precision"
  113. # the 'z_value' col contains 'N/A' strings, not to be converted
  114. v.db.update mygeodetic_pts col=zval \
  115. qcol="CAST(z_value AS double precision)" \
  116. where="z_value &lt;&gt; 'N/A'"
  117. </pre></div>
  118. <p>Example of concatenating fields (does not work for DBF
  119. driver):
  120. <div class="code"><pre>
  121. v.db.update vectormap column=column3 qcolumn="column1 || column2"
  122. </pre></div>
  123. <h2>SEE ALSO</h2>
  124. <em>
  125. <a href="db.select.html">db.select</a>,
  126. <a href="db.execute.html">db.execute</a>,
  127. <a href="v.db.select.html">v.db.select</a>,
  128. <a href="v.db.update.html">v.db.update</a>
  129. </em>
  130. <p>
  131. <a href="databaseintro.html">Database management in GRASS GIS</a>,
  132. <a href="database.html">Help pages for database modules</a>
  133. <p>
  134. <i>Last changed: $Date$</i>