SQL 関連用語 20 選

本記事では、SQL を学ぶ上で重要な用語の解説をします。

# 1. SQL
**SQL** とは Structured Query Language の略で、**リレーショナルデータベース管理システム**（RDBMS）内で**データを管理するための言語**です。読み方は「エスキューエル」もしくは「シークェル」です。

以下のような **SQL 文**（SQL statement）と呼ばれる命令文を用いて、データベースに対して様々な操作を行います。
```sql:SQL 文
SELECT name, salary FROM employees;
```

# 2. データベース

**データベース**とは**構造化されたデータの集まり**を指します。**構造化**とはデータが規則的な形式で整理されていることを意味します。

:::note
**データ**とは観測された事象や現象を数値や文字、画像、音声などの形式で表したものです。例）売上高、気温、商品名
:::

データベースはその構造によって「**階層型**」や「**ネットワーク型**」、「**リレーショナル型**」などに分類されます。

データベースを管理するためのソフトウェアである**データベース管理システム**（DBMS）を、略してデータベースと呼ぶ場合もあります。


# 3. リレーショナルデータベース
**リレーションデータベース**（RDB）は**関連性を持つデータ**を**テーブル**という形式で論理的に整理し、管理するデータベースです。 

リレーショナルデータベースの仕組みを実装したソフトウェアは**リレーショナルデータベース管理システム**（RDBMS）と呼ばれています。

代表的な RDBMS としては MySQL、PostgreSQL、Oracle Database などがあります。

RDBMS は**データの永続化と管理を担当**します。**SQL** を用いて、データベース内に**テーブル**や**関係**を定義し、データを格納、取得、更新、削除などの操作を行います。

# 4. テーブル
**テーブル**は**行**（レコード）と**列**（カラム）で構成されています。

![テーブル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/d67bf715-6870-2451-1de6-2e1cc92e4099.png)

**レコード**は特定の**エンティティ** (顧客、商品など) に関する情報を格納します。 **カラム**はレコード内の特定の**属性** (名前、価格など) を格納します。また、レコードを構成する 1 つ 1 つの要素は**フィールド**と呼ばれます。

# 5. 主キーと外部キー
各レコードには、テーブル内の各レコードを**一意に識別**するための**主キー**（Primary Key）があります。主キーは **1 つのカラム**または**複数のカラムの組み合わせ**で構成されます。

以下の `departments` テーブルでは**主キー**は `id` カラムです。このカラムは各レコードを**一意に識別**します。（`name` カラムも各レコードを一意に識別できるので主キーにすることができます）
```: departments テーブル
+-----+-----------+
| id  | name      |
+-----+-----------+
| 1   | 営業部     |
+-----+-----------+
| 2   | 開発部     |
+-----+-----------+
```
また、主キーは他のテーブルとの**リレーションシップ**（関係性）を表現するために使用されることがあります。この場合、他のテーブルの主キーを参照するカラムは**外部キー**（Foreign Key）と呼ばれます。

以下の `employees` テーブルでは**外部キー**は `department_id` カラムです。このカラムは `departments` テーブルの id カラムを参照し、各従業員が所属する部門を示します。

```: employees テーブル
+-----+-----------+-----------+---------------+
| id  | name      | salary    | department_id |
+-----+-----------+-----------+---------------+
| 1   | 田中 太郎  | 123456.78 | 1             |
+-----+-----------+-----------+---------------+
| 2   | 山田 花子  | 987654.32 | 2             |
+-----+-----------+-----------+---------------+
| 3   | 鈴木 次郎  | 567890.12 | 1             |
+-----+-----------+-----------+---------------+
```

# 6. スキーマ
**スキーマ**（schema）とはデータベースの構造のことです。設計図のようなものです。

**スキーマの三層モデル**
データベースのスキーマは、通常、以下の 3 つの層に分けられます。

1. 外部スキーマ（External Schema）
2. 概念スキーマ（Conceptual Schema）
3. 内部スキーマ（Internal Schema）

