diff --git a/src/pages/sql/010-foundation.mdx b/src/pages/sql/010-foundation.mdx index c707b97..51c338a 100644 --- a/src/pages/sql/010-foundation.mdx +++ b/src/pages/sql/010-foundation.mdx @@ -8,52 +8,157 @@ ## TOC -`users` +## 考え方 + +データベースは、情報を整理して保存し、必要に応じて取り出したり更新したりするためのシステムです。 +SQL(Structured Query Language)はこのデータベースと対話するための言語であり、データの操作や管理に使用されます。 + +データベースを作ると、その見た目は表(テーブル)になります。 +このテーブルを如何に操作するかがSQLの基本です。 + +なお、`MySQL`や`PostgreSQL`、`SQLite`など様々なデータベースシステムがありますが、ここではどのシステムでも共通するSQLの基本的な部分を説明します。 + +**例**: `users`テーブル + +テーブル構造 | 列名 | 型 | | :----- | :-- | -| id | INT | +| `id` | INT | | name | VARCHAR(100) | | address | VARCHAR(255) | -
+データ例 | id | name | address | -| :-- | :---- | :------ | +| --: | :---- | :------ | | 1 | 山田太郎 | 東京都千代田区 | - -`products` - -| 列名 | 型 | -| :----- | :-- | -| id | INT | -| name | VARCHAR(100) | -| price | DECIMAL(10,2) | -| stock | INT | - -`orders` - -| 列名 | 型 | -| :----- | :-- | -| id | INT | -| user_id | INT | -| product_id | INT | -| quantity | INT | +| 2 | 佐藤花子 | 東京都新宿区 | +| 3 | 鈴木一郎 | 愛知県名古屋市 | ## 型 -## SELECT +代表的な型を紹介します。 -### WHERE +| 型名 | 説明 | データ例 | +| :----- | :-- | :------ | +| `INT` | 整数 | 1, 100, -50 | +| `BIGINT` | 21億より大きい数に対応した整数 | 10000000000 | +| `VARCHAR(n)` | 文字列(最大n文字まで) | '山田太郎', 'Hello' | +| `TEXT` | 文字列(長文向け) | 'これは長い文章です。' | +| `DATETIME` | 日付と時間 | '2024-01-01 12:00:00' | -### JOIN +## テーブルそのものを操作する -### GROUP BY +### テーブルを作成 (CREATE TABLE) -### ORDER BY +```sql +CREATE TABLE users ( + id INT PRIMARY KEY, + name VARCHAR(100), + address VARCHAR(255) +); +``` -## INSERT +### テーブルを削除 (DROP TABLE) -## UPDATE +```sql +DROP TABLE users; +``` -## DELETE +## テーブルからデータを操作する + +### データを追加 (INSERT) + +どんな操作をするにしても、まずはデータが必要です。 +データを追加するテーブルの構造に合わせて、`INSERT`文を使ってデータを追加します。 + +```sql +-- 1件のデータを追加する場合 +INSERT INTO users (id, name, address) VALUES (1, '山田太郎', '東京都千代田区'); + +-- 複数件のデータを追加する場合 +INSERT INTO users (id, name, address) +VALUES +(2, '佐藤花子', '東京都新宿区'), +(3, '鈴木一郎', '愛知県名古屋市'); +``` + +### データを取得 (SELECT) + +#### 登場したすべてのテーブルから、すべての列を取得する場合 + +```sql +SELECT * FROM users; +``` + +#### 登場した特定のテーブルから、すべての列を取得する場合 + +```sql +SELECT users.* FROM users; +``` + +#### 特定の列だけを取得する場合 + +```sql +SELECT users.id, users.name FROM users; +``` + +### 条件を指定する (WHERE) + +`SELECT`でデータを全件取得したとしても、実際にはそこから何かを探すことが多いです。 +この、テーブルから特定の条件に合うデータだけを取得したい場合、`WHERE`句を使います。 + +後述する`UPDATE`や`DELETE`でも、同様に使うことができます。 + +#### 完全に一致するものを取得する場合 + +```sql +-- IDが1のユーザーを取得する +SELECT * FROM users WHERE id = 1; + +-- 名前が「山田太郎」のユーザーを取得する +SELECT * FROM users WHERE name = '山田太郎'; +``` + +#### 部分的に一致するものを取得する場合 + +```sql +-- 名前のどこかに「花」を含むユーザーを取得する +SELECT * FROM users WHERE name LIKE '%花%'; + +-- 住所が「東京都」で始まるユーザーを取得する +SELECT * FROM users WHERE address LIKE '東京都%'; + +-- 名前が「太郎」で終わるユーザーを取得する +SELECT * FROM users WHERE name LIKE '%太郎'; +``` + +#### 範囲を指定する場合 + +```sql +-- IDが2以上のユーザーを取得する +SELECT * FROM users WHERE id >= 2; +``` + +### データを更新 (UPDATE) + +データを更新するには、`UPDATE`文を使います。 +バックアップなどを取らずに更新をする場合、元に戻せないことがあるため、注意が必要です。 + +あらかじめ、`SELECT`文で更新対象のデータを確認してから実行すると良いでしょう。 + +```sql +-- IDが1のユーザーの住所を更新する +UPDATE users SET address = '東京都港区' WHERE id = 1; +``` + +### データを削除 (DELETE) + +`UPDATE`と同様に、`DELETE`文もバックアップなどを取らずに実行すると元に戻せないことがあるため、注意が必要です。 +あらかじめ、`SELECT`文で削除対象のデータを確認してから実行すると良いでしょう。 + +```sql +-- IDが3のユーザーを削除する +DELETE FROM users WHERE id = 3; +```