alasql データベース覚書

JavaScript で SQL が使えるデータベースを調べたら alasql.js を見つけたので試してみました。
ブラウザのメモリ上で、テーブル作成、データの追加・更新・削除・検索が SQL で実行できます。

# alasql.js 概要

[alasql.js 公式サイト](http://alasql.org/)

[AlaSQL - JavaScript SQL database console](http://alasql.org/console/?CREATE%20TABLE%20cities%20(city%20string,%20population%20number);INSERT%20INTO%20cities%20VALUES%20(%27Rome%27,2863223),%20(%27Paris%27,2249975),(%27Berlin%27,3517424),%20(%27Madrid%27,3041579);SELECT%20*%20FROM%20cities%20WHERE%20population%20%3C%203500000%20ORDER%20BY%20population%20DESC)　：AlaSQL をコマンド入力で試せます。

公式サイトによれば、
「ブラウザとNode.jsで動作するように設計された軽量のクライアント側インメモリSQLデータベース」

AlaSQL - 'à la SQL' - is a lightweight client-side in-memory SQL database designed to work in browser and Node.js.

- AlaSQLは純粋なJavaScriptで書かれており、ブラウザのWebSQLデータベースは使用していません。
- AlaSQLは、JOIN、GROUP、UNION、ANY、ALL、IN、サブクエリ、および非常に限られたトランザクションサポートを備えた、完全に機能するコンパクトなSQL Serverです。
- AlaSQLは、ROLLUP（）、CUBE（）およびGROUPING SETS（）関数をサポートしています
- AlaSQLは現代版のブラウザ（Chrome、Firefox、IE、Safari）、Node.js、モバイルiOS、Androidで動作します。
- AlaSQLはいくつかの最適化手法を使用しているため高速です。


# ドキュメント

[The AlaSQL Wiki](https://github.com/agershun/alasql/wiki)



# テスト環境

html, alsql.min.js 、テスト用JavaScript、ブラウザ（Chrome）があればOK
実行結果は、とりあえずコンソール出力。

```test.html
<html>
<head>
<script src="alasql.min.js"></script>  
<script src="test1.js"></script>  
</head>
<body>
test2
</body>
</html>
```

# テーブル作成 & SELECT

はじめに、テーブルを作成して、SELECT してみます。
alasql関数に、SELECT 文をパラメータで渡すようです。

```test1.js
// テーブル作成 & SELECT
alasql("CREATE TABLE test (language INT, hello STRING)");
alasql("INSERT INTO test VALUES (1,'Hello!')");
alasql("INSERT INTO test VALUES (2,'Aloha!')");
alasql("INSERT INTO test VALUES (3,'Bonjour!')");
var rs1 = alasql("SELECT * FROM test WHERE language > 1");
console.log('t1', JSON.stringify(rs1));
```

結果は、json 形式で返ってきます。

```console.log
t1 [{"language":2,"hello":"Aloha!"},{"language":3,"hello":"Bonjour!"}] 
```

# 配列を SELECT

同じ構造を持つ配列で実行してみます。
配列もパラメータで指定します。

```test2.js
// 配列を SELECT
var data = [ 
	{ language: 1, hello: 'Hello!' },
	{ language: 2, hello: 'Aloha!' },
	{ language: 3, hello: 'Bonjour!' },
]
var rs2 = alasql("SELECT * FROM ? WHERE language > 1", [data]);
console.log('t2', JSON.stringify(rs2));
```

結果は、テーブルの場合と同じです。

```console.log
t2 [{"language":2,"hello":"Aloha!"},{"language":3,"hello":"Bonjour!"}]
```

# Fluent Interface　サポート機能

LINQ のように、書けるとあるが指定方法がよくわからない。
Where を例のように書いて実行してもうまくフィルターが効かない。


```
var res = alasql(data)
              .Where(function(x){x.Population>1000000})
              .OrderBy("Name")
              .exec();
```

Select()
From()
GroupBy()
Having()
OrderBy()
Top()

# Literals

データベース、テーブルなどオブジェクトに使用できる文字は、下記のとおり。

- A-Z
- a-z
- _ (underscore)
- 0-9 (except first character)

# コメント

コメントは、通常の SQL と同じ

- 複数行のコメントは、 /* and */
- １行のコメントは、 「--」で始める 

```
/*
   My
   multi-line 
   comments
*/

SELECT * FROM one; -- and this is comments also
-- and this 
-- and this
```

# [Data Types](https://github.com/agershun/alasql/wiki/Data%20types)

Integer, Decimal, Float, Char などブラウザ上で扱うデータなら問題なさそう。


# [SELECT](https://github.com/agershun/alasql/wiki/Select)

何だか普通に SELECT の指定が使えそうです。

WITH
SELECT columns
REMOVE COLUMNS columns / LIKE pattern
TOP / LIMIT FETCH
DISTINCT
INTO
FROM
JOIN ON / USING
APPLY
LET
GROUP BY
HAVING
WHERE
ORDER BY
UNION / UNION ALL /INTERSECT / EXCEPT / CORRESPONDING

# [SEARCH](https://github.com/agershun/alasql/wiki/Search)

JSON を検索するのに使えそうです。

# [トランザクション処理](https://github.com/agershun/alasql/wiki/Transaction)

TRANSACTION, COMMIT, ROLLBACK

なんと、トランザクションもサポートしています。

# プログラム

alasql 内で実行できるストアドプロシージャーのようなものもあります。
ブラウザ上でここまで、やるのかな？

DECLARE
SET
IF THEN, IF THEN ELSE
BEGIN END
WHILE
SOURCE


# 次にやること

ある程度のデータ件数で実際にどの程度つかえるのかを試してみたいと思います。

# あとがき

ブラウザ上で使うには、十分すぎる機能を持っていると思います。
SQL の構文も特殊なものではなく、普通に書けます。