SQLの不思議… 紙屋05

’23年度入社の紙屋です!
2024年もよろしくお願いいたします。

新年一発目の投稿です。
無事に新年を迎えることができました!
昨年は少し実際の案件にも携わらせていただきました。少しずつできることも増えてきたことはうれしいです!
2024年もできることを着実に増やしながら成長したいと思います!

今回はその案件の中であるデータの差分の調査を行っているときに不思議に思ったことを検証してみようと思います。
それはSQLである一定の期間のデータを抽出しようとしたときに、何気なく使っていたある演算子で躓きました。最初は気づかなかったのですが、調査結果のデータ数がおかしいことの指摘もあり気づきました。
それは『BETWEEN』の使い方です!

—————————————-
式 BETWEEN 値1 AND 値2
—————————————-
BETWEEN演算子では、値が「値1以上かつ値2以下」の場合に真になる

と参考書ではあります。
私は1か月分のデータを抽出したかったので、

というSQL文を作成し抽出しました。
特に疑問に思うこともなく作業を続け、他で分からないところがあったので、質問したときに、指導者とのSQL文の違いに気づきました。

「ん?演算子ちがうけど、まぁいっか、同じことだし…」
「でも、結果も違うんだよなぁ…、どうしてだろう?」
と思ったことで調べるとどうやらデータ型がdatetime型であることも関係しているらしいということが分かりました。
そこでダミーデータを作って検証してみることにしました。

今回、ダミーデータはLaravelのマイグレーションとシーダーを利用して’2023/11/01 00:00:00’から’2023/12/31 23:59:59’までのデータを100件作成しました。
そして、同じ条件式で行数をカウントしました。

この条件式の結果は、条件式1は50件、条件式2は56件と件数の差が出ました。
ちなみに、抽出条件の範囲を変えると、条件式3は53件、条件式4は3件でした。
抽出する条件のデータ型がdatetime型だったので、範囲指定には注意が必要そうです。

ちなみにdate型でもデータ数のカウントを行いましたが、時間が無い分、選ぶ演算子での差はみられませんでした。
今回の始まりは演算子の疑問で始まりました。
BETWEENを使う際は抽出される範囲とデータ型を十分に理解したうえで使う必要があります。
私みたいな初学者や不慣れな方は、データの範囲を指定して抽出する場合はまず比較演算子を利用する方が良いということを覚えておきましょう!

今回は文献を調べるだけでなく、自分でも実際のデータを使って結果の違いを理解できたので、引き続き今回のように検証しながら自分の理解を深めたいと思います。

では、また次回!!

2023年 新入社員ブログ 松井(第2回)

こんにちは。
入社1年目の松井です。
もう10月になって冷えてきましたね!

前回は外部研修について紹介しました。
「外部研修とは?」と思った方はこちらのURLに書いてありますので気になったら覗いてみてください!

https://blog-s.xchange.jp/archives/date/2023/08/03

内部研修の概要

6月から7月末にかけて内部研修を行いました。
内部研修の内容は以下の2つです。

  • SQL演習(6月中旬まで)
  • PHP/Laravel演習(6月下旬から7月末まで)

SQL演習

SQLの問題集を読み、演習問題を解きました。外部研修中ではなかなか問題を解く機会が少なかったので内部研修を通じてSQLの勉強をしました。内部研修に使った本はこの下にURLを貼っておきますので、気になった人は覗いてみてください!

https://book.impress.co.jp/books/1121101090

SQLでの勉強で難しかったところは副問い合わせでした。副問い合わせとは「他のSQL文の一部分として入っているSELECT文」です。特徴としては「検索結果に基づいて表を操作する」という点です。言葉だけだと分かりづらいので例を挙げます。

例:家計簿というテーブルから最も大きな出費を調べ、その費目と金額を求める

文章で書くと簡単に見えますが、SQLではそうはいきません。SQLでは「最も大きな出費を調べる」、「それを基に費目と金額を求める」の2つのステップが必要です。まずはステップごとのコードを書いてみます。

(1)で調べた値を基に費目と金額を求め、(2)で費目と金額を求めることができました。これだと(1)の値が急に変わったときに調べ直すのが面倒です。そこで、(1)のコードを(2)のコードに書いてある「(1)から書き写した値」に埋め込みます。

(3)では、(2)のWHERE句の中に(1)を埋め込みました。このようにすれば、(1)と(2)の動作を一括に実行でき、(1)で出力されるものが変わっても(2)を書き換える必要がなくなります。(3)のコードに入っている括弧の中身が副問い合わせということです。

このようにしてSQL文の意味や使い方について深く学んでいきました。