**概念スキーマ**はデータベース全体の論理構造を定義するためのものです。リレーショナルデータベースの場合は、テーブルの定義やリレーションシップ、制約などを含みます。

**外部スキーマ**は、リレーショナルデータベースの**ビュー**にあたる部分です。特定のユーザーやアプリケーションが必要とするデータだけを提供し、不要なデータへのアクセスを防ぎます。
 
**内部スキーマ**は、データの**物理的な**ストレージ構造を定義します。


# 7. 標準 SQL と方言
**標準SQL** とは、国際標準化機構 (ISO) やアメリカ国家標準協会 (ANSI) などの標準化団体によって定められた、SQL の仕様です。 標準 SQL は、 RDBMS の種類に依存せず、共通の SQL 構文を使用できることを目的としています。

1986 年に最初の標準 SQL 規格である `SQL-86` が制定されました。ここ最近では 2011 年に `SQL:2011`、2016 年に `SQL:2016`、2023 年に `SQL:2023` と、約 5 年ごとに改訂されています。

一方、**方言**は、各 RDBMS が独自に拡張した機能であり、標準 SQL には含まれていない機能です。 例えば、Oracle Database には `DECODE` と呼ばれる独自の拡張コマンドがあります。

しかし、方言は他の RDBMS では利用できないため、データベースの移植性や相互運用性を低下させる可能性があります。

# 8. SQL コマンド
SQL を構成する個別の命令は **SQL コマンド**と呼ばれています。

SQL コマンドは以下の 4 つに分類されます。

1. **DDL**（データ定義言語）
    データベースの構造を定義するコマンド。
    例) `CREATE`, `ALTER`, `DROP`, `TRUCATE`
2. **DML**（データ操作言語）
    データの検索、追加、削除、更新、検索を行うコマンド。
    例) `SELECT`, `INSERT`, `UPDATE`, `DELETE`
3. **DCL**（データ制御言語）
    データベースのアクセス権を制御するコマンド。
    例) `GRANT`, `REVOKE`
4. **TCL**（トランザクション制御言語）
    トランザクションを管理するコマンド。
    例) `COMMIT`, `ROLLBACK`, `SAVEPOINT`

これらの SQL コマンドを組み合わせることで、データベースに対して様々な操作を行うことができます。

# 9. キーワード と 予約語
**キーワード**とは SQL 文で**特別な意味を持つ単語**のことです。

キーワードは、上記で紹介した **SQL コマンド**以外に、`FROM` や `WHERE` などの **SQL コマンドを補完**するものも含まれます。

以下は `employees` テーブルから `name` カラムと `salary` カラムのデータを取得する SQL 文です。
```sql:SQL 文
    SELECT name, salary FROM employees;
    ------              ----
    keyword            keyword
```

キーワードは、予約キーワード（**予約語**）と未予約キーワードに分類されます。**予約語**は、通常は**識別子（例: テーブル名やカラム名）として使うことができない単語**です。
RDBMS の種類やそのバージョンによって、そのキーワードが予約語なのか変わります。

## 重要なキーワード
| キーワード  | 説明                   |
|-------------|------------------------|
| `WHERE`     | 検索条件を指定                |
| `DISTINCT`  | 重複するレコードを除外             |
| `LIMIT`     | 取得するレコード数の制限     |
| `ORDER BY`  | 並べ替え               |
| `DESC`      | 降順                   |
| `ASC`       | 昇順                   |
| `AS`        | 別名                   |
| `FROM`      | データソース指定       |
| `INSERT`    | データの挿入           |
| `VALUES`    | 値の指定               |
| `CASE`      | 条件式                 |
| `DEFAULT`   | デフォルト値を指定           |
| `GROUP BY`  | グループ化             |
| `HAVING`    | グループに対する条件   |


キーワードの例は全て**大文字**で示しました。**小文字**でも問題ありませんが、慣習として**大文字**を用います。キーワードとカラム名やテーブル名を区別し、SQL 文を読みやすくします。


