pdsqlマニュアル
このマニュアルはPDSQL内のSQL文の記述方法を説明したマニュアルです。
1.PDSQLとは
PDSQLではXML文章内でデーターベースのレコードの様な構造をもった部分をデーターベースのSQL文と同じ方法で処理出来ることを目的に作成しました。
また簡易データベースの置き換えとしてデータベースエンジンを持たなくても簡単なデータ処理が行えることを目的に作成しました。
PDSQL(MSXML3,4版)はPHPからMSXMLを使用しておりますので一通りPHPでMSXMLを使うに目を通してからご覧ください。
2.パスについて
PDSQLではXML文章を木構造(ノードツリー)にみたてて処理をします。
<?xml version="1.0" encoding="shift_jis" ?>
<電話帳>
<テーブル>
<field name="名前" type="text">
<field name="電話" type="text">
</テーブル>
<データ>
<record id="1">
<名前>田中</名前>
<電話>012345678</電話>
</record>
<record id="2">
<名前>佐藤</名前>
<電話>023456789</電話>
</record>
</データ>
</電話帳>
リスト1 denwa.xml
リスト1のようなxmlファイルをノードツリーに変換した場合各ノードは以下の様に記述します。
(unixのディレクトリ表記の様に記述します)
属性には@を名前の前につけて記述します。
絶対パス記述 |
電話帳 | 電話帳 |
テーブル | 電話帳/テーブル |
filed | 電話帳/テーブル/filed |
データ | 電話帳/データ |
record | 電話帳/データ/record |
名前 | 電話帳/データ/record/名前 |
電話 | 電話帳/データ/record/電話 |
属性(name) | 電話帳/テーブル/field/@name |
属性(type) | 電話帳/テーブル/field/@type |
属性(id) | 電話帳/データ/record/@id |
|
相対パス データノードから見た場合 |
record | record |
名前 | record/名前 |
電話 | record/電話 |
属性(id) | record/@id |
|
相対パス recordノードから見た場合 |
名前 | 名前 |
電話 | 電話 |
属性(id) | @id |
ネームスペースを持つ要素を指定する場合はパスのすべての部分でネームスペースを含めた要素名を記述してください。
例 ns1:電話帳/ns2:データ/ns3:record/ns4:名前
3.テーブルとターゲットノードついて
このPDSQLでは通常のデーターベースで使用するSQL文と一部仕様が異なります。これはXMLのノードツリーを自由に扱うためのものです。
通常のデーターベースではリスト1のdenwa.xml内の<データ>内の<record>を一つのレコードとして処理します。また、通常のデーターベースではテーブル名は電話帳となります。
そうしてselect文は
select * from 電話帳 where 名前='xxxxx'
などとなります。
PDSQLではレコードに相当するものをターゲットノードといい#で表します。テーブル名に相当するものはターゲットノードの親ノードの絶対パスになります。
上の場合では ターゲットノード#はrecord テーブルに相当するものは電話帳/データ となります。
PDSQLのSQL文ではテーブルを記述する部分にターゲットノードの絶対パスを記述します。たとえばselect文は
select * from 電話帳/データ/record where 名前='xxxxx'
となります。
4.SQL文
このPDSQLで使用できるSQL文はselect文、insert文、update文、delete文の4つのみです。
5.select文
select文は以下の様に記述します。
select * from テーブル {where ... order by ....}
where以下は省略可能です。
selectとfromの間には*を記述します(固定)。
各単語間には必ず半角スペースを挿入してください。
テーブルはターゲットノードのルートからの絶対パスで記述します。
例
$sql = "select * from 電話帳/データ/record";
この場合は電話帳の子ノード(データ)の全ての子ノード(record)を求めます。
6.where句
where句は以下の様に記述します。
where パス1 演算子 値1 論理演算子 パス2 演算子 値2 論理演算子2 .......
パス1、パス2などのパスはターゲットとなるノードからの相対パスを記述します。
パス、演算子、値、論理演算子の間には必ず半角スペースを挿入してください。
値は'(シングルクォーテーション)で囲ってください。
ターゲットノードの値は#valueで記述します。
例
$sql = "select * from 電話帳/データ/record where 名前='田中' ";
ターゲットノード#=record
7.演算子
where句で使用できる演算子は以下のものがあります。
like | 前方一致、後方一致 |
<= | 以下 |
>= | 以上 |
<> | 等しくない |
= | 等しい |
< | 小さい |
> | 大きい |
演算子の演算はphpの演算ルールに従います。
前方一致は like 'xxxx%'
後方一致は like '%xxxx'
の様に値となる文字列の前後に%をつけて記述します。
例
$sql = "select * from 電話帳/データ/record where 電話 > '012345676'";
$sql = "select * from 電話帳/データ/record where 名前 like '田%'";
ターゲットノード#=record
8.論理演算子
where句で使用できる論理演算子は以下のものがあります。
論理演算子の優先順位は全て同じなので式は全て左から右という順番に評価します。
優先順位を変えたい場合は括弧()を使用します。
括弧と論理演算子の間にも必ず半角スペースを挿入してください。
例
$sql = "select * from 電話帳/データ/record where 名前 like '田%' and ( 電話 > '012345676' or ! ( @id > 4) )";
ターゲットノード#=record
9.order句
order句はwhere句(がある場合は)の後に記述します。
order句は以下の様に記述します。
order by パス {desc}
パスはパスはターゲットノードからの相対パスを記述します。
パスは1つしか記述できません。
各単語間には必ず半角スペースを挿入してください。
descをつけると大きいものから順にソートします。
例
$sql = "select * from 電話帳/データ/record order by 電話 desc";
ターゲットノード#=record
10.insert文
insert文は以下の様に記述します。
insert into テーブル (パス1,パス2,パス3,...) values (値1,値2,値3,....)
各単語間には必ず半角スペースを挿入してください。
テーブルは挿入するノードのルートからの絶対パスで記述します。
パス1、パス2、パス3、....はテーブルで記述したノードからの相対パスを記述します。
値1、値2、値3、....はそれぞれパス1、パス2、パス3、....の子テキストノードの値を記述します。
値は'(シングルクォーテーション)で囲ってください。
例
$sql = "insert into 電話帳/データ/record (名前,電話,@id) values ('鈴木','0134234500','3')";
ターゲットノード#=record
この結果としてリスト1はリスト2の様になります。
<?xml version="1.0" encoding="shift_jis" ?>
<電話帳>
<テーブル>
<field name="名前" type="text">
<field name="電話" type="text">
</テーブル>
<データ>
<record id="1">
<名前>田中</名前>
<電話>012345678</電話>
</record>
<record id="2">
<名前>佐藤</名前>
<電話>023456789</電話>
</record>
<record id="3">
<名前>鈴木</名前>
<電話>0134234500</電話>
</record>
</データ>
</電話帳>
リスト2 insert実行結果
11.update文
update文は以下の様に記述します。
update テーブル set パス1=値1,パス2=値2,パス3=値3,... {where .....}
where句は省略可能です。
各単語間には必ず半角スペースを挿入してください。
テーブルは更新するターゲットノードのルートからの絶対パスで記述します。
パス1、パス2、パス3、....はターゲットノードからの相対パスを記述します。
値1、値2、値3、....はそれぞれパス1、パス2、パス3、....の子テキストノードの値を記述します。
値は'(シングルクォーテーション)で囲ってください。
例
$sql = "update 電話帳/データ/record set 名前='鈴木',電話='0134234500',@id='3' where @id='1'";
ターゲットノード#=record
この結果としてリスト1はリスト3の様になります。
<?xml version="1.0" encoding="shift_jis" ?>
<電話帳>
<テーブル>
<field name="名前" type="text">
<field name="電話" type="text">
</テーブル>
<データ>
<record id="3">
<名前>鈴木</名前>
<電話>0134234500</電話>
</record>
<record id="2">
<名前>佐藤</名前>
<電話>023456789</電話>
</record>
</データ>
</電話帳>
リスト3 update実行結果
12.delete文
delete文は以下の様に記述します。
delete from テーブル {where .....}
where句は省略可能です。
各単語間には必ず半角スペースを挿入してください。
テーブルは削除するターゲットノードのルートからの絶対パスで記述します。
例
$sql = "delete from 電話帳/データ/record where 名前='田中'";
ターゲットノード#=record
この結果としてリスト1はリスト4の様になります。
<?xml version="1.0" encoding="shift_jis" ?>
<電話帳>
<テーブル>
<field name="名前" type="text">
<field name="電話" type="text">
</テーブル>
<データ>
<record id="2">
<名前>佐藤</名前>
<電話>023456789</電話>
</record>
</データ>
</電話帳>
リスト4 delete実行結果