MiniSQLの仕様
mSQL言語は、ANSI SQLの仕様に準拠して、最低限必要な機能を提供しています。この言語を利用すると、テーブル構造で、データの保存、処理、検索を行うことができます。ビュー、入れ子のクエリーなど、リレーショナルな処理は実行できません。ANSIの仕様で決められたリレーショナルな処理は実行できませんが、複数のテーブル間での「結合」は実行できます。
これ以降の解説では、mSQLのキーワードは大文字で記述されています。しかし、実際のクエリーの指定では、大文字にする必要はありません。
CREATE句
mSQLのCREATE句は、テーブルの作成にのみ使用します。ビューのようなその他の定義を作成することはできません。また、1つのテーブルに対して、1つの主キー・フィールドしか定義できません。キー・フィールドでは、NULL値は認められません。
CREATE TABLE table_name (
col_name col_type [ not null | primary key ]
[ , col_name col_type [ not null | primary key ] ]**
)
例えば
CREATE TABLE emp_details(
first_name char(15) not null,
last_name char(15) not null,
dept char(20),
emp_id int primary key,
salary int
)
指定できるデータ・タイプ
DROP句
DROP句は、データベースからテーブル定義を削除するのに使用します。
DROP TABLE table_name
例えば
DROP TABLE emp_details
INSERT句
ANSI SQLとは異なり、SELECTをINSERT句に入れ子にすることができません。(すなわち、SELECTが戻したデータを挿入することはできません。) また現在のところ、データを挿入するフィールドの名前も指定する必要があります。フィールド名を指定しないと、挿入するデータを特定することも、正しいフィールドにデータを挿入することもできません。
INSERT INTO table_name ( column [ , column ]** )
VALUES (value [, value]** )
例えば
INSERT INTO emp_details ( first_name, last_name, dept, salary)
VALUES ('David', 'Hughes', 'I.T.S.','12345')
指定した値の数は、カラムの数と一致しなければなりません。
DELETE句
mSQLのDELETE句は、次のように指定してください。
DELETE FROM table_name
WHERE column OPERATOR value
[ AND | OR column OPERATOR value ]**
演算子として、<、>、=、<=、>=、<>、likeを指定できます。
例えば:
DELETE FROM emp_details WHERE emp_id = 12345
SELECT句
mSQLのSELECT句は、SQL仕様のSELECTよりも機能が限定されています。
- 入れ子のSELECTは実行できません。
- 内的な処理の機能(count()、avg()など)は実行できません。
実行できる機能には、次のようなものがあります。
- 結合
- DISTINCT行選択
- ORDER BY句
- 通常演算式のマッチング
- WHERE句によるカラムごとの比較
mSQLのSELECTは、次のように指定します。
SELECT [table.]column [ , [table.]column ]**
FROM table [ , table]**
[ WHERE [table.] column OPERATOR VALUE
[ AND | OR [table.]column OPERATOR VALUE]** ]
[ ORDER BY [table.]column [DESC] [, [table.]column [DESC] ]
演算子として、<、>、=、<=、>=、<>、likeを指定できます。
値には、データ値またはカラム名を指定できます。
単純なSELECTは、次のようになります。
SELECT first_name, last_name FROM emp_details
WHERE dept = 'finance'
検索したデータを姓で昇順に、名で降順にソートするには、クエリーを次のように指定してください。
SELECT first_name, last_name FROM emp_details
WHERE dept = 'finance'
ORDER BY last_name, first_name DESC
重複した行を削除するには、DISTINCT演算子を使用してください。
SELECT DISTINCT first_name, last_name FROM emp_details
WHERE dept = 'finance'
ORDER BY last_name, first_name DESC
LIKE句の場合は、SQLと同じように指定してください。
- '_'は、あらゆる値の1文字に相当します。
- '%'は、あらゆる値の0または複数文字に相当します。
- '\'は、特殊文字を普通の文字として扱います。(たとえば、'\%'は%に相当します。また、'\\'は'\'に相当します。)
- 他のすべての文字は、別の文字に置き変わることはありません。
したがって、経理に所属している人物で、'Hughes'のように姓の後半が'ughes'である人を検索するには、クエリーを次のように指定してください。
SELECT first_name, last_name FROM emp_details
WHERE dept = 'finance' and last_name like '_ughes'
SELECTの実行中にテーブルを結合すると、リレーショナルなクエリー言語がどれほど便利であるのか理解できるでしょう。たとえば、定義したテーブルが2つあるとします。一方には従業員の情報を記録しており、もう一方には各従業員が従事しているプロジェクトを記録しています。また、両テーブルの各従業員には、一意の従業員番号が割り当てられています。誰がどのようなプロジェクトに従事しているのか、次のクエリーによって、ソートしたリストを作成できます。
SELECT emp_details.first_name, emp_details.last_name,
project_details.project
FROM emp_details, project_details
WHERE emp_details.emp_id = project_details.emp_id
ORDER BY emp_details.last_name, emp_details.first_name
mSQLには、クエリー中に「結合する」テーブルの数に制限がありません。したがって、何らかの形で従業員番号に関連した情報があるテーブルが15あるとすると、これらの全てのテーブルからデータを抽出することができます。処理速度は遅くなるものの、1回のクエリーで実行します。結合に関して注意すべき重要な点は、テーブル名とともに、全てのカラム名も指定しなければならないことです。mSQLでは、一意に命名したカラムが複数のテーブルに渡って存在するという考え方をしていません。したがって、1つのSELECTで複数のテーブルをアクセスする場合、各カラムの名前を指定する必要がでてくるのです。
UPDATE句
mSQLのUPDATE句では、カラム名を値として使用できません。文字の値だけを、UPDATE句の値として指定できます。
UPDATE table_name SET column=value [ , column=value ]**
WHERE column OPERATOR value
[ AND | OR column OPERATOR value ]**
演算子として、<、>、=、<=、>=、<>、likeを指定できます。
例えば
UPDATE emp_details SET salary=30000 WHERE emp_id = 1234