【PostgreSQL】SELECT文の書き方|基本から応用まで

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年6月)

✔このような方へ向けて書かれた記事となります

「PostgreSQLのSELECT文を使ってデータを抽出したい」
「SELECT文の書き方や条件指定が知りたい」
「実際のデータ抽出例が参考になりたい」

✔当記事を通じてお伝えすること

  • PostgreSQL SELECT文の基本概念
  • SELECT文の書き方や条件の指定方法
  • PostgreSQL SELECT文を用いた実践的なデータ抽出例

当記事では、PostgreSQLのSELECT文の基本から、様々な条件を指定してデータを抽出する方法まで、具体的な例をもとに詳細に説明しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

PostgreSQLの基本概念

このセクションでは、PostgreSQLの基本的な概念について説明します。

データベースとテーブル、そしてテーブルの構造について理解を深めましょう。

  • データベースとテーブル
  • テーブルの構造: カラムとデータ型
  • PostgreSQLのデータ型の例

データベースとテーブル

データベースは、さまざまなデータを組織的に保管し管理するシステムです。

それぞれのデータベースは複数のテーブルを保有しており、テーブルはさらにカラムとレコードで構成されます。

  • カラム:データの種類
  • レコード:具体的なデータ

データベースをエクセルに例えると、カラムは列、レコードは行です。

テーブルの構造: カラムとデータ型

テーブルの構造を理解するためには、カラムとデータ型の2つの要素を理解することが重要です。

なぜならカラムにどんなデータが入るかを、データ型で決めているから。

例えば、’age’という名前のカラムは、整数型(INTEGER)のデータ型を持つことが多いです。

これにより間違った値が入らないよう制御しています。

PostgreSQLのデータ型の例

PostgreSQLは、多種多様なデータ型をサポートしています。

  • テキスト型(TEXT)
  • 数値型(INTEGER, NUMERIC)
  • 真偽値型(BOOLEAN)
  • 日時型(DATE, TIMESTAMP)

これらのデータ型を正しく使い分けることで、効率的で柔軟なデータ操作が可能になります。

PostgreSQLのデータ型一覧

おおまかなデータ型を理解したら、一覧にも目を通しておきましょう。

思ったよりも設定できるデータ型は多く、理解しておくと応用が効きます。

データ型説明
integer整数を表すデータ型42
numeric固定精度の数値を表すデータ型3.14
text可変長のテキスト文字列を表すデータ型‘Hello, World!’
boolean真偽値を表すデータ型true
date日付を表すデータ型‘2023-06-07’
time時刻を表すデータ型’13:30:00′
timestamp日付と時刻を表すデータ型‘2023-06-07 13:30:00’
interval期間を表すデータ型‘2 days’
jsonJSON形式のデータを格納するデータ型‘{“name”: “John”, “age”: 30}’
array複数の値を持つ配列を表すデータ型‘{1, 2, 3}’

SELECT文の基本構造とパラメータ

こちらでは、SELECT文の基本構造とパラメータについて学びましょう。

SELECT文はデータベースから情報を取り出すための基本的なツールです。

  • SELECT文の構文
  • FROM句
  • WHERE句
  • GROUP BY句
  • HAVING句
  • SELECTリスト
  • DISTINCT句
  • ORDER BY句
  • LIMIT句

SELECT文の構文

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

SELECT column_name FROM table_name WHERE condition;

この構文により、指定したテーブルから特定のカラムを条件に基づいて取得することができます。

FROM句

FROM句は、取得するデータがどのテーブルから来るかを指定します。

ひとつのクエリで複数のテーブルからデータを取得することも可能です。

テーブルごとにカンマで区切りましょう。

-- FROM句: テーブルからデータを取得する
SELECT * FROM my_table;

WHERE句

WHERE句は、取得するレコードに特定の条件を適用します。

例としては以下のような条件を指定して、特定の値だけ取り出すです。

  • 特定のカラムの値が一定の値以上
  • 特定の文字列を含むレコードのみ
-- WHERE句: 条件に基づいてデータをフィルタリングする
SELECT *
FROM my_table
WHERE age > 18;

GROUP BY句

GROUP BY句は、特定のカラムに基づいて結果セットをグループ化する際に使用します。

例えば社員の所属部署ごとに平均給与を計算したい場合などが活用例です。

この句は、以下のような集約関数と一緒に用いられます。

  • COUNT
  • SUM
  • AVG
  • MIN
  • MAX
