Kodrill

組み込み関数とトランザクション

OSS-DB Silver

集約関数・算術関数・文字列関数と演算子 (LIKE・SIMILAR TO・~)・日付と時刻の関数/トランザクションの構文・SAVEPOINT・分離レベル・LOCK・行ロック・デッドロック

問題数
20 問
合格ライン
70%
実行して確認済み
14 問
この分野の要点を読む6 章・約 9 分。実行して確かめたコード例と、試験でよくある引っかけをまとめています

ログインなしで試す

無料の 5 問を、1問ごとに正誤と解説を見ながら解けます。解答は保存されません。

5 問を試す

無料登録して学習を記録する

学習履歴・ダッシュボード・ブックマーク・模試モードが使えます。

★ 残り 15 問はプレミアム会員限定です

無料プランでは先頭 5 問まで解けます。プレミアムなら全問題・苦手問題の復習・広告非表示が使えます。
料金プランを見る

問題と解説を見る (無料)

登録しなくても、次の5問は問題文と解説をそのまま読めます。

組み込み関数とトランザクションの要点

内容の確認日: 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 (%) の結果は割られる数と同じ符号です。

SQL
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 を無視する

SQL
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 正規表現。部分一致なので、全体を確かめるには ^・$ を付ける。~* は大文字小文字を区別しない

SQL
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 は括弧を付けずに書きます。

SQL
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 で返します。

SQL
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 名前 でそこまで戻せます (トランザクションは続く)。

SQL
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 と floor

    ceil(-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 に解除の命令はない

    ロックはトランザクションの終わりまで続きます。ブロックの外ではエラーです。

問題で確認する

この分野の問題を、解説つきで読めます (登録不要)。

出典・参考

コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。