🧚 Άκου! Το Beekeeper Studio είναι ένα γρήγορο, σύγχρονο και open source GUI για βάσεις δεδομένων Λήψη
8 Ιανουαρίου 2026 Από τον Matthew Rathbone

Το GROUP BY συγκεντρώνει σε ομάδες τις γραμμές που έχουν την ίδια τιμή, ώστε οι συναρτήσεις συνάθροισης όπως οι COUNT, SUM και AVG να επιστρέφουν ένα αποτέλεσμα ανά ομάδα αντί για ένα για όλο τον πίνακα. Τα παραδείγματα λειτουργούν σε PostgreSQL, MySQL, SQLite και SQL Server.

Πώς να χρησιμοποιήσεις το GROUP BY

Γράψε τη στήλη ομαδοποίησης μετά το GROUP BY και βάλε κάθε άλλη στήλη που επιλέγεις μέσα σε μια συνάρτηση συνάθροισης: COUNT, SUM, AVG, MIN ή MAX. Παίρνεις μία γραμμή για κάθε διακριτή τιμή:

SELECT group_column, AGGREGATE(value_column)
FROM table_name
GROUP BY group_column;
-- Input: scores
-- player | team | points
-- -------+------+-------
-- Ana    | Red  | 12
-- Ben    | Blue | 9
-- Cleo   | Red  | 7
-- Dev    | Blue | 15
-- Eli    | Red  | 4

SELECT team, SUM(points) AS total_points, COUNT(*) AS players
FROM scores
GROUP BY team;

-- Output:
-- team | total_points | players
-- -----+--------------+--------
-- Red  | 23           | 3
-- Blue | 24           | 2

Οι πέντε γραμμές γίνονται δύο, μία ανά ομάδα, και κάθε συνάθροιση βλέπει μόνο τις γραμμές της δικής της ομάδας.

Κανόνες που πρέπει να ξέρεις

  • Κάθε στήλη που επιλέγεις πρέπει να είναι στο GROUP BY ή μέσα σε συνάθροιση. Αλλιώς δεν υπάρχει μία μοναδική τιμή να εμφανιστεί για την ομάδα και το query αποτυγχάνει:
-- Input: products
-- name    | category
-- --------+---------
-- Blender | Kitchen
-- Toaster | Kitchen
-- Pillow  | Bedroom

SELECT name, category, COUNT(*) AS product_count
FROM products
GROUP BY category;

-- ERROR: column "products.name" must appear in the GROUP BY clause
--   or be used in an aggregate function
-- (SQLite runs it anyway and takes name from one row in each group)

Διόρθωσέ το προσθέτοντας τη στήλη στο GROUP BY ή κάνοντας και αυτήν συνάθροιση, για παράδειγμα με MIN(name).

  • Τα NULL σχηματίζουν μία ομάδα. Κάθε γραμμή με NULL στη στήλη ομαδοποίησης καταλήγει στην ίδια ομάδα. Χρησιμοποίησε το COALESCE για να της δώσεις ετικέτα:
-- Input: products
-- name        | category
-- ------------+-----------
-- Notebook    | Stationery
-- Gift Card   | NULL
-- Pen Set     | Stationery
-- Mystery Box | NULL
-- Stapler     | Stationery

SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category;

-- Output:
-- category   | product_count
-- -----------+--------------
-- NULL       | 2
-- Stationery | 3

SELECT COALESCE(category, 'Uncategorized') AS category, COUNT(*) AS product_count
FROM products
GROUP BY category;

-- Output:
-- category      | product_count
-- --------------+--------------
-- Uncategorized | 2
-- Stationery    | 3
  • Το WHERE φιλτράρει γραμμές πριν την ομαδοποίηση, το HAVING φιλτράρει ομάδες μετά. Μόνο το HAVING μπορεί να ελέγξει μια συνάθροιση όπως COUNT(*) > 2. Ό,τι δεν χρειάζεται συνάθροιση ανήκει στο WHERE, ώστε να ομαδοποιούνται λιγότερες γραμμές.
  • Οι ομάδες επιστρέφονται χωρίς συγκεκριμένη σειρά. Οι SQLite και SQL Server, για παράδειγμα, εμφανίζουν το Blue πριν το Red στο παραπάνω query με τους βαθμούς. Πρόσθεσε ORDER BY όποτε η σειρά έχει σημασία.

Εναλλακτική σύνταξη

Μπορείς να ομαδοποιήσεις με βάση ένα alias στήλης ή τη θέση της στήλης στη λίστα του SELECT, αντί να επαναλαμβάνεις μια έκφραση:

-- Input: orders
-- order_id | amount
-- ---------+-------
-- 1        | 35.00
-- 2        | 240.00
-- 3        | 18.50
-- 4        | 120.00
-- 5        | 64.00

SELECT CASE WHEN amount >= 100 THEN 'large' ELSE 'small' END AS order_size,
       COUNT(*) AS order_count
