ホームページ データベース mysql チュートリアル SQL における Null についての深い理解

SQL における Null についての深い理解

May 01, 2017 pm 01:43 PM

NULL は、コンピューターやプログラミングの世界では未知、不確かであることを意味します。漢訳では「空」ですが、この空(ヌル)はそれほど空(空)ではありません。 Null は未知の状態、つまり将来の状態を表します。たとえば、Xiao Ming がポケットにいくら持っているかはわかりませんが、それが 0 であるかどうかはわかりません。現時点では、Null はコンピュータで表すために使用されます。未知で不確実。

SQL に精通している人は Null について何の疑問も持たないでしょうが、それを包括的にまとめた記事を見つけるのはまだ困難です。英語版を見つけたので良い感じです。

Tony Hoare は 1965 年に null 参照を発明し、それが自分の犯した「10 億ドルの間違い」であると考えましたが、50 年後の現在でも、SQL の null 値は多くの一般的なエラーの原因となっています。 最も衝撃的な状況をいくつか見てみましょう。

Null はサイズ/等価性の判断をサポートしません

次の 2 つのクエリは、users テーブルにレコードがいくつあっても、0 行を返します:

select * from users where deleted_at = null;

– result: 0 rows

select * from users where deleted_at != null;

– result: 0 rows
ログイン後にコピー

これは、null が「不明な」型を表すためです。つまり、通常の条件演算子を使用して null を他の値と比較することは意味がありません。 Null は Null と等しくありません (おおよその理解: 未知の値が未知の値と等しくなることはあり得ず、この 2 つの値の間の関係も不明です。そうでないと数学と論理が台無しになります)。

– 注: 次の SQL は MySQL に適しています。Oracle の場合は、dual;

select null > 0;

– result: null

select null < 0;

– result: null

select null = 0;

– result: null

select null = null;

– result: null

select null != null;

– result: null
ログイン後にコピー

から…を追加する必要があります。 値を null と比較する正しい方法は、is キーワードと is not 演算子を使用することです:

select * from users

where deleted_at is null;

– result: 所有被标记为删除的 users
ログイン後にコピー
select * from users

where deleted_at is not null;

– result: 所有被标记为删除的 users
ログイン後にコピー

2 つの列の値が異なるかどうかを判断したい場合は、次の関数を使用できます:

select * from users

where has_address is distinct from has_photo

– result: 地址(address)或照片(photo)两者只有其一的用户
ログイン後にコピー

Nullとは関係ありません

サブクエリ (部分選択) は、データをフィルタリングする非常に便利な方法です。たとえば、パッケージを持たないユーザーにクエリを実行する場合は、次のクエリを作成できます:

select * from users 

where id not in (select user_id from packages)
ログイン後にコピー

しかしこの時点で、packages テーブル内の行の user_id が null の場合、問題が発生します。返される結果は空です。なぜこの奇妙なことが起こるのかを理解するには、SQL コンパイラーが何をしたかを理解する必要があります。以下はより単純です。例:

りー

この SQL ステートメントは次のように変換されます:

select * from users 

where id not in (1, 2, null)
ログイン後にコピー

id != null の結果は不明な値である null であることがわかっており、任意の値と null の間の AND 演算の結果は null であるため、この結果は他のどの条件とも同等ではありません。 null の値は true ではありません。

条件が逆の場合、クエリ結果に問題はありません。 ここで、パッケージを使用してユーザーにクエリを実行します。

select * from users 

where id != 1 and id != 2 and id != null
ログイン後にコピー

同様に、簡単な例を使用できます:

select * from users 

where id in (select user_id from packages)
ログイン後にコピー

この SQL は次のように変換されます:

select * from users

where id in (1, 2, null)
ログイン後にコピー

where 句は一連の or 条件であるため、そのうちの 1 つが null になるかどうかは問題ではありません。 true 以外の値は節の他の部分の計算結果に影響を与えず、無視されるのと同等です。

Null と並べ替え

並べ替えの際、Null 値が最大であるとみなされ、降順 (降順) で並べ替える場合、Null 値が最初にランク付けされるため、問題が発生する可能性があります。

次のクエリはスコアに基づいてユーザーのランキングを表示するものですが、スコアのないユーザーが上位にランク付けされます

select * from users 

where id = 1 or id = 2 or id = null
ログイン後にコピー

! この種の問題を解決するには 2 つの考え方があります。最も簡単な方法は、Coalesce を使用して null の影響を排除することです:

select name, points

from users

order by 2 desc;

– points 为 null 的记录排在所有记录之前!
ログイン後にコピー

データベースのサポートを必要とする別の方法として、並べ替え時に null 値を最初に置くか最後に置くかを指定する方法があります:

– 在输出时将 null 转换为 0 :

select name, coalesce(points, 0)

from users

order by 2 desc;

– 输出时保留 null, 但排序时转换为 0 :

select name, points

from users

