SQL　DDL(データ定義言語)のまとめ

アウトプット:writing_hand:
増える可能性あり
MySQLを使用しているので、一部内容が異なる可能性あります。

## DDLとは
データベースやテーブル定義を作成したり、削除や追加、変更したりする命令文

## 作成
**データベースの作成**
```java
CREATE DATABASE データベース名;

例) 
CREATE DATABASE test;

作成したデータベースを使うには
USE 使いたいデータベース名;
例)
USE test;
```

**テーブル作成**
```java
CREATE TABLE テーブル名(
 列名 データ型(桁数) この列の制約,
 列名 データ型(桁数) この列の制約, 
 .....
 );
 
例)
CREATE TABLE user(
user_id int  PRIMARY KEY,
name VARCHAR(20) NOT NULL,
pass int NOT NULL
);
```

## 削除
**データベース削除**
```java
DROP DATABASE データベース名;

例)
DROP DATABASE test;
```

**テーブル削除**
```java
DROP TABLE テーブル名;
 
例)
DROP TABLE user;
```
**列の削除**
```java
ALTER TABLE テーブル名
DROP COLUMN 列名;

例)
ALTER TABLE user;
DROP COLUMN pass;
```

**条件削除**
```java
DELETE FROM テーブル名
WHERE 条件式;

例)
DELETE FROM user
WHERE user_id > 20;
```

**テーブル全レコードの削除**
全レコードを高速に削除されるが、テーブルの構造やインデックスは保持される。
削除後のレコードは復元できない
```java
TRUNCATE TABLE テーブル名;

例)
TRUNCATE TABLE user;
```

## 追加
**データの追加**
```java
INSERT INTO テーブル名(列名1,列名2,...)
VALUES(値1,値2,...);

例)
INSERT INTO user(name, pass)
VALUES('タロウ', 1234)
      ('ハナコ', 5678);
```

## 変更
**列の追加**
既存のテーブルに新しい列を追加する
```java
ALTER TABLE テーブル名
ADD COLUMN 列名 データ型(桁数) 制約;

例) 
ALTER TABLE user
ADD COLUMN emali VARCHAR(50);
```
**列の変更**
既存のテーブル内にある列(カラム)のデータ型や制約を変更する操作。
列の名前やデータ型、桁数、制約の変更。
```java
ALTER TABLE テーブル名
MODIFY COLUMN データ型(桁数) 制約;

例) 列のデータ型の変更(CHAR(20)→VARCHAR(50)）
ALTER TABLE user
MODIFY COLUMN pass VARCHAR(50);

例) 列に制約を追加
ALTER TABLE user
MODIFY COLUMN email VARCHAR(50) NOT NULL;
```

**列名の変更(MySQL)**
`CHANGE COLUMN`を使用する際は、新しい列名とデータ型を指定する。データ型や制約も同時に変更するので、変更がない場合でも元の情報を際入力が必要。
```java
ALTER TABLE テーブル名
CHANGE COLUMN 旧列名 新列名 データ型(桁数) 制約;

例) name→user_name
ALTER TABLE user
CHANGE COLUMN name username VARCHAR(50) NOT NULL;
```

## 更新
**データの更新**
```java
UPDATE テーブル名
SET 列名1 = 新しい値1, 列名2 = 新しい値2, ...
WHERE 条件;

例)
UPDATE user
SET name = 'ジロウ', pass = 9876
WHERE user_id = 1;
```

## 選択
どのテーブルか、そのテーブルの表示したい列名を選択するときに使う

**全データの選択**
```java
SELECT * FROM テーブル名;

例)
SELECT * FROM user;
```

**データの選択**
```java 
SELECT 列名1, 列名2, ...
FROM テーブル名;

例)
SELECT user_id,name 
FROM user;
```


**条件選択**
```java
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件

例)
SELECT user_id,name
FROM user
WHERE user_id > 50;
```

## データの並び替え
**昇順(値が小さい順)**
ひらがな(カタカナ）は50音順
```java 
SELECT 列名1, 列名2, ...
FROM テーブル名
ORDER BY 列名 ABC;

例) IDの値が小さい順に並べられる
SELECT name, pass
FROM user
ORDER BY user_id ABC;

```

**降順(値が大きい順)**
ひらがな(カタカナ)は50音順の逆
```java
SELECT 列名1, 列名2, ...
FROM テーブル名
ORDER BY 列名 DESC;

例) IDの値が大きい順に並べられる
SELECT name, pass
FROM user
ORDER BY user_id DESC;
```

## 命令文
比較演算子
```java
//等しい
SELECT * FROM テーブル名 WHERE 列名 = 値;

例)
SELECT * FROM users WHERE age = 25;



//等しくない(!= または　<>）
SELECT * FROM テーブル名 WHERE 列名 != 値;
または
SELECT * FROM テーブル名 WHERE 列名 <> 値;

例)
SELECT * FROM users WHERE age != 25;



//よりおおきい
SELECT * FROM テーブル名 WHERE 列名 > 値;
例)
SELECT * FROM users WHERE age > 25;



//以上
SELECT * FROM テーブル名 WHERE 列名 >= 値;

例)
SELECT * FROM users WHERE age >= 25;



//より小さい
SELECT * FROM テーブル名 WHERE 列名 < 値;

例)
SELECT * FROM users WHERE age < 25;



//以下
SELECT * FROM テーブル名 WHERE 列名 <= 値;

例)
SELECT * FROM users WHERE age <= 25;
```

**BETWEEN**
指定した範囲内のレコードを選択する
```java
SELECT * FROM テーブル名 WHERE 列名 BETWEEN 値1 AND 値2;

例) 年齢が20以上30以下を選択
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
```

**IN**
指定したリスト内のいずれかの値と一致するレコードを選択
```java
SELECT * FROM テーブル名 WHERE 列名 IN (値1, 値2, ...);

例) 年齢が25.30.35を選択
SELECT * FROM users WHERE age IN (25, 30, 35);
```

**LIKE**
パターンに一致するレコードを選択(ワイルドカードを使用)
```java
SELECT * FROM テーブル名 WHERE 列名 LIKE パターン;

例) 名前がAで始めるレコードを選択
SELECT * FROM users WHERE name LIKE 'A%';

例) 末尾がAで終わるレコードを選択
SELECT * FROM users WHERE name LIKE '%A';

例) 文字列の一部にタロウが含まれる
SELECT * FROM users WHERE name LIKE '%タロウ%';

例) 特定の文字数に一致(タロウ)
SELECT * FROM users WHERE name LIKE 'タ_ウ
';

例)特定の文字以外に一致(あ以外で始まる）
SELECT * FROM users WHERE name LIKE '[^あ]%';

例)ちょうど３文字の名前に一致
SELECT * FROM users WHERE name LIKE '___';
``` 

**IS NULL**
NULL値をもつレコードを選択する
```java
SELECT * FROM テーブル名 WHERE 列名 IS NULL;

例)
SELECT * FROM users WHERE email IS NULL;
```

**IS NOT NULL**
NULL値でないレコードを選択
```java
SELECT * FROM テーブル名 WHERE 列名 IS NOT NULL;

例)
SELECT * FROM users WHERE email IS NOT NULL;
```