キーワードや予約語について詳しくは以下を参照してください。
- [MySQL :: MySQL 8.0 Reference Manual :: 11.3 Keywords and Reserved Words](https://dev.mysql.com/doc/refman/8.0/en/keywords.html)
- [PostgreSQL: Documentation: 16: Appendix C. SQL Key Words](https://www.postgresql.org/docs/current/sql-keywords-appendix.html)
- [Oracle Reserved Words, Keywords, and Namespaces](https://docs.oracle.com/cd/A97630_01/appdev.920/a42525/apb.htm)
- [SQLite Keywords](https://sqlite.org/lang_keywords.html)

# 10. 句
**句**（clause）は SQL 文の一部を構成するセクションです。句は、キーワードとそれに続く要素（データ項目名、テーブル名、検索条件式など）で構成されます。


```sql:SQL 文
    keyword        keyword       keyword          keyword
    ------          ----         --------          ----
    SELECT column_2 FROM table_1 ORDER BY column_2 DESC;
    --------------- ------------ ----------------------
        clause         clause            clause
```

# 11. 文
**文**（statement）は、データベースに対して実行する**完全な**命令です。**クエリ**とも呼ばれています。文は `;` で終わります。ただ、SQLite など、RDBMS によっては `;` を省略できるものもあります。

```sql:SQL 文
                         statement
    --------------------------------------------------
    SELECT column_2 FROM table_1 WHERE column_2 > 1000;
    --------------- ------------ ---------------------
        clause         clause           clause
```

`SELECT` から始まる文は `SELECT`、`UPDATE` から始まる文は `UPDATE` 文と呼びます。`FROM` 文や `WHERE` 文と呼び方はしません。


# 12. 式
**式**（expression）はデータベース内で**値を生成**するために使用されます。例えば、算術式、比較式 、論理式などがあります。

- **算術式** (Arithmetic Expressions)
  `+`, `-`, `*`, `/` などの算術演算子を使用して数値を計算
  例) `price * quantity`
- **文字列式** (String Expressions)
  文字列の連結
  例) `first_name || ' ' || last_name`
- **比較式** (Comparison Expressions)
  `=`, `<>`, `>`, `<` などの比較演算子を使用して値を比較
  例) `salary >= 50000`
- **論理式**(Logical Expressions)
  論理演算子（`AND`, `OR`, `NOT`）を使用して条件を評価
  例) `age > 18 AND city = 'Tokyo'`
- **関数**
  組み込み関数やユーザー定義関数を呼び出して結果を計算
  例) `SUM(price)`, `ROUND(average, 2)`


`SELECT` 文の中で使用される列の値や `WHERE` 句で条件式として使われることが一般的です。
```sql
                                                              expression
                                                                ------
SELECT price * quantity AS total_price FROM orders WHERE name = 'apple';
       ----------------                                  --------------
          expression                                       expression
```

SQL の式には数値や文字列などの**リテラル**（literal）も含まれます。

# 13. 述語
述語（Predicate）は式の一種で、`TRUE`、`FALSE`、または `UNKNOWN` に評価される式です。述語は、条件を指定するために使用され、`WHERE` 句、`HAVING` 句などでよく使われます。


**述語の種類**
- **比較式**
    - 比較演算子（`=`, `<=`）が使用される
    - 例) `salary > 50000`
- **論理式**
    - 論理演算子（`AND`, `BETWEEN`）が使用される
    - 例) `salary > 50000 AND department = 'HR'`





# 14. リテラル
リテラルは SQL 文で直接使用される**数値、文字列、日付などの固定値**のことを指します。

- **数値リテラル**（Numeric Literals）
  固定長の整数や浮動小数点数などの数値を表します。
  例) `123`, `1.23`
- **文字列リテラル**（String Literals）
  シングルクォート（`'`）で囲まれた文字列を表します。
  例) `'Hello, World!'`
- **日時リテラル**（Date Literals）
  日付リテラルは標準的な日付フォーマットで表現される日付を表します。
  例) `'1998-12-25'`

リテラルは、**他の式と組み合わせて使用**されます。
```sql: 算術式とリテラル
SELECT salary + 5000 AS increased_salary FROM employees;
                ----
               literal
```

