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

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

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

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

Q&A

解決済

3回答

1124閲覧

SQLのプログラム文が動作する順番について

ataru2222

総合スコア272

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

0グッド

0クリップ

投稿2020/05/15 21:44

編集2020/05/15 22:42

前提・実現したいこと

現在、SQLの勉強のために為替レートを計算して表示するプログラムを作っています。
これから何個か計算を入れたいなと思うのですが、プログラムが行われる順番が普通のプログラミング言語と違い、単に上から行われているだけでは無いように感じます。

そこについてもっと深く理解したいです。

疑問点

次のようなSQL文があったとき、
一番初めにFROMを見にいっているのがわかります。
理由はテーブル名をT1~T3と付けているのですが、INSERTやSELECTで参照できている。
次にSELECTを行った上で、INSERTをかけているんだろうなと推測しております。

ここからが詳しく知りたい疑問点なのですが
・SELECTの中で取得した値を、同じSELECTの中の計算に使用することはできるのでしょうか?

→できるとするならば、SELECTの中で上から実行されるので上の方に書いておかなければいけないのか?

SQLは基本的に今回の場合のようにINSERTで追加する順番通りにSELECTする値も書いている事が多いような気がしたので質問させていただきました。

詳しい方いらっしゃいましたら、ご教示ください。
よろしくお願いいたします。

該当のソースコード(サンプル)

SQL

1 2 strSQL = "INSERT INTO 本日の予想と結果(" & _ 3 "日付け,安値予想,高値予想,安値結果,高値結果,差,勢い) " & _ 4 "SELECT T1.日付け," & _ 5 "Cint(Nz(T2.安値,T3.安値)*10*0.99) / 10 AS 安値予想, " & _ 6 "Cint(Nz(T2.高値,T3.高値)*10*0.99) / 10 AS 高値予想, " & _ 7 "T1.安値 AS 安値結果, " & _ 8 "T1.高値 AS 高値結果, " & _ 9 "(T1.高値 - T1.安値) AS 差, " & _ 10 "SWITCH(" & _ 11 " 差 >= 3 , '高' " & _ 12 ",差 >= 2 , '中' " & _ 13 ",差 >= 1 , '並' " & _ 14 ",差 < 1 ,'低' " & _ 15 ") AS 勢い " & _ 16 "FROM (ドル円 AS T1 LEFT JOIN ドル円 AS T2 " & _ 17 "ON T1.日付け = (T2.日付け + 1)) " & _ 18 "LEFT JOIN ドル円 AS T3 " & _ 19 "ON T1.日付け = (T3.日付け + 3)" 20

補足・現在使っているDB

現在使用しているのはAccessDB(2013)ですが、
もしもSQL文の実行順序に違いがあるようでしたら、そこについても知りたいです。

SQLのみ表示

SQL

1INSERT INTO 本日の予想と結果(日付け,安値予想,高値予想,安値結果,高値結果,,勢い) 2SELECT T1.日付け,Cint(Nz(T2.安値,T3.安値)*10*0.99) / 10 AS 安値予想, 3 Cint(Nz(T2.高値,T3.高値)*10*0.99) / 10 AS 高値予想, T1.安値 AS 安値結果, 4 T1.高値 AS 高値結果, (T1.高値 - T1.安値) AS, 5SWITCH(>= 3 , '高' ,>= 2 , '中' ,>= 1 , '並' ,< 1 ,'低' ) AS 勢い 6FROM (ドル円 AS T1 LEFT JOIN ドル円 AS T2 ON T1.日付け = (T2.日付け + 1)) 7 LEFT JOIN ドル円 AS T3 ON T1.日付け = (T3.日付け + 3)

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/05/15 21:56

SQL「だけ」切り出してください。
m.ts10806

2020/05/15 21:57

あと想定しているDBの種類(MySQLなど)とバージョンを提示してください。 それによって使える機能使えない機能があります。
ataru2222

2020/05/15 22:05

m.ts10806様 コメント、ご指摘、ありがとうございます。 修正させていただきました。
m.ts10806

2020/05/15 22:10

タグに「Access」を追加しておいた方が「Access」に詳しい人が見る可能性が高くなりますので、追加しておいてください。
m.ts10806

2020/05/15 22:11

あと、これはSQL「だけ」になっていません。 プログラム要素は排除してSQLだけにしてください。
ataru2222

2020/05/15 22:19 編集

m.ts10806様 タグにaccessを追加させていただきました。 >プログラム要素は排除してSQLだけにしてください。 こちらについてはソースコードに問題があるのではなくて、順番の概念を知りたいだけなのでこちらでお願いしたいです。 (ソースを崩すと細かいミスでの、動く動かない等の別の視点が発生してしまうため) よろしくお願いいたします。
m.ts10806

2020/05/15 22:21

SQLだけのこと聞きたいのでしたら、非常に見づらく、全体が捉えづらく、的確なアドバイスにならないからです。 要は、見る側の負荷が高すぎる
m.ts10806

2020/05/15 22:22

汎用的な概念のみのアドバイスで良いなら別に構いませんが、コード見なくてもできるような内容になります。 このSQLについて聞きたいのではないですか?
ataru2222

2020/05/15 22:28

ここからが詳しく知りたい疑問点なのですが ・SELECTの中で取得した値を、同じSELECTの中の計算に使用することはできるのでしょうか? →できるとするならば、SELECTの中で上から実行されるので上の方に書いておかなければいけないのか? ポイントを絞って言うとすればこの答えが知りたいです。
m.ts10806

