【SQL】基本的なSQL文まとめ

# はじめに
はじめまして！
[RUNTEQ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/runteq)の7日目を担当しますKoheiと申します！

今回は、SQL文について、まとめておきたいと思います。

特に、
- SQLを初めて触る
- あまり触っていない人

などをターゲットに、よく使うようなSQL文を中心にまとめました！
　
載っていないコマンドは、[記事下部に公式DBMSマニュアルのリンクをまとめました](#代表的なDBMSのマニュアル-（※2024/12/07時点）)ので、
そちらから検索してみてください。

少しでも参考になれば幸いです。

## 注意事項
- お使いのDBMS製品によって、使用できるSQL文などが違います。詳細は、使用している製品の公式マニュアルを御覧ください。（分かる範囲で、代表的な製品は記事下部にまとめました！）
- 間違いなど有りましたら、コメント等でご指摘ください。

## おすすめの使い方
`Ctrl` + `F` や`Command` + `F`で、ページ内検索をかけるのがオススメです。
また、目次も作ったのでご参考にお使いください。


## SELECT（テーブルを取得したい）

```SQL
SELECT 列名①, 列名②,・・・・・（全部の列を取得したいなら「＊（アスタリスク）」を記載）
FROM テーブル名;
```


例）売上テーブルから、顧客番号が「１」の「顧客番号」「商品名」「単価」「数量」を取得したい
```SQL
SELECT 顧客番号, 商品名, 単価, 数量
FROM 売上
WHERE 顧客番号 = 1;   /* 「行」を絞る */
```

### ★ SELECTだけで使える加工方法
SELECTでの命令時のみで使える加工方法があるので、いくつか紹介します。

#### DISTINCT （重複を除外する）

```SQL
SELECT DISTINCT 列名　/*　SELECT文で列を選択する前に書く必要がある　*/
FROM テーブル名;
```

例）下記、売上テーブルで何の商品名が買われたのか明らかにしたい（重複を取り除きたい）

<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>¥3000</td>
    </tr>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>¥3000</td>
    </tr>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
  </tbody>
</table>


```SQL
SELECT DISTINCT 商品名
FROM 売上;
```
↓下記のようになる
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>¥3000</td>
    </tr>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
  </tbody>
</table>

#### ORDER BY （順序を並べ替える）
```SQL
SELECT 列名
FROM テーブル名
ORDER BY 列名① 並べ方, 列名② 並べ方,・・・・・ ;
/* 並べ方・・・「何も書かない」か「ASC」が昇順、「DESC」が降順 */
```
例）下記表の単価を降順（大きい方から順に）に並び替える

<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>¥3000</td>
    </tr>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
  </tbody>
</table>

```SQL
SELECT *
FROM 売上
ORDER BY 単価 DESC;
```
↓下記のようになる
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>¥3000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
  </tbody>
</table>

#### OFFSET - FETCH (●件だけ取得する)
```SQL
SELECT 列名
FROM テーブル名
ORDER BY 列名 並べ方  /* ORDER BYといっしょに使われることが多い*/
OFFSET 冒頭から除外する行数 ROWS  /* この行は省略可能  */
FETCH NEXT 取得したい行数 ROWS ONLY;  /* 「LIMIT 取得したい行数」で書くことも可能*/
```
<font color="Salmon">※DBMS製品によってはサポートされていない場合があります</font>

例）下記表の3番目に高い単価だけを取得する

<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>¥3000</td>
    </tr>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
  </tbody>
</table>

```SQL
SELECT *
FROM 売上
ORDER BY 単価 DESC
OFFSET 2 ROWS
FETCH NEXT 1 ROWS ONLY;
```
↓下記のようになる
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
  </tbody>
</table>

#### UNION・EXCEPT・INTERSECT（2テーブル以上を、和集合・差集合・積集合させる）
```SQL
SELECT 列名①, 列名②, 列名③・・・・
FROM テーブル名①

UNION /* 和集合の場合 */
/* 差集合：EXCEPT, 積集合：INTERSECT */

SELECT 列名①, 列名②, 列名③・・・・ /*  NULLなどを入れて、列数はテーブル①と合わせること */
FROM テーブル名②;
```

## UPDATE（データを更新したい）
```SQL
UPDATE テーブル名
SET 列名① = 値①, 列名② = 値②, ・・・・・
WHERE 行名 = 条件;
```
<font color="Salmon">※全件データを更新するのは稀なので、基本的にはWHEREをつける</font>
　

例）売上テーブルにある、「商品名」が「A」の「単価」を「500円」にしたい
```SQL
UPDATE 売上
SET 単価 = 500
WHERE 商品名 = 'A'
```

## DELETE（データを削除したい）
```SQL
DELETE 
FROM テーブル名
WHERE 行名 = 条件;
```
<font color="Salmon">※WHEREを設定しないと、全件削除になるので注意！(ロールバックは可能)</font>
※跡形もなくテーブルを消したい場合は、`DROP TABLE テーブル名` を使う

例）売上テーブルから、「商品名」が「A」の行だけ削除したい
```SQL
DELETE
FROM 売上
WHERE 商品名 = 'A';
```

## INSERT INTO〜（データを追加したい）
```SQL
INSERT INTO テーブル名 (列名①, 列名②,・・・・・)
VALUES (値①, 値②, ・・・・・);
```

例）下記の売上テーブルに、「2000円の商品B」の行を追加したい
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
  </tbody>
</table>

```SQL
INSERT INTO 売上(商品名, 単価)
VALUES (商品B, 2000);
```
↓下記のようになる
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
      <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
  </tbody>
</table>

## CREATE（テーブルを作りたい）
```SQL
CREATE TABLE テーブル名 (
    列名①　列①のデータ型 /* データ型については下記表を参考　*/
    列名②　列②のデータ型
    列名③　列③のデータ型・・・・・
);
```
<table>
<caption>【参考：データ型】</caption>
  <thead>
    <tr>
      <th>種別</th>
      <th>例</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>数値（整数）</td>
      <td>INTEGER, INT</td>
    </tr>
    <tr>
      <td>数値（少数）</td>
      <td>DECIMAL, NUMERIC, FLOAT, DOUBLE, REAL</td>
    </tr>
    <tr>
      <td>文字列（固定長）</td>
      <td>CHAR() 　※()内にはバイト数を書く</td>
    </tr>
    <tr>
      <td>文字列（可変長）</td>
      <td>VARCHAR() 　※()内にはバイト数を書く</td>
    </tr>
    <tr>
      <td>日付や時刻</td>
      <td>TIMESTAMP, DATETIME, DATE, TIME</td>
    </tr>
  </tbody>
</table>



## その他コマンド
基本的には、4大命令（SELECT・UPDATE・DELETE・INSERT INTO）といっしょに使うことが多いコマンドを集めました。
#### AS （別名を付けられる）
```SQL
SELECT 商品名 AS ITEM, 単価 AS PRICE
FROM 売上 AS Sales;
```
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
  </tbody>
</table>

↓

<table>
<caption>Sales</caption>
  <thead>
    <tr>
      <th>ITEM</th>
      <th>PRICE</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
  </tbody>
</table>

#### IS NULL・NOT IS NULL （NULL、もしくは、NULLでないことを見つける）
例）下記表から「単価」に「NULL」が含まれる行だけを取得する

<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>商品A</td>
      <td>¥1000</td>
    </tr>
    <tr>
      <td>商品B</td>
      <td>¥2000</td>
    </tr>
    <tr>
      <td>商品C</td>
      <td>NULL</td>
    </tr>
    <tr>
      <td>商品D</td>
      <td>¥4000</td>
    </tr>
  </tbody>
</table>

```SQL
SELECT *
FROM 売上
WHERE 単価 IS NULL;  /* 「＝ NULL」とは書かないこと！ */
```

↓下記のようになる
<table>
<caption>売上</caption>
  <thead>
    <tr>
      <th>商品名</th>
      <th>単価</th>
    </tr>
  </thead>
  <tbody>
      <tr>
      <td>商品C</td>
      <td>NULL</td>
    </tr>

  </tbody>
</table>

#### BETWEEN 値① AND 値② （範囲を絞る）
例）売上テーブルから、2000円〜4000円の単価がついている行を取得したい
```SQL
SELECT *
FROM 売上
WHERE 単価 BETWEEN 2000 AND 4000;
```
#### IN・NOT IN（値①, 値②,・・・）　（値のいずれかに一致、いずれもに一致しない）
例）売上テーブルから、2000円、もしくは、3000円の単価がついている行を取得したい
```SQL
SELECT *
FROM 売上
WHERE 単価 IN (2000, 3000):
```

#### 比較演算子 + ANY・ALL（値①, 値②,・・・）（いずれか一致なら真、全て一致なら真）
例）売上テーブルから、単価が2000円以上の行を取得したい
```SQL
SELECT *
FROM 売上
WHERE 単価 <= 2000;
```

## Tips

### 「行（レコード）」と「列（カラム）」の見分け方
漢字の見た目で覚えています。
また、「行」の別名である「レコード」は「ー（横棒）」があるので、これも見た目で覚えやすいですね。

![「行」と「列」の見分け方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837551/321c66b0-ebe2-f6ad-907e-cee9b7f3b1e7.png)

### 「行」は WHEREで絞るイメージ

SQLを学び始めたとき、どうやって目的のテーブルに近づけていくのかわかりませんでした。
初めのうちは基本的に、<INS>**WHEREのコマンドで「行」を絞っていく**</INS>というイメージで良いと思いました。

```SQL
SELECT 列名
FROM テーブル名
WHERE 行名     /* 　←「行」はココで絞る！　*/ 
```

## 代表的なDBMSのマニュアル　（※2024/12/07時点）
- MySQL
    - https://dev.mysql.com/doc/
- MariaDB
    - https://mariadb.com/kb/ja/mariadb/
- PostgreSQL
    - https://www.postgresql.jp/document/
- SQLite
    - https://www.sqlite.org/cli.html
- H2 Database
    - https://www.h2database.com/html/commands.html
- Oracle Database
    - https://docs.oracle.com/cd/F39414_01/sqlrf/index.html
- Db2
    - https://www.ibm.com/docs/ja/db2
- SQL Server
    - https://learn.microsoft.com/ja-jp/sql/sql-server/?view=sql-server-ver16

## 参考

https://book.impress.co.jp/books/1123101107