sql >> Database >  >> RDS >> Mysql

Geaggregeerde functies gebruiken (SUM, AVG, MAX, MIN, COUNT, DISTINCT) in MySQL

We moesten vaak berekeningen uitvoeren op meerdere rijen om de gegevens te krijgen voor rapportage, statistische en analytische doeleinden. In dergelijke gevallen zijn de aggregatiefuncties die beschikbaar zijn in MySQL handig en we moeten ons bewust zijn van het gebruik van deze functies om de gewenste gegevens op te halen. Deze functies omvatten SUM, AVG, MAX, MIN, COUNT en DISTINCT.

In de rest van het gedeelte van deze tutorial wordt het gebruik van deze aggregatiefuncties uitgelegd.

Testgegevens

U kunt de onderstaande query's gebruiken om de testgegevens voor te bereiden om de volgende secties te volgen. Maak de schooldatabase en tabellen (gebruiker en score) om de aggregatiefuncties te begrijpen.

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

Voeg nu de testgegevens toe aan de gebruikerstabel zoals hieronder weergegeven.

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

De bovenstaande zoekopdracht voegt 5 gebruikers in voor secties 1 en 2. Voeg ook de scoregegevens in met behulp van de onderstaande zoekopdracht.

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

We hebben de score van de actieve leerlingen ingevoegd. Merk ook op dat de score voor de student met id 1 en 2 wordt toegevoegd voor sectie 1 voor alle 3 vakken. De bovenstaande query voegt ook de scoregegevens in van student met id 3 voor secties 1 en 2. De student met id 4 heeft de scoregegevens voor sectie 2. Nu hebben we goede testgegevens om de aggregatiefuncties te leren.

SOM

In deze sectie wordt het gebruik van de som van de geaggregeerde functie uitgelegd om de sectiegewijze score van de gebruikers te krijgen om de totale score van alle onderwerpen voor alle secties te krijgen, zoals hieronder weergegeven.

# 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

De bovenstaande zoekopdrachtresultaten kunnen worden gebruikt om het rapport te presenteren met de totale score van alle gebruikers voor elke sectie die ze in de school hebben bestudeerd.

AVG

De aggregatiefunctie AVG kan worden gebruikt om de gemiddelde waarde te krijgen van de kolommen die gekwalificeerd zijn voor de aggregatie op basis van de WHERE-voorwaarden en de door ons toegepaste groepering.

We kunnen de sectiegewijze gemiddelde cijfers voor elk onderwerp verkrijgen, zoals hieronder weergegeven.

# 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

Nu kunnen we de bovenstaande gegevens gebruiken om het rapport te genereren met de gemiddelde score die de gebruikers voor elke sectie hebben behaald.

MAX

De aggregatiefunctie MAX kan worden gebruikt om de maximale waarde te achterhalen van de kolommen die in aanmerking komen voor de aggregatie op basis van de WHERE-voorwaarden en de door ons toegepaste groepering.

We kunnen de maximale punten per sectie behalen voor elk onderwerp, zoals hieronder weergegeven.

# 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

De aggregatiefunctie MIN kan worden gebruikt om de minimumwaarde te achterhalen van de kolommen die in aanmerking komen voor de aggregatie op basis van de WHERE-voorwaarden en de door ons toegepaste groepering.

We kunnen de minimale punten per sectie behalen voor elk onderwerp, zoals hieronder weergegeven.

# 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

COUNT

De aggregatiefunctie COUNT kan worden gebruikt om het totale aantal waarden in de opgegeven kolommen te krijgen.

Met behulp van de testgegevens kunnen we het totale aantal actieve gebruikers per sectie krijgen, zoals hieronder weergegeven.

# 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

VERSCHILLEND

We kunnen het trefwoord DISTINCT gebruiken om dubbele records weg te laten. In ons scenario kunnen we de gebruikersgegevens ophalen die score voor ten minste één onderwerp met behulp van de onderstaande zoekopdracht.

# 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

We kunnen zien dat de inactieve gebruiker die niet één keer scoorde, wordt weggelaten uit de zoekopdrachtresultaten.

Dit is hoe we de geaggregeerde functies kunnen gebruiken om de gegevens te verkrijgen voor rapportage- en analysedoeleinden. Deze functies zijn ook belangrijk voor managementactiviteiten om organisatorische beslissingen te nemen met behulp van de gegevens die in de loop van de tijd zijn verzameld.


  1. UNION ALL-optimalisatie

  2. Bereken percentiel in MySQL op basis van totalen

  3. Hoe maak je een back-up van een enkele tabel in een postgres-database?

  4. Hoe u uw SQL Server-database documenteert?