FROM orders
GROUP BY order_size  -- or GROUP BY 1
ORDER BY order_size;
-- SQL Server allows neither: repeat the CASE expression in GROUP BY

-- Output:
-- order_size | order_count
-- -----------+------------
-- large      | 2
-- small      | 3

Το ROLLUP προσθέτει μερικά σύνολα και ένα γενικό σύνολο. Οι γραμμές μερικών συνόλων δείχνουν NULL στις στήλες που αθροίζουν:

-- Input: sales
-- region | category | amount
-- -------+----------+-------
-- East   | Books    | 100.00
-- East   | Toys     | 50.00
-- West   | Books    | 80.00
-- East   | Books    | 40.00

SELECT region, category, SUM(amount) AS total_sales
FROM sales
GROUP BY ROLLUP(region, category);
-- MySQL: GROUP BY region, category WITH ROLLUP
-- SQLite has no ROLLUP

-- Output:
-- region | category | total_sales
-- -------+----------+------------
-- East   | Books    | 140.00
-- East   | Toys     | 50.00
-- East   | NULL     | 190.00
-- West   | Books    | 80.00
-- West   | NULL     | 80.00
-- NULL   | NULL     | 270.00

Ένα GROUP BY χωρίς συνάθροιση επιστρέφει κάθε διακριτή τιμή μία φορά, όπως το SELECT DISTINCT category FROM products.

Πότε να χρησιμοποιείς το GROUP BY;

Χρησιμοποίησε GROUP BY όποτε μια ερώτηση λέει «ανά» ή «για κάθε»: παραγγελίες ανά πελάτη, πωλήσεις ανά μήνα, υπάλληλοι ανά τμήμα. Οι περισσότερες χρήσεις ανήκουν σε μία από τις εξής τέσσερις.

Μέτρησε τις γραμμές σε κάθε ομάδα

Πόσες παραγγελίες έχει κάθε κατάσταση, πόσα προϊόντα υπάρχουν σε κάθε κατηγορία, πόσοι εγγράφηκαν κάθε μέρα. Το COUNT(*) μετράει κάθε γραμμή της ομάδας και το COUNT(column) μετράει μόνο τις γραμμές όπου η στήλη δεν είναι NULL.

Σύνολο, μέσος όρος ή εύρος για κάθε ομάδα

Οι SUM, AVG, MIN και MAX μετατρέπουν τις τιμές κάθε ομάδας σε έναν αριθμό: έσοδα ανά πελάτη, μέση αξία παραγγελίας, το φθηνότερο και το ακριβότερο προϊόν μιας κατηγορίας. Ένα query μπορεί να επιστρέψει όσες από αυτές χρειάζεσαι.

Ανάλυσε τα αποτελέσματα με βάση πολλές στήλες

Γράψε πολλές στήλες μετά το GROUP BY για να πάρεις μία γραμμή για κάθε συνδυασμό: πωλήσεις ανά περιοχή ανά μήνα, απόθεμα ανά αποθήκη ανά τύπο προϊόντος. Εμφανίζονται μόνο οι συνδυασμοί που υπάρχουν στα δεδομένα.

Κράτα μόνο τις ομάδες που σε ενδιαφέρουν

Το HAVING φιλτράρει τις ομάδες αφού σχηματιστούν, με βάση τις συναθροίσεις τους: τμήματα με πάνω από δέκα άτομα, πελάτες που ξόδεψαν πάνω από $1,000 ή τιμές που εμφανίζονται πάνω από μία φορά, που είναι ο τρόπος να βρεις διπλότυπα.

Πραγματικά παραδείγματα GROUP BY

Μέτρησε τα προϊόντα σε κάθε κατηγορία, ακόμα και στις άδειες

Το GROUP BY δημιουργεί ομάδες μόνο για τιμές που υπάρχουν. Για να εμφανίσεις και κατηγορίες χωρίς προϊόντα, ξεκίνα από τον πίνακα categories και κάνε LEFT JOIN τα products. Μέτρησε μια στήλη του πίνακα που ενώνεις αντί για *: μια άδεια κατηγορία παίρνει κι αυτή μία γραμμή, γεμάτη NULL, και το COUNT(*) τη μετράει.

-- Input: categories
-- category_name
-- -------------
-- Audio
-- Cameras
-- Drones

-- Input: products
-- id | name       | category
-- ---+------------+---------
-- 1  | Earbuds    | Audio
-- 2  | Soundbar   | Audio
-- 3  | Action Cam | Cameras

-- Wrong: COUNT(*) counts the NULL row of an empty category
SELECT c.category_name, COUNT(*) AS product_count
FROM categories c
LEFT JOIN products p ON p.category = c.category_name
GROUP BY c.category_name
ORDER BY c.category_name;

-- Output:
-- category_name | product_count
-- --------------+--------------
-- Audio         | 2
-- Cameras       | 1
-- Drones        | 1

-- Right: COUNT(p.id) skips it
SELECT c.category_name, COUNT(p.id) AS product_count
FROM categories c
LEFT JOIN products p ON p.category = c.category_name
GROUP BY c.category_name
ORDER BY c.category_name;

