差集合の考え方、ORDER BYについて整理、等_『スッキリわかるSQL入門』1-4章

#はじめに
『スッキリわかるSQL入門第2版ドリル222問付き！』に取り組み始めました。
この本では、DBMS製品をインストールしたりサンプルデータを作ったりといった事前準備をせずにSQLを体験できる「dokoQL」を使って学習を進めることができます。（自分のPCにDBMS製品をインストールして準備する方法でも学習は可能だそうです。）

「dokoQL」＝PC環境を汚さず、ブラウザ経由で手軽にDBMSにアクセスできるサービス

本の中では、題材として「家計簿」が取り上げられていました。家計簿を改善したいと考えている私には、まずそれが嬉しかったです。俄然やる気が湧きました。

第一部を終えたので、つまずいたところ、注意したいポイントをまとめておきます。

第一部 SQLを始めよう
-第0章：データベースを学ぶにあたって 
-第1章：はじめてのSQL
-第2章：基本文法と4大命令
-第3章：操作する行の絞り込み
-第4章：検索結果の加工

【つまずいたところ】
・「ORDER BY 2,3,1」って何？
・差集合がわからない

【注意したいポイント】
・誤：「=NULL」　正：「IS NULL」
・タイプミス「〇SELECT」「×SEKECT」
・エラー「ERROR: syntax error at or near "　" Position: 9」

#「ORDER BY 2,3,1」って何？
4章の中の例で、急に「ORDER BY 2,3,1」と出てきました。

p124

|リスト4-11 和集合を取得する|
|:--|
|SELECT 費目,入金額,出金額 FROM家計簿<br>UNION<br>SELECT 費目,入金額,出金額 FROM 家計簿アーカイブ<br>**ORDER BY　2,3,1**|

・列名でなく列番号で指定されており、
・列番号の後にASC/DESCの記載がなく、
・複数の列が指定されていることから、
唐突に出てきた数字の羅列に焦り、その数字たちが何を指しているのかがわからなくなってしまったので、今一度ここでORDER BYについて整理しておきます。

|基本の形|例|例の意味|
|:--|:--|:--|
|ORDER BY 列名 並び順|・ORDER BY 出金額<br>・ORDER BY 出金額 ASC<br>・ORDER BY 出金額 DESC|出金額で昇順・降順となるよう並べ替えて取得する<br><br>備考：<br>・ブランク=昇順<br>・ASC=昇順<br>・DESC=降順|
|ORDER BY 日付 並び順|・ORDER BY 日付 DESC|日付で降順となるよう並べ替えて取得する|
|ORDER BY 列名 並び順,列名 並び順|・ORDER BY 入金額 DESC,出金額 DESC|原則として入金額の降順で並べ替える。入金額が等しい行については、さらに出金額の降順で並べ替える|
|ORDER BY 列番号 並び順,列番号 並び順|・ORDER BY 4 DESC, 5 DESC<br>**・ORDER BY　2,3,1**|・原則として列4の降順で並べ替える。値が等しい行については、さらに列5の降順で並べ替える。<br>**・原則として列2の昇順で並べ替える。値が等しい行についてはさらに列3の昇順で、それでも値が等しい行についてはさらに列1の昇順で並べ替える。**||

落ち着いてひとつひとつを整理してみたら、何を意味しているのか理解できました。


#差集合がわからない

**差集合 = ある集合と別の集合の差**（あるSELECT文の検索結果に存在する行から、別のSELECT文の検索結果に存在する行を差し引いた集合。）
差集合を得るには、**EXCEPT演算子** を用いる。
また、差集合を求める場合は、SELECT文の順番に注意が必要。（和集合とは違い、基準が変われば結果も変わってしまうので。）

p127「差集合を取得する」の下記例題で、「居住費」の扱い方がわからなくなり手が止まってしまったので、整理してみます。

|家計簿の費目|家計簿アーカイブの費目|
|:--|:--|
|食費<br>給料<br>教養娯楽費<br>水道光熱費<br>**交際費**|食費<br>給料<br>教養娯楽費<br>水道光熱費<br>**居住費**|

```
SELECT 費目 FROM 家計簿
EXCEPT
SELECT 費目 FROM 家計簿アーカイブ
```
上記の結果は「費目：交際費」。「居住費」をどう扱えば良いのか戸惑ってしまいました。ですが、ややこしく考えずに普通の引き算のように考えたら、すんなり理解できました。

