[DB]<DB Fiddle>SQLをWEBブラウザで簡単に学習(IN句/副問い合わせ/グループ化)
◆DB Fiddleとは?
「SQL Fiddle」とは、
Web上でSQLを手軽に実行することができるサイトです。
Fddleの英語の意味としては、「いい加減に扱う、改ざんする」などです。
なので、DBを手軽にいじくると言ったような意味合いだと思われます。
いちいち実行環境を構築をする必要がありませんので、
ちょっとSQL文を試したい時や、低コストにサクッと学習したい時などに便利です。
DB Fiddle(サイトはこちら)
◆DB Fiddleの使い方
テーブルの作成やクエリの基本操作については、
前回の記事をご覧ください。
そちらにサンプルソースも載せています。
◆SQL構文
①IN句
IN句は、
WHEREで複数の要素を指定したい場合に、
「等しい(=)」ものが判定できます。
SELECT *
FROM 商品
WHERE 商品名 IN ('USBケーブル' , 'マウス')
;
商品番号 | 商品名 | 単価 |
---|---|---|
3 | USBケーブル | 150 |
4 | マウス | 200 |
ちなみに、
ORでも同様の結果を取得可能です。
ただ、IN句を使用した方がスマートに書けます。
また、この次の副問い合わせでも
IN句を使用したりしますので、
覚えておきましょう。
SELECT *
FROM 商品
WHERE 商品名 = 'USBケーブル' OR 商品名 ='マウス'
;
商品番号 | 商品名 | 単価 |
---|---|---|
3 | USBケーブル | 150 |
4 | マウス | 200 |
②副問い合わせ(サブクエリ)
副問い合わせとは、
SELECT文の句に埋め込まれたSELECT文のことです。
サブクエリとも呼ばれたりします。
副問い合わせを使用することで、
別のテーブルの参照結果を条件に指定することや、
複雑な条件指定が可能です。
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.>と併用することで、
グループごとの数を算出することができます。
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.>を使用します。
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の使用方法は以下になります。
SELECT 商品番号, COUNT(商品番号),SUM(数量) AS 行数 , SUM(数量*販売単価) AS 売上
FROM 注文明細
WHERE 商品番号 = 1
GROUP BY 商品番号
HAVING 売上 >1000
商品番号 | COUNT(商品番号) | 行数 | 売上 |
---|---|---|---|
1 | 3 | 18 | 2300 |
◆最後に
いかがだったでしょうか。
また、
別のSQL構文の紹介もできればと思います。
ここまで、
ご覧いただきありがとうございました。
Discussion