誰でも解る！SQLの基礎




---
## はじめに

HI Engineer Collegeでは、実務未経験のエンジニアの方や、エンジニアに興味がある方を募集したおります、まずはお気軽にお問い合わせください。

※ (株)G&T（【内々定まで最短2週間】ゼロからしっかりじっくり研修☆20代活躍中！）

https://gat-company.com/

※ HI Engineer Collegeに興味あがある方はこちら（プログラミングを学習したい方）

https://hiengineer.jp/



---

### エンジニア向けチャットルーム「TechTalk」参加者募集中！

プログラミングやITの話題を気軽に共有し、学び合えるエンジニアのためのチャットルーム「TechTalk」では、新たな参加者を募集中です！

**こんな方にオススメです**
- 最新技術の動向やトレンドを追いかけたい
- 日々の開発で生じる疑問を他のエンジニアに相談したい
- コードレビューの方法やデバッグのコツを知りたい
- 他のエンジニアと共に成長できる場を探している

**チャットルームで扱う主なトピック**
- **プログラミング**: JavaScript、Python、Javaなど、言語やフレームワークについて
- **開発ツール**: Git、Docker、CI/CD の自動化など
- **キャリア**: 転職やキャリアパス、業界動向
- **AI/機械学習**: モデルの開発やトレンド
- **Webセキュリティ**: セキュリティ対策や最新の脅威情報

**チャットルームの特徴**
- 他のエンジニアからリアルタイムでフィードバックがもらえます
- 勉強会やハンズオンセッションも定期開催
- 初心者から上級者まで、幅広いレベルのエンジニアが在籍
- リモートワーク時のちょっとした相談や雑談も大歓迎

**参加方法**
下記リンクから「TechTalk」へぜひご参加ください。

https://line.me/ti/g2/xRolADFbfopNo4vdgA9hmAlAlMgxvaIUSNDx8A?utm_source=invitation&utm_medium=link_copy&utm_campaign=default

---

### テーブルの作成: `CREATE TABLE`
`CREATE TABLE` 構文を使って、新しいテーブルをデータベースに作ります。

**例:**
```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 INT PRIMARY KEY`：従業員番号です。整数型で、重複を許さない主キーにします。
  - `EMP_NAME VARCHAR(50) NOT NULL`：従業員の名前を表します。最大50文字で、空欄は許されません。
  - `KANA VARCHAR(50)`：従業員名のフリガナです。最大50文字まで使えます。
  - `SEX CHAR(1)`：性別です。1文字の値で (`M` か `F`) を格納します。
  - `BIRTHDAY DATE`：従業員の誕生日を表します。

### データの挿入: `INSERT INTO`
テーブルにデータを入れるには、`INSERT INTO` を使います。

**例:** 複数行まとめてデータを入れる場合
```sql
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行ずつデータを入れる場合
```sql
INSERT INTO TBL_EMPLOYEES (EMP_CODE, EMP_NAME, KANA, SEX, BIRTHDAY)
VALUES (4, '高橋 真理', 'タカハシ マリ', 'F', '1990-01-05');
```
**解説:**
- `INSERT INTO`：テーブルにデータを追加します。
- `(EMP_CODE, EMP_NAME, KANA, SEX, BIRTHDAY)`：追加するカラムの名前を指定します。
- `VALUES`：それぞれのカラムに入れる値を指定します。
  - 例えば `(1, '田中 太郎', 'タナカ タロウ', 'M', '1985-04-01')` は、各カラムに対応するデータです。

### データの取得: `SELECT`
テーブルからデータを取り出すには、`SELECT` を使います。

**例:**
```sql
SELECT * FROM TBL_EMPLOYEES;
```
- `*` は全てのカラムを意味します。

**特定のカラムを取り出す例:**
```sql
SELECT EMP_NAME, BIRTHDAY FROM TBL_EMPLOYEES;
```
- `EMP_NAME` と `BIRTHDAY` だけを取り出します。

`SELECT` はデータベースから情報を引き出すための基本的な命令です。必要なカラムを指定すると、効率的にデータを取り出すことができます。

### データの更新: `UPDATE`
既存のデータを変更するには、`UPDATE` を使います。

**例:**
```sql
UPDATE TBL_EMPLOYEES
SET EMP_NAME = '田中 次郎'
WHERE EMP_CODE = 1;
```
- `SET` で変更するカラムと新しい値を指定します。
- `WHERE` 句で、どの行を更新するかを指定します。

`UPDATE` を使うとデータを変更できます。`WHERE` 句を使わないと、すべての行が更新されるので注意が必要です。

### データの削除: `DELETE`
データを削除するには、`DELETE` を使います。

**例:**
```sql
DELETE FROM TBL_EMPLOYEES
WHERE EMP_CODE = 2;
```
- `WHERE` 句を使わないと、全てのデータが削除されるので注意が必要です。

`DELETE` はテーブルから不要なデータを消すために使います。`WHERE` 句を忘れると全てのデータが消えてしまうので気をつけましょう。

### 条件指定: `WHERE`
`WHERE` 句を使って、特定の条件に合ったデータを取り出します。

**例:**
```sql
SELECT * FROM TBL_EMPLOYEES
WHERE SEX = 'F';
```
- `SEX` が `'F'` の従業員だけを取り出します。

`WHERE` 句を使うと、大量のデータの中から必要な情報だけを取り出すことができます。`AND` や `OR` を使って、条件を複雑にすることもできます。

### テーブルの結合: `JOIN`
複数のテーブルを結合してデータを取り出すには、`JOIN` を使います。

**例:**
```sql
SELECT A.EMP_CODE, A.EMP_NAME, B.DEP_NAME
FROM TBL_EMPLOYEES A
JOIN TBL_DEPARTMENTS B ON A.EMP_CODE = B.EMP_CODE;

