SQL NULL 値の説明: IS NULL、COALESCE、NULLIF と回避すべき罠
NULL は、SQL で最も静かなバグのいくつかを引き起こします。クエリはエラーなしで実行されますが、行が失われたり、平均が偏ったりします。 NULL が実際にどのように動作するのか、テスト済みの例を使用して安全に処理する方法を学びます。
- NULL は欠落値または不明な値を意味します。これはゼロではなく、空の文字列でもありません。
= NULLは何も一致しないため、IS NULLでテストします。- NULL を使用したほとんどの計算は NULL を返し、
WHEREは確実に true である行のみを保持します。 - 集計では NULL がスキップされるため、平均が静かに変更される可能性があります。
クエリはエラーなしで実行され、妥当な数値が返されますが、行が欠落しており、平均が間違っています。 SQL NULL 値 が原因であることがよくあります。 NULL は通常の値のように動作しないため、初心者も経験豊富な開発者も同様に引っかかります。
このガイドでは、NULL がどのように動作するかを正確に説明します。 SQLite 3.50 ですべてのクエリを実行し、表示された結果はその実行から得られたものです。この動作のほとんどは標準 SQL であり、NULL ソート順序や Oracle の空文字列の処理など、データベースが異なる点に注目します。
NULLとは何ですか?
NULL は、値が欠落しているか不明であることを意味するマーカーです。これは通常の意味での値ではないため、これらはすべて異なるものです。
| 値 | 意味 | 電話列の例 |
|---|---|---|
NULL |
不明または提供されていません | 番号は分かりません |
'' |
既知の空のテキスト値 | 空白のまま送信されました |
0 |
数字のゼロ | 本文とは関係ありませんが、金額としては現実的です |
この違いは特に金額に関して重要です。ボーナス 0 は、その人が何も受け取らなかったことを意味します。 NULL ボーナスはまだ誰も知らないことを意味します。
サンプルテーブル
CREATE TABLE employees (
id INT, name TEXT, phone TEXT, bonus INT, manager_id INT
);
INSERT INTO employees VALUES
(1,'Meera','555-0101',500,NULL),
(2,'Arjun',NULL,300,1),
(3,'Sara','',NULL,1),
(4,'Ravi',NULL,NULL,2);
Sara の電話文字列は空ですが、Arjun と Ravi の文字列は NULL であることに注意してください。この 2 つはまったく異なる扱いを受けます。
NULL のテスト
ほとんどの人が最初に犯す間違いは次のとおりです。
SELECT name FROM employees WHERE phone = NULL;
-- (no rows)
SELECT name FROM employees WHERE phone IS NULL;
-- Arjun
-- Ravi
SELECT name FROM employees WHERE phone IS NOT NULL;
-- Meera
-- Sara
最初のクエリは有効な SQL であり、エラーは発生しません。何かを NULL と比較することは決して真ではないため、単純に何も返しません。空の文字列は実数値であるため、Sara は IS NOT NULL の下に表示されます。ただし、Oracle では、空の文字列は NULL として扱われます。これは注目すべき例外です。
3値ロジック
ほとんどのプログラミング言語では、条件は true または false です。 SQL は 3 番目の結果 unknown を追加します。値がわからない場合、それが 5 に等しいかどうかを判断することはできません。また、2 つの未知の値が等しいかどうかは不明であるため、NULL = NULL は真ではありません。私たちのテストでは、これらはすべて NULL を返しました。
SELECT NULL = NULL, NULL <> 1, 1 + NULL, 'a' || NULL;
-- NULL | NULL | NULL | NULL
条件の結合は慎重なルールに従って行われます。実行結果は次のとおりです。1 が true、0 が false です。
| 表現 | 結果 | なぜ |
|---|---|---|
真とヌル |
NULL | 不明な部分による |
偽とヌル |
偽 | 未知のものは何でも偽です |
TRUE または NULL |
本当 | 未知のものは何でも真実です |
偽またはヌル |
NULL | 不明な部分による |
NULLではありません |
NULL | 未知の反対は未知です |
WHERE から消える行
WHERE は、その条件が true の場合にのみ行を保持します。結果が不明な行は、false の行とともに削除されます。これにより、驚くべき結果が得られます。
SELECT name FROM employees WHERE phone <> '555-0101';
-- Sara
アルジュンとラヴィの電話番号は確かにその番号ではないので、アルジュンとラヴィが登場することを期待するかもしれません。しかし、彼らの携帯電話は不明であるため、結果は不明で、彼らは失踪します。それらを含めるには、明示的にそう言います: WHERE phone <> '555-0101' OR phone IS NULL。否定も役に立ちません。
SELECT name FROM employees WHERE NOT (bonus > 400);
-- Arjun
サラとラヴィにはボーナスがないため、bonus > 400 にもその逆にも登場しません。これは覚えておくべき重要な点です。条件とその否定は必ずしもすべての行をカバーするとは限りません。
COALESCE: フォールバックを提供します
COALESCE はリスト内の最初の非 NULL 値を返し、すべての主要なデータベースで機能します。
SELECT COALESCE(NULL, NULL, 'third', 'fourth');
-- third
SELECT name, COALESCE(phone, 'no phone') FROM employees;
-- Meera | 555-0101
-- Arjun | no phone
-- Sara |
-- Ravi | no phone
空の文字列は NULL ではないため、Sara は空白のまま表示されます。 MySQL と SQLite には IFNULL、SQL Server には ISNULL、Oracle には NVL など、同様の関数が存在します。 COALESCE はポータブルな選択肢です。計算に関する前述の点はここにも当てはまります。 bonus + 100 はボーナスのない人には NULL を与えるため、不足しているボーナスをゼロとして扱うことがビジネスにとって正しい場合は COALESCE(bonus, 0) + 100 と書きます。
NULLIF: 値を NULL に変換します
NULLIF(a, b) は 2 つの値が等しい場合は NULL を返し、そうでない場合は a を返します。特に役立つのは 2 つの用途です。プレースホルダー値をクリーンアップできます。
SELECT name, NULLIF(phone, '') FROM employees WHERE id = 3;
-- Sara | NULL
SELECT name FROM employees
WHERE COALESCE(NULLIF(phone, ''), '') = '';
-- Arjun
-- Sara
-- Ravi
2 番目のクエリは、「欠落している値または空白の」値を見つけるための便利な方法です。また、多くのデータベースでエラーが発生するゼロ除算を防ぐこともできます。
SELECT total / NULLIF(quantity, 0) FROM sales;
quantity が 0 の場合、失敗ではなく NULL が返されます。私たちのテストでは、SELECT 100 / NULLIF(0, 0) は NULL を返しました。
集計では NULL をスキップします
ここで、NULL がレポートに最も大きなダメージを与えます。
SELECT COUNT(*), COUNT(bonus), SUM(bonus), AVG(bonus),
AVG(COALESCE(bonus, 0))
FROM employees;
-- 4 | 2 | 800 | 400.0 | 200.0
| 表現 | 結果 | それが何を意味するか |
|---|---|---|
COUNT(*) |
4 | すべての行 |
COUNT(bonus) |
2 | ボーナスのある行のみ |
SUM(bonus) |
800 | NULL は無視されます |
AVG(bonus) |
400 | 800 を 4 ではなく 2 で割った値 |
AVG(合体(ボーナス, 0)) |
200 | 800 を 4 で割った値 |
では、ボーナスの平均は 400 または 200 でしょうか?それは、データ内で NULL が何を意味するかによって異なります。 NULL が「ボーナスが支払われなかった」ことを意味する場合、200 が適切です。 「まだ決まっていない」という意味であれば、400が正しいかもしれません。データベースがこの決定を行うことはできないため、ビジネスに詳しい人に質問する必要があります。
関連するトラップ: 値のない SUM は 0 ではなく NULL です。ボーナスのない行のみを合計すると NULL が返されましたが、COUNT は 0 を返しました。数値を期待しているアプリケーション コードはこれでクラッシュする可能性があるため、COALESCE(SUM(bonus), 0) でラップします。
ヒント: レポートの合計がおかしい場合は、COUNT(*) と COUNT(column) を比較してください。それらの間にギャップがあると、その列に NULL がいくつあるかがすぐにわかります。
GROUP BY、ソート、DISTINCT
NULL は比較では「等しくない」ですが、次の操作ではそれらを 1 つのグループとして扱います。
SELECT bonus, COUNT(*) FROM employees GROUP BY bonus ORDER BY bonus;
-- NULL | 2
-- 300 | 1
-- 500 | 1
SELECT DISTINCT bonus FROM employees;
-- 500, 300, NULL
グループ化の詳細については、SQL GROUP BY および HAVING を参照してください。データベースが大きく異なるのはソート順序です。 SQLite と MySQL は NULL を最小値として扱いますが、PostgreSQL と Oracle はそれを最大値として扱います。したがって、同じ ORDER BY bonus DESC では、ある場合は最後に NULL を置き、別の場合は最初に NULL を入れることができます。 PostgreSQL、Oracle、最新の SQLite では、NULLS FIRST または NULLS LAST を使用してこれを直接記述することができます。
結合します
= を使用した結合条件は NULL と一致しないため、NULL キーを持つ行は内部結合から除外されます。
SELECT e.name FROM employees e
JOIN employees m ON m.id = e.manager_id;
-- Arjun, Sara, Ravi (Meera is gone)
SELECT e.name, m.name FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
-- Meera | NULL
-- Arjun | Meera
-- Sara | Meera
-- Ravi | Arjun
Meera にはマネージャーがないため、内部結合によってその行が静かに削除されます。 LEFT JOIN はそれを保持し、欠落している側に対して独自の NULL も作成します。詳細については、SQL 結合の説明 を参照してください。
NOT IN トラップ
NOT IN リスト内の単一の NULL はすべての結果を消去します。
SELECT name FROM employees WHERE manager_id NOT IN (1);
-- Ravi
SELECT name FROM employees WHERE manager_id NOT IN (1, NULL);
-- (no rows)
2 番目の形式は manager_id <> 1 AND manager_id <> NULL を意味し、最後の部分は決して true にはなりません。これは、NULL が気づかれずに到着する可能性があるサブクエリの場合に特に危険です。 SQL サブクエリのチュートリアル で説明されているように、代わりに NOT EXISTS を使用してください。最初の結果には、その行の manager_id が NULL であるため、Meera も欠落しています。
NULLを使用した設計
- デフォルトでは
NOT NULLを使用します。 値が実際に欠落している可能性がある場合にのみ NULL を許可します。 - 賢明なデフォルトを追加します。 たとえば、
quantity INT NOT NULL DEFAULT 0。 - マジック値を使用しないでください。 1900-01-01 の日付または「不明」の代わりに -1 の年齢を使用すると、計算が破損します。
- UNIQUE の動作を理解してください。 ほとんどのデータベースでは
UNIQUE列に複数の NULL を許可しており、テストではエラーなしで 2 つが挿入されました。 SQL Server は例外であり、通常は許可されています。 - 主キーを NULL にすることはできないことに注意してください。主キーと外部キーを参照してください。
- NULL を使用したテスト。 NULL を含まないテスト データは、これらのバグを隠します。他のエッジケースと同様に、これらを意図的に含めます。
まとめ
NULL を「不明」として扱うと、その動作のほとんどが意味をなすようになります。つまり、不明プラス 1 は不明であり、不明に等しい不明は真であるかどうかは不明です。今週は自分のレポートを 1 つ監査してください。 COUNT(*) と COUNT(column) を使用して NULL 許容列をチェックし、NOT IN を探し、各平均で NULL が何を意味するかを決定します。
よくある質問
SQL の NULL とは何ですか?
NULL は、欠落値または不明な値のマーカーです。これはゼロや空の文字列とは異なり、比較では特別な処理が必要です。
= NULL が機能しないのはなぜですか?
何かを NULL と比較すると、true ではなく、unknown が返されるため、WHERE は行を破棄します。 IS NULL または IS NOT NULL を使用してテストします。
COALESCE と ISNULL の違いは何ですか?
COALESCE は標準 SQL であり、多くの引数を受け入れます。 ISNULL は SQL Server に固有であり、2 つかかります。移植可能なコードの場合は、COALESCE をお勧めします。
COUNTにはNULL値が含まれますか?
COUNT(*) は、NULL を含むすべての行をカウントします。 COUNT(column) は、その列が NULL ではない行のみをカウントします。これにより、数値が小さくなる可能性があります。
NULL は空の文字列と同じですか?
いいえ、ほとんどのデータベースで可能です。空の文字列は文字を含まない既知の値であり、NULL は不明を意味します。 Oracle は空の文字列を NULL として扱うため、注目に値する例外です。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →