ＳＱＬとは何か

## ＳＱＬとは何か

**ＳＱＬは、データベースと対話するためのもっとも標準的な言語**です。  

* ＳＱＬは、「非手続き型言語」という特徴を持ち、命令（コマンド）は単発で終わります。
* これは通常のプログラミング言語と比べると特殊な言語ですが、言語仕様自体は簡単です。
* しかし、簡単な言語仕様でいかに複雑な処理を行うかという、パズルを解くような難しさがあります。

**ＳＱＬを使うことで、以下のようなことができます。**

* 会社の売上データを一瞬で削除する
* 自分の給与データの一部を修正する
* データベースを利用したアプリケーションの開発

**世界はデータであふれており、世の中のほとんどはデータベースを利用したアプリケーションで構築されているため、ＳＱＬは非常に重要な言語です。** 

[試す](#試す)


# SQLとPythonとの違い
PythonとSQLはどちらもデータを扱うために使われる言語ですが、それぞれ役割が異なります。簡単に言うと、Pythonは色々なことができる「万能なプログラミング言語」で、SQLはデータベースを操作するための「専門的な言語」です。

**Python**はプログラミングの中でも使いやすくて人気があります。データを扱うだけでなく、ゲームの作成やWebサイトの開発、AI（人工知能）などにも使われています。コードがシンプルで、色々なライブラリ（便利なツール集）がたくさんあるため、様々な用途に対応できるのが特徴です。

一方、**SQL**はデータベースを使って情報を管理するのに特化した言語です。例えば、成績表や売り上げデータなど、大量のデータの中から必要な情報を探したり、集計することが得意です。Pythonのように色々なことができるわけではありませんが、大きなデータを効率的に扱うために最適化されています。


## ＳＱＬでできること

ＳＱＬは強力な言語で、様々な操作をデータベースに対して行うことができます。

* **データの取得**: データベースから必要なデータを取り出すことができます。
    * 例えば、従業員テーブルから特定の条件を満たす従業員のデータだけを取得する、といった操作が可能です。
* **データの追加**: データベースに新しいデータを追加できます。
    * 例えば、新しい従業員のデータを作成し、従業員テーブルに追加する、といった操作が可能です。
* **データの更新**: データベースに保存されているデータを変更できます。
    * 例えば、従業員の住所に変更があった場合、従業員テーブルの該当するデータのみを更新する、といった操作が可能です。
* **データの削除**: データベースに保存されているデータを削除できます。
    * 例えば、退職した従業員のデータを従業員テーブルから削除する、といった操作が可能です。
* **データベースの操作**: データベース自体を作成、変更、削除できます。
    * データベースの構造を定義したり、不要になったデータベースを削除する、といった操作が可能です。
* **テーブルの操作**: テーブルを作成、変更、削除できます。
    * テーブルはデータベースの中に作成され、データを格納する役割を果たします。
* **トランザクションの制御**:  複数のSQL文をまとめて実行し、データの整合性を保つことができます。
    * 例えば、銀行口座間の送金処理など、複数のテーブルにまたがる処理を安全に行うために使用されます。

これらの操作は、ＳＱＬの**データ操作言語（DML）、データ定義言語（DDL）、データ制御言語（DCL）**という３つのカテゴリに分類されます。 

ＳＱＬを学ぶことで、大量のデータを効率的に管理し、必要な情報を自在に抽出することが可能になります。

## データベースとは

データベースとは、「**あるルールにしたがってまとめられたデータ群**」のことです。 身近な例では、**スマホの電話帳**がデータベースに該当します。電話帳には、名前、よみがな、電話番号、メールアドレスなどの情報が連絡先ごとに整理されて格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902453/6c9867d0-7622-0954-3614-baf5bbc3bab3.png)

### データベースのメリット

データベース化することによって、以下のメリットが得られます。

