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

Ένας προσωρινός πίνακας (temp table) υπάρχει μόνο όσο διαρκεί η σύνδεσή σου με τη βάση δεδομένων. Τον γεμίζεις με γραμμές, κάνεις query σε αυτόν όπως σε κάθε άλλο πίνακα, και η βάση τον διαγράφει για σένα όταν αποσυνδεθείς. Τα παραδείγματα λειτουργούν σε PostgreSQL, MySQL, SQLite και SQL Server.

Πώς να χρησιμοποιήσεις προσωρινούς πίνακες στην SQL

Δημιούργησε έναν προσωρινό πίνακα όπως έναν κανονικό, με τη λέξη-κλειδί TEMPORARY. Συνήθως τον γεμίζεις απευθείας από ένα query:

CREATE TEMPORARY TABLE table_name AS
SELECT ...;

Ο SQL Server είναι η εξαίρεση: ένα # στην αρχή του ονόματος κάνει τον πίνακα προσωρινό, και το SELECT ... INTO τον δημιουργεί και τον γεμίζει.

-- Input: orders
-- id | customer | total | status
-- ---+----------+-------+---------
-- 1  | Maria    | 120   | paid
-- 2  | Tom      | 35    | refunded
-- 3  | Priya    | 89    | paid

CREATE TEMPORARY TABLE paid_orders AS
SELECT id, customer, total FROM orders WHERE status = 'paid';
-- SQL Server: SELECT id, customer, total INTO #paid_orders FROM orders WHERE status = 'paid';

SELECT * FROM paid_orders;  -- #paid_orders in SQL Server

-- Output:
-- id | customer | total
-- ---+----------+------
-- 1  | Maria    | 120
-- 3  | Priya    | 89

Μπορείς επίσης να ορίσεις πρώτα τις στήλες και να εισαγάγεις γραμμές αργότερα, όπως σε έναν μόνιμο πίνακα:

CREATE TEMPORARY TABLE temp_students (  -- SQL Server: CREATE TABLE #temp_students (
  student_id INT PRIMARY KEY,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  age INT
);

INSERT INTO temp_students (student_id, first_name, last_name, age)
VALUES (1, 'John', 'Doe', 20);

SELECT * FROM temp_students;

-- Output:
-- student_id | first_name | last_name | age
-- -----------+------------+-----------+----
-- 1          | John       | Doe       | 20

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

  • Τον βλέπει μόνο η δική σου σύνδεση. Άλλες συνδέσεις δεν μπορούν να τον διαβάσουν, και η βάση τον διαγράφει όταν τελειώσει η σύνδεσή σου. Αν η εφαρμογή σου χρησιμοποιεί connection pool, δημιούργησε τον προσωρινό πίνακα και κάνε query σε αυτόν στην ίδια σύνδεση.
  • Κρύβει έναν μόνιμο πίνακα με το ίδιο όνομα. Μόλις δημιουργήσεις έναν προσωρινό πίνακα με όνομα orders, κάθε query στο orders διαβάζει τον προσωρινό πίνακα μέχρι να τον διαγράψεις, οπότε διάλεξε ονόματα που δεν συγκρούονται. Το πρόθεμα # του SQL Server το αποφεύγει αυτό.
  • Αν τον δημιουργήσεις δύο φορές, αποτυγχάνει. Τρέξε το ίδιο script δύο φορές στην ίδια σύνδεση και το CREATE αποτυγχάνει, επειδή ο πίνακας υπάρχει ήδη. Διάγραψέ τον πρώτα:
