はじめに
業務で頻繁に利用するクエリを使用例とともに自分用にまとめました。
随時、クエリの追加をしていきたいと考えています。
テストデータのCREATE TABLE、INSERTについては最後に紹介しています
利用するデータ
クエリ
select
*
from
simple_table;
実行結果
id | last_name | first_name | created_at
----+-----------+------------+------------
1 | Tanaka | Taro | 2025-05-01
2 | Suzuki | Hanako | 2025-05-01
3 | Yamamoto | Jiro | 2025-05-15
(3 rows)
文字列を連結したい
クエリ
select
concat_ws(' ', last_name, first_name, created_at, '作成')
from
simple_table;
実行結果
concat_ws
-------------------------------
Tanaka Taro 2025-05-01 作成
Suzuki Hanako 2025-05-01 作成
Yamamoto Jiro 2025-05-15 作成
(3 rows)
CSV等のデータをテーブルのように扱いたいとき
クエリ
WITH csv_data (user_id, age) AS (
VALUES
(1, 20),
(2, 40)
)
SELECT
st.id,
st.last_name,
st.first_name,
cd.age
FROM
simple_table st
INNER JOIN csv_data cd
ON st.id = cd.user_id;
実行結果
id | last_name | first_name | age
----+-----------+------------+-----
1 | Tanaka | Taro | 20
2 | Suzuki | Hanako | 40
(2 rows)
日付単位でグルーピングしたい時
クエリ
SELECT
CAST(st.created_at AS DATE) AS date,
Count(*)
FROM
simple_table st
GROUP BY
date
ORDER BY
date;
実行結果
date | count
------------+-------
2025-05-01 | 2
2025-05-15 | 1
(2 rows)
1対多を1行で表現したいとき
クエリ
SELECT
CAST(st.created_at AS DATE) AS date,
STRING_AGG(st.last_name::text, ',') AS last_names
FROM
simple_table st
GROUP BY
date
ORDER BY
date;
実行結果
date | last_names
------------+---------------
2025-05-01 | Tanaka,Suzuki
2025-05-15 | Yamamoto
(2 rows)
SELECT結果をCSV出力したい
クエリ
\COPY (select * from simple_table limit 3) TO '出力先ファイルパス.csv' WITH CSV HEADER;
実行結果
-- psqlに接続したカレントディレクトリにCSVファイルが保存されているはずです。
◾️データの準備
CREATE TABLE IF NOT EXISTS simple_table (
id INTEGER PRIMARY KEY,
last_name TEXT,
first_name TEXT,
created_at DATE
);
INSERT INTO simple_table (id, last_name, first_name, created_at) VALUES
(1, 'Tanaka', 'Taro', '2025-05-01'),
(2, 'Suzuki', 'Hanako', '2025-05-10'),
(3, 'Yamamoto', 'Jiro', '2025-05-15');
DROP TABLE IF EXISTS simple_table;