* データを探しやすくなる: 電話帳のように、あいうえお順やアルファベット順にデータを並び替えることで、目的の情報を見つけやすくなります。
* 検索機能が使える: データがルールに基づいて整理されているため、検索機能を使って効率的に情報を探すことができます。

### データベースの主な運用目的

データベースの主な運用目的は以下の３点です。

1. **データを探しやすくすること** 
2. **データを保管しておくこと**
3. **検索・抽出・集計することで、ビジネス上の課題や機会を見つけ出すこと**

### データベースの種類

データベースにはいくつかの形式があります。

* **リレーショナル型データベース（RDB）**: Excelによく似た表形式のデータベースです。SQLで操作することができます。長い間主流とされてきました。
* **NoSQL**: SQLを使用しないデータベースです。キーバリュー型、カラム指向型など、様々な種類があります。近年、システムの大規模化、高速化に対応しやすいという理由で利用が増えています。
* 階層型データベース: 一本の幹が複数の枝へ広がるようなツリー構造のデータベースです。
* ネットワーク型データベース:  網目状にデータがつながるデータベースです。

この資料では、現在最も広く使われている**リレーショナル型データベース（RDB）**を想定して説明しています。

### データベースのイメージ

データベースは、**テーブル、レコード、カラム、フィールド**といった要素で構成されます。

* テーブル: 多くのレコード（行）から成り立っています。
* カラム: テーブルの列を指します。
* レコード: テーブルの行を指します。
* フィールド:  テーブルの１つ１つの要素を指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902453/02b558df-176b-8c6f-f1b7-3760a74eb368.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902453/933bee68-237d-9f34-9c68-1dfe3f37db00.png)

### Excelとデータベースの相違点

Excelもデータベースもデータを整理して保存するという点では似ていますが、いくつか違いがあります。

* **インターフェース**: Excelは視覚的に分かりやすいインターフェースですが、データベースはプログラムを実行しないと中身を見ることができません。
* **データの結合**: Excelではシート内のデータは他のシートとは独立していることが多いですが、データベースは保存されているあらゆるデータを容易に結合できます。
* **複数人での作業**: Excelは複数人での作業を想定していませんが、データベースは複数人・アプリケーションが一緒に作業できることを前提としています。
* **その他**: データベースは、データ蓄積量、データ型の指定、データアクセス速度、データのバックアップ、セキュリティ管理などの面でExcelより優れている点があります。

**ビジネスで大規模データを扱うには、データベースの活用が必要となります。**

## データベース管理システムとは

データベース管理システム（DBMS）とは、**データベースを管理するためのシステム**です。 **矛盾したデータの発生を防いだり、トラブル発生時にデータを元の状態に戻したりすることができます**。

**一般的なデータベース管理システム**:

* **Oracle**: 世界初の商用DBMSで、学習用の無料版も提供されています。Oracle社が開発しました。
* **SQL Server**: Microsoft社が開発した商用DBMSで、無料版やクラウド版があります。
* **MySQL**: オープンソースのDBMSで、Oracle社に買収されました。その後、MariaDBが派生しました。
* **PostgreSQL**: オープンソースの中ではMySQLに次いで人気のあるDBMSです。
* **SQLite**: ファイルベースの軽量DBMSで、バックアップはファイルをコピーするだけで済みます。

これらのデータベース管理システムは、無料で利用できるもの、クラウド上で利用できるもの、オープンソースのものなど、様々な種類があります。 上記5つは、すべて**リレーショナル型データベース**と呼ばれ、 SQLは、このリレーショナル型データベースと対話するための言語です。


## ＳＱＬの基本４パターン

**ＳＱＬの基本４パターン**は、リレーショナル型データベースを操作するための**データ操作言語（DML）**のコマンドです。  これらのコマンドを使いこなすことで、データベースのデータを自由に操作できるようになります。

**ＳＱＬの基本４パターン**は以下の通りです。

