PostgreSQLは、さまざまな数値データ型に対して減算(-)を含む基本的な算術演算子をサポートしています。
読み進める前に、モダンで高速なPostgreSQLデータベースマネージャー、Beekeeper Studioをご紹介させてください。オートコンプリート対応のSQLエディタで、ここで紹介する計算をすぐに試せます。PostgreSQLでは無料でお使いいただけます。こちらからダウンロードしてください。
最初の例はシンプルで、2つの整数を減算します。これはPostgreSQLに限らず、すべてのSQLベースのデータベースで動作します。
SELECT 15 - 5 AS result;
期待される出力:
| result |
|---|
| 10 |
列の減算
次に、ある列から別の列を減算する方法を見てみましょう。次のような構造を持つ売上テーブル sales を考えます:
| id | item | price | discount |
|---|---|---|---|
| 1 | A | 100 | 20 |
| 2 | B | 200 | 50 |
割引適用後の最終価格を求めたいとします。これは価格から割引額を減算することで求められます。
SELECT id, item, price - discount AS Final_Price FROM sales;
期待される出力:
| id | item | final_price |
|---|---|---|
| 1 | A | 80 |
| 2 | B | 150 |
日付の減算
PostgreSQLで日付を減算すると、2つの日付の差が日数で返されます。
次のようなテーブル rentals を考えます:
| id | item | rent_start_date | rent_end_date |
|---|---|---|---|
| 1 | Bike | 2022-03-01 | 2022-03-10 |
| 2 | Car | 2022-02-20 | 2022-03-02 |
レンタル期間を計算します:
SELECT id, item, rent_end_date - rent_start_date as rental_duration FROM rentals;
期待される出力:
| id | item | rental_duration |
|---|---|---|
| 1 | Bike | 9 |
| 2 | Car | 10 |
タイムスタンプの減算
PostgreSQLでタイムスタンプを減算すると、2つのタイムスタンプ間のインターバルが得られます。
テーブル logins があるとします:
| id | login_time | logout_time |
|---|---|---|
| 1 | 2022-03-15 08:00:00 | 2022-03-15 10:30:00 |
| 2 | 2022-03-15 07:30:00 | 2022-03-15 10:00:00 |
各セッションの時間を計算します:
SELECT id, logout_time - login_time as session_duration FROM logins;
期待される出力:
| id | session_duration |
|---|---|
| 1 | 02:30:00 |
| 2 | 02:30:00 |
実践的なユースケース
在庫管理
総在庫数から販売数を減算して、各商品の利用可能な在庫を計算する例を紹介します。
次のような構造の在庫テーブルがあるとします:
CREATE TABLE inventory (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(255),
total_stock INT,
sold INT
);
サンプルデータ:
INSERT INTO inventory (product_name, total_stock, sold) VALUES
('Product A', 100, 50),
('Product B', 200, 180),
('Product C', 150, 140);
クエリ: 利用可能な在庫の計算
SELECT product_id, product_name, total_stock - sold AS available_stock
FROM inventory;
期待される出力:
product_id | product_name | available_stock
------------+--------------+-----------------
1 | Product A | 50
2 | Product B | 20
3 | Product C | 10
このクエリでは、total_stock から sold の数量を減算して、各商品の available_stock を求めています。
年齢の計算
PostgreSQLの age 関数は2つの日付の差を計算するために使われ、年・月・日を含む複合的なinterval型として結果を返します。
テーブル内の顧客の年齢を計算したい場合の実践的なユースケースを紹介します。
birthdate列を持つcustomersテーブルがあるとします。
SELECT customer_id, birthdate, age(current_date, birthdate) AS age
FROM customers;
期待される出力:
customer_id | birthdate | age
-------------+------------+----------------------
1 | 1990-04-25 | 34 years 3 mons 12 days
2 | 1985-10-12 | 38 years 9 mons 24 days
3 | 2000-01-01 | 24 years 7 mons 5 days
まとめ
PostgreSQLの減算は、数値、日付、インターバルに適用できる汎用的なツールです。この記事では、数値と日付の両方を扱うPostgreSQLの減算操作を見てきました。計算を行う際は、常にデータ型を確認し、互換性を確保するようにしてください。より高度なSQLの概念を掘り下げるシリーズの続編もお楽しみに。Happy coding!
こちらの記事もおすすめです:
Beekeeper Studioは無料でオープンソースのPostgreSQL GUIです
まさに探していたPostgreSQLクライアントです!UIが他とは一線を画しています。すっきりしていて直感的、しかも高機能。使いにくいPGAdminとはお別れです。 - David Cyprian
Beekeeper Studioは高速で直感的、使いやすいPostgreSQLクライアントです。他にも多数のデータベースに対応しており、Windows、Mac、Linuxで快適に動作します。
Beekeeper StudioのPostgreSQL利用者の声
pgAdminと違って、Beekeeperは驚くほどシンプルに使えるのに機能も充実しています。しかも価格も手頃です!データベースのバックアップ機能が特に便利です。本当に素晴らしいソフトウェアです。
素晴らしいツールです。PostgresとMySqlのDB管理で、これまで見つけた中で一番実用的なIDEです。面倒なことなく、ちゃんと動きます :-)