SQL演習についての話はここまでです。次回はPHP/Laravel演習について書きます。最後まで読んで頂き、誠にありがとうございました!

新入社員ブログスタート!! 紙屋01

自己紹介とSQLで詰まったこと

はじめまして!
2023年度入社の紙屋です!
これから時々ブログをアップさせていただきますm(_ _)m
よろしくお願いします!

今回は初投稿ということで、まずは自己紹介から!
名前は紙屋朋幸といいます!
以前は他業種で働いており、プログラミングに関しては超初心者です!
PHPの外部研修を経て目下勉強中です!!
趣味はグルメ巡りで、主にハンバーガー、ラーメン、甘いものなどなど…
「おいしそう!」と思ったものにはなんでも食いつくミーハー気質です(笑)
先日も世界最大のフードスポーツイベントのハンバーガー部門の公式日本予選大会である「JAPAN BURGER CHAMPIONSHIP」に行ってきました!!
また7月から六本木でバーガーイベントがあるので行ってきます!!

プログラミングの話に戻ります。
入社してから3か月が経ちました。
現在はSQLドリルを勉強して、PHPプログラミングを勉強しつつ、登録フォーム課題に取り組んでいます。
プログラミング初心者の私にとって日々「なんだこれ?」「ん?」と思う壁にあたります。そういった疑問について振り返りたいと思います。

SQLドリルを取り組むにあたって、まず「NULL」の扱いについて詰まりました。
プログラミングを経験されている方には基本の「キ」レベルだと思います。
SQLの学習をしたときに簡単なSELECT文の話から始まり、次に算術演算子など、演算子の話があり、私はプログラミングって数学的な感じなんだと思い込んでしまいました。
例えば、SELECT文で選択するカラムに『カラム名 * 100』と条件を付けて値を取得しようとしたり、WHERE句で『カラム名 = NULL』で検索をかけようとしたりすると、エラーが返されます。
「あれ、おかしいな?NULLってゼロってことじゃなかったっけ?」…
そんなことをよくことを考えながらとりあえず自分で考えたコードで実行し、トライ&エラーで試しながらSQL文を考えていました。

NULLについて振り返りたいと思います。

NULLとは?
・そのカラムの値に何も格納されていない、未定義であることを示す。
・数字のゼロや空白文字とも異なる。

NULLは=で判定できない!
・NULLは「=」や「<>」で判定ができない。
・必ずIS NULLやIS NOT NULLを使って条件式をつくること。

「NULL ≠0」とここに書いてありました。めちゃめちゃ見逃していました…(笑)
「値が入っていないなら空白のままでいいじゃん」とも考えましたが、ドリルを進めるうちにNULLにあたる部分を対象に指定したい場合もあるから空白のままでは都合が悪いのですね。
また、NULLは値が入っていないことを表すから空白とまた別物なんですね。ややこしいですが、NULLと空白とを検索かけたいときは

と検索をかけなければいけないのですね。やっかいです…笑…

あとはNULLを含むレコードの集計のときにも「あれ?どっちを使うんだっけ?」と毎度見直しました。それはCOUNT関数です。
他の集計関数は集計時のNULLの扱いは結果に影響を与えませんが、COUNTだけ引数にカラム名を指定するとNULLを無視しますが、全レコードを表す「*」を指定するとNULLも含めて集計します。
ドリルの中にはNULLも0とカウントして集計させる問題もありました。この問題も何度も引っ掛かりました。

SELECT AVG( {カラム名} ) FROM tables;

SELECT AVG( COALESCE( {カラム名} , 0 ) ) FROM tables;

最初はこの2つのコードの違いがよくわかりませんでした。「NULLってゼロじゃなかったっけ?」「このCOALESCEって何?」ということが頭をグルグル…、理解が追い付かず類似問題を解いても引っ掛かり…、プログラミングって難しい…と早くもあきらめモードでした(笑)
ですが、ドリルの巻末問題あたりでやっとCOALESCE関数の働きが分かってきて、平均値は数値の合計をその数値の数で割るという簡単なことも忘れていたことに気づき理解ができました。
気づいた時には「めっちゃ便利じゃん」とあきらめモードからも復帰できました!

プログラミングって難しいですね…。
まとめとうよりはプログラミングを体験した感想となりましたが、指導いただける先輩方は丁寧に教えてくださるのでとてもありがたいです。プログラミングを学んでブログも通じて少しずつoutputしていきたいと思います!
今までも転職して新しい業種にチャレンジして何とか失敗せずやれてきたので、今回もコツコツ地道に経験を積んでまいりたいと思います!
それでは次回のアップまで!!