Άσκηση  8   Γ.Μανάρας ,  Κ. Μουχλιανίτη
Aliases Unions Σύνθετα  queries
Μπορούμε να δώσουμε ένα ψευδώνυμο (alias)  σε ένα πίνακα  με τον ίδιο τρόπο που δίνουμε και  σε μία στήλη :   select column_name1, column_name2,…    from table_name1 as alias1, table_name2 as alias2    where alias1.column_name3 = alias2.column_name3; select  *  from school as S, dept as D  where  S.scid = D.scid; select S.name as SCHOOL, D.name as DEPARTMENT  from school as S, dept as D  where S.scid = D.scid;
Με τα  table aliases  μπορούμε να  δημιουργήσουμε αυτοσυσχέτ ι ση ενός πίνακα (δηλαδή σύνδεση πίνακα με τον εαυτό του). Παράδειγμα: Να εμφανίσετε ζευγάρια μαθητών που μπορούν να συνεργαστούν. select  a.name as student1, b.name as student2 from student as a, student as b  where  a.sid <> b.sid;
Η εντολή union μας εμφανίζει τα αποτελέσματα πολλών εντολών  select σε έναν πίνακα (χωρίς αυτό να εγγυάται ότι έχει λογικό νόημα) Οι εντολές select που ενώνουμε πρέπει να έχουν τον ίδιο αριθμό στηλών select scid, name  from school  union   select did, name  from dept;
Για τις ανάγκες του παραδείγματος που ακολουθεί καταχωρήστε τις παρακάτω εγγραφές delete  FROM dept  where did=3; // delete physics dept insert into school (scid, name) values (3, 'testSchool'); insert into school (scid, name) values ( 4 , ‘abc'); insert into dept (did, name, scid) values (4, 'testDept0', 3); insert into dept (did, name, scid) values (5, 'testDept1', 3); insert into dept (did, name, scid) values (6, 'testDept2', 2); insert into dept (did, name, scid) values (7, 'testDept3', 2); insert into student  (sid, name, semester, age, did) values (500, 'testStd0', 'A', 25,  4); insert into student  (sid, name, semester, age, did) values (501, 'testStd1', 'A', 25,  4);
Βρείτε τις σχολές που δεν έχουν κανένα σπουδαστή δηλαδή :   είτε δεν έχουν τμήματα + είτε έχουν τμήματα αλλά όχι σπουδαστές.  Θα απαντηθεί πλήρως όταν μιλήσουμε για το  Union A_List   UNION   B_List A_List  =  οι σχολές που δεν έχουν κανένα τμήμα  B_List  = οι σχολές που έχουν τμήματα, αλλά όλα τα τμήματά τους δεν έχουν σπουδαστές
A_List Οι σχολές που δεν έχουν τμήματα Select  school.name From   school  left outer join  dept On  school.scid = dept.scid Where dept.did IS NULL;
LIST_B :  οι σχολές που έχουν τμήματα, αλλά όλα τα τμήματά τους δεν έχουν σπουδαστές LIST_BA :  τα τμήματα που δεν έχουν σπουδαστές. Σε αυτό το σύνολο υπάρχουν και τμήματα που ενώ τα ίδια δεν έχουν σπουδαστές, η σχολή στην οποία ανήκουν, έχει ( πορτοκαλί χρώμα ) Select  dept.did From     dept  left outer join  student On     dept.did = student.did Where   student.sid  IS NULL ;   Select  distinct school.name  from  school, dept where  school.scid = dept.scid  and  dept.did  IN  ( LIST_BA ) and school.scid  NOT IN ( σχολές που έχουν σπουδαστές ) ; Αφαιρούμε τις σχολές τύπου Α, δηλαδή όσες έχουν έστω και ένα τμήμα με σπουδαστές
Οι σχολές που έχουν σπουδαστές Select  school.scid From  school, dept, student Where  school.scid = dept.scid and  dept.did = student.did;
SELECT DISTINCT  school.name FROM  school, dept WHERE  school.scid = dept.scid AND  dept.did  IN (   SELECT  dept.did FROM  dept  left outer join  student ON  dept.did = student.did WHERE  student.sid   IS NULL   )  AND  school.scid   NOT IN ( SELECT  school.scid   FROM  school, dept, student WHERE  school.scid = dept.scid AND  dept.did = student.did  ); Η τελική απάντηση προκύπτει από :   A_List   UNION  ( το προηγούμενο  select)
Πριν αρχίσουμε να γράφουμε κώδικα  SQL  καλό θα είναι να ζωγραφίσουμε αυτό που θέλουμε και να ψάξουμε αν υπάρχει ευκολότερος τρόπος να το κάνουμε πχ στο προηγούμενο , αν από τη λίστα των σχολών αφαιρέσουμε τις σχολές που έχουν σπουδαστές βγαίνει αυτό που ζητάμε, δηλ. τα 2 κίτρινα προκύπτει αυτό που ζητάμε
SELECT DISTINCT  school.name FROM  school WHERE  school.scid  NOT IN (SELECT  school.scid FROM  school, dept, student WHERE  school.scid = dept.scid AND  dept.did = student.did ); Όλες οι σχολές – (όσες έχουν σπουδαστές)

