質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • SQL

    2475questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

viewで0〜99のデータを作成するSQLの処理の流れを知りたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 304

qopllqopllqop

score 24

知りたいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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 が各行として変えるクエリになるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/13 16:10

    とてもわかりやすいご回答をいただきましてありがとうございます!
    joinが「すべての組み合わせになる」ということがわかっていませんでした。

    また、d1やd2は別名ということで「任意」であることがわかりました。
    「別名といえばAS」と思っていましたが、同じテーブルを扱う場合にはFROM句でこのように定義しておけば、SELECT内でピリオドで区切って、指定できるということですね。ありがとうございます!

    キャンセル

0

t_digit d1 join t_digit d2
これを行うことで、d1とd2の全組み合わせのレコードが抽出されますね。

d1,d2
0,0
0,1
0,20,9
1,0
1,19,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)) => 200,9 => (0+(9*10)) => 90
1,0 => (1+(0*10)) => 1
1,1 => (1+(1*10)) => 119,9 => (9+(9*10)) => 99

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/13 16:02

    回答いただきましてありがとうございます!
    あぁそうか〜FROMの抽出が先ですよね。この時joinしているのですが、

    d1,d2
    0,0
    null,1
    null,2
    null,3

    1,0
    null,1
    null,2
    null,3

    にならないのですね。leftjoinならなるのでしょうか?

    あと、d1やd2という仮のフィールド名のようなものの命名は任意なのでしょうか?



    そしてd1とd2を計算してデータができるということですね。

    キャンセル

  • 2016/05/13 16:18

    JOIN で "LEFT" とか "RIGHT" を省略すると INNER JOIN になります。
    そして結合条件を省略すると、左右のテーブルの直積が返ります。

    >d1やd2という仮のフィールド名のようなものの命名は任意なのでしょうか?

    任意です。
    SELECT DIGIT AS D ~
    とかと同じですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2475questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。