未経験からエンジニア転職をするための最強ロードマップロードマップ

【SQL教材③】HAVING句や内部結合・外部結合などのSQL応用構文を徹底解説(MySQL)

ファド

こんにちは!
PHPのLaravelやJavaScriptでWeb開発をしているフリラーンスエンジニアのファドと申します!

こちらの記事はSQL教材の第3回目の記事になります。

その他のSQL教材を学習したい方は下記リンクから直接教材へ飛ぶことができます。

目次

HAVING

HAVINGの説明の前に以下のコードを実行してください。

SELECT
    *
FROM
    db_test.test01
HAVING
    code = "001";

お気づきかもしれませんが、HAVINGはWHEREと同じ動きをします。
ただ、実行されるタイミングが違います。

SQLの命令文は以下の順番で実行されます
①WHERE

②GROUP BY

③HAVING

このため,GROUP BYを使わない処理では
WHERE,HAVINGを使い分けなくても問題ないですが、

GROUP BYを使う場合は使い分けていきましょう。

以下のSQL文を実行してみましょう!

SELECT
    code,
    COUNT(code) AS code_count
FROM
    db_test.test01
GROUP BY
    code
HAVING
    code_count > 1;

画像のようにカラムがcodeで、カウント数が1よりも大きいデータのカウント数が表示されていればOKです!

★検索ワード
・SQL HAVING 使い方

CASE

CASEは条件分岐を行うための命令です。

使い方は以下のとおりです!

SELECT
    *,
    CASE
        WHEN 条件式 THEN 条件を満たしたら表示する内容
        WHEN 条件式 THEN 条件を満たしたら表示する内容
        ELSE 条件を満たしていなかったら表示する内容
    END
FROM
    DB名.テーブル名;

CASEの後にWHENで条件を書いて、THENでその条件に当てはまったものを出力します。
また、ELSEは他の条件全てに当てはまらなかったときに出力する処理を書きます。
最後にENDで閉じます。

ちなみにWHENの条件はいくつ書いてもOKです。

参考例①

SELECT
    *,
    CASE
        WHEN age >= 40 THEN "ベテラン"
        WHEN age <= 25 THEN "若手"
        ELSE "その他"
    END
FROM
    db_test.test01;

ASで名前を付けてあげると見やすいですね。

参考例②

SELECT
    *,
    CASE
        WHEN age >= 40 THEN "ベテラン"
        WHEN age <= 25 THEN "若手"
        ELSE "その他"
    END AS "区分"
FROM
    db_test.test01;

★検索ワード
・SQL CASE 使い方

SUM

こちらのSUMも関数です。
カラムの数値の合計値を取得できます。
※数値カラムのみ使用可能

使い方は以下のとおりです!

SELECT
    SUM(カラム名)
FROM
    テーブル名;

参考例

-- 年齢の合計値を取得
SELECT
    SUM(age)
FROM
    db_test.test01;

★検索ワード
・SQL SUM 使い方

AVG

こちらのAVGも関数です。
カラムの数値の平均値を取得できます。
※数値カラムのみ使用可能。

使い方は以下のとおりです!

SELECT
    AVG(カラム名)
FROM
    テーブル名;

参考例

-- 年齢の平均値を取得
SELECT
    AVG(age)
FROM
    db_test.test01;

★検索ワード
・SQL AVG 使い方

MAX,MIN

これらの関数MAXとMINは
MAXはカラムの数値の最大値、MINは最小値を取得できます。
※数値カラムのみ使用可能。

使い方はそれぞれ以下のとおりです!

SELECT
    MAX(カラム名)
FROM
    テーブル名;
SELECT
    MIN(カラム名)
FROM
    テーブル名;

参考例

SELECT
    MAX(age)
FROM
    db_test.test01;
SELECT
    MIN(age)
FROM
    db_test.test01;

★検索ワード
・SQL MAX 使い方
・SQL MIN 使い方

ORDER BY

ORDER BYは指定したカラムを対象に昇順(または降順)に並び替えることができます。
昇順(ASC)、降順(DESC)を指定可能

