本記事では、海外のSQL学習サイト【SQL Bolt】を利用して、データベース初心者向けにSQLの基本を解説します。
第8回は「SQL Lesson 8: A short note on NULLs」、SQLデータベースにおけるNULL値の扱い方についてです。
- データベースでは、NULL値が存在しないことが望ましい
- 外部結合(OUTER JOIN)によってNULL値が生じることがある
- 「WHERE 列名a IS/IS NOT NULL」で列名aの値がNULLか/NULLでないか判定できる
外部結合については前の記事で解説しています↓
合わせて読んでみてください。
ざっくり日本語訳
まず、データベースではNULL値の使用はできるだけ避けましょう。
理由は、データベース内にNULL値が存在する可能性がある場合、クエリや制約条件、結果の処理のときに特別な注意が必要になるからです。
データベース内にNULL値が存在するかしないかで、動作が異なる関数もあります
NULL値を使う代わりに、数値データには0、テキストデータには空文字列など、データ型に応じたデフォルト値を設定することができます。
しかし、データベースが不完全なデータを保存する必要がある場合、デフォルト値が後の分析に影響を与えるのなら、NULL値を使う方が良いこともあります。たとえば「分析の際に、数値データの平均を取りたい!」といった場合ですね。
また、Lesson7で見たように、非対称なデータを持つ2つのテーブルを外部結合する際にNULL値を避けられないこともあります。
(例) Lesson7の練習問題3問目
外部結合(OUTER JOIN)によって、「Role」の列にNULL値が生じています。
このような場合、「IS NULL」制約または「IS NOT NULL」制約を使って、WHERE句でNULL値を判定することができます。
記述する順番
SELECT DISTINCT 列名1, 列名2, …
FROM テーブル1
WHERE 列名a IS/IS NOT NULL
AND/OR 条件
AND/OR …;
条件の意味
WHERE 列名a IS NULL | 列名aの値がNULLの場合 |
WHERE 列名a IS NOT NULL | 列名aの値がNULLでない場合 |
演習問題の和訳・解答
- 1. Find the name and role of all employees who have not been assigned to a building
-
【和訳】ビルに配属されていない全従業員の名前と役割を探してください。
SELECT Employees.Name, Employees.Role FROM Employees LEFT JOIN Buildings ON Employees.Building = Buildings.Building_name WHERE Employees.Building IS NULL;
- 2. Find the names of the buildings that hold no employees
-
【和訳】従業員が1人も所属していないビルの名前を探してください。
SELECT * FROM Buildings LEFT JOIN Employees ON Buildings.Building_name = Employees.Building WHERE Employees.Name IS NULL;
コメント