-- テーブルの作成: `TBL_DEPARTMENTS`
```sql
CREATE TABLE TBL_DEPARTMENTS (
  DEP_CODE INT PRIMARY KEY,
  DEP_NAME VARCHAR(50) NOT NULL
);
```

-- データの挿入: `TBL_DEPARTMENTS`
```sql
INSERT INTO TBL_DEPARTMENTS (DEP_CODE, DEP_NAME) VALUES
(1, '人事部'),
(2, '営業部'),
(3, '開発部');
```


- `JOIN` を使って `TBL_EMPLOYEES` と `TBL_DEPARTMENTS` を結びつけます。

`JOIN` は、異なるテーブルから関連する情報をまとめて取り出すのに便利です。例えば、従業員とその所属部署の情報を結びつけて、一緒に取り出すことができます。

### グループ化: `GROUP BY`
データを特定のカラムでまとめて、集計するために `GROUP BY` を使います。

**例:**
```sql
SELECT SEX, COUNT(*)
FROM TBL_EMPLOYEES
GROUP BY SEX;
```
- `SEX` 別に従業員の人数を数えます。

`GROUP BY` は、データをグループごとに分けて、そのグループごとに集計をする時に使います。例えば、性別ごとの人数や、部署ごとの平均給与を計算する時などに便利です。

### サブクエリ
サブクエリは、クエリの中に入っている別のクエリです。サブクエリは、主に複雑なデータを取得したり、特定の条件に基づいたデータの抽出を行う際に非常に便利です。例えば、特定のテーブル内で最大値や最小値を持つ行を取り出す場合や、別のテーブルから条件を持ってくる場合などに使われます。

**例:**
```sql
SELECT EMP_NAME
FROM TBL_EMPLOYEES
WHERE EMP_CODE = (SELECT MAX(EMP_CODE) FROM TBL_EMPLOYEES);
```
- `EMP_CODE` が一番大きい従業員名を取り出します。

この例では、`TBL_EMPLOYEES` テーブルから `EMP_CODE` が最大の従業員名を取得します。サブクエリ `(SELECT MAX(EMP_CODE) FROM TBL_EMPLOYEES)` がまず実行され、その結果を使って外側のクエリが実行されます。

サブクエリを使うと、他のクエリの結果を利用してデータを取得することができます。例えば、最も新しい従業員の情報を取り出すときに役立ちます。また、サブクエリは `WHERE` 句、`FROM` 句、さらには `SELECT` 句の中でも使用できるため、データの絞り込みや集計の際に非常に強力なツールとなります。複数のサブクエリを組み合わせることで、より複雑なデータ操作も可能になります。

### 条件分岐: `CASE` 式
`CASE` 式を使うと、条件に基づいて異なる値を返すことができます。

**例:**
```sql
SELECT EMP_NAME,
  CASE WHEN SEX = 'M' THEN '男性'
       WHEN SEX = 'F' THEN '女性'
       ELSE '不明'
  END AS 性別
FROM TBL_EMPLOYEES;
```
- `SEX` の値に応じて `'男性'` または `'女性'` を表示します。

`CASE` 式は、いくつかの条件を調べて、どれに当てはまるかで結果を変えたいときに使います。例えば、性別や点数によって違うランクを付けたい時などに便利です。

## 集計関数 (`COUNT`, `SUM`, `AVG`, `MAX`, `MIN`)
SQLにはデータをまとめるための関数があります。

- **`COUNT`**：レコードの数を数えます。
  - **例:** 従業員の人数を数える。
  ```sql
  SELECT COUNT(*) AS 従業員数 FROM TBL_EMPLOYEES;
  ```
- **`SUM`**：数値の合計を計算します。
  - **例:** 給料の合計を計算する（`SALARY` カラムがあると仮定）。
  ```sql
  SELECT SUM(SALARY) AS 合計給与 FROM TBL_EMPLOYEES;
  ```
- **`AVG`**：数値の平均を計算します。
  - **例:** 平均年齢を計算する。
  ```sql
  SELECT AVG(YEAR(CURDATE()) - YEAR(BIRTHDAY)) AS 平均年齢 FROM TBL_EMPLOYEES;
  ```
