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

推薦する

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

Windows Server 2016 に Docker をインストールする方法

最近、Microsoft は Docker をネイティブにサポートする Windows Server...

webkit-box-reflect を巧みに使用してさまざまな動的効果を実現する (要約)

かなり前の記事で、 -webkit-box-reflectプロパティについて説明しました。リフレクシ...

MySQL マスタースレーブレプリケーション構成プロセス

メインライブラリの構成1. MySQLを設定する vim /etc/my.cn # ファイルに次の内...

CSS で 2 列レイアウトを実現する N 通りの方法

1. 2 列レイアウトとは何ですか? 2 列レイアウトには、左側が固定幅で右側が適応幅のレイアウトと...

Vue2.0の双方向データバインディング原則を手動で実装する

一言で言えば: データハイジャック (Object.defineProperty) + パブリッシュ...

Nodeはバックエンドの実装手順を素早く構築します

1. まず、node、express、express-generator をインストールします (4...

Linuxでpyファイルを直接実行する方法

1. まずファイルを作成します(ファイルを配置するディレクトリにcdします) myTest.py を...

Facebook 出会い系サイトデザインのユーザー エクスペリエンス分析

<br />関連記事: Facebookの情報アーキテクチャの分析 元記事: http:...

VueはExcelデータをエクスポートするパブリック関数メソッドをカプセル化します

vue+element UI は Excel データをエクスポートするためのパブリック関数をカプセル...

MySQLデータの重複チェックと重複排除の実装ステートメント

テーブル user があり、フィールドは id、nick_name、password、email、p...

Linux でユーザーをグループに追加する 4 つの方法の概要

序文Linux グループは、Linux でユーザー アカウントを管理するために使用される組織単位です...

MySQL 8.0.20 インストール チュートリアル (画像とテキスト付き) (Windows 64 ビット)

1: mysql公式サイトからダウンロードhttps://dev.mysql.com/downlo...

Vue要素のバックグラウンド認証プロセスの分析

序文:最近、プロジェクトで管理システムに遭遇しました。権限設定が非常に興味深いと思いました。自分の学...

新しい CSS display:box プロパティの詳細な説明

1. ディスプレイボックス;要素にこのプロパティを設定すると、display:inline-bloc...