order by coalesce(points, 0) desc;
ログイン後にコピー

もちろん、null は、除数がゼロの場合の数学的演算エラーの処理など、エラーの発生を防ぐためにも使用できます。

0で割る

ゼロで割るのは非常に痛ましいエラーです。昨日は正常に動作していた SQL が、0 で割ると突然異常が発生しました。一般的な解決策は、最初に case ステートメントを使用して分母が 0 かどうかを判断し、次に除算演算を実行することです。

りー

ase ステートメントのやり方は実際には醜く、分母が再利用されています。単純な状況であれば問題ありませんが、分母が非常に複雑な式の場合は悲劇が起こります。読みにくく、保守や変更が難しく、注意しないと多くのバグが発生することになります。 .

この時点で、nullif を使用して、分母が 0 の場合に null になるようにすることができます。これにより、num_users = 0 の場合、返される結果は null になります。

null は望まないが、0 または他の数値に変換したい場合は、前の SQL に基づいて coalesce 関数を使用できます:

select name, coalesce(points, 0)

from users

order by 2 desc nulls last;
ログイン後にコピー

結論

トニー・ホアは自分の間違いを後悔しているかもしれませんが、少なくともヌルの問題は簡単に解決できるので、新しい究極のスキルを練習して、ヌルによって掘られた無効な穴 (無効化) から離れてください!

以上がSQL における Null についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Apr 17, 2024 pm 02:57 PM

HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

Oracle SQLでの除算演算の使用法 Oracle SQLでの除算演算の使用法 Mar 10, 2024 pm 03:06 PM

「OracleSQLでの除算演算の使用方法」 OracleSQLでは、除算演算は一般的な数学演算の1つです。データのクエリと処理中に、除算演算はフィールド間の比率を計算したり、特定の値間の論理関係を導出したりするのに役立ちます。この記事では、OracleSQL での除算演算の使用法を紹介し、具体的なコード例を示します。 1. OracleSQL における除算演算の 2 つの方法 OracleSQL では、除算演算を 2 つの異なる方法で実行できます。

Oracle と DB2 の SQL 構文の比較と相違点 Oracle と DB2 の SQL 構文の比較と相違点 Mar 11, 2024 pm 12:09 PM

Oracle と DB2 は一般的に使用される 2 つのリレーショナル データベース管理システムであり、それぞれに独自の SQL 構文と特性があります。この記事では、Oracle と DB2 の SQL 構文を比較し、相違点を示し、具体的なコード例を示します。データベース接続 Oracle では、次のステートメントを使用してデータベースに接続します: CONNECTusername/password@database DB2 では、データベースに接続するステートメントは次のとおりです: CONNECTTOdataba

MyBatis動的SQLタグのSetタグ機能の詳細説明 MyBatis動的SQLタグのSetタグ機能の詳細説明 Feb 26, 2024 pm 07:48 PM

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

SQL の ID 属性は何を意味しますか? SQL の ID 属性は何を意味しますか? Feb 19, 2024 am 11:24 AM

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

SQL の 5120 エラーを解決する方法 SQL の 5120 エラーを解決する方法 Mar 06, 2024 pm 04:33 PM

解決策: 1. ログインしているユーザーがデータベースにアクセスまたは操作するための十分な権限を持っているかどうかを確認し、ユーザーが正しい権限を持っているかどうかを確認します; 2. SQL Server サービスのアカウントに指定されたファイルまたはデータベースにアクセスする権限があるかどうかを確認します。 3. 指定されたデータベース ファイルが他のプロセスによって開かれているかロックされているかどうかを確認し、ファイルを閉じるか解放して、クエリを再実行します。管理者として試してください。Management Studio をなどとして実行します。

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか? MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか? Dec 17, 2023 am 08:41 AM

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか?データの集計と統計は、データ分析と統計を実行する際の非常に重要な手順です。 MySQL は強力なリレーショナル データベース管理システムとして、データの集約と統計操作を簡単に実行できる豊富な集約機能と統計機能を提供します。この記事では、SQL ステートメントを使用して MySQL でデータの集計と統計を実行する方法を紹介し、具体的なコード例を示します。 1. カウントには COUNT 関数を使用します。COUNT 関数は最も一般的に使用されます。

データベース技術コンテスト: Oracle と SQL の違いは何ですか? データベース技術コンテスト: Oracle と SQL の違いは何ですか? Mar 09, 2024 am 08:30 AM

データベース技術コンテスト: Oracle と SQL の違いは何ですか?データベース分野では、Oracle と SQL Server の 2 つは非常に評判の高いリレーショナル データベース管理システムです。どちらもリレーショナル データベースのカテゴリに属しますが、両者の間には多くの違いがあります。この記事では、Oracle と SQL Server の違い、実際のアプリケーションにおけるそれらの機能と利点について詳しく説明します。まず、Oracle と SQL Server の間には構文に違いがあります。

See all articles