SQL
この教科書は、SQL(Structured Query Language)に関する基本的な知識を学ぶための入門書です。 SQLは、データベース管理システム(DBMS)を使用することで、データの操作、管理、および検索を可能にする言語です。 SQLは、ビジネスや科学分野におけるデータ分析のために不可欠なツールの1つであり、データベース管理に関するキャリアを追求するために必須のスキルの1つです。
SQLとは
[編集]SQLは、関係データベース管理システム(RDBMS)を管理するために使用される問い合わせ言語です。 SQLは、データの挿入、更新、削除、検索など、データベース操作の多くのタスクを実行することができます。 SQLは、標準化された言語であり、多くのデータベースシステムでサポートされています。また、SQLは、非常に効率的でパワフルなデータベース操作を実行することができます。 SQLは、複数のテーブルを結合することができ、データの一貫性を保証するためにトランザクション処理を提供します。SQLを使用することで、データベースから必要な情報を取得し、必要な情報をより効率的に保存することができます。
主要なRDBMS
[編集]以下は、主要なリレーショナルデータベース管理システム(RDBMS)のリストです。
- Oracle Database
- 世界中で広く使用されている商用のRDBMS。高い信頼性、可用性、スケーラビリティを提供します。
- Microsoft SQL Server
- マイクロソフトによって開発され、Windowsオペレーティングシステムで動作する商用のRDBMS。データウェアハウス、オンライントランザクション処理(OLTP)、ビジネスインテリジェンス(BI)などのアプリケーションに広く使用されています。
- MySQL
- オープンソースのRDBMSで、世界中で広く使用されています。Webアプリケーション、データウェアハウス、ビジネスアプリケーションなどに適しています。
- PostgreSQL
- オープンソースのRDBMSで、高い信頼性、スケーラビリティ、拡張性を提供します。PostgreSQLは、オブジェクトリレーショナルデータベースとしても知られています。
- IBM DB2
- IBMが開発した商用のRDBMSで、多くの企業によって使用されています。DB2は、主に大規模なOLTPおよびデータウェアハウスシステムに適しています。
- SQLite
- オープンソースのRDBMSで、軽量かつ埋め込み型のアプリケーションに最適です。例えば、スマートフォンやWebブラウザなど。
これら以外にも、SAP Sybase ASE、Teradata、MariaDBなどのRDBMSがあります。
スキーマ
[編集]RDBMS(リレーショナルデータベース管理システム)におけるスキーマとは、データベースに格納されるデータの構造、属性、関係などを定義するための概念です。スキーマは、データベースの設計図であり、データベースを作成する前に定義されます。
スキーマには、以下のような要素が含まれます。
- テーブル
- データの格納場所となる表
- カラム
- テーブル内に定義された各列のデータ型や制約など
- 主キー
- 各行を一意に識別するための列
- 外部キー
- 複数のテーブルを関連付けるための列
- インデックス
- データの検索を高速化するためのデータ構造
- 制約
- データの整合性を保証するための条件や規則
スキーマは、データベースの変更や拡張を容易にするために使用されます。例えば、新しいテーブルやカラムを追加する場合は、スキーマを変更するだけで済みます。また、スキーマを利用することで、データの整合性やセキュリティを確保することもできます。
表定義
[編集]RDBMS(リレーショナルデータベースマネジメントシステム)における表定義とは、データベース内に存在する表(テーブル)の構造を定義することを指します。
具体的には、表定義では、以下の情報が定義されます。
- 列(カラム)の定義
- 表内に存在する各列の名前、データ型、サイズ、制約(NOT NULLやPRIMARY KEYなど)などが定義されます。
- テーブル名の定義
- 表の名前を定義します。
- 制約の定義
- テーブル全体に適用される制約(UNIQUE、FOREIGN KEYなど)が定義されます。
- インデックスの定義
- 表内の特定の列に対するインデックスが定義されます。
- パーティションの定義
- 表のデータを論理的に分割するパーティションの定義がされます。
表定義によって、データベースに格納されるデータの構造が明確になり、正確なデータの格納や検索が可能になります。また、表定義はデータの整合性を保つために重要な役割を担います。
本稿では、例として以下のテーブルを用い説明を行います。
フィールド名 | データ型 | 制約 |
---|---|---|
ID | char(32) | not null |
氏 | char(32) | not null |
名 | char(32) | not null |
年齢 | integer(3) | unsigned, not null |
職業 | char(128) | not null |
住所 | char(128) | null |
- 記述例
CREATE TABLE personal (
ID番号 integer(20) not null,
ユーザID char(32) not null,
氏 char(32) not null,
名 char(32) not null,
年齢 integer(3) unsigned not null,
職業 char(128) not null,
住所 char(128),
PRIMARY KEY(ID番号),
UNIQUE(ユーザID)
);
整合性制約
[編集]RDBMSにおける整合性制約とは、データの整合性を保証するために定義された制約のことを指します。整合性制約は、テーブルに格納されるデータの値に対して、ある種の条件を課すことで、データの正確性と一貫性を保証します。
代表的な整合性制約には、以下のようなものがあります。
- 主キー制約
- 表の列に一意性を課すために使用されます。主キー列の値は一意で、NULL値を許容しません。
- 外部キー制約
- 2つ以上のテーブル間の関連性を保持するために使用されます。外部キーは、参照先テーブルの主キーと一致する必要があります。
- チェック制約
- データ値が指定された条件を満たしていることを確認するために使用されます。
- NOT NULL制約
- 列にNULL値を許容しないことを指定します。
- ユニーク制約
- 列に一意性を課すために使用されます。ユニーク制約は、主キー制約とは異なり、NULL値を許容します。
整合性制約は、データの正確性を保証するために必要不可欠であり、不正なデータを挿入することを防止することができます。
ビュー定義
[編集]ビュー定義とは、表定義のうち指定条件を満たす行で構成される仮想的な表である。
データ操作
[編集]INSERT
[編集]データを追加する。
レコード行 | ID | 氏 | 名 | 年齢 | 職業 | 住所 |
---|---|---|---|---|---|---|
1 | egohgeoh | 安威 | 植雄 | 47 | 会社員 | 北海道 |
2 | reboof | 夏樹 | 久華子 | 24 | 会社員 | (NULL) |
3 | moin | 佐史 | 守瀬聰 | 36 | 住職 | シーランド公国 |
4 | e104da4ef | 太刀 | 津照人 | 20 | ウィキペディアン | 志賀県 |
- 文法
- INSERT INTO テーブル名 ( フィールド名1, フィールド名2, ... ) VALUES ( 値1, 値2, ... );
- 記述例
- INSERT INTO personal (ID, 氏,名,年齢,職業,住所) VALUES ('e104da4ef', '太刀','津照人','20','ウィキペディアン','志賀県');
- ※太字のレコードが新規に追加される。
SELECT
[編集]データを抽出する。
文法
- SELECT 表示するフィールド FROM テーブル名 [WHERE 抽出条件] [ORDER BY 並べ替えの基準となるフィールド];
記述例1
- SELECT * FROM personal;
この記述は、全てのデータを出力する。
レコード行 | ID | 氏 | 名 | 年齢 | 職業 | 住所 |
---|---|---|---|---|---|---|
1 | egohgeoh | 安威 | 植雄 | 47 | 会社員 | 北海道 |
2 | reboof | 夏樹 | 久華子 | 24 | 会社員 | (NULL) |
3 | moin | 佐史 | 守瀬聰 | 36 | 住職 | シーランド公国 |
4 | e104da4ef | 太刀 | 津照人 | 20 | ウィキペディアン | 志賀県 |
5 | oyipoyip | 奈荷 | 縫根乃 | 42 | 主婦 | 東京 |
6 | uotiket | 羽火 | 夫経穂 | 33 | 公務員 | にゃごや |
101 | abcdef | エビ | シディイエフ | 27 | 大学院生 | ロシア |
102 | ghijk | ジエイチ | アイジェケ | 63 | 無職 | (NULL) |
記述例2
- SELECT 氏, 名, 職業 FROM personal;
氏名・職業のみ表示する。
氏 | 名 | 職業 |
---|---|---|
安威 | 植雄 | 会社員 |
夏樹 | 久華子 | 会社員 |
佐史 | 守瀬聰 | 住職 |
太刀 | 津照人 | ウィキペディアン |
奈荷 | 縫根乃 | 主婦 |
羽火 | 夫経穂 | 公務員 |
エビ | シディイエフ | 大学院生 |
ジエイチ | アイジェケ | 無職 |
記述例3
- SELECT 氏, 名, 年齢, 職業 FROM personal WHERE 年齢 >= 25 AND 年齢 <= 50;
年齢が25以上50以下の人を抽出する。
氏 | 名 | 年齢 | 職業 |
---|---|---|---|
安威 | 植雄 | 47 | 会社員 |
佐史 | 守瀬聰 | 36 | 住職 |
奈荷 | 縫根乃 | 42 | 主婦 |
羽火 | 夫経穂 | 33 | 公務員 |
エビ | シディイエフ | 27 | 大学院生 |
記述例4
- SELECT 氏, 名, 職業 FROM personal WHERE 職業 LIKE '%員';
職業が「○○員(文字数は任意)」の人を抽出する。
氏 | 名 | 職業 |
---|---|---|
安威 | 植雄 | 会社員 |
夏樹 | 久華子 | 会社員 |
羽火 | 夫経穂 | 公務員 |
このデータには「会社員」「公務員」しか存在しないが、「議員」「工作員」「自宅警備員」など最後が「員」の職業の人は抽出される。
記述例5
- SELECT 氏, 名, 年齢, 住所 FROM personal ORDER BY 年齢
年齢順に出力される。
氏 | 名 | 年齢 | 住所 |
---|---|---|---|
太刀 | 津照人 | 20 | 志賀県 |
夏樹 | 久華子 | 24 | (NULL) |
エビ | シディイエフ | 27 | ロシア |
羽火 | 夫経穂 | 33 | にゃごや |
佐史 | 守瀬聰 | 36 | シーランド公国 |
奈荷 | 縫根乃 | 42 | 東京 |
安威 | 植雄 | 47 | 北海道 |
ジエイチ | アイジェケ | 63 | (NULL) |
UPDATE
[編集]データを更新する。
文法
- UPDATE テーブル名 SET フィールド名=値 [, フィールド名2=値 (以下更新するフィールドの数だけ繰り返す)][WHERE 条件];
記述例1
- UPDATE personal SET 年齢 = 年齢 + 1;
personal の全てのレコードの「年齢」を1増やす。
記述例2
- UPDATE personal SET 住所 = '不明' WHERE 住所 IS NULL;
「住所」が(NULL)の場合 '不明' という文字列に置換する。
DELETE
[編集]データを削除する。
文法
- DELETE FROM テーブル名 [WHERE 条件];
トランザクション
[編集]- SET TRANSACTION
- COMMIT
- ROLLBACK
デッドロック
[編集]RDBMSにおける正規化
[編集]第1正規形
[編集]第2正規形
[編集]第3正規形
[編集]第4正規形
[編集]SQLインジェクションの危険性
[編集]脚注
[編集]参考資料
[編集]- 標準SQLプログラミング (ISBN 4-906391-41-9)