Department of Computer Science University of Cyprus EPL342 Databases Lecture 16: SQL DML III SQL Structured Query Language (Chapter 8.5.5-8.6, Elmasri-Navathe 5ED) Demetris Zeinalipour http://www.cs.ucy.ac.cy/courses/epl342 16-1
Πεξηερόκελν Γηάιεμεο Ολοκλήπωζη Γιάλεξηρ 15. Κεθάλαιο 8.5.5-8.6: SQL DML IΙΙ Ενηολή Μεηονομαζίαρ AS ζε SQL Πποσωπημένερ Σςνενώζειρ ζε SQL (JOINS) Σςναθποιζηικέρ Σςναπηήζειρ ζε SQL (COUNT, MAX, MIN, AVG, SUM) Ενηολή Ομαδοποίηζηρ (GROUP-BY) και Ενηολή Επιλογήρ-μεηά-από-Ομαδοποίηζη (HAVING) ζε SQL Ενηολέρ Ειζαγωγήρ/Διαγπαθήρ/Ενημέπωζηρ (INSERT / DELETE / UPDATE) ζε SQL. 16-2
Ενηολή Μεηονομαζίαρ AS ζε SQL Γηα ηελ κεηνλνκαζία γνωπιζμάηων ή ζσέζεων ζε SQL ρξεζηκνπνηείηαη o όξνο AS Q8a: Για ηον κάθε ςπάλληλο ηύπωζε ηο όνομα ηος και ηο όνομα ηος πποϊζηαμένος ηος. Οη ζηήιες ηοσ αποηειέζκαηος λα θέροσλ ηα όλοκαηα Employee_Name θαη Supervisor_Νame. SELECT E.Lname AS Employee_Name, S.Lname AS Supervisor_Νame FROM EMPLOYEE AS E, EMPLOYEE AS S WHERE E.Super_ssn = S.ssn Σεκείωζε: To AS εθαπμόζει αςηόμαηα από ηον Query Builder ηος SQL Server. Γεκηνπξγία Δλδηάκεζνπ Πίλαθα SELECT T.Lname, T.Lname FROM (SELECT * FROM EMPLOYEE E WHERE E.age=30) AS T WHERE T.Lname="Smith" 16-3
Πποσωπημένερ Σςνενώζειρ ζε SQL Νσξίηεξα, κειεηήζακε ηελ απιή εθδνρή ηεο εληνιήο ζπλέλσζεο ζηελ SQL (ζ-join), π.ρ., SELECT * FROM Employee E, Department D WHERE E.Dno = D.Dno AND D.Dno=5; Σήκεξα ζα δνύκε πσο κπνξνύκε λα νξίζνπκε ηνπο αθόινπζεο εξειδικεςμένερ ζςνενώζειρ. INNER JOIN (Απλή Σςνένωζη) Δλαιιαθηηθόο ηξόπνο δηαηύπσζεο ηεο Απιήο Σπλέλσζεο. NATURAL JOIN (Φςζική Σςνένωζη), [ Γεν ςπάπσει ζε TSQL ] Η ζςνθήκη ζςνένωζηρ είλαη ην θνηλά δηαηππσκέλν γλώξηζκα. OUTER JOIN (Δξωηεπική Σςνένωζη: LEFT, RIGHT, FULL) Σπκπεξίιεςε πιεηάδσλ πνπ δελ ζπλελώλνληαη. CROSS JOIN (Καπηεζιανό Γινόμενο) (Χωπίρ ηο WHERE εκθπάζοςμε ηο καπηεζιανό γινόμενο) Δλαιιαθηηθόο ηξόπνο δηαηύπσζεο ηνπ Καξηεζηαλνύ Γηλνκέλνπ. 16-4
Πποσωπημένερ Σςνενώζειρ ζε SQL (INNER JOIN) Τν INNER JOIN απνηειεί ελαιιαθηηθό ηξόπν δηαηύπσζεο ηεο Απιήο Σπλέλσζεο πνπ είδακε λσξίηεξα. Π.ρ., SELECT * FROM Employee E INNER JOIN Department D ON E.Dno = D.Dno WHERE D.Dno=5; Πλεονέκηημα Γελ πιέθεηαη ε ζςνθήκη ζςνένωζηρ κε ηελ ζςνθήκη ηηρ επεπώηηζηρ (βνιηθό ζε πεξηπηώζεηο πολλαπλών joins) Μειονέκηημα Γιαθοπεηική ςλοποίηζη ζε δηαθνξεηηθέο βάζεηο δεκηνπξγεί πξνβιήκαηα ζπκβαηόηεηαο ελώ ε Απιή Σπλέλσζε είλαη επξέσο δηαδεδνκέλε. Άλλερ Δπιζημάνζειρ Δάλ δελ ρξεζηκνπνηεζεί aliasing (π.ρ., D, E) ηόηε κπνξεί λα πξνθύςνπλ ζθάικαηα κεηάθξαζεο ηεο επεξώηεζεο ζε δηθνξνύκελεο θαηαζηάζεηο Ο όξνο INNER (ζην INNER JOIN) ζε ANSI-SQL είλαη πξναηξεηηθό. 16-5
Πποσωπημένερ Σςνενώζειρ ζε SQL (INNER JOIN) Παπάδειγμα: Μεηαζρεκαηίζηε ην αθόινπζν ζε ηζνδύλακν query κε ρξήζε Inner Join. Q8:SELECT * FROM EMPLOYEE E, EMPLOYEE S WHERE E.SUPERSSN=S.SSN Απάνηηζη: Q8:SELECT * FROM (EMPLOYEE E INNER JOIN EMPLOYEE S ON E.SUPERSSN=S.SSN) 16-6
Πποσωπημένερ Σςνενώζειρ ζε SQL (NATURAL JOIN ΌΧΙ ζε TSQL) Τν ΝΑΤURAL JOIN (ζε ANSI-SQL, π.ρ., πινπνηείηαη ζε PostgreSQL) πινπνηεί ηελ ζπλέλσζε κε ηέηνην ηξόπν ώζηε ε ζςνθήκη ζςνένωζηρ είλαη ην θνηλά δηαηππσκέλν γλώξηζκα., π.ρ., SELECT * FROM Employee E NATURAL JOIN Department D WHERE D.Dno=5; Δπιζημάνζειρ Γελ απαηηεί ηνλ νξηζκό ηεο θνηλήο ζηήιεο νύηε ηελ παξάγεη δηπιά. Δάλ δελ ππάξρεη θνηλά δηαηππσκέλν γλώξηζκα κπνξεί λα πξνεγεζεί κεηνλνκαζία: Π.ρ., SELECT * FROM EMPLOYEE NATURAL JOIN Department AS Dept(Dname, Dno, Mssn, Msdate) (μεηονομ. δεν δοςλεύει ζε TSQL) Γεληθόηεξα, ην NATURAL JOIN δελ πινπνηείηαη ζε TSQL γηα απηό δελ ζα κειεηεζεί πεξαηηέξσ. 16-7
Πποσωπημένερ Σςνενώζειρ ζε SQL (NATURAL JOIN ΌΧΙ ζε TSQL) Παπάδειγμα: Μεηαζρεκαηίζηε ην αθόινπζν ζε ηζνδύλακν query κε ρξήζε Natural Join. Παπάδειγμα : Q1:SELECT FROM WHERE FNAME, LNAME, ADDRESS EMPLOYEE, DEPARTMENT DNAME='Research' AND DNUMBER=DNO Μποπούζε να γπαθεί με NATURAL JOIN ωρ: Q1:SELECT FNAME, LNAME, ADDRESS FROM (EMPLOYEE NATURAL JOIN DEPARTMENT AS DEPT(DNAME, DNO, MSSN, MSDATE) WHERE DNAME='Research 16-8
Πποσωπημένερ Σςνενώζειρ ζε SQL (OUTER JOIN) Σε κηα εζσηεξηθή ζπλέλσζε (Απιή, Inner, Natural), ηo απνηέιεζκα πεξηιακβάλεη MONO πιεηάδεο πνπ έρνπλ ίζν γλώξηζκα ζπλέλσζεο H εξωηεπική ζςνένωζη (OUTER JOIN) είλαη ρξήζηκε γηα παξαγσγή απνηειεζκάησλ πνπ ζέινπλ ζην απνηέιεζκα όιεο ηηο εγγξαθέο κηαο ζρέζεο (αξηζηεξήο, δεμηάο ή θαη ηηο δπν) αλεμάξηεηα εάλ ζςνενώνονηαι <Table1> {LEFT RIGHT FULL} [OUTER] JOIN <Table2> ON <condition> EMPLOYEE Δ DEPARTMENT D E LEFT [OUTER] JOIN D ή WHERE E *= D (SQL Server 2000) Σεκείωζε: Θεωπήζηε όηι δεν ςπάπσει ο αναθοπικόρ πεπιοπιζμόρ E.DNO=>D.DNO 16-9
Πποσωπημένερ Σςνενώζειρ ζε SQL (OUTER JOIN) EMPLOYEE Δ DEPARTMENT D E FULL [OUTER] JOIN D WHERE E *=* D (SQL Server 2000) E RIGHT [OUTER] JOIN D WHERE E =* D (SQL Server 2000) 16-10
Πποσωπημένερ Σςνενώζειρ ζε SQL (OUTER JOIN) SQL Server 2005/2008 (ANSI ηπόπορ) Left Outer Join: SELECT E.ssn, E.Fname, E.Minit, E.Lname, E.Dno, D.Dno AS Expr1, D.Dname FROM Emp AS E LEFT OUTER JOIN Dep AS D ON E.Dno = D.Dno Right Outer Join: SELECT E.ssn, E.Fname, E.Minit, E.Lname, E.Dno, D.Dno AS Expr1, D.Dname FROM Emp AS E RIGHT OUTER JOIN Dep AS D ON E.Dno = D.Dno Full Outer Join: Μεηνλνκαζία γίλεηαη γηα λα κελ έρνπκε δηπιά Dno ζην απνηέιεζκα. SELECT E.ssn, E.Fname, E.Minit, E.Lname, E.Dno, D.Dno AS Expr1, D.Dname FROM Δmp AS E FULL OUTER JOIN Dep AS D ON E.Dno = D.Dno 16-11
Πποσωπημένερ Σςνενώζειρ ζε SQL (OUTER JOIN) SQL Server 2000 (Non-ANSI ηπόπορ) Left Outer Join: SELECT * FROM Emp E, Dep D WHERE E.Dno *= D.Dno Right Outer Join: SELECT * FROM Emp E, Dep D WHERE E.Dno =* D.Dno Full Outer Join: SELECT * FROM Emp E, Dep D WHERE E.Dno *=* D.Dno 16-12
Πποσωπημένερ Σςνενώζειρ ζε SQL (CROSS JOIN) Τν CROSS JOIN απνηειεί ελαιιαθηηθό ηξόπν δηαηύπσζεο ηνπ Καξηεζηαλνύ Γηλνκέλνπ ην νπνίν έρνπκε δεη ήδε, δει. SELECT * FROM Employee E, Department D <table_source> CROSS JOIN <table_source> Γενικέρ Δπιζημάνζειρ Όινη νη ηξόπνη ζπλέλσζεο πνπ είδακε κπνξνύλ λα ππνζηεξίμνπλ πεξηζζόηεξεο από 2 ζρέζεηο.» π.ρ., ((Table JOIN TableB ON <cond>) JOIN TableC ON <cond>) Δίλαη θαιό λα ρξεζηκνπνηνύκε ηελ ANSI SQL κέζνδν ζε SQL ζπλελώζεηο γηα ιόγνπο ζπκβαηόηεηαο κεηαμύ θαηαζθεπαζηώλ. Σηηο εμσηεξηθέο ζπλελώζεηο (LEFT θαη RIGHT) ΓΔΝ ιζσύει η ανηιμεηαθεηική ιδιόηηηα (δει., ε ζεηξά ησλ joins δελ κπνξεί λα αιιάμεη απζαίξεηα), δει., (Α= Β) (Β= Α)» Γώζηε έκθαζε ζηε ζεηξά ησλ ζπλελώζεσλ δηόηη απηό κπνξεί λα ζαο νδεγήζεη εύθνια ζε ιάζε. 16-13
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) Οη Σςναθποιζηικέρ Σςναπηήζειρ (Aggregate Functions) πξνζδηνξίδνπλ καζεκαηηθέο πξάμεηο πάλσ ζε ζπιινγέο ηηκώλ ηεο βάζεο ζπκπεξηιακβαλνκέλσλ ησλ αθόινπζσλ: COUNT, SUM, MAX, MIN, και AVG Query 15: Βξεο ην μέγιζηο salary, ην ελάσιζηο salary, θαη ηνλ μέζο όπο ησλ salaries από όινπο ηνπο employees. Q15: SELECT MAX(SALARY), MIN(SALARY), FROM AVG(SALARY) EMPLOYEE Σεκεηώζηε όηη δελ ιακβάλνληαη ππόςε ηα NULLS! 16-15
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) Query 16: Βξεο ην μέγιζηο salary, ην ελάσιζηο salary, θαη ηνλ μέζο όπο ησλ salaries κεηαμύ όισλ ησλ employees πνπ δνπιεύνπλ γηα ην 'Research' department. Q16: SELECT MAX(SALARY), MIN(SALARY), AVG(SALARY) FROM EMPLOYEE, DEPARTMENT WHERE DNO=DNUMBER AND DNAME='Research' Σημείωζη: Η εθηέιεζεο ηεο ζπλέλσζε πξνεγείηαη ηεο ζπλαζξνηζηηθήο ζπλάξηεζεο 16-16
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) Δπιζημάνζειρ Σπλαζξνηζηηθέο Σπλαξηήζεηο SUM, AVG (δει., SUM/COUNT), MAX, MIN κπνξνύλ λα εθαξκνζηνύλ ζε ζύνολα ή πολςζύνολα (ζρέζεηο κε κνλαδηθέο έγγξαθεο ή κε) απιθμηηικών ηιμών. Οη ΜΑΧ, ΜΙΝ εθαξκόδνληαη θαη ζε αλθαπιθμηηικά δεδομένα (π.ρ., «Γίαο» < «Φεγγάξη») To COUNT ζε TSQL εθαξκόδεηαη ζηα πάληα εθηόο από text, image, ή ntext. Οη Σπλαζξνηζηηθέο ζπλαξηήζεηο νξίδνληαη πάνηοηε ζην όξν SELECT (θαη ζην HAVING πνπ ζα δνύκε αξγόηεξα) ΛΑΘΟΣ: SELECT * FROM A WHERE salary=max(salary) 16-17
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) Ο ηελεζηήρ * (δηλ., func(*)) ππνδειώλεη πσο πξέπεη λα ιεθζνύλ ππόςε όια ηα γλσξίζκαηα ζηνλ ππνινγηζκό κηαο ζπλαζξνηζηηθήο ζπλάξηεζεο Αρηζκός ηωλ employees (includes NULLs & duplicates) Q17: SELECT COUNT (*) FROM EMPLOYEE Αρηζκός employees ηοσ Research Department Q18: SELECT COUNT (*) FROM EMPLOYEE, DEPARTMENT WHERE DNO=DNUMBER AND DNAME='Research 16-18
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) ΔΕΝ αγλοούλ ηα NULL COUNT(*): Μεηπά εμθανίζειρ όλων ηων attributes (περηιακβάλεη θαη NULLs και διπλόηςπα). Βπίζκει απιθμό γπαμμών ενόρ πίνακα Αγλοούλ ηα NULL I. COUNT(expression): Μέηπα ηιρ εμθανίζειρ ηος expression (μεηπώνηαρ ξανά ηα διπλόηςπα) II. Παπάδειγμα: R(A,B)={(1,1), (2,2), (2,NULL), (5,NULL)} SELECT COUNT(A) FROM R returns 4 SELECT COUNT(B) FROM R returns 2 SELECT COUNT(CAST(A as char) + CAST(B as char)) FROM R; The above returns 2 COUNT(ALL expression): Ίδιο με ηο COUNT(expression) 16-19
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) III. COUNT(DISTINCT expression): Μεηπά κολαδηθές εμθανίζειρ ηος attribute. Παπάδειγμα: R(A,B)={(1,1), (2,2), (2,NULL), (5,NULL)} SELECT COUNT(DISTINCT A) FROM R -- returns 3 SELECT COUNT(DISTINCT B) FROM R -- returns 2 SELECT COUNT(DISTINCT CAST(A as char) + CAST(B as char)) FROM R; -- The above returns 2 (δηλ., όηι πεπιέσει έζηω ένα NULL αγνοείηαι) IV. COUNT (DISTIΝCT *): Δελ εθαρκόδεηαη ζε TSQL (δες επόκελε δηαθάλεηα γηα ιύζε) Επηζήκαλζε To COUNT παίξλεη ηηκέο κέρξη 2^31-1. Όηαλ ππάξρεη αλάγθε γηα κεγαιύηεξεο ηηκέο ηόηε ππάξρεη θαη ην COUNT_BIG 16-20
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) Ανηίζηοισο ηηρ «COUNT (DISTIΝCT *)» SELECT COUNT(*) FROM (SELECT DISTINCT * FROM table) AS Temp Σημείωζη: Eδω ηο DISTINCT * σπειάζεηαι μόνο εάν ηο table ΔΕΝ έσει Primary Key. Εάν έσει PRIMARY key ηο table ηόηε εξςπακούεηαι, δηλ., είναι απλά SELECT COUNT(*) FROM table. 16-21
Σπλαζξνηζηηθέο Σπλαξηήζεηο COUNT(DISTINCT *) SELECT * FROM Emp SELECT DISTINCT * FROM Emp Δναλλακηική διαηύπωζη: SELECT COUNT(DISTINCT *) SELECT COUNT(*) AS CountVar FROM ( SELECT DISTINCT * FROM Emp) AS TEMP 16-22
Σπλαζξνηζηηθέο Σπλαξηήζεηο (Aggregate Functions) Πέπα από ηο COUNT (DISTIΝCT *), ούηε και ηο COUNT (DISTIΝCT Attr1,Attr2) ΔΕΝ εθαπμόζεηαι ζε απκεηέρ εκδοσέρ ηηρ SQL (π.σ., TSQL). Για αςηό μποπούμε να εθαπμόζοςμε ηην ακόλοςθη εναλλακηική πποζέγγιζη (με εμθωλεςμένη επεπώηηζη): Γιαηςπωζη «COUNT (DISTIΝCT Attr1,Attr2)» Δκδοσή Α με CONCAT (όπωρ ππιν): SELECT COUNT(DISTINCT CAST(A as char) + CAST(B as char)) FROM table; Δκδοσή Β με ενδιάμεζο πίνακα: SELECT COUNT(*) FROM (SELECT DISTINCT Attr1, Attr2 FROM table) 16-23