【初心者向け】PostgreSQLの基本コマンド一覧と使い方まとめ

データベース・SQL

PostgreSQL(ポストグレスキューエル)は、高機能なオープンソースのリレーショナルデータベースです。

しかし、コマンドラインでの操作が中心となるため、初心者には少しむずかしく感じるかもしれません。

そこで本記事では、PostgreSQLでよくつかわれる基本コマンドを「ログイン・データベース操作・テーブル操作・ユーザー管理」など目的別に整理し、わかりやすくしょうかいします。

スポンサーリンク

PostgreSQLってなに?

データベースの基本

データベースとは

  • 大量のデータを効率的に保存・管理するしくみ
  • 複数の人が同時につかえる
  • データの整合性を保ってくれる

PostgreSQLの特徴

  • 完全に無料で 使える(オープンソース)
  • 高性能で信頼性が高い
  • 大企業でも使われている
  • SQL標準にしたがっている

他のデータベースとのちがい

  • MySQL:軽量で高速、Web アプリケーションでよくつかわれる
  • PostgreSQL:高機能で拡張性が高い、複雑なデータ処理が得意
  • SQLite:ファイルベース、小規模なアプリケーション向け

PostgreSQLをつかう前の準備

インストールの確認 まずは、PostgreSQLがインストールされているか確認しましょう。

psql --version

サービスの起動(Linuxの場合)

sudo systemctl start postgresql
sudo systemctl enable postgresql  # 自動起動設定

サービスの起動(macOSの場合)

brew services start postgresql

では、実際にPostgreSQLにつないでみましょう。

PostgreSQLへの接続・ログイン関連

基本的な接続方法

基本の接続コマンド

psql -U postgres                     # postgresユーザーで接続
psql -U myuser -d mydatabase          # 特定のユーザーとデータベースで接続
psql -h localhost -p 5432 -U postgres # ホストとポートを指定

接続オプションの説明

  • -U:ユーザー名を指定
  • -d:データベース名を指定
  • -h:ホスト名を指定(デフォルト:localhost)
  • -p:ポート番号を指定(デフォルト:5432)

接続の実例

初回接続(postgresユーザー)

$ psql -U postgres
Password for user postgres: [パスワードを入力]

postgres=# # プロンプトが変わったら接続成功

特定のデータベースに接続

$ psql -U myuser -d testdb
testdb=> # データベース名がプロンプトに表示される

psqlシェル内での操作

接続情報の確認

\conninfo                            -- 現在の接続情報を表示

シェルの終了

\q                                   -- psqlを終了
exit                                 -- または exit

ヘルプの表示

\?                                   -- psqlコマンドのヘルプ
\h                                   -- SQLコマンドのヘルプ
\h SELECT                            -- 特定のSQLコマンドのヘルプ

接続コマンドは、作業の出発点です。

次は、データベースの作成や一覧表示といった基本操作に進みましょう。

データベース操作コマンド

データベースの作成

基本的な作成方法

CREATE DATABASE testdb;              -- 基本的なデータベース作成
CREATE DATABASE myapp 
    WITH OWNER = myuser 
    ENCODING = 'UTF8';               -- オプション付きで作成

文字エンコーディングを指定

CREATE DATABASE japanese_db
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'ja_JP.UTF-8'
    LC_CTYPE = 'ja_JP.UTF-8';        -- 日本語対応

データベースの確認

データベース一覧の表示

\l                                   -- 簡潔な一覧
\list                                -- 詳細な一覧
\l+                                  -- さらに詳細な情報

出力例

                              List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     | 
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 testdb    | postgres | UTF8     | C       | C     | 

データベースの接続切り替え

別のデータベースに接続

\c testdb                            -- testdbに接続
\connect myapp                       -- myappに接続
\c postgres postgres                 -- postgresデータベースにpostgresユーザーで接続

データベースの削除

データベースの削除

DROP DATABASE testdb;                -- データベースを削除
DROP DATABASE IF EXISTS old_db;      -- 存在する場合のみ削除

注意点

  • 削除は取りもどせません
  • 接続中のデータベースは削除できません
  • 他のユーザーが接続していると削除できません

データベースのバックアップと復元

バックアップの作成(コマンドライン)

pg_dump -U postgres -d testdb > backup.sql     # SQLファイルでバックアップ
pg_dump -U postgres -d testdb -Fc > backup.dump # カスタム形式でバックアップ

復元(コマンドライン)

psql -U postgres -d newdb < backup.sql         # SQLファイルから復元
pg_restore -U postgres -d newdb backup.dump    # カスタム形式から復元

データベースの作成と接続ができれば、次はテーブルの操作に挑戦してみましょう。

テーブル関連のコマンド

テーブルの作成

基本的なテーブル作成