詳しくは以下を参照してください。
- [MySQL :: MySQL 8.0 Reference Manual :: 11.1 Literal Values](https://dev.mysql.com/doc/refman/8.0/ja/literals.html)
- [PostgreSQL: Documentation: 16: 4.1. Lexical Structure](https://www.postgresql.org/docs/current/sql-syntax-lexical.html)
- [Oracle Database Documentation - Literals](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Literals.html)

# 15. 演算子
**演算子**（operator）は、式や値に対して特定の操作を行うためのシンボルです。

## 算術演算子

| 演算子 | 説明   | 例 |
|--------|--------|----|
| `+`    | 加算   | `3 + 5` |
| `-`    | 減算   | `10 - 4` |
| `*`    | 乗算   | `6 * 7` |
| `/`    | 除算   | `20 / 4` |
| `%`    | 剰余   | `10 % 3` |
| `^`    | べき乗 | `2 ^ 3` |

## ビット演算子

| 演算子 | 説明          | 例 |
|--------|---------------|----|
| `~`    | ビット反転    | `~5` |
| `&`    | ビット AND     | `6 & 3` |
| `\|`   | ビット OR      | `6 \| 3` |
| `^`    | ビット XOR     | `6 ^ 3` |
| `<<`   | ビット左シフト| `1 << 2` |
| `>>`   | ビット右シフト| `8 >> 2` |

## 比較演算子

| 演算子 | 説明          | 例 |
|--------|---------------|----|
| `=`    | 等しい        | `column = 5` |
| `<`    | より小さい    | `column < 5` |
| `>`    | より大きい    | `column > 4` |
| `<=`   | 以下          | `column <= 5` |
| `>=`   | 以上          | `column >= 2` |
| `!=`   | 等しくない    | `column != 3` |
| `<>`   | 等しくない    | `column <> 3` |

## 論理演算子

| 演算子     | 説明         | 例 |
|------------|--------------|----|
| `AND`      | 論理積       | `true AND false` |
| `OR`       | 論理和       | `true OR false` |
| `NOT`      | 否定         | `NOT true` |
| `ANY`      | いずれか     | `ANY(1, 2, 3) = 2` |
| `SOME`     | いずれか     | `SOME(1, 2, 3) = 4` |
| `ALL`      | すべて       | `ALL(1, 2, 3) < 4` |
| `BETWEEN`  | 範囲         | `column BETWEEN 1 AND 10` |
| `IN`       | 内に含まれる | `column IN ('a', 'b', 'c')` |
| `EXISTS`   | 存在する     | `EXISTS (SELECT * FROM table)` |
| `IS`       | 等しい       | `column IS 5` |
| `IS NOT`   | 等しくない   | `column IS NOT 3` |
| `LIKE`     | パターンマッチ| `column LIKE 'a%'` |
| `IS NULL`  | NULLである   | `value IS NULL` |
| `IS UNIQUE`| 一意である   | `column IS UNIQUE` |

## 複合演算子

| 演算子 | 説明             | 例 |
|--------|------------------|----|
| `+=`   | 加算して代入     | `a += 5` |
| `-=`   | 減算して代入     | `a -= 2` |
| `*=`   | 乗算して代入     | `a *= 3` |
| `/=`   | 除算して代入     | `a /= 4` |
| `%=`   | 剰余して代入     | `a %= 3` |
| `&=`   | ビットANDして代入| `a &= 1` |
| `^=`   | ビットXORして代入| `a ^= 2` |
| `\|=`  | ビットORして代入 | `a \|= 4` |

## 文字列演算子

| 演算子 | 説明             | 例 |
|--------|------------------|----|
| `\|\|`   | 文字列の連結     | `'Hello' \|\| ' World'` |



# 16. 関数
SQL で使用される関数（functions）には、集計関数や文字列関数、日付関数など、さまざまな種類があります。

## 集計関数
| 関数   | 説明       | 例                  |
|--------|-----------|---------------------|
| `AVG`  | カラムの平均値    | `AVG(column)` |
| `COUNT`| レコード数  | ` COUNT(*) `, `COUNT(column)` |
| `MAX`  | カラムの最大値    | ` MAX(column)` |
| `MIN`  | カラムの最小値    | `MIN(column)` |
| `SUM`  | カラムの合計値    | `SUM(column)` |

## 文字列関数
| 関数       | 説明                    | 例                                  |
|------------|-------------------|------------------------------------------|
| `CONCAT`   | 文字列を連結        | `CONCAT('Hello', ' ', 'World')`          |
| `SUBSTRING`| 文字列の一部を抽出  | `SUBSTRING(column, start, length)`  |
| `LENGTH`   | 文字列の長さを取得  | `LENGTH(column)`                    |
| `UPPER`    | 文字列を大文字に変換| `UPPER(column)`                     |
| `LOWER`    | 文字列を小文字に変換| `LOWER(column)`                     |

## 日付関数
| 関数        | 説明                        | 例      |
|-------------|------------------|----------------------------------|
| `NOW`       | 現在の日時を取得    | `NOW()`                          |
| `CURDATE`   | 現在の日付を取得    | `CURDATE()`                      |
| `CURTIME`   | 現在の時刻を取得    | `CURTIME()`                      |
| `DATEDIFF`  | 2 つの日付の差を日数で取得| `DATEDIFF(date1, date2)`            |
| `DATE_ADD`  | 日付に時間を追加   | `DATE_ADD(date, INTERVAL value unit)`   |

## 数学関数 (Mathematical Functions)

| 関数      | 説明                  | 例                       |
|-----------|-----------------------|--------------------------|
| `ABS`     | 絶対値を取得する      | `ABS(-5)`                |
| `CEIL`    | 数値を切り上げる      | `CEIL(4.3)`              |
| `FLOOR`   | 数値を切り捨てる      | `FLOOR(4.7)`             |
| `ROUND`   | 数値を四捨五入する    | `ROUND(4.567, 2)`        |
| `POWER`   | 数値のべき乗を計算する| `POWER(2, 3)`            |

## 条件付き関数 (Conditional Functions)

| 関数      | 説明                    | 例                                 |
|-----------|---------------------|---------------------------------------|
| `IF`      | 条件に基づいて値を返す  | `IF(condition, value_if_true, value_if_false)` |
| `CASE`    | 複数の条件に基づいて値を返す| `CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE resultN END` |
| `COALESCE`| NULL以外の最初の値を返す| `COALESCE(column1, column2, 'default_value')` |
| `NULLIF`  | 2つの引数が等しい場合にNULLを返す| `NULLIF(column1, column2)` |

## その他の便利な関数

| 関数      | 説明                    | 例                                      |
|-----------|-------------------------|-----------------------------------------|
| `GREATEST`| 最大値を返す            | `GREATEST(value1, value2, value3)`      |
| `LEAST`   | 最小値を返す            | `LEAST(value1, value2, value3)`         |
| `IFNULL`  | NULLの場合に代替値を返す| `IFNULL(column, 'default_value')`       |
| `CAST`    | データ型を変換する      | `CAST(column AS new_data_type)`         |
| `CONVERT` | データ型を変換する      | `CONVERT(column, new_data_type)`        |


# 17. データベースオブジェクト
**データベースオブジェクト**（database objects）は、データベース内でデータを管理するために使用される**構造化された要素**です。`TABLE`、`VIEW`、`INDEX` などがあります。

| オブジェクト | 説明                                                   |
|--------------|--------------------------------------------------------|
| `TABLE`      | データを格納するための構造化された形式のオブジェクト。テーブルはレコードとカラムで構成される。 |
| `VIEW`       | 仮想的な表現を提供するオブジェクト。実際のデータを基に定義され、SQL 文を実行することで動的に結果を生成する。 |
| `SYNONYM`    | 他のデータベースオブジェクト（通常はテーブルまたはビュー）に対する別名を提供するオブジェクト。 |
| `SEQUENCE`   | 一意の数値を生成するためのオブジェクト。主にシーケンス（連番）を生成するために使用され、主キーの値の生成に利用されることがある。 |
| `INDEX`      | データベースのパフォーマンス向上を目的として、特定のカラムや組み合わせに対する高速なデータアクセスを提供するために使用されるオブジェクト。 |
| `TRIGGER`    | データベース内の特定のイベント（例: レコードの挿入、更新、削除）が発生した際に自動的に実行されるプログラム。 |


# 18. データ型
**データ型**はデータベース内で扱うデータの形式を定義するための重要な概念です。

## 数値型
数値データ（Numeric Types）を表現するためのデータ型です。主に整数と浮動小数点数があります。

- **整数型 (Integer Types)**
  - `INT` または `INTEGER`: 標準的な整数型。4 バイト
  - `SMALLINT`: 小さい範囲の整数型。2 バイト
  - `BIGINT`: 大きな範囲の整数型。8 バイト
- **浮動小数点型 (Floating-Point Types)**
  - `FLOAT`: 単精度浮動小数点数。
  - `DOUBLE`: 倍精度浮動小数点数。8 バイト
  - `REAL`: 倍精度浮動小数点数。4 バイト

## 文字列型
文字列型（String Types）を表現するためのデータ型です。固定長と可変長の文字列型があります。

- **固定長文字列型 (Fixed-Length String Types)**
  - `CHAR(n)`: n文字の固定長文字列。
- **可変長文字列型 (Variable-Length String Types)**
  - `VARCHAR(n)`: 最大長がn文字の可変長文字列。
  - `TEXT`: 非常に長い可変長文字列。



## 日付と時刻型
日付、時刻、および日時データを表現するためのデータ型です。

- **日付型 (Date Types)**
  - `DATE`: 年、月、日を表す日付型。
- **時刻型 (Time Types)**
  - `TIME`: 時、分、秒を表す時刻型。
  - `TIMESTAMP`: 日付と時刻の組み合わせを表す型。


## その他のデータ型

- **ブール型 (Boolean Type)**
  - `BOOLEAN` または `BOOL`: 真偽値を表す型。
- **バイナリ型 (Binary Types)**
  - `BLOB`: バイナリデータを格納する型。
- **列挙型 (Enumerated Types)**
  - `ENUM`: 事前に定義された値の中から1つを選択する型。

## NULL 値
すべてのデータ型は **NULL 値**（値が存在しないことを表す）を許容することができます。

## カスタム型
一部の DBMS では、ユーザーが独自のカスタムデータ型を定義することができる場合があります。


# 19. 制約
**制約**（Constraint）はデータベースの**整合性を確保**するために利用されます。

例えば、`NOT NULL` 制約は重要な情報が欠落しないように保証し、`UNIQUE` 制約は重複したデータの挿入を防ぎます。

| 制約         | 説明                   |
|--------------|------------------------|
| `NOT NULL`   | NULL値を許可せず、必ず値が入力されることを強制    |
| `UNIQUE`     | 特定のカラムで重複する値を許さない         |
| `PRIMARY KEY`| テーブル内の各レコードを一意に識別             |
| `FOREIGN KEY`| 異なるテーブル間の関連性を確立             |
| `CHECK`      | 特定の条件を満たすデータのみを許可             |
| `DEFAULT`    | デフォルト値           |

これらの制約はテーブルの作成や変更時に使用します。
```sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) UNIQUE,
    nickname VARCHAR(100) DEFAULT 'Unknown',
    password VARCHAR(100)
);
```

複数の制約を1つの列に適用することもできます。

```sql
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE
);
```

これらの制約は、データの正確性と整合性を保証し、不正なデータの挿入や変更を防ぐために非常に重要です。

# 20. トランザクション
トランザクション（Transaction）はデータベースにおける操作の論理的な単位を指します。一連のデータベース操作（例えば、データの挿入、更新、削除など）をまとめて 1 つの処理として扱うことができます。

例えば、銀行の ATM から現金を引き出す際には、口座残高を減らし、お金を提供するという操作が 1 つのトランザクションとして扱われ、途中でエラーが発生しても、顧客の残高が正確に反映されるように保証されます。