Image
Top
Navigation

チュートリアル14 : SQLを使う

チュートリアル13 : クラスを作成するからの続きです。。

———- コンソールを利用する場合 ———-

今回はGUIツール(Orient Studio)の実行例をつけると、冗長なのですべてコンソールでやっています。でもOrient Studioで同じことが出来ますので試してみてください。

SQLが使える

ほとんどのNoSQLは、独自のクエリー言語を使用しています。しかし、OrientDBは一般的なSQLと、グラフ等をサポートするために拡張されたSQLを採用しています。
ですから普段リレーションナルデータベースに慣れている開発者が戸惑うことは少ないと思います。

OrientDBで利用できるSQLを試してみるためにクラス(=テーブル)を作成してデータを登録してみましょう。

Order(注文)テーブル

プロパティ 説明
id 注文ID Integer
order_date 注文日 Datetime
name 購入者名 String
vip VIPフラグ Boolean
area 都道府県 String
item 商品 String
price 単価 Integer
qty 数量 Integer

クラス定義(スキーマレス対応なので、プロパティ定義はしなくてもかまいません):

create class Order
create property Order.id         Integer 
create property Order.order_date Datetime
create property Order.name       String  
create property Order.vip        Boolean 
create property Order.area       String  
create property Order.item       String  
create property Order.price      Integer 
create property Order.qty        Integer 

その結果(info class order):


Class................: Order
Default cluster......: order (id=11)
Supported cluster ids: [11]
Cluster selection....: round-robin

PROPERTIES
-------------------------------+-------------+-------------------------------+-----------+----------+----------+-----------+-----------+----------+
 NAME                          | TYPE        | LINKED TYPE/CLASS             | MANDATORY | READONLY | NOT NULL |    MIN    |    MAX    | COLLATE  |
-------------------------------+-------------+-------------------------------+-----------+----------+----------+-----------+-----------+----------+
 id                            | INTEGER     | null                          | false     | false    | false    |           |           | default  |
 vip                           | BOOLEAN     | null                          | false     | false    | false    |           |           | default  |
 price                         | INTEGER     | null                          | false     | false    | false    |           |           | default  |
 area                          | STRING      | null                          | false     | false    | false    |           |           | default  |
 item                          | STRING      | null                          | false     | false    | false    |           |           | default  |
 name                          | STRING      | null                          | false     | false    | false    |           |           | default  |
 qty                           | INTEGER     | null                          | false     | false    | false    |           |           | default  |
 order_date                    | DATETIME    | null                          | false     | false    | false    |           |           | default  |
-------------------------------+-------------+-------------------------------+-----------+----------+----------+-----------+-----------+----------+

データ投入:


    insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 1, '2014-07-01', '斎藤' , false , 'CHIB' , 'A-ITEM', 100, 1)
    insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 2, '2014-08-01', '鈴木' , true  , 'TOKYO', 'B-ITEM',  50, 2)
    insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 3, '2014-08-01', '山田' , false , 'TOKYO', 'C-ITEM',  80, 3)
    insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 4, '2014-09-01', '鈴木' , true  , 'TOKYO', 'A-ITEM', 100, 4)
    insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 5, '2014-09-01', '鈴木' , true  , 'TOKYO', 'D-ITEM',  80, 2)
    insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 6, '2014-09-01', '武田' , fales , 'TOKYO', 'A-ITEM', 100, 1)

その結果(browse class orderコマンド、または、select * from order):


----+-----+----+-------------------+----+-----+-----+------+-----+----
#   |@RID |id  |order_date         |name|vip  |area |item  |price|qty
----+-----+----+-------------------+----+-----+-----+------+-----+----
0   |#11:0|1   |2014-07-01 00:00:00|斎藤|false|CHIB |A-ITEM|100  |1
1   |#11:1|2   |2014-08-01 00:00:00|鈴木|true |TOKYO|B-ITEM|50   |2
2   |#11:2|3   |2014-08-01 00:00:00|山田|false|TOKYO|C-ITEM|80   |3
3   |#11:3|4   |2014-09-01 00:00:00|鈴木|true |TOKYO|A-ITEM|100  |4
4   |#11:4|5   |2014-09-01 00:00:00|鈴木|true |TOKYO|D-ITEM|80   |2
5   |#11:5|6   |2014-09-01 00:00:00|武田|null |TOKYO|A-ITEM|100  |1
----+-----+----+-------------------+----+-----+-----+------+-----+----

さて、これからOrientDBで利用できるのSQLを実行してみましょう。詳しくは、selectの構文を参照して下さい。

SELECTの書き方

詳しくはselectの構文を参照して下さい。


select from order

