整数除算と小数除算
キャストで予期しない結果を避けます。
「整数除算と小数除算」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
意外な結果
まずは問題から始めましょう。次のクエリは何を返すと思いますか。
0.5 になると予想したなら、驚くかもしれません。多くの SQL データベースでは、2つの整数を割ると整数の結果になり、小数部分が完全に削除されます。
SELECT 1 / 2 AS result;整数除算を理解する
除算の両方のオペランドが整数の場合、SQL は整数除算を実行します。結果はゼロ方向に切り捨てられます。丸めるのではなく、整数部分だけが残ります。
そのため、1 / 2 = 0、7 / 3 = 2、9 / 4 = 2 になります。小数部分は何も通知されずに破棄されます。
SELECT 7 / 3 AS truncated_result;整数除算の例をさらに見る
次の1つのクエリで、整数除算の例をいくつか確認できます。すべての結果から小数部分が失われていることに注目してください。この動作は、整数リテラルだけ、または整数列だけを含む式で一貫しています。
SELECT
10 / 4 AS ten_div_four,
9 / 2 AS nine_div_two,
1 / 3 AS one_div_three,
6 / 6 AS six_div_six;CAST で修正する
小数の除算を強制する最も確実な方法は、少なくとも一方のオペランドを小数型にキャストすることです。CAST(value AS DECIMAL) または CAST(value AS NUMERIC) と書くと、SQL はその数値を小数値として扱うため、除算で正確な結果が返されます。
SELECT CAST(1 AS DECIMAL) / 2 AS result;両方の側を CAST する
小数の結果を得るには、除算の一方の側だけをキャストすれば十分です。SQL がもう一方のオペランドを自動的に変換します。ただし、両方をキャストすると意図が明確になり、後からコードを読むときの混乱を避けられます。
SELECT
CAST(7 AS DECIMAL) / CAST(3 AS DECIMAL) AS both_cast,
CAST(7 AS DECIMAL) / 3 AS one_cast;小数リテラルを使う
もう1つの簡単な方法は、.0 を付けて一方のオペランドを小数リテラルとして記述することです。SQL は 1.0 を小数として認識するため、式全体で小数の算術演算が行われます。
これは簡単なアドホッククエリに便利ですが、プロダクションコードでは CAST のほうが意図が明確です。
SELECT 1.0 / 2 AS decimal_result,
7.0 / 3 AS another_result;実務での落とし穴: 列データ
この問題は、整数列を扱うときに特に深刻になります。売上目標を記録するテーブルを想像してください。整数列同士を割ると整数の結果になり、本来は 0.75 であるべき変換率が 0 になってしまいます。
CREATE TABLE sales_targets (
rep TEXT,
achieved INT,
target INT
);
INSERT INTO sales_targets VALUES
('Alice', 75, 100),
('Bob', 3, 4),
('Carol', 9, 10);
SELECT rep,
achieved / target AS wrong_rate
FROM sales_targets;列の除算を修正する
分子側の列に CAST を適用すると、除算は真の変換率を小数として返すようになります。分母は自動的に昇格されます。
その後に 100.0 を掛けるとパーセンテージになります。全体を通して小数演算が使われます。
SELECT rep,
CAST(achieved AS DECIMAL) / target AS conversion_rate,
CAST(achieved AS DECIMAL) / target * 100.0 AS pct
FROM sales_targets;小数精度を制御する
CASTで精度とスケールを指定すると、格納する小数点以下の桁数を制御できます。DECIMAL(10, 2) は、合計で最大10桁、そのうち小数点以下が2桁であることを意味します。末尾に多くの数字が続く表示ではなく、整った丸め済みの出力にしたい場合に便利です。
SELECT CAST(CAST(1 AS DECIMAL(10,4)) / 3 AS DECIMAL(10,2)) AS rounded_result;除算後にROUNDを適用する
内部では完全な精度で計算し、最後に表示値を丸めたい場合があります。ROUND 関数には、値と保持したい小数点以下の桁数を指定します。
必ず最初に小数演算で除算してから丸めてください。除算前に丸めてはいけません。
SELECT
ROUND(CAST(1 AS DECIMAL) / 3, 4) AS four_places,
ROUND(CAST(1 AS DECIMAL) / 3, 2) AS two_places,
ROUND(CAST(1 AS DECIMAL) / 3, 0) AS zero_places;整数除算が役立つ場合
整数除算は常にバグとは限りません。必要な処理にそのまま適している場合もあります。たとえば、合計分数を整数の時間数に変換する場合は、意図的に整数除算を使います。重要なのは、偶然そうなるのではなく、整数除算と小数除算のどちらを使うかを意識して選ぶことです。
SELECT
137 / 60 AS full_hours,
137 % 60 AS remaining_minutes;確認問題
SQLにおける整数除算と小数除算についての理解を確認しましょう。
レッスンのまとめ
このレッスンでは、SQLが整数同士の除算をどのように処理するかを学びました。
- Integer / Integer は結果を切り捨てます。小数部分は気付かないうちに失われます。
- 少なくとも一方のオペランドに
CAST(value AS DECIMAL)を使用すると、小数除算を強制できます。 1.0のような小数リテラルを記述しても、式は小数演算に昇格します。- 除算後に
ROUNDを使用すると、表示する小数点以下の桁数を制御できます。 - 整数除算が意図的な場合もあります(例:分を時間に変換する場合)。ただし、偶然ではなく、必ず意識して選択してください。
整数列を除算する際は、この落とし穴に注意してください。SQLクエリで、気付きにくいバグが発生する最も一般的な原因の1つです。
よくある質問
「整数除算と小数除算」レッスンは無料ですか?
はい。「整数除算と小数除算」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「整数除算と小数除算」で何を学びますか?
キャストで予期しない結果を避けます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「整数除算と小数除算」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。