SQL7v2

  • 1.
    Άσκηση 8 Γ.Μανάρας , Κ. Μουχλιανίτη
  • 2.
  • 3.
    Μπορούμε να δώσουμεένα ψευδώνυμο (alias) σε ένα πίνακα με τον ίδιο τρόπο που δίνουμε και σε μία στήλη : select column_name1, column_name2,… from table_name1 as alias1, table_name2 as alias2 where alias1.column_name3 = alias2.column_name3; select * from school as S, dept as D where S.scid = D.scid; select S.name as SCHOOL, D.name as DEPARTMENT from school as S, dept as D where S.scid = D.scid;
  • 4.
    Με τα table aliases μπορούμε να δημιουργήσουμε αυτοσυσχέτ ι ση ενός πίνακα (δηλαδή σύνδεση πίνακα με τον εαυτό του). Παράδειγμα: Να εμφανίσετε ζευγάρια μαθητών που μπορούν να συνεργαστούν. select a.name as student1, b.name as student2 from student as a, student as b where a.sid <> b.sid;
  • 5.
    Η εντολή unionμας εμφανίζει τα αποτελέσματα πολλών εντολών select σε έναν πίνακα (χωρίς αυτό να εγγυάται ότι έχει λογικό νόημα) Οι εντολές select που ενώνουμε πρέπει να έχουν τον ίδιο αριθμό στηλών select scid, name from school union select did, name from dept;
  • 6.
    Για τις ανάγκεςτου παραδείγματος που ακολουθεί καταχωρήστε τις παρακάτω εγγραφές delete FROM dept where did=3; // delete physics dept insert into school (scid, name) values (3, 'testSchool'); insert into school (scid, name) values ( 4 , ‘abc'); insert into dept (did, name, scid) values (4, 'testDept0', 3); insert into dept (did, name, scid) values (5, 'testDept1', 3); insert into dept (did, name, scid) values (6, 'testDept2', 2); insert into dept (did, name, scid) values (7, 'testDept3', 2); insert into student (sid, name, semester, age, did) values (500, 'testStd0', 'A', 25, 4); insert into student (sid, name, semester, age, did) values (501, 'testStd1', 'A', 25, 4);
  • 7.
    Βρείτε τις σχολέςπου δεν έχουν κανένα σπουδαστή δηλαδή : είτε δεν έχουν τμήματα + είτε έχουν τμήματα αλλά όχι σπουδαστές. Θα απαντηθεί πλήρως όταν μιλήσουμε για το Union A_List UNION B_List A_List = οι σχολές που δεν έχουν κανένα τμήμα B_List = οι σχολές που έχουν τμήματα, αλλά όλα τα τμήματά τους δεν έχουν σπουδαστές
  • 8.
    A_List Οι σχολέςπου δεν έχουν τμήματα Select school.name From school left outer join dept On school.scid = dept.scid Where dept.did IS NULL;
  • 9.
    LIST_B : οι σχολές που έχουν τμήματα, αλλά όλα τα τμήματά τους δεν έχουν σπουδαστές LIST_BA : τα τμήματα που δεν έχουν σπουδαστές. Σε αυτό το σύνολο υπάρχουν και τμήματα που ενώ τα ίδια δεν έχουν σπουδαστές, η σχολή στην οποία ανήκουν, έχει ( πορτοκαλί χρώμα ) Select dept.did From dept left outer join student On dept.did = student.did Where student.sid IS NULL ; Select distinct school.name from school, dept where school.scid = dept.scid and dept.did IN ( LIST_BA ) and school.scid NOT IN ( σχολές που έχουν σπουδαστές ) ; Αφαιρούμε τις σχολές τύπου Α, δηλαδή όσες έχουν έστω και ένα τμήμα με σπουδαστές
  • 10.
    Οι σχολές πουέχουν σπουδαστές Select school.scid From school, dept, student Where school.scid = dept.scid and dept.did = student.did;
  • 11.
    SELECT DISTINCT school.name FROM school, dept WHERE school.scid = dept.scid AND dept.did IN ( SELECT dept.did FROM dept left outer join student ON dept.did = student.did WHERE student.sid IS NULL ) AND school.scid NOT IN ( SELECT school.scid FROM school, dept, student WHERE school.scid = dept.scid AND dept.did = student.did ); Η τελική απάντηση προκύπτει από : A_List UNION ( το προηγούμενο select)
  • 12.
    Πριν αρχίσουμε ναγράφουμε κώδικα SQL καλό θα είναι να ζωγραφίσουμε αυτό που θέλουμε και να ψάξουμε αν υπάρχει ευκολότερος τρόπος να το κάνουμε πχ στο προηγούμενο , αν από τη λίστα των σχολών αφαιρέσουμε τις σχολές που έχουν σπουδαστές βγαίνει αυτό που ζητάμε, δηλ. τα 2 κίτρινα προκύπτει αυτό που ζητάμε
  • 13.
    SELECT DISTINCT school.name FROM school WHERE school.scid NOT IN (SELECT school.scid FROM school, dept, student WHERE school.scid = dept.scid AND dept.did = student.did ); Όλες οι σχολές – (όσες έχουν σπουδαστές)