今日は、SQLのGROUP BYのBYっている?の日。
目次
とある日
SQLを書いていて、ふと疑問に思ったことがある、GROUP BY
のBYはなぜ必要なのか!
補完の効くエディターを使ってても、GROUP
とBY
は別の予約語として存在しているので一度の補完でGROUP BY
を書くことができない。
なぜ、BY
を分ける必要があるのか謎である。
今日は、データベースやSQLについて日頃思っていた謎について3つ調べてみる。
BYの謎
冒頭で、説明したように。
BY
の存在意義について、調べてようと思う。
前提として、BY
の必要性は否定しない。
ただ、GROUP
やORDER
のときに必要かどうかについて調べてみる。
BYの使用用途
そもそも、BY
が何に対して使用されてるかの現状を知る必要がある。
ORACLEやMySQLで調べてみたら、GROUP BY、ORDER BY、CONNECT BY、PARTITION BYがあった。
BYの英単語としての意味
BYをぐぐって出てきた結果↓
…のそばに、のかたわらに、の手元に、…のそばを、…を過ぎて、を通って、…に沿って、…を経由して、…によって、…で
単語としての意味を考えるとしたら、GROUP BYがグループに沿って記述するや、ORDER BYが順序に沿って記述するといった英文的意味として理解することが可能となる。
BYの謎の考察
BY
を使用している句それぞれについて、公式リファレンスを見てみてもBY
のほかにオプションとして使用できるような記述は見つけられなかった。
BY
がなくても大丈夫な気もする。
ただ、SQLを開発したときにGROUP
や ORDER
の意味をわかりやすくするためにつけたと思われる。
日本人ある自分には、特にわかりやすくなる要因にはならないが。
PRIMARY KEYとNOT NULLの謎
2つ目の謎、PRIMARY KEY
とNOT NULL
の制約を同じ列に対して、定義してあるテーブルを見ることがある。
PRIMARY KEY
はNOT NULL
を包含しているので、PRIMARY KEY
だけでいい気もする。
なぜ、両方定義する意味があるのか謎である。
制約の意味
PRIMARY KEY
8.3.2 主キーの使用
テーブルの主キーは、もっとも重要なクエリーで使用するカラムやカラムのセットを表します。それには、高速のクエリーパフォーマンスのため、インデックスが関連付けられます。それには NULL 値を含めることができないため、クエリーパフォーマンスは NOT NULL 最適化からメリットが得られます。InnoDB ストレージエンジンによって、テーブルデータが、主キーカラムに基づいて、超高速ルックアップおよびソートを実行するように物理的に編成されます。
NOT NULL
NULL をデータとして許可する/しない デフォルトは NULL を設定可能(⇔ NOT NULL) 、厳密には制約ではなく NULL 許可(NULLABLE)。
PRIMARY KEYとNOT NULLの謎の考察
調べてて、見つけたサイトでは、PRIMARY KEYが無効になったときにNULLを入れないためと書いてあった。
内部処理的に、NOT NULLを指定すると変わるのかもしれないが検証してないのでわからない。
PRIMARY KEY制約の役割上、NOT NULL制約はなくてもいいと思う。
実行順序の謎
SELECTステートメントの実行順序と、記述順序が違う謎。
SQLの、SELECTステートメントは下記のように記述していく。
SELECT name, birthday, address FROM users WHERE id = 5 ORDER BY name ASC
自分は、SELECT句を使用する場合、FROM句から記述していく。
SELECT句の内容は最後らへんで記述する。
理由としては、どのテーブルからどの条件でなにの列をと考えていったほうがわかりやすいからである。
だが、SQLのSELECTステートメントはSELECTからの記述となる。
実際の実行順序
FROM
ON
1.JOIN
2.WHERE
3.GROUP BY
4.WITH CUBE または WITH ROLLUP
5.HAVING
6.SELECT
7.DISTINCT
8.ORDER BY
9.TOP
実行順序の謎の考察
自分の記述する順序と実行順序は、FROMからになる。
だが、SELECTステートメントの記述順序は、SELECTからになる。
FROMからでもいいと思ったが、SELECTを一番上にしている理由として思い当たるのは、結論がいち早くわかるからではないかと思う。
SELECT句を見れば、そのSQLでどのような結果の形式が返るのかが一目瞭然である。
WHERE句などで条件次第ではあるが、SELECT句を見れば取得するべきデータかどうかなのかがいちはやくわかる。
これは、プログラムのデバッグするときと比べれるとすごくわかりやすい。
参考サイト
BYの謎参考
PRIMARY KEYとNOT NULLの謎参考
実行順序の謎参考
〆
それぞれの謎には、SQL開発者の意図があるのかと思われた。
それぞれに、メリットとデメリットがある。
もっと、内部的にそれぞれの必要性を調べられたら良かったと思うが、そこにいたるまでの理解が足りていない気がした。