SELECT文は、SQL文の中でも最も基本的な文の一つですが、逆に言えば、開発時に最も複雑になりやすい文でもあります。SELECT文の複雑さに比べれば、INSERT、UPDATE、DELETE等の文はそこまで複雑にはなりません。
かなり奥が深いですが、開発時に知っていると知っていないのでは、SQLの作成効率が全然変わってくるので、必ず覚えるようにしましょう。
SELECT文の評価順序
SELECT文は、下記の順番で評価されます。
- FROM句
- ON句
- JOIN句
- WHERE句
- GROUP BY句
- HAVING句
- SELECT句
- DISTINCT句
- ORDER BY句
- TOP句(LIMIT)
これを見れば分かるとおり、SQL文の見た目の通りの実行順序になっていませんね。非常にややこしいです。
なので、例えば「SELECT句でつけた別名」を、「GROUP BY句」で参照するということはできないというように、後に評価される句の別名は参照できません。
注意点
実際のDBエンジン内の処理手順はオプティマイザが効率よく組み直すためこの順番に評価されないこともあります。(例えば、WHEREで片方のテーブルが不要の場合はJOINの前にWHERE処理をおこなって先に件数を減らしてからJOINするというような挙動にもなったりするなど)
これは実行計画を見ればわかったりします。
SELECT文の各句を記述する際のポイント
FROM句
Oracleでは、FROM句では別名(AS句)を使うことができません。なお、Oracleでは必須です。
Oracle以外だったら例えば、「SELECT 1;」などと固定値の取得などをしたりすることも可能です。
ORDER BY句
ORDER BY句を記述する場合のポイントや、細かい仕様については下記の記事でまとめています。
上記記事でも解説していますが、RDBMSは基本的にソートが非常に苦手で非常にコストがかかる処理になります。なので、出来るだけソート自体をしないような設計にした方が良いことも含めて覚えておきましょう。
SELECT句
基本的に、「ウィンドウ関数」はこの句でしか使えません。
ウィンドウ関数に関しては、下記の記事で解説しています。
ON句
JOINのON句は単純にテーブル同士を結合するための条件を記述するだけの活用法がよく知られています。
ただ、上記記事で解説しておりますが書き方によっては意外とパフォーマンスがかなり変わってくる句になります。しっかり勉強しておきましょう。
この記事へのコメントはありません。