SQLの文と句と式をよくわかっていなかった
SQLでWHERE句とかCASE式とかSELECT文とかあるけど、明確に違いを説明できないことに気が付いた。
プログラミング言語でも似たような話があって、初心者の頃は式(Expression)と文(Statement)の違いがわかっていなかった。
SQLの構成要素
構成要素としては主にこの4つ。
- 文(Statements)
- 句(Clauses)
- 式(Expressions)
- 述語(Predicates)
文
SQLの実行単位。最後にセミコロン;
を付ける。
SELECT
, UPDATE
, DELETE
, ALTER
, CREATE
などから始まってセミコロンまでが文。WHERE
やCASE
は文の構成要素だが文ではない。
句
文の構成要素。
FROM
, WHERE
, SET
などから始まるやつ。
SELECT
やUPDATE
もそれ単独では句。これがちょっと難しい。
SELECT * --SELECT句
FROM hoge --FROM句
; --全部合わせてSELECT文
式
文の構成要素。
実行時に評価されて1つの値に定まる。平たく言うと値を返す。書ける場所が多い。
定数, 条件式, CASE式など。
述語
条件式のようなもの(理解が怪しい)。戻り値が必ず true
, false
, unknown
になる。
BETWEEN
, =
, <>
, EXISTS
など。
(2021-12-21追記)
述語の戻り値は3値だが、すべての述語が3値を返すわけではない。例えばEXISTS
はtrue
かfalse
しか返さない。
SELECT * --SELECT句
FROM hoge --FROM句
WHERE id = 1 --WHERE句 と =述語
; --全部合わせてSELECT文
ということは、今までずっと『IN句』と覚えていたけど、正確には『IN述語』か。
他に気になること
SELECT
でのサブクエリは文なのか?- 関数はどこに該当するのか?
気になるものの、今日はもう眠いので寝る
参考文献
できれば一次情報にあたりたかったが、ISO規格なので断念。(どうやら国会図書館なら見られるらしい)
ここまで書いて、理解を疎かにするのも駄目だけど、こういう細かいことを気にしすぎるのもよくないな、と思った。用語の理解よりも、実務で目的のクエリが書けることの方が大事である。