2020/05/15 22:31 編集

でしたら余計に提示するサンプルコードはSQLのみのほうがいいですね。何をやろうとしているのか見えづらいのは致命的です。 strSQL の内容をDebug.Printでコンソール出力したものを提示するのも難しいですか?
ataru2222

2020/05/15 22:43

補足に入れておきました。 突貫で作ったので見やすいものではありませんが・・・
ataru2222

2020/05/15 22:46

m.ts10806様 ありがとうございます。 ほかの方が回答してくださったことで、自分的に納得できました。 コメント、ご指摘いただきありがとうございました。
guest

回答3

0

目的は、同じ式を幾つも記述したくないという事ですよね。
SQLのみで行うには、基本はネストさせる事です。

それ以外の方法としては、ストアドファンクションを使用する事です。

Accessの場合、public functionはSQLに記述できますので、簡潔になります。

投稿2020/05/16 01:46

sazi

総合スコア25195

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

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

ataru2222

2020/05/16 02:53

sazi様 まだサブクエリを使う文(ネスト化)に苦手意識があるので、たくさん勉強してsaziさんのような人間になれるように頑張ります。 いつもありがとうございます。
guest

0

質問者の推測通り、SELECT文は、
FROM句(抽出元のデータセットを決める)→WHERE句(データ抽出条件を決める)→SELECT句(データそのものを決める)
の順に処理していきます。SELECTから書かれるのは人間が見たときにわかりやすい、という都合があるためです。

それはともかく、質問文の疑問である

・SELECTの中で取得した値を、同じSELECTの中の計算に使用することはできるのでしょうか?

についてですが、基本的にはできません。

SQL

1(T1.高値 - T1.安値) AS, 2SWITCH(>= 3, ...,>= 2, ...

という書き方は「差」というシノニムが現れる順番に関わらず不可能です。
SELECT句で記述した計算結果の値をさらに加工したい場合は、サブクエリを使ったり、ビューを複数作ったり、質問文のようなケースに限ればSWITCHの条件文に逐次計算式を入れていくことになるかと思います。

SQL

1-- サブクエリ版 簡略化 2SELECT 3 SWITCH(>= 3, ...,>= 2, ... ) AS 勢い 4FROM 5( 6 SELECT (T1.高値 - T1.安値) AS7 FROM T1 8)

SQL

1 2-- SWITCH版 簡略化 3SELECT 4 (T1.高値 - T1.安値) AS, 5 SWITCH( 6 (T1.高値 - T1.安値) >= 3, ..., 7 (T1.高値 - T1.安値) >= 2, ...

投稿2020/05/15 22:55

hope_mucci

総合スコア4447

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

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

ataru2222

2020/05/16 02:51

hope_mucci様 ありがとうございます。 概念の説明、selectの説明までお聞き出来て理解が深まりました。 お時間を使って回答して頂きありがとうございました。
guest

0

ベストアンサー

SQLの実行は「実行計画」という物で決定されます。
例えば、OracleだとEXPLAIN PLANというキーワードで説明されます。
概念的には、下記の様な感じでデータベースは作業します。
1.SQL文の受信
2.実行計画作成
3.計画に元ずいて各文書の処理開始
4.結果を送信
です。
実行計画作成時には、データ項目・キー情報・インデックス情報等を参照して、
勝手にデータベースが最適と思われる順番で処理文書の作成を行います。
ここで大切なのは、データベースが勝手に行うところです。
従って、必ず最適な順番で行っているとは限りません。
また、SQL文作成者の意図した様に動いているとも限りません。
具体的には、日付順のインデックスファイルを作成し、日付抽出のSQL文を書いのに
全く日付インデックスが使われないこともあり得ます。
これは調べなければ誰も分かりません。データベースのみぞ知るです。
しかしながら、何か遅いな~~と感じることがありませんか?(クレームで来る場合もあります。)
この時に、実行計画を見てインデックスが適当か、SQL文の書き方に問題があるのかと調べる訳です。
これが、データベースの調整作業となります。
つまり、ご依頼頂いたSQL文はデータベースの環境、及び、利用している製品によって動きが違います。
そのため、どの様に動くのかという回答は難しいのです。
ベテランのSQL文作成者であれば、大体の見当は付きますが絶対ではありません。

投稿2020/05/15 22:18

編集2020/05/15 22:31
tosi

総合スコア553

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

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

ataru2222

2020/05/15 22:33

tosi様 ありがとうございます。 一番初めにFROMをみるとかIF文的なものがあると想定していたのですが、メソッドが何個もあって、情報に基づく最適なメソッドを自動的に行っているということですね。 ちなみにSELECTの中で、SELECTで取得した値を計算に使うことってできるか?ご存知でしょうか?
tosi

2020/05/15 22:42

出来ると思いますが、SQL文作成として具体的な要件を付けて別途質問された方が宜しいかと思います。 SQL文は奥が深く相当な事が実現できます。また、製品によっても文書は違ってきます。
ataru2222

2020/05/15 22:44

ありがとうございます。 そうさせていただきます。
tosi

2020/05/16 02:42

申し訳けありません。こちらが本当の質問だったのですね。見落としていました。 >・SELECTの中で取得した値を、同じSELECTの中の計算に使用することはできるのでしょうか?
ataru2222

2020/05/16 02:56

tosi様 同時に概念も知りたかったので大丈夫ですよ(笑) 調べてもピンポイントで自分の悩みとマッチする記事が見つけられないのですが、質問する事で頭の整理もでき、とても勉強になりました。 お時間を使って回答して頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問