🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

5回答

8177閲覧

SQLの 記述順序 と 実行順序 の覚え方

cupnoodle

総合スコア20

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

0グッド

1クリップ

投稿2019/12/09 09:29

編集2019/12/09 09:30

SQLでは実行順序と記述順序が異なりますが、なぜ異なるのでしょうか。
(英語的な感覚では異なっていないのでしょうか??)

実行順序と記述順序(語順)がそれぞれ異なる理由はなぜでしょうか。併せて、それぞれの順序をどのように理解すれば覚えやすいかを教えて頂ければと存じます。

(例)


SELECT COUNT(name) AS cnt, nation
FROM Member
WHERE date > "1980-07-01"
GROUP BY nation
HAVING cnt >= 2;

×
FROM Member
WHERE date > "1980-07-01"
GROUP BY nation
HAVING cnt >= 2
SELECT COUNT(name) AS cnt, nation;

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

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

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

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

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

guest

回答5

0

ベストアンサー

手続き型のプログラミング言語(CとかPythonとかいろいろ)では、「どう実行するか」を記述しますが、SQLはそうじゃなくて「何が欲しいか」を記述する言語です。
手続き型に対して、宣言型と呼ばれます。
実行する順序は処理系の都合で決まるのでしょう。

質問の2つ目の記述ですが、

OPEN TABLE Member SELECT ROW date > "1980-07-01" GROUPING BY nation SELECT GROUP cnt >= 2 DISPLAY COUNT(name) AS cnt, nation;

みたいな意味なんですかね。手続き型言語風に書けばそんな感じだと思います。
SQLがすべてのRDBMSですべての実行計画でこの順序の通りに実行されるのかどうかはわかりませんが。

selectの機能が最後に実行されるはずなのに、最初に書くのは不審だ。」ということであれば、その通りです。記述順序と実行順序はそもそも無関係だからです(合わせる気が無い)。英語の語順の影響を受けていることは確かでしょうね。欲しいものを最初に書く(結論から書く)とうのは分かりやすい順序だと思います。

私の覚え方としては、不安になる都度、リファレンスを見るということでしょうかね。つまり、覚えてない。リファレンスを見ないでSQLをすらすら書かないといけない状況になったことないし、今後もないので。

投稿2019/12/09 16:21

otn

総合スコア85882

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

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

cupnoodle

2019/12/09 23:37

ありがとうございます。 今まで手続き型しか知らずその前提で見ていましたが、「宣言型」という区分があるのですね。 確かに「何が欲しいか」を英語風に記述するもの、ということであればイメージがわいてきました。 その要望を処理系毎に解釈する、ということですね。 ※そういった中でSQLの場合はその解釈に標準仕様が存在する、ということですね。
guest

0

実行順という概念がよく分かりません。
「日本語で動作を記述した時の順」や「C言語で動作を記述した時の順」はあると思いますが書き方によってある程度変わりえます。
内部でどのような処理がなされているかは外からは分からないし、常に一定の順序とも限らないと思います。
その上で、SQLはかなり自然な英語の文章として読めると感じます。(多少の無理はあるものの)

どのように理解すれば覚えやすいか

英語として読みやすい順ですかねえ…。

投稿2019/12/10 00:42

ikadzuchi

総合スコア3047

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

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

cupnoodle

2019/12/11 12:09

回答ありがとうございます。 英語感覚、で身に着けるしかないですね!
guest

0

記述順序(語順)

現在は、SQLについては構文が定められています。
標準SQL規格

実行順序と記述順序(語順)がそれぞれ異なる理由はなぜでしょうか。

構文は、記述寄り、実行順序は、コスト寄り、です。
何故と問われるなら、先に構文があったからだと思いますけど。

それぞれの順序をどのように理解すれば覚えやすいかを教えて頂ければと存じます。

実行順序はDBMS毎のオプチマイザー次第ですから、実行計画を眺めて慣れていくのが外れが無いと思いますけど、この辺(【SQL】実行の順序)を丸暗記されたらいいんじゃないでしょうか。

投稿2019/12/09 15:16

sazi

総合スコア25327

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

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

cupnoodle

2019/12/09 23:00

最終的には丸暗記ですね。 定着できるとよいですが、、、。
sazi

2019/12/10 00:36 編集

SQLに関する習熟度の違いで回答も変わってくるとは思います。 実行順序を考えるのはコストを意識してのことだと思いますが、cupnodeleさんのように考えたことは無くて、インデックスはfrom以降をマージして考えて、最終的にselect項目をインデックスのみで賄えるかどうかを考えるような感じですね。 その過程でインラインビューにするかサブクエリーにするか考えたりします。
cupnoodle

2019/12/11 12:13

回答ありがとうございます。 なお、コストやそういった高度なことを意識しているわけではなく、単純に素朴な疑問としての質問でした。。。
guest

0

Orlofskyさんの回答通りですが、補足しますとPostgresqlの場合、公式のリファレンスに
全てのSQL構文の記述順が記載されていますので、こちらを参照すると良いでしょう。
PostgreSQL 11.5リファレンス

SELECT文であればこちらになります。
SELECT文のリファレンス

投稿2019/12/09 09:58

kaina

総合スコア418

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

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

cupnoodle

2019/12/09 10:40

理由はなく決まり事である、と言うことでしょうか。 kainaさんはどのように身につけられたかを教えていただければ幸いです。
kaina

2019/12/09 11:20

私自身は実行順自体あまり意識して書いた覚えがありません、まあ規格もANSIとISOによって 標準化されたわけなんで英語の文法に似ているのは当たり前なんではないでしょうか。 SQLは体系的に覚えたわけでは無く仕事で必要に迫られて、仕事をやりつつ、 必要なSQLを主に朝井氏のSQLポケットリファレンスを引きながら覚えたかなあ。 後は他の人が書いたSQLを参考にしつつ仕事の中で覚えていきましたね。
cupnoodle

2019/12/09 22:57

必要性や接触頻度は大事ということですね。。。 ありがとうございました。
guest

0

どの部分が先に実行されるのかはともかく、SQLの文法で記述する順番が決まっているからです。

投稿2019/12/09 09:43

Orlofsky

総合スコア16417

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

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

cupnoodle

2019/12/09 10:37

つまり質問に対する答えは「異なる事への理由はない、ただの決まり事」ということでしょうか。 「覚え方」についても自然と使いながら覚えるべし、という感じでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問