MySQL で sum 関数を使用する例のチュートリアル

MySQL で sum 関数を使用する例のチュートリアル

導入

今日は、MySQL の sum 関数の使い方を紹介します。この関数は、MySQL データベースを操作するときによく使用される関数になっています。この関数は、条件を満たす行の指定された列の合計をカウントします。誰もが知っているはずなので、これについて話すことはありません。この記事では、主にいくつかの小さなケースを使用して、この関数の詳細な理解と、MySQL クエリを実行するときに合計関数を使用して最適化する方法を説明します。

構文解析

SUM([DISTINCT] expr) [over_clause]

  • expr の合計を返します。返されるセットに行がない場合、SUM() は NULL を返します。DISTINCT キーワードを使用すると、expr の異なる値のみを合計できます。
  • 一致する行がない場合、SUM() は NULL を返します。
  • over_clause が存在する場合、この関数はウィンドウ関数として実行されます。

上記の文章は、MySQL の公式ドキュメントからの関数の説明です。大まかに意味するところを翻訳すると次のようになります。

  • expr の合計を返します。行数が返されない場合は、NULL が返されます。ここでのDISTINCTは、式expr内の重複した値を削除します。
  • 一致する行が見つからない場合も、この関数は NULL を返します。
  • over_clause が設定されている場合、関数はウィンドウ関数として実行されます。ウィンドウ関数に慣れていない場合は、MySQL のウィンドウ関数について学習できます。

機能説明

この関数を使用する場合、この関数が式の合計をどのように計算するかについて考える必要があります。プログラマーの中には、この関数は条件を満たすすべての行の合計を直接カウントすると考える人もいるかもしれません。この理解は実際には間違ってはいませんが、あまり正確に表現されていないか、動作原理を実際には理解していません。
実際、この関数は一致する行の値を 1 つずつ累積します。例を挙げます。注文テーブルには条件を満たすデータが 10 行あります。注文の合計金額を数える必要があります。合計の初期値は 0 です。最初の行に一致すると、注文金額は 10 で、合計は 10 になります。2 番目の行に一致すると、注文金額は 20 で、合計は 30 になります。 3行目の注文価格は50なので、合計は80になります。このように数字が一つずつ積み重なっていきます。

行数注文価格合計値
1行目10.00 10.00
2行目20.00 30.00
3行目30.00 60.00
4行目40.00 100.00
5行目50.00 150.00
ライン... ... ...
10行目100.00 550.00

デモ例

次の構造を持つテーブル (Delivery) があるとします。

+-----------------------------+---------+
| 列名 | タイプ |
+-----------------------------+---------+
| 配信ID | int |
| 顧客 ID | int |
| 注文日 | 日付 |
| 顧客優先配送日 | 日付 |
| 注文金額 | 小数点 |
+-----------------------------+---------+

delivery_id はテーブルの主キーです。

このテーブルには、特定の日付に注文し、希望配達日(注文日と同じかそれ以降)を指定した顧客の食品配達情報が保持されます。顧客の予想配達日が注文日と同じ場合、その注文は「即時注文」と呼ばれ、そうでない場合は「計画注文」と呼ばれます。
以下のデータが含まれます:

+-------------+-------------+-------------+----------------------------+--------------+
| 配送 ID | 顧客 ID | 注文日 | 顧客優先配送日 | 注文金額 |
+-------------+-------------+-------------+----------------------------+--------------+
| 1 | 1 | 2019-08-01 | 2019-08-02 | 1.23 |
| 2 | 5 | 2019-08-02 | 2019-08-02 | 1.01 |
| 3 | 1 | 2019-08-11 | 2019-08-11 | 1.09 |
| 4 | 3 | 2019-08-24 | 2019-08-26 | 1.00 |
| 5 | 4 | 2019-08-21 | 2019-08-22 | 10.00 |
| 6 | 2 | 2019-08-11 | 2019-08-13 | 12.09 |
+-------------+-------------+-------------+----------------------------+--------------+

例1

表内のすべての注文の合計金額を計算します。これは非常にシンプルで、一般的な使用方法でもあります。sum() パラメータを使用して列に入力するだけです。上記の文法規則によれば、これは式であるはずです。実際、列も式です。

Deliveryからsum(order_money)を選択します。

例2

小数点第 2 位を保持して、即時注文の割合を取得する SQL クエリを記述します。この構文はほとんど使用されないため、少し難しいかもしれません。しかし、使用したことがあれば、非常に簡単であることがわかります。

まず、特定のタイプの割合を照会しているので、合計を計算する必要があることを理解する必要があります。合計注文合計 1 をカウントし、次に合計インスタント注文合計 1 をカウントし、次に合計インスタント注文合計 1 をカウントし、最後に合計インスタント注文合計 2 をカウントすることができます。後は分割するだけです。しかし、ここでは SQL ステートメントが明示的に必要です。それで、どうやって解決するのでしょうか?

ここでは、sum の動作原理を深く理解する必要があります。データを 1 行ずつ読み取り、sum を 1 行ずつ累積していくことを想像できます。sum2 の要約を取得できますか? sum2の合成についてはどうですか? sum2の合成についてはどうですか? sum1 に関しては、テーブル内の行数の合計なので、数えるのは間違いなく簡単です。

解決策1:

ラウンドを選択(
 sum(case の場合 order_date = customer_pref_delivery_date の場合 1、そうでない場合は 0 終了) /
 カウント(*) * 100,
 2
) としてimmediate_percentage
配送から

解決策2:

ラウンドを選択(
 sum(注文日 = 顧客優先配達日) /
 カウント(*) * 100,
 2
) としてimmediate_percentage
配送から

ここで、合計式が条件を満たすと、1 が返されます。条件を満たすデータの行が読み取られるたびに、合計は 1 ずつ増加します。最終的に、すべてのデータが読み取られると、合計も増加します。したがって、条件を満たす項目の合計数が出てきます。

ソース

タイトルはLeetCodeからのものです。

出典: LeetCode

リンク: leetcode-cn.com/problems/im…

もう一つの良い例がありますので、注意深く解釈することをお勧めします。この機能の使用シナリオを深めます。

https://www.jb51.net/article/207813.htm

要約する

MySQL の sum 関数の使い方についてはこれで終わりです。MySQL の sum 関数の使い方についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の count() と sum() の違いの詳細な紹介
  • MySQL で SUM 関数を使用するチュートリアル
  • Mysql で sum() 関数を使用して null を返す問題の詳細な説明

<<:  CSS で中空効果を実装するサンプルコード

>>:  JavaScriptのクローン作成についての簡単な説明

推薦する

VMware 仮想マシンのインストール win7 オペレーティング システム チュートリアル ダイアグラム

VMwareaのインストールプロセスは説明しませんが、主にwin7イメージをロードする方法を説明しま...

Linux ログ内のキーワードとその前後の情報を検索する方法の例

日常業務では、ログを表示する必要がよくあります。たとえば、 tail コマンドを使用してログをリアル...

nginx の default_server 定義とマッチングルールの詳細な説明

nginx の default_server ディレクティブは、server_name と一致しない...

NginxはGzipアルゴリズムを使用してメッセージを圧縮します

HTTP圧縮とは場合によっては、比較的大きなメッセージ データがクライアントとサーバー間で送信され、...

Redo ログと Undo ログに基づく MySQL クラッシュ回復の分析

目次MySQLクラッシュ回復プロセス1. ブラックボックス下のデータフローを更新する2. やり直しロ...

JSホモロジー戦略とCSRFの詳細な説明

目次概要同一生成元ポリシー (SOP)相同制限クロスドメインをバイパスクロスサイトリクエストフォージ...

ドッカー専用倉庫港湾建設プロセス

1. 準備1.1 港ダウンロードハーバーダウンロードアドレス:リンクリンクの説明を追加し、必要なバー...

JavaScript offsetParent のケーススタディ

1. offsetParentの定義: offsetParentは子要素に最も近い位置に配置された親...

Ubuntuのインストール Matlab2020b の詳細なチュートリアルとリソース

目次1. リソースファイル2. インストール2.1 詳細な手順2.1.1 ディスクイメージのマウント...

XHTML と CSS の Web ページ作成の問題に対する解決策

XHTML CSS ページ制作中に遭遇する問題の解決策は、解決策と呼ぶには少々大げさです。せいぜい、...

ウェブデザイナーは3つの側面からウェブページを最適化する必要がある

<br />帯域幅の増加に伴い、Web ページ上のオブジェクトも増えているため、Web ...

CSS3を使用して背景画像の色を変更するさまざまな方法

CSS3 では画像の色を変更できます。これからは複数の絵をデザインする必要がなくなり、いつでも修正で...

Oracle の開閉の 4 つのモード

>1 データベースを起動するcmd コマンド ウィンドウで、「sqlplus」を直接入力して ...

border-image を使用してテキストバブルの境界線を実装する方法のサンプルコード

開発中に、非常に単純なテキストバブル効果に遭遇しました。これは、おおよそ次のようになります。 うーん...

JS+Canvas でダイナミックな時計効果を実現

参考までに、Canvas をベースにしたダイナミッククロックのデモを用意しました。具体的な内容は次の...