生SQLを使ったデータの選択
生SQLコマンドSELECTは,データベースのデータを選択して返すときに使う.これは,「データの選択」に記載のように,Wolfram言語コマンドSQLSelectを使ってもできる.
このチュートリアルの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
DatabaseLink をロードし,publisherデータベースに接続する.
Needs["DatabaseLink`"];
conn = OpenSQLConnection["publisher"];表ROYSCHEDの中から,列ROYALTYの要素が0.11から0.12までであるデータを取り出す.
SQLExecute[conn, "SELECT * FROM ROYSCHED WHERE ROYALTY >= .11 AND ROYALTY <= .12"]次も同じSELECT文を実行する例であるが,今度は準備文を使う.文の引数はSQLExecuteコマンドの第3引数として与える.第1引数は`1`の場所に,第2引数は`2`の場所に置かれる.
SQLExecute[conn, "SELECT * FROM ROYSCHED WHERE ROYALTY >= `1` AND ROYALTY <= `2`", {0.11, 0.12}]列と表の名前はそれぞれSQLColumn,SQLTableで囲まなければならない.これにより,列と表の名前が文字列でないことをはっきりさせる.次の例では,表ROYSCHEDの中で列TITLE_IDの値がBS1011である列ROYALTYの要素を選択する.
SQLExecute[conn, "SELECT `1` FROM ROYSCHED WHERE TITLE_ID = `2`", {SQLColumn["ROYALTY"], "BS1011"}]準備文に引数の列を与えたい場合は,SQLArgumentを使う.これについては「SQLExecute:SQLスタイルのクエリにおける引数の列」で述べる.
SQLExecute[conn, "SELECT `1` FROM ROYSCHED WHERE TITLE_ID = `2`", {SQLArgument[SQLColumn["LORANGE"], SQLColumn["HIRANGE"], SQLColumn["ROYALTY"]], "BS1011"}]多くのデータベースには,SELECT操作の結果に適用できる関数がある.一般的なものにCOUNT,MIN,MAX,SUM,AVGがある.データベースに付属のドキュメントに,使用可能な関数についての詳細が記載されている.このうちのいくつかについて以下に例示する.
SQLExecute[conn, "SELECT COUNT(ROYALTY) FROM ROYSCHED"]SQLExecute[conn, "SELECT MIN(ROYALTY) FROM ROYSCHED"]多くのデータベースでは,結果に+,-,*,/等の数学関数が適用できる.
SQLExecute[conn, "SELECT ROYALTY * 2 FROM ROYSCHED"]SQLExecute[conn, "SELECT ROYALTY / 10 FROM ROYSCHED"]SQLExecute[conn, "SELECT - ROYALTY FROM ROYSCHED"]SQLExecute[conn, "SELECT DISTINCT ROYALTY FROM ROYSCHED"]SQLExecute[conn, "SELECT TITLE_ID,
MIN(ROYALTY) FROM ROYSCHED GROUP BY TITLE_ID", "ShowColumnHeadings" -> True]//TableForm多くのデータベースは,任意範囲の結果の取出しもサポートしている.
SQLExecute[conn, "SELECT TOP 5 * FROM ROYSCHED"]SQLExecute[conn, "SELECT LIMIT 5 10 * FROM ROYSCHED"]INNER JOINとOUTER JOINを使ったより複雑なSELECT文をFROM節で使って,2つの表のレコードを結合することができる.
SQLExecute[conn, "SELECT DISTINCT TITLES.TITLE FROM TITLES INNER JOIN ROYSCHED ON TITLES.TITLE_ID=ROYSCHED.TITLE_ID WHERE TITLES.PUB_ID='0877' AND ROYSCHED.ROYALTY > .1"]SQLExecute[conn, "SELECT T.TITLE, T.TITLE_ID, MIN(R.ROYALTY) ROYALTY FROM ROYSCHED R, TITLES T LEFT OUTER JOIN ROYSCHED ON T.TITLE_ID = R.TITLE_ID GROUP BY T.TITLE, T.TITLE_ID ORDER BY ROYALTY, T.TITLE DESC", "ShowColumnHeadings" -> True]//TableFormCloseSQLConnection[conn];