CREATE TABLE users (
    id SERIAL PRIMARY KEY,           -- 自動増分の主キー
    name VARCHAR(100) NOT NULL,      -- 必須の文字列
    email VARCHAR(255) UNIQUE,       -- ユニークな文字列
    age INTEGER,                     -- 整数
    created_at TIMESTAMP DEFAULT NOW() -- タイムスタンプ
);

よくつかうデータ型

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,              -- 制限なしの文字列
    price DECIMAL(10,2),             -- 10桁で小数点以下2桁
    description TEXT,
    in_stock BOOLEAN DEFAULT true,   -- 真偽値
    category_id INTEGER,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

テーブルの確認

テーブル一覧の表示

\d                                   -- すべてのテーブル一覧
\dt                                  -- テーブルのみ一覧
\dt+                                 -- 詳細情報付きで一覧

特定のテーブル構造を表示

\d users                             -- usersテーブルの構造
\d+ users                            -- 詳細情報付きで表示

出力例

                          Table "public.users"
   Column   |          Type          | Collation | Nullable | Default 
------------+------------------------+-----------+----------+---------
 id         | integer               |           | not null | nextval('users_id_seq'::regclass)
 name       | character varying(100) |           | not null | 
 email      | character varying(255) |           |          | 
 age        | integer               |           |          | 
 created_at | timestamp              |           |          | now()

テーブル構造の変更

カラムの追加

ALTER TABLE users ADD COLUMN phone VARCHAR(20);         -- 電話番号カラムを追加
ALTER TABLE users ADD COLUMN status VARCHAR(10) DEFAULT 'active'; -- デフォルト値付き

カラムの変更

ALTER TABLE users ALTER COLUMN name TYPE VARCHAR(150);  -- データ型の変更
ALTER TABLE users ALTER COLUMN age SET NOT NULL;        -- NOT NULL制約を追加
ALTER TABLE users ALTER COLUMN email DROP NOT NULL;     -- NOT NULL制約を削除

カラムの削除

ALTER TABLE users DROP COLUMN phone;                    -- カラムを削除
ALTER TABLE users DROP COLUMN IF EXISTS old_column;     -- 存在する場合のみ削除

テーブル名の変更

ALTER TABLE old_users RENAME TO users;                  -- テーブル名を変更
ALTER TABLE users RENAME COLUMN name TO full_name;      -- カラム名を変更

インデックスの作成

基本的なインデックス

CREATE INDEX idx_users_email ON users(email);           -- emailにインデックス
CREATE INDEX idx_users_name_age ON users(name, age);    -- 複合インデックス
CREATE UNIQUE INDEX idx_users_unique_email ON users(email); -- ユニークインデックス

インデックスの確認と削除

\di                                  -- インデックス一覧
DROP INDEX idx_users_email;          -- インデックスを削除

テーブルの削除

テーブルの削除

DROP TABLE users;                    -- テーブルを削除
DROP TABLE IF EXISTS old_table;      -- 存在する場合のみ削除
DROP TABLE users CASCADE;            -- 依存関係も含めて削除

テーブル構造を自由にあつかえるようになると、実用的なデータ管理が可能になります。

次は、データの操作方法を見ていきましょう。

データ操作(CRUD)コマンド

CRUDとは、Create(作成)、Read(読み取り)、Update(更新)、Delete(削除)の略で、データベースの基本操作です。

データの追加(CREATE – INSERT)

基本的なデータ追加

INSERT INTO users (name, email, age) 
VALUES ('田中太郎', 'tanaka@example.com', 25);

-- 複数のデータを同時に追加
INSERT INTO users (name, email, age) VALUES 
    ('佐藤花子', 'sato@example.com', 30),
    ('鈴木次郎', 'suzuki@example.com', 22),
    ('高橋美咲', 'takahashi@example.com', 28);

すべてのカラムにデータを追加

INSERT INTO users VALUES 
    (DEFAULT, '山田太郎', 'yamada@example.com', 35, DEFAULT);
-- DEFAULT は自動設定される値(SERIAL、TIMESTAMPなど)

他のテーブルからデータをコピー

INSERT INTO active_users (name, email) 
SELECT name, email FROM users WHERE age >= 20;

データの読み取り(READ – SELECT)

基本的なデータ取得

SELECT * FROM users;                 -- すべてのデータを取得
SELECT name, email FROM users;       -- 特定のカラムのみ取得
SELECT DISTINCT age FROM users;      -- 重複を除いて取得

条件を指定してデータ取得

SELECT * FROM users WHERE age >= 25;              -- 25歳以上
SELECT * FROM users WHERE name LIKE '田%';        -- 名前が「田」で始まる
SELECT * FROM users WHERE email IS NOT NULL;      -- メールアドレスがある
SELECT * FROM users WHERE age BETWEEN 20 AND 30;  -- 20〜30歳

