PostgreSQL 入門

PostgreSQL におけるデータの照会(SELECT)

SELECT文は、SQLにおけるデータ取得の基礎です。これを使用することで、データベースに対してクエリを実行し、一つまたは複数のデータテーブルから特定の情報を抽出することができます。

リレーショナルデータベースを扱うすべての人にとって、SELECT文のマスターは必須科目です。なぜなら、データ分析、レポート作成、そしてアプリケーション開発のあらゆる場面で基盤となるからです。本章では、PostgreSQLにおけるSELECT文のコアな構文、頻用されるオプション、および実務的な応用例について包括的なガイドを提供します。

1. SELECTの基本構文

SELECT文の最も基本的な構文構造は以下の通りです。

SELECT カラム1, カラム2, ...
FROM テーブル名;
  • SELECT: クエリを開始するためのキーワードです。
  • カラム1, カラム2, ...: 取得したいカラム(列)の名前です。1つまたは複数のカラムを選択できます。テーブル内のすべてのカラムを抽出したい場合は、アスタリスク(*)ワイルドカードを使用します。
  • FROM: データを取得する対象のテーブルを指定します。
  • テーブル名: クエリを実行する対象のテーブル名です。

1.1 特定のカラムを抽出する

例えば、以下のような構造を持つ employees(従業員)テーブルがあるとします。

カラム名 (Column)データ型 (Data Type)
employee_idINTEGER
first_nameVARCHAR
last_nameVARCHAR
departmentVARCHAR
salaryDECIMAL

すべての従業員の first_name(名)と last_name(姓)だけを抽出したい場合、以下のクエリを使用します。

SELECT first_name, last_name
FROM employees;

実行後、返されるリザルトセットには、employees テーブルの各レコードから「名」と「姓」の2つのカラムデータのみが含まれます。

1.2 すべてのカラムを抽出する(アスタリスク * の使用)

テーブル内のすべての情報を抽出したい場合は、アスタリスク(*)を使用します。

SELECT *
FROM employees;

このクエリは、テーブル内のすべてのカラム(employee_id, first_name, last_name, department, salary)を返します。

ベストプラクティスのヒント: SELECT * は記述が簡単で便利ですが、本番環境(プロダクション)で使用することは推奨されません。なぜなら、実際に必要な量よりもはるかに多いデータを取得することになり、ネットワーク転送やシステムパフォーマンスを低下させる可能性があるからです。また、アプリケーションで本来必要のない機密性の高いカラムまで露出させてしまうセキュリティリスクもあります。常に「必要なカラムだけを明示的にリストアップする」習慣をつけるのが最善です。

2. カラムエイリアス(別名)の設定

カラムエイリアスを使用すると、クエリの結果セットにおいてカラム名を一時的に「リネーム」することができます。これはレポートの可読性を高めたり、計算によって生成されたカラムに意味のある名前を付けたりするのに非常に有効です。

エイリアスの定義には AS キーワードを使用しますが、省略してカラム名の直後にエイリアスを記述することも可能です。

構文:

SELECT カラム名 AS エイリアス名
FROM テーブル名;

-- または AS を省略:
SELECT カラム名 エイリアス名
FROM テーブル名;

例:
従業員の名と姓を抽出する際、ヘッダーをよりフォーマルな given_namesurname として表示したい場合:

SELECT first_name AS given_name, last_name AS surname
FROM employees;

出力結果の列見出しは given_namesurname に変わります。ただし、これはあくまで出力上の「化粧」であり、データベース内の元のテーブル名やカラム名が変わるわけではありません。

計算カラムでのエイリアス活用:
クエリ内で算術演算を行う場合、エイリアスは特に重要です。例えば、price(定価)と discount(割引率)を含む products(製品)テーブルで割引後の価格を計算する場合:

SELECT price * (1 - discount) AS discounted_price
FROM products;

AS discounted_price というエイリアスを指定しない場合、返される列の見出しは price * (1 - discount) という扱いにくい数式そのままになってしまいます。

3. DISTINCTによる重複値の除外

DISTINCT キーワードは、指定したカラムから一意の(重複のない)値のみを抽出するために使用されます。結果セットから重複するエントリを排除したい場合に不可欠な機能です。

構文:

SELECT DISTINCT カラム名
FROM テーブル名;

例 1:単一カラムの重複削除
社内にどのような部署が存在するのか(重複する部署名を除外して)知りたい場合:

SELECT DISTINCT department
FROM employees;

例 2:複数カラムの組み合わせによる重複削除
複数のカラムに対して同時に DISTINCT を使用することもできます。この場合、指定されたすべてのカラムの組み合わせが完全に一致したときのみ、重複とみなされて除外されます。

SELECT DISTINCT department, salary
FROM employees;

このクエリは「部署 + 給与」のユニークな組み合わせを返します。

  • 同じ部署で2人の従業員の給与が同じ場合、結果には1行だけ表示されます。
  • 同じ部署でも給与が異なる場合、あるいは給与が同じでも部署が異なる場合は、それぞれのレコードが表示されます。

4. プレビュー:WHEREによるフィルタリングとORDER BYによるソート

詳細については後続の章で解説しますが、SELECT 文と組み合わせて頻繁に使用されるため、ここで簡単に紹介しておきます。

4.1 WHEREによるデータのフィルタリング

WHERE 句を使用すると、特定の条件に基づいてデータをフィルタリングし、条件を満たす行だけを返すことができます。

プレビュー例: 「販売部(Sales)」に所属する従業員の名前と姓のみを抽出する場合:

SELECT first_name, last_name
FROM employees
WHERE department = 'Sales';

4.2 ORDER BYによるデータのソート

ORDER BY 句は、返される結果セットを1つまたは複数のカラムに基づいて並べ替えるために使用します。

  • ASC: 昇順(小さい順、デフォルト設定)。
  • DESC: 降順(大きい順)。

プレビュー例: すべての従業員情報を抽出し、給与(salary)の高い順に並べ替える場合:

SELECT *
FROM employees
ORDER BY salary DESC;