-- GROUP BY句: カラムの値でグループ化して集計する
SELECT city, COUNT(*)
FROM customers
GROUP BY city;

HAVING句

HAVING句は、GROUP BY句と一緒に使用され、グループ化したデータに対する条件を適用します。

WHERE句が行に対して適用されるのに対し、HAVING句はグループに対して適用されるもの。

たとえば、平均給与が一定値以上の部署だけを取得したい場合に用いられます。

-- HAVING句: GROUP BYの結果に対して条件を指定する
SELECT city, COUNT(*)
FROM customers
GROUP BY city
HAVING COUNT(*) > 5;

SELECTリスト

SELECTリストは、取得したいカラムのリストを指定するもの。

これらのカラムはカンマで区切られます。

全てのカラムを取得したい場合は、アスタリスク(*)を使用しましょう。

-- SELECTリスト: 取得するカラムを指定する
SELECT first_name, last_name
FROM customers;

DISTINCT句

DISTINCT句は、特定のカラムのユニークな(重複しない)値のみを取得する際に使用します。

顧客テーブルからすべての異なる顧客の国を取得するときなどが、その例です。


-- DISTINCT句: 重複する行を除外する
SELECT DISTINCT city
FROM customers;

ORDER BY句

ORDER BY句は、取得したレコードを特定のカラムに基づいてソート(並び替え)するために使用されます。

昇順(ASC)または降順(DESC)の並び順の指定が可能です。

-- ORDER BY句: カラムの値でデータを並び替える
SELECT *
FROM products
ORDER BY price DESC;

LIMIT句

LIMIT句は、取得するレコードの最大数を制限するために使用されます。

これは、テストクエリを実行したり、大規模なデータベースから小さなサンプルを取得する際に特に有用です。

-- LIMIT句: 取得する行数を制限する
SELECT *
FROM products
LIMIT 10;

PostgreSQLの基本例

このセクションでは、PostgreSQLのSELECT文の基本的な使用例について詳しく解説します。

具体的なクエリの作成とその結果について学ぶことで、データベースから必要な情報を抽出する技術が身につくでしょう。

  • 全カラムを取得する方法
  • 特定のカラムを取得する方法
  • 値をフィルタリングする方法
  • ソート順を指定する方法

全カラムを取得する方法

最も基本的なSELECT文は、テーブルのすべてのカラムとすべてのレコードを取得するものです。

以下のようにアスタリスク(*)を使用します。

SELECT * FROM table_name;

これはテーブルのすべてのデータを表示しますが、大量のデータがある場合は表示が大変なため、通常はLIMIT句を使って表示するレコード数を制限します。

特定のカラムを取得する方法

特定のカラムだけを取得するには、SELECT句の後にカラム名を列挙します。

カラム名はカンマで区切ります。

たとえば、「name」と「age」のカラムだけを取得するクエリは以下のようになります。

SELECT name, age FROM table_name;

値をフィルタリングする方法

特定の条件を満たすレコードだけを取得するには、WHERE句を使用します。

例えば、’age’カラムが30以上のレコードを取得するには、以下のようにします。

SELECT name, age FROM table_name WHERE age >= 30;

ソート順を指定する方法

レコードを特定のカラムでソートするには、ORDER BY句を使用します。

指定する値は以下のとおりです。

  • 昇順:ASC(省略可能)
  • 降順:DESC

例えば、’age’カラムで降順にソートするには、以下のようにします。

SELECT name, age FROM table_name ORDER BY age DESC;

SELECT文の応用例

こちらでは、PostgreSQLのSELECT文を応用した使用例について学びます。

理解いただくことで、より高度なデータ操作と分析が可能になります。

  • 集約関数を利用する方法 (COUNT, SUM, AVG, MIN, MAX)
  • 複数のテーブルを結合する方法(内部結合や左外部結合)
  • サブクエリを利用する方法
  • CASE式を利用した条件分岐

集約関数を利用する方法 (COUNT, SUM, AVG, MIN, MAX)

集約関数は、一連の値に対する操作を行い、単一の結果を返すものです。

例えば以下のようなものがあります。

  • レコード数をカウント:COUNT
  • 特定のカラムの合計を算出:SUM
  • 平均値を算出:AVG
  • 最小値を見つける:MIN
  • 最大値を見つける:MAX

以下は、’age’カラムの平均値を求める例です。

SELECT AVG(age) FROM table_name;

以下の記事ではSUM関数について詳しくお伝えしています。

