MySQLを使い出して間もないのですが(というよりDBの勉強を始めて間もない・・・)、SQL文を発行する際、問い合わせ条件で[where]が使われます。

表結合の条件指定で[on]が見かけられます。また、[on]を用いた構文に[where]を使っている例題は、調べた範囲では見つけることができません。
[on]と[where]との違いは何でしょうか?
なぜ、使い分ける必要があるのでしょうか?
この辺がこんがらがって、うまく理解を進めることができません。

また、結合構文の詳しく書かれた本を紹介していただきませんか?専門的で単調な記述法でなく、一般人にもわかりやすく例文が豊富で、ひとつの構文に対し多方向からの説明がなされている書籍ですとありがたいのですが・・・。
入門書は数冊読みましたが、前回の質問でな~んも理解していないことがわかりました。
http://q.hatena.ne.jp/1174972211
SQL文法をきちんと理解したいです。よろしくお願いします。

回答の条件
  • 1人3回まで
  • 登録:2007/03/30 07:49:54
  • 終了:2007/03/31 03:28:22

ベストアンサー

id:nandedarou No.4

nandedarou回答回数230ベストアンサー獲得回数342007/03/31 02:14:34

ポイント100pt

回答が大変長くなってしまいました。ご迷惑をお掛けしますが、よかったら、読んでください。


seadwellさんが既によく考えた例の方がわかりやすいと思いますので、前々回のご質問 http://q.hatena.ne.jp/1174771937 を具体例として、その質問のコメントに書いたSQLを使って解説致します。※[カテゴリソート]フィールドと[サブカテゴリソート]フィールドを加え、それに伴ってSQLを多少変更しました。※なお、LEFT JOIN~USINGを重ねる順番など、kurukuru-nekoさんから教え頂きました。


●カテゴリTB

[カテゴリID],[カテゴリ名],[カテゴリソート]

1, アウトドアスポーツ,C

2, 園芸 ,A

3, 建設機器 ,B

●サブカテゴリTB

[サブカテゴリID],[サブカテゴリ名],[サブカテゴリソート]

1, スクール , b

2, 販売 , a

3, レンタル , c

●カテtoサブカテTB

[カテゴリID],[サブカテゴリID]

1, 1

1, 2

2, 1

2, 3

3, 2

3, 3

●メンバーtoカテtoサブカテTB

[メンバーID],[カテゴリID],[サブカテゴリID]

1, 1, 2

1, 2, 3

2, 2, 1

2, 3, 2

●SQL文

SELECT A.カテゴリID, カテゴリ名, A.サブカテゴリID, サブカテゴリ名, IF(メンバーID IS NULL,0,1) AS 登録
FROM カテtoサブカテTB AS A
LEFT JOIN カテゴリTB      USING(カテゴリID)
LEFT JOIN サブカテゴリTB  USING(サブカテゴリID)
LEFT JOIN メンバーtoカテtoサブカテTB AS B
ON A.カテゴリID = B.カテゴリID AND A.サブカテゴリID = B.サブカテゴリID AND メンバーID = '1'
ORDER BY カテゴリソート, サブカテゴリソート ;

●以下の(1)~(6)のように、SQLが実行され、結果テーブルが変化していくとイメージするとわかり易いと思います。


(1)FROM カテtoサブカテTB AS A

[カテゴリID],[サブカテゴリID]
1, 1
1, 2
2, 1
2, 3
3, 2
3, 3

(2)LEFT JOIN カテゴリTB USING(カテゴリID)

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート]
1, 1, アウトドアスポーツ, 3
1, 2, アウトドアスポーツ, 3
2, 1, 園芸              , 1
2, 3, 園芸              , 1
3, 2, 建設機器          , 2
3, 3, 建設機器          , 2

(3)LEFT JOIN サブカテゴリTB USING(サブカテゴリID)

[カテゴリID],[サブカテゴリID][カテゴリ名],[ソート],[サブカテゴリ名],[サブカテゴリソート]
1, 1, アウトドアスポーツ, C, スクール, b
1, 2, アウトドアスポーツ, C, 販売    , a
2, 1, 園芸              , A, スクール, b
2, 3, 園芸              , A, レンタル, c
3, 2, 建設機器          , B, 販売    , a
3, 3, 建設機器          , B, レンタル, c

