MySQL / GROUP BY ба HAVING
GROUP BY ба HAVING
GROUP BY нь мөрүүдийг бүлэглэж, бүлэг тус бүрт aggregate функц ажиллуулна. HAVING нь тэр бүлгүүдэд нөхцөл тавьдаг.
Суурь жишээ
sql
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer TEXT NOT NULL,
product TEXT NOT NULL,
amount DECIMAL(10,2),
quantity INT
);
INSERT INTO orders (customer, product, amount, quantity) VALUES
('Болд', 'Ном', 15000, 2),
('Оюун', 'Дэвтэр', 3500, 5),
('Болд', 'Үзэг', 1200, 3),
('Дорж', 'Ном', 15000, 1),
('Оюун', 'Ном', 15000, 3),
('Дорж', 'Дэвтэр', 3500, 4),
('Болд', 'Дэвтэр', 3500, 6);
GROUP BY — нэг баганаар бүлэглэх
sql
-- Хэрэглэгч тус бүрийн нийт захиалга
SELECT customer, COUNT(*) AS захиалга
FROM orders
GROUP BY customer;
код
customer | захиалга
---------|--------
Болд | 3
Оюун | 2
Дорж | 2
sql
-- Хэрэглэгч тус бүрийн нийт зарцуулалт
SELECT customer, SUM(amount) AS нийт
FROM orders
GROUP BY customer;
GROUP BY — олон баганаар бүлэглэх
sql
-- Хэрэглэгч ба бараагаар бүлэглэх
SELECT customer, product, SUM(quantity) AS нийт_тоо
FROM orders
GROUP BY customer, product
ORDER BY customer;
код
customer | product | нийт_тоо
---------|---------|--------
Болд | Дэвтэр | 6
Болд | Ном | 2
Болд | Үзэг | 3
Дорж | Дэвтэр | 4
Дорж | Ном | 1
Оюун | Дэвтэр | 5
Оюун | Ном | 3
HAVING — бүлэгт нөхцөл
WHERE нь бүлэглэхээс өмнө мөр шүүнэ. HAVING нь бүлэглэсний дараа шүүнэ.
sql
-- 2-оос дээш захиалга хийсэн хэрэглэгчид
SELECT customer, COUNT(*) AS захиалга
FROM orders
GROUP BY customer
HAVING COUNT(*) > 2;
код
customer | захиалга
---------|--------
Болд | 3
sql
-- Нийт 10,000-аас дээш зарцуулсан хэрэглэгчид
SELECT customer, SUM(amount) AS нийт
FROM orders
GROUP BY customer
HAVING SUM(amount) > 10000;
WHERE vs HAVING ялгаа
sql
-- WHERE: бүлэглэхийн ӨМНӨ шүүнэ (мөр шүүнэ)
SELECT customer, SUM(amount) AS нийт
FROM orders
WHERE product = 'Ном' -- эхлээд зөвхөн Номын мөрүүдийг авна
GROUP BY customer;
-- HAVING: бүлэглэсний ДАРАА шүүнэ (бүлэг шүүнэ)
SELECT customer, SUM(amount) AS нийт
FROM orders
GROUP BY customer
HAVING nийт > 15000; -- бүлгийн нийлбэрт нөхцөл тавьна
Хоёуланг нэгэн зэрэг хэрэглэж болно:
sql
SELECT customer, SUM(amount) AS нийт
FROM orders
WHERE product != 'Үзэг' -- Үзэг бус бараануудаас
GROUP BY customer
HAVING SUM(amount) > 10000 -- нийт 10,000-аас их хэрэглэгчид
ORDER BY нийт DESC;
Query-н гүйцэтгэлийн дараалал
MySQL-д SQL мэдэгдлийн гүйцэтгэх дараалал бичих дарааллаас өөр:
код
1. FROM — хаанаас авах
2. WHERE — мөр шүүх
3. GROUP BY — бүлэглэх
4. HAVING — бүлэг шүүх
5. SELECT — харуулах багана
6. ORDER BY — эрэмблэх
7. LIMIT — тоолох
Тиймээс HAVING дотор SELECT-д өгсөн alias ашиглаж болохгүй — MySQL зарим тохиолдолд зөвшөөрдөг ч найдах хэрэггүй:
sql
-- Найдвартай (aggregate функц давтах)
HAVING SUM(amount) > 10000
-- MySQL-д ажиллаж болох ч стандарт биш
HAVING нийт > 10000
Дараагийн хичээлд:
Subquery — query дотор дахин query бичих арга, EXISTS, IN, ANY, ALL операторуудыг үзнэ.