🗄️

[DB]<DB Fiddle>SQLをWEBブラウザで簡単に学習(IN句/副問い合わせ/グループ化)

2022/10/02に公開

◆DB Fiddleとは?

「SQL Fiddle」とは、
Web上でSQLを手軽に実行することができるサイトです。

Fddleの英語の意味としては、「いい加減に扱う、改ざんする」などです。
なので、DBを手軽にいじくると言ったような意味合いだと思われます。

いちいち実行環境を構築をする必要がありませんので、
ちょっとSQL文を試したい時や、低コストにサクッと学習したい時などに便利です。

DB Fiddle(サイトはこちら)

◆DB Fiddleの使い方

テーブルの作成やクエリの基本操作については、
前回の記事をご覧ください。
そちらにサンプルソースも載せています。

https://zenn.dev/nakohama/articles/9e7b96a5695c1f

◆SQL構文

①IN句

IN句は、
WHEREで複数の要素を指定したい場合に、
「等しい(=)」ものが判定できます。

IN(サンプル)
    SELECT * 
    FROM 商品
    WHERE 商品名 IN ('USBケーブル' , 'マウス')
    ;
商品番号 商品名 単価
3 USBケーブル 150
4 マウス 200

ちなみに、
ORでも同様の結果を取得可能です。
ただ、IN句を使用した方がスマートに書けます。

また、この次の副問い合わせでも
IN句を使用したりしますので、
覚えておきましょう。

OR(サンプル)
    SELECT * 
    FROM 商品
    WHERE 商品名 = 'USBケーブル'  OR  商品名 ='マウス' 
    ;
商品番号 商品名 単価
3 USBケーブル 150
4 マウス 200

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

副問い合わせとは、
SELECT文の句に埋め込まれたSELECT文のことです。

サブクエリとも呼ばれたりします。

副問い合わせを使用することで、
別のテーブルの参照結果を条件に指定することや、
複雑な条件指定が可能です。

IN(サンプル)
SELECT * 
FROM 注文明細 
WHERE 商品番号  = (SELECT 商品番号 FROM 商品 WHERE 商品名 = '乾電池' )
;

<注文明細>から<商品番号>が"1"のデータが表示されます。

注文番号 商品番号 数量 販売単価
1 1 3 100
2 1 10 120
4 1 5 160

ちなみに、注意点としては、
WHEREで指定する際は、サブクエリの結果が1つである必要があります。
(上のサンブルでは、サブクエリのSELECT文の結果は"1")

・サブクエリで複数の結果が返ってきている場合

例えば、サブクエリで複数の結果が返ってきている場合はエラーとなります。
(下のサンブルでは、サブクエリのSELECT文の結果は"2"と"4")

サブクエリで複数の結果が返ってきている場合(サンプル)
SELECT * 
FROM 注文明細 
WHERE 商品番号 = (SELECT 商品番号 FROM 商品 WHERE 商品名 = 'イヤホン'  OR 商品名 = 'マウス' )
;
エラーメッセージ
Query Error: Error: ER_SUBQUERY_NO_1_ROW: Subquery returns more than 1 row

この場合もやり方を工夫すれば、実行可能になります。

ここで、IN句を使用します。

...
IN句は、WHEREで複数の要素を指定したい場合に使用するんでしたよね。
ORと同じで、複数要素のうちどれか一つが当てはまった場合、と解釈されます。
そうすることで複数の結果を返却するサブクエリでも可能です。

サブクエリで複数の結果が返ってきている場合(サンプル)
SELECT * 
FROM 注文明細 
WHERE 商品番号 IN (SELECT 商品番号 FROM 商品 WHERE 商品名 = 'イヤホン'  OR 商品名 = 'マウス' )
;
注文番号 商品番号 数量 販売単価
1 2 10 50
3 4 1 200
5 2 8 65

③グループ化

・GROUP by 句

グループ化を行うことで、
複数のデータ項目をまとめることができます。

グループ化には、
<GROUP BY 句>を使用します。

例えば、
以下のようなグループ化前のデータがあるとします。

グループ化前(サンプル)
SELECT 商品番号
FROM 注文明細
商品番号
1
2
1
4
1
2

これに対して、
<商品番号>でグループ化を行うと
以下のように、なります。

グループ化後(サンプル)
SELECT 商品番号
FROM 注文明細
GROUP BY 商品番号
商品番号
1
2
4

・COUNTやSUMとの併用

グループ化を行うと、個別の具体的な項目データは表示できません。
ただ、この時<COUNT.>や<SUM.>と併用することで、
グループごとの数を算出することができます。

COUNTやSUMとの併用(サンプル)
SELECT 商品番号, COUNT(商品番号),SUM(数量) AS 行数 , SUM(数量*販売単価) AS 売上
FROM 注文明細
GROUP BY 商品番号
;
商品番号 COUNT(商品番号) 行数 売上
1 3 18 2300
2 2 18 1020
4 1 1 200

ちなみに、
<AS.>は名称のラベリングできます。

条件を絞る:HAVING

グループ化されたデータで
条件を絞る場合には、<HAVING.>を使用します。

HAVING(サンプル)
SELECT 商品番号, COUNT(商品番号),SUM(数量) AS 行数 , SUM(数量*販売単価) AS 売上
FROM 注文明細
GROUP BY 商品番号
HAVING 売上 >1000
;
商品番号 COUNT(商品番号) 行数 売上
1 3 18 2300
2 2 18 1020
・WHEREとの違い

条件を絞るといえば、WHEREもあります。
その違いも確認しておきましょう。

HAVING...グループ化後のデータの抽出条件を絞る
WHERE...グループ化前のデータの抽出条件を絞る

です。
グループ化している場合の、
WHEREの使用方法は以下になります。

WHEREとの違い(サンプル)
SELECT 商品番号, COUNT(商品番号),SUM(数量) AS 行数 , SUM(数量*販売単価) AS 売上
FROM 注文明細
WHERE 商品番号 = 1 
GROUP BY 商品番号
HAVING 売上 >1000
商品番号 COUNT(商品番号) 行数 売上
1 3 18 2300

◆最後に

いかがだったでしょうか。

また、
別のSQL構文の紹介もできればと思います。

ここまで、
ご覧いただきありがとうございました。

Discussion