複数のテーブルを結合する方法(内部結合や左外部結合)

複数のテーブルを結合するにはJOIN句を使用します。

  • 内部結合(INNER JOIN):結合条件に一致するレコードのみを結合
  • 左外部結合(LEFT OUTER JOIN):左のテーブルの全レコードと右のテーブルの一致するレコードを結合

以下は、内部結合の例です。

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

サブクエリを利用する方法

サブクエリは、SQL文の中に含まれる別のSQL文です。

主にWHEREやFROM句で使用されます。

以下は、サブクエリを使用して’age’カラムの平均値以上のレコードを取得する例です。

SELECT * FROM table_name WHERE age >= (SELECT AVG(age) FROM table_name);

CASE式を利用した条件分岐

CASE式は、複数の条件を設定し、それぞれに異なる結果を返すためのもの

以下は、’age’カラムの値に応じて、新たなカラム’age_group’を作成する例です。

SELECT name, age, CASE WHEN age < 20 THEN 'teen'
                       WHEN age < 30 THEN 'twenties'
                       ELSE 'over thirties' END AS age_group
FROM table_name;

SELECT文の注意点と最適化

こちらでは、PostgreSQLのSELECT文を効率的に使うためのヒントと注意点を解説します。

これらを知ることで、より高速で安全なクエリを作成できるでしょう。

  • インデックスを使った効率的な検索
  • 適切なデータ型を選ぶことの重要性
  • クエリのパフォーマンスを計測する方法
  • SELECT文におけるSQLインジェクション対策

インデックスを使った効率的な検索

インデックスは、データベースの検索性能を向上させるためのもの。

適切にインデックスを設定することで、特定のカラムの検索速度を大幅に上げることが可能です。

例えば、以下のようにインデックスを設定できます。

CREATE INDEX idx_table_name_age ON table_name(age);

適切なデータ型を選ぶことの重要性

データ型の選択は、データベースの性能に大きな影響を及ぼします。

例えば、小数を取り扱う場合、数値データ型(INTEGER, DECIMALなど)を使用するべきです。

以下は一般的なPostgreSQLのデータ型の一覧表です。

データ型説明
integer整数を表すデータ型42
numeric固定精度の数値を表すデータ型3.14
text可変長のテキスト文字列を表すデータ型‘Hello, World!’
boolean真偽値を表すデータ型true
date日付を表すデータ型‘2023-06-07’
time時刻を表すデータ型’13:30:00′
timestamp日付と時刻を表すデータ型‘2023-06-07 13:30:00’
interval期間を表すデータ型‘2 days’
jsonJSON形式のデータを格納するデータ型‘{“name”: “John”, “age”: 30}’
array複数の値を持つ配列を表すデータ型‘{1, 2, 3}’

これらのデータ型を使用して、様々な種類のデータをPostgreSQLデータベース内で格納および操作できます。

クエリのパフォーマンスを計測する方法

クエリのパフォーマンスを計測するためには、EXPLAIN句を使用します。

これにより、クエリの実行計画を確認し、どの部分が遅いのか、どの部分を最適化すべきかを判断できます。

例えば、以下のように使用できます。

EXPLAIN SELECT * FROM table_name;

SELECT文におけるSQLインジェクション対策

SQLインジェクションは、不正なSQLを注入し、データベースを不正に操作する攻撃手法です。

これを防ぐためには、ユーザからの入力をそのままクエリに組み込むのではなく、プレースホルダやパラメータ化クエリを使用することが推奨されます。

これらの注意点と最適化の方法を理解することで、PostgreSQLのSELECT文を効率的かつ安全に使用することが可能となります。

まとめ

当記事では、PostgreSQLのSELECT文の基本と応用について学習してきました。

  • データベースとテーブルの基本的な概念
  • SELECT文の基本的な構文とパラメータと具体的な使用例
  • SELECT文の使い方

これらの知識は、データベースのパフォーマンスを最大限に引き出すために重要です。

さらに深い知識を得るためには、PostgreSQLの公式ドキュメンテーションや関連リソースを活用することをおすすめします。

具体的には、JOIN句の詳細な使い方、ビューの作成と利用、トランザクションの管理、さらにはストアドプロシージャやトリガーなどの高度な機能について学ぶことが有益です。

当記事を通じて、PostgreSQLのSELECT文を理解し、適用する能力が向上したことを願っています。

さらに深い理解と実践のために、今後も学びを続けてください。

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