1. **SELECT**: データベースから必要なデータを取得します。  
    * 使用頻度が最も高いコマンドです。 
    * すべてのデータを取得する場合 : `SELECT * FROM [テーブル名]`
    * 特定のカラムのデータを取得する場合: `SELECT [カラム名1], [カラム名2], ... FROM [テーブル名]`
    * 特定の条件を満たすデータを取得する場合: `SELECT * FROM [テーブル名] WHERE [条件式]`
    * データを並び替えて取得する場合: `SELECT * FROM [テーブル名] ORDER BY [カラム名] [並び順]`  ([並び順]は昇順なら "ASC"、降順なら "DESC")

2. **INSERT**: データベースにデータを追加します。
    * すべてのカラムに値を指定する場合: `INSERT INTO [テーブル名] ([カラム名1], [カラム名2], ...) VALUES ([値1], [値2], ...)`
    * 一部のカラムに値を指定する場合: `INSERT INTO [テーブル名] ([カラム名1], [カラム名2], ...) VALUES ([値1], [値2], ...)`  (指定しないカラムはNULLになる)
    * 複数のレコードを一度に追加する場合: `INSERT INTO [テーブル名] ([カラム名1], [カラム名2], ...) VALUES ([値1_1], [値1_2], ...), ([値2_1], [値2_2], ...), ...`

3. **UPDATE**: データベースに保存されているデータを更新します。
    * `UPDATE [テーブル名] SET [カラム名1] = [値1], [カラム名2] = [値2], ... WHERE [条件式]`
    * WHERE句で更新対象を絞り込むことができます。 
    * WHERE句を省略すると、すべてのレコードが更新されます。

4. **DELETE**: データベースに保存されているデータを削除します。
    * `DELETE FROM [テーブル名] WHERE [条件式]`
    * WHERE句で削除対象を絞り込むことができます。
    * WHERE句を省略すると、すべてのレコードが削除されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902453/e696476b-4362-859b-8175-2e243eef32fd.png)

これらの４つのコマンドは、それぞれ異なる目的で使用されますが、組み合わせて使用することでより複雑なデータ操作を行うことも可能です。

## その他のSQLについて

SQLには、これまで説明したデータ操作言語（DML）以外にも、**データ定義言語（DDL）** と **データ制御言語（DCL）** があります。

### データ定義言語（DDL）

データ定義言語は、データベース内にテーブルを作成したり、テーブルの構造を変更したり、テーブルを削除したりするためのSQLです。テーブルだけでなく、データベースそのものや、ビュー、ストアドプロシージャなども作成・変更・削除することができます。

* **CREATE**: データベース・テーブル・ビュー・ストアドプロシージャなどを作成します。
    * 例： `CREATE DATABASE Company` (Companyという名前のデータベースを作成する)
* **ALTER**: データベース・テーブル・ビュー・ストアドプロシージャなどの定義を変更します。
* **DROP**: データベース・テーブル・ビュー・ストアドプロシージャなどを削除します。

### データ制御言語（DCL）

データ制御言語は、「トランザクション」を制御するためのSQLです。トランザクションとは、複数のSQLを1つのまとまりとして扱うための仕組みです。

例えば、商品の在庫管理システムで、商品が売れた際に在庫テーブルから在庫数を差し引き、売上テーブルに加算する処理を行う場合を考えてみましょう。 在庫テーブルから在庫数を減らす処理と、売上テーブルに売上数を増やす処理を別々に行うと、処理の途中でエラーが発生した場合にデータの不整合が発生する可能性があります。

トランザクションを使用することで、これらの処理を1つのまとまりとして扱い、どちらかの処理でエラーが発生した場合には、両方の処理を取り消すことができます。

**トランザクションの機能**:
トランザクションについてわかりやすく説明するために、以下の例を見てみましょう。 商品の在庫を管理するシステムがあり、そのシステムには、在庫テーブルと売上テーブルがあり、 商品が売れた場合、売れた個数を在庫テーブルから差し引き、売上テーブルに加算するとします。
* `BEGIN TRANSACTION`: トランザクション処理を開始します。
* `COMMIT TRANSACTION`: 開始したトランザクション処理を終了し、処理を確定します。
* `ROLLBACK TRANSACTION`: 開始したトランザクション処理を中断し、処理をキャンセルします。データは、トランザクション処理が開始される前の状態に戻ります。 

