PostgreSQL 入門

SQL 基礎構文と演算子

SQL 構文は、リレーショナルデータベースと対話するためのクエリ作成における構造を提供します。この構文をマスターすることは、効率的なデータの抽出、操作、管理を行うための基礎となります。演算子(Operators)を理解することで、SQL クエリ内での条件指定、計算の実行、値の比較が可能になります。本章では、SQL の基礎構文を紹介し、様々な種類の演算子を導入するとともに、クエリ内でそれらを効果的に使用する方法をデモンストレーションします。

1. SQLの基本構文

SQL 構文は、有効な SQL 文(Statements)を構成するためのルールとキーワードのセットに基づいています。SQL 文はデータベースシステムに対する命令です。SQL は ANSI(米国国家規格協会)によって標準化されていますが、PostgreSQL を含む各データベースシステムによって細かな差異が存在する場合があります。

1.1 SQLのコアコンポーネント

完全な SQL 文がどのように構成されているかを理解するために、以下のコアコンポーネントを参照してください。

  • 句 (Clauses): 句は SQL 文の中で特定の操作を実行するコンポーネントです。一般的な句には SELECTFROMWHEREORDER BYGROUP BYHAVING があります。各句には特定の用途があり、規定の順序で記述されます。
  • 文 (Statements): 文は SQL における一つの完全な命令です。典型的な SQL 文は一つ(または複数)の句を含み、セミコロン (;) で終わります。ただし、多くの PostgreSQL 環境、特に単一のクエリを実行する場合、セミコロンは通常オプション(任意)です。
  • 式 (Expressions): 式は、値、演算子、および関数の組み合わせであり、データベースがこれを評価して一つの値を生成します。式は通常 SELECT リストや WHERE 句で使用されます。
  • 述語 (Predicates): 述語は、評価結果が 真 (true)、偽 (false)、または 不明 (unknown) となる条件です。これらは主に WHERE 句で使用され、特定の基準に基づいてデータをフィルタリング(Filtering)します。
  • クエリ (Queries): クエリはデータベースからデータをリクエストする操作です。通常、SELECT 文とその他の句を使用して作成され、どのデータを取得し、どのように整理するかを指定します。

2. 基本的な SELECT 文

SELECT 文は SQL においてデータをクエリするための基礎です。

構文:

SELECT column1, column2, ...
FROM table_name;

例:employee_idfirst_namelast_namesalary などのカラム(列)を含む employees テーブルがあると仮定します。

SELECT employee_id, first_name, last_name
FROM employees;

このクエリは、employees テーブルのすべての行から employee_idfirst_namelast_name を抽出します。

2.1 すべてのカラムを抽出する

テーブルからすべてのカラムを選択するには、アスタリスク * を使用します。

SELECT *
FROM employees;

これは employees テーブルの各行にあるすべてのカラムを取得します。アドホック(Ad-hoc)なクエリやデータ探索には非常に便利ですが、プロダクション環境(Production environment)では、パフォーマンス向上と明快さのために、必要なカラムを明示的に指定することが推奨されます。

3. エイリアス(Aliases)の活用

エイリアスを使用すると、カラムやテーブルに一時的な名称を付与でき、クエリの可読性を高め、理解しやすくすることができます。

3.1 カラムエイリアス

SELECT first_name AS given_name, last_name AS surname
FROM employees;

この例では、結果セットにおいて first_namegiven_namelast_namesurname というエイリアスが設定されています。

3.2 テーブルエイリアス

テーブルエイリアスは、結合(Joins)を処理する際に特に有用です(詳細は後続のモジュールで説明します)。

-- employees テーブルに e、departments テーブルに d というエイリアスを付与
SELECT e.first_name, d.department_name
FROM employees AS e
JOIN departments AS d ON e.department_id = d.department_id;

ここでは、employees テーブルが edepartments テーブルが d と命名されています。これによりクエリが簡素化され、読みやすくなります。

4. 大文字・小文字の区別

SQL キーワードは通常、大文字と小文字を区別しませんが、可読性を高めるために大文字で記述するのがベストプラクティスです。テーブル名やカラム名が大文字・小文字を区別するかどうかは、データベースの設定に依存します。PostgreSQL では、引用符で囲まれていない識別子は自動的に小文字に変換されます。識別子を二重引用符(例:"MyTable")で囲むと、大文字・小文字が区別されるようになります。

SELECT FirstName FROM Employees; -- 構文として有効だが、このスタイルは非推奨
SELECT firstname FROM employees; -- 構文として有効だが、このスタイルは非推奨
SELECT firstname FROM Employees; -- テーブルの定義によってはエラーになる可能性がある
SELECT FIRST_NAME FROM EMPLOYEES; -- 推奨されるコードスタイル

5. SQL 演算子

演算子(Operators)は、一つ以上の式に対して操作を実行する記号またはキーワードです。これらは条件の構築、計算の実行、およびデータの操作に使用されます。

5.1 演算子の種類

SQL 演算子は大きく以下のカテゴリーに分けられます。

  • 比較演算子: 二つの式を比較するために使用します。
  • 論理演算子: 条件を組み合わせたり否定したりするために使用します。
  • 算術演算子: 数学的な計算を実行するために使用します。
  • 文字列演算子: 文字列を操作するために使用します。
  • ビット演算子: ビット単位の操作を実行するために使用します(標準 SQL では稀ですが、PostgreSQL では利用可能です)。

6. 比較演算子

比較演算子は WHERE 句で使用され、指定された条件に基づいてデータをフィルタリングします。

