
以下の状況で行き詰ってしまい進むことが出来ません.
ヒントをいただければ幸いです.
店の名前と店の種類が入った
shop(text shopname, text type)
shop1, 果物屋
shop2, 八百屋
shop3, 果物屋
:
というテーブルと,店の名前と置いてある品物の値段が入った
stock(text shopname, int ringo, int watermelon)
shop1, 100, 1000
shop2, 0, 1500
shop3, 200, 1200
:
というテーブルがあるとします.
このときに,果物屋だけの西瓜の値段の平均,分散などを出すには
どのような sql 文を書けばよいのでしょうか?
いろいろ調べたところ GROUP BY を使うのかな,
というところまで来たのですが,
2つのテーブルを使う sql 文が上手くかけない状況です.
初心者のため質問文におかしいところもあるかもしれませんが,よろしくお願いします.
No.1ベストアンサー
- 回答日時:
表の列構成を、考え直しませんか?
まず、表の定義に関してアドバイスします。
(1)TEXT型は制限があるので、長さが不確定な「文章」など以外は無闇に使用しない。
(2)「りんご」や「めろん」をそれぞれ列としてしまうと、扱う種類の増減のたびに表の定義変更が必要になる。
→店名、商品名、価格といった構成にするのが、一般的。
(3)「扱わない商品」に「0」を入れると、平均値などが正しく求められない。こういうケースでは、nullを格納すべき。
上記のような見直しを行えば、(2)の対策を行うことで、商品でグループ化するSQLになります。
現状の定義では、グループ化はできず、以下のようなSQLになります。
select avg(suika)
from shop,stock
where shop.shopname=stock.shopname
and shoptype='果'
;
(2)の対策を行った場合は、一つのSQLで全商品ごとの平均価格などを求められるようになります。
select 商品,avg(価格)
from shop,stock
where shop.shopname=stock.shopname
and shoptype='果'
group by 商品
;
ご回答ありがとうございます.
> 表の列構成を、考え直しませんか?
実は,私が構築したものではないデータベースを扱うことになりまして,
実際には(例示した果物等ではなく)他にもたくさんテーブルがあり,
それらがいろいろと絡み合ってるのでここだけ変更することも出来ず,
この定義でいくしかない状況です.
書いていただいた1つ目の sql 文を参考にもう少し頑張ってみます.
> (1)TEXT型は制限があるので、
> 長さが不確定な「文章」など以外は無闇に使用しない。
> (3)「扱わない商品」に「0」を入れると、
> 平均値などが正しく求められない。
> こういうケースでは、nullを格納すべき。
このあたりも大変参考になりました.
ありがとうございます.
No.4
- 回答日時:
#1回答者です。
>No.2 さんの LEFT JOIN と
>No.3 さんの INNER JOIN の違い等
#1回答で書いた
select ~ from 表1,表2 where 表1.列1=表2.列1
は、inner joinと等価です。
表1と表2に、対応するデータがあるものだけがヒットします。
left [outer] joinは、表1にあって表2にないデータがあっても、表1のデータがヒットします。
shop表
shop1、shop2、shop3、shop4、shop5
stock表
shop1、shop2、shop3、shop5
と登録していたとすると、#1のSQLやinner joinでは、shop4のデータは検索されません。
left joinならshop4のデータも検索されます。
「shop表にはあるがstock表にはない」というデータの登録をしないなら、inner joinでもleft joinでも違いはありません。
再度の回答ありがとうございます.
よくわかりました.
皆さんのおかげでやりたかったことは上手く出来ました.
ありがとうございました.
No.3
- 回答日時:
破綻寸前のデータベース構成ですね。
なにをやるにも制限が大きくて実用には向かない可能性が
高いですが、どうしてもこれでやるならこんな感じでしょうか。
SELECT
AVG(`watermelon`) AS `スイカの平均`
,VARIANCE(`watermelon`) AS `スイカの分散`
FROM `stock`
INNER JOIN `shop` ON `shop`.`shopname`=`stock`.`shopname`
AND `type`='果物屋'
もし初心者ということであれば、このDBで学習すると
へんなくせがつきそうなのでお勧めできません。
この回答への補足
おかげさまでこの部分については目処が立ってきました.
No.2 さんの LEFT JOIN と
No.3 さんの INNER JOIN の違い等を
追加質問しようと思ったのですが,
知識が足りなさ過ぎてきりがない気がしてきました.
よろしければ皆さんのおすすめの書籍等を
ご紹介いただけたらと思います.
2冊ほど入門書を買ってみたのですが,
今扱おうとしているデータベースには
まったく役に立たないくらい基本的なものしか載ってなかったもので….
ご回答ありがとうございます.
何せ1週間前に始めたところなので
皆さんにいろいろな例を挙げていただいて大変助かっております.
> もし初心者ということであれば、このDBで学習すると
> へんなくせがつきそうなのでお勧めできません。
数学等をやっているので(一応)論理的思考で全体を見ると
整合性が取れているような気がするのですが,
私の例が良くなかったのかも知れませんね.
実際には,ユーザのアクションごとにテーブルが存在し,
その数が50を超えているような大きめのDBです.
一番の間違いはそれをまったくやったことのない
私に任せたことのような気がします(;^_^A
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLで、Join句で結合したテ...
-
既存データをINSERT文にして出...
-
ADO+ODBCでテーブルに接続する...
-
SQLのテーブルにないデータの出力
-
指定した年に在籍していた社員...
-
副問合せを使わずにUNIONと同様...
-
2つのテーブルをLIKE演算子のよ...
-
PRIMARY KEYのコピー
-
DB2のSQLコマンドについて
-
Accessの構成をコピーしたい
-
結合したテーブルをSUMしたい
-
SQLです!!教えてください。あ...
-
テーブル名が可変の場合のクエ...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
エラーを起こす方法
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
UPDATEで既存のレコードに文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLサーバに対するSQL文で抽出...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
Accessの構成をコピーしたい
-
結合したテーブルをSUMしたい
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
-
2つのテーブルをLIKE演算子のよ...
-
ExcelのMatch関数のようなもの...
-
改行を含んだデータのインポート
-
PRIMARY KEYのコピー
-
ADO+ODBCでテーブルに接続する...
-
ACCESSのVBAにてExcelに行...
-
同一テーブル内での比較(最新...
-
(SQL)日数の計算
-
ExcelのVLOOKUP関数の動作をMyS...
-
データ無し時は空白行にしたい...
-
必要なテーブルの個数について。
-
複数選択か?単数選択か? テ...
おすすめ情報