(4)LEFT JOIN メンバーtoカテtoサブカテTB AS B

ON A.カテゴリID = B.カテゴリID AND A.サブカテゴリID = B.サブカテゴリID AND メンバーID = '1'

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート],[サブカテゴリ名],[サブカテゴリソート],[メンバーID]
1, 1, アウトドアスポーツ, C, スクール, b, NULL
1, 2, アウトドアスポーツ, C, 販売    , a, 1
2, 1, 園芸              , A, スクール, b, NULL
2, 3, 園芸              , A, レンタル, c, 1
3, 2, 建設機器          , B, 販売    , a, NULL
3, 3, 建設機器          , B, レンタル, c, NULL

(5)ORDER BY カテゴリソート, サブカテゴリソート

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート],[サブカテゴリ名],[サブカテゴリソート],[メンバーID]
2, 1, 園芸              , A, スクール, b, NULL
2, 3, 園芸              , A, レンタル, c, 1
3, 2, 建設機器          , B, 販売    , a, NULL
3, 3, 建設機器          , B, レンタル, c, NULL
1, 2, アウトドアスポーツ, C, 販売    , a, 1
1, 1, アウトドアスポーツ, C, スクール, b, NULL

(6)SELECT A.カテゴリID, カテゴリ名, A.サブカテゴリID, サブカテゴリ名, IF(メンバーID IS NULL,0,1) AS 登録

[カテゴリID],[カテゴリ名],[サブカテゴリID],[サブカテゴリ名],[登録]
2, 園芸              , 1, スクール, 0
2, 園芸              , 3, レンタル, 1
3, 建設機器          , 2, 販売    , 0
3, 建設機器          , 3, レンタル, 0
1, アウトドアスポーツ, 2, 販売    , 1
1, アウトドアスポーツ, 1, スクール, 0

●ONとWHEREで違いが出る例とLEFT JOINとINNER JOINの違いを説明します。

(4)のON~の一部を変更して、次のようにWHEREを使った場合の例を示します。上記(4)と比較すると違いが分かります。

LEFT JOIN メンバーtoカテtoサブカテTB AS B

ON A.カテゴリID = B.カテゴリID AND A.サブカテゴリID = B.サブカテゴリID

WHERE メンバーID = '1'

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート],[サブカテゴリ名],[サブカテゴリソート],[メンバーID]
1, 2, アウトドアスポーツ, C, 販売    , a, 1
2, 3, 園芸              , A, レンタル, c, 1

WHEREでは結果テーブルがその制限を受けます。上記のように、その条件に当てはまらないレコードは残しません。

ONあくまでも結合する際の基準です。ON~で指定された結合条件に当てはまらないものを残すかどうかは、LEFT JOINかINNER JOINかなどで決まります。


INNER JOINならば、結合条件に当てはまらないレコードは、結果テーブルに残しません。

LEFT JOINならば、左側に書いたテーブルのデータは、結合条件に当てはまらないレコードも残します。右側に書いたテーブルのデータは、該当するものがないので、代わりにNULLという値が入ります。

http://dev.mysql.com/doc/refman/4.1/ja/left-join-optimisation.ht...

マニュアルから引用です。(ちょっと変更しました。)

LEFT JOIN の条件は、右側のテーブルからのレコードの取り出し方法の判定に使用される。このとき、WHEREの条件は使用されない。

WHEREの条件にマッチするレコードがあり、右側のテーブルにON条件にマッチするレコードがない場合、左側のカラムの値が NULL に設定されたレコードが生成される。


●その他

SQL文を記述する際、テーブルが複数ある場合、同じフィールド名がある場合があります。どのテーブルのフィールドかを判定するために「テーブル名.フィールド名」という書き方にします。なお、FROM以降でテーブル名を指定する部分に「テーブル名 AS ~」と書くと、「~」をそのテーブル名の代わりに用いることができるようになります。


