OSS-DB Silver 暗記 C-1-4
開発/SQL(32%):::SQL:その他のデータベースオブジェクト【重要度:13】dokoQL可
PostgreSQL 11.5文書:その他のデータベースオブジェクト
- dokoQL で実習が可能です(関数・プロシージャ・テーブルスペース除く)
シーケンス
- 連番を自動生成するオブジェクト
PostgreSQL 11.5文書:CREATE SEQUENCE
- CREATE SEQUENCE — 新しいシーケンスジェネレータを定義する
CREATE SEQUENCE シーケンス名
[START 開始値] [INCREMENT 増加値];
DROP SEQUENCE シーケンス名;
例:シーケンスの作成と削除
=> CREATE SEQUENCE seq START 100 INCREMENT 10;
=> SELECT setval('seq', 1000);
=> SELECT currval('seq');
---------
currval
---------
1000
---------
=> SELECT nextval('seq');
---------
nextval
---------
1010
---------
=> DROP SEQUENCE seq;
ビュー
- SELECT文の結果を仮想的なテーブルにしたもの
- CREATE VIEW — 新しいビューを定義する
CREATE VIEW ビュー名
[(列名 [,...])] AS SELECT文
DROP VIEW ビュー名;
例:フィルムテーブル作成
=> CREATE TABLE films (
code text,
title text,
did int,
date_prod date,
kind text
);
=> INSERT INTO films VALUES
('AB100', 'AAA AAAAAA AAAA', 110, '2000-01-01', 'Action'),
('CD120', 'BBB BBBBBB BBBB', 140, '2001-02-02', 'Action'),
('EE502', 'ZZZ ZZZZZZ ZZZZ', 105, '2003-03-03', 'Comedy'),
('LL601', 'SSSSSSS', 106, '2004-04-04', 'Action'),
('QS502', 'PPPPPPP', 107, '2005-05-05', 'Comedy'),
('SO321', 'A OOOO', 210, '2006-06-06', 'SF'),
('SL111', 'A RRRR', 211, '2007-07-07', 'SF'),
('LX388', 'A XXXX', 212, '2008-08-08', 'Comedy');
例:ビューの作成と削除
=> CREATE VIEW comedies AS
SELECT * FROM films WHERE kind='Comedy';
=> SELECT * FROM comedies;
-------+-----------------+-----+------------+--------
code | title | did | date_prod | kind
-------+-----------------+-----+------------+--------
EE502 | ZZZ ZZZZZZ ZZZZ | 105 | 2003-03-03 | Comedy
QS502 | PPPPPPP | 107 | 2005-05-05 | Comedy
LX388 | A XXXX | 212 | 2008-08-08 | Comedy
-------+-----------------+-----+------------+--------
=> DROP VIEW comedies;
マテリアライズドビュー
- 実体のあるビュー
- SELECT文の結果を実体のあるテーブルにしたもの
PostgreSQL 11.5文書:CREATE MATERIALIZED VIEW
- CREATE MATERIALIZED VIEW — 新しいマテリアライズドビューを定義する
CREATE MATERIALIZED VIEW マテリアライズドビュー名
[(列名 [,...])] AS SELECT文
DROP VIEW マテリアライズドビュー名;
=> CREATE MATERIALIZED VIEW sf AS
SELECT * FROM films WHERE kind='SF';
=> INSERT INTO films VALUES
('SP755', 'Z QQQQ', 213, '2009-09-09', 'SF');
=> REFRESH MATERIALIZED VIEW sf; -- リフレッシュ
=> SELECT * FROM sf;
-------+--------+-----+------------+------
code | title | did | date_prod | kind
-------+--------+-----+------------+------
S0321 | A OOOO | 210 | 2006-06-06 | SF
SL111 | A RRRR | 211 | 2007-07-07 | SF
SP755 | Z QQQQ | 213 | 2009-09-09 | SF
-------+--------+-----+------------+------
=> DROP VIEW comedies;
インデックス
- 索引のこと
インデックスの作成
PostgreSQL 11.5文書:CREATE INDEX
- CREATE INDEX — 新しいインデックスを定義する
CREATE INDEX インデックス名 ON テーブル名
[USING インデックス種別]
(列名 [,...])];
インデックス種別:{ B-Tree | GiST | GIN | ハッシュ }
DROP INDEX インデックス名;
例:インデックスの作成と削除
=> CREATE MATERIALIZED VIEW sf AS
SELECT * FROM films WHERE kind='SF';
=> CREATE TABLE test (
id integer,
content varchar
);
=> CREATE INDEX test_id_index ON test (id);
=>
=> DROP INDEX test_id_index;
複数列インデックス
- インデックスは、テーブルの2つ以上の列に対して定義できる
例えば、/devディレクトリの内容をDBに保持している場合、
デバイスファイルのメジャー番号とマイナー番号の2つをインデックにする
=> CREATE TABLE test (
major int,
minor int,
name varchar);
=> CREATE INDEX test_mm_idx ON test (major, minor);
式に対するインデックス
- インデックスは、テーブルの1つ以上の列から計算される関数やスカラ式として定義できる
=> CREATE INDEX people_name ON ((first_name || ' ' || last_name)); => SELECT * FROM people WHERE (first_name || ' ' || last_name)='John Smith';
部分インデックス
- 部分インデックスとは、テーブルの部分集合に構築されるインデックスです
- 部分集合は条件式で定義する
=> CREATE TABLE access_log (
url varchar,
client_ip inet
);
=> CREATE INDEX access_log_client_ip_ix ON access_log (client_ip)
WHERE NOT (client_ip>inet '192.168.100.0' AND
client_ip<inet '192.168.100.255');
=> SELECT * FROM access_log
WHERE url='/index.html' AND client_ip=inet '212.78.10.32';
=> SELECT * FROM access_log
WHERE client_ip=inet '192.168.100.23';
トリガ
- 銃の引き金のこと
- テーブルの行に 挿入/更新/削除 が行われたとき指定した関数を呼び出す機能
PostgreSQL 11.5文書:CREATE TRIGGER
- CREATE TRIGGER — 新しいトリガを定義する
CREATE TRIGGER トリガ名 { BEFORE | AFTER }
{ UPDATE | INSERT | DELETE | TRUNCATE } ON テーブル名
[ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE { FUNCTION | PROCEDURE } 関数名(引数);
DROP TRIGGER トリガ名 ON テーブル名;
- 発動タイミング
- 更新前:BEFORE
- 更新後:AFTER
- キーワード
- 更新前の値参照:NEW
- 更新後の値参照:OLD
- NEW / OLD
- 両方使用可:UPDATE
- NEW のみ:INSERT
- OLD のみ:DELETE
=> CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
EXECUTE FUNCTION check_account_update();
ルール
- SQLを別のSQLに書き換える仕組み
- CREATE RULE — 新しい書き換えルールを定義する
CREATE RULE ルール名
AS ON [SELECT | INSERT | UPDATE | DELETE]
TO テーブル名 [WHERE 条件]
DO [ALSO | INSTEAD] SQL文;
DROP RULE ルール名 ON テーブル名;
例:ルール作成
=> CREATE TABLE table1 (a int);
=> CREATE TABLE table2 (b int);
=>
=> CREATE RULE table_insert AS ON INSERT
TO table1
DO ALSO INSERT INTO table2 VALUES (NEW.a*2);
例:ルールの利用と削除
=> INSERT INTO table1 VALUES(100);
=> SELECT * FROM table1;
-----------
a
-----------
100
-----------
=> SELECT * FROM table2;
-----------
b
-----------
200
-----------
=>
=> DROP RULE table_insert ON table1;
関数
- 関数とプロシージャはほぼ同じもの
- 関数とプロシージャの違い
- 関数は戻り値を使用できるが、プロシージャはできない
- 関数はSELECT で呼び出し、プロシージャはCALL で呼び出す
- 関数はトランザクション処理を記述できないが、プロシージャはできる
dokoQL不可
PostgreSQL 11.5文書:CREATE FUNCTION
- CREATE FUNCTION — 新しい関数を定義する
CREATE FUNCTION 関数名(引数)
RETURNS 戻り値
AS '関数の記述'
LANGUAGE 使用言語
{IMMUTABLE | STABLE | VOLATILE}
{CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT};
DROP FUNCTION 関数名(引数) [CASCADE | RESTRICT];
例:関数作成
postgres=# CREATE FUNCTION add (int, int)
RETURNS INT
AS 'SELECT $1+$2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
postgres=#
postgres=# \df
-----------------------------------------------------------------
List of functions
----------+------+------------------+---------------------+------
Schema | Name | Result data type | Argument data types | Type
----------+------+------------------+---------------------+------
postgres | add | integer | integer, integer | func
----------+------+------------------+---------------------+------
postgres=# ▯
例:関数使用・削除
postgres=# SELECT add (10, 20);
---------
add
---------
30
---------
postgres=#
postgres=# DROP FUNCTION add (int, int);
DROP FUNCTION
postgres=# SELECT add (10, 20);
ERROR: function add(integer,integer) does not exist
postgres=# ▯
プロシージャ
PostgreSQL 11.5文書:CREATE PROCEDURE
- CREATE PROCEDURE — 新しいプロシージャを定義する
dokoQL不可
CREATE PROCEDURE プロシージャ名(引数)
AS '関数の記述'
LANGUAGE 使用言語;
DROP PROCEDURE プロシージャ名(引数) [CASCADE | RESTRICT];
例:プロシージャ作成
postgres=# CREATE TABLE tbl (a int);
CREATE TABLE
postgres=# CREATE PROCEDURE insert_data (a int, b int)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;
CREATE PROCEDURE
postgres=# ▯
例:プロシージャ使用・削除
postgres=# CALL insert_data (10,20);
CALL
postgres=# SELECT * FROM tbl;
----------
a
----------
10
----------
20
----------
postgres=# DROP PROCEDURE insert_data (int, int);
DROP PROCEDURE
postgres=# ▯
テーブルスペース
- データベースオブジェクトを格納する場所(ディレクトリ)
PostgreSQL 11.5文書:CREATE TABLESPACE
- CREATE TABLESPACE — 新しいテーブル空間を定義する
dokoQL不可
CREATE TABLESPACE テーブルスペース名
[OWNER {new_owner | CURRENT_USER | SESSION_USER}]
LOCATION 'パス名';
DROP TABLESPACE テーブルスペース名;
例:/home/postgres/dbs にテーブル空間 dbspace を作成する
postgres=# CREATE TABLESPACE dbspace LOCATION '/home/postgres/dbs';
postgres=# \db
-----------------------------------------
List of tablespaces
------------+----------+--------------------
Name | Owner | Location
------------+----------+--------------------
dbspace | postgres | /home/postgres/dbs
pg_default | postgres |
pg_global | postgres |
------------+----------+--------------------
例:テーブル空間 dbspace にテーブル tbl を作成する
postgres=# CREATE TABLE tbl (a int) TABLESPACE dbspace;
例:テーブル空間 dbspace を削除する
postgres=# DROP TABLE tbl; -- テーブル空間を空にする postgres=# DROP TABLESPACE dbspace; --
参考
- IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/ACCEL/OPCEL
- PostgreSQL 11.5文書
- OSS教科書 OSS-DB Silver Ver2.0対応
- 徹底攻略OSS-DB Silver問題集[Ver.2.0]対応
- dokoQL 学習用オンラインSQL実行環境
- スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)



