Department of Computer Science University of Cyprus EPL342 Databases Lecture 14: SQL DML I SQL Structured Query Language (Chapter 8.4, Elmasri-Navathe 5ED) Demetris Zeinalipour http://www.cs.ucy.ac.cy/courses/epl342 14-1
Πεξηερφκελν Δηάιεμεο Κεθάιαην 8.4: SQL DML I Δηζαγσγή ζηελ SQL-DML (Δηαθνξέο SQL-DML κε Σρεζηαθφ Μνληέιν / Άιγεβξα). Άπιεο Δθθξάζεηο ζε SQL (SELECT-FROM- WHERE) Απιέο Σπλελώζεηο ζε SQL Γηθνξνύκελα Ολόκαηα Γλσξηζκάησλ θαη ην Γλψξηζκα * Πεξίπησζε Με-πξνζδηνξηζκέλνπ WHERE Χξήζε DISTINCT ζε γλσξίζκαηα. Πξάμεηο Σπλόισλ κε SQL 14-2
Εηζαγσγή ζηε SQL Σηηο πξνεγνχκελεο δπν δηαιέμεηο μεθηλήζακε ηελ κειέηε κηαο πξαγκαηηθή γιψζζα βάζεσλ δεδνκέλσλ ηελ SQL (Structured Query Language). Γλώζζα Οριζμού Δεδομένων (Data Definition Language, SQL-DDL) Γιψζζα Επεμεξγαζίαο Δεδομένων (Data Manipulation Language, SQL-DML) Εάλ θαη ζα αλαθεξφκαζηε ζηo πξφηππν SQL:99-DML, απηφ πινπνηείηαη ζε κεγάιν βαζκό απφ ηνπο θαηαζθεπαζηέο βάζεσλ δεδνκέλσλ (π.ρ., ζηελ TSQL) Απηφ είλαη ζε αληίζεζε κε ηελ SQL-DDL ε νπνία έρεη αξθεηά πξνβιήκαηα ζπκβαηφηεηαο. Σε επεξσηήζεηο SQL ζπληζηάηαη ε ζπκβαηφηεηα κε ην πξφηππν ANSI/ISO SQL:99 Παξφιν πνπ πνιιέο θνξέο ζα ζαο δεκηνπξγείηαη έλα δίιιεκα κεηαμχ Δπίδνζεο (Performance) θαη Μεηαθεξζηκόηεηαο (Portability) ηνπ θώδηθα. 14-3
Δηαθνξέο ηεο SQL θαη ηνπ Σρεζηαθνχ Μνληέινπ/Άιγεβξαο: Γηαθνξέο SQL θαη Σρεζηαθνύ Μνληέινπ / Άιγεβξαο A) H SQL ζηεξίδεηαη ζε Σύλνια-κε-Γηαθξηηώλ-Τηκώλ ή αιιηψο Πνιπζύλνια (Μulti-set), ελψ ην Σρεζηαθφ Μνληέιν / Άιγεβξα ζε Απιά Σύλνια (δηαθξηηώλ-ηηκώλ). Σπλεπψο, ε SQL επηηξέπεη ηα δηπιόηππα (duplicates) ζε ζρέζεηο θαη απνηειέζκαηα επεξσηήζεσλ ελψ ην Σρεζηαθφ Μνληέιν / Άιγεβξα φρη. Σεκεηψζηε φηη νη ζρέζεηο SQL κπνξνχλ λα πεξηνξηζηνύλ έηζη ψζηε λα ζπκπεξηθέξνληαη σο καζεκαηηθά ζύλνια θάλνληαο ρξήζε πεξηνξηζκψλ PRIMARY KEY, UNIQUE, ή κε ρξήζε ηνπ DISTINCT ην νπνίν ζα δνχκε ζε ιίγν Β) Σρέζεηο SQL θαη απνηειέζκαηα έρνπλ δηάηαμε (order) ελψ ζην Σρεζηαθφ Μνληέιν / Άιγεβξα δελ έρνπλ, δει., Δπίπεδν Σρέζεο: Σεηξά απνζήθεπζεο ζηνηρείσλ ζηνλ δίζθν Δπίπεδν Δπεξώηεζεο: Αχμνπζα Σεηξά / Φζίλνπζα Σεηξά 14-4
Δηαθνξέο ηεο SQL θαη ηνπ Σρεζηαθνχ Μνληέινπ/Άιγεβξαο: Έλα πνιπζύλνιν (multi-set or bag) είλαη έλα κεδηαηεηαγκέλν ζχλνιν ζηνηρείσλ, φπνπ έλα ζηνηρείν κπνξεί λα εκθαλίδεηαη πεξηζζόηεξν από κηα θνξά. Παξάδεηγκα: {A, B, C, A} είλαη έλα πνιπζύλνιν, ελψ ην {A, B, C} είλαη πνιπζύλνιν θαη απιό ζύλνιν. Η SQL παξάγεη πνιπζχλνια ζηα νπνία ππάξρεη δηάηαμε (θάπνηα ζεηξά) ζηα απνηειέζκαηα (νπζηαζηηθά ιίζηεο). Παξάδεηγκα: {A, B} = {B, A, A} σο Σχλνια {A, B, A} = {B, A, A} σο Πνιπζχλνια 14-5 [A, B, A] [B, A, A] σο Λίζηεο (πνπ παξάγνληαη ζηελ SQL)
Απιέο Επεξσηήζεηο ζε SQL H βαζηθή έθθξαζε SQL γηα δηαηχπσζε επεξσηήζεσλ νλνκάδεηαη SELECT-FROM-WHERE κπινθ (ή mapping) SELECT <attribute list> FROM <table list> [WHERE <condition>] <attribute list> Είλαη κηα ιίζηα γλσξηζκάησλ ησλ νπνίσλ ε ηηκή πξέπεη λα αλαθηεζεί απφ κηα επεξψηεζε. Αληίζηνηρν ηνπ ηειεζηή πξνβνιήο π. <table list> είλαη κηα ιίζηα από νλόκαηα ζρέζεσλ απφ ηα νπνία ζα γίλεη ε αλάθηεζε ησλ απνηειεζκάησλ. Αληίζηνηρν ηεο ζρέζεο πνπ ζπκκεηέρεη ζε έλα Σρεζηαθφ Τειεζηή. <condition> είλαη κηα ινγηθή έθθξαζε (Boolean) ή νπνία πξέπεη λα απνηηκεζεί γηα λα επηζηξαθνχλ ηα απνηειέζκαηα Αληίζηνηρν ηνπ ηειεζηή επηινγήο ζ. Τα απνηειέζκαηα επηζηξέθνληαη θάπνηε ζε αχμνπζα ζεηξά ηνπ attribute list (φρη ζε SQL Server). Θα κηιήζνπκε πεξηζζφηεξν γηα ην Ordering ζηελ επφκελε δηάιεμεepl342: Databases - Demetris Zeinalipour (University of Cyprus) 14-6
Άπιεο Επεξσηήζεηο SQL (Simple SQL Queries) Η SQL κπνξεί λα ρξεζηκνπνηεζεί γηα λα δεισζνχλ πνιχ ζύλζεηεο θαη πεξίπινθεο επεξσηήζεηο. Σήκεξα ζα επηθεληξσζνχκε κφλν ζηα bold κέξε: SELECT attribute list FROM table list WHERE selection-condition GROUP BY grouping attribute(s) HAVING grouping condition ORDER BY ASC DESC Τν απιφ SELECT-FROM-WHERE κπινθ ζα επεθηαζεί αξγφηεξα κε έλλνηεο νκαδνπνίεζεο, ζπλαζξνηζηηθώλ ζπλαξηήζεσλ, εκθσιεπκέλσλ επεξσηήζεσλ, θ.α. TSQL SELECT-FROM-WHERE Reference: http://msdn.microsoft.com/en-us/library/ms189499.aspx 14-7
Απιέο Επεξσηήζεηο (Επεξψηεζε ζε 1 Σρέζε) Query 0: Αλάθηεζε ην birthdate θαη address ησλ employee ησλ νπνίσλ ην name είλαη 'John B. Smith'. Q0: SELECT BDATE, ADDRESS FROM EMPLOYEE WHERE FNAME='John' AND MINIT='B AND LNAME='Smith Αληίζηνηρν κε ηελ έθθξαζε ζρεζηαθήο άιγεβξαο Τ1 ζ (FNAME='John' AND MINIT='B AND LNAME='Smith ) (EMPLOYEE) T2 π BDATE, ADDRESS (Τ1) Η πξνβνιε (π) παξνπζηάδεηαη κε Μπιε ελψ νη επηινγή (ζ) κε Κφθθηλν. Σεκεηψζηε φηη ζην Q0 κπνξεί λα εκπεξηέρνληαη δηπιόηππα ελψ ζηελ αληίζηνηρε έθθξαζε Σρεζηαθήο Άιγεβξαο δελ ππάξρνπλ 14-8
Απιέο Επεξσηήζεηο (Επεξψηεζε ζε 2 Σρέζεηο) Query 1: Αλάθηεζε ηα names θαη addresses φισλ ησλ ππαιιήισλ πνπ δνπιεχνπλ γηα ην 'Research' department. Q1:SELECT FNAME, LNAME, ADDRESS FROM WHERE EMPLOYEE, DEPARTMENT DNAME='Research' AND DNUMBER=DNO Αληίζηνηρν κε ηελ έθθξαζε ζρεζηαθήο άιγεβξαο Τ1 EMPLOYEE DNO=Dnumber (ζ DNAME='Research' Department)) T2 π FNAME, LNAME, ADDRESS (Τ1) DNAME='Research': Σπλζήθε Επηινγήο (ζ) DNUMBER=DNO: Σπλζήθεο Σπλέλσζεο ( ) FNAME,LNAME,ADDRESS: Γλσξίζκαηα Πξνβνιήο (π) 14-9
Απιέο Επεξσηήζεηο (Επεξψηεζε ζε 3 Σρέζεηο) Query 2: Γηα θάζε project ζηελ πόιε 'Stafford', παξνπζίαζε ην project number, ην ηκήκα πνπ ειέγρεη ην project θαη ηα αθφινπζα: επίζεην (last name) ηνπ department manager, δηεύζπλζε (address) θαη εκεξνκελία γέλλεζεο (birthdate). Stafford Q2: SELECT PNUMBER,DNUM,LNAME,BDATE,ADDRESS FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE DNUM=DNUMBER AND MGRSSN=SSN AND PLOCATION='Stafford Σρεζηαθή Άιγεβξα Τ1 π Pnumber, Dnum (ζ PLOCATION= Stafford Project)) T2 π Pnumber, Dnum, Mgr_ssn (Department Dnumber=DNum Τ1) T2 π Pnumber, Dnum, Lname, Bdate, Address (Employee SSN=Mgr_ssn Τ2) 14-10
Δηθνξνχκελα Ολφκαηα Γλσξηζκάησλ (Ambiguous Attribute Names) Σηελ SQL, κπνξνχκε λα ρξεζηκνπνηήζνπκε ην ίδην όλνκα γηα δπν ή πεξηζζόηεξα γλσξίζκαηα εθφζνλ ηα γλσξίζκαηα απηά αλήθνπλ ζε δηαθνξεηηθέο ζρέζεηο Π.ρ., Employee(ssn, name, dno) θαη Deparment(dno, name) Γηα λα απνθεπρζνχλ δηθνξνύκελεο θαηαζηάζεηο ζε πεξηπηψζεηο πνιιαπιψλ ζρέζεσλ (ζηηο νπνίεο δελ ζα είλαη γλσζηφ ζε πην αθξηβψο γλψξηζκα αλαθέξεηαη ε επεξψηεζε), ρξεζηκνπνηνχκε σο πξόζεκα (prefix) ην φλνκα ηεο ζρέζεο, π.ρ., EMPLOYEE.Νame, DEPARTMENT.Name ή αθφκε θαιχηεξα λα ρξεζηκνπνηήζνπκε έλα alias (δεο επνκέλε EPL342: δηαθάλεηα) Databases - Demetris Zeinalipour (University of Cyprus) 14-11
Δηθνξνχκελα Ολφκαηα Γλσξηζκάησλ (Ambiguous Attribute Names) Aliases γηα κεηνλνκαζία Σρέζεσλ/Γλσξηζκάησλ πξναηξεηηθφ Q1a: SELECT E.FNAME, E.LNAME, E.ADDRESS FROM EMPLOYEE AS E, DEPARTMENT AS D WHERE D.DNAME='Research' AND D.DNUMBER=D.DNO Αθφκε θαη εάλ δελ ππάξρνπλ δηθνξνύκελα νλφκαηα, είλαη θάιν λα ρξεζηκνπνηείηαη ην Alias γηαηί έηζη γίλεηαη πην επαλάγλσζηνο ν θψδηθαο SQL. Γηα κεηνλνκαζία γλσξηζκάησλ: FROM Employee AS E(Fn,Mi,Ln,Ssn,Bd,Addr,Sex,Sal,Sssn,Dno) 14-12
Δηθνξνχκελα Ολφκαηα Γλσξηζκάησλ (Ambiguous Attribute Names) Μεξηθέο επεξσηήζεηο αλαθέξνληαη ζηελ ίδηα ζρέζε πνιιαπιέο θνξέο. Σε απηή ηελ πεξίπησζε, αλαηίζεληαη δηαθνξεηηθά aliases ζην φλνκα ηεο ζρέζεο έηζη ψζηε λα δίλεηαη ε εληχπσζε φηη ππάξρνπλ δηαθνξεηηθά ζηηγκηφηππα. Query 8: Γηα θάζε employee, αλάθηεζε ην όλνκα ηνπ employee, θαη ην όλνκα ηνπ άκεζα πξντζηακέλνπ ηνπ. Q8: SELECT E.FNAME, E.LNAME, S.FNAME, S.LNAME FROM EMPLOYEE E, EMPLOYEE S WHERE E.SUPERSSN=S.SSN E: ξφινο πθηζηάκελνπ (supervisee) S: ξφινο EPL342: πξντζηακέλνπ Databases - Demetris (supervisor) Zeinalipour (University of Cyprus) 14-13
Με-πξνζδηνξηζκέλν WHERE O φξνο WHERE είναι προαιρεηικός ζε μια επερώηηζη SQL. SELECT <attribute list> FROM <table list> [WHERE <condition>] H κε-χπαξμε ελφο ηέηνηνπ φξνπ ππνδειψλεη φηη ΔΕΝ ππάξρεη ζπλζήθε επηινγήο. Οπζηαζηηθά, είλαη αληίζηνηρν ηεο ζπλζήθεο WHERE TRUE Σπλεπψο, φιεο νη πιεηάδεο κηαο ζρέζεο επηιέγνληαη ζε κηα ηέηνηα πεξίπησζε. Query 9: Αλάθηεζε ην SSN φισλ ησλ ππαιιήισλ. Q9: SELECT SSN FROM EMPLOYEE 14-14
Με-πξνζδηνξηζκέλν WHERE (Πεξίπησζε Καξηεζηαλνχ Γηλνκέλνπ) Εάλ νξίδνληαη πεξηζζφηεξν απφ κηα ζρέζεηο ζηνλ φξν FROM, ηφηε απηφ ππνδειψλεη ηνλ ηειεζηή Καξηεζηαλνύ Γηλνκέλνπ (Cartesian Product) Παξάδεηγκα: Q10: SELECT SSN, DNAME FROM EMPLOYEE, DEPARTMENT Είλαη πνιχ ζεκαληηθφ λα κελ παξαβιέπεηαη ν νξηζκφο ζπλζεθψλ επηινγήο (WHERE) ζε ζπλελώζεηο γηα λα κελ δεκηνπξγνχληαη κε-επηζπκεηά κεγάια απνηειέζκαηα. Κάπνηεο βάζεηο πινπνηνχλ εμεηδηθεπκέλνπο ηειεζηέο θαξηεζηαλνύ γηλνκέλνπ Π.ρ. ζηελ TSQL ππάξρεη ε εληνιή CROSS JOIN SELECT SSN, DNAME FROM EMPLOYEE CROSS JOIN DEPARTMENT Καιχηεξα σζηφζν λα ρξεζηκνπνηείηαη ε ANSI/ISO εληνιή (Q10) 14-15
Χξήζε Γλσξίζκαηνο-* Γηα λα αλαθηήζνπκε ΌΛΑ ηα γλσξίζκαηα κηαο πιεηάδαο ζε κηα επεξψηεζε θάλνπκε ρξήζε ηνπ γλσξίζκαηνο * (all attributes) Παξαδείγκαηα: Q1C: SELECT * FROM EMPLOYEE WHERE DNO=5 Q1D: SELECT * FROM EMPLOYEE, DEPARTMENT WHERE DNAME='Research' AND DNO=DNUMBER 14-16
Χξήζε DISTINCT ζε Γλσξίζκαηα Όπσο είρακε αλαθέξεη λσξίηεξα, ε SQL ρεηξίδεηαη ηηο ζρέζεηο σο Πνιπζχλνια κε δηάηαμε, ζπλεπψο είλαη δπλαηφ λα ππάξρνπλ δηπιόηππα (duplicate tuples). Γηα λα εμαιείςνπκε ηα δηπιόηππα ζε κηα επεξψηεζε, θάλνπκε ρξήζε ηεο ιέμεο DISTINCT ζηνλ φξν SELECT. Παξάδεηγκα Employee: Q11: SELECT SALARY FROM EMPLOYEE Q11A: SELECT DISTINCT SALARY FROM EMPLOYEE Q11: Q12: 14-17
Χξήζε DISTINCT ζε Γλσξίζκαηα Σεκεηψζηε φηη πέξα απφ ην SELECT DISTINCT ππάξρεη θαη ην SELECT ALL, ην νπνίν ΔΕΝ αθαηξεί ηα δηπιφηππα. Σπγθεθξηκέλα, SELECT [DISTINCT ALL] <attribute-list> FROM <table-list> Τν SELECT ALL αληηπξνζσπεχεη νπζηαζηηθά ηελ εμνξηζκνύ ιεηηνπξγία ηνπ SELECT. Όπσο αλαθέξακε θαη ζε πξνεγνχκελεο δηαιέμεηο, ζηελ SQL πνιιά πξάγκαηα δειώλνληαη ξεηά γηαηί έηζη: Ξεθαζαξίδεη ε πξόζεζε ηνπ ζρεδηαζηή Απνθεύγνληαη πξνβιήκαηα ζπκβαηόηεηαο πνπ κπνξεί λα πξνθχςνπλ απφ ηελ κεηαθνξά ηεο πινπνίεζεο ζε άιιε βάζε δεδνκέλσλ. 14-18
Πξάμεηο Σπλφισλ ζε SQL H SQL:99 πινπνηεί αξθεηέο πξάμεηο ζπλόισλ ηηο νπνίεο νξίζακε ζηα πιαίζηα ηεο Σρεζηαθήο Άιγεβξαο. Σπγθεθξηκέλα, ππνζηεξίδνληαη νη αθφινπζεο πξάμεηο: Έλσζε: UNION [ALL] Τνκή: INTERSECT Γηαθνξά Σπλόισλ: EXCEPT Πξνυπνζέηνπλ φηη ηα ζχλνια είλαη i) ζπκβαηά-πξνο-ηνληύπν θαη ii) ε δηάηαμε ησλ γλσξηζκάησλ είλαη ε ίδηα (δελ ρξεηάδεηαη λα έρνπλ ην ίδην φλνκα) Γηαθνξά Πξάμεσλ Σπλόισλ από άιιεο πξάμεηο SQL: Τα απνηειέζκαηα είλαη ΣΥΝΟΛΑ φρη ΠΟΛΥΣΥΝΟΛΑ (ζπλεπψο δελ ππάξρνπλ δηπιφηππα ζηηο πξάμεηο απηέο) Θα δνχκε πσο παξάγνληαη Πνιπζχλνια ζε ιίγν. 14-19
Πξάμεηο Σπλφισλ ζε SQL Query 4: Δεκηνπξγήζηε κηα ιίζηα από projects ηα νπνία πεξηιακβάλνπλ έλα ππάιιειν κε ην επίζεην Smith, σο ππάιιειν ή* σο manager ηνπ ηκήκαηνο πνπ ειέγρεη ην ελ ιόγσ project. Smith 14-20
Πξάμεηο Σπλφισλ ζε SQL Smith Q4: (SELECT W.Pno FROM EMPLOYEE E, WORKS_ON W WHERE W.ESSN=E.SSN AND E.NAME='Smith') UNION (SELECT P.Pnumber FROM PROJECT P, DEPARTMENT D, ΔMPLOYEE E WHERE P.DNUM=P.DNUMBER AND D.MGRSSN=E.SSN AND E.LNAME='Smith') (SMITH_WOR KER_PROJS ) (SMITH_MGR _PROJS ) 14-21
Πξάμεηο Σπλφισλ ζε SQL Γηα λα επηζηξαθνχλ απνηειέζκαηα Πνιπζπλφισλ, αληί απνηειέζκαηα ζπλφισλ, κπνξεί λα γίλεη ρξήζε ησλ αθφινπζσλ εληνιψλ: UNION ALL, ππνζηεξίδεηαη θαη ζε TSQL Π.ρ., {(1,Pet), (2,Cat)} UNION ALL {(2,Cat),(1, Pet)} Δπηζηξέθεη: { (1,Pet), (2,Cat), (2,Cat), (1, Pet) } INTERSECT ALL (δελ πινπνηείηαη ζηηο πεξηζζόηεξεο DBMS) Π.ρ., {(1,Pet), (2,Cat)} INTERSECT ALL {(1, Pet)} Δπηζηξέθεη: { (1,Pet), (1, Pet) } EXCEPT ALL (δελ πινπνηείηαη ζηηο πεξηζζόηεξεο DBMS) Π.ρ., {(1,Pet), (2,Cat), (2,Cat)} EXCEPT ALL {(1, Pet)} Δπηζηξέθεη:{(2,Cat), (2,Cat) } Σπλεπψο, κε ηηο πην πάλσ πξάμεηο δελ δηαγξάθνληαη ηα δηπιφηππα απφ έλα απνηέιεζκα 14-22
Πξάμεηο Σπλφισλ ζε SQL Σεκεηψζηε φηη εάλ έλαο ηειεζηήο δελ πινπνηείηαη ζηελ SQL ηφηε κπνξεί λα πινπνηεζεί κε ρξήζε βαζηθώλ ηειεζηώλ (π.ρ., Σπκκεηξηθή Δηαθνξά, R S = (R S) (S R)) Σηελ ζπλέρεηα ζα δνχκε φηη ππάξρνπλ πνιιέο άιιεο πξάμεηο ζύγθξηζεο κε ζύλνια πνπ ρξεζηκνπνηνχληαη γηα δηαηχπσζε επεξσηήζεσλ ζε SQL ΙΝ, ΑΝΥ, ALL, CONTAINS, EXISTS, NOT EXISTS, θηι. 14-23