下記の2つは、同じ意味です。

USING( [フィールド名] )

ON [JOINの左側のテーブル名].[フィールド名] = [JOINの右側のテーブル名].[フィールド名]

id:seadwell

すごいです!バッチリです!

今、ハッキリと、確実に、確り、理解できました。

SQL文の組み立ての敷居が低くなった気がするので驚きです。

SQL書籍を何冊読むより、理解が早かったです。


テーブル設計も何が必要なのか逆算できそうです。訓練は必要でしょうが・・・

多分、リファレンスも少しは読みこなせそうな気がします。


多分これを理解している方はゴマンといるのでしょうが、人に教えるとなると別の話で、ここまでできるのはnandedarouさまならではと思います。

質問も回答もそうですが、人に文章で伝えるって非常に難しいのですよね。

質問の内容から何が知りたいのか?洞察し、労力をそこで半分以上使ってしまいます。

私の場合は話でもなかなか伝わりません^^;

相変わらずの名回答で、ただただ感服するばかりです。

2007/03/31 03:23:21

その他の回答(4件)

id:kato-s No.1

kato-s回答回数91ベストアンサー獲得回数32007/03/30 09:11:05

ポイント30pt

[on]というのは、join~onのことと解釈します。


基本的にどちらの方法でも結合するということ自体に違いは

ありませんが、以下のURLを参考にしてください。

http://otn.oracle.co.jp/forum/thread.jspa?messageID=35004746


where句で書く場合は基本的にDBMSにより書き方が変わる場合がある

例)oracle:A.Code = B.Code(+)

sqlserver:A.COde += B.Code

など


Join~onを使う場合は標準としてどのDBMSでも同じ書き方で動作保証

されると認識しています。


DBMSに依存しないシステムにしたい場合は、Join~onを使用する

ほうが無難だと思われます。



SQL講座

http://www.pursue.ne.jp/SQLDoc/SQL.htm

id:seadwell

なるほどです。

コメントにもいろいろご指導いただいていますが、私の根本的な勘違いで質問が理解しづらい文章になっていました^^;

> Join~onを使う場合は標準としてどのDBMSでも同じ書き方で動作保証されると認識しています。

このような回答は非常に勉強になります。

すなわち、処理的にもDBを変える場合などにもできるだけ抽出はFROM内で行ったほうがいいということですね^^

2007/03/30 14:41:31
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/30 15:23:28

ポイント15pt

ジョインの記述方法には、いくつか方法があります。

古くからあるのは、以下の書き方です。

select ~ from t1,t2 where t1.c1=t2.c1

その後、標準SQLなどで外部結合などと共に規定されたのが、以下の書き方です。

select ~ from t1 inner join t2 
 on t1.c1=t2.c1

これ以外にも、RDBMSによって独自の構文があります。

後者の書き方では、標準SQLでは、「onでは結合条件を、whereでは制限条件を書く」ことになっています。

結合条件は、表と表を結合するための条件であり、制限条件はそれ以外の条件を指します。

つまり、以下のような書き方になります。

select ~ from t1 inner join t2
 on t1.c1=t2.c1 
 where t1.c1 between 100 and 200

なお、RDBMSの実装方法によっては、onで制限条件を書いても、エラーにせずに動く場合もあります。

標準SQLで答える必要のある情報処理技術者試験などでは、onとwhereを使い分ける必要があります。

id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/30 18:56:00

ポイント14pt

質問内容を誤解していたかも知れません。

ジョインに関しては、SQL92で規定されるまで、外部結合等に関しては標準仕様が存在しませんでした。

select ~ from t1,t2 where t1.c1=t2.c1

という記述が古くから存在しますが、これはSQL92で規定されたinner joinと等価です。

しかし、外部結合等に関しては、条件式に(+)を付けるなど、各RDBMSで、独自仕様により実装されてきました。

SQL92でようやく、以下のような外部結合等の構文が規定されました。

select ~ from t1 left join t2
 on t1.c1=t2.c1
 [where 制限条件]

