比較演算子でNULLを使用する mysql> 1>NULLを選択します。 +--------+ | 1>NULL | +--------+ | NULL | +--------+ セット内の 1 行 (0.00 秒) mysql> 1<NULL; を選択します。 +--------+ | 1<NULL | +--------+ | NULL | +--------+ セット内の 1 行 (0.00 秒) mysql> 1<>NULL を選択します。 +---------+ | 1<>NULL | +---------+ | NULL | +---------+ セット内の 1 行 (0.00 秒) mysql> 1>NULLを選択します。 +--------+ | 1>NULL | +--------+ | NULL | +--------+ セット内の 1 行 (0.00 秒) mysql> 1<NULL; を選択します。 +--------+ | 1<NULL | +--------+ | NULL | +--------+ セット内の 1 行 (0.00 秒) mysql> 1>=NULL を選択します。 +---------+ | 1>=NULL | +---------+ | NULL | +---------+ セット内の 1 行 (0.00 秒) mysql> 1<=NULL を選択します。 +---------+ | 1<=NULL | +---------+ | NULL | +---------+ セット内の 1 行 (0.00 秒) mysql> 1!=NULL を選択します。 +---------+ | 1!=NULL | +---------+ | NULL | +---------+ セット内の 1 行 (0.00 秒) mysql> 1<>NULL を選択します。 +---------+ | 1<>NULL | +---------+ | NULL | +---------+ セット内の 1 行 (0.00 秒) mysql> NULL=NULL、NULL!=NULL を選択します。 +-----------+-------------+ | NULL=NULL | NULL!=NULL | +-----------+-------------+ | NULL | NULL | +-----------+-------------+ セット内の 1 行 (0.00 秒) mysql> 1 in (null)、1 not in (null)、null in (null)、null not in (null); +-------------+-----------------+----------------+--------------------+ | 1 が (null) に含まれる | 1 が (null) に含まれない | null が (null) に含まれる | null が (null) に含まれない | +-------------+-----------------+----------------+--------------------+ | NULL | NULL | NULL | NULL | +-------------+-----------------+----------------+--------------------+ セット内の 1 行 (0.00 秒) mysql> 1 = anyを選択します(nullを選択)、null = any(nullを選択)。 +--------------------+-----------------------+ | 1=任意(null を選択) | null=任意(null を選択) | +--------------------+-----------------------+ | NULL | NULL | +--------------------+-----------------------+ セット内の 1 行 (0.00 秒) mysql> 1 =すべてを選択(nullを選択)、null =すべて(nullを選択); +--------------------+-----------------------+ | 1=すべて(null を選択) | null=すべて(null を選択) | +--------------------+-----------------------+ | NULL | NULL | +--------------------+-----------------------+ セット内の 1 行 (0.00 秒) 結論: 演算子 (>、<、>=、<=、!=、<>) または (in、not in、any/some、all) を使用して任意の値を NULL と比較すると、戻り値は NULL になります。NULL をブール値として使用すると、1 でも 0 でもありません。 データを準備する mysql> テーブル test1(a int,b int) を作成します。 クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> test1 に値 (1,1)、(1,null)、(null,null) を挿入します。 クエリは正常、3 行が影響を受けました (0.00 秒) 記録: 3 重複: 0 警告: 0 mysql> test1 から * を選択します。 +------+------+ | ア | ロ | +------+------+ | 1 | 1 | | 1 | NULL | | NULL | NULL | +------+------+ セット内の 3 行 (0.00 秒) 上記の 3 つのデータ、特に NULL レコードを詳しく見てみましょう。 IN、NOT IN、NULLの比較 INとNULLの比較 mysql> test1 から * を選択します。 +------+------+ | ア | ロ | +------+------+ | 1 | 1 | | 1 | NULL | | NULL | NULL | +------+------+ セット内の 3 行 (0.00 秒) mysql> test1 から * を選択します。 where a in (null); 空のセット (0.00 秒) mysql> test1 から * を選択します。 where a in (null,1); +------+------+ | ア | ロ | +------+------+ | 1 | 1 | | 1 | NULL | +------+------+ セット内の 2 行 (0.00 秒) 結論: IN を NULL と比較すると、NULL を含むレコードは照会できません。 NOT IN と NULL の比較 mysql> test1 から * を選択します。 where a は (1) に含まれません。 空のセット (0.00 秒) mysql> test1 から * を選択します。 where a は (null) ではありません。 空のセット (0.00 秒) mysql> test1 から * を選択します。 where a は (null,2) に含まれません。 空のセット (0.00 秒) mysql> select * from test1 where a not in (2); +------+------+ | ア | ロ | +------+------+ | 1 | 1 | | 1 | NULL | +------+------+ セット内の 2 行 (0.00 秒) 結論: NOT IN の後に NULL 値がある場合、状況に関係なく SQL 全体のクエリ結果は空になります。 EXISTS、NOT EXISTS、NULL の比較 mysql> test2 から * を選択します。 +------+------+ | ア | ロ | +------+------+ | 1 | 1 | | 1 | NULL | | NULL | NULL | +------+------+ セット内の 3 行 (0.00 秒) mysql> select * from test1 t1 where exists (select * from test2 t2 where t1.a = t2.a); +------+------+ | ア | ロ | +------+------+ | 1 | 1 | | 1 | NULL | +------+------+ セット内の 2 行 (0.00 秒) mysql> test1 t1 から * を選択します (t1.a = t2.a の場合、 test2 t2 から * を選択します); +------+------+ | ア | ロ | +------+------+ | NULL | NULL | +------+------+ セット内の 1 行 (0.00 秒) 上記では、テーブル test1 をコピーし、テーブル test2 を作成しました。 クエリ ステートメントで exists と not exists を使用して、test1.a=test2.a を比較します。= では NULL を比較できないため、結果は期待どおりになります。 NULLを判断するには、IS NULLとIS NOT NULLのみを使用できます。 mysql> select 1 は null ではありません。 +---------------+ | 1 は null ではありません | +---------------+ | 1 | +---------------+ セット内の 1 行 (0.00 秒) mysql> select 1 は null です。 +-----------+ | 1 は null です | +-----------+ | 0 | +-----------+ セット内の 1 行 (0.00 秒) mysql> null を選択すると null になります。 +--------------+ | null は null です | +--------------+ | 1 | +--------------+ セット内の 1 行 (0.00 秒) mysql> null を選択すると null ではありません。 +------------------+ | null は null ではありません | +------------------+ | 0 | +------------------+ セット内の 1 行 (0.00 秒) 上記の効果を見ると、返される結果は 1 または 0 です。 結論: IS NULL と IS NOT NULL は、値が空かどうかを判断するためにのみ使用できます。 集計関数におけるNULLの落とし穴 例 mysql> test1 から count(a),count(b),count(*) を選択します。 +----------+----------+----------+ | カウント(a) | カウント(b) | カウント(*) | +----------+----------+----------+ | 2 | 1 | 3 | +----------+----------+----------+ セット内の 1 行 (0.00 秒)
視聴を続ける mysql> test1 から * を選択します。ここで a は null です。 +------+------+ | ア | ロ | +------+------+ | NULL | NULL | +------+------+ セット内の 1 行 (0.00 秒) mysql> test1 から count(a) を選択します (a は null です)。 +----------+ | カウント(a) | +----------+ | 0 | +----------+ セット内の 1 行 (0.00 秒) 上記の最初の SQL では、結果を照会するために null が使用され、2 番目の SQL の count(a) は 0 行を返します。 結論: count(field) は NULL であるフィールドの値をカウントできませんが、count(*) は値が null である行をカウントできます。 NULLは主キー値として使用できません mysql> テーブル test3(a int 主キー、b int) を作成します。 クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> test3 に値 (null,1) を挿入します。 エラー 1048 (23000): 列 'a' は null にできません 上記でテーブル test3 を作成しました。フィールド a は指定されておらず、空にすることはできません。NULL データが挿入されています。エラーの理由は、フィールド a の値を NULL にできないことです。テーブル作成ステートメントを見てみましょう。 mysql> show テーブル test3 を作成します。 +-------+-------------+ | テーブル | テーブルの作成 | +-------+-------------+ | test3 | テーブル `test3` を作成します ( `a` int(11) NULLではない、 `b` int(11) デフォルト NULL, 主キー (`a`) ) エンジン=InnoDB デフォルト文字セット=utf8 +-------+-------------+ セット内の 1 行 (0.00 秒) 上記のスクリプトからわかるように、フィールドが主キーの場合、フィールドは自動的に null 以外に設定されます。 結論: フィールドが主キーである場合、自動的に null 以外に設定されます。 上記をすべて読んだ後でも、まだ少し混乱しています。NULL の状況は確かに扱いが難しく、エラーが発生しやすくなります。最も効果的な方法は、NULL の使用を避けることです。したがって、フィールドを作成するときは、フィールドで NULL を許可せず、デフォルト値を設定することを強くお勧めします。 要約する
MySQL NULL によって引き起こされる落とし穴に関するこの記事はこれで終わりです。MySQL NULL によって引き起こされる落とし穴に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
目次1. キャラクター文法パラメータ索引戻り値2. 連結文法パラメータ文字列2 [, …文字列N]戻...
目次Vue の keep-alive 組み込みコンポーネントの使用でもこのアルゴリズムが使用されます...
Win10はmysql5.7の解凍版をインストールします。参考までに、具体的な内容は次のとおりです...
すべてのデータベースの合計サイズを照会する方法は次のとおりです。 mysql> informa...
Tomcat自体の最適化Tomcat メモリ最適化起動時に大きなメモリ ブロックが必要であることを ...
目次序文インタフェースタイプ付録: インターフェースとタイプの違い要約する序文インターフェースとタイ...
注: 私はCentosを使ってdockerをインストールしていますステップ1: Dockerをインス...
目次序文プロジェクト設計後部フロントエンドプロジェクトを実行する質疑応答序文これまでの API 開発...
インデックスはソートされたデータ構造です。 where 条件での検索や order by 条件での並...
1. 動作環境vmware14proウブントゥ 16.04LTS 2. 問題の説明vmware14P...
誰でも時々データをコピーして貼り付ける必要があると思います。コピーして貼り付けるためにファイルを開く...
この記事では、例を使用して MySQL の共有ロックと排他ロックの使用方法を説明します。ご参考までに...
通常、全員のスピーチを最初から最後まで読む必要があります。ただし、Stack Overflow には...
Vueはブール値でストレージを保存します今日、問題に遭遇しました。バックグラウンドから返された真偽の...
目次iview-admin2.0 組み込み権限管理権限に基づいてコンポーネントの表示を制御するカスタ...