組み込み関数とトランザクションの要点
内容の確認日: 2026-10-29
この分野は出題範囲の S3.2 (組み込み関数) と S3.3 (トランザクションの概念) に当たり、50 問中およそ 3 問 (S3.2 が 2 問・S3.3 が 1 問) が出題されます。
出題数は少なめですが、関数の結果は SQL の問題全体で使われ、トランザクションの考え方は運用管理やバックアップの理解の土台になります。コード例はすべて PostgreSQL 14 で実行した結果です。
算術関数と集約関数
round は四捨五入、trunc は 0 の方向への切り捨てで、2 つ目の引数は小数点以下の桁数です。ceil (ceiling) は「その値以上で最小の整数」、floor は「その値以下で最大の整数」なので、負の数では向きに注意します。mod (%) の結果は割られる数と同じ符号です。
SELECT round(2.567, 1), trunc(2.567, 1), ceil(-1.5), floor(-1.5);SELECT mod(-7, 3), abs(-3), power(2, 10);psql -A -t -P null=NULL -f example.sql 2.6|2.5|-1|-2 -1|3|1024
集約関数 (count・sum・avg・max・min) は NULL を無視します。整数の avg は numeric を返します。
文字列関数とパターン一致
・長さ: char_length (length) は文字数、octet_length はバイト数
・lower・upper・substring(文字列 FROM 開始 FOR 長さ) (位置は 1 から)・position(部分 IN 文字列)・replace・trim (BOTH・LEADING・TRAILING)
・連結: ||。どちらかが NULL なら結果も NULL。concat は NULL を無視する
SELECT substring('PostgreSQL' FROM 5 FOR 3), position('SQL' IN 'PostgreSQL'), trim(BOTH 'x' FROM 'xxaxx'), 'x' || NULL, concat('x', NULL);psql -A -t -P null=NULL -f example.sql gre|8|a|NULL|x
パターン一致は 3 種類あります。
・LIKE: _ は任意の 1 文字、% は任意の 0 文字以上。文字列全体と一致する必要がある。ILIKE は大文字小文字を区別しない
・SIMILAR TO: LIKE に |・( )・* などの正規表現の記法を加えたもの。これも全体一致
・~: POSIX 正規表現。部分一致なので、全体を確かめるには ^・$ を付ける。~* は大文字小文字を区別しない
SELECT 'abc' LIKE '_b', 'abc' LIKE '_b%', 'abc' SIMILAR TO '(a|b)%', 'abc' ~ 'b', 'ABC' ~* '^abc$';psql -A -t -P null=NULL -f example.sql f|t|t|t|t
日付と時刻の関数
now() と current_timestamp は トランザクションの開始時刻 を返し、同じトランザクションの中では何度呼んでも同じ値です。statement_timestamp() は今の文の開始時刻、clock_timestamp() は呼んだ瞬間の時刻です。current_date・current_time・current_timestamp は括弧を付けずに書きます。
BEGIN;DO $$ BEGIN PERFORM pg_sleep(0.1); END $$;SELECT now() = transaction_timestamp(), now() = statement_timestamp(), now() < clock_timestamp();COMMIT;psql -A -t -P null=NULL -f example.sql t|f|t
extract(要素 FROM 日時) は年・月・曜日 (dow、日曜が 0) などを取り出し、to_char は書式を指定して文字列に、date_trunc は指定した単位より細かい部分を切り捨てます。age(a, b) は a − b を年・月・日の interval で返します。
SELECT extract(dow FROM date '2026-10-29'), to_char(date '2026-04-05', 'YYYY/MM/DD'), date_trunc('month', timestamp '2026-10-29 13:45'), age(date '2026-10-29', date '2000-04-01');psql -A -t -P null=NULL -f example.sql 4|2026/04/05|2026-10-01 00:00:00|26 years 6 mons 28 days
トランザクションの構文と SAVEPOINT
BEGIN (START TRANSACTION) で始め、COMMIT で確定、ROLLBACK で取り消します。BEGIN を書かなければ、文ごとに自動でコミットされます。SAVEPOINT 名前 で途中に目印を付け、ROLLBACK TO SAVEPOINT 名前 でそこまで戻せます (トランザクションは続く)。
CREATE TABLE t (x integer);BEGIN;INSERT INTO t VALUES (1);SAVEPOINT sp1;INSERT INTO t VALUES (2);ROLLBACK TO SAVEPOINT sp1;INSERT INTO t VALUES (3);COMMIT;SELECT x FROM t ORDER BY x;psql -A -t -P null=NULL -f example.sql 1 3
PostgreSQL では、トランザクションの中で 1 つでもエラーが起きると、そのトランザクションは中断状態になり、以降の文は 25P02 のエラーで実行されません。最後の COMMIT もロールバックとして扱われます。エラーの後も続けたいときは、あらかじめ SAVEPOINT を置いておき、そこまで戻します。
分離レベルとロック
分離レベルは READ COMMITTED (既定)・REPEATABLE READ・SERIALIZABLE の 3 つが実際に動き、READ UNCOMMITTED を指定しても READ COMMITTED として動きます (ダーティリードは起きない)。BEGIN ISOLATION LEVEL ... か、トランザクションの最初の問い合わせより前に SET TRANSACTION ISOLATION LEVEL ... で指定します。
・READ COMMITTED: 文ごとに、その時点でコミット済みのデータを読む。同じ SELECT を 2 回実行すると、間にコミットされた変更が見える
・REPEATABLE READ: 最初の文の時点のスナップショットを使い続ける。ほかのトランザクションがコミットした行を更新しようとすると、直列化の失敗 (40001) になる
・SERIALIZABLE: 順番に 1 つずつ実行したのと同じ結果になることを保証する。保証できないときは 40001 になり、やり直しが必要
LOCK TABLE テーブル IN モード MODE はトランザクションの終わりまでテーブルをロックし、トランザクションブロックの外では使えません。SELECT ... FOR UPDATE (FOR SHARE) は読んだ行に行ロックをかけ、ほかのトランザクションのその行の更新を待たせます (普通の SELECT は待たない)。NOWAIT を付けると、待たずにエラーになります。
お互いのロックを待ち合うデッドロックは、deadlock_timeout (既定 1 秒) 待った後に検出され、一方のトランザクションがエラー (40P01) で中断されます。行を更新する順番を揃えると防げます。
試験でよくある引っかけ
負の数の
ceilとfloorceil(-1.5)は -1、floor(-1.5)は -2 です。LIKEは全体一致、~は部分一致'abc' LIKE 'b'は偽、'abc' ~ 'b'は真です。||とNULL連結の片方が
NULLなら結果はNULLです。concatはNULLを無視します。now()はトランザクションの開始時刻トランザクションの中では変わりません。実際の現在時刻は
clock_timestamp()です。エラーの後のトランザクション
中断状態になり、後の文は実行されず、
COMMITもロールバックになります。READ UNCOMMITTEDでもダーティリードは起きないPostgreSQL では
READ COMMITTEDと同じに動きます。SET TRANSACTIONは最初に問い合わせを実行した後では、分離レベルを変えられずエラーになります。
LOCK TABLEに解除の命令はないロックはトランザクションの終わりまで続きます。ブロックの外ではエラーです。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- LPI-Japan「OSS-DB Silver」(出題範囲)
- PostgreSQL 14 文書「関数と演算子」
- PostgreSQL 14 文書「トランザクションの分離」
- PostgreSQL 14 文書「明示的ロック」
コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。