**トランザクションについてわかりやすく説明**

商品の在庫を管理するシステムがあり、そのシステムには、在庫テーブルと売上テーブルがあり、 商品が売れた場合、売れた個数を在庫テーブルから差し引き、売上テーブルに加算するとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902453/93c1f0c1-d184-fcbd-8896-7eb65c66410d.png)

商品が3個売れた場合、まずは在庫テーブルから在庫数を3つ減らし、次に売上テーブルの売上数を3つ増やします。

その時、もし在庫テーブルから在庫数を3つ減らしたタイミングでデータベースに障害が発生し、売上テーブルの売上数を更新するSQLが実行されなかった場合、在庫数だけが3つ減った状態となってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902453/a03d11a5-9300-2e65-fa48-635c0f4627d6.png)

このようなことが発生してしまうと、データに不整合が発生してしまうことになりますので、こういったことを防ぐための仕組みが、トランザクションなのです。


## SQL概念問題：４択問題

**問題1**

リレーショナル型データベースにおいて、行のことを何というか？

1. カラム
2. フィールド
3. テーブル
4. レコード

**問題2**

データベース管理システム（DBMS）の役割として、適切なものはどれか？

1. データベースの内容を視覚的にわかりやすく表示すること。
2. データベースの矛盾を防ぎ、トラブル発生時にデータを復旧すること。
3. データベースの容量を圧縮し、ディスク容量を節約すること。
4. データベースへのアクセスを高速化し、レスポンスを向上させること。

**問題3**

SQLにおいて、データベースからすべてのデータを取得したい場合に使用するコマンドはどれか？

1. `INSERT INTO`
2. `UPDATE`
3. `DELETE FROM`
4. `SELECT * FROM`

**問題4**

従業員テーブル（TBL_EMPLOYEES）から、従業員番号（EMP_CODE）が「10」の従業員情報を削除するSQL文として、正しいものはどれか？

1. `DELETE * FROM TBL_EMPLOYEES WHERE EMP_CODE = 10`
2. `REMOVE FROM TBL_EMPLOYEES WHERE EMP_CODE = 10`
3. `DELETE FROM TBL_EMPLOYEES WHERE EMP_CODE = 10`
4. `UPDATE TBL_EMPLOYEES SET EMP_CODE = NULL WHERE EMP_CODE = 10`

**問題5**

複数のSQL文を1つのまとまりとして扱い、処理の途中でエラーが発生した場合に、すべての処理を取り消すことができる仕組みを何というか？

1. ストアドプロシージャ
2. ビュー
3. トランザクション
4. データ定義言語

**解説**

* 問題1: リレーショナル型データベースでは、行は「レコード」、列は「カラム」と呼ばれます。解答: 4.
* 問題2: DBMSはデータの整合性と安全性を確保する役割を担います。解答: 2.
* 問題3: `SELECT * FROM` はテーブル内のすべてのカラムとレコードを取得するコマンドです。解答: 4.
* 問題4: `DELETE FROM` コマンドは、指定した条件に一致するレコードをテーブルから削除します。解答: 3.
* 問題5: トランザクションは、一連のSQL操作を不可分の単位として扱い、データの整合性を保ちます。解答: 3.




# 試す
https://paiza.io/projects/WgGkVryi6olYEqXvw5JLxw?locale=ja-jp #paizaIO @paizaIO
### テーブル作成 (CREATE文)

まず、練習用のテーブルを作成しましょう。ここでは、書籍でも例として挙げられていた「従業員」テーブルを作成します。

