令和2年秋期午後問6
広告
勉強中さん
(No.1)
https://www.ap-siken.com/kakomon/02_aki/pm06.html
すみませんSQL初心者です。
この問題の図6のt1,t2という人たちは一体どこから出てきたのでしょう?
そもそも、カンマがついてないので構文がおかしいと思うのですが。
すみませんSQL初心者です。
この問題の図6のt1,t2という人たちは一体どこから出てきたのでしょう?
そもそも、カンマがついてないので構文がおかしいと思うのですが。
2024.01.14 23:23
勉強中さん
(No.2)
すみません、理解できました。
表に別名をつけており、ASを省略してるのですね。
ついでに質問なのですが、別名をつける前のSELECTのところですでにT1で指定しているのが気になっております。
この文のSQLの動きですが以下の解釈であっておりますか?
1, 表を読み込まないといけないため、SELECTなどよりも先にFROMを読み込む
2,FROMで読み込む表に別名をつける。(ローカルスコープのようなもの?)
3,先頭からSQLの解釈を再度行う。
表に別名をつけており、ASを省略してるのですね。
ついでに質問なのですが、別名をつける前のSELECTのところですでにT1で指定しているのが気になっております。
この文のSQLの動きですが以下の解釈であっておりますか?
1, 表を読み込まないといけないため、SELECTなどよりも先にFROMを読み込む
2,FROMで読み込む表に別名をつける。(ローカルスコープのようなもの?)
3,先頭からSQLの解釈を再度行う。
2024.01.14 23:50
GinSanaさん
★AP プラチナマイスター
(No.3)
この投稿は投稿者により削除されました。(2024.01.15 07:42)
2024.01.15 07:42
GinSanaさん
★AP プラチナマイスター
(No.4)
>この文のSQLの動きですが以下の解釈であっておりますか?
1はあってます。
2は、オプティマイザ(DBMSのコンパイラと思ってください)がなにもしないと同じ同名を別名としてつけますが、指定があるとその名前を別名としてつけます。ローカルスコープのくだりはそうですね。
じゃあ大域変数ってなんなんだよ、ってなるかもしれませんが、1つはバインド変数と、もうひとつはWITH句によるCTE(共通テーブル式)です。CTEは一時表名を宣言しなければ使えないわけで、それを大域とは呼べないだろ?と一瞬思うかもしれませんが、構造体をグローバル宣言していると思えば、ある意味これも大域です。
3でウェアー句の構文解釈が始まって、サブクエリの構文解釈をする(フロム→ウェアー→セレクトの順)。
最後に図6の1行目のセレクトの構文解釈が発生する。
2024.01.15 07:43
納豆のたれさん
(No.5)
あってる/あっていないってDBMSごとの実装依存じゃないのですか?
頭から字句解析して、FROM句がどこにあるのか探すのが先かもしれないですし
SELECT句のところで T1. を見つけて実名と仮定して、FROM句のところで T1 は別名だったのね という実装も可能ではないですか?
そもそも表を読み込むのも構文解析より後なのでは?
コンパイラだって、字句解析→構文解析→意味解析→コード生成→最適化→オブジェクト作成のフェーズごとに中間ファイルを作成する品質重視?の製品や、全部まとめて1パスしかもオンメモリで実行するコンパイルスピード重視の製品などいろいろですよね。
> 1, 表を読み込まないといけないため、SELECTなどよりも先にFROMを読み込む
頭から字句解析して、FROM句がどこにあるのか探すのが先かもしれないですし
SELECT句のところで T1. を見つけて実名と仮定して、FROM句のところで T1 は別名だったのね という実装も可能ではないですか?
そもそも表を読み込むのも構文解析より後なのでは?
コンパイラだって、字句解析→構文解析→意味解析→コード生成→最適化→オブジェクト作成のフェーズごとに中間ファイルを作成する品質重視?の製品や、全部まとめて1パスしかもオンメモリで実行するコンパイルスピード重視の製品などいろいろですよね。
2024.01.15 10:46
GinSanaさん
★AP プラチナマイスター
(No.6)
納豆のたれさん(No.5)
実際の実行順序はDBMS依存でしょうが、今回はSQLの論理的な処理順序の質問だと解釈しています。
実際の実行順序はDBMS依存でしょうが、今回はSQLの論理的な処理順序の質問だと解釈しています。
2024.01.15 10:54
GinSanaさん
★AP プラチナマイスター
(No.7)
stackoverflowのPhysical processing vs logical processing - Does the logical query processing change when indexes are involved?のT-SQL Querying (Developer Reference)の図表が論理順序(logical query processing)としては参考になります。
論理順序がSQL標準で示されているか?というと、crate/sql-99で確認しましたが、SQL標準では明白にこうしろと説明したものはありません。
あくまで、Microsoft SQL Server(SELECT (Transact-SQL) - SQL Server | Microsoft Learn)やPostgreSQL 9.6.5文書のSELECTの頁の「SELECTの一般的な処理」を論理順序としてマニュアルで示したのが知られていることになります。
論理順序がSQL標準で示されているか?というと、crate/sql-99で確認しましたが、SQL標準では明白にこうしろと説明したものはありません。
あくまで、Microsoft SQL Server(SELECT (Transact-SQL) - SQL Server | Microsoft Learn)やPostgreSQL 9.6.5文書のSELECTの頁の「SELECTの一般的な処理」を論理順序としてマニュアルで示したのが知られていることになります。
2024.01.15 11:39
納豆のたれさん
(No.8)
> 今回はSQLの論理的な処理順序の質問だと解釈して
わたしも物理的な実行順序の話をしているつもりはありません。
「T-SQL」や製品名を出し始めた時点でもう実装依存ですよ。
しかも、「SQL標準では明白にこうしろと説明したものはありません」では、なおさらです。
2024.01.15 12:53
GinSanaさん
★AP プラチナマイスター
(No.9)
名前を出した段階で実装依存なことは認めます。
しかしその実装依存で質問者に「論理順序にしてもSQL標準に定めがなく実装依存なので何とも・・・」とだけ返したところで、何も解決にはならないので、ある程度の一般的な流れを提示しています。
しかしその実装依存で質問者に「論理順序にしてもSQL標準に定めがなく実装依存なので何とも・・・」とだけ返したところで、何も解決にはならないので、ある程度の一般的な流れを提示しています。
2024.01.15 13:07
納豆のたれさん
(No.10)
スレ主さんに実装依存だと知ってもらうことにも十分意味があると思っています。
2024.01.15 13:20
勉強中さん
(No.11)
GinSanaさん
納豆のたれさん
お二方ともご回答ありがとうございます。
GinSanaさんのご説明でなんとなくですが流れは把握できました。
ただ、納豆のたれさんのご説明の通り、上記の流れについてもDBMSの処理系によって異なるということですかね。
処理の流れは違っても同じような問い合わせ結果が得られるように各社上手いこと処理をしていると理解しました。(もしそうでなかったら・・・ますますSQLって何なんでしょう?)
当方DBについては全くの畑違いで基本情報で勉強した程度の知識しかなく、結果あいまいな質問になってしまったようです。
納豆のたれさん
お二方ともご回答ありがとうございます。
> 2は、オプティマイザ(DBMSのコンパイラと思ってください)がなにもしないと同じ同名を別名としてつけますが、指定があるとその名前を別名としてつけます。
> 3でウェアー句の構文解釈が始まって、サブクエリの構文解釈をする(フロム→ウェアー→セレクトの順)。
GinSanaさんのご説明でなんとなくですが流れは把握できました。
> スレ主さんに実装依存だと知ってもらうことにも十分意味があると思っています。
ただ、納豆のたれさんのご説明の通り、上記の流れについてもDBMSの処理系によって異なるということですかね。
処理の流れは違っても同じような問い合わせ結果が得られるように各社上手いこと処理をしていると理解しました。(もしそうでなかったら・・・ますますSQLって何なんでしょう?)
当方DBについては全くの畑違いで基本情報で勉強した程度の知識しかなく、結果あいまいな質問になってしまったようです。
2024.01.15 21:43
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。