Často jsme museli provádět výpočty na více řádcích, abychom získali data pro reportovací, statistické a analytické účely. V takových případech jsou užitečné agregační funkce dostupné v MySQL a musíme si být vědomi použití těchto funkcí k získání požadovaných dat. Tyto funkce zahrnují SUM, AVG, MAX, MIN, COUNT a DISTINCT.
Zbytek části tohoto návodu vysvětluje použití těchto agregačních funkcí.
Testovací data
Níže uvedené dotazy můžete použít k přípravě testovacích dat pro následující části. Vytvořte školní databázi a tabulky (uživatele a skóre), abyste porozuměli agregačním funkcím.
# 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`));
Nyní přidejte testovací data do uživatelské tabulky, jak je uvedeno níže.
# 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 );
Výše uvedený dotaz vloží 5 uživatelů pro sekce 1 a 2. Také vložte data skóre pomocí dotazu, jak je uvedeno níže.
# 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');
Vložili jsme skóre aktivních studentů. Všimněte si také, že skóre pro studenta s ID 1 a 2 se přičítá za sekci 1 pro všechny 3 předměty. Výše uvedený dotaz také vkládá data skóre studenta s ID 3 pro sekce 1 a 2. Student s ID 4 získal data skóre pro sekci 2. Nyní máme dobrá testovací data, abychom se mohli začít učit agregační funkce.
SOUČET
Tato část vysvětluje použití součtu agregovaných funkcí k získání skóre uživatelů po částech, abyste získali celkové skóre všech předmětů pro všechny sekce, jak je uvedeno níže.
# 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
Výše uvedené výsledky dotazu lze použít k předložení zprávy zobrazující celkové skóre všech uživatelů pro každou sekci, kterou ve škole studovali.
AVG
Agregační funkci AVG lze použít k získání průměrné hodnoty sloupců kvalifikovaných pro agregaci na základě podmínek WHERE a námi použitého seskupení.
Můžeme získat průměrné známky po částech v každém předmětu, jak je uvedeno níže.
# 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
Nyní můžeme použít výše uvedená data ke generování zprávy zobrazující průměrné skóre získané uživateli pro každou sekci.
MAX
Agregační funkci MAX lze použít ke zjištění maximální hodnoty sloupců kvalifikovaných pro agregaci na základě podmínek WHERE a námi použitého seskupení.
Můžeme získat maximální počet bodů po částech v každém předmětu, jak je uvedeno níže.
# 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
Agregační funkci MIN lze použít ke zjištění minimální hodnoty sloupců kvalifikovaných pro agregaci na základě podmínek WHERE a námi aplikovaného seskupení.
Můžeme získat minimální počet bodů po částech v každém předmětu, jak je uvedeno níže.
# 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
POČET
K získání celkového počtu hodnot v určených sloupcích lze použít agregační funkci COUNT.
Pomocí testovacích dat můžeme získat celkový počet aktivních uživatelů po částech, jak je uvedeno níže.
# 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
DISTINCT
Pro vynechání duplicitních záznamů můžeme použít klíčové slovo DISTINCT. V našem scénáři můžeme získat uživatelská data, kteří získali
# 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
Vidíme, že neaktivní uživatel, který ani jednou neskóroval, je z výsledků dotazu vynechán.
Takto můžeme použít agregační funkce k získání dat pro účely reportování a analýzy. Tyto funkce jsou také důležité pro manažerské činnosti při přijímání organizačních rozhodnutí pomocí dat nashromážděných v průběhu času.