並び替えとページング

SELECT * FROM users ORDER BY age ASC;             -- 年齢の昇順
SELECT * FROM users ORDER BY created_at DESC;     -- 作成日時の降順
SELECT * FROM users ORDER BY age, name;           -- 年齢、名前の順

-- ページング
SELECT * FROM users LIMIT 10;                     -- 最初の10件
SELECT * FROM users LIMIT 10 OFFSET 20;           -- 21〜30件目

集計関数

SELECT COUNT(*) FROM users;                        -- 総数
SELECT AVG(age) FROM users;                        -- 平均年齢
SELECT MAX(age), MIN(age) FROM users;              -- 最高年齢、最低年齢
SELECT COUNT(*) FROM users WHERE age >= 30;       -- 30歳以上の人数

グループ化

SELECT age, COUNT(*) FROM users GROUP BY age;     -- 年齢別の人数
SELECT age, COUNT(*) FROM users 
GROUP BY age HAVING COUNT(*) >= 2;                -- 2人以上いる年齢

データの更新(UPDATE)

基本的なデータ更新

UPDATE users SET age = 26 WHERE id = 1;           -- 特定のレコードを更新
UPDATE users SET email = 'new@example.com' 
WHERE name = '田中太郎';                          -- 名前で検索して更新

複数のカラムを同時更新

UPDATE users SET 
    name = '田中太郎(更新)',
    age = 26,
    email = 'tanaka_new@example.com'
WHERE id = 1;

条件付きの一括更新

UPDATE users SET age = age + 1;                   -- 全員の年齢を1歳プラス
UPDATE users SET status = 'inactive' 
WHERE created_at < '2023-01-01';                  -- 古いレコードを無効化

データの削除(DELETE)

基本的なデータ削除

DELETE FROM users WHERE id = 1;                   -- 特定のレコードを削除
DELETE FROM users WHERE age < 18;                 -- 18歳未満を削除
DELETE FROM users WHERE email IS NULL;            -- メールアドレスがないレコードを削除

テーブルのデータをすべて削除

DELETE FROM users;                                -- すべてのデータを削除(構造は残る)
TRUNCATE TABLE users;                             -- 高速ですべてのデータを削除
TRUNCATE TABLE users RESTART IDENTITY;           -- シーケンスもリセット

安全なデータ操作のコツ

トランザクションをつかう

BEGIN;                                            -- トランザクション開始
UPDATE users SET age = 30 WHERE id = 1;
-- 確認してから...
COMMIT;                                           -- 確定
-- または
ROLLBACK;                                         -- 取りけし

操作前にかならず確認

-- 削除前に該当レコードを確認
SELECT * FROM users WHERE age < 18;
-- 問題なければ削除実行
DELETE FROM users WHERE age < 18;

これらのCRUD操作をマスターすれば、実際のアプリケーションでも活用できます。

次に、ユーザーやアクセス権の管理を見ていきましょう。

ユーザー・アクセス権限コマンド

ユーザーの作成と管理

基本的なユーザー作成

CREATE USER devuser WITH PASSWORD 'mypassword';   -- 基本的なユーザー
CREATE USER admin_user WITH PASSWORD 'securepass' CREATEDB; -- DB作成権限付き
CREATE USER readonly_user WITH PASSWORD 'readpass'; -- 読み取り専用想定

ユーザーの属性設定

CREATE USER webapp_user 
    WITH PASSWORD 'webapp123'
    LOGIN                                          -- ログイン可能
    NOSUPERUSER                                    -- スーパーユーザーではない
    NOCREATEDB                                     -- DB作成権限なし
    NOCREATEROLE                                   -- ロール作成権限なし
    NOINHERIT                                      -- 権限継承なし
    VALID UNTIL '2025-12-31';                      -- 有効期限

ユーザー情報の確認

ユーザー一覧の表示

\du                                               -- ユーザー一覧
\du+                                              -- 詳細情報付き

特定のユーザー情報

SELECT * FROM pg_user;                            -- システムビューで確認
SELECT usename, usesuper, usecreatedb FROM pg_user WHERE usename = 'devuser';

パスワードの変更

自分のパスワード変更

\password                                         -- 対話形式でパスワード変更

他のユーザーのパスワード変更(管理者のみ)

ALTER USER devuser WITH PASSWORD 'newpassword';

データベースレベルの権限管理

データベースへのアクセス権限

-- データベースへの接続権限を付与
GRANT CONNECT ON DATABASE testdb TO devuser;

-- データベース内のすべての権限を付与
GRANT ALL PRIVILEGES ON DATABASE testdb TO devuser;

-- 特定の権限のみ付与
GRANT CREATE ON DATABASE testdb TO devuser;

権限の剥奪