多くのRDBMSは、標準SQLへの準拠を進めています。RDBMSにより、実装状況に差はありますが、標準SQLに準じたSQLなら、殆ど修正なしに複数のRDBMSで使用することが可能です。

なお、標準SQLでは、「onでは結合条件を、whereでは制限条件」を指定することになっています。RDBMSの実装では、「onで制限条件」を指定できるものもあるので、標準SQLで回答する必要がある情報処理技術者試験などでは注意が必要です。

id:nandedarou No.4

nandedarou回答回数230ベストアンサー獲得回数342007/03/31 02:14:34ここでベストアンサー

ポイント100pt

回答が大変長くなってしまいました。ご迷惑をお掛けしますが、よかったら、読んでください。


seadwellさんが既によく考えた例の方がわかりやすいと思いますので、前々回のご質問 http://q.hatena.ne.jp/1174771937 を具体例として、その質問のコメントに書いたSQLを使って解説致します。※[カテゴリソート]フィールドと[サブカテゴリソート]フィールドを加え、それに伴ってSQLを多少変更しました。※なお、LEFT JOIN~USINGを重ねる順番など、kurukuru-nekoさんから教え頂きました。


●カテゴリTB

[カテゴリID],[カテゴリ名],[カテゴリソート]

1, アウトドアスポーツ,C

2, 園芸 ,A

3, 建設機器 ,B

●サブカテゴリTB

[サブカテゴリID],[サブカテゴリ名],[サブカテゴリソート]

1, スクール , b

2, 販売 , a

3, レンタル , c

●カテtoサブカテTB

[カテゴリID],[サブカテゴリID]

1, 1

1, 2

2, 1

2, 3

3, 2

3, 3

●メンバーtoカテtoサブカテTB

[メンバーID],[カテゴリID],[サブカテゴリID]

1, 1, 2

1, 2, 3

2, 2, 1

2, 3, 2

●SQL文

SELECT A.カテゴリID, カテゴリ名, A.サブカテゴリID, サブカテゴリ名, IF(メンバーID IS NULL,0,1) AS 登録
FROM カテtoサブカテTB AS A
LEFT JOIN カテゴリTB      USING(カテゴリID)
LEFT JOIN サブカテゴリTB  USING(サブカテゴリID)
LEFT JOIN メンバーtoカテtoサブカテTB AS B
ON A.カテゴリID = B.カテゴリID AND A.サブカテゴリID = B.サブカテゴリID AND メンバーID = '1'
ORDER BY カテゴリソート, サブカテゴリソート ;

●以下の(1)~(6)のように、SQLが実行され、結果テーブルが変化していくとイメージするとわかり易いと思います。


(1)FROM カテtoサブカテTB AS A

[カテゴリID],[サブカテゴリID]
1, 1
1, 2
2, 1
2, 3
3, 2
3, 3

(2)LEFT JOIN カテゴリTB USING(カテゴリID)

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート]
1, 1, アウトドアスポーツ, 3
1, 2, アウトドアスポーツ, 3
2, 1, 園芸              , 1
2, 3, 園芸              , 1
3, 2, 建設機器          , 2
3, 3, 建設機器          , 2

(3)LEFT JOIN サブカテゴリTB USING(サブカテゴリID)

[カテゴリID],[サブカテゴリID][カテゴリ名],[ソート],[サブカテゴリ名],[サブカテゴリソート]
1, 1, アウトドアスポーツ, C, スクール, b
1, 2, アウトドアスポーツ, C, 販売    , a
2, 1, 園芸              , A, スクール, b
2, 3, 園芸              , A, レンタル, c
3, 2, 建設機器          , B, 販売    , a
3, 3, 建設機器          , B, レンタル, c

(4)LEFT JOIN メンバーtoカテtoサブカテTB AS B

ON A.カテゴリID = B.カテゴリID AND A.サブカテゴリID = B.サブカテゴリID AND メンバーID = '1'

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート],[サブカテゴリ名],[サブカテゴリソート],[メンバーID]
1, 1, アウトドアスポーツ, C, スクール, b, NULL
1, 2, アウトドアスポーツ, C, 販売    , a, 1
2, 1, 園芸              , A, スクール, b, NULL
2, 3, 園芸              , A, レンタル, c, 1
3, 2, 建設機器          , B, 販売    , a, NULL
3, 3, 建設機器          , B, レンタル, c, NULL

