SQLメモ

 # はじめに
 SQL学習中に使用したコマンドなどを、例とともにメモします。


# SQLとは
データベースからデータを取得したり変更したりするための言語
テーブルやデータベースを作成、更新、削除、取得などができる

# SQLコマンドまとめ

## データベース作成等

### データベース作成

```
CREATE DATABASE データベース名;
```

```例.
CREATE DATABASE shop;
```

### カラム作成

```
CREATE TABLE テーブル名 (カラム名1 カラム型,...,カラム名n カラム型);
```

```例.
CREATE TABLE crop (id INT,name VARCHAR(100),plant_family VARCHAR(100),stock INT);
```

### テーブルを見る
```例.
SHOW TABLES;

+----------------+
| Tables_in_shop |
+----------------+
| crop           |
+----------------+
```

### 指定したテーブルの構成を見る
```
DESC テーブル名;
```

```例.
DESC crop;

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int          | YES  |     | NULL    |       |
| name         | varchar(100) | YES  |     | NULL    |       |
| plant_family | varchar(100) | YES  |     | NULL    |       |
| stock        | int          | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
```
### テーブルにデータを挿入する
```
INSERT INTO テーブル名 (カラム名1, カラム名2, ...) 
  VALUES (値1, 値2, ...); 
```

```例.
INSERT INTO crop (id, name, plant_family, stock) 
  VALUES (1, 'トマト', 'ナス科', 150); 
```

## データベース取得

### テーブル全てを取得

```
SELECT * 
  FROM テーブル名; 
```

```例.
SELECT * 
  FROM crop; 

+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
|    3 | キュウリ         | ウリ科        | 200      |
|    4 | キャベツ         | アブラナ科     |          |
+------+-----------------+--------------+----------+
```

### カラムを絞り込んで取得

```
SELECT カラム名1, カラム名2, ..., カラム名n 
  FROM テーブル名; 
```

```例.
SELECT name, stock 
  FROM crop; 

+-----------------+----------+
| name            | stock    |
+-----------------+----------+
| トマト           | 150      |
| ナス             | 80       |
| キュウリ         | 200        |
| キャベツ         |           |
+-----------------+----------+
```
カラム名を変更して出力することも可能
```例.
SELECT name AS '名前', stock AS '在庫', 
  FROM crop; 

+-----------------+----------+
| 名前             | 在庫     |
+-----------------+----------+
| トマト           | 150      |
| ナス             | 80       |
| キュウリ         | 200       |
| キャベツ         |           |
+-----------------+----------+
```

### 重複削除(DISTINCT)
科名の重複なし科名カラムを取得

```例.
SELECT DISTINCT(plant_family)
  FROM crop;
  
+--------------+
| plant_family |
+--------------+
| ナス科        |
| ウリ科        |
| アブラナ科     |
+--------------+
```

### 条件指定(WHERE)

在庫が150以上の条件指定を行います

```例.
SELECT name, stock
  FROM crop
  WHERE stock > 150;
  
+--------------+--------+
| name         | stock  |
+--------------+--------+
| トマト        |    150 |
| キュウリ       |    200 |
+--------------+--------+
```

### 両方を満たす(AND)

在庫が150以上のナス科の条件指定を行います

```例.
SELECT *
  FROM crop
  WHERE stock > 150 AND plant_family = 'ナス科';
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
+------+-----------------+--------------+---------+
```

### どちらかを満たす(OR)

在庫が150以上またはナス科の条件指定を行います

```例.
SELECT *
  FROM crop
  WHERE stock > 150 OR plant_family = 'ナス科';
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
|    3 | キュウリ         | ウリ科        | 200      |
+------+-----------------+--------------+----------+
```

### ~の間(BETWEN)

在庫が50~150の間の条件指定を行います

```例.
SELECT *
  FROM crop
  WHERE stock BETWEEN 50 AND 150;
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
+------+-----------------+--------------+----------+
```

### まとめて指定(IN)

ウリ科とアブラナ科の作物を指定

```例.
SELECT *
  FROM crop
  WHERE plant_family IN ('ウリ科', 'アブラナ科');
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    3 | キュウリ         | ウリ科        | 200      |
|    4 | キャベツ         | アブラナ科     |          |
+------+-----------------+--------------+----------+
```

### まとめて否定(NOT IN)

ウリ科とアブラナ科以外の作物を指定

```例.
SELECT *
  FROM crop
  WHERE plant_family NOT IN ('ウリ科', 'アブラナ科');
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
+------+-----------------+--------------+----------+
```

### あいまい検索(LIKE)

名前がトから始まる作物を指定

```例.
SELECT *
  FROM crop
  WHERE name LIKE 'ト%';
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
+------+-----------------+--------------+----------+
```

### 空(値が不明)のレコードを取得(IS NULL)

stockが空の作物を指定

```例.
SELECT *
  FROM crop
  WHERE stock IS NULL;
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    4 | キャベツ         | アブラナ科     |          |
+------+-----------------+--------------+----------+
```

### 空(値が不明)じゃないレコードを取得(IS NOT NULL)

stockが空じゃない作物を指定

```例.
SELECT *
  FROM crop
  WHERE stock IS NOT NULL;
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
|    3 | キュウリ         | ウリ科        | 200      |
+------+-----------------+--------------+----------+
```

### 行数を指定して取得(LIMIT)

行数上限を2で指定して取得

```例.
SELECT *
  FROM crop
  LIMIT 2;
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
+------+-----------------+--------------+----------+
```

### 並び替え(ORDER BY)

在庫で昇順に並び替えして取得

```例.
SELECT *
  FROM crop
  ORDER BY stock;
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    4 | キャベツ         | アブラナ科     |          |
|    2 | ナス             | ナス科        | 80      |
|    1 | トマト           | ナス科        | 150     |
|    3 | キュウリ         | ウリ科        | 200      |
+------+-----------------+--------------+----------+
```

在庫で降順に並び替えして取得

```例.
SELECT *
  FROM crop
  ORDER BY stock DESC;
  
+------+-----------------+--------------+---------+
| id   | name            | plant_family | stock   |
+------+-----------------+--------------+---------+
|    3 | キュウリ         | ウリ科        | 200      |
|    1 | トマト           | ナス科        | 150     |
|    2 | ナス             | ナス科        | 80      |
|    4 | キャベツ         | アブラナ科     |          |
+------+-----------------+--------------+----------+
```