使い方はそれぞれ以下のとおりです!

SELECT
    カラム名
FROM
    テーブル名
ORDER BY
    カラム名 ASC;
SELECT
    カラム名
FROM
    テーブル名
ORDER BY
    カラム名 DESC;

参考例

SELECT
    *
FROM
    db_test.test01
ORDER BY
    age ASC;
SELECT
    *
FROM
    db_test.test01
ORDER BY
    age DESC;

サブクエリ

SQL文を実行した結果を、さらに別のSQL文に利用することができます。
この時、SQL文のなかにSQL文を書くことになります。これを、サブクエリといいます。

今回は全体の平均年齢以上の人だけを表示するSQL文を例に挙げてみましょう!

順序だてて考えていくと、
①全体の平均年齢を出す
② ①の結果を条件式にしてレコード取得

つまり①のクエリがサブクエリになります。

では、実際にSQL文を見てみましょう!

SELECT
    *
FROM
    db_test.test01
WHERE
    age >= (
        SELECT
            AVG(age)
        FROM
            db_test.test01
    );

上記のSQL文の()内の部分SELECT AVG(age) FROM db_test.test01が平均年齢を出している箇所になります。
そして、こちらの箇所がサブクエリと呼ばれる箇所です。
()内のSQL文の実行結果は23.0000です。
これは、test01のageカラムの平均値が23であるということを示しています。

サブクエリの箇所で行われている処理が理解できたところで、実際にSQL文を実行してみましょう!

画像のように、test01テーブルの中からageの値が平均値以上(23以上)のデータのみ取得できていればOKです!

★検索ワード
・SQL ORDER BY 使い方

INNER JOIN

INNER JOINとは複数のテーブル同士のデータを取得し、結合を行い、データを取得したりする際に使用します。
言葉ではわかりづらいかと思いますので実際に使用してみましょう!

使い方は以下のとおりです!

SELECT
    取得するカラム
FROM
    DB名.テーブルA
    INNER JOIN DB名.テーブルB ON Aの対象カラム = Bの対象カラム;

以下のSQL文を実行してみましょう!

SELECT
    *
FROM
    db_test.test01
    INNER JOIN db_test.test02 ON db_test.test01.code = db_test.test02.code;

画像のようにデータが取得できていればOKです!
何が起こっているのかを詳しく説明していきます!

まず、SELECT * FROM db_test.test01でtest01テーブルのデータをすべて取得しています。
次にINNER JOIN db_test.test02でdb_test.test02テーブルのデータをSELECT文で取得したtest01テーブルと同じように取得しています。

最後に、ON db_test.test01.code = db_test.test02.codeでtest01テーブルとtest02テーブルのcodeカラムの値が同じもの同士を結合しています。

上記の例では、test01テーブルとtest02テーブルのすべてのデータを取得していますが、
指定したカラムだけを取得することもできます。

SELECT
    test01.id,
    name,
    test01.code,
    occupation
FROM
    db_test.test01
    INNER JOIN db_test.test02 ON db_test.test01.code = db_test.test02.code;

上記のSQL文を実行すると下記画像のように表示されます。

★検索ワード
・SQL INNER JOIN 使い方

LEFT(RIGHT) JOIN

LEFT(RIGHT) JOINもINNER JOIN同様に複数のテーブルのデータ同士を結合し取得するために使用されます。

まずは使用してみましょう!

使い方は以下のとおりです!

SELECT
    取得するカラム
FROM
    DB名.テーブルA LEFT(RIGHT)
    JOIN DB名.テーブルB ON Aの対象カラム = Bの対象カラム;

まずはLEFT JOINを実行しましょう!
こちらでは、idが6のnameがコジロウのnameカラムのデータが表示されます。

SELECT
    *
FROM
    db_test.test01
    LEFT JOIN db_test.test02 ON db_test.test01.code = db_test.test02.code;

画像のようにデータが取得できていればOKです!

