Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di funzioni aggregate (SUM, AVG, MAX, MIN, COUNT, DISTINCT) in MySQL

Spesso abbiamo richiesto di eseguire calcoli su più righe per ottenere i dati a scopo di reportistica, statistico e analitico. In questi casi, le funzioni di aggregazione disponibili in MySQL sono utili e dobbiamo essere consapevoli di utilizzare queste funzioni per recuperare i dati desiderati. Queste funzioni includono SUM, AVG, MAX, MIN, COUNT e DISTINCT.

Il resto della sezione di questo tutorial spiega l'utilizzo di queste funzioni di aggregazione.

Dati di prova

È possibile utilizzare le query sotto menzionate per preparare i dati del test a seguire le sezioni successive. Crea il database della scuola e le tabelle (utente e punteggio) per comprendere le funzioni di aggregazione.

# 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`));

Ora aggiungi i dati del test alla tabella utente come mostrato di seguito.

# 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 );

La query precedente inserisce 5 utenti per le sezioni 1 e 2. Inoltre, inserisci i dati del punteggio utilizzando la query come mostrato di seguito.

# 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');

Abbiamo inserito il punteggio degli studenti attivi. Inoltre, si noti che il punteggio per lo studente con id 1 e 2 viene aggiunto per la sezione 1 per tutte e 3 le materie. La query precedente inserisce anche i dati del punteggio dello studente con ID 3 per le sezioni 1 e 2. Lo studente con ID 4 ha ottenuto i dati del punteggio per la sezione 2. Ora abbiamo buoni dati di test per iniziare ad apprendere le funzioni aggregate.

SOMMA

Questa sezione spiega l'uso della somma della funzione aggregata per ottenere il punteggio per sezione degli utenti per ottenere il punteggio totale di tutte le materie per tutte le sezioni come mostrato di seguito.

# 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

I risultati della query di cui sopra possono essere utilizzati per presentare il rapporto che mostra il punteggio totale di tutti gli utenti per ogni sezione che hanno studiato nella scuola.

MEDIA

La funzione di aggregazione AVG può essere utilizzata per ottenere il valore medio delle colonne qualificate per l'aggregazione in base alle condizioni WHERE e al raggruppamento da noi applicato.

Possiamo ottenere i voti medi per sezione in ciascuna materia come mostrato di seguito.

# 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

Ora possiamo utilizzare i dati di cui sopra per generare il report che mostra il punteggio medio ottenuto dagli utenti per ciascuna sezione.

MAX

La funzione di aggregazione MAX può essere utilizzata per scoprire il valore massimo delle colonne qualificate per l'aggregazione in base alle condizioni WHERE e al raggruppamento da noi applicato.

Possiamo ottenere i voti massimi per sezione in ciascuna materia come mostrato di seguito.

# 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

La funzione di aggregazione MIN permette di conoscere il valore minimo delle colonne qualificate per l'aggregazione in base alle condizioni WHERE e al raggruppamento da noi applicato.

Possiamo ottenere i voti minimi per sezione in ciascuna materia come mostrato di seguito.

# 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

CONTE

La funzione di aggregazione COUNT può essere utilizzata per ottenere il numero totale di valori nelle colonne specificate.

Utilizzando i dati del test, possiamo ottenere il totale degli utenti attivi per sezione come mostrato di seguito.

# 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

DISTINTA

Possiamo utilizzare la parola chiave DISTINCT per omettere record duplicati. Nel nostro scenario, possiamo ottenere i dati dell'utente che hanno ottenuto punteggio per almeno un soggetto utilizzando la query come mostrato di seguito.

# 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

Possiamo vedere che l'utente inattivo che non ha segnato nemmeno una volta viene omesso dai risultati della query.

In questo modo possiamo utilizzare le funzioni aggregate per ottenere i dati a scopo di reportistica e analisi. Queste funzioni sono importanti anche per le attività manageriali per prendere decisioni organizzative utilizzando i dati accumulati nel tempo.