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

推薦する

win10 64 ビット システムに複数の JDK バージョンをインストールする際の切り替え問題と解決策の概要

コンピューターにmyeclipse2017とidea2017がインストールされているため、ideaが...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

GTK ツリービューの原理と使用法の分析

GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...

複数レベルの複雑な動的ヘッダーの avue-crud 実装例

目次序文バックグラウンドデータの結合フロントエンドデータ表示ページ効果表示Avue.js は、既存の...

mysql-canal-rabbitmq のインストールと展開の非常に詳細なチュートリアル

目次1.1. MySQL binlog を有効にする1.2. RabbitMQ の交換とキューを構成...

MySQL 学習のまとめ: InnoDB ストレージ エンジンのアーキテクチャ設計の予備的な理解

1. ストレージエンジン前のセクションでは、SQL 実行プランは、エグゼキュータ コンポーネントがス...

Linux での MySQL 5.1 および 5.7 のインストール チュートリアル

以下のコンテンツのオペレーティング システムは次のとおりです: Centos 6.7 yum で M...

ウェブデザインの仕事に応募する方法

<br />みなさんこんにちは!ここで皆さんとチャットできて光栄です! (*^__^*)...

Nginx における 2 つの現在の制限方法についての簡単な説明

負荷は通常、システム設計時に予測されます。システムがパブリック ネットワークに公開されている場合、悪...

HTML の空リンク href="#" と href="javascript:void(0)" の違い

# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...

Docker 基本チュートリアル: Dockerfile 構文の詳細な説明

序文Dockerfile は Docker プログラムによって解釈されるスクリプトです。Docker...

CentOS6.9+Mysql5.7.18 ソースコードのインストール詳細チュートリアル

CentOS6.9+Mysql5.7.18 ソースコードのインストールでは、以下の操作を root ...

Keepalived を使用して Nginx の自動再起動とデュアルアクティブ ホットスタンバイの高可用性を実現する方法について

目次1. 概要2. Keepalivedを使用してNginxを自動的に再起動する2.1 シェルスクリ...

VMware での Ubuntu Docker のインストール (コンテナ構築)

1. マインドマップ 2. コンテナの構築方法2.1 実験環境の準備(1)環境選択管理ツール: D...

Ubuntu インストール cuda10.1 ドライバ実装手順

1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...