SQLの勉強会に参加したらもっと知りたいことが出てきたんだなあ

皆様こんにちは、もしくははじめまして。IDEです。
今回の記事は、2021年4月10日に催された、xhack様主催のSQLの勉強会に関するレポートです。
勉強していく中で、勉強会中に触れられなかったことや気になったことを今回の記事にまとめました。
お付き合いいただける方は、このままお進みいただければ幸いです。
例の如く勉強会中に学んだ内容については概要に資料のリンクを貼るのでそこからご参照ください。

目次

  1. 勉強会概要
  2. 参加したきっかけ
  3. 勉強会後調べた3つのこと
    データベースの種類の違いとは?
    触れられなかったけどよく使う構文について
    WHERE文について
  4. まとめ

勉強会概要

今回参加させていただいたのは、【【オンラインハンズオン】はじめてのSQL】です。
x-hack.connpass.com
主催者は(株)xhack、登壇者はどいこ様です。
twitter.com
事前に用意してくださった資料を見ながら、ツールを使って実際に手を動かして学んでいきました。


参加したきっかけ

データベースの操作については、普段Rails様にお世話になっているので自分の手で実際に動かすことはあまりないのですが、基礎を学び直している身にとってここも押さえておきたい!と思ったので参加するにいたりました。


勉強会後調べた3つのこと

データベースの種類の違いとは?

普段のアプリケーション制作ではMySQLを使っているのですが、今回の勉強会ではPostgreSQLを使っていきました。
カリキュラムに記載されているままMySQLを使っていたけど、なぜこれを使うのかわかっていませんでした…💦
なのでこちらの記事を中心に確認しました。
Oracleもよく利用されているDBなので、この3つを中心に記事を読み漁りました。 超超超雑にまとめるとこういう解釈になるのかな?と思っています。

ただ、ぶっちゃけて言うと機能の差はほぼないような気がします。
NULLと空文字の扱いや値の更新について、細々とした部分が違うそう。
疑問に思っていたMySQLを使っていた理由は、シンプル故に初学者にとって使いやすいからかな、と考えています。

触れられなかったけどよく使う構文について

資料の最後に記されていた4つの構文のうち3つを深掘り!
第2回の勉強会が5月に開催されるそうですが、せっかち笑なので予習を兼ねて調べてみました。
データは全て資料記載の食堂のmenusテーブルを使用しています。
また、13~16(16は2つかぶってしまいましたが)を追加しました。
f:id:programmingnuoh:20210411224609p:plain

DISTINCT

重複をのぞいて表示する構文。
SELECT DISTINCT カラム名 FROM テーブル名
以下、実際に書いてみたSQL文です。

f:id:programmingnuoh:20210411224828p:plain

全列表示だとカテゴリーがいくつあるのか微妙にわかりにくいですが、DISTINCTを使った検索をすればカラムごとに何があるのかがわかりやすく表示できますね。

ORDER BY

順序で並び替えをする構文。
SELECT カラム名 FROM テーブル名 ORDER BY カラム名 DESC/ASC
(DESC→降順、ASC→昇順)
以下、実際に書いてみたSQL文です。

f:id:programmingnuoh:20210411225253p:plain

GROUP BY

値をグループ化する構文。
SELECT 表示したいカラム名 FROM テーブル名 GROUP BY グループ化するカラム名
DISTINCTは重複するものを省いているだけ(重複しているものに括弧をつけてるイメージ?)、GROUP BYは重複しているものをひとまとめにしている感じ(重複しているものにチェックを付けているイメージ?)です。
以下、実際に書いてみたSQL文です。

f:id:programmingnuoh:20210411230050p:plain

FROMの前に,COUNT(数えたいカラム名)を付けると各カラムに当てはまる値はいくつあるのかを数えてくれます。
DISTINCTと似ているけど微妙に違うのはここの部分ですね。

資料内の触れられなかった構文にJOINが入っているのですが、今使っているテーブルだと微妙に説明しづらい構文なので、この記事では保留です。
こちらの記事が非常にわかりやすかったです。

WHERE文について

検索機能でも出てきたWHERE文。
いまいち理解しきれていなかったのですが、今回勉強している中で何回もこれが出てきたので少し慣れることができました。
SQL文と検索機能として使うWHERE文(Railsだとメソッドか)を微妙に違うとは思いますが一応ここで触れておきたいと思います。
以下、アプリケーション内で検索機能を実装するために記載したモデル及びメソッドのコードです。

class SearchTweetsService
  def self.search(search)
      if search != ""
          Tweet.where('text LIKE(?)', "%#{search}%")
      else
          Tweet.all
      end
  end
end

whereメソッドについて構文分析をしていきます。

Tweet.where('text LIKE(?)', "%#{search}%")
                       ||
モデル名.where('検索対象のカラム名 LIKE句', "%(曖昧文字列)引数%")

where括弧内は条件式を書きます。これはSQL文でも同じでした。
%は任意の0文字以上の文字を意味する曖昧文字列。
つまり上記のコードはTweetモデルの中からtextカラムにsearchが含まれた投稿を絞り込む、という内容になりますね。


まとめ

今回の記事は、レポートというよりかは勉強会を踏まえて自分が調べたことを書かせていただきました。
拙い文章にお付き合いいただいた方、ありがとうございます。
また、改めてどいこさん、主催のxhackさん、貴重な勉強会の機会をいただきありがとうございました。
データベースについての基礎知識や、まだ触れていない構文など調べることはたくさんあるので、その都度学習していきたいと思います。


参考記事

今回の記事を書くに当たり、以下の記事を参考にさせていただきました。
ありがとうございました。
(参考記事には載せていませんが、勉強会の資料ももちろん参考にさせていただきました。どいこさんのわかりやすい資料に感謝です…!)

  • 主なRDB(Oracle, MySQL, PostgreSQL)の機能比較
  • SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう!
  • SQL の DISTINCT を使うサンプル
  • SQLで並び替え!ORDER BYを基礎から応用まで学ぼう!
  • 【SQL】GROUP BYで自在に集計!集計関数やHAVINGと合わせて使おう
  • SQL素人でも分かるテーブル結合(inner joinとouter join)