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のクローン作成についての簡単な説明

推薦する

Nginx 1つのドメイン名で複数のプロジェクトにアクセスする方法の例

背景最近、複数のプロジェクトを展開する際に、1 つのドメイン名で複数のプロジェクトにアクセスする方法...

Vueカスタムツリーコントロールの使い方の詳細な説明

この記事では、Vueカスタムツリーコントロールの使い方を参考までに紹介します。具体的な内容は次のとお...

インデックスとテーブルリターンをカバーするMySQLの使い方

インデックスの2つの主要なカテゴリ使用されるストレージエンジン: MySQL 5.7 InnoDBク...

通知メッセージカルーセルを実装するための CSS3 トランジション

Vueバージョンをファイルにコピーして使用します <テンプレート> <!-- カル...

スライダー効果を実装するミニプログラム

この記事の例では、スライディングブロック効果を実現するための小さなプログラムの具体的なコードを参考ま...

Centos6.6 で php7 + nginx 環境をインストールする方法

この記事では、centos6.6 で php7 + nginx 環境をインストールする方法について説...

ウェブページの読みやすさを向上させるいくつかの方法

1. 対照的な色を使用します。ここでのコントラストとは、テキストの色と背景色のコントラストを指します...

HTML 特殊文字変換表

キャラクター小数点文字番号エンティティ名---未使用空間---スペースバー! ! ---感嘆符「 」...

MySQL で重複を削除するには、distinct または group by を使用する必要がありますか?

序文group by と distinctive のパフォーマンス比較について: インターネット上の...

JavaScriptのポイントごとのシリーズでこれは何ですか

これを理解するおそらく、他のオブジェクト指向プログラミング言語でもthis見たことがあり、これがコン...

Linux リモート開発に vs2019 を使用する方法

通常、Linux プログラムを開発する場合、次の 2 つのオプションがあります。 Linux上で直接...

年末ですが、MySQL パスワードは安全ですか?

序文:年末です。データベースを検査する時期ではないでしょうか?一般的に、検査では、パスワードの複雑さ...

DockerコンテナにNFS共有ディレクトリをマウントする実装

以前、https://www.jb51.net/article/205922.htm で、Docke...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

MySQLとOracleの違いを簡単に説明してください

1. Oracle は大規模データベースですが、MySQL は小規模から中規模のデータベースです。O...