理解度チェック問題：H2 Database（H2DB）におけるテーブル作成方法

# 理解度チェック問題：H2 Database（H2DB）におけるテーブル作成方法

以下の問題に回答して、H2 Databaseを使用したテーブル作成方法に関する理解度を確認しましょう。

---

## 問題1：基本構文

**Q1:** 次のSQL文のうち、正しいテーブル作成の基本構文を選んでください。

A. 
```sql
CREATE TABLE employees {
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
};
```

B. 
```sql
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
```

C. 
```sql
CREATE TABLE employees [
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
];
```

D. 
```sql
CREATE TABLE employees < 
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
>;
```

---

## 問題2：データ型の選択

**Q2:** `price`カラムに適切なデータ型を選んでください。価格には小数点以下2桁までの値を保存します。

A. `INT`

B. `VARCHAR(50)`

C. `DECIMAL(10, 2)`

D. `BOOLEAN`

---

## 問題3：主キーの設定

**Q3:** 複合主キーを設定する場合、どのようにSQL文を記述しますか？

A. 
```sql
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY order_id, product_id
);
```

B. 
```sql
CREATE TABLE order_items (
    order_id INT PRIMARY KEY,
    product_id INT PRIMARY KEY,
    quantity INT
);
```

C. 
```sql
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
```

D. 
```sql
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT
);
```

---

## 問題4：外部キーの設定

**Q4:** `employees`テーブルの`dept_id`カラムが`departments`テーブルの`dept_id`を参照する外部キーである場合、正しいSQL文はどれですか？

A. 
```sql
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY dept_id REFERENCES departments(dept_id)
);
```

B. 
```sql
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN departments(dept_id) KEY dept_id
);
```

C. 
```sql
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
```

D. 
```sql
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    REFERENCES departments(dept_id) FOREIGN KEY (dept_id)
);
```

---

## 問題5：制約の追加

**Q5:** 以下のうち、`username`カラムにNULL値を許可しない制約を追加するSQL文はどれですか？

A. 
```sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);
```

B. 
```sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);
```

C. 
```sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) UNIQUE,
    email VARCHAR(100)
);
```

D. 
```sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) DEFAULT 'guest',
    email VARCHAR(100)
);
```

---

## 問題6：インデックスの作成

**Q6:** `email`カラムにインデックスを作成する正しいSQL文はどれですか？

A. 
```sql
CREATE INDEX email ON users(email);
```

B. 
```sql
CREATE INDEX idx_email ON users(email);
```

C. 
```sql
CREATE INDEX users(email) ON email;
```

D. 
```sql
CREATE INDEX ON users(email) idx_email;
```

---

## 問題7：テーブルの変更

**Q7:** 既存の`users`テーブルに`phone`カラムを追加する正しいSQL文はどれですか？

A. 
```sql
ALTER TABLE users ADD phone VARCHAR(15);
```

B. 
```sql
ALTER TABLE users ADD COLUMN phone VARCHAR(15);
```

C. 
```sql
MODIFY TABLE users ADD phone VARCHAR(15);
```

D. 
```sql
CHANGE TABLE users ADD phone VARCHAR(15);
```

---

## 問題8：テーブルの削除

**Q8:** `orders`テーブルを存在する場合のみ削除するSQL文はどれですか？

A. 
```sql
DELETE TABLE orders;
```

B. 
```sql
DROP TABLE orders;
```

C. 
```sql
DROP TABLE IF EXISTS orders;
```

D. 
```sql
REMOVE TABLE IF EXISTS orders;
```

---

## 問題9：制約の理解

**Q9:** `CHECK`制約を使用して、`age`カラムが18以上であることを保証するSQL文の一部を完成させてください。

```sql
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT,
    CONSTRAINT chk_age _______
);
```

A. `CHECK (age > 18)`

B. `CHECK age >= 18`

C. `CHECK (age >= 18)`

D. `CHECK age > 18`

---

## 問題10：実践問題

**Q10:** 以下の要件を満たす`products`テーブルを作成するSQL文を記述してください。

- `product_id`: 自動インクリメントの主キー
- `product_name`: 最大100文字の非NULL文字列、ユニーク
- `price`: 小数点以下2桁のDECIMAL型、非NULL
- `stock`: 整数型、デフォルト値は0
- `created_at`: 現在のタイムスタンプをデフォルト値とする

---

---

## 解答例

以下は問題の解答例です。自己採点にご利用ください。

### 解答1:
**B**
```sql
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
```

### 解答2:
**C**  
`DECIMAL(10, 2)`

### 解答3:
**C**
```sql
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
```

### 解答4:
**C**
```sql
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
```

### 解答5:
**B**
```sql
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);
```

### 解答6:
**B**
```sql
CREATE INDEX idx_email ON users(email);
```

### 解答7:
**B**
```sql
ALTER TABLE users ADD COLUMN phone VARCHAR(15);
```

### 解答8:
**C**
```sql
DROP TABLE IF EXISTS orders;
```

### 解答9:
**C**
```sql
CONSTRAINT chk_age CHECK (age >= 18)
```

### 解答10:
```sql
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL UNIQUE,
    price DECIMAL(10, 2) NOT NULL,
    stock INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

---

これらの問題を通じて、H2 Databaseを用いたテーブル作成に関する理解を深めてください。疑問点があれば、チュートリアルや公式ドキュメントを参照し、再度学習を進めましょう。