Τι είναι τα SQL Joins και πώς συσχετίζονται οι πίνακες μεταξύ τους
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Οι σχεσιακές βάσεις δεδομένων στηρίζονται στις συσχετίσεις μεταξύ των οντοτήτων τους (πίνακες και views).
Για να μπορέσουμε όμως να καλέσουμε συσχετισμένες εγγραφές από δύο η παραπάνω πίνακες / views θα πρέπει με κάποιον τρόπο να δηλώσουμε με ποιο πεδίο συνδέονται μεταξύ τους.
Αυτό ακριβώς κάνει η χρήση των SQL Join.
Υπάρχουν πέντε είδη Join: Left Join, Right Join, Inner Join, Full Join, Cross join.
Πάμε να εξηγήσουμε τα ένα ένα τα πιο βασικά με παραδείγματα.
Για αρχή θα φτιάξουμε 2 πίνακες με δεδομένα ώστε να είναι πιο εύκολα κατανοητή η διαφορά του κάθε τύπου:
create table pelatis ( id integer, id_xwra integer, onoma_pelati varchar(50)); create table xwres ( id integer, onoma_xwras varchar(50)); insert into pelatis values (1,1,'Stratos'), (2,1,'Maria'), (3,4,'Georgia'), (4,10,'Nikos'), (5,null,'Iasonas'); insert into xwres values (1,'Ellada'), (2,'Ispania'), (3,'Italia'), (4,'Agglia'), (5,'Germania'); select * from pelatis; select * from xwres;
Left Join
Στο Left Join φέρνουμε όλες τις εγγραφές του πρώτου πίνακα ακόμα και αν δεν υπάρχουν εγγραφές που ταιριάζουν με τον δεύτερο πίνακα στο πεδίο που συσχετίζονται.
Στο παράδειγμα δηλώνουμε ότι κάνουμε left join τον δεύτερο πίνακα “xwres”στο πεδίο “id_xwres” του πρώτου, με το πεδίο “id” του δεύτερου.
Το αποτέλεσμα είναι σε όσες εγγραφές δεν έχει οριστεί κοινό id να έρχονται και αυτές, με το “id” όμως να εμφανίζεται null (δηλαδή κενό).
select * from pelatis left join xwres on pelatis.id_xwra = xwres.id;
Left Join με μόνο τις εξωτερικές εγγραφές
Αυτή την περίπτωση την εφαρμόζουμε όταν θέλουμε να βρούμε ποιες εγγραφές που υπάρχουν στον πρώτο πίνακα δεν υπάρχουν στον δεύτερο συσχετισμένες.
Υπάρχουν δύο τρόποι για το ίδιο αποτέλεσμα ο πρώτος είναι ένα κανονικό left join, με την χρήση αυτή την φορά where στο πεδίο που συσχετίζονται όταν είναι null στον δεύτερο πίνακα.
select * from pelatis left join xwres on pelatis.id_xwra = xwres.id where xwres.id is null;
Ο ίδιος αριθμός εγγραφών θα επιστρέψει και αν αντί για join και is null χρησιμοποιήσουμε correlated subquery exists (select).
select * from pelatis where not exists (select xwres.id from xwres where xwres.id = pelatis.id_xwra);
Right Join
Το right join λειτουργεί ανάποδα από το left, δηλαδή φέρνουμε όλες τις εγγραφές του δεύτερου πίνακα ακόμα και αν δεν υπάρχουν εγγραφές που ταιριάζουν με τον πρώτο πίνακα στο πεδίο που συσχετίζονται.
Αυτή τη φορά θα εμφανιστούν όλες οι εγγραφές από τον πίνακα «xwres» και όσες δεν συσχετίζονται με τον πίνακα «pelatis», θα εμφανιστούν αλλά ως null στο πεδίο.
select * from pelatis right join xwres on pelatis.id_xwra = xwres.id;
Inner Join
Στο Inner Join φέρνουμε μόνο τις εγγραφές που συσχετίζονται στο πεδίο και με τους δύο πίνακες
Δηλώνοντας inner πριν το join (αν και αν δεν βάλουμε τίποτα είναι το default) αυτή τη φορά θα δούμε τις εγγραφές που είναι συσχετισμένες δηλαδή μόνο όσους πελάτες έχουν δηλωμένη χώρα.
select * from pelatis inner join xwres on pelatis.id_xwra = xwres.id;
Full Join
Στο Full Join φέρνουμε όλες τις εγγραφές του πρώτου πίνακα και όλες τις εγγραφές του δεύτερο πίνακα είτε συσχετίζονται είτε όχι μεταξύ τους στο πεδίο.
Με την εκτέλεση του full join θα δούμε ότι θα μας εμφανιστούν και οι πελάτες που δεν έχουν χώρα και όσοι πελάτες έχουν και όσες χώρες δεν έχουν πελάτη.
select * from pelatis full join xwres on pelatis.id_xwra = xwres.id;
Cross Join
Με το Cross Join δημιουργούμε ένα καρτεσιανό γινόμενο, δηλαδή συνδιάζουμε τις εγγραφές και των δύο πινάκων με τον κάθε δυνατό συνδιασμό.
select onoma_pelati,onoma|_xwras from pelatis cross join xwres;
Αυτή ήτανε η ανάλυση των Joins, η χρήση τους θέλει πολύ προσοχή καθότι πολλές φορές χρησιμοποιούμε Inner Join και χάνουμε τις εγγραφές που δεν έχουν συσχετιστεί μεταξύ τους αν και τις θέλαμε. Αυτό οδηγεί σε λάθος αποτέλεσμα.
Η καλύτερη πρακτική είναι η χρήση Left ή Right Joins όπου δεν απαιτείται η χρήση του Inner.