(5)ORDER BY カテゴリソート, サブカテゴリソート

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート],[サブカテゴリ名],[サブカテゴリソート],[メンバーID]
2, 1, 園芸              , A, スクール, b, NULL
2, 3, 園芸              , A, レンタル, c, 1
3, 2, 建設機器          , B, 販売    , a, NULL
3, 3, 建設機器          , B, レンタル, c, NULL
1, 2, アウトドアスポーツ, C, 販売    , a, 1
1, 1, アウトドアスポーツ, C, スクール, b, NULL

(6)SELECT A.カテゴリID, カテゴリ名, A.サブカテゴリID, サブカテゴリ名, IF(メンバーID IS NULL,0,1) AS 登録

[カテゴリID],[カテゴリ名],[サブカテゴリID],[サブカテゴリ名],[登録]
2, 園芸              , 1, スクール, 0
2, 園芸              , 3, レンタル, 1
3, 建設機器          , 2, 販売    , 0
3, 建設機器          , 3, レンタル, 0
1, アウトドアスポーツ, 2, 販売    , 1
1, アウトドアスポーツ, 1, スクール, 0

●ONとWHEREで違いが出る例とLEFT JOINとINNER JOINの違いを説明します。

(4)のON~の一部を変更して、次のようにWHEREを使った場合の例を示します。上記(4)と比較すると違いが分かります。

LEFT JOIN メンバーtoカテtoサブカテTB AS B

ON A.カテゴリID = B.カテゴリID AND A.サブカテゴリID = B.サブカテゴリID

WHERE メンバーID = '1'

[カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート],[サブカテゴリ名],[サブカテゴリソート],[メンバーID]
1, 2, アウトドアスポーツ, C, 販売    , a, 1
2, 3, 園芸              , A, レンタル, c, 1

WHEREでは結果テーブルがその制限を受けます。上記のように、その条件に当てはまらないレコードは残しません。

ONあくまでも結合する際の基準です。ON~で指定された結合条件に当てはまらないものを残すかどうかは、LEFT JOINかINNER JOINかなどで決まります。


INNER JOINならば、結合条件に当てはまらないレコードは、結果テーブルに残しません。

LEFT JOINならば、左側に書いたテーブルのデータは、結合条件に当てはまらないレコードも残します。右側に書いたテーブルのデータは、該当するものがないので、代わりにNULLという値が入ります。

http://dev.mysql.com/doc/refman/4.1/ja/left-join-optimisation.ht...

マニュアルから引用です。(ちょっと変更しました。)

LEFT JOIN の条件は、右側のテーブルからのレコードの取り出し方法の判定に使用される。このとき、WHEREの条件は使用されない。

WHEREの条件にマッチするレコードがあり、右側のテーブルにON条件にマッチするレコードがない場合、左側のカラムの値が NULL に設定されたレコードが生成される。


●その他

SQL文を記述する際、テーブルが複数ある場合、同じフィールド名がある場合があります。どのテーブルのフィールドかを判定するために「テーブル名.フィールド名」という書き方にします。なお、FROM以降でテーブル名を指定する部分に「テーブル名 AS ~」と書くと、「~」をそのテーブル名の代わりに用いることができるようになります。


下記の2つは、同じ意味です。

USING( [フィールド名] )

ON [JOINの左側のテーブル名].[フィールド名] = [JOINの右側のテーブル名].[フィールド名]

id:seadwell

すごいです!バッチリです!

今、ハッキリと、確実に、確り、理解できました。

SQL文の組み立ての敷居が低くなった気がするので驚きです。

SQL書籍を何冊読むより、理解が早かったです。


テーブル設計も何が必要なのか逆算できそうです。訓練は必要でしょうが・・・

多分、リファレンスも少しは読みこなせそうな気がします。


多分これを理解している方はゴマンといるのでしょうが、人に教えるとなると別の話で、ここまでできるのはnandedarouさまならではと思います。

