18
1 NULLとの戦い RDBMS実装編 理論から学ぶ データベース実装入門Night LT @MeijiK

NULLとの戦い RDBMS実装編

Embed Size (px)

Citation preview

1

NULLとの戦い

RDBMS実装編

理論から学ぶ

データベース実装入門Night LT

@MeijiK

免責事項

• 本プレゼンテーションにおいて示されている見解は、私自身の見解であって、私の所属する会社・団体の見解を必ずしも反映したものではありません。ご了承ください。

2

3

第7章 NULLとの戦い

• 7.1 NULL

– リスト7.3 値にNULLが含まれる場合

– リスト7.4 リスト7.3を正しく書き換えた例

• 7.2 NULL対策

• 7.3 まとめ

SELECT * FROM users WHERE age <>20

SELECT * FROM users WHERE age <>20 OR age IS NULL

4

等価比較

A B =

5

等価比較

A B =

A B IS

6

NULLセーフな比較演算

• 二つの項目を比較する際に、それぞれの項目にNULLがあるかないによって演算子を使い分けるのはなかなか面倒なものです。たとえばA と Bを比較しようとして、BがNULLで、A IS NULLとするのか、BがNULLでないときにA = Bとするのか、というものです。

• 一部のRDBMSにはNULLを含めた比較演算子が実装されています。たとえばMySQLでは<=>という独自の演算子にてA, B どちらにNULLが含まれても、正しく比較することができます。

7

NULLセーフな等価比較(MySQL)

A B <=>

8

SQL標準

• SQL標準ではNULL込みの比較がおこなえるIS NOT DISTINCT FROMが定められました。次のように利用します。

• A IS NOT DISTINCT FROM B

• 現時点ではIBM DB2, Firebird, PostgreSQL,

Sybaseで利用できます。

9

NULLセーフな等価比較(SQL標準)

A B IS NOT DISTINCT FROM

10

実装の闇

• 古くからあるRDBMSではNULLの扱いが特殊な場合があります。

• 具体的には特定のデータ型、比較演算子でNULLの扱いが違う、というものです。

• 有名なものはOracleとMicrosoft SQL

Server/Sybaseに関するものです。

11

OracleのVARCHAR2型

• Oracleでは可変長文字列型カラム型にVARCHAR2を利用しその空文字(長さ0の文字)がNULL扱いされる。

• Oracleで仕事をする人には常識なのですが、Oracleのみ(もしくはOracle互換をうたうDB

の互換モードのみ)の特別な仕様です。

• SQLの入門テキストのみでこの業界に入った人や、Oracleへの移行、Oracleからの移行の場合にはご注意ください。

12

SQL Server/Sybaseの「=NULL」

• MS SQL Server/Sybaseの古いバージョンでは= NULLの表記で正しく(?) 比較できる。

• 古いバージョンやSET ANSI_NULLSオプションがOFFにできるバージョンでは= NULL

がTRUEやFALSEを返します。

• 最近のデフォルトはANSI_NULLSオプションがONつまり= NULLはNULLですので、新規開発では問題がないのですが、過去のバージョンからのバージョンアップや、他のデータベースの移行の際には注意が必要です。

13

リスト7.4の書き換え(MySQL)

• SELECT * FROM users WHERE age <>

20 OR age IS NULL;

• SELECT * FROM users WHERE !(age

<=> 20);

14

リスト7.4の書き換え(SQL標準)

• SELECT * FROM users WHERE age <>

20 OR age IS NULL;

• SELECT * FROM users WHERE age IS

DISTINCT FROM 20;

15

リスト7.4の書き換え(Oracle10以降)

• SELECT * FROM users WHERE age <>

20 OR age IS NULL;

• SELECT * FROM users WHERE LNNVL(age = 20);

16

宣伝1:読書会

• 7shiさん、 furandon_pigさん主催で隔週水曜日にゆるゆるとやってます。

– http://riron-db.connpass.com/

–次回は2015/10/14(水) 20:00より。

• 今回のネタは読書会で話したもの+αです。

–そもそものネタは次の書籍でボツったもの+αです。。。。

宣伝2: 書籍情報

• おうちで学べるデータベースのきほん

–まったくの初心者はこちらをどうぞ。

–増刷出来(パチパチ)

• 入手方法

– じゃんけんで勝つ。

– もしくは、Amazonでポチる w。

• こんな疑問にも答えている(?)

– Read Uncommitted なぜある

17

18

THANK YOU

• ご清聴ありがとうございました。