👑SQLの世界へようこそ！〜プリンセスのクエリ入門〜

# 👑 はじめてのSQL！プリンセスと学ぶクエリ💫

こんにちは、ごきげんよう🌷  
プリンセスエンジニアのかえちゃんです💻👑

今日は、SQLの基本のキ！  
「SELECT文」を中心に、魔法みたいに使える条件指定や絞り込みの呪文を  
プリンセス目線で解説していきます🌟

> 「SQLって、いきなり記号とか単語が多くて引いちゃう…」  
> そんなあなたも安心して読み進められるように、  
> パフェを選ぶくらい軽い気持ちでいきましょう💖

---

## 🍰 SELECT FROM 〜データベースからデータを取り出す魔法〜

```sql
SELECT カラム名 FROM テーブル名;
```
📌 `SELECT` は「どの情報がほしいか"」  
📌 `FROM` は「どこから取るか」

例：「お姫様一覧」テーブルから名前だけほしいときは…

```sql
SELECT name FROM princesses;
```

| name |
| ---- |
| Luna |
| Lily |
| Mira |

こんな感じでプリンセスたちの名前が取得できるの！！

## 💎 DISTINCT 〜かぶってるデータを1つにまとめる魔法〜

```sql
SELECT DISTINCT name FROM princesses;
```
同じ名前のプリンセスが何人も登録されてたら、1人ずつでいいよね？ってときに使う魔法✨

| name |
| ---- |
| Luna |
| Luna |
| Lily |

→SELECT DISTINCT name を使うと…

| name |
| ---- |
| Luna |
| Lily |

こんな感じで重複無いデータがGETできちゃうの！！

## 🌙 WHERE 〜条件で絞り込む魔法〜

```sql
SELECT * FROM princesses WHERE age > 18;
```
おとなプリンセスだけ見たいときは、WHEREで条件をつけちゃう💫
*←これは全カラム指定してるのよ！！


| name | age |
| ---- | --- |
| Luna | 17  |
| Lily | 19  |
| Mira | 21  |

→ 18歳より上だけ見ると…

| name | age |
| ---- | --- |
| Lily | 19  |
| Mira | 21  |

こんな感じでおとなプリンセスたちのnameと普段は秘密にしているageまで取得できちゃうの！！

## 🌹 AND / OR 〜さらに条件を組み合わせる魔法〜

```sql
SELECT * FROM princesses WHERE age > 18 AND kingdom = 'Rose';
```

ANDは「どちらも満たす」

ORは「どちらかでOK」

って意味なの！！叩き込んでね💖


| name | age | kingdom |
| ---- | --- | ------- |
| Luna | 20  | Rose    |
| Lily | 17  | Rose    |
| Mira | 21  | Moon    |

→ ANDで絞ると…

| name | age | kingdom |
| ---- | --- | ------- |
| Luna | 20  | Rose    |

こんな感じで絞り込んだデータ取得できちゃうの！！


## 📏 BETWEEN 〜この範囲に入ってるか見る魔法〜

```sql
SELECT * FROM dresses WHERE price BETWEEN 100 AND 300;
```

お小遣いの範囲（100〜300）でドレスを探すときに便利💸

例
| dress\_name  | price |
| ------------ | ----- |
| Pink Silk    | 120   |
| Blue Lace    | 300   |
| Gold Sparkle | 400   |

→ 範囲内のドレスは…

| dress\_name | price |
| ----------- | ----- |
| Pink Silk   | 120   |
| Blue Lace   | 300   |

お得なドレスも探せちゃうわあ💖

## 💌 IN / NOT IN 〜リストから選ぶ魔法〜

```sql
SELECT * FROM castle WHERE location IN ('North', 'South');
```

IN：リスト内のものだけ

NOT IN：リスト外のものだけ

意味も叩き込んでねええ💖

例

| castle\_name | location |
| ------------ | -------- |
| Aurora       | North    |
| Belle        | South    |
| Eliza        | East     |

→ INで絞ると…

| castle\_name | location |
| ------------ | -------- |
| Aurora       | North    |
| Belle        | South    |

## 💫 LIKE 〜あいまい検索の魔法〜

```sql
SELECT * FROM fairy WHERE name LIKE 'L%';
```

%は「あとに何が来てもOK」というあいまい検索記号✨
このSQLは「Lから始まる名前」が対象💖

| name |
| ---- |
| Luna |
| Lily |
| Mira |

→ Lから始まるのは…

| name |
| ---- |
| Luna |
| Lily |


これならmyFriendたちもすぐに探せちゃうわあ💖

## 🫧 IS NULL / IS NOT NULL 〜空っぽかどうかの魔法〜

