RikuPikuの日記

HappinessChainでのことをお話します

DBなんも分からん人がスッキリわかるSQL入門を読んだ

DBなんも分からん人がスッキリわかるSQL入門を読んだ

久しぶりの投稿です。現在、DB学習のフェーズに入り、すっきりわかるSQL入門という本を読んだ所感のうち【良かったところ/学んだこと・悪かったところ/難しかったこと】を書いていきます。

本書→https://amzn.asia/d/0ZFRG3n

前提

タイトルの通りですが、私はSQLやDB周り(以下:DB)はProgateで軽く触った程度で全くの無知識でした。

良かったところ

本書の特徴といえばなんと言っても「DokoQL」と「イラスト付きの会話形式での進行」でしょう。 DokoQLとはブラウザ上でSQL文の作成と実行ができる株式会社フレアリンク提供のクラウドサービスです。 各sectionのSQL文が事前にライブラリとして登録してあり、すぐ確認・実行ができるのが特徴です。

DBの環境構築は初心者には難解で、SQLの勉強開始前から詰んだとしたら元も子もないので、いい選択だと思いました。

また、第一部【SQLを始めよう】でDBやSQLとは?から始まり、最終第四部【データベースで実現しよう】でテーブルの設計まで計423Pと幅広く学ぶのですが、 前述した「イラスト付きの会話形式」の進行方向をとっているため、飽きずに読み進めることができました。

学んだこと

SQLDMLからWHERE句の絞り込み、検索結果の加工(ORDER BY等)の基本的なSQL文。 サブクエリや複数テーブルの結合からトランザクション、テーブルの制約・高速化、テーブルの概念設計・論理設計・物理設計など少し深掘りしたところまで学ぶことが出来ました。

DML

DMLとはData Manipulation Languageの略称でSELECT/UPDATE/DELETE/INSERTの4大命令のことをいいます。

https://i.gyazo.com/7e29a2fa5b1075d63e553e6b18f092dd.jpg

SQLはこのDMLが基本の命令体系で、これだけでほとんどの処理ができますがスコープが広すぎます。ここにWHERE句やORDER BY句などで修飾し、データを絞り出します。

たとえばこのようなmy_tableというテーブルがあるとします

https://i.gyazo.com/59638b538a17c1d74ccfa1d12ee51750.png

nameカラムを取り出すにはSELECTを用いてこのように記述します。

SELECT  name FROM my_table

構文はSELECT カラム名 FROM テーブル名です。

WHERE句

先ほどのDMLではスコープが広すぎて、指定したカラムを全て取ってきてしまいます。 ここからさらに絞りこみをしたい場合はWHERE句を用います。 例えば名前がMikeのageを取得したい場合は、

SELECT age FROM my_table WHERE name = "Mike"

と記述します。 構文はWHERE 条件式です。

検索結果の加工

例えばですが、nameカラムとageカラムを取得かつ年齢順に並び替えたいというケースもあると思います。 SQLでは取り出したデータを並び替えたり"加工”することができます。

SELECT name,age FROM my_table ORDER BY age ASC

ORDER BY句を用いることで指定した列の値を基準として並び替えることが出来ます。 構文はORDER BY 列名 並び順です。 並び順はASC(昇順)とDESC(降順)です。 

その他にも行数を制限するOFFSET - FETCH (LIMIT)や集合演算子UNION,EXCEPT,INTERSECTなどがあります。

サブクエリ(複問い合わせ)

サブクエリとはSELECT文の中にSELECT文を書くことを指します。 例えばageが一番高い人のnameとageを取得したい場合は

SELECT name,age FROM my_table 
WHERE age = (SELECT MAX(age) FROM my_table)

と記述します。どうなっているかというと、最初に( )の中のSELECT文が先に処理され、結果がリターンされます。(今回は45) つまりサブクエリが処理された時点でのWHERE句は以下のコードと同等です。

WHERE age = 45

もちろんサブクエリのSELECT文の中でWHEREでさらに絞り込むことも可能です。クエリはより内側にあるものから外側に向かって評価されていくと覚えておくと良いでしょう。

トランザクション

トランザクションとは、一つ以上のSQL文をひとかたまりとして扱うようにする処理方法です。かたまりにすることで例えば処理中に急にコンピュータがシャットダウンしてしまい、一連の処理が中途半端に中断され、その横から書き換えてしまう。といったケースを防いでくれます。  トランザクションを用いるには開始指示,終了指示(COMMIT/ROLLBACK)で処理を囲みます。

BEGIN;
-- 処理1
   -- なんらかの処理
-- 処理2
 -- なんらかの処理
COMMIT;

COMMITはここまでの処理を確定させる終了指示。ROLLBACKはここまでの処理を取り消しさせる終了指示です。 これにより、トランザクションに含まれるSQL文は全て実行された or 一つも実行されていないの二択に保証されます。

制約

もちろんSQLは抽出だけではなくテーブルの生成もできます。 制約とはテーブルを作成する際、カラムにそぐわない値を代入させないようにすることです。例えばnameカラムに12という整数が代入されるのはおかしいですよね。

CREATE TABLE your_table (
 name STRING NOTNULL,
 live STRIBG DEFAULT "不明" NOTNULL
)

以上のコードはname,liveというカラムを持つyour_tableを作成します。作成する際にNOTNULL制約を用いて、「NULLの代入を許可しない」という"制約”をかけています。 liveカラムは何も代入されなかった(null)場合に、NOTNULL制約で判別をし、"不明"というデフォルトの値を代入するようにしています。

他にもUNIQUE制約 CHECK制約 PRIMARY KEY制約など様々な制約が存在します。

悪かったところ/難しかったところ

個人的にいくつかありました。

  • そもそもdokoQLが使いにくく不便でした。Google CloudのBigQueryでも良かったと思いました。

  • カラム名が日本語だったのが残念でした。おそらく現場では英表記ではないでしょうか、英to日や日to英の変換が頻繁に発生するので面倒に感じられました。

  • 様々なRDBMSを取り上げすぎていて全てにおいて冗長でした。読者はSQLの書き方動かし方を理解したく、全てのRDBMSを理解したいわけではないので、個人的にはPostgreSQLMySQLの2つだけでもいいとおもったのですが・・・。

  • インプットの難易度に対して、アウトプットの難易度が釣り合ってませんでした。本書は読むだけなら初心者でも簡単。ドリルを解こうとすると途端に難易度が豹変します。 理由としては、そもそも問題文が難解、問題用のテーブルがdokoQLに存在しないためトライアンドエラーがしようにも出来ないなどがあります。しっかりとSQL文の記法を理解してドリルに望んでみたらボコボコにされて、僕は言語障害があるのか?と若干ネガりました・・・それくらい難しかったです。

このように若干自信喪失をしたので、現在追加でUdemyで別の教材を買って進めているのですが、超絶楽ですので、やはりドリルの難易度は高いでしょう。 Udemy→https://www.udemy.com/course/sql_for_data_analytics/

  • 最終章辺りのトランザクション〜テーブル設計が難しいです。こればっかりは個人の実力でしかないのでもっと勉強していきたいです。

おわりに

総評としては良かったです。なぜならば、SQLナンモワカランの人が最後ぐちぐち言えるぐらいまでの知識量は付いたことを証明しているためです。