【SQL入門】プログラム初心者が最初に学んだSQLを復習するための練習帳《その1》

プログラミング超初心者がSQL入門編を学び、次へ進もうとすると忘れるため備忘録目的で記事を書きました。

具体的な取り組み方法[^1]。

取り組むときの注意[^2]。

[^1]: 回答用のファイル(mdファイル)を別途用意して練習帳(この記事)のコードをコピーする。回答用の中にある《答え》の部分を《回答欄》に置き換え、すべてのコードを削除。回答用のファイルをVSコードで開き、コードを書く。やり方は[Qiitaの【Markdown記法 チートシート】を活用してMarkdownをマスターする！《答え編》](https://qiita.com/asuka-80/items/296885245cc27ad46f87)と同じ要領です。

[^2]:mdファイルに書いているのでMarkdownと異なり、コードを間違えても気づきにくいです。


# 練習帳で使うテーブル

![SQL1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/ffb99f4b-7a2e-05aa-594d-cdb17184c7de.png)

:::note
![SQL1-2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/b213fdf3-1081-ac95-96ce-61eb45b8f15c.png)
:::

|データ型|データ|
|:--:|:--:|
|数値|1|
|テキスト|"飛鳥"|
|日付|"2023-05-01"|

## 1&emsp;`データベースからデータを取得する(クエリ)`
### 《問題①》&thinsp;`asuka_purchases`テーブルから`name`カラムを取得する
#### 《答え①》
 ```sql:ex.sql
SELECT name
FROM asuka_purchases;
/* SQLはテーブル名、カラム名ともに小文字で統一させるほうがいい */
 ```
### 《問題②》&thinsp;`asuka_purchases`テーブルから`name`と`price`カラムの複数を取得する
#### 《答え②》
 ```sql:ex.sql
SELECT name, price
FROM asuka_purchases;
 ```
### 《問題③》&thinsp;`asuka_purchases`テーブルから全てのデータを取得する
#### 《答え③》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases;
 ```
### 《問題④》&thinsp;`asuka_purchases`テーブルから最大3件データを取得する
#### 《答え④》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
LIMIT 3;
/* 1~3行データを取得 */
 ```
### 《問題⑤》`name`カラムが『お菓子』であるレコード(行)を取得する
#### 《答え⑤》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE name = "お菓子";
/* 2と4のレコード(行)のみ取得できる */
/* ;(コロン)はここまでがクエリという意味なため、最後につける */
 ```
### 《問題⑥》`name`カラムが『お菓子』であるレコード(行)を最大1件取得する
#### 《答え⑥》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE name = "お菓子"
LIMIT 1;
/* 2のレコード(行)のみ取得できる */
 ```
### 《問題⑦》NOT演算子を使って`name`カラムが『お菓子』ではないレコード(行)を取得する
#### 《答え⑦》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE NOT name = "お菓子";
/* 1と3と5と6のレコード(行)を取得できる */
 ```
### 《問題⑧》`name`カラム内で名前に『焼酎』を含むレコード(行)を取得する
#### 《答え⑧》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE name LIKE "%焼酎%";
/* 3と5のレコード(行)のみ取得できる */
/* LIKE演算子(`%`をワイルドカードとして扱う) */
/* 前方一致：焼酎%  例）焼酎、焼酎お湯割り、焼酎ロック*/
/* 後方一致：%焼酎　例) 焼酎、芋焼酎
/* 焼酎を含む：%焼酎%　例)上記の例全部
 ```
### 《問題⑨》NOT演算子を使って`name`カラム内で『焼酎』を含まないデータ(レコード)を取得する
#### 《答え⑨》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE NOT name LIKE "%焼酎%";
/* 1・2・4・6と5のレコード(行)のみ取得できる */
 ```
### 《問題⑩》`price`カラムが500(円)以上のレコード(行)を取得する
#### 《答え⑩》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE price >= 500;
/* 1と5のレコード(行)のみ取得できる */
/* a < b , a <= b */
/* a > b , a >= b */
 ```
### 《問題⑪》NOT演算子を使って`price`カラムが500(円)以上のレコード(行)を取得する
#### 《答え⑪》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE NOT price < 500;
/* 1と5のレコード(行)のみ取得できる */
 ```
### 《問題⑫》`price`カラムが`NULL`のデータを取得する
#### 《答え⑫》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE price IS NULL;
/* 6のレコード(行)のみ取得できる */
 ```
### 《問題⑬》`price`カラムが`NULL`でないデータを取得する
#### 《答え⑬》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE price IS NOT NULL;
/* 1~5のレコード(行)を取得できる */
 ```
### 《問題⑭》`name`カラムが『お菓子』かつ`date`カラムが『2023年05月01日』であるデータを取得する
#### 《答え⑭》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE name = "お菓子"
AND date = "2023-05-01";
/* 2のレコード(行)を取得できる */
 ```
### 《問題⑮》`name`カラムが『お菓子』または`data`カラムが『2023年05月01日』であるデータを取得する
#### 《答え⑮》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE name = "お菓子"
OR date = "2023-05-01";
/* 1と2と4のレコード(行)を取得できる */
 ```
## 2&emsp;`取得したデータを並び替える`
### 《問題⑯》`price`カラムを基準に昇順かつNULLを先頭に並び替えたデータを取得する
#### 《答え⑯》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
ORDER BY price ASC NULLS FIRST;
/* ASC(昇順)：小さい数⇒大きい数 1･2･3 */
/* DESC(降順)：大きい数⇒小さい数 3･2･1 */
/* ASCはデフォルトのため、DESCと異なり省略可能 */
/* NULLが無い場合は`ORDER BY price ASC;` */
```
![SQL1-3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/3a979069-bc39-7407-4ac0-2097b0e0c83e.png)


### 《問題⑰》`price`カラムを基準に降順かつNULLを末尾に並び替えたデータを取得する
#### 《答え⑰》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
ORDER BY price DESC NULLS LAST;
/* DESCでNULLを先頭、またはASCでNULLを末尾にしたい場合はデフォルトなので省略可能 */
```
![SQL1-3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/0dfbc064-1600-9ee4-383d-2aacab603171.png)

:::note
デフォルト
![SQL1-3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/612d1385-03f3-1ead-561c-5f18dba425bd.png)
:::
### 《問題⑱》`price`カラムを基準に昇順で`name`カラム『お菓子』を並び替えたデータを取得する
#### 《答え⑱》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
WHERE name = "お菓子"
ORDER BY price ASC NULLS FIRST;
```
### 《問題⑲》`price`カラムを基準に昇順かつ最大3件データを取得する
#### 《答え⑲》
 ```sql:ex.sql
SELECT *
FROM asuka_purchases
ORDER BY price ASC
LIMIT 3;
```
![SQL1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/7e5bdcab-b1d7-b7e8-29ae-c02c03730920.png)