今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、SQLのGROUP BYのBYっている?の日。

目次

とある日

SQLを書いていて、ふと疑問に思ったことがある、GROUP BYBYはなぜ必要なのか!

補完の効くエディターを使ってても、GROUPBYは別の予約語として存在しているので一度の補完でGROUP BYを書くことができない。

なぜ、BYを分ける必要があるのか謎である。

今日は、データベースやSQLについて日頃思っていた謎について3つ調べてみる。

BYの謎

冒頭で、説明したように。

BYの存在意義について、調べてようと思う。

前提として、BYの必要性は否定しない。

ただ、GROUPORDERのときに必要かどうかについて調べてみる。

BYの使用用途

そもそも、BYが何に対して使用されてるかの現状を知る必要がある。

ORACLEMySQLで調べてみたら、GROUP BY、ORDER BY、CONNECT BY、PARTITION BYがあった。

BYの英単語としての意味

BYをぐぐって出てきた結果↓

…のそばに、のかたわらに、の手元に、…のそばを、…を過ぎて、を通って、…に沿って、…を経由して、…によって、…で

単語としての意味を考えるとしたら、GROUP BYがグループに沿って記述するや、ORDER BYが順序に沿って記述するといった英文的意味として理解することが可能となる。

BYの謎の考察

BYを使用している句それぞれについて、公式リファレンスを見てみてもBYのほかにオプションとして使用できるような記述は見つけられなかった。

BYがなくても大丈夫な気もする。

ただ、SQLを開発したときにGROUPORDERの意味をわかりやすくするためにつけたと思われる。

日本人ある自分には、特にわかりやすくなる要因にはならないが。

PRIMARY KEYとNOT NULLの謎

2つ目の謎、PRIMARY KEYNOT NULLの制約を同じ列に対して、定義してあるテーブルを見ることがある。

PRIMARY KEYNOT 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の謎参考

dev.mysql.com

PRIMARY KEYとNOT NULLの謎参考

stackoverflow.com

www.shift-the-oracle.com

dev.mysql.com

実行順序の謎参考

docs.microsoft.com

それぞれの謎には、SQL開発者の意図があるのかと思われた。

それぞれに、メリットとデメリットがある。

もっと、内部的にそれぞれの必要性を調べられたら良かったと思うが、そこにいたるまでの理解が足りていない気がした。