次に、RIGHT JOINを実行しましょう!
こちらでは、idが6のnameがコジロウのnameカラムのデータは表示されていません。

SELECT
    *
FROM
    db_test.test01
    RIGHT JOIN db_test.test02 ON db_test.test01.code = db_test.test02.code;

なんとなく違いはわかっていただけたかと思います。
では、詳しく説明していきます。

まず、LEFT JOIN, RIGHT JOINは、LEFT OUTER JOIN, RIGHT OUTER JOINの省略系です。
LEFTであろうと、RIGHTであろうと、OUTER JOINという属性のクエリです。

OUTER JOINとは、複数のテーブルがあり、それを結合する際、優先テーブルを1つ決め、そこにある情報は全て表示しながら、他のテーブル情報に対になるデータがあれば表示する(ない場合はNULLで補完表示)。
という機能となります。
よって、先程のSQL文を実行した際にnameがコジロウのnameカラムのデータがLEFT JOINを使用した際には表示され、RIGHT JOINを使用した際には表示が行われなかったのです。
そして、LEFT, RIGHTは、そのテーブルが優先テーブルなのかを決めるために使っています。

★検索ワード
・SQL LEFT JOIN 使い方
・SQL RIGHT JOIN 使い方
・SQL OUTER JOIN 使い方

SQLの実行順序

SQLの実行される順序について説明していきます。
HAVINGとWHEREの説明でも少し触れましたが、以下がSQLの実行順序です。

1.FROM
2.ON
3.JOIN
4.WHERE
5.GROUP BY
6.WITH CUBE または WITH ROLLUP
7.HAVING
8.SELECT
9.DISTINCT
10.ORDER BY
11.TOP

意図しない動きがあった時はこの順序が関係しているかもしれませんので、チェックしましょう。

★検索ワード
・SQL 実行順序

おめでとうございます!

SQLの教材を最後までお読みいただき、ありがとうございました!

次は学習した内容の確認としてSQLの課題に挑戦してみましょう!

SQL課題

さあ、これまでの学習の成果を存分に発揮させましょう!

あわせて読みたい
【PHP+SQL教材①】PHPでデータベース(MySQL)に接続する方法からデータの取得方法などを徹底解説 こちらの記事はPHP+SQL教材の第1回目の記事になります。 その他のPHP+SQL教材を学習したい方は下記リンクから直接教材へ飛ぶことができます。 PHPからDBを操作する こち...

プログラミング学習サポートについて

「独学で挫折した。。。」

「一人でのプログラミング学習がしんどい。。。」

「未経験からエンジニア転職をしたいけど何をしたら良いかわからない。。。」

このような悩みをお持ちの方向けに、本教材作成者のファドがMENTAという学習サイトにてあなたのプログラミング学習とエンジニア転職を徹底サポートいたします!

サポート価格はなんと1日あたりたったの約300円!

教材で分からない箇所のサポートはもちろんのこと、本サイトで公開しているすべての課題の解答も公開しております。
また、MENTAで学習を終わらせていただいた方限定で懇意にしていただいている企業さんを紹介することもあります!

なお、サポート内容の詳細は下記の通りです。

  • 目標設定
  • マインドセット
  • オリジナル教材見放題
  • オリジナル課題見放題
  • オリジナル課題の解答見放題
  • 課題コードレビュー
  • 教材への無制限質問
  • 課題への無制限質問
  • ポートフォリオ作成アドバイス
  • 褒めのコーチング

いくつかのプランを用意させていただいておりますので、下記より一度ご覧ください!

あわせて読みたい
【プログラミング学習】1日あたりたったの「300円」のみでプログラミングを学び、最短で転職or稼ぐ!|【ME... プログラミングを学びたいすべての方へこれからの時代は格安でプログラミングを学び、最短で稼げ自己紹介はじめまして!この度はプランをご覧いただき、誠にありがとうござ...

コメント

    この記事が気に入ったら
    フォローしてね!

    よかったらシェアしてね!
    • URLをコピーしました!

    コメント

    コメントする

    目次