演算子説明
=等しいWHERE salary = 50000
!= または <>等しくないWHERE salary != 50000
>より大きいWHERE salary > 50000
<より小さいWHERE salary < 50000
>=以上WHERE salary >= 50000
<=以下WHERE salary <= 50000
BETWEEN範囲内(境界を含む)WHERE salary BETWEEN 40000 AND 60000
LIKEパターンマッチングWHERE first_name LIKE 'A%'
INリスト内のいずれかの値に一致WHERE department_id IN (1, 2, 3)
IS NULLNULL値のチェックWHERE email IS NULL
IS NOT NULL非NULL値のチェックWHERE email IS NOT NULL

例を用いた応用:

等しい:

SELECT first_name, salary
FROM employees
WHERE salary = 60000;
-- 給与がちょうど 60000 の全従業員の first_name と salary を取得

等しくない:

SELECT first_name, salary
FROM employees
WHERE department_id <> 5;
-- 部門IDが 5 ではない全従業員の first_name と salary を取得

より大きい:

SELECT first_name, salary
FROM employees
WHERE salary > 75000;
-- 給与が 75000 を超える全従業員の first_name と salary を取得

以下:

SELECT first_name, hire_date
FROM employees
WHERE hire_date <= '2020-01-01';
-- 2020年1月1日以前に入社した全従業員の first_name と hire_date を取得

BETWEEN (〜の間):

SELECT first_name, salary
FROM employees
WHERE salary BETWEEN 50000 AND 70000;
-- 給与が 50000 から 70000 の範囲内(両端を含む)の全従業員を取得

LIKE (曖昧検索):

LIKE 演算子はパターンマッチングに使用されます。% は 0 文字以上の任意の文字列、_ は任意の 1 文字を表します。

SELECT first_name
FROM employees
WHERE first_name LIKE 'J%';
-- 名前が 'J' で始まる全従業員の first_name を取得
SELECT first_name
FROM employees
WHERE last_name LIKE '_ohn%';
-- 名字の 2文字目から 4文字目が 'ohn' である全従業員の first_name を取得

IN (〜に含まれる):

SELECT first_name, department_id
FROM employees
WHERE department_id IN (1, 3, 5);
-- 部門IDが 1、3、または 5 に属する全従業員を取得

IS NULL / IS NOT NULL (空 / 非空):

SELECT first_name, email
FROM employees
WHERE email IS NULL;
-- メールアドレスが記録されていない (NULL) 全従業員を取得
SELECT first_name, email
FROM employees
WHERE email IS NOT NULL;
-- メールアドレスが記録されている (NOT NULL) 全従業員を取得

7. 論理演算子

論理演算子は WHERE 句で条件を組み合わせたり否定したりするために使用されます。

演算子説明
AND論理積(かつ)WHERE salary > 50000 AND department_id = 1
OR論理和(または)WHERE department_id = 1 OR department_id = 2
NOT論理否定(〜ではない)WHERE NOT department_id = 3

例を用いた応用:

AND (かつ):

SELECT first_name, salary, department_id
FROM employees
WHERE salary > 50000 AND department_id = 1;
-- 給与が 50000 を超え、かつ 部門IDが 1 の全従業員を抽出

OR (または):

SELECT first_name, salary, department_id
FROM employees
WHERE department_id = 1 OR department_id = 2;
-- 部門IDが 1 または 2 に属する全従業員を抽出

NOT (〜ではない):

SELECT first_name, department_id
FROM employees
WHERE NOT department_id = 3;
-- 部門IDが 3 ではない全従業員を抽出

AND、OR、NOT の組み合わせ:
複数の論理演算子を組み合わせる場合は、括弧 () を使用して評価順序を明確にします。

SELECT first_name, salary, department_id
FROM employees
WHERE (salary > 50000 AND department_id = 1) OR department_id = 2;
-- 「給与が 50000 を超え、かつ部門IDが 1」または「部門IDが 2」の従業員を抽出

8. 算術演算子

算術演算子は数値に対して数学的な計算を実行します。

演算子説明
+加算SELECT salary + 1000 FROM employees
-減算SELECT salary - 1000 FROM employees
*乗算SELECT salary * 1.1 FROM employees
/除算SELECT salary / 12 FROM employees
%剰余(余り)SELECT employee_id % 2 FROM employees

例を用いた応用:

加算:

SELECT first_name, salary, salary + 1000 AS increased_salary
FROM employees;
-- 各従業員の現在の給与に 1000 を加算した increased_salary を計算

乗算:

SELECT first_name, salary, salary * 0.10 AS bonus
FROM employees;
-- 現在の給与の 10% にあたるボーナス bonus を計算

除算:

SELECT first_name, salary, salary / 12 AS monthly_salary
FROM employees;
-- 年収を 12 で割り、月給 monthly_salary を計算

9. 文字列演算子

文字列演算子は文字列データを操作するために使用されます。PostgreSQL は豊富な文字列関数と演算子を提供しています。

演算子説明
LIKEパターンマッチングWHERE first_name LIKE 'A%'
NOT LIKEパターンの否定WHERE first_name NOT LIKE 'A%'
||文字列連結SELECT first_name || ' ' || last_name

例を用いた応用:

結合 (Concatenation):

SELECT first_name || ' ' || last_name AS full_name
FROM employees;
-- first_name と last_name をスペースで繋ぎ、full_name(フルネーム)を生成

LIKE:

SELECT first_name
FROM employees
WHERE first_name LIKE 'J%';
-- 'J' で始まるすべての first_name を抽出

NOT LIKE:

SELECT first_name
FROM employees
WHERE first_name NOT LIKE 'J%';
-- 'J' で始まらないすべての first_name を抽出