SQLのNULLの構文、NULLかどうか評価する方法についてまとめています。
SQLのNULLの構文
SQLのNULLは、「NULL」というなにもない状態を表しています。ややこしいことに「空文字(からもじ)」とは別物なんですね。空文字は、「空っぽというデータ」ということになります。
以下は、employees2(社員)テーブルから、first_name(姓名の名)が空文字のデータと、NULLのデータをそれぞれ抽出するSQLの例です。
mysql> select * from employees2 limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | NULL | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec) # first_nameが空文字のデータを抽出 mysql> select * from employees2 where first_name = ''; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | | Facello | M | 1986-06-26 | +--------+------------+------------+-----------+--------+------------+ 1 row in set (0.11 sec) # first_nameがNULLのデータを抽出 mysql> select * from employees2 where first_name IS NULL; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10002 | 1964-06-02 | NULL | Simmel | F | 1985-11-21 | +--------+------------+------------+-----------+--------+------------+ 1 row in set (0.10 sec)
SQLのNULLは、「NULL」というなにもない状態を表しています。ややこしいことに「空文字(からもじ)」とは別物なんですね。空文字は、「空っぽというデータ」ということになります。
【関連記事】
▶【SQL】意外とややこしいnullについての基本的知識とSQLのnot nullを分かりやすく解説。
NULLは特殊な値として、IS NULLなどの特殊な演算子が用意されているんですね。NOT INにNULLを含めることは出来ないなどの注意点もあります。
以下は、NOT INにNULLを含めると空の結果が返ってきてしまう例です。ANDとIS NOT NULLを組み合わせるなど工夫が必要です。
SELECT * FROM `departments` WHERE dept_name NOT IN ( 'Sales', 'Development', NULL ); Empty set (0.00 sec) SELECT * FROM `departments` WHERE dept_name NOT IN ( 'Sales', 'Development' ) AND dept_name IS NOT NULL; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | +---------+--------------------+ 7 rows in set (0.00 sec)
【関連記事】
▶SQLのNULL比較にはIS NULL演算子を使う ストアドファンクションでも同様
主要DBMSのNULLの構文
OracleのSQLのNULL
OracleのNULLは、NULLと空文字を同じものとして扱います。OracleのNULLの扱いは主要DBMSの中でも特殊です。
公式ドキュメントにも「Oracleでは現在、長さがゼロの文字列をNULLとして処理しますが、将来のリリースで処理が変更されることがあるため、空の文字列とNULLを同じ用に処理しないことをおすすめします」とあります。
SQL ServerのSQLのNULL
SQL Serverでは、空文字とNULLは別のものとして扱われます。NULL専用の演算子として、IS NULLやIS NOT NULLが用意されています。
USE AdventureWorks2012; GO SELECT Name, Weight FROM Production.Product WHERE Weight IS NULL; GO
関連)ISNULL (Transact-SQL) – SQL Server | Microsoft Docs
SQL Serverには、全く別の機能を持つ関数としてISNULL関数があります。混同しないように注意しましょう。
MySQLのNULL
MySQLでNULLを比較するために、IS NULLやIS NOT NULLが用意されています。
mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+
NULLは統合や不等号を使ってNULLかどうかをテストすることはできません。MySQLの場合は、NULLに関する算術比較は結果もすべてNULLになってしまいます。
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.3.4.6 NULL 値の操作
PostgreSQLのNULL
PostgreSQLでは、NULLを評価するためにIS NULLとIS NOT NULLが用意されています。
expression IS NULL expression IS NOT NULL
また、非標準の構文として、全く同じ機能を持つ以下の構文も使用可能です。
expression ISNULL expression NOTNULL
SQLのNULLのまとめ
- NULLは、「なにもない」を表す値で、IS NULLやIS NOT NULLという特殊な演算子で評価する
- Oracleは一般的なDBMSと違い、空文字をNULLとして扱う
- IS NULLとISNULL関数が同時に存在するDBMSもあるため、混同に注意する