家計簿の費目から家計簿アーカイブの費目を引いたら、家計簿の費目には「交際費」が残ります。
家計簿アーカイブに残った「居住費」は割り算の「余り」みたいなものだと理解しました。
→（2021/3/10追記：復習していて、「余り」とは違うな、と思ったので追記。SELECT で「家計簿」から抽出するとしているので、「家計簿アーカイブ」の「居住費」は、抽出され得ないよな、と今はすんなり思える。）


```
SELECT 費目 FROM 家計簿アーカイブ
EXCEPT
SELECT 費目 FROM 家計簿
```
上記の結果は「費目：居住費」



#注意したいポイント

##誤：「=NULL」　正：「IS NULL」
「SQLを学び始めて間もない頃によく犯してしまうミス」として、この例が挙げられていました。
「あー、私もやってしまいそうだ…。」と感じたので、ここに忘備録として残しておきます。(p83)

| 誤 | 正 |メモ|
|:---|:---|:---|
|SELECT * <br> FROM 家計簿 <br> WHERE 出金額 =NULL| SELECT * <br> FROM 家計簿 <br> WHERE 出金額 IS NULL| NULLであるかの判定をすべきところに<br>通常の比較演算子を使ってしまうという誤り。NULLは「=」や「<>」で判定できない。必ずIS NULL や　IS NOT NULLを使って条件式を作ること。

##その他やりがちなミス
練習問題を解いている時に自分がやらかしたミスを書いておきます。
もうやらかさない！

| 誤 | 正 |メモ|
|:---|:---|:---|
|SELECT 日付,商品名,単価,数量,注文金額<br>FROM 注文履歴<br>WHERE 注文枝番='3'　 AND 数量>=2<br>ORDER BY **日付 AND 数量 DESC**|SELECT 日付,商品名,単価,数量,注文金額<br>FROM 注文履歴<br>WHERE 注文枝番='3'　 AND 数量>=2<br>ORDER BY **日付 , 数量 DESC**|p132<br>問題4-1-4|

##タイプミス
何度もやらかしました。
誤：SEKECT  /　正：SELECT
キーボードの位置が近いのでうっかり打ち間違えてしまいます。要注意。

##ERROR: syntax error at or near "　" Position: 9
上記エラーが出てきました。
下記の通り何となく解決してしまいましたが、エラーの原因は結局わからずじまいでした。今後も同じエラーが出てきたときに対処方法を考えるために、ここにメモしておきます。

p88
↓ 実行したコード

```
SELECT *　
FROM 家計簿
WHERE 費目 NOT IN ('食費','交際費')
```
↓ 出てきたエラーメッセージ

```
SQL実行エラー
ERROR: syntax error at or near "　" Position: 9
```
syntax=構文
「""」は使っていないので何のことだ？と戸惑いました。
あと、「Position:9」ってどこ！？
本の見本と同じように打ち込んでいるんだけどなあ…。
ググるとPostgreSQLの予約語のこととか、日付の型のこととかは出てくるのですが
今回のケースに当てはまるものを見つけることができませんでした。
9語目の「(」に注目して、('食費','交際費')の「'」や「,」の前後に半角スペースを入れたりしてみましたが解決せず。
結局、dokoQLに内蔵されていた解答のライブラリを読み込んで試したところ、解決。

↓ これで解決

```
SELECT * 
FROM 家計簿
WHERE 費目 NOT IN ('食費', '交際費')
```
私には、最初に実行したコードと全く同じに見えます…。
なぜ最初のコードでエラーが出たのか、わからないままとりあえず次へ進みます。




#おわりに
2~4章で、SQLの文法が沢山出てきました。練習問題を解きながら進めましたが、前のページに戻って解説を再読したり、必要な文法を探したりしつつ、やっと解くというありさまで、まだまだSQLを覚えることも、使いこなすこともできていません。今はとにかく目標である9章目指して先へ進めますが、9章が終わったら、もう一度1章からやり直して、もっとスムーズにSQLを使えるようにしたいです。

#参考
・書籍『スッキリわかるSQL入門第2版ドリル222問付き！』（インプレス）
・Qiita書き方: [MarkdownのTable内で改行を入れる](https://qiita.com/onigra/items/b43481ea46b809d3a2f1)

#進捗記録
2020/9/15：データベースの学習スタート
2020/9/15～2020/9/21：『マンガでわかるデータベース』オーム社 / 1～4章（Qiita記事2本）
2020/9/22～：『スッキリわかるSQL入門第2版ドリル222問付き！』インプレス / 1～9章