```sql
SELECT * FROM tiaras WHERE owner IS NULL;
```

IS NULL：空っぽなものだけ

IS NOT NULL：持ち主がいるものだけ

少し、難しくなってきたわね、でも叩き込むのよ💖


| tiara\_name | owner |
| ----------- | ----- |
| Rose Gold   | NULL  |
| Crystal     | Luna  |
| Ruby Star   | Mira  |

→ IS NULLだと…

| tiara\_name | owner |
| ----------- | ----- |
| Rose Gold   | NULL  |

## 🧺 LIMIT 〜見たい数だけに絞る魔法〜
```sql
SELECT * FROM carriages LIMIT 3;
```

全部見なくていいよってときは、LIMITで優雅に閲覧🎀


| carriage\_name |
| -------------- |
| Crystal One    |
| Golden Wing    |
| Silver Moon    |
| Dream Cloud    |

→ LIMIT 3だと…

| carriage\_name |
| -------------- |
| Crystal One    |
| Golden Wing    |
| Silver Moon    |

優雅だわねえ💖

## 🧁 GROUP BY 〜グループにまとめて見る魔法〜

```sql
SELECT kingdom, COUNT(*) FROM princesses GROUP BY kingdom;
```

「王国ごとに何人いるか知りたい」そんなときに✨


| name | kingdom |
| ---- | ------- |
| Luna | Rose    |
| Lily | Rose    |
| Mira | Moon    |

→ GROUP BYすると…

| kingdom | COUNT(\*) |
| ------- | --------- |
| Rose    | 2         |
| Moon    | 1         |

こんな簡単に特定できちゃうのね💖

#### でも、GROUP BYの注意点があってね

たとえば、こんなプリンセステーブルがあるとするよ👇

| name | kingdom |
|------|---------|
| Luna | Rose    |
| Lily | Rose    |
| Mira | Moon    |

これに対して
```sql
SELECT kingdom, name FROM princesses GROUP BY kingdom;
```

### ❌ こんな書き方はエラーになっちゃう…

kingdomごとにグループ化してるけど、その中に複数のnameが混ざってると、どのnameを表示すればいいか決められないからエラーになるの！！！
「ローズ王国に何人もプリンセスがいるけど、誰の名前を出せばいいの…？」ってコンピューターくんが混乱しちゃう！


#### ✅ 解決策①：集計関数を使う魔法🪄

```sql
SELECT kingdom, COUNT(*) FROM princesses GROUP BY kingdom;
```
| kingdom | COUNT(\*) |
| ------- | --------- |
| Rose    | 2         |
| Moon    | 1         |

👉 これはOK！「王国ごとの人数」を出してるから、魔法が正しく動く✨


#### ✅ 解決策②：GROUP BY の軸を増やす魔法🧙‍♀️

```sql
SELECT kingdom, name FROM princesses GROUP BY kingdom, name;
```

| kingdom | name |
| ------- | ---- |
| Rose    | Luna |
| Rose    | Lily |
| Moon    | Mira |

👉 「王国＋名前」の組み合わせでグループにするから、もう混乱しない！


### 🎀 まとめ：GROUP BYでの魔法のルール

GROUP BYしていないカラムをSELECTで出そうとすると、
グループの中で値がバラバラな場合にエラーになることがあるよ💥

すべて同じ値だったら通る場合もあるけど、基本はセットでグループ化しよう！
または COUNT() や MAX() などの集計魔法をかけてあげてね🪄
※COUNT() や MAX()はあとで教えるよ💖



> 補足（ちょっとテクニカルな人向け）
> MySQLでは、ONLY_FULL_GROUP_BY が 無効 のとき、グループ化してないカラムも通っちゃうことがある（非推奨）
PostgreSQL や BigQuery は厳格モード！
👉 SELECTに書くカラムは 全部GROUP BYに含めるか、集計関数で包むのが必須だよ


>ONLY_FULL_GROUP_BY が無効な場合に関する記述は、以下の公式ドキュメントに記載あるからみてね
>If ONLY_FULL_GROUP_BY is disabled, a MySQL extension to the standard SQL use of GROUP BY permits the select list, HAVING condition, or ORDER BY list to refer to nonaggregated columns even if the columns are not functionally dependent on GROUP BY columns. This causes MySQL to accept the preceding query. In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic, which is probably not what you want. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Result set sorting occurs after values have been chosen, and ORDER BY does not affect which value within each group the server chooses. Disabling ONLY_FULL_GROUP_BY is useful primarily when you know that, due to some property of the data, all values in each nonaggregated column not named in the GROUP BY are the same for each group.