----+-----+----+-------------------+----+-----+-----+------+-----+----
#   |@RID |id  |order_date         |name|vip  |area |item  |price|qty
----+-----+----+-------------------+----+-----+-----+------+-----+----
0   |#11:0|1   |2014-07-01 00:00:00|斎藤|false|CHIB |A-ITEM|100  |1
1   |#11:1|2   |2014-08-01 00:00:00|鈴木|true |TOKYO|B-ITEM|50   |2
2   |#11:2|3   |2014-08-01 00:00:00|山田|false|TOKYO|C-ITEM|80   |3
3   |#11:3|4   |2014-09-01 00:00:00|鈴木|true |TOKYO|A-ITEM|100  |4
4   |#11:4|5   |2014-09-01 00:00:00|鈴木|true |TOKYO|D-ITEM|80   |2
5   |#11:5|6   |2014-09-01 00:00:00|武田|null |TOKYO|A-ITEM|100  |1
----+-----+----+-------------------+----+-----+-----+------+-----+----
6 item(s) found. Query executed in 0.002 sec(s).    

なお、通常のSQLでは、Projections(射影)としてアスタリスク’*’を指定しますが、OrientDBではどちらでも構いません。
selectの構文では、結果が異なると書かれていますが、記載が間違っています。

ここで、#の下に表示されているのは表示上の連番、@RIDはレコードを一意に識別するレコードIDです。

WHERE条件

OrientDBではWHERE条件を指定することができます。


select from order where id=2    

----+-----+----+-------------------+----+----+-----+------+-----+----    
#   |@RID |id  |order_date         |name|vip |area |item  |price|qty    
----+-----+----+-------------------+----+----+-----+------+-----+----    
0   |#11:1|2   |2014-08-01 00:00:00|鈴木|true|TOKYO|B-ITEM|50   |2    
----+-----+----+-------------------+----+----+-----+------+-----+----    
1 item(s) found. Query executed in 0.004 sec(s).    

select from order where name like '鈴%'

----+-----+----+----+-------------------+----+-----+------+-----+----    
#   |@RID |name|id  |order_date         |vip |area |item  |price|qty    
----+-----+----+----+-------------------+----+-----+------+-----+----    
0   |#11:1|鈴木|2   |2014-08-01 00:00:00|true|TOKYO|B-ITEM|50   |2    
1   |#11:3|鈴木|4   |2014-09-01 00:00:00|true|TOKYO|A-ITEM|100  |4    
2   |#11:4|鈴木|5   |2014-09-01 00:00:00|true|TOKYO|D-ITEM|80   |2    
----+-----+----+----+-------------------+----+-----+------+-----+----    
3 item(s) found. Query executed in 0.003 sec(s).    

inは[]で括ります。


select from order where area in ['TOKYO','SAITAMA'];    

----+-----+-----+----+-------------------+----+-----+------+-----+----    
#   |@RID |area |id  |order_date         |name|vip  |item  |price|qty    
----+-----+-----+----+-------------------+----+-----+------+-----+----    
0   |#11:1|TOKYO|2   |2014-08-01 00:00:00|鈴木|true |B-ITEM|50   |2    
1   |#11:2|TOKYO|3   |2014-08-01 00:00:00|山田|false|C-ITEM|80   |3    
2   |#11:3|TOKYO|4   |2014-09-01 00:00:00|鈴木|true |A-ITEM|100  |4    
3   |#11:4|TOKYO|5   |2014-09-01 00:00:00|鈴木|true |D-ITEM|80   |2    
4   |#11:5|TOKYO|6   |2014-09-01 00:00:00|武田|null |A-ITEM|100  |1    
----+-----+-----+----+-------------------+----+-----+------+-----+----    
5 item(s) found. Query executed in 0.003 sec(s).    

select from order where eval('price * qty') > 300 and order_date>='2014-08-01'    

----+-----+-------------------+-----+----+----+----+----+-----+------    
#   |@RID |order_date         |price|qty |id  |name|vip |area |item    
----+-----+-------------------+-----+----+----+----+----+-----+------    
0   |#11:3|2014-09-01 00:00:00|100  |4   |4   |鈴木|true|TOKYO|A-ITEM    
----+-----+-------------------+-----+----+----+----+----+-----+------    
1 item(s) found. Query executed in 0.005 sec(s).    

ここまでに気がついたこと:
– WHERE条件中の左辺に計算式を書く時に、複数条件で、()で括らないと結果がおかしい時がある。例えば
where price * qty > 300 and order_date>=’2014-08-01’とかくと間違った結果となる

where ( price * qty ) > 300 and order_date>='2014-08-01'
や
where ( price * qty > 300 ) and order_date>='2014-08-01'
は正しい結果となる

