SQLの勉強!基礎をガバガバに習得しよう
SQLを勉強しはじめたばかりだと、どういう風に勉強すればいいのか、挫折しない勉強方法は何なのか…と色々疑問が出てきますよね。
そこで今回は、勉強方法や挫折しないコツを解説し、実際にデータベースを操作するところまでを行っていきます。
練習問題もあるので、ぜひ参考にしてみてください。
SQLは比較的初心者でも取っつきやすい言語だから、プログラミング言語と比べると短い勉強時間でマスターできるよ。
それなら私でもできるかも!
SQLとは?
SQLとは、簡単に言うとデータベースを操作するための言語です。
データベースは、データの貯蔵庫ですね。
例えば、あなたがどこかのWebサイトで会員登録をした場合、メールアドレスやパスワード、登録日時といった情報がデータベースに保存されるわけです。
データベースには、エクセルに近しい形でデータが保存されてるんだぜ。
だから最初は、データベース=エクセルみたいなもん、っていう風にイメージしておいてOK!
SQLを使えば、次のようなことがおこなえます。
- データベースやテーブルの作成・変更・削除
- 作成したテーブルへのカラムの追加・変更
- データの取得・更新・削除
テーブルって何?
エクセルでいう、シートみたいなもんだね。
色んな情報を、全部同じシートに書くとゴチャゴチャするっしょ?
だから、テーブルを追加してデータを綺麗に管理できるようにするんだ。
ふうん。SQLを使うと、データベースをいじれるってことね?
今、PHPを学んでるんだけど、SQLはどのタイミングで学べばいいの?
PHPを学習する前?それとも後?
良い質問だぜ!解説しよう!
SQLを学ぶタイミングは?
これは、エンジニアによって考え方が違うけど、僕はフレームワークを学んでいるときと同じタイミングで良いと思うよ。
例えば、PHPだったら
PHP習得後、Laravel + SQLを学ぶ
という感じかな。
なんで、フレームワークと同じタイミングがいいの?
開発をするときって、Laravelみたいなフレームワークを使うケースがほとんどなんだ。
んで、フレームワークには、大体SQLを自動で発行してくれる機能が付いてるのね。
とはいえ、少し複雑な機能を実装するとなると、自動発行してくれるSQLだけじゃどうしようもないことが出てくんのよ。
そういう時に、手動でSQLを書ける知識がないと、詰んじゃうってこと?
そういうこっちゃ。
あと、フレームワークが自動で発行してくれるSQLだけに頼っていると、セキュリティ的にもろくなったり、読み込み速度が強烈に遅くなったり、色んな弊害が出てくる。
その辺の問題を回避するためにも、基礎は大事なんぜ!
わかった!
SQLの勉強時間の目安
基本的なSQLを使えるようになるまでにかかる時間の目安は、1日3~4時間の勉強時間を充てると考えると、およそ1週間です。
え、そんなに早く?
そうだね。プログラミング言語のように複雑なロジックを考える必要がないし、命令もすごくシンプルだからね。
ただ、これはあくまで“基本的なSQLが使えるようになるまでの時間”。
あとは、実務で繰り返し触れて、複雑なSQLも対応できるようになりたいぜ!
SQLの勉強で挫折しないコツ
SQLはプログラミング言語と比較すると比較的学びやすい言語ですが、一度わからないループに入ると挫折しやすくなります。
そこでここでは、SQLの勉強で挫折しないコツを3つ紹介していきます。
1.どこまで学ぶか?を明確にする
SQLはシンプルな言語ですが、極めようと思えば限りなく奥が深い言語です。
データベースエンジニアのようなプロフェッショナルを目指すのであれば話は別ですが、今この記事を読んでいる方の多くはSQLの基礎を身につけたいという方だと思います。
そのため、まずは勉強する前に、どこまで学ぶのか?という目標を決めておきましょう。
例えば、会員専用サイトを作成するためにデータベースを操作する必要があるのであれば、基本的な[SELECT文] や [UPDATE] 文・[INSERT] 文を学ぶだけで問題ないです。
逆に、多くのテーブルが必要な大規模システムに携わるのであれば、テーブル同士を連携させてデータを取得する「サブクエリ」なども学ぶ必要があります。
データベースを使って何がしたいのか?を明確にすると、際限なく勉強する必要もないため挫折しにくくなるよ!
とりあえず勉強しよう、じゃダメなんだね。
ダメではないけど、やりたいことが明確にある方がモチベーションも続きやすいよ。
2.質問サイトを活用する
初心者でなくても、何か勉強していればどこかしらでつまづくことはあります。
そんなときに一番やってはいけないのが、“自分ひとりで抱え込むこと”。
「自分で解決しないと意味ないんだ!」「何とか粘らなければ…」と考えすぎて、結局挫折しまうというのは、初心者プログラマーにはありがちな話です。
わからない問題があったときは、迷わず質問サイトを活用しましょう。
teratail(テラテイル)やstackoverflow(スタック・オーバーフロー)などのITエンジニアに特化した質問サイトであれば、現役エンジニアや同じような状況でつまづいた方から解決案をもらうことができます。
どんどん活用して、学習ペースを上げていきましょう。
人に教えてもらうのって、自分で解決していないから何かズルをしているような気持ちになるなぁ…
人に教えてもらうことに罪悪感を感じる必要はないよ。
教える人にとっても勉強になるし、何より質問することで自分が今何につまづいているのか?を明確に把握することができるんだ。
一度質問してみると分かるけど、回答者にとって分かりやすく質問するのって案外難しいんだぜ。
そうなんだ…。じゃあ活用してみる!
実践編|SQLを書いていこう
挫折しないコツが分かったところで、ここからは実際にSQLがどういったものか、練習問題を通して学んでいきましょう。
今回は、生徒のテストの点数を管理するデータベースを作成し、欲しいデータを取得していきたいと思います。
次の順番で学んでいくよ!
- SQLを書くための準備をする
- データベースを作成する
- テーブルを作成する
- テーブルにデータを入れる
- テーブルからデータを取得する
は~い、頑張ります!
1. SQLを書くための準備をしよう
データベースをつくってデータの操作をおこなうためには、まずSQLが書ける環境にする必要があります。
通常、SQLが動く環境を作るには、様々なアプリケーションをインストールする必要があるのですが、今は「xampp」や「mamp」といったツールで対応できます。
最初は、これらのツールを利用すると良いでしょう。
今回は、xamppを使用して「MySQL」というデータベース管理システムでデータベースを作成していきます。
ただし、MySQLだけではコマンドの操作が必要になるため、コマンド操作に慣れていない初学者にとってはハードルが高いです。
そのため、phpMyAdminというツールを使ってMySQLを視覚的に操作できるようにします(xampp・mampに入ってます)。
phpMyAdminはデータベースの操作を簡単にするツールだよ。
それぞれ、次の手順でphpMyAdminにアクセスしてください。
xamppの場合
コントロールパネルよりApacheとMySQLを起動し、[Admin] ボタンをクリックしてください。
mampの場合
mampを起動し、Apache ServerとMySQL Serverに緑のランプがついていることが確認できたら、[Open WebStart Page] をクリック。
その後、画面上部の [phpMyAdmin] をクリックします。
このような画面が表示されたら、phpMyAdminにアクセスできたということです。
画面上部の [SQL] をクリックしてください。
次のような画面が表示されたら準備完了です。
以上で、SQLが書ける環境の準備は完了です。
ここからは、どんどんSQLを書いていきますよ!
2. データベースを作成しよう
はじめに、テーブルを入れるためのデータベースを作成していきましょう。
データベースの中にデータが入ったテーブルがいくつも入っているイメージだよ。
例えるなら、本棚がデータベースで本がテーブルだね。
データベースの作成には [CREATE文] を使います。
構文は次のとおりです。
生徒のテストスコアを管理していくので、名前はexaminationにしています。
-- 試験データベースを作成 ※セミコロンも忘れずに
CREATE DATABASE examination;
[実行] をクリックすると、きちんと左側のデータベース一覧にexaminationデータベースが作成されていますね。
ちなみに、examinationの上にある「新規作成」を押してもデータベースは作れるぜ。
だから、phpMyAdminが使える環境なら、わざわざCREATE文を書くシーンは少ないのが本音。
新規作成時にどういうCREATE文が発行されているのかを理解するために、あえて書いてもらったぜ!
きゃー!ドエスぅ~!
3. テーブルを作成しよう
データベースというデータを入れる箱(本棚)ができたら、次はテーブルを作成していきましょう。
生徒のテストの点数を管理するために、ここでは生徒テーブルと点数テーブルの2つのテーブルを作成していきます。
ここでも先ほどの [CREATE文] を使っていきますが、テーブルには具体的にどんなデータを入れていくのか?を指定する必要があります。
構文は次のとおりです。
CREATE TABLE students(
カラム名 型
);
テーブル名は複数形で命名するケースが多いです。
カラム名とは、列の先頭に来る名前。
テーブルで管理したい項目名を書いていきます。
カラム名は英語表記が一般的です。
大文字を使用せず、単語を区切る場合はアンダーバーを使用しましょう。
実際に書くとこんな感じになるぜ。
-- 生徒テーブルを作成
-- 単語の間は半角スペースで区切る
CREATE TABLE students(
student_id INT PRIMARY KEY,
last_name VARCHAR(30),
first_name VARCHAR(30)
);
生徒テーブルでは、生徒を管理するための「生徒ID」・「姓」・「名」をカラムに指定したぜ。
他にも、学年やクラスなどの生徒に関する情報をこのテーブルに追加していけば整理しやすいよね。
INTとかVARCHARとか、PRIMARY KEYって何なの?
読み方もわかんないし、挫折しそう。
大丈夫、そばにいるよ。
INTはイント、VARCHARはバーキャラとかバーチャーって読まれることが多いぜ。
これはデータの型だね。
INTは数値型といって、文字を保存しておくことはできない。
VARCHAR(30)というのは、文字列型で30文字まで保存できる、っていう感じ。
INTとVARCHARはよく使うから、覚えておこう!
ふうん、束縛されたくない私にとって、型を決められてしまうのは、何だか悔しい!
いつか、この束縛が気持ちよくなるよ。
で、次はPRIMARY KEYだけど、これは重複データの登録を禁止してくれる指定なんだ。
student_idにPRIMARY KEYを指定してるから、student_idのデータは絶対かぶらないってことになるぜ。
制約には、主に次のような種類があります。
PRIMARY KEY(主キー) | データの重複を禁止する |
---|---|
NOT NULL | NULL値(値が入っていない状態)を禁止する |
DEFAULT=値 | あからじめ初期値を設定する |
UNIQUE | データを一意に保つ |
テーブル作成も、実はCREATE文を書くシーンって意外と少ないんだ。
phpMyAdminなら、ボタンクリックで作れちゃうからね。
また、あえてCREATE文を書かせたの?いやらしい~
あえて書くから基礎が身に付くんだぜ!
じゃあ、同じ要領で次は点数テーブルを作成していこう。
CREATE文、書いてみようか。
えっと…create文を使うんだよね。
点数だからテーブル名は「scores」かな…。あれ、カラムって何が必要なの?
お、さっそくつまづいたな?
「どんなカラムが必要なのか?」は、”どんなデータを保存しておきたいのか?”を考えるといいよ。
う~ん、たぶん生徒ごとのテストの点数かな…?
そうだね。ということは、scoresテーブルに必要なカラムは何だと思う?
科目名と点数?
そういうこっちゃ。
ただそれだけだと生徒テーブルと紐づけることができないから、同時に生徒IDもカラムに入れる必要があるんだよ。
なるほど…考えることが多くて大変だわ。
最初は分からないかもしれないけど、実際にデータベースを操作してみると、”こっちの構成の方が管理がしやすいな””このカラムも入れた方がいいな”というのがだんだん分かってくるようになるぜ。
こればかりは場数を踏むしかないね。
ということで、点数テーブルの例はこんな感じ。
-- 点数テーブル
-- 生徒テーブルと紐づけられるように生徒IDが必要
CREATE TABLE scores(
score_id INT PRIMARY KEY,
student_id INT,
subject_name VARCHAR(30),
score INT
);
点数テーブルで、各生徒の英語と数学の点数が分かるんだね。
あれ?点数テーブルのstudent_idには、PRIMARY KEYを指定しなくていいの?
うん、点数テーブルには、同じ生徒の点数が複数作成される可能性があるっしょ?
例えばさ、
student_id:1 subject_name:算数 score:80
student_id:1 subject_name:英語 score:50
みたいに。
点数テーブルでは、student_idを重複させる想定だから、PRIMARY KEYは指定しないっちゅうことなのよ。
4. テーブルにデータを入れてみよう
1~3までで、データベースは次のようになっています。
examinationデータベースの中に「studentsテーブル」と「scoresテーブル」の2つのテーブルが作成できていることが確認できたら、いよいよ各テーブルにデータを入れていきます。
データの挿入には、[INSERT文] というSQLを使用します。
構文は次のとおりです。
INSERT INTO
テーブル名(カラム名A, カラム名B…)
VALUES
(値1a, 値1b…), (値2a, 値2b…)
どのカラムにデータを登録したいかを順番に指定し、VALUESの後ろに登録したいデータを記述していきます。
ということは、studentsテーブルに生徒番号が1番の「山田花子」という名前を登録したい場合は、こんな風に書けばいいってこと?
INSERT INTO
students(student_id, last_name, first_name)
VALUES
(1, 山田, 花子);
お~、良い線いっているね!ただ、文字列型(VARCHAR)を登録するときは、値をダブルクォーテーションかシングルクオーテーションで囲う必要があるぜ!
つまり、こういうこと?
INSERT INTO
students(student_id, last_name, first_name)
VALUES
(1, "花子", "山田");
そう!良い感じだぜ!
ちなみに、全カラムにデータを登録したいときは、こんな風に省略して書くこともできるぜ!
-- 全カラムにデータを登録する場合
INSERT INTO
students
VALUES
(1, "山田", "花子");
なるほど!こっちの方が短くていいね!
じゃあ、同じ要領でstudentテーブルとscoreテーブルに次のデータを登録してみよう!
練習問題|データの登録
各テーブルに3つずつデータを登録しましょう。
studentsテーブル
scoresテーブル
考えてから、答えを見るようにしましょう。
どう?データの登録はできたかな?
それぞれのSQLはこんな感じに書ければOKだぜ!
-- 生徒テーブルに登録するデータ
INSERT INTO students VALUES
(1, "山田", "花子"),
(2, "松崎", "航"),
(3, "脚馬倉", "脚箱");
-- 点数テーブルに登録するデータ
INSERT INTO scores VALUES
(1, 2, "英語", 25),
(2, 2, "数学", 32),
(3, 3, "英語", 60);
ちゃんとデータが登録されているかも確認しておいてね!
phpMyAdminから対象のテーブルをクリックすれば、テーブルに登録されたデータを表示することができるよ。
■studentsテーブル
あれ、なんか名前のところが「??」で表示されちゃった!
文字化けだ。日本語は、文字コードがutf-8になっていないと正しく表示することができないんだ。
この場合、次の手順を踏むことで解決できるよ。
- データベース一覧の [examination] をクリック
- 上部タブの [操作] をクリック
- 一番下の [照合順序] を [utf8-general-ci] に変更し、
「すべてのテーブルの照合順序を変更」
「すべてのテーブルのカラム照合順序を変更する」にチェックを入れる - 画面右下の [実行] をクリック
ほんとだ、ちゃんと表示された!
ひとつ学びが増えたね!じゃあ、次からはデータベースの値を取得してみよう。
5. テーブルからデータを取得してみよう
ここからは、いよいよ”登録したデータを取得する”ということをおこなっていきます。
データの取得には [SELECT] 文を使うぜ。
他にもデータを更新する [UPDATE] 文や データを削除する [DELETE] 文なんかがあるけど、まず身につけてほしいのは [SELECT] 文。
練習問題も出していくから、ちゃんとついてきてくれよな!
頑張ります!
1. データをすべて取得しよう
はじめは、登録したデータをすべて取得していきましょう。
構文は以下のとおり。
構文はシンプルで分かりやすいけど、「*」って何?
アスタリスクだね。
アスタリスク(*)をつけると、テーブルに登録されているデータをすべて取得することができるんだ。
なるほど!便利だね!
じゃあ、さっそくstudentsテーブルからすべての生徒のデータを取得してみよう。
練習問題|全データの取得
studentテーブルから、すべての生徒の氏名を表示してみましょう。
ちゃんと書けたかな?次のように書けていたらOKだよ。
-- 全生徒の氏名を表示
SELECT * FROM students;
姓のみ取得したい場合は、カラム名を指定してこのように書けばいいんだ。
-- 全生徒の姓のみ表示
SELECT last_name FROM students;
これは簡単!私もできたよ!
いいね!じゃあ次に進もうか!
2. 指定したデータのみ取得しよう
実務でも全カラムのデータを取得したいことがありますが、必ずしもすべてのデータが必要でないことの方が多いです。
例えば、「生徒ID1の生徒名が知りたい」場合や、「生徒ID1の英語の点数だけ知りたい場合」などですね。
この場合は条件を指定することでデータを取得できるのですが、SQLでは条件指定の文法として [WHERE句] というものが用意されています。
SELECT文の後ろにWHERE句を記述することで、欲しいデータだけを取得することができるのです。
構文は次のとおり。
この”条件”のところって、どんな風に書くの?
例えば、生徒IDが1の生徒名を知りたい場合は、WHEREの後ろに「student_id=1」と書くんだ。
こんな感じ。
SELECT
last_name
FROM
students
WHERE
student_id = 1;
なるほどね!
生徒ID:2の英語の点数を知りたいときは、どうしたらいいの?
絞り込み条件が「ID」と「教科」だね。
複数条件による絞り込みは、ANDを使えばOKさ!
SELECT
score
FROM
scores
WHERE
student_id = 2 AND
subject_name = "英語";
ということで、早速だけど練習問題にいってみようか!
練習問題|指定したデータの取得
- studentsテーブルから、山田さんの「名前」を表示してみましょう。
- scoresテーブルから、生徒ID:3の数学の点数を表示してみましょう。
ちょっとレベルが上がったけど、ちゃんと解けたかな?
それぞれ、次のように書けていればOKだぜ。
-- 1. 山田さんの名前を表示
SELECT
first_name
FROM
students
WHERE
last_name = "山田";
-- 2. 生徒ID:2の数学の点数を表示
SELECT
score
FROM
scores
WHERE
student_id = 2 AND
subject_name = "数学";
ちょっと考えたけど、なんとか書けた!
いいね!ちなみに、間違えてしまっても気にしなくて大丈夫。
SQLは書いているうちに慣れてくるし、最初のうちにエラーを出しておけば、後で同じエラーが出たときに対処できるからね!
3. 順番を決めてデータを取得しよう
そういえば思ったんだけど、”点数が高い順”とか順番で表示したい場合はどうすればいいの?
良いところに気がついたね。
じゃあ、順番でデータを取得するのもやってみようか!
SQLでは、[ORDER BY句] という構文を使うことで、簡単に昇順・降順でデータを取得することができます。
今回は3つずつしかデータを登録していないので分かりにくいかもしれませんが、データの量が膨大になってくると必ずと言っていいほど使う構文になります。
ぜひ、マスターしていきましょう。
ORDER BY句はこんな風に使うよ!
SELECT カラム名 FROM テーブル名 ORDER BY カラム名 ASC / DESC
あ~なんか急に分からなくなってきた…チョベリバ。
大丈夫。ひとつずつ解説していくぜ!
まずORDER BYの後ろには、”ソートの基準となるカラム名”を記述するよ。
例えば、生徒ID順なら「student_id」を書くんだ。
そして、ちょっと分かりにくいASC / DESCだけど、これはそれぞれ昇順 / 降順という意味。
ASC(ascend)を指定したら昇順になって、DESC(dscend)を指定したら降順で表示されるよ。
つまり、全生徒の点数を、点数が高い順に表示したい場合は、次のように書くんだ。
SELECT
score
FROM
scores
ORDER BY
score DESC;
なるほど。ちょっと分かるようになってきた!
じゃあ、さっそく練習問題にいっちゃうよ!
練習問題|ソートしたデータの取得
- studentsテーブルから、生徒IDが大きい順に表示してみよう。
- scoresテーブルから、点数が高い順に表示してみよう。
う~ん…難しい!
最初と比べるとちょっと考えないといけないけど、構文はシンプルだよ。
それぞれ次のように書けばいいんだ。
-- 1. 生徒IDが大きい順に表示
SELECT
*
FROM
students
ORDER BY
student_id DESC;
-- 2. 英語の点数が高い順に表示
SELECT
*
FROM
scores
ORDER BY
score DESC;
4.複数のテーブルを結合してデータを取得してみよう
思ったんだけどさぁ、英語の点数が高い人順に氏名を取得したいときって、どうすればいいの?
scoresテーブルには氏名がないよ?
そうなんだよ、そんなときに必要になるのがテーブルの結合だ!
SQL初心者がつまずきやすいポイントだぜ!
結合?なんか怖い!
studentsとscoresを結合させるのだ!
結合させることで、英語の点数が高い人順に氏名を取得することができるぞ!
おおお~どうやって?
基本の型はこうだぜ!
う~~ん、わかりづらいなぁ。。。
だよね、studentsとscoresを結合させる例で見た方がわかりやすいかな!
SELECT
scores.score,
students.last_name,
students.first_name
FROM
scores
INNER JOIN students ON
scores.student_id = students.student_id
WHERE
scores.subject_name = "英語"
ORDER BY
scores.score DESC;
おおお?一気に複雑になった~!
大丈夫、ひとつずつ見ていこう。
まず、最初の4行は今までやった内容だから大丈夫だよね?
SELECT
scores.score,
students.last_name,
students.first_name
この部分で、点数、姓、名を取得しようとしているね。
で次がFROM部分。
FROM
scores
INNER JOIN students ON
scores.student_id = students.student_id
scoresという表組からデータを取得するよ~
というところまではわかるよね?
INNER JOIN studentsで「studentsと結合するよ!」という合図になる。
で、ON以降に「何を条件に結合させるか?」というのを書くんだ。
ここでは、scoresとstudentsが共通して持っているstudent_idを結合条件にすることで、「scoresのstudent_idと、studentsのstudent_idが同じものを紐づけるぜ!」っていうことになるんだ。
結合を表組で表すと、こんな感じ▼
ほおほお、結合することでscoresテーブルに関連するstudentsデータを取ってこれるのね!
んだんだ。
で、次のWHERE句で英語だけに絞り込んでる。
WHERE
scores.subject_name = "英語"
でもって、最後に点数の高い順に並べてるって感じね▼
ORDER BY
scores.score DESC;
5.外部結合でデータ取得をしてみよう
ねぇ、さかし。
INNER JOINで取得できないデータがあるんだけど。
WHEREで絞り込んでないのに…
INNER JOINは、データの状態によっては、取得対象外になることがあるぜ。
テーブルのデータとSELECT文はどうなってる?
こんな感じ。SELECT文は、ほぼ同じだよ。SELECTにstudent_idを追加しただけ。
SELECT
scores.score,
scores.student_id,
students.last_name,
students.first_name
FROM
scores
INNER JOIN students ON
scores.student_id = students.student_id
WHERE
scores.subject_name = "英語"
ORDER BY
scores.score DESC;
なるほど、scoresテーブルにstudent_id:4の点数を加えたんだね。
そう。なのに、上記のSELECT文だと、student_id:4の点数が取得できないの~
それは、INNER JOINが結合するカラムの両方に値がないデータは取得しないからなんだ。
こういうときは、外部結合(LEFT JOIN)を使うと、student_id:4の点数も取得できるぜ!
やり方は簡単で、上記SELECT文のINNER JOINをLEFT JOINに変えるだけ。
SELECT
scores.score,
scores.student_id,
students.last_name,
students.first_name
FROM
scores
LEFT JOIN students ON
scores.student_id = students.student_id
WHERE
scores.subject_name = "英語"
ORDER BY
scores.score DESC;
あ、ほんとだ、student_id:4の点数も取得できた!
ん?でも生徒名が表示されない…
なにこれ、NULL、NULL…
ヌルヌルしてるの?
そう、ヌルヌルしてるね。
っていうのは冗談で、NULLっていうのは「定義されていない・値が何も存在しない状態」のことを指すんだ。
だって、studentsテーブルに、student_id:4のデータがないだろ?
あっ、そっか!studentsテーブルに生徒を追加するの忘れてた…
こういうときは、外部結合(LEFT JOIN)を使えば、結合するテーブル(students)に値がなくても取得できるんだ。
じゃあ、もう全部外部結合でよくね?
忘れちゃってもデータ取得できるように。
何でも外部結合というわけにはいかないのさ。
実務では、内部結合(INNER JOIN)と外部結合(LEFT JOIN)を使い分けるシーンが多いから、違いを認識しておこう!
あとはひたすら練習・実装で経験を積むべし
まだ上記は序の口って感じ。
あとは、集計関数も理解しておきたいね。
https://qiita.com/devopsCoordinator/items/85918c8508dddf19586f
理解したら、あとはSQLの問題を繰り返し解きまくるといいぜ。
Tech ProjinのSQL練習問題が無料でおすすめ!
実務で使うような問題がたくさんあるぜ!
Q1から、いきなりわからん!
うん、基礎を理解しても最初はわからないと思う!
答えを見ながら理解していこうぜ!