はじめに
SQL で一致しないというのを表すとき、どのような文を書くでしょうか?
私は <> を主に使って書くのですが、!= を使う人を見かけ、違いが気になったので少し調べてみました。
各 RDBMS の不等価演算子について
まずは身近な RDBMS のドキュメントを見てみます。
MySQL
<> と != が使えるようです。
ドキュメント上では <> が主に使われているようです。
PostgreSQL
こちらも <> と != が使えるようです。
また、興味深い注意書きもあります。
<> is the standard SQL notation for “not equal”. != is an alias, which is converted to <> at a very early stage of parsing. Hence, it is not possible to implement != and <> operators that do different things.
もうこれが、今回知りたかったことの答えなのですが、<> は標準の SQL の記法で、!= はエイリアスとのことです。
また、PostgreSQL ではパース時に != を <> に置き換える処理をしているようです。
SQLite
The not-equal operator can be either
!=or<>.
こちらも <> と != が使えるようです。
Oracle SQL
<> と != に加えて、^= も使えるようです。
ドキュメント上では != が主に使われているようです。(珍しいかも?)
前のバージョン (12.2) のドキュメントを見ると、logical_negation_symbol= と書いてあります。
つまり、¬= も不等価演算子として使えたみたいです。
あまりにも使われなかったので消したんでしょうか?変更理由は見つけられなかったです…
SQL Server
こちらも <> と != が使えるようです。
!= の方の説明では、
Not equal to (not ISO standard)
という記述がある通り、ISO 標準では存在しない演算子みたいです。
IBM Db2
<> と != に加えて、¬= も使えるようです。
先ほど見た通り、Oracle SQL でも使うことができた演算子です。
商用の RDBMS だと、ニッチな需要に応えてこういった演算子を追加することがあるんでしょうね…
ISO 標準における SQL の不等価演算子について
PostgreSQL や SQL Server のドキュメントでも言及されていた SQL の標準となるものを見てみます。
最新のを見ようと思ったのですが、ISO の Web Store などでしか買えるものしか見つからず、かなり高額なため断念…
1999年のものは、大学のサイトなどで見つけることができたので、そちらを参照することにします。
読み進めてみると、「5.2 <token> and <separator>」のところに以下のような記述があります。
<not equals operator> ::= <>
ということで、SQL 標準では <> のみが不等価演算子として定義されているようです。
まとめ
SQL 標準では <> のみが不等価演算子として定義されており、!= のようなそれ以外の演算子は RDBMS の独自拡張となっているようです。
各 RDBMS で使える不等価演算子についてもまとめておきます。
| RDBMS | 不等価演算子 |
|---|---|
| MySQL |
<>, !=
|
| PostgreSQL |
<>, !=
|
| SQLite |
<>, !=
|
| Oracle SQL |
<>, !=, ^=, (¬=) |
| SQL Server |
<>, !=
|
| IBM Db2 |
<>, !=, ¬=
|
上記のように、!= に関しては基本的に対応されているようなので、<> を使うか、!= を使うかについては、コーディング規約等で定めてしまえば十分そうです。