```sql
CREATE TABLE TBL_EMPLOYEES (
  EMP_CODE INT PRIMARY KEY,
  EMP_NAME VARCHAR(50) NOT NULL,
  KANA VARCHAR(50),
  SEX CHAR(1),
  BIRTHDAY DATE
);
```

**解説:**

* `CREATE TABLE` で新しいテーブルを作成します。
* `TBL_EMPLOYEES` はテーブル名です。
* カッコ内にカラムの定義を記述します。
    * `EMP_CODE`: 従業員番号 (整数型, 主キー)
    * `EMP_NAME`: 従業員名 (可変長文字列型, 50文字まで, NULL不可)
    * `KANA`: 従業員名かな (可変長文字列型, 50文字まで)
    * `SEX`: 性別 (1文字, 男: 'M', 女: 'F')
    * `BIRTHDAY`: 誕生日 (日付型)
* `PRIMARY KEY` は主キー制約で、重複を許さないユニークな値を指定します。
* `NOT NULL` 制約は、そのカラムにNULL値を許容しないことを意味します。

### データ追加 (INSERT文)

作成したテーブルにデータを挿入します。

```sql
-- 複数行まとめてINSERT
INSERT INTO TBL_EMPLOYEES (EMP_CODE, EMP_NAME, KANA, SEX, BIRTHDAY) VALUES
(1, '田中 太郎', 'タナカ タロウ', 'M', '1985-04-01'),
(2, '佐藤 花子', 'サトウ ハナコ', 'F', '1988-10-15'),
(3, '鈴木 一郎', 'スズキ イチロウ', 'M', '1992-06-20');

-- 1行ずつINSERT
INSERT INTO TBL_EMPLOYEES (EMP_CODE, EMP_NAME, KANA, SEX, BIRTHDAY)
VALUES (4, '高橋 真理', 'タカハシ マリ', 'F', '1990-01-05');
```

**解説:**

* `INSERT INTO` で指定したテーブルにデータを挿入します。
* カラム名を指定して、対応する値を `VALUES` 句に記述します。
* 複数行をまとめて挿入することも、1行ずつ挿入することもできます。

### データ取得 (SELECT文)

様々な条件でデータを検索してみましょう。

1. **すべてのデータを取得:**
   ```sql
   SELECT * FROM TBL_EMPLOYEES;
   ```

2. **特定のカラムだけを取得:**
   ```sql
   SELECT EMP_CODE, EMP_NAME FROM TBL_EMPLOYEES;
   ```

3. **条件を指定して取得:**
   ```sql
   SELECT * FROM TBL_EMPLOYEES WHERE SEX = 'F';
   ```

4. **誕生日でソートして取得:**
   ```sql
   SELECT * FROM TBL_EMPLOYEES ORDER BY BIRTHDAY DESC;
   ```

**解説:**

* `SELECT` 句で取得したいカラムを指定します。`*` はすべてのカラムを意味します。
* `FROM` 句で対象のテーブルを指定します。
* `WHERE` 句で取得条件を指定します。
* `ORDER BY` 句でソート順を指定します。`DESC` は降順、`ASC` (省略可) は昇順です。


### データ更新 (UPDATE文)

既存のデータを更新します。

```sql
UPDATE TBL_EMPLOYEES
SET EMP_NAME = '佐藤 次郎', BIRTHDAY = '1988-05-10'
WHERE EMP_CODE = 2;
```

**解説:**

* `UPDATE` 文で指定したテーブルのデータを更新します。
* `SET` 句で更新するカラムと新しい値を指定します。
* `WHERE` 句で更新対象のレコードを絞り込みます。

### データ削除 (DELETE文)

不要なデータを削除します。

```sql
DELETE FROM TBL_EMPLOYEES WHERE EMP_CODE = 3;
```

**解説:**

* `DELETE FROM` 文で指定したテーブルからデータを削除します。
* `WHERE` 句で削除対象のレコードを絞り込みます。

上記のSQL文はあくまで一例です。様々な条件や組み合わせを試して、SQLの理解を深めてください。