Firebird Docset → Firebird Database Docs → Firebird 1.5 クイック・スタート → データベース上での作業 |
Firebirdのインストールディレクトリ中のexamples に、employee.fdbというサンプル・データベースがあります。 このデータベースを使って「腕試し」をしてみて下さい。
サンプル・データベースを移動する場合には、サーバーマシンに物理的に接続されたハードディスク に配置されていることを確認して下さい。共有ディスクやネットワークドライブ、(Unixでは)SMB(samba) ファイルシステムでマウントされている場合動作しません。同じ事は、これからあなたが作成するデータベース についても言えます。
TCP/IP接続に関して、2つの要素があります: サーバー名とディスク/ファイルシステムのパス名です これらは以下のように記述して下さい:
Linux サーバー:
サーバー名:/ファイルシステムのパス名/データベースファイル名
Linux とその他の Posix サーバーでの例:サーバー名serverxyz:
serverxyz:/opt/interbase/examples/employee.fdb
Windows サーバー:
サーバー名:ドライブレター:\ファイルシステムのパス名\データベースファイル名
Windows での例:
serverxyz:C:\Program Files\Firebird\examples\employee.fdb
Firebirdのデータベースに接続するためには、ユーザー名と正しいパスワードの組み合わせによる ユーザー認証が必要となります。SYSDBA、 root(Posixシステム上)又はAdministrator (Windowsシステム上で、Firebirdがこのユーザー権限で動作している場合)以外のユーザーは、データベース内の 各オブジェクトに対するパーミッションも持っていないといけません。問題を簡単にするために、ここでは SYSDBAユーザーをパスワードmasterkeyで認証している ということにしましょう。
isqlにはデータベースへの接続方法がいくつかあります。一つは、 isqlをシェルで起動する方法です。まずFirebirdのインストール先ディレクトリ のbinサブディレクトリへ移動して、プロンプトからisql コマンドをタイプして下さい(Linuxでは、./isql) [↵は「 エンターキーを押下してください」]:
C:\Program Files\Firebird\Firebird_1_5\bin>isql↵ Use CONNECT or CREATE DATABASE to specify a database SQL>CONNECT "C:\Program Files\Firebird\Firebird_1_5\examples\employee.fdb"↵ CON>user 'SYSDBA' password 'masterkey';↵
isqlでは、全てのSQL文はセミコロンで区切ります。 Enterキーを押下しても、セミコロンがついていないと、isqlは文が 次の行に続いていると判断して、プロンプトをSQL>から CON>に変更して表示します。この機能によって、長い文を複数の行に またがって記述することが出来るようになっています。Enterを押下した 時に、もしセミコロンを忘れていたら、CON>プロンプトの直後に セミコロンを打って、再度Enterキーを押下して下さい。
もしLinux上でClassicサーバーを実行している場合、データベースのパスがホスト名で 開始されていない場合、高速なダイレクト・ローカル接続が試みられます。この接続法は、 ユーザーのLinuxへのログインアカウントにデータベース・ファイルへの十分なアクセス権限が ない場合失敗します。この場合、localhost: /<path>で接続して下さい。サーバー・プロセス がファイルをオープンします(Firebird 1.5 は通常firebird ユーザーとして実行されています)。逆に、ネットワーク・スタイルの接続では、 ユーザーがClassicサーバーのローカル・モードでデータベースを作成したり、サーバーにファイル への十分なアクセス権限がない場合には接続に失敗することになります。
もし、ClassicサーバーをWindows上で実行している場合、必ず ホスト名を指定しなくてはなりません(localhost も含まれます)。データベースへのフルパスにホスト名を付加しない場合、接続は失敗します。
一重引用符はFirebirdの「標準」区切り文字ですが、二重引用符 が上記の例で、データベースのパスを指定する所で使用されています。このように、 コマンドライン・ユーティリティの一部で空白を含むパスを指定する際に必要と なる場合があります。一重引用符も空白を含まないパスに対してはきちんと動作 します。
「SYSDBA」と「masterkey」の両側の引用符はオプション となります。空白を含まないデータベースのパスも引用符は必要ではありません。
この点は、isqlが接続した時点で表示します。
DATABASE "C:\Program Files\Firebird\Firebird_1_5\examples\employee.fdb", User: sysdba SQL>
employee.fdbを利用して遊んでもらってもいいでしょう。 isqlの由来はinteractive SQLから来てい ます。isqlを使って、データを検索したり、メタデータの情報を表示したり、データベー ス・オブジェクトを作成したり、データ定義言語を実行するなど、様々なことが出来ま す
コマンドプロントに戻るには、次のようにタイプして下さい
SQL>QUIT;↵
isqlに関しての詳細な情報は、Using FirebirdのChapter 10:Interactive SQL Utility (isql) をご覧下さい。
isqlを使用したデータベースの作成方法は一つだけ ではありません。ここでは、データベースをインタラクティブに作成する単純な方法を 見ていくこととします、実際のデータベース作成業務においてはこうした方法ではなく、 データ定義言語(DDL)を利用してデータベースの作成とメンテナンスを行うべきです。 Using Firebirdマニュアルの該当部分をご覧下さい。
isqlを利用してデータベースをインタラクティブに作成 するためには、Firebirdのインストールディレクトリ下の binサブディレクトリで、isql(Windows)又は ./isql(Linux)を実行して下さい。
C:\Program Files\Firebird\Firebird_1_5\bin>isql↵ Use CONNECT or CREATE DATABASE to specify a database
さて、新しいデータベースをインタラクティブに作成する準備が出来ました。 それでは、test.fdbという名前のデータベースを作成してみま しょう。作成場所はdataディレクトリを Dドライブに作成して、そこへ配置 することにします。
SQL>CREATE DATABASE 'D:\data\test.fdb' page_size 8192↵ CON>user 'SYSDBA' password 'masterkey';↵
CREATE DATABASE文中で、パス名・ユーザー名・ パスワードには引用符がありますが、これは必須です。 この点では、CONNECT文とは違いがあります。
もし、Linux上でClassicサーバーを実行している場合、データベースの パス名をホスト名から始めてはいけません。その場合、データベースファイルは あなたのLinuxログインユーザーをオーナーとして作成されることになります。 それでいいかどうかはあなた次第ですが(アクセス権限を考慮して下さい、他の ユーザーがアクセス出来るかどうかについてです)。localhost:をパスに付けた場合、サーバー プロセス(Firebird 1.5では通常firebird が使われています)がファイルを生成して所有します。
Windows上でClassicサーバーを実行している場合、ホスト名は 必ず特定しなくてはなりません(localhostかもしれませんが)。パス名にホスト名が付加されていないと データベースの作成は失敗します。
さあ、データベースが作成されました。ちょっとだけ待って、SQLプロンプトが 現れましたね。この状態で、新しいデータベースに接続していますので、新しいテスト オブジェクトを作成することが出来るようになっています。
データベースが本当に作成されているのかを確認する為に、次のようにタイプし て下さい
SQL>SELECT * FROM RDB$RELATIONS;↵
スクリーンに沢山のデータが表示されましたね! このクエリーはFirebirdがメタデータを 格納しているシステムテーブル中の全ての行を表示させるものです。「空の」データベース は全くの空というわけではありません、データベースにはあなたが作成するオブジェクトを格納 するためのメタデータが既に存在しているのです。
コマンドプロンプトに戻るには次の様にタイプして下さい
SQL>QUIT;↵
isqlに関する詳細は、Using Firebird の Chapter 10:Interactive SQL Utility (isql)を参照して下さい。
データベースマネジメントシステムには通常、それぞれ固有の方法でSQLが実装されています。 Firebirdは従兄弟のInterBase®を除く他のRDBMSと比較して、より厳格にSQL標準に準拠しています。 そのため、SQL標準に準拠していない他製品から移行してきた開発者は、Firebirdはクセが強いと よく言いますが、クセと言われているものの大半は実は全くクセではなく標準なのです。
FirebirdはSQL標準に準拠しているため、整数÷整数の計算の結果(商)は切り捨てられ、 次に小さい整数となります。このことは、ヘンテコな結果になるので十分注意して下さい。
例えば次の計算はSQLにおいては正解です:
1 / 3 = 0
RDBMSからの、整数÷整数の結果を浮動小数点型に改善したい場合、その除数と被除数の 両方又はどちらかについてそのデータ型について、浮動小数点型か高精度数値型を使用する 必要があります。
例えば、上の計算式で非ゼロ値を結果として得たい場合には次のような 変更をします:
1.000 / 3 = 0.333
Firebirdで文字列を扱う場合には一重引用符(アポストロフィ)が必要です – 'I am a string' – (ASCIIコード39で、96ではない)。InterBase® に対して初期のバージョンのFirebirdを使う場合、文字列の区切記号として一重引用符と二重引用符 は交換可能であったことを想起できるでしょう。二重引用符はFirebirdのSQL文において文字列の 区切記号としては使うことが出来ません。
Firebirdの文字列中でアポストロフィを使用したい場合には、 アポストロフィをもう一つ前に付けて「エスケープ」して下さい。
例えば、次の文字列はエラーになります:
'Joe's Emporium'
パーサーはアポストロフィに出会ったところで、'Joe' と解釈して、その後は不明なキーワードとなってしまうためです。
規約に適合する文字列にするためには、アポストロフィを二重にします:
'Joe''s Emporium'
これは二つの一重引用符で二重引用符ではないことに注意して下さい。
SQLにおける結合記号は二つの「パイプ」記号(ASCIIコード 124、スペースを入れず 二つ並べる)です。SQL中で、「+」記号は算術演算子であって、文字列の結合に 使用した場合にはエラーとなります。次の表現では文字型のカラムに「 Reported by: 」を前に付加しています。
'Reported by: ' || LastName
結合は慎重に行って下さい。もしも、2つ又は3つのCHAR型又はVARCHAR型のカラムを結合した 場合に、CHAR型又はVARCHAR型の最大長である32KBの制限を超えてしまうとエラーになるので、 注意して下さい。
以下の点も参照して下さい、 Expressions involving NULL-ja NULLを含んだ結合表現について
SQL-92標準以前には、データベース中で大文字小文字の別や空白を含んだキーワード が二重化する場合のオブジェクト名(識別子)に関しての規約はありませんでした。SQL-92 が一つの新しい規格を取り入れてその規約にしたため、識別子は二つの二重引用符(ASCIIコード 34)で囲まれるものと定義し、以降は常に二重引用符で囲まれる事になりました。
この「贈り物」の目的というのは、非標準のRDBMSから標準準拠のRDBMS への以降を容易にするためのものでした。この事で悪い面があるとすれば、二重引用符 で識別子を定義した場合、それらは大文字小文字が区別され、その後も二重引用符を 使用することが強制されると言うことです。
Firebirdは大変制限された環境下でも、いくらかは気を抜けるようになっています。 識別子が二重引用符で定義されていたとします:
その場合大文字で定義されたものと見なします
キーワードではなく
スペースを含みません
また、引用符を使わずに大文字小文字を区別しないという使い方も出来ます (しかしすぐにでも二重引用符を付けた方が良いでしょう、大文字小文字を合わせる べきです)。
あまりスマートではありませんが、例として、以下のテーブルがあるとしましょう "TESTTABLE" and "TestTable"、 両方が二重引用符を付けて定義されていて, 次のコマンドを実行します:
SQL>select * from TestTable;
あなたがレコードを得るのは、"TESTTABLE"からで "TestTable"ではありません!
引用符による識別子がどうしても必要な理由がある場合でなければ、通常は使用を 避けた方が良いと思われます。Firebirdは幸運なことに引用符付と引用符無しの識別子の 混在を認めています – 必要であれば、古いデータベースから引き継いだキーワードを含め ることにはなんの問題もありません。
データベース管理ツールの中には、デフォルトで全ての 識別子に二重引用符を強制するものがあります。二重引用符オプションを設定可能か 試してみて下さい。
SQLでは、NULLは値ではありません。NULLはデータの条件又は 状態であって、値としては不明なものを意味します。NULL を含んだ演算や、NULLと値を含んだ他の表現式 は、ほとんどの場合常にNULLを結果として返します。NULL はゼロや空白や「空文字」ではありませんし、それらの様に振る舞う こともありません。
試してみた場合にびっくりするかも知れませんが、NULLによる 比較や演算を実行してみた場合の例をいくつか示しましょう:
1 + 2 + 3 + NULL = NULL
not (NULL) = NULL
'Home ' || 'sweet ' || NULL = NULL
if (a = b) then MyVariable = 'Equal'; else MyVariable = 'Not equal';
これらのコードを実行してみた後で、aとb の両方をNULLにした場合、MyVariableには 'Not equal'が入ります。理由は、'a = b'の結果は どちらか一方がNULLであった場合、NULLになる からです。テスト例にある「if」文はNULL の場合にはfalseとして振る舞うため、'then 'ブロックはスキップされて、'else'ブロックが実行されます
表現式がfalseとして振る舞うにもかかわらず、 この場合には、まだこれはNULLのままです。つまり、not() を使って結果を反転させようと思っても、結局これもNULL を返すことになり、trueは返ってきません。
if (a <> b) then MyVariable = 'Not equal'; else MyVariable = 'Equal';
ここでMyVariable は'Equal'になりますが、 それはaがNULLでbが NULL出はない時、あるいはその逆の時です。説明としては 左記の例と同様になります。
FirstName || ' ' || LastName
この式はFirstNameとLastNameのどちらかがNULLの時にはNULLを返します。
NULLをUNKNOWNとして考えてみれば 上記のヘンテコな結果も、なるほどと頷けるでしょう。もしNumber が不明だったとしたら、'1 + 2 + 3 + Number'もまた、不明 (つまりNULL)になることは自明です。MyStringが 不明であれば、'MyString || YourString'も不明となります( YourStringが非NULLであっても)。その他も同様ですね。
NULLに関しての詳細な情報は、以下から入手出来る Firebird Null Guideをご覧下さい:
Firebird Docset → Firebird Database Docs → Firebird 1.5 クイック・スタート → データベース上での作業 |