イチから学ぶデータベース・SQL(3)

前回まではデータベースの基本やSQLの基礎について説明してきました。

今回からは、SQLを実務で使うための基本的なことについて学びながら説明していきます。

1. 前回までの振り返りと今回学習する内容

イチから学ぶデータベース・SQL(1)とイチから学ぶデータベース・SQL(2)では、データベースの基礎から始まり、テーブルを作成するCREAT文でユーザー一覧と職業一覧のテーブルを作成し、そのデータを検索したり更新したり、基本的なSQLについて学んできました。


今回からは実務でSQLを使っていけるよう、より実践的な事について学んでいきます。

なお、今回もpaizaラーニングを主として、様々なウェブサイトを参考にして進めていきます。

今回使うサンプルデータベースのテーブル構成は、以下のようになります。


eventlog、users、jobs、events、areaというテーブルがあります。

eventlogテーブルはuserIDとusersテーブルのuserIDと、eventsテーブルのeventIDと関連しています。

usersテーブルはjobIDとjobsテーブルのjobIDと、areaテーブルのareaIDと関連しています。

2. SQLの書き方について

ここでは、SQLの書き方のポイントについて説明していきます。

コーディング全般に言えますが、他の人に自分の作ったコードを確認して貰う時のみならず、自分で見返す時にも分かりやすいコードを書くことは非常に重要です。

SQLを書くときも、読みやすいコードを書くように意識しながらSQLを書いていきましょう。


では、実際にSQL文を書きながら確認していきます。

今回は、usersテーブルにjobsテーブル、areaテーブルを結合するSQL文を書いてみます。

SELECT * FROM users INNER JOIN jobs ON jobs.jobID = users.jobID INNER JOIN area ON area.areaID = users.areaID;


jobsテーブルのjobIDとusersテーブルのjobIDを関連付けて、さらにareaテーブルのareaIDとusersテーブルのareaIDと関連付けて結合させるSQL文です。


これを実行し、結合させたテーブルをこのように表示させることもできるのですが、このままだとSQL文が非常に見にくく、他の人が見たら混乱しかねません。

ですので、このSQL文では、

SELECT *

ここまで書いて改行を挟むなど、改行やインデントを使用し、見やすく書かなければなりません。


例えば、

SELECT *
FROM users
INNER JOIN jobs ON jobs.jobID = users.jobID
INNER JOIN area ON area.areaID = users.areaID;


このようなSQL文だと、どのテーブルを連結しているかが一目でわかります。

3. 間違いやすいポイントについて

続いて、SQL文を書く上で間違いやすいポイントを説明していきます。

usersテーブルとjobsテーブル、areaテーブルを結合した結果から、ユーザーIDと名前を指定してデータを取り出す場合です。

SELECT userID name
FROM users
INNER JOIN jobs ON jobs.jobID = users.jobID
INNER JOIN area ON area.areaID = users.areaID;


このようにuserIDとnameを指定し実行してみます。


すると、このようにnameの列のみが表示され、userIDが表示されませんでした。

これは、SELECT userID name の列に問題があり、複数のカラムを表示させる時にはカンマ(,)で区切る必要があります。

これを正しいSQL文で実行すると、このようになります。


このように、userIDとnameが表示されました。

カンマ忘れやセミコロン忘れなど、小さなミスでもコードが実行できずにエラーが起きたり、表示させたいデータが表示されなかったりするので、細かい所にも気を使わなければなりません。


次は、userIDと名前の他に、areaIDと都道府県名も表示させてみます。

SELECT userID, name, areaID, area_name
FROM users
INNER JOIN jobs ON jobs.jobID = users.jobID
INNER JOIN area ON area.areaID = users.areaID;


このSQL文を実行すると、このようになります。


エラー文が表示されてしまいました。

これはなぜかというと、SELECT文の行にあるareaIDが、areaテーブルとusersテーブル、両方のテーブルに存在しているためどちらのareaIDを表示させるのかが曖昧になってしまっているからです。

このエラーを解消するためには、カラム名の前にテーブル名を追記し、どのテーブルのareaIDかをわかるようにしておく必要があります。

SELECT userID, name, area.areaID area_name
FROM users
INNER JOIN jobs ON jobs.jobID = users.jobID
INNER JOIN area ON area.areaID = users.areaID;


このようにSQL文を修正すると、エラーが出ずに正しくデータを抽出することができます。


続いては、ユーザーIDが50番台のユーザーを抽出して表示してみます。

ユーザーを抽出するには、WHEREを使用してSQL文を作成し、実行します。

SELECT userID, name, area.areaID area_name
FROM users
INNER JOIN jobs ON jobs.jobID = users.jobID
INNER JOIN area ON area.areaID = users.areaID
WHERE
userID >= 50
userID < 60;


このSQL文を実行すると、このようになります。


エラーが出てしまいました。

これはなぜかというと、WHEREで複数の条件を指定する際はANDを入れて条件を繋ぐ必要があります。