• ベストアンサー

SQL 句の評価順

SQL句の評価順について皆さんの意見をいただけないでしょうか? <ケース1:SELECTが最後> ・FROM ・WHERE ・GROUP ・HAVING ・ORDER ・SELECT <ケース2:SELECTがトップ> ・SELECT ・FROM ・WHERE ・GROUP ・HAVING ・ORDER <ケース3:ORDERの前にSELECT> ・FROM ・WHERE ・GROUP ・HAVING ・SELECT ・ORDER どのケースで評価されますでしょうか? ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

PostgreSQLでは ・FROM ・WHERE ・GROUP ・HAVING ・SELECT ・ORDER みたいです。

ShiftTail
質問者

お礼

情報ありがとうございます。 やっぱりそれが一番みたいですね。 ありがとうございました。

関連するQ&A

  • SQL WHERE, HAVING について

    こんにちは。さっそくですが、 白男川 恵さん著作による 「Oracle Master Bronze 演習問題 SQL基礎I」 の問95について質問させていただきます。 問題文 CAT_ID列の値が20であるPRICE列の最大値を求めたい。 実行すべきSQL文として正しいものを選びなさい。 とあり、正解は (B) SELECT cat_id, MAX(price) FROM itemlist HAVING cat_id = 20 GROUP BY cat_id (C) SELECT cat_id, MAX(price) FROM itemlist WHERE cat_id = 20 GROUP BY cat_id なのですが、 WHERE句の使用法としては 大体の場合 WHERE (ターゲット) = (値) となると思うのですが、ターゲットのところが グループ関数でないのでこの場合は正解としてもよい、 ということでしょうか? 以下のサイトを別のタブで見ていただきたいのですが、 http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_1.html 「WHERE句とGROUP BY句を併用した場合、 WHERE → GROUP BYの順でクエリが評価されるため、 グループ化された結果をWHERE句の段階で利用できないのです。」 「HAVING句とGROUP BY句を利用した場合、 GROUP BY → HAVINGの順でクエリが評価され、 グループ化された結果に対し条件を指定することが可能です。」 http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_2.html 「HAVING句はGROUP BY句によってグループ化が行われたデータに対し、 絞り込みの条件を指定できます。 このため、絞り込み条件に集計関数を含めることが可能です。」 この設問の場合には WHERE→GROUP BYの順でも GROUP BY→HAVING の場合でもWHERE のターゲットがグループ関数で得られた値 で条件指定するわけではないので文法的にも正しく おなじ結果が得られる こういう解釈でよろしいのでしょうか? ご存知の方、教えていただけないでしょうか? よろしくお願いします。

  • SQL count 別名を条件に使用

    いつもお世話になっております。 標題についてご教授頂きたく質問させて頂きました。 [SQL} select A, B, count(*) as cnt from product where A=1 and cnt > 2 group by A order by cnt desc とこのようにSQLを記述して実行したのですが、 cnt>2でエラーが出ます。 order by には count の別名を使用できるのですが、 where句やHAVINGでは使えません。 この場合 cont(*)>2 またはcount(項目名)>2 としなければならないのでしょうか

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • なぜ、WHERE句とHAVING句があるのか?

    なぜ、WHERE句とHAVING句があるのか? SQLを学んでいる時に、疑問に思ったことがあります。 それは、「なぜ、WHERE句とHAVING句があるのか?」ということです。 この2つは、 ・WHERE句 → 表から取り出す行の条件を指定 ・GROUP BY句 → グループ化した結果から取り出す行の条件を指定 という違いがあることは分かっています。 ですが、おなじ「行のかたまりに対する抽出条件」を指定しているのに、 なぜ、わざわざ2つに分ける必要があったのでしょうか? 分けないと不都合が生じるのでしょうか。 もし、明瞭簡潔に説明できる方がいらっしゃいましたら、教えていただけないでしょうか。

  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)

  • ORDER BY句を使用しているSQL文に関して質問です。

    ORDER BY句を使用しているSQL文に関して質問です。 SELECT文にてORDER BY句を使用した場合、SELECT結果の件数によってソート順が変わるような事はあるのでしょうか? 事象としては以下の通りです。 以下のCUSTOMERテーブルがあるとします。 |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000001|000000000000| |0001|11111111|00000002|000000000000| |0001|11111111|00000003|000000000000| |0001|11111111|00000004|000000000000| |0001|11111111|00000005|000000000000| |0001|11111111|00000005|000000000001| |0001|22222222|00000001|000000000000| |0001|22222222|00000002|000000000000| |0001|22222222|00000003|000000000000| |0001|22222222|00000004|000000000000| |0001|22222222|00000005|000000000000| |0001|22222222|00000006|000000000000| |0001|22222222|00000007|000000000000| |0001|22222222|00000008|000000000000| |0001|22222222|00000009|000000000000| |0001|22222222|00000010|000000000000| |0001|22222222|00000011|000000000000| |0001|22222222|00000012|000000000000| |0001|22222222|00000013|000000000000| |0001|22222222|00000014|000000000000| |0001|22222222|00000014|000000000001| 埋め込みSQLを実行し、上記のテーブルに対し以下の条件でカーソルをオープンしました。 (1)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 11111111 ORDER BY ITIREN DESC (2)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 22222222 ORDER BY ITIREN DESC カーソルの1件目をFETCHしたところ、以下のような結果となりました。 (1) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000005|000000000001| (2) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|22222222|00000014|000000000000| 一連番号枝番をORDER BY句のソート条件に追加するか、WHERE句の条件についかすれば事象は解決するのですが、同様のSQLを実行しているのに結果が変わってしまうのがどうしても解せません。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 テーブルの内容をごちゃごちゃと書いてしまったので、見づらくてすみません。。。 レイアウトがずれてたら更にすみませんm(_ _)m HTMLのタグって使えるんでしょうかね?

  • 五十音順

    テーブルのフィールドに、読み仮名が入っています。 あ行、か行など、五十音順に抽出する場合のSQL文ですが、 $sql = 'select * from テーブル名 where kana between "あ" and "お" order by kana'; 上記の文を $sql = 'select * from テーブル名 where kana between "$key[$i]" order by kana'; という具合に配列などに入れたいと考えておりますが。 そのようなことは可能なのでしょうか? それとも、もっと効率よく五十音順の検索ができるようにする方法が ありますでしょうか?

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。