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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

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

Q&A

解決済

2回答

1157閲覧

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

qopllqopllqop

総合スコア36

SQL

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

0グッド

0クリップ

投稿2016/05/13 06:37

###知りたいこと
VIEWを使い、0〜99のデータを作るSQLがあるのですが、どのような処理(流れ)で2桁の整数が生成されているのかが、よくわかりません。

以下のSQLをご参照の上、処理の流れについてご教授お願いいたします。

###該当のソースコード
t_digit
digit |
-------+
0
1
2
3
4
5
6
7
8
9

SQL

1create view t_test AS 2SELECT (d1.digit+(d2.digit*10)) AS Number 3FROM (t_digit d1 join t_digit d2); 4SELECT * 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のデータが生成されるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SQL

1create view t_test AS 2SELECT (d1.digit+(d2.digit*10)) AS Number 3FROM (t_digit d1 join t_digit d2);

で view [t_test] を定義し、

SQL

1SELECT * FROM t_test;

で定義した[t_test]からデータを呼び出していますね。

1.d1.digitとd2.digitとあるが、d1やd2はなぜこのように書くのか?命名ルールがわからない。任意なのでしょうか?

d1 や d2 はテーブルに対する別名(エイリアス)です。

t_digit d1t_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 06:55

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qopllqopllqop

2016/05/13 07:10

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

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

投稿2016/05/13 06:47

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qopllqopllqop

2016/05/13 07: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を計算してデータができるということですね。
ttyp03

2016/05/13 07:18

JOIN で "LEFT" とか "RIGHT" を省略すると INNER JOIN になります。 そして結合条件を省略すると、左右のテーブルの直積が返ります。 >d1やd2という仮のフィールド名のようなものの命名は任意なのでしょうか? 任意です。 SELECT DIGIT AS D ~ とかと同じですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問