Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von Aggregatfunktionen (SUM, AVG, MAX, MIN, COUNT, DISTINCT) in MySQL

Wir mussten oft Berechnungen für mehrere Zeilen durchführen, um die Daten für Berichte, statistische und analytische Zwecke zu erhalten. In solchen Fällen sind die in MySQL verfügbaren Aggregationsfunktionen praktisch, und wir müssen uns bewusst sein, diese Funktionen zu verwenden, um die gewünschten Daten abzurufen. Zu diesen Funktionen gehören SUM, AVG, MAX, MIN, COUNT und DISTINCT.

Der Rest des Abschnitts dieses Tutorials erklärt die Verwendung dieser Aggregationsfunktionen.

Testdaten

Sie können die unten aufgeführten Abfragen verwenden, um die Testdaten für die folgenden Abschnitte vorzubereiten. Erstellen Sie die Schuldatenbank und Tabellen (Benutzer und Punktzahl), um die Aggregationsfunktionen zu verstehen.

# Create the database
CREATE SCHEMA `school` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

# Create the user table
CREATE TABLE `school`.`user` (
`user_id` BIGINT NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(45) NOT NULL,
`last_name` VARCHAR(45) NULL,
`section` SMALLINT(6) NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`user_id`));

# Create the score table
CREATE TABLE `school`.`score` (
`score_id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`section` SMALLINT(6) NOT NULL DEFAULT 1,
`subject` VARCHAR(45) NOT NULL,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
PRIMARY KEY (`score_id`));

Fügen Sie nun die Testdaten wie unten gezeigt zur Benutzertabelle hinzu.

# User data
INSERT INTO `user` ( `user_id`, `first_name`, `last_name`, `section`, `active` ) VALUES
( 1, 'John', 'Smith', 1, 1 ),
( 2, 'Rick', 'Jones', 1, 1 ),
( 3, 'Catherine', 'Ponting', 2, 1 ),
( 4, 'Harsh', 'Upadhyay', 2, 1 ),
( 5, 'Tajwinder', 'Singh', 2, 0 );

Die obige Abfrage fügt 5 Benutzer für die Abschnitte 1 und 2 ein. Fügen Sie außerdem die Punktzahldaten mit der Abfrage wie unten gezeigt ein.

# Score data
INSERT INTO `school`.`score` (`score_id`, `user_id`, `section`, `subject`, `score`) VALUES
('1', '1', '1', 'Maths', '86'),
('2', '1', '1', 'Physics', '75'),
('3', '1', '1', 'Chemistry', '90'),
('4', '2', '1', 'Maths', '64'),
('5', '2', '1', 'Physics', '98'),
('6', '2', '1', 'Chemistry', '56'),
('7', '3', '1', 'Maths', '48'),
('8', '3', '1', 'Physics', '69'),
('9', '3', '1', 'Chemistry', '54'),
('10', '3', '2', 'Maths', '82'),
('11', '3', '2', 'Physics', '85'),
('12', '3', '2', 'Chemistry', '91'),
('13', '4', '2', 'Maths', '65'),
('14', '4', '2', 'Physics', '74'),
('15', '4', '2', 'Chemistry', '84');

Wir haben die Punktzahl der aktiven Schüler eingefügt. Beachten Sie auch, dass die Punktzahl für den Schüler mit den IDs 1 und 2 für Abschnitt 1 für alle 3 Fächer hinzugefügt wird. Die obige Abfrage fügt auch die Punktzahldaten des Schülers mit der ID 3 für die Abschnitte 1 und 2 ein. Der Schüler mit der ID 4 hat die Punktzahldaten für Abschnitt 2 erhalten. Jetzt haben wir gute Testdaten, um mit dem Erlernen der Aggregatfunktionen zu beginnen.

SUMME

In diesem Abschnitt wird die Verwendung der Summenfunktion erklärt, um die abschnittsweise Punktzahl der Benutzer zu erhalten, um die Gesamtpunktzahl aller Fächer für alle Abschnitte zu erhalten, wie unten gezeigt.

# SUM - Total Score of the Users for each section
SELECT `user`.`first_name`, `user`.`last_name`, `score`.`section`, SUM(`score`) AS total_score FROM `user`, `score`
WHERE `user`.`user_id` = `score`.`user_id`
GROUP BY `score`.`user_id`, `score`.`section`;

# Result

first_name last_name section total_score
----------------------------------------------------
John Smith 1 251
Rick Jones 1 218
Catherine Ponting 1 171
Catherine Ponting 2 258
Harsh Upadhyay 2 223

Die obigen Abfrageergebnisse können verwendet werden, um den Bericht zu präsentieren, der die Gesamtpunktzahl aller Benutzer für jeden Abschnitt zeigt, den sie an der Schule studiert haben.

Durchschn.

Die Aggregatfunktion AVG kann verwendet werden, um den Durchschnittswert der für die Aggregation qualifizierten Spalten basierend auf den WHERE-Bedingungen und der von uns angewendeten Gruppierung zu erhalten.

Wir können die abschnittsweisen Durchschnittsnoten in jedem Fach wie unten gezeigt erhalten.

# AVG - Section wise average score in each subject
SELECT `score`.`section`, `score`.`subject`, AVG(`score`) AS avg_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;

# Result

section subject avg_score
--------------------------------------------
1 Maths 66.0000
1 Physics 80.6667
1 Chemistry 66.6667
2 Maths 73.5000
2 Physics 79.5000
2 Chemistry 87.5000

Jetzt können wir die obigen Daten verwenden, um den Bericht zu erstellen, der die durchschnittliche Punktzahl zeigt, die die Benutzer für jeden Abschnitt erhalten haben.

MAX

Mit der Aggregatfunktion MAX kann anhand der WHERE-Bedingungen und der von uns angewandten Gruppierung der Maximalwert der für die Aggregation qualifizierten Spalten ermittelt werden.

Wir können die abschnittsweise Höchstpunktzahl in jedem Fach wie unten gezeigt erhalten.

# MAX - Section wise maximum score in each subject
SELECT `score`.`section`, `score`.`subject`, MAX(`score`) AS max_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;

# Result

section subject max_score
--------------------------------------------
1 Maths 86
1 Physics 98
1 Chemistry 90
2 Maths 82
2 Physics 85
2 Chemistry 91

MIN

Mit der Aggregatfunktion MIN kann anhand der WHERE-Bedingungen und der von uns angewandten Gruppierung der Mindestwert der für die Aggregation qualifizierten Spalten ermittelt werden.

Wir können die abschnittsweise Mindestpunktzahl in jedem Fach wie unten gezeigt erhalten.

# MIN - Section wise minimum score in each subject
SELECT `score`.`section`, `score`.`subject`, MIN(`score`) AS min_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;

# Result

section subject max_score
--------------------------------------------
1 Maths 48
1 Physics 69
1 Chemistry 54
2 Maths 65
2 Physics 74
2 Chemistry 84

ZÄHLEN

Die Aggregatfunktion COUNT kann verwendet werden, um die Gesamtzahl der Werte in den angegebenen Spalten zu erhalten.

Anhand der Testdaten können wir die abschnittsweise Gesamtzahl der aktiven Benutzer ermitteln, wie unten gezeigt.

# COUNT - Total active users in each section
SELECT `user`.`section`, COUNT(`user_id`) AS active_users FROM `user`
WHERE `user`.`active` = 1
GROUP BY `user`.`section`;

# Result
section active_user
--------------------
1 2
2 2

UNTERSCHIEDLICH

Wir können das Schlüsselwort DISTINCT verwenden, um doppelte Datensätze wegzulassen. In unserem Szenario können wir die Benutzerdaten abrufen, die Punktzahl für mindestens ein Thema mit der unten gezeigten Abfrage.

# DISTINCT - Get list of users who got score
SELECT DISTINCT `user`.`user_id`, `user`.`first_name`, `user`.`last_name` FROM `user`, `score`
WHERE `user`.`user_id` = `score`.`user_id`;

# Result

user_id first_name last_name
--------------------------------------------
1 John Smith
2 Rick Jones
3 Catherine Ponting
4 Harsh Upadhyay

Wir können sehen, dass der inaktive Benutzer, der nicht einmal ein Ergebnis erzielt hat, aus den Abfrageergebnissen weggelassen wird.

Auf diese Weise können wir die Aggregatfunktionen verwenden, um die Daten für Berichts- und Analysezwecke zu erhalten. Diese Funktionen sind auch für Managementaktivitäten wichtig, um organisatorische Entscheidungen anhand der im Laufe der Zeit gesammelten Daten zu treffen.