本記事では、SQL を学ぶ上で重要な用語の解説をします。
1. SQL
SQL とは Structured Query Language の略で、リレーショナルデータベース管理システム(RDBMS)内でデータを管理するための言語です。読み方は「エスキューエル」もしくは「シークェル」です。
以下のような SQL 文(SQL statement)と呼ばれる命令文を用いて、データベースに対して様々な操作を行います。
SELECT name, salary FROM employees;
2. データベース
データベースとは構造化されたデータの集まりを指します。構造化とはデータが規則的な形式で整理されていることを意味します。
データとは観測された事象や現象を数値や文字、画像、音声などの形式で表したものです。例)売上高、気温、商品名
データベースはその構造によって「階層型」や「ネットワーク型」、「リレーショナル型」などに分類されます。
データベースを管理するためのソフトウェアであるデータベース管理システム(DBMS)を、略してデータベースと呼ぶ場合もあります。
3. リレーショナルデータベース
リレーションデータベース(RDB)は関連性を持つデータをテーブルという形式で論理的に整理し、管理するデータベースです。
リレーショナルデータベースの仕組みを実装したソフトウェアはリレーショナルデータベース管理システム(RDBMS)と呼ばれています。
代表的な RDBMS としては MySQL、PostgreSQL、Oracle Database などがあります。
RDBMS はデータの永続化と管理を担当します。SQL を用いて、データベース内にテーブルや関係を定義し、データを格納、取得、更新、削除などの操作を行います。
4. テーブル
テーブルは行(レコード)と列(カラム)で構成されています。
レコードは特定のエンティティ (顧客、商品など) に関する情報を格納します。 カラムはレコード内の特定の属性 (名前、価格など) を格納します。また、レコードを構成する 1 つ 1 つの要素はフィールドと呼ばれます。
5. 主キーと外部キー
各レコードには、テーブル内の各レコードを一意に識別するための主キー(Primary Key)があります。主キーは 1 つのカラムまたは複数のカラムの組み合わせで構成されます。
以下の departments
テーブルでは主キーは id
カラムです。このカラムは各レコードを一意に識別します。(name
カラムも各レコードを一意に識別できるので主キーにすることができます)
+-----+-----------+
| id | name |
+-----+-----------+
| 1 | 営業部 |
+-----+-----------+
| 2 | 開発部 |
+-----+-----------+
また、主キーは他のテーブルとのリレーションシップ(関係性)を表現するために使用されることがあります。この場合、他のテーブルの主キーを参照するカラムは外部キー(Foreign Key)と呼ばれます。
以下の employees
テーブルでは外部キーは department_id
カラムです。このカラムは departments
テーブルの id カラムを参照し、各従業員が所属する部門を示します。
+-----+-----------+-----------+---------------+
| id | name | salary | department_id |
+-----+-----------+-----------+---------------+
| 1 | 田中 太郎 | 123456.78 | 1 |
+-----+-----------+-----------+---------------+
| 2 | 山田 花子 | 987654.32 | 2 |
+-----+-----------+-----------+---------------+
| 3 | 鈴木 次郎 | 567890.12 | 1 |
+-----+-----------+-----------+---------------+
6. スキーマ
スキーマ(schema)とはデータベースの構造のことです。設計図のようなものです。
スキーマの三層モデル
データベースのスキーマは、通常、以下の 3 つの層に分けられます。
- 外部スキーマ(External Schema)
- 概念スキーマ(Conceptual Schema)
- 内部スキーマ(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 つに分類されます。
-
DDL(データ定義言語)
データベースの構造を定義するコマンド。
例)CREATE
,ALTER
,DROP
,TRUCATE
-
DML(データ操作言語)
データの検索、追加、削除、更新、検索を行うコマンド。
例)SELECT
,INSERT
,UPDATE
,DELETE
-
DCL(データ制御言語)
データベースのアクセス権を制御するコマンド。
例)GRANT
,REVOKE
-
TCL(トランザクション制御言語)
トランザクションを管理するコマンド。
例)COMMIT
,ROLLBACK
,SAVEPOINT
これらの SQL コマンドを組み合わせることで、データベースに対して様々な操作を行うことができます。
9. キーワード と 予約語
キーワードとは SQL 文で特別な意味を持つ単語のことです。
キーワードは、上記で紹介した SQL コマンド以外に、FROM
や WHERE
などの SQL コマンドを補完するものも含まれます。
以下は employees
テーブルから name
カラムと salary
カラムのデータを取得する 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
- PostgreSQL: Documentation: 16: Appendix C. SQL Key Words
- Oracle Reserved Words, Keywords, and Namespaces
- SQLite Keywords
10. 句
句(clause)は SQL 文の一部を構成するセクションです。句は、キーワードとそれに続く要素(データ項目名、テーブル名、検索条件式など)で構成されます。
keyword keyword keyword keyword
------ ---- -------- ----
SELECT column_2 FROM table_1 ORDER BY column_2 DESC;
--------------- ------------ ----------------------
clause clause clause
11. 文
文(statement)は、データベースに対して実行する完全な命令です。クエリとも呼ばれています。文は ;
で終わります。ただ、SQLite など、RDBMS によっては ;
を省略できるものもあります。
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
句で条件式として使われることが一般的です。
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'
リテラルは、他の式と組み合わせて使用されます。
SELECT salary + 5000 AS increased_salary FROM employees;
----
literal
詳しくは以下を参照してください。
- MySQL :: MySQL 8.0 Reference Manual :: 11.1 Literal Values
- PostgreSQL: Documentation: 16: 4.1. Lexical Structure
- Oracle Database Documentation - Literals
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 |
デフォルト値 |
これらの制約はテーブルの作成や変更時に使用します。
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
nickname VARCHAR(100) DEFAULT 'Unknown',
password VARCHAR(100)
);
複数の制約を1つの列に適用することもできます。
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE
);
これらの制約は、データの正確性と整合性を保証し、不正なデータの挿入や変更を防ぐために非常に重要です。
20. トランザクション
トランザクション(Transaction)はデータベースにおける操作の論理的な単位を指します。一連のデータベース操作(例えば、データの挿入、更新、削除など)をまとめて 1 つの処理として扱うことができます。
例えば、銀行の ATM から現金を引き出す際には、口座残高を減らし、お金を提供するという操作が 1 つのトランザクションとして扱われ、途中でエラーが発生しても、顧客の残高が正確に反映されるように保証されます。