- **`MAX`**：最大値を取得します。
  - **例:** 最も年上の人の誕生日を取得する。
  ```sql
  SELECT MAX(BIRTHDAY) AS 最年長の誕生日 FROM TBL_EMPLOYEES;
  ```
- **`MIN`**：最小値を取得します。
  - **例:** 最も若い人の誕生日を取得する。
  ```sql
  SELECT MIN(BIRTHDAY) AS 最年少の誕生日 FROM TBL_EMPLOYEES;
  ```

集計関数を使うと、データ全体の傾向を知ることができます。`GROUP BY` でグループごとに集計することもできます。


### まとめ
この基本的な構文を使うことで、データベースにテーブルを作り、そのテーブルにデータを追加、更新、削除、そして取得することができます。`CREATE TABLE` でテーブルを作り、`INSERT INTO` でデータを入れ、`SELECT` でデータを取り出すという流れが基本です。さらに、`JOIN` でテーブルを結合したり、`GROUP BY` でデータをまとめたり、`CASE` 式で条件に応じて結果を変えたりすることもできます。これらの構文をうまく使うと、いろいろなデータ操作が可能になります。

データベースの使い方を理解し、実際に手を動かして練習することで、SQLの知識はどんどん深まります。もっと複雑なクエリを作れるようになると、データを集めたり分析したりするのが簡単になります。SQLはとても強力なツールなので、うまく使うことでたくさんの役立つアプリケーションを作ることができます。

### 練習問題
以下に、このチュートリアルで学んだ内容を使った練習問題を20問用意しました。各問題の解答を確認しながら、SQLのスキルを磨いてください。問題は実践的なシナリオに基づいていますので、実際にSQLを使う際に役立つでしょう。

1. 新しいテーブル `TBL_PROJECTS` を作成し、プロジェクトコード (`PROJ_CODE`)、プロジェクト名 (`PROJ_NAME`)、開始日 (`START_DATE`) を含むようにしてください。
   **解答:**
   ```sql
   CREATE TABLE TBL_PROJECTS (
     PROJ_CODE INT PRIMARY KEY,
     PROJ_NAME VARCHAR(100) NOT NULL,
     START_DATE DATE
   );
   ```

2. `TBL_EMPLOYEES` テーブルに、新しく従業員「山田 一郎（フリガナ：ヤマダ イチロウ、男性、誕生日：1991年3月10日）」を追加してください。
   **解答:**
   ```sql
   INSERT INTO TBL_EMPLOYEES (EMP_CODE, EMP_NAME, KANA, SEX, BIRTHDAY)
   VALUES (5, '山田 一郎', 'ヤマダ イチロウ', 'M', '1991-03-10');
   ```

3. `TBL_EMPLOYEES` から、全ての男性 (`SEX = 'M'`) の従業員の名前を取得してください。
   **解答:**
   ```sql
   SELECT EMP_NAME FROM TBL_EMPLOYEES
   WHERE SEX = 'M';
   ```

4. 従業員番号が 3 の従業員の名前を「鈴木 太郎」に更新してください。
   **解答:**
   ```sql
   UPDATE TBL_EMPLOYEES
   SET EMP_NAME = '鈴木 太郎'
   WHERE EMP_CODE = 3;
   ```

5. `TBL_EMPLOYEES` から、従業員番号が 2 のデータを削除してください。
   **解答:**
   ```sql
   DELETE FROM TBL_EMPLOYEES
   WHERE EMP_CODE = 2;
   ```

6. `TBL_EMPLOYEES` から、誕生日が1990年以降の従業員を取り出してください。
   **解答:**
   ```sql
   SELECT * FROM TBL_EMPLOYEES
   WHERE BIRTHDAY >= '1990-01-01';
   ```

7. `TBL_EMPLOYEES` と `TBL_DEPARTMENTS` を結合して、全従業員の名前と所属部署名を取り出してください。
   **解答:**
   ```sql
   SELECT A.EMP_NAME, B.DEP_NAME
   FROM TBL_EMPLOYEES A
   JOIN TBL_DEPARTMENTS B ON A.EMP_CODE = B.EMP_CODE;
   ```

8. 性別ごとに従業員の人数を数えるクエリを書いてください。
   **解答:**
   ```sql
   SELECT SEX, COUNT(*) AS 人数
   FROM TBL_EMPLOYEES
   GROUP BY SEX;
   ```

9. `TBL_EMPLOYEES` から最も最近雇用された従業員の名前を取得するサブクエリを書いてください。
   **解答:**
   ```sql
   SELECT EMP_NAME FROM TBL_EMPLOYEES
   WHERE EMP_CODE = (SELECT MAX(EMP_CODE) FROM TBL_EMPLOYEES);
   ```

10. `TBL_EMPLOYEES` の性別を「男性」「女性」に変換して表示するクエリを書いてください。
    **解答:**
    ```sql
    SELECT EMP_NAME,
      CASE WHEN SEX = 'M' THEN '男性'
           WHEN SEX = 'F' THEN '女性'
           ELSE '不明'
      END AS 性別
    FROM TBL_EMPLOYEES;
    ```