-- Output:
-- category_name | product_count
-- --------------+--------------
-- Audio         | 2
-- Cameras       | 1
-- Drones        | 0

Βρες τις τρεις κορυφαίες κατηγορίες σε έσοδα

Άθροισε τις πωλήσεις κάθε κατηγορίας, ταξινόμησε με βάση το σύνολο και κράτα τις τρεις πρώτες. Το Books βγαίνει δεύτερο, παρόλο που κάθε πώλησή του είναι μικρότερη από τη μία πώληση του Toys:

-- Input: purchases
-- category | amount
-- ---------+-------
-- Books    | 45.00
-- Toys     | 120.00
-- Garden   | 310.00
-- Books    | 80.00
-- Music    | 25.00

SELECT category, SUM(amount) AS revenue
FROM purchases
GROUP BY category
ORDER BY revenue DESC
LIMIT 3;
-- SQL Server has no LIMIT: write SELECT TOP 3 category, ... instead

-- Output:
-- category | revenue
-- ---------+--------
-- Garden   | 310.00
-- Books    | 125.00
-- Toys     | 120.00

Αναφορά πωλήσεων ανά περιοχή ανά μήνα

Ομαδοποίησε με βάση την περιοχή και τον μήνα που εξάγεται από την ημερομηνία, ώστε κάθε περιοχή να έχει μία γραμμή ανά μήνα:

-- Input: sales
-- region | sale_date  | amount
-- -------+------------+-------
-- East   | 2024-01-08 | 120.00
-- West   | 2024-01-15 | 80.00
-- East   | 2024-01-22 | 95.00
-- East   | 2024-02-03 | 60.00
-- West   | 2024-02-11 | 150.00

SELECT region, EXTRACT(MONTH FROM sale_date) AS month, SUM(amount) AS total_sales
FROM sales
GROUP BY region, EXTRACT(MONTH FROM sale_date)
ORDER BY region, month;

-- Output:
-- region | month | total_sales
-- -------+-------+------------
-- East   | 1     | 215.00
-- East   | 2     | 60.00
-- West   | 1     | 80.00
-- West   | 2     | 150.00

Οι SQL Server και SQLite δεν έχουν EXTRACT. Χρησιμοποίησε MONTH(sale_date) στον SQL Server και strftime('%m', sale_date) στη SQLite. Ομαδοποίησε και με βάση το έτος όταν τα δεδομένα σου καλύπτουν περισσότερα από ένα.

Βρες τους πελάτες που ξαναγόρασαν φέτος

Το WHERE κρατά μόνο τις παραγγελίες του 2024 και μετά το HAVING κρατά τους πελάτες με τουλάχιστον δύο από αυτές. Ο πελάτης 202 έχει συνολικά δύο παραγγελίες αλλά μόνο μία το 2024, οπότε μένει εκτός:

-- Input: orders
-- order_id | customer_id | order_date
-- ---------+-------------+-----------
-- 1        | 201         | 2023-11-20
-- 2        | 202         | 2023-12-05
-- 3        | 201         | 2024-01-09
-- 4        | 202         | 2024-02-14
-- 5        | 201         | 2024-03-02

SELECT customer_id, COUNT(*) AS orders_2024
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) >= 2;

-- Output:
-- customer_id | orders_2024
-- ------------+------------
-- 201         | 2

Περισσότερα για το GROUP BY

Σε αυτό το blog:

Επίσημη τεκμηρίωση:

Το Beekeeper Studio είναι ένα δωρεάν & open source GUI για βάσεις δεδομένων

Το καλύτερο εργαλείο για SQL queries & επεξεργασία που έχω χρησιμοποιήσει ποτέ. Μου δίνει ό,τι χρειάζομαι για να διαχειρίζομαι τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit

Το Beekeeper Studio είναι γρήγορο, εύχρηστο και κατανοητό με την πρώτη ματιά. Υποστηρίζει πάρα πολλές βάσεις δεδομένων και δουλεύει άψογα σε Windows, Mac και Linux.

Η έκδοση του Beekeeper για Linux έχει 100% όλες τις λειτουργίες, χωρίς εκπτώσεις και χωρίς συμβιβασμούς.

Τι λένε οι χρήστες για το Beekeeper Studio

★★★★★
«Το Beekeeper Studio αντικατέστησε εντελώς την παλιά μου ροή εργασίας με SQL. Είναι γρήγορο, εύχρηστο και κάνει τη δουλειά με βάσεις δεδομένων ξανά απολαυστική.»
— Alex K., Database Developer
★★★★★
«Έχω δοκιμάσει πολλά GUI για βάσεις δεδομένων, αλλά το Beekeeper βρίσκει την τέλεια ισορροπία ανάμεσα σε δυνατότητες και απλότητα. Απλώς δουλεύει.»
— Sarah M., Full Stack Engineer

Έτοιμος να βελτιώσεις τη ροή εργασίας σου με SQL;

download Κατέβασέ το δωρεάν