select from order where eval('price * qty') > 300 and order_date>='2014-08-01'
という書き方もできる
  • コンソールで、使用する限り、Projections(射影)を指定せずに、WHERE条件を指定すると。条件指定した項目が左の方に、優先的に表示される
    (便利なのか微妙)。ただし、Projections(射影)すれば、その順番で表示される。

ORDER BY句が使えます


select id, order_date, name, vip, area, item, price, qty from order where vip=true order by order_date desc, id asc    

----+-----+----+-------------------+----+----+-----+------+-----+----    
#   |@RID |id  |order_date         |name|vip |area |item  |price|qty    
----+-----+----+-------------------+----+----+-----+------+-----+----    
0   |#-2:2|4   |2014-09-01 00:00:00|鈴木|true|TOKYO|A-ITEM|100  |4    
1   |#-2:3|5   |2014-09-01 00:00:00|鈴木|true|TOKYO|D-ITEM|80   |2    
2   |#-2:1|2   |2014-08-01 00:00:00|鈴木|true|TOKYO|B-ITEM|50   |2    
----+-----+----+-------------------+----+----+-----+------+-----+----    
3 item(s) found. Query executed in 0.004 sec(s).    

GROUP BY句が使えます


select vip,sum(eval('price * qty')) from order group by vip    

----+-----+-----+----    
#   |@RID |vip  |sum    
----+-----+-----+----    
0   |#-2:1|false|340    
1   |#-2:2|true |660    
----+-----+-----+----    
2 item(s) found. Query executed in 0.004 sec(s).    

式を書く場合は、eval(‘式’)を使います

limit句やskip句が使えます


select from order limit 2    

----+-----+----+-------------------+----+-----+-----+------+-----+----    
#   |@RID |id  |order_date         |name|vip  |area |item  |price|qty    
----+-----+----+-------------------+----+-----+-----+------+-----+----    
0   |#11:0|1   |2014-07-01 00:00:00|斎藤|false|CHIB |A-ITEM|100  |1    
1   |#11:1|2   |2014-08-01 00:00:00|鈴木|true |TOKYO|B-ITEM|50   |2    
----+-----+----+-------------------+----+-----+-----+------+-----+----    
2 item(s) found. Query executed in 0.001 sec(s).    

select from order limit 2 skip 2    

----+-----+----+-------------------+----+-----+-----+------+-----+----    
#   |@RID |id  |order_date         |name|vip  |area |item  |price|qty    
----+-----+----+-------------------+----+-----+-----+------+-----+----    
0   |#11:2|3   |2014-08-01 00:00:00|山田|false|TOKYO|C-ITEM|80   |3    
1   |#11:3|4   |2014-09-01 00:00:00|鈴木|true |TOKYO|A-ITEM|100  |4    
----+-----+----+-------------------+----+-----+-----+------+-----+----    
2 item(s) found. Query executed in 0.002 sec(s).    

ページング処理に使えますね。

レコードIDを指定したクエリー


select from [#11:1, #11:3, #11:5]    

----+-----+----+-------------------+----+----+-----+------+-----+----    
#   |@RID |id  |order_date         |name|vip |area |item  |price|qty    
----+-----+----+-------------------+----+----+-----+------+-----+----    
0   |#11:1|2   |2014-08-01 00:00:00|鈴木|true|TOKYO|B-ITEM|50   |2    
1   |#11:3|4   |2014-09-01 00:00:00|鈴木|true|TOKYO|A-ITEM|100  |4    
2   |#11:5|6   |2014-09-01 00:00:00|武田|null|TOKYO|A-ITEM|100  |1    
----+-----+----+-------------------+----+----+-----+------+-----+----    
3 item(s) found. Query executed in 0.002 sec(s).    

INSERTの書き方

詳しくはINSERTの構文を参照して下さい。

ANSI-92準拠です:

Insertは3種類の形式で書くことが出来ます。

insert into Order (id, order_date, name, vip, area, item, price, qty) values ( 1, '2014-07-01', '斎藤' , false , 'CHIB' , 'A-ITEM', 100, 1)

insert into Order id = 7, order_date = '2014-11-01', name = '丸山' , vip = fales, area = 'SAITAMA', item = '=F-ITEM', price = 300 , qty = 1

JSONをサポートしています。

insert into Order { id : 7, order_date : '2014-11-01', name : '丸山' , vip : fales, area : 'SAITAMA', item : '=F-ITEM', price : 300 , qty : 1 }

UPDATEの書き方

詳しくはUPDATEの構文を参照して下さい。

ANSI-92準拠です:

update Order set order_date = '2014-12-01' where id = 6

DELETEの書き方

詳しくはDELETEの構文を参照して下さい。

ANSI-92準拠です:

delete from Order where order_date = '2014-12-01'

チュートリアル15 : グラフデータベースで遊ぶに続きます。