DROP TABLE IF EXISTS paid_orders;
-- In MySQL, DROP TEMPORARY TABLE IF EXISTS can never drop a permanent table by mistake
  • Η MySQL δεν μπορεί να διαβάσει έναν προσωρινό πίνακα δύο φορές στο ίδιο query. Ένα self-join ή ένα subquery στον ίδιο προσωρινό πίνακα αποτυγχάνει με ERROR 1137 (HY000): Can't reopen table. Φτιάξε ένα δεύτερο αντίγραφο αν το χρειάζεσαι.

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

  • Το CREATE TEMP TABLE είναι μια συντομότερη μορφή που δέχονται η PostgreSQL και η SQLite. Η MySQL όχι.
  • Οι καθολικοί προσωρινοί πίνακες του SQL Server ξεκινούν με δύο δίεσες, ##paid_orders. Κάθε σύνδεση μπορεί να τους διαβάσει, και ο SQL Server τους διαγράφει όταν τελειώσει η σύνδεση που τους δημιούργησε.
  • Ένα CTE κάνει την ίδια δουλειά όταν τις γραμμές τις χρειάζεται μόνο ένα query. Δεν αποθηκεύεται τίποτα, άρα δεν έχεις τίποτα να διαγράψεις:
-- Input: the orders table above

WITH paid_orders AS (
  SELECT id, customer, total FROM orders WHERE status = 'paid'
)
SELECT * FROM paid_orders;

-- Output:
-- id | customer | total
-- ---+----------+------
-- 1  | Maria    | 120
-- 3  | Priya    | 89

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

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

Ξαναχρησιμοποίησε τις ίδιες γραμμές σε πολλά queries

Όταν πολλές αναφορές ξεκινούν από τις ίδιες φιλτραρισμένες γραμμές, όπως οι παραγγελίες του μήνα ή τα ενεργά έργα, αποθήκευσέ τες μία φορά και κάνε query στον προσωρινό πίνακα αντί να επαναλαμβάνεις το φίλτρο κάθε φορά.

Αποθήκευσε σύνολα που θέλεις να φιλτράρεις ή να ξαναχρησιμοποιήσεις

Κάνε τη συγκέντρωση μία φορά με GROUP BY και κράτα τα σύνολα σε έναν προσωρινό πίνακα. Μετά μπορείς να τα φιλτράρεις, να τα κατατάξεις ή να τα συγκρίνεις με τον δικό τους μέσο όρο χωρίς να τα ξαναϋπολογίσεις.

Σπάσε ένα σύνθετο query σε βήματα

Ένα query με πολλά επίπεδα subqueries διαβάζεται και διορθώνεται δύσκολα. Φτιάξε κάθε βήμα ως προσωρινό πίνακα, έλεγξε τις γραμμές του και μετά κάνε join με τους μόνιμους πίνακές σου στο επόμενο βήμα.

Δοκίμασε αλλαγές σε αντίγραφο

Πριν τρέξεις ένα UPDATE ή DELETE σε πραγματικά δεδομένα, αντίγραψε τον πίνακα σε έναν προσωρινό και τρέξ' το εκεί. Βλέπεις τι αλλάζει, και το πρωτότυπο μένει ανέγγιχτο.

Πραγματικά παραδείγματα προσωρινών πινάκων στην SQL

Στον SQL Server, δημιούργησε καθέναν από αυτούς τους προσωρινούς πίνακες με SELECT ... INTO #name αντί για CREATE TEMPORARY TABLE.

Δύο αναφορές για τις παραγγελίες ενός μήνα

Φίλτραρε τις παραγγελίες του Οκτωβρίου σε έναν προσωρινό πίνακα μία φορά και μετά τρέξε όσες αναφορές θέλεις πάνω του:

-- Input: orders
-- id | customer | order_date | total
-- ---+----------+------------+------
-- 1  | Maria    | 2026-09-28 | 120
-- 2  | Tom      | 2026-10-02 | 35
-- 3  | Maria    | 2026-10-05 | 60
-- 4  | Priya    | 2026-10-09 | 89

CREATE TEMPORARY TABLE october_orders AS
SELECT id, customer, total
FROM orders
WHERE order_date >= '2026-10-01' AND order_date < '2026-11-01';

SELECT COUNT(*) AS order_count, SUM(total) AS revenue
FROM october_orders;

-- Output:
-- order_count | revenue
-- ------------+--------
-- 3           | 184