https://dev.mysql.com/doc/refman/8.4/en/group-by-handling.html?utm_source=chatgpt.com



---

## 🧁 集計関数について 〜まとめて数える魔法〜

プリンセスの世界でも、「人数を数えたり」「平均を出したり」する場面はよくあるよね？  
そんなときに使えるのが **集計関数（Aggregation Functions）** という魔法✨


### 🎀 COUNT() 〜何人いるか数える魔法〜
👉 登録されてるプリンセスの人数を数えてくれるの！

```sql
SELECT COUNT(*) FROM princesses;
```

| name | kingdom |
| ---- | ------- |
| Luna | Rose    |
| Lily | Rose    |
| Mira | Moon    |

→ このクエリの結果は…

| COUNT(\*) |
| --------- |
| 3         |


### 👗 SUM() 〜ドレスの合計金額を出す魔法〜

```sql
SELECT SUM(price) FROM dresses;
```

| dress\_name  | price |
| ------------ | ----- |
| Pink Silk    | 120   |
| Blue Lace    | 300   |
| Gold Sparkle | 350   |

→ このクエリの結果は…

| SUM(price) |
| ---------- |
| 770        |

👉 すべてのドレスの価格をぜ〜んぶ足してくれる魔法💸
パーティー準備の予算チェックにぴったり✨


### 🌸 AVG() 〜平均金額を出す魔法〜

```sql
SELECT AVG(price) FROM dresses;
```

| dress\_name  | price |
| ------------ | ----- |
| Pink Silk    | 120   |
| Blue Lace    | 300   |
| Gold Sparkle | 350   |

→ このクエリの結果は…

| AVG(price) |
| ---------- |
| 256.67     |

👉 お姫様のファッション予算、ちょうどよくするにはこの魔法🌷
※結果は小数になることもあるよ！


### 👑 MAX() / MIN() 〜いちばん高い or 安いアイテムを探す魔法〜

```sql
SELECT MAX(price) FROM dresses;
SELECT MIN(price) FROM dresses;
```

| dress\_name  | price |
| ------------ | ----- |
| Pink Silk    | 120   |
| Blue Lace    | 300   |
| Gold Sparkle | 350   |

→ MAX(price) の結果：

| MAX(price) |
| ---------- |
| 350        |

→ MIN(price) の結果：

| MIN(price) |
| ---------- |
| 120        |

👑 いちばんリッチなドレス or お得なドレスを一瞬で探せちゃう魔法🎀




## 🧁 ORDER BYについて（昇順・降順の魔法）

プリンセスたちが着るドレスを、**値段が安い順や高い順で見たいとき**に使えるのが  
`ORDER BY` という並び替えの魔法✨

---

### 📈 昇順（安い順に並べる）〜 `ASC` の魔法

```sql
SELECT * FROM dresses ORDER BY price ASC;
```

| dress\_name  | price |
| ------------ | ----- |
| Blue Lace    | 300   |
| Gold Sparkle | 350   |
| Pink Silk    | 120   |

→ price を昇順（小さい順）に並べると…

| dress\_name  | price |
| ------------ | ----- |
| Pink Silk    | 120   |
| Blue Lace    | 300   |
| Gold Sparkle | 350   |

👉 ASC は Ascending（昇順） の略だよ🌷
プリンセスのお財布にやさしい順番で見れる魔法💰

>#### 🎀 補足：デフォルトは ASC
>```sql
>SELECT * FROM dresses ORDER BY price;
>```
>👉 これは ORDER BY price ASC と同じ意味になるよ！
昇順がデフォルトだから、書かなくてもOKなときもある💡



### 📉 降順（高い順に並べる）〜 DESC の魔法

```sql
SELECT * FROM dresses ORDER BY price DESC;
```

→ price を降順（大きい順）に並べると…

| dress\_name  | price |
| ------------ | ----- |
| Gold Sparkle | 350   |
| Blue Lace    | 300   |
| Pink Silk    | 120   |

👉 DESC は Descending（降順） の略👑
一番豪華なドレスからチェックしたいときにぴったりな魔法🎀


## 🌷 おわりに

今回は、プリンセスらしくやさしく、でもちゃんと理解して使えるSQLを紹介しました✨
「クエリって難しそう…」って思っていた方も、
ちょっと使ってみたいかも💖って思ってもらえたらとってもうれしいです！

次はね、

- 条件によって表示を変える **CASE式**
- クエリの中でさらに別のクエリを書く **サブクエリ**

このあたりを紹介していく予定！

ひとつずつできることが増えていくのって、ちょっと楽しいよね。  
このまま一緒に、もっともっっっと進んでいこ〜💖