5.1 重要性の欠如

SQL 言語には、Java 言語と同様に、値がないこと (null ) を示す特別なキーワードがあります。あるいは、よく書かれているように - NULL

SQL での使用法は、NULLJava での null の使用法と非常に似ています。Java では、フィールドに null 値が含まれるオブジェクトが存在する場合があります。SQL では、行に NULL 値が含まれるテーブルが存在する場合があります。

意図的にノーブランドの製品を製品表にいくつか追加させてください。製品のブランドが不明な場合、値は になりますNULL

このような製品を表示するには、製品テーブルをIDで逆順にソートし、10 件のレコードを取得しましょう。リクエストは次のようになります。

SELECT * FROM product
ORDER BY id DESC
LIMIT 10

次のクエリ結果が得られます。

ID 名前 ブランド 価格 カウント
15 リベット ヌル 0.01 1000
14 スクリュー ヌル 0.10 1000
13 イケア 100.00 10
12 植木鉢 スマートフラワー 99.00 9
十一 アームチェア ボッシュ 44.00 8
10 ボッシュ 199.00 10
9 ドレッサー イケア 99.00 10
8 ランプ LG 15.00 100
7 テレビ LG 350.00 4
6 シェルフ ボッシュ 25.00 114

はい、テーブルにリベットとネジを追加しました。価格と数量はありますが、ブランドはありません。

5.2 NULLとの比較

Java で null を使用すると時々怒られたことを覚えていますか? つまり、equals() を介して null 値を参照できる変数を比較することはできません。例:

Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) {  //an exception will be raised here}

信じられないかもしれませんが、SQL 言語では、NULL 値を扱うときのニュアンスも必要になります。そしてそれは次のように聞こえます:何もNULLではありません

ブランドが次のすべての製品をフィルタリングしようとすると、次のようになりますnull

SELECT * FROM product
WHERE brand = NULL

空のテーブルが得られます。

ID 名前 ブランド 価格 カウント

ただし、クエリにbrand がに等しくない と記述するとNULL、同じ結果が得られます。

SELECT * FROM product
WHERE brand != NULL

再び空のテーブルが得られます。

ID 名前 ブランド 価格 カウント

NULL を使用した比較/アクションはすべて NULL を返します。:

表現 結果
ブランド = NULL ヌル
ブランド != NULL ヌル
NULL = NULL ヌル
NULL != NULL ヌル

はい、NULL と NULL を比較しても、答えは NULL になります。

5.3 NULL と IS NOT NULL

では、あるフィールド (または列) の値が であることを確認するにはどうすればよいでしょうかNULL? このために、SQL には特別な式があります - IS NULL。こんな感じです。

variable IS NULL

テーブルの列が と等しくないかどうかを確認したい場合はNULL、次のように記述する必要がありますIS NOT NULL

variable IS NOT NULL

ブランドが に等しい製品テーブルからすべての製品を選択するクエリを作成してみましょうNULL。このようなリクエストは次のようになります。

SELECT * FROM product
WHERE brand IS NULL

そして、次のクエリ結果が得られます。

ID 名前 ブランド 価格 カウント
14 スクリュー ヌル 0.10 1000
15 リベット ヌル 0.01 1000

次に、価格が 20 ドル未満のすべての製品を表示してみましょう。

SELECT * FROM product
WHERE price  < 20

そして、次のクエリ結果が得られます。

ID 名前 ブランド 価格 カウント
2 椅子 イケア 5.00 45
8 ランプ LG 15.00 100
14 スクリュー ヌル 0.10 1000
15 リベット ヌル 0.01 1000

ここで、価格は 20 ドル未満である必要があり、ブランドはそうではないことを指定しますNULL

SELECT * FROM product
WHERE price  < 20 AND brand IS NOT NULL

次のクエリ結果が得られます。

ID 名前 ブランド 価格 カウント
2 椅子 イケア 5.00 45
8 ランプ LG 15.00 100

すごい、最後の 2 行が消えています。仕組みは次のとおりです。少し珍しいですが、これには一定のロジックがあります。