SELECT customer, SUM(total) AS spent
FROM october_orders
GROUP BY customer
ORDER BY spent DESC;

-- Output:
-- customer | spent
-- ---------+------
-- Priya    | 89
-- Maria    | 60
-- Tom      | 35

Βρες πελάτες που ξοδεύουν πάνω από τον μέσο όρο

Αποθήκευσε το σύνολο κάθε πελάτη και μετά σύγκρινε τα σύνολα με τον δικό τους μέσο όρο:

-- Input: orders
-- id | customer | total
-- ---+----------+------
-- 1  | Maria    | 120
-- 2  | Tom      | 35
-- 3  | Maria    | 60
-- 4  | Priya    | 89
-- 5  | Priya    | 70

CREATE TEMPORARY TABLE customer_totals AS
SELECT customer, SUM(total) AS spent
FROM orders
GROUP BY customer;

SELECT customer, spent
FROM customer_totals
WHERE spent > (SELECT AVG(spent) FROM customer_totals)
ORDER BY spent DESC;

-- Output:
-- customer | spent
-- ---------+------
-- Maria    | 180
-- Priya    | 159

Αυτό δεν τρέχει στη MySQL, που δεν μπορεί να διαβάσει το customer_totals δύο φορές στο ίδιο query (Can't reopen table). Υπολόγισε πρώτα τον μέσο όρο σε ξεχωριστό query.

Βρες πελάτες που δεν έχουν παραγγείλει πρόσφατα

Υπολόγισε την τελευταία παραγγελία κάθε πελάτη σε ένα βήμα και μετά κάνε join με τη λίστα πελατών. Σε μεγάλους πίνακες, ένα index στον προσωρινό πίνακα επιταχύνει το join:

-- Input: customers
-- id | name
-- ---+------
-- 1  | Maria
-- 2  | Tom
-- 3  | Priya

-- Input: orders
-- id | customer_id | order_date
-- ---+-------------+-----------
-- 1  | 1           | 2026-09-30
-- 2  | 2           | 2026-05-14
-- 3  | 1           | 2026-04-02

-- Step 1: each customer's latest order
CREATE TEMPORARY TABLE last_orders AS
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

-- Step 2: on big tables, index the column you'll join on
CREATE INDEX idx_last_orders ON last_orders (customer_id);

-- Step 3: customers with no order since July 1
SELECT c.name, l.last_order
FROM customers c
LEFT JOIN last_orders l ON l.customer_id = c.id
WHERE l.last_order IS NULL OR l.last_order < '2026-07-01'
ORDER BY c.name;

-- Output:
-- name  | last_order
-- ------+-----------
-- Priya | NULL
-- Tom   | 2026-05-14

Έλεγξε τι θα αφαιρούσε ένα DELETE

Καθαρίζεις παλιές ακυρωμένες παραγγελίες; Τρέξε πρώτα το DELETE σε αντίγραφο και δες τι απομένει:

-- Input: orders
-- id | customer | status    | order_date
-- ---+----------+-----------+-----------
-- 1  | Maria    | cancelled | 2025-11-03
-- 2  | Tom      | shipped   | 2025-12-19
-- 3  | Priya    | cancelled | 2026-02-11
-- 4  | Maria    | shipped   | 2026-03-02

CREATE TEMPORARY TABLE orders_copy AS
SELECT * FROM orders;

DELETE FROM orders_copy
WHERE status = 'cancelled' AND order_date < '2026-01-01';

SELECT * FROM orders_copy;

-- Output:
-- id | customer | status    | order_date
-- ---+----------+-----------+-----------
-- 2  | Tom      | shipped   | 2025-12-19
-- 3  | Priya    | cancelled | 2026-02-11
-- 4  | Maria    | shipped   | 2026-03-02

-- The real table still has every row
SELECT COUNT(*) AS order_count FROM orders;
-- Output: 4

Περισσότερα για τους προσωρινούς πίνακες στην SQL

Σε αυτό το 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 Δωρεάν λήψη