質問も回答もそうですが、人に文章で伝えるって非常に難しいのですよね。

質問の内容から何が知りたいのか?洞察し、労力をそこで半分以上使ってしまいます。

私の場合は話でもなかなか伝わりません^^;

相変わらずの名回答で、ただただ感服するばかりです。

2007/03/31 03:23:21
id:chuken_kenkou No.5

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/31 03:01:24

ポイント10pt

「RDBMSによっては、onで制限条件を書けるので、~」と回答中に書いてしまいましたが、nandedarouさんのコメントを見て勘違いと気付きました。

「onで書くものは結合条件」となるのでしたね。回答のその部分は訂正します。

id:seadwell

違う角度からの回答をありがとうございます。

コメントまででもいろいろ教えていただき勉強になります。

2007/03/31 03:26:39
  • id:tokyosmash
    私もMySQL勉強中です。お互い頑張りましょう。質問履歴見てもらえばわかりますけど、1ヶ月前までSQL全く知らなかった人間なので正しいかどうかわかりませんが、自分の勉強も兼ねて書かせてもらいます。

    基本的なSQL文は以下のような感じだと思います。
    SELECT ~~ FROM ~~ WHERE ~~

    表を結合させる場合に方法が2つあります。FROM内で指定させる方法とWHERE内で指定する方法です。

    質問文で[ON]が出てきていますが、それはFROM内で表結合を指定する時に使うものです。seadwellさんはONとWHEREを比較されていますが、正しくはFROMとWHEREの比較ですね。ONはあくまでFROMに従属したものですから。


    そして私の持っている本によると、表結合はWEHERで指定するよりFROMで指定する方が推奨されています。標準規格でそのように推奨されていますし、FROMの方が多彩な結合が可能になるからです。だから私はWHERE結合は全く使いません。WHEREは検索したい条件だけを書くようにしています。


    FROMで表を結合する際の公式は以下のとおりです

    FROM Table_A JOIN Table_B ON ~~(細かい結合条件)


    もっと正確に言えばJOINの前にINNERやらLEFTやらがつきます。これでもっと細かく結合条件を指定できるのですが、とりあえず省略します。

    例えば以下のようなテーブルがあるとします。

    テーブル名
    table_a
    フィールド名
    id
    text


    テーブル名
    table_b
    フィールド名
    id
    date


    上記二つのテーブルをidで結合させる場合は

    SELECT * FROM table_a JOIN table_b ON table_a.id = table_b.id

    だと思います。(間違っていたらすみません・・)

    FROMの後の
    table_a JOIN table_b
    で、二つのテーブルをくっつけたい!と主張します。

    そしてONの後の
    table_a.id = table_b.id
    で細かい結合条件を指定します。

    この場合は同じidで結合させるので、
    SELECT * FROM table_a JOIN table_b USING(id)
    とUSINGを使っても書けます。


    間違っていたら本当にすみません。

    さて勉強方についてですけど、私は本を読むよりも実際に色々と作りながら体得する方法を取っています。最初から教科書的なものを読んでも頭に入りづらいと感じるのは私だけでしょうか?

    私は自分の作りたいサイトを構想して、それを少しづつ作っています。その過程でMySQLが必要になったので、最初は人力検索のみなさんに書いてもらったのをそのまま使っていました。驚くほど具体的に書いてもらえるんですよね。

    10日くらい前までは「JOINってなんだろう」状態でしたが、質問する度に何度も出てきますので自然と身に付きました。ある程度わかるようになった時に本を読むと理解が速いです。

    とにかくはてなは凄いと思います。プロのプログラマーさんにマンツーマンで教えてもらえるわけですから。あんまり進歩しない質問ばかりしていると愛想つかされるかもしれないので、最近はなるべく自分で考えるようにしていますが、ここはどんどん活用される事をお薦めします。ポイントは湯水のごとく無くなっちゃいますが;
  • id:kurukuru-neko

    from と whereの違い簡単に言うと
    英語の意味そのままですが

    whereは、fromで指定されているデータに
    対して処理を行います。

    fromは、検索対象となるデータを指定をします。

    例えば
    テーブルa/b/cの指定があった場合、

    fromでは、a/b/cの相互関係を指定して
    データを抽出します。
    where では、fromの抽出されたデータから
    データを抽出します。

    fromで抽出するデータの条件をうまく指定
    すると処理するデータを少なく出来、
    結果的に同じ処理でも早く処理が出来る
    事もあります。

    第4回 テーブルの操作 ~
    http://www.db.is.kyushu-u.ac.jp/rinkou/sql/index.html
  • id:nandedarou
    先程から、急に回答できない質問が増えました。ついに、私も回答拒否リストに大量に入れられてしまったようです。

    seadwellさんの質問にも答えられません。seadwellさんの「他ユーザーの設定による回答拒否」の設定人数を超えてしまったものと思われます。

    kurukuru-nekoさんが回答欄に記入しないのも、もしかして同じ理由ですか?
  • id:seadwell
    tokyosmash さま

    非常にわかりやすいでした^^
    根本的な大間違いをしていました。これでジグソーピースがうまくハマりそうです^^
    tokyosmashさまの質問履歴を先ほどから読んでいるのですが、いろいろ質問なさって私も非常に参考になります。
    私がお世話になっています、kurukuru-nekoさまやnandedarouさまも登場していました^^
    ほんとにありがたい限りです。
    書籍の件ですが、まったくおっしゃるとおりだと思います。
    入門書を数冊読みましたが書かれていることは理解しても応用しにくいです。また、リファレンスも買ったのですが、これまた言い回しが難しくて・・・
    一生懸命考えて判らなかったら、ここで質問するようにして、それと平行に今まで買った本を何度も読み返して見ます^^


    kurukuru-neko さま

    いつもありがとうございます。
    いろいろ教えてもらって、ネットで探す手がかりが増えるので大助かりです。なんとなくですがコツがわかってきたような気がします。
    kurukuru-nekoさまの回答はポイントを突かれていて、私には難易度が高い場合もありますが、よくじっくり少しずつ噛み砕いていくと非常に勉強になります。
    ところでkurukuru-nekoさまも回答拒否でしたか?


    nandedarou さま^^

    あの答えるボタンがグレーになってるやつですか?
    そんな設定があるとは今知りました^^;
    メニューの設定を見たら、なんか?設定してあったので外しときました。グレーは直りましたか?
    デフォルトで設定してあったのですかね???
    でも、おかしいですね??親身なnandedarouさまの回答を拒否する人がいるってことですよね??
    私は、回答(アンケートはたまに・・・)なんかしたことないのにグレーばかりですが・・・
  • id:chuken_kenkou
    Oracle Master BronzeのSQL講座の記事です。
    ONとWHEREを使った例が記載されています。

    http://jibun.atmarkit.co.jp/lskill01/rensai/bronzesql06/bronzesql01.html
  • id:nandedarou
    >seadwellさん
    設定変更ありがとうございます。回答できるようになりました。以前から、グレーのボタンがあったので、誰かに拒否されてはいるのですが、「急に回答できない質問が増えた」と感じたのは、勘違いだったかも知れません。

    ある質問で、「ー人当たり2回まで回答出来ます 」という質問に昨日、一回答えたんです。今見たら「状態:回答受付中」なのに、回答できないのです。でも、よくみたら、「回答数:10 / 10件」になってました。だから、答えられなかったようです。(でも、この場合「状態:」が「締切」か「終了」になるんじゃなかったかなぁ?はてなのバグ?)

    >私は、回答(アンケートはたまに・・・)なんかしたことないのにグレーばかりですが・・・
    質問時に回答者の性別や年齢などを制限できるんですよね?(←まだ、質問未経験なのでよくわかりません)そのせいでしょうか?
  • id:chuken_kenkou
    情報処理技術者試験の受験者向けメールマガジンのアーカイブ(?)で、「select ~ from t1,t2 where t1.c1=t2.c1」という記述と、「select ~ from t1 join t2 on t1.c1=t2.c1」の使い分けといったやり取りがありました。

    http://www.mirai.ne.jp/~suehiro/homework/hwbackup/200602/hw20060202z.txt

    真ん中よりやや下の、引用されている部分です。
  • id:nandedarou
    すみません。私の回答の(2)のカテゴリソートフィールドの値が間違っていました。以下のように訂正します。

    (2)LEFT JOIN カテゴリTB USING(カテゴリID)

    [カテゴリID],[サブカテゴリID][カテゴリ名],[カテゴリソート]
    1, 1, アウトドアスポーツ, C
    1, 2, アウトドアスポーツ, C
    2, 1, 園芸 , A
    2, 3, 園芸 , A
    3, 2, 建設機器 , B
    3, 3, 建設機器 , B
  • id:seadwell
    あ、nandedarouさま、その部分は気付きましたが問題ではなかったです。
    全体の流れが完全に理解できたので、そちらのほうが重要でした^^

    あと、以前の質問のコメントでnandedarouさんが
    > なるほど!left join ~ usingをその順番で使えば・・・
    とありましたが、『何のことだろ~??』と思っていましたが今回ハッキリと解りました!ありがとうございます。
  • id:nandedarou
    もう一つ間違いがありました。

    マニュアルからの引用(四角く囲ってある部分)の中
    (誤)「左側のカラム」
    (正)「右側のカラム」

    ※マニュアル http://dev.mysql.com/doc/refman/4.1/ja/left-join-optimisation.html のオリジナルの記載では、「B」と表現されています。
  • id:nandedarou
    いるか、ありがとうございました!
    喜んでもらえてうれしいです!!

    納得のいく回答はよい質問から生まれます。特に回答後のコメントを通じてのやりとりが大切だと感じています。次の回答者がその情報を活かして、より求めるものに近い回答ができます。よい回答をもらえる方は、コメントの使い方がうまいですね。

    seadwellさんやtokyosmashさんは、コメントで多くの情報を与えてくれるので、大変回答し易いです。

    また、回答に対して喜んでくれるので、多くの回答者が助けてくれるのだと思います。これからも、頑張って下さい。
  • id:nandedarou
    すみません。さらにSQLの訂正があります。
    二つ目のLEFT JOINの行をを次のように訂正して下さい。
    (誤)
    LEFT JOIN サブカテゴリTB USING(サブカテゴリID)
    (正)
    LEFT JOIN サブカテゴリTB as D ON A.サブカテゴリID=D.サブカテゴリID

    原因
    USING(サブカテゴリID)としたとき、直前のJOINの左側のテーブルつまり、カテゴリTBにサブカテゴリIDがないので、エラーになるようです。上記のように訂正することで、正常に動作します。
  • id:kurukuru-neko

    >回答欄に記入しないのも、もしかして同じ理由ですか?

     拒否にはなっています。
     拒否でない場合でもコメント欄に書く場合もあります。
     

     http://hp.vector.co.jp/authors/VA042812/MySQLManager/help.html
  • id:nandedarou
    >>回答欄に記入しないのも、もしかして同じ理由ですか?

    > 拒否にはなっています。
    > 拒否でない場合でもコメント欄に書く場合もあります。

    やっぱりそうでしたか。
    明らかに回答に値する内容がコメントに書いてあることがあったので、そう思いました。
    他人の設定による回答拒否機能は、良質質問者をも排除してしまいますね。
    既にいわし等で議論されているように、自分で設定した良質質問者は拒否しないような機能を付加するなど、はてなは、なんらかの対策をとるべきだと思います。
  • id:seadwell
    kurukuru-nekoさん、グレーになっているとはつゆ知らず、失礼いたしました^^;
    最近、はてなを利用しているもので・・・

    また、なんか便利そうなものを教えてもらいました。
    じっくり見てみます、ありがとうございます。

    > 既にいわし等で議論されているように、自分で設定した良質質問者は拒否しないような機能・・・
    あれから、いろいろ回答拒否に関するいわしを見て、経緯はわかったんですが、良かれと思って機能を盛り込んでも結果片手落ちですね。仕様とは難しい・・・

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません