teratailへようこそ

93.14%

1時間32分

登録する

解決済 SQLでNULL同士の比較がfalseになるのは、何故ですか?

  • SQL

    698questions

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

  • プログラミング言語

    313questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • データベース

    209questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

2016/07/17 22:53 投稿

BJCRobot ユーザーランキング月間3位

  • 1

    回答

  • 3

    評価

  • 343

    view

技術的興味からの質問です、よろしくお願いします。

ずっと以前に、NULL同士の比較は常にfalseになるというようなことを学習した記憶があり、
なんとなく覚えていたのですが、プログラミング言語ではそうでは無いようで、
どうもSQLに関する記憶のようです。

とりあえず、分かる範囲のプログラミング言語で、試してみました。

puts nil === nil ? true : false
alert(null === null ? true : false);
echo null === null ? true : false;
print("true" if None == None else "false")
C#
using System;

namespace HelloCS
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine (null == null ? true : false);
        }
    }
}
public class HelloNull {

    public static void main(String[] args) {
        System.out.println(null == null ? true : false);
    }

}

これらは、すべてtrueを返すので、通常のプログラミング言語では、
null同士の比較はtrueを返すのが普通だと考えて良さそうです。
(もし違うものがあれば、ご指摘ください)

RDBに関しては、いろいろな環境ですぐには、試せないので検索してみたのですが、
Oracle,SQLServer,MySQL,PostgreSQLは、 null = null の演算は、falseを返すようです。

ただし、PostgreSQLは、transform_null_equals という設定で変更できるようで、Microsoft Accessとの互換性の為のような記述もありましたが、ちょっと読み解けませんでした。

一応、SQL-92 という仕様書?も目を通してみたのですが、私は英語が読めず、nullで検索すると462箇所も該当するので、心が折れました。
なので、仕様として決まっているのかどうかは、わからない状態です。

そのようなことも踏まえて、ここで、やっと質問なのですが、

仕様でもし、null同士の比較がfalseだと決まっているとしても
なぜ、SQL(RDB)は、プログラミング言語とは、違い null = null がfalseを返すのでしょうか?

データを比較する際にnull同士が同じとされては都合が悪いというようなことだとは思うのですが、
漠然とした理解のままとなってしまうので、はっきりとした理由があれば知りたいと思いました。

はっきりとした回答が得られれば一番良いですが、あーでもないこーでもないというレベルの回答でも構いません。

ちなみに ご興味がある方は、ここまでで上げた以外の、プログラミング言語や、
RDBでの結果をチェックして教えて頂けますと幸いです。

では、よろしくお願い致します。

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

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

クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう。

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

質問の評価を上げたことを取り消します

3

この機能は開放されていません

評価を下げる条件を満たしてません

評価を下げる理由を選択してください

上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

質問の評価を下げる機能の利用条件

この機能を利用するためには、以下の事項を行う必要があります。

質問の評価を下げたことを取り消します

回答(全1件)

ベストアンサー

回答の評価を上げる

以下のような回答は評価を上げましょう。

  • 正しい回答
  • わかりやすい回答
  • ためになる回答

評価が高い回答ほどページの上位に表示されます。

10

この機能は開放されていません

評価を下げる条件を満たしてません

データベースの大元の設計思想が3値論理に基づくからだった思います。

この辺は「データベース 3値論理」で調べると、
詳しい解説を参照できます。
参考に以下に一つリンクを掲載します。
リンク内容

3値論理はちょっと直感的ではないのですが、
NULLの中の値が何なのか分からないという風に解釈すると、
当然NULL同士の比較は分からないもの同士の比較なので、
結果としても分からないという感じになります。

回答の補足ですが、
「NULL = NULL」はFALSEと評価されません。
「NULL = NULL」はUNKNOWNと評価されます。

NULLは何と比較してもUNKNOWNを返すので。
そのためにSQLでは「IS NULL」や「IS NOT NULL」という構文を持っています。

2016/07/17 23:27 投稿

2016/07/18 02:04 編集

KotoriMaturi score 51

コメント(4)

2016/07/17 23:49

すばやいご回答有り難うございます。

「3値論理」ですか、割と物知りのつもりでいましたが、初めて聞きました。

検索してざっと見てましたが色々なところで解説されていますね。
なんで今まで気づかなかったのか不思議なくらいです。
こんなにはっきりとすぐに回答が出るとは思わなかったのでちょっと驚きました。

KotoriMaturiさんとteratailに感謝です ^^

2016/07/17 23:58

いえいえ、自分も通った道ですので^^;

ちなみにプログラム言語が、
「null = null」でtrueを返すのは、
こちらのnullの意味がポインタ(メモリのアドレス番地)が何も指していない状態を表すものなのだからだったと思います。
(もしかしたら例外もあるかもしれませんが…)

まぁ同じnullでも由来が異なるということですね。

2016/07/18 00:02

なるほど、名前が同じでどっちも演算に使うので、混同してしまいがちですね。
(というか、今の今までしてました)

改めてありがとうございます、勉強不足を痛感致しました (T_T)

2016/07/18 02:00

NULLでWikiを参照した所、
回答ミスがあったので訂正します。

SQLでのNULLが混入した四則計算などの演算は結果がNULLですが、
NULLが混入した比較はUNKNOWNを返すとのことです。
回答本文も該当箇所を合わせて修正しておきます。
僕もまだまだ勉強不足ですね…。

関連した質問

同じタグがついた質問を見る

  • SQL

    698questions

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

  • プログラミング言語

    313questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • データベース

    209questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

関連した質問

teratail × エキスパート
teratailの体験談を見てみよう

メールアドレスで登録

利用規約、及び 個人情報の取り扱いに関する要項をご確認のうえ同意いただける場合は「同意して登録」ボタンをクリックしてください。

SNSアカウントで登録

  • Facebook
  • Twitter
  • Google
  • Github
  • Hatena

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る