viewで0〜99のデータを作成するSQLの処理の流れを知りたい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 748
知りたいこと
VIEWを使い、0〜99のデータを作るSQLがあるのですが、どのような処理(流れ)で2桁の整数が生成されているのかが、よくわかりません。
以下のSQLをご参照の上、処理の流れについてご教授お願いいたします。
該当のソースコード
t_digit
digit |
-------+
0
1
2
3
4
5
6
7
8
9
create view t_test AS
SELECT (d1.digit+(d2.digit*10)) AS Number
FROM (t_digit d1 join t_digit d2);
SELECT * FROM t_test;
自分の解釈
1行目 t_test という名前のVIEWをつくる
2行目 digitというフィールドとdijitを10倍したフィールドを足してNumberというフィールド名で呼ぶ
3行目 t_digit と t_digitのテーブルを結合する
4行目 t_testを全部表示する
疑問
1.d1.digitとd2.digitとあるが、d1やd2はなぜこのように書くのか?命名ルールがわからない。任意なのでしょうか?
2.3行目でテーブルを結合していますが、0〜9のテーブルと0〜90のテーブルを外部結合するので(0+0〜9)、(10+0〜9)、(20+0〜9)・・・という処理がされて0〜99のデータが生成されるのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
create view t_test AS
SELECT (d1.digit+(d2.digit*10)) AS Number
FROM (t_digit d1 join t_digit d2);
で view [t_test] を定義し、
SELECT * FROM t_test;
で定義した[t_test]からデータを呼び出していますね。
1.d1.digitとd2.digitとあるが、d1やd2はなぜこのように書くのか?命名ルールがわからない。任意なのでしょうか?
d1 や d2 はテーブルに対する別名(エイリアス)です。
t_digit d1
で t_digit を d1 という別名として扱う
という意味になります。
2.3行目でテーブルを結合していますが、0〜9のテーブルと0〜90のテーブルを外部結合するので(0+0〜9)、(10+0〜9)、(20+0〜9)・・・という処理がされて0〜99のデータが生成されるのでしょうか?
FROM句で FROM TABLE1 JOIN TABLE2
とした際(LEFT JOIN 等でなく)、対象となるデータは、TABLE1 の各行と TABLE2 の各行の全ての組み合わせになります。
同一のテーブルをJOINする場合、どちらがどちらなのか判断つかなくなるので、別名をつけます。
それが d1、d2 です。
対象としているデータはどちらも同じく t_digit です。
という事で、FROM (t_digit d1 join t_digit d2)
は、d1 の digit列(つまり d1.digit)とd2のdigit列(d2.digit)の2列からなるデータとなります。
つまり、SELECT (d1.digit+(d2.digit*10))
は、d1 を 一の位、d2 を十の位として、足したものを取得しています。
一の位が0~9、十の位が0〜9 の各組み合わせとなるので、 0〜99 が各行として変えるクエリになるでしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
t_digit d1 join t_digit d2
これを行うことで、d1とd2の全組み合わせのレコードが抽出されますね。
d1,d2
0,0
0,1
0,2
~
0,9
1,0
1,1
~
9,9
そしてd1.digit+(d2.digit*10)
でそれぞれの値から数値を作り出しています。
d1,d2
0,0 => (0+(0*10)) => 0
0,1 => (0+(1*10)) => 10
0,2 => (0+(2*10)) => 20
~
0,9 => (0+(9*10)) => 90
1,0 => (1+(0*10)) => 1
1,1 => (1+(1*10)) => 11
~
9,9 => (9+(9*10)) => 99
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/13 16:10
joinが「すべての組み合わせになる」ということがわかっていませんでした。
また、d1やd2は別名ということで「任意」であることがわかりました。
「別名といえばAS」と思っていましたが、同じテーブルを扱う場合にはFROM句でこのように定義しておけば、SELECT内でピリオドで区切って、指定できるということですね。ありがとうございます!