SlideShare a Scribd company logo
フィア・オブ・ジ・
アンノウン
#sqlap	

@akuraru
@akuraru
• 新卒一年目	

• iOSアプリエンジニア	

• SQL書かない…	

• アイコンは猫
本の概要
• 目的:欠けている値を区別する	

• AP:理解なくNULLを扱う	

• 解決:ちゃんと理解しろ
発表の概要
• NULLとは?	

• 本の内容	

• まとめ
NULLとは?
NULLとは?

• プログラミングのNULLとは全くの別物
NULLとは?
• C言語
0やfalseと等しい

• Java
オブジェクトが無いことを表す
NULLとは?
• C言語
0やfalseと等しい

• Java
オブジェクトが無いことを表す

• SQL
一般値とは別の論理値
Booleanの場合
• TRUEとFALSEとは別の値(3つ目の値)	

• 三値論理で扱われる
3値論理
A

B

A and B

A or B

T

T

T

T

T

F

F

T

T

I

I

T

F

F

F

F

F

I

F

I

I

I

F

!

I

I

not A

T

I
3値論理
A

B

A=B

A <> B

T

T

T

F

T

F

F

T

T

I

I

I

F

F

T

F

F

I

I

I

I

I

I

I
数値の場合
• 一般値とは別の値	

• 0ではない。	

• ほとんどの式がNULLになる
数値の場合
• NULL + 2 => NULL	

• NULL = 2 => NULL	

• NULL <> 2 => NULL	

• 2 / 0 => エラー	

• 2 / NULLIF(0, 0) => NULL
文字列
• 一般値とは別の値	

• 空文字ではない。	

• ほとんどの式がNULLになる
文字列
• NULL + “hoge” => NULL	

• NULL = “” => NULL	

• NULL <> “” => NULL
本の内容
アンチパターン
• NULLを一般値として使う、または
一般値をNULLとして使う
式でNULLを使う	

NULLを許容する列の検索

• 大体結果がNULLになる	

• 意図した結果でないかも知れない
プリペアドステートで
NULLを扱う

• NULLと一般値のように扱う	

• SELECT * FROM Bgus WHERE
assigned_to = ? 	


• <= NULL	

• assigned_to = NULL => NULL
NULLの使用を避ける
• NOT NULL 制約をつける	

• “値がない”という意味付けをした値を
使う	


• その値はどうするの?
用いてよい場合
• よいとか悪いではなく、ちゃんと理解
しろという話	


• 恐怖のアンノウンではなく、NULLが不
明なものだから恐怖してるんじゃない
の?
解決策:NULLを一意な値
として扱う

• 三値論理を理解しましょう。
NULLの検索
• IS NULLを使う	

• NULL IS NULL => TRUE	

• IS DISTINCT FROM を使う	

• プリペアドステートメントでも使える
NOT NULL制約を使う
• 列にNULLを入れないようにする	

• DEFAULTを定義する方法もある	

!

• どっちにしろ要件による
まとめ
• NULLはなくせない	

• NULLを理解して活用するのが重要	

!

• この機会にNULLを学び直したらどうで
しょう?

More Related Content

Viewers also liked

Android1.5~8.0 Walkthrough
Android1.5~8.0 WalkthroughAndroid1.5~8.0 Walkthrough
Android1.5~8.0 Walkthrough
Yuki Matsumura
 
Android e2e testing at mercari
Android e2e testing at mercariAndroid e2e testing at mercari
Android e2e testing at mercari
Vishal Banthia
 
JUnit5とAndroidのテスト
JUnit5とAndroidのテストJUnit5とAndroidのテスト
JUnit5とAndroidのテスト
Hiroshi Kikuchi
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
yoku0825
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Hiroshi Tokumaru
 

Viewers also liked (6)

Android1.5~8.0 Walkthrough
Android1.5~8.0 WalkthroughAndroid1.5~8.0 Walkthrough
Android1.5~8.0 Walkthrough
 
Android e2e testing at mercari
Android e2e testing at mercariAndroid e2e testing at mercari
Android e2e testing at mercari
 
JUnit5とAndroidのテスト
JUnit5とAndroidのテストJUnit5とAndroidのテスト
JUnit5とAndroidのテスト
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
 

More from Akura Pi

Githubサービスについて
GithubサービスについてGithubサービスについて
Githubサービスについて
Akura Pi
 
Slide
SlideSlide
Slide
Akura Pi
 
ファントムファイル
ファントムファイルファントムファイル
ファントムファイルAkura Pi
 
そもそもFloatとは
そもそもFloatとはそもそもFloatとは
そもそもFloatとはAkura Pi
 
TableViewAgent
TableViewAgentTableViewAgent
TableViewAgentAkura Pi
 
Metaprogramming
MetaprogrammingMetaprogramming
MetaprogrammingAkura Pi
 
Ns user defaults
Ns user defaultsNs user defaults
Ns user defaultsAkura Pi
 
Storyboard
StoryboardStoryboard
StoryboardAkura Pi
 
Mvcのすすめ
MvcのすすめMvcのすすめ
MvcのすすめAkura Pi
 
Groovy base
Groovy baseGroovy base
Groovy baseAkura Pi
 

More from Akura Pi (11)

Githubサービスについて
GithubサービスについてGithubサービスについて
Githubサービスについて
 
Slide
SlideSlide
Slide
 
ファントムファイル
ファントムファイルファントムファイル
ファントムファイル
 
そもそもFloatとは
そもそもFloatとはそもそもFloatとは
そもそもFloatとは
 
TableViewAgent
TableViewAgentTableViewAgent
TableViewAgent
 
Metaprogramming
MetaprogrammingMetaprogramming
Metaprogramming
 
Ns user defaults
Ns user defaultsNs user defaults
Ns user defaults
 
Currying
CurryingCurrying
Currying
 
Storyboard
StoryboardStoryboard
Storyboard
 
Mvcのすすめ
MvcのすすめMvcのすすめ
Mvcのすすめ
 
Groovy base
Groovy baseGroovy base
Groovy base
 

フィア・オブ・ジ・アンノウン