さらぷろ激闘情報処理試験編
データベース SQL
CREATE DATABASE
細かい文法は、RDBに結構依存したりしますね。
CREATE DATABASE DB名称
くらい覚えておけばよいかなぁ。
CREATE TABLE
パターンが多いですね。
SELECT文と同じくらいやっかいです。
しかも、SELECT文ほど、現場では使わない。
GUIツールや、スクリプトで自動生成するから、
自力で書かないですもの。
【一番単純な奴】
CREATE TABLE テーブル名 (
列名1 型 ,
列名2 型
);
【NOT NULL制約をつける】
CREATE TABLE テーブル名 (
列名1 型 NOT NULL,
列名2 型
);
【プライマリーキーをつける】
CREATE TABLE テーブル名 (
列名1 型 NOT NULL,
列名2 型 ,
CONSTRAINT 任意の名前 PRIMARY KEY (列名1@)
);
@⇒複数列で、主キーを構成する時は、カンマ区切りで列挙ね。
【Check制約をつける】
CREATE TABLE テーブル名 (
列名1 型 NOT NULL,
列名2 型 ,
CONSTRAINT 任意の名前 PRIMARY KEY (列名1),
CONSTRAINT 任意の名前 CHECK(OKの条件@)
);
@⇒WHERE句として評価できる記述ね。
【外部キー制約をつける】
CREATE TABLE テーブル名 (
列名1 型 NOT NULL,
列名2 型 ,
CONSTRAINT 任意の名前 PRIMARY KEY (列名1),
CONSTRAINT 任意の名前 CHECK(OKの条件@),
CONSTRAINT 任意の名前 FOREIGN KEY(自テーブルの列名) REFERENCES 参照先テーブル(参照先テーブルの列名)
ON UPDATE RESTRICT
);
ON句は、ちと面倒
ON [@] [A]
@は、INSERT,UPDATE,DELETEからチョイス
Aは、RESTRICT,CASCADE,SET NULLからチョイス
@×Aの組合わせってとこかな。
・RESTRICT :参照先がいたら、消えちゃ駄目制約。伝票明細⇒商品マスタみたいなもん。
・CASCADE :死ならばもろとも。一蓮托生。伝票明細⇒伝票みたいに、
はい、消えた。(なるほどザワールド風)
・SET NULL :これは、まんまやね。参照先が削除されたら、NULLにしとけ。
ちなみに、RESTRICT=NO ACTIONらすぃ
※全般で、「CONSTRAINT 任意の名前」は、省略可能っす。
名前を好きにつけられますってだけや〜ね。
現場で使うのは、PRIMARY KEYくらいですね。わはは。
ALTER TABLE
書くのがめんどい。
CREATE INDEX
書くのがめんどい。
CREATE VIEW
CREATE VIEW ビュー名 AS
(
登録したいSELECT文です。。。
)
たまに、問題に出るので、一応、おさえ。
ビュー名と、ASの間に、列の列挙も可能っと。
CREATE VIEW ビュー名(列1,列2) AS
(
登録したいSELECT文です。。。
)
CREATE DOMAIN
CREATE DOMAIN ドメイン名 AS データ型
[DEFAULT{リテラル | NULL | USER | CURRENT_USER | CURRENT_ROLE}] ⇒デフォルト値を指定する。
[NOT NULL] ⇒NotNull属性をつける
[CHECK ] ⇒Check制約をつける
[COLLATE collation_order] ;
ドメインって何かって言うと、
1つの列を2つのテーブルに持つような場合に、
列の定義をあらかじめ登録しておきましょって感じかな。
例えば、商品コードは、文字列6桁で、
商品マスタと、伝票明細に商品コード列を追加する場面を想定する。
ドメイン無しの時は、商品マスタと、伝票明細にそれぞれ、
文字列6桁で商品コード列を定義する。
この「文字列6桁であること」は、人間がチェックするわけ。
⇒ヒューマンエラーが発生する可能性あり。
これに対して、ドメインを使った場合、
商品コード列は、文字列6桁です。ってドメインを登録しておく。
で、商品マスタと、伝票明細には、「商品コード」とだけ定義しておく。
商品コードについての型情報は、ドメインとして一元管理しているから、
ヒューマンエラーの発生を防げるというわけだ。
CREATE ASSERTION
CREATE ASSERTION 表明名称 CHECK ( OKとなる条件@ )
@⇒WHERE句として評価できる記述
表明の定義。
午後2で出題されてるね。
えっと、列間や、テーブルまたぎでの制約に利用するのかな。
見た時は、唖然としましたよ。
だいたい、実装しているRDBMSがほとんど無いんだから。
CREATE TRIGGER
まぁ、そんなのもあるさ。
動的SQL
まぁ、そんなのもあるよ。
カーソル宣言
DECALRE CURSOR カーソル名 FOR SELECT文
たまに、出題されるようで。
ストアド使いなら、慣れたもんかな。
あたしゃ、使ったことないね。
DROP TABLE
DROP TABLE テーブル名
DROP INDEX
DROP INDEX インデックス名
DROP VIEW
DROP VIEW ビュー名
DROP系は、みな一緒ね。
GRANT
GRANT 権限 ON テーブル名 TO ユーザ名
ユーザに、操作可能な権限を与える。
権限=SELECT,INSERT,UPDATE,DELETEなどなど。
テーブル名のところは、本来は、オブジェクト。ビューとかも指定可能。
基本形さえ抑えれば、いいかな。
REVOKE
REVOKE 権限 ON テーブル名 FROM ユーザ名
GRANTと逆。権限剥奪。TOがFROMになるので、注意。
SQL92では、さらに、
REVOKE 権限 ON テーブル名 FROM ユーザ名 RESTRICT
REVOKE 権限 ON テーブル名 FROM ユーザ名 CASCADE
を指定できる。
これは、芋ずる式の権限剥奪をするか、しないかを指定する。
例えば
USER1が、USER2に権限をあたえた後、
USER1に対し、REVOKEをした時、
RESTRICTなら、USER2がいるので失敗、
CASCADEなら、USER2もろとも剥奪ということ。。。でよいのかなぁ。
ROLLUP
GROUP BY句の拡張ですね。
GROUP BY ROLLUP(大分類,中分類,小分類)
って指定すると、
小分類単位で集計ができて、
中分類ブレイク時に、中分類計も集計され、
大分類ブレイク時に、大分類計まで集計され、
全トータルまで集計される。
こんな、便利なのがあったんだぁ。
今まで、ROLLUPの存在は知っていたけど、
どんな場面で使うのか知らなかった。
CUBE
これもGROUP BY句の拡張ですね。
GROUP BY CUBE(曜日,天気,時間)
みたいに使うのかな。
曜日+天気+時間の集計、
曜日+天気の集計、
曜日+時間の集計、
天気+時間の集計、
曜日の集計、
天気の集計、
時間の集計、
全体の集計。
これらが、一度で集計できる。
これも便利そう。
OLAP系で使えそうだ。
GROUPING SETS
ROLLUP以上、CUBE未満みたいな感じ。
友達以上、恋人未満みたい。(笑)
特定の単位の集計を行う場合に使用。
GROUP BY GROUPING SETS((曜日,天気),(曜日,時間),())
の場合、曜日+天気と、曜日+時間と、全体集計が行われる。
RECURSIVE
SQL99で登場。再帰結合が可能になった奴。
実戦装備が待ち遠しい一品。
WITH RECURSIVE 組織ツリー仮想テーブル(親組織コード,組織コード, 組織名, 階層) AS
(
SELECT 親組織コード, 組織コード, 組織名, 1 AS 階層
FROM 組織テーブル
WHERE 親組織コード IS NULL
UNION ALL
SELECT 親組織コード, 組織コード, 組織名 組織ツリー仮想テーブル.階層+1 AS 階層
FROM 組織ツリー仮想テーブル
INNER JOIN 組織テーブル
ON 組織ツリー仮想テーブル.組織コード=組織テーブル.親組織コード
)
SELECT * FROM 組織ツリー仮想テーブル ORDER BY 階層;
WITH も、SQL99から登場ですな。
副問合せを別枠で記述可能なもの。
UNIONより前が、最初に一度実行されて、
UNIONより後が、再帰実行される仕組み。。。。でいいんだよなぁ。
なんせ、実装しているRDBMS知らないので、
試しようもないです。はい。
あれ?でも、Compositeパターンを適用するには、
下から集計しなきゃいけないんだけど、
これだと、上からツリーを形成していくことになるなぁ。
下からの場合、自分が最下層であることを
認識しなきゃいけないんだけど。。。どうやるんだろう??
このホームページのホストは
です。無料ホームページをどうぞ!