Τι είναι τα set operators (Union) και τι διαφορά έχουν από τα Joins στην SQL

- Πώς φτιάχνουμε Logon Trigger για να ελέγχουμε τους χρήστες που επιτρέπουμε να συνδεθούν σε Oracle Database - 13 Ιανουάριος 2025
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε Oracle Database - 1 Νοέμβριος 2024
Σε αυτό το άρθρο θα αναλύσουμε τη χρήση των set operators, τα είδη που υπάρχουν και τι διαφορές υπάρχουν ανάμεσα σε αυτά και στα SQL Joins.
Στον κόσμο της SQL (Structured Query Language) πολλές φορές θα θέλουμε να συνδυάσουμε δύο διαφορετικά σετ δεδομένων σε ένα καινούργιο. Αυτό επιτυγχάνεται με τη χρήση set operators / union operator.
Ποια είναι η διαφορά με τα SQL Joins;
Στα SQL Joins συγκρίνουμε κολόνες από δύο διαφορετικούς πίνακες φτιάχνοντας εγγραφές που αποτελούνται από τις κολόνες αυτών των δύο πινάκων.
Στα Union operators ενώνουμε τις εγγραφές (γραμμές) δύο διαφορετικών σετ αποτελεσμάτων (query) σε ένα ενιαίο.
Set operators
Υπάρχουν τέσσερα είδη set operator: Union all, Union, Except, Intersect
Ανάλογα το ποιο χρησιμοποιήσουμε θα μας επιστραφεί διαφορετικό αποτέλεσμα.
Πάμε να τα εξηγήσουμε ένα ένα τα με παραδείγματα.
Για αρχή θα φτιάξουμε δύο πίνακες με δεδομένα ώστε να είναι πιο εύκολα κατανοητή η διαφορά του κάθε τύπου:
create table pelatis ( onoma_pelati varchar(50)); create table pwlitis ( onoma_pwliti varchar(50)); insert into pelatis values ('Stratos'), ('Nikos'), ('Iasonas'); insert into pwlitis values ('Stratos'), ('Giorgos'), ('Stefanos');
select * from pelatis; select * from pwlitis;

Union All
Στο Union All operator ενώνουμε τα αποτελέσματα από πολλά queries σε ένα ενιαίο το οποίο περιέχει και όσες εγγραφές είναι εξ’ ολοκλήρου διπλότυπες.

select * from pelatis union all select * from pwlitis;

Βλέπουμε ότι ο “Stratos” εμφανίζεται δύο φορές καθότι υπάρχει και στα δύο σετ αποτελεσμάτων.
Union
Στο Union operator σε αντίθεση με το Union All όταν ενώνουμε τα αποτελέσματα από πολλά queries σε ένα ενιαίο, δεν περιέχει όσες εγγραφές είναι εξ’ ολοκλήρου διπλότυπες.
select * from pelatis union select * from pwlitis;

Βλέπουμε αυτή τη φορά ο “Stratos” υπάρχει μόνο μία φορά, παρότι υπάρχει και στα δύο σετ αποτελεσμάτων.
Except
Στο Except operator εμφανίζεται το πρώτο σετ αποτελεσμάτων αφού πρώτα έχουν αφαιρεθεί τα αποτελέσματα του δεύτερου.

select * from pelatis except select * from pwlitis;

Δεν εμφανίζεται ο “Stratos” καθώς υπήρχε στο δεύτερο σετ αποτελεσμάτων.
Intersect
Στο Intersect operator εμφανίζονται μόνο όσες εγγραφές είναι ίδιες και στα δύο σετ αποτελεσμάτων.

select * from pelatis intersect select * from pwlitis;

Στη προκειμένη περίπτωση μόνο η εγγραφή “Stratos” είναι κοινή και στα δύο σετ αποτελεσμάτων.
Κανόνες χρήσεις:
- Θα πρέπει ο αριθμός στηλών και η σειρά τους να είναι ίδια σε όλα τα queries.
- Θα πρέπει οι τύποι δεδομένων να είναι συμβατοί. (δηλαδή δεν γίνεται στο πρώτο query το τηλέφωνο να ορίζεται ως κείμενο και στο δεύτερο ως ακέραιος)