REVOKE CONNECT ON DATABASE testdb FROM devuser;   -- 接続権限を剥奪
REVOKE ALL PRIVILEGES ON DATABASE testdb FROM devuser; -- すべての権限を剥奪

テーブルレベルの権限管理

テーブルの権限付与

-- 特定のテーブルの読み取り権限
GRANT SELECT ON users TO readonly_user;

-- 特定のテーブルのすべての権限
GRANT ALL PRIVILEGES ON users TO devuser;

-- 複数テーブルに権限を付与
GRANT SELECT, INSERT, UPDATE ON users, products TO webapp_user;

-- スキーマ内のすべてのテーブルに権限付与
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;

今後作成されるテーブルにも権限を付与

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO readonly_user;

ロール(グループ)の作成

ロールの作成

CREATE ROLE developers;                          -- 開発者グループ
CREATE ROLE readers;                             -- 読み取り専用グループ

ロールに権限を付与

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO developers;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readers;

ユーザーをロールに追加

GRANT developers TO devuser;                     -- devuserを開発者グループに追加
GRANT readers TO readonly_user;                  -- readonly_userを読み取りグループに追加

ユーザーの削除

ユーザーの削除

DROP USER devuser;                               -- ユーザーを削除
DROP USER IF EXISTS old_user;                    -- 存在する場合のみ削除

権限をもつユーザーの削除

-- まず権限を剥奪
REVOKE ALL PRIVILEGES ON DATABASE testdb FROM devuser;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM devuser;
-- その後削除
DROP USER devuser;

便利なpsqlコマンド

システム情報の確認

基本的なシステム情報

\conninfo                                        -- 現在の接続情報
\du                                              -- ユーザー一覧
\l                                               -- データベース一覧
\dn                                              -- スキーマ一覧
\df                                              -- 関数一覧

テーブルとカラムの情報

\d                                               -- テーブル、ビュー、シーケンス一覧
\dt                                              -- テーブル一覧のみ
\dv                                              -- ビュー一覧のみ
\ds                                              -- シーケンス一覧のみ
\di                                              -- インデックス一覧

SQL実行の便利機能

SQLファイルの実行

\i /path/to/script.sql                           -- SQLファイルを実行
\ir script.sql                                   -- 相対パスで実行

出力設定

\timing on                                       -- クエリ実行時間を表示
\timing off                                      -- 実行時間表示を停止
\x                                               -- 拡張表示モード(縦表示)
\x off                                           -- 通常表示モードに戻る

結果をファイルに出力

\o output.txt                                    -- 出力をファイルにリダイレクト
SELECT * FROM users;                             -- クエリ実行
\o                                               -- ファイル出力を停止

設定とカスタマイズ

プロンプトのカスタマイズ

\set PROMPT1 '%n@%m:%> '                         -- プロンプトを変更
\set PROMPT2 '%n@%m:%> '                         -- 継続行のプロンプト

エイリアスの設定

\set show_users 'SELECT id, name, email FROM users ORDER BY id;'
:show_users                                      -- エイリアスを実行

トラブルシューティング

よくあるエラーと解決法

接続エラー

# エラー: could not connect to server
# 解決策:PostgreSQLサービスの確認
sudo systemctl status postgresql
sudo systemctl start postgresql

権限エラー

-- エラー: permission denied for table users
-- 解決策:権限の確認と付与
\z users                                         -- テーブルの権限確認
GRANT SELECT ON users TO current_user;

データベースが見つからない

-- エラー: database "mydb" does not exist
-- 解決策:データベースの存在確認
\l                                               -- データベース一覧で確認
CREATE DATABASE mydb;                            -- 必要に応じて作成

パフォーマンスのチェック

クエリの実行計画

EXPLAIN SELECT * FROM users WHERE age > 25;      -- 実行計画を表示
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25; -- 実際の実行統計も表示

長時間実行中のクエリ

SELECT pid, now() - pg_stat_activity.query_start AS duration, query 
FROM pg_stat_activity 
WHERE (now() - pg_stat_activity.query_start) > interval '1 minutes';

データベースのサイズ確認

SELECT datname, pg_size_pretty(pg_database_size(datname)) 
FROM pg_database ORDER BY pg_database_size(datname) DESC;

まとめ:PostgreSQLを使いこなそう

PostgreSQLのコマンドは一見複雑に見えますが、慣れれば強力なツールとなり、日々のデータ管理を効率化してくれます。

この記事のポイント

  • 接続とログイン:psqlでの接続方法とオプション
  • データベース操作:作成、削除、バックアップ
  • テーブル操作:構造の作成・変更・削除
  • CRUD操作:データの作成・読取・更新・削除
  • ユーザー管理:権限設定とセキュリティ

コメント

タイトルとURLをコピーしました