SQL文法 - RDB(PostgreSQL)

最終更新日: 2026-08-25

TOP(About this memo)) > 一覧(RDB) > SQL文法(PostgreSQL)

SQL文法(PostgreSQL)

ダブルクオテーション(二重引用符)

引用符が付かない名前は常に小文字に解釈されますが、識別子を引用符で囲むことによって大文字と小文字が区別されるようになります。例えば、識別子FOO、foo、“foo”はPostgreSQLによれば同じものとして解釈されますが、“Foo”と”FOO”は、これら3つとも、またお互いに違ったものとして解釈されます(PostgreSQLが引用符の付かない名前を小文字として解釈することは標準SQLと互換性がありません。標準SQLでは引用符の付かない名前は大文字に解釈されるべきだとされています。したがって標準SQLによれば、fooは”FOO”と同じであるべきで、“foo”とは異なるはずなのです。もし移植可能なアプリケーションを書きたいならば、特定の名前は常に引用符で囲むか、あるいはまったく囲まないかのいずれかに統一することをお勧めします)。

(IMO) 大文字と小文字が区別されるため、常に囲んでおく方がよい気もする。

よくマイグレーションで使うSQLのメモ

ALTER TABLE "my_table" DROP CONSTRAINT uniq__my_table__user_id;
ALTER TABLE "my_table" ADD COLUMN "number" VARCHAR(500);
ALTER TABLE "my_table" ADD CONSTRAINT "uniq__my_table__user_id__number" UNIQUE("user_id", "number");
ALTER TABLE my_table ALTER COLUMN number SET NOT NULL;

キャスト

:: はキャスト。

SELECT now()::date
SELECT CAST(now() AS date)

MySQLとの違い

SET

SET enable_seqscan TO 'off'
SET LOCAL enable_seqscan TO 'off'

型の変更

例1(varcharからnumericへ):

ALTER TABLE spots ALTER latitude TYPE numeric(15,12) USING latitude::numeric(15,12);

例2(smallintからbooleanへ):

ALTER TABLE users ALTER is_active TYPE boolean USING is_active::INT::BOOLEAN;

ポイントとして、is_active::BOOLEAN だと直接エラーになるため、INTを経由していること。

offset(開始位置)

以下のどちらか。

SELECT カラム名, ... FROM テーブル名 LIMIT 行数 OFFSET 開始位置;
SELECT カラム名, ... FROM テーブル名 LIMIT 開始位置, 行数;

トランザクション

begin;
select * from users where id = '10101010-1010-1010-1010-101010101010';
commit;
# rollback;