510 likes | 546 Views
SQL Structured Query Language. בתרגולים הקודמים. מושגי יסוד פעולות ב- SQL שינוי תוכן מסד נתונים DML שינוי מבנה מסד נתונים DDL שאילתות ב- SQL WHERE האופרטור LIKE ערכים חסרים NULL. נושאי התרגול. שאילתות ב- SQL פונקציות סטטיסטיות GROUP BY HAVING ALIASING SUBQUERIES כמתים
E N D
SQL Structured Query Language DBMS - 236363, שפות שאילתה: SQL
בתרגולים הקודמים • מושגי יסוד • פעולות ב-SQL • שינוי תוכן מסד נתונים DML • שינוי מבנה מסד נתונים DDL • שאילתות ב-SQL • WHERE • האופרטור LIKE • ערכים חסרים NULL DBMS - 236363, DDL+DML: SQL
נושאי התרגול • שאילתות ב-SQL • פונקציות סטטיסטיות • GROUP BY • HAVING • ALIASING • SUBQUERIES • כמתים • EXISTS • טריגרים DBMS - 236363, DDL+DML: SQL
דוגמא של מסד נתונים - תזכורת מסד נתונים של ספרייה • Ordered • Cust_Id • Book_Id • Order_Date • Books • Book_Id • Book_Name • Year • Max_Time • Faculty • Pages • Customers • Cust_Id • Cust_Name • Faculty • Borrowed • Cust_Id • Book_Id • From_Date • To_Date DBMS - 236363, שפות שאילתה: SQL
פונקציות סטטיסטיות • ב- SQL ישנן הפונקציות הסטטיסטיות הבאות: • MIN – מינימום • MAX – מקסימום • AVG – ממוצע • SUM – סכום • COUNT – מספר הרשומות • כל אחת מפונקציות אלה פועלת על קבוצת ערכים ומחזירה ערך אחד. DBMS - 236363, שפות שאילתה: SQL
דוגמא • דוגמא: חשב את מספר העמודים הממוצע והמקסימלי בין כל הספרים: • פתרון: SELECT AVG(Pages), MAX(Pages) FROM Books; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך SELECT AVG(Pages), MAX(Pages)FROM books; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך SELECT AVG(Pages), MAX(Pages)FROM books; DBMS - 236363, שפות שאילתה: SQL
פונקציות סטטיסטיות – המשך • ניתן לחשב פונקציות סטטיסטיות רק על חלק מרשומות הטבלה ע"י שימוש באופציה WHERE. • לדוגמא: SELECT COUNT (Book_Name) FROM Books WHERE Year = 1998; DBMS - 236363, שפות שאילתה: SQL
פונקציות סטטיסטיות – המשך SELECT COUNT(Book_name) FROM Books WHERE Year=1998 DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך • Book_Name: COUNT DBMS - 236363, שפות שאילתה: SQL
פעולות סטטיסטיות על ערכי NULL • כל הפונקציות הסטטיסטיות מתעלמות מערכי NULL. • יוצא מן הכלל:COUNT(*). ההבדל בין count לבין פונקציות סטטיסטיות אחרות הוא ש-count תחזיר 0 כאשר הוא תקבל אף ערך והפונקציות הסטטיסטיות האחרות יחזירו null. לכן פונקציות סטטיסטיות שמקבלות עמודה של null יחזירו null (הן מתעלמות מערכי ה-null ומקבלות כלום, לכן מחזירות null) פרט ל-count שתחזיר 0 (ו-count(*) תחזיר את מספר השורות) DBMS - 236363, שפות שאילתה: SQL
פעולות סטטיסטיות על ערכי NULL Borrowed: SELECT MAX(To_Date) FROM Borrowed; יחזיר NULL SELECT COUNT(To_Date) FROM Borrowed; יחזיר 0 SELECT COUNT(*) FROM Borrowed; יחזיר 1 DBMS - 236363, שפות שאילתה: SQL
פונקציות סטטיסטיות – המשך • דוגמא: שליפת מספר הספרים בכל שנה • פתרון שגוי: SELECT Year, COUNT(Book_Id) FROM Books; • לא חוקי! (הרבה ערכים של Year, ערך אחד של COUNT). DBMS - 236363, שפות שאילתה: SQL
קיבוץ – GROUP BY • הפעלת פונקציות סטטיסטיות על קבוצות של רשומות. • המשך הדוגמא (תיקון): SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year; • לכל ערך של Year, ה-COUNT מחושב בנפרד. DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך(GROUP BY) SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך(GROUP BY) SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year; DBMS - 236363, שפות שאילתה: SQL
קיבוץ – המשך • דוגמא שגויה אחרת: SELECT Faculty, COUNT(Book_Id) FROM Books GROUP BY Year; • לא חוקי! לאחר הקיבוץ לפי Year, בכל קבוצה יכולים להיות ערכי Faculty שונים. • כלל: בנוסף לפעולות סטטיסטיות, מותר לשלוף רק שדות לפיהם מתבצע הקיבוץ (וביטויים). DBMS - 236363, שפות שאילתה: SQL
בחירה לאחר קיבוץ - HAVING • האופציה HAVING condition: בחירת חלק מהקבוצות המתקבלות מ-GROUP BY . • התנאי condition: פונקציות סטטיסטיות, שדות לפיהם מתבצע הקיבוץ, ביטויים. DBMS - 236363, שפות שאילתה: SQL
דוגמא (HAVING) • דוגמא: מה מחזירה השאילתה הבאה? SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year HAVING AVG(Pages) > 400; • הסבר: לאחר הקיבוץ לפי Year, מבין כל הקבוצות נבחרות כאלה שבהן ממוצע מספרי העמודים גדול מ- 400. DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך (HAVING) SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year HAVING AVG(Pages) > 400; DBMS - 236363, שפות שאילתה: SQL
AVG(Pages) > 400 Year COUNT(Book_Id) 1988 1 2001 1 1985 1 דוגמא – המשך (HAVING) SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year HAVING AVG(Pages) > 400; DBMS - 236363, שפות שאילתה: SQL
בחירה: WHEREלעומת HAVING • WHERE: בחירת רשומות לפני הקיבוץ • HAVING: בחירת קבוצותאחרי הקיבוץ. • דוגמא: בין כל הספרים עם יותר מ-200 עמודים, חשב בכל שנה את מס' הספרים שיצאו לאור,בתנאי שבממוצע מספר העמודים באותה שנה גדול מ- 400. DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך • דוגמא: בין כל הספרים עם יותר מ-200 עמודים, חשב בכל שנה את מס' הספרים שיצאו לאור, בתנאי שבממוצע מספר העמודים באותה שנה גדול מ- 400. SELECT Year, COUNT(Book_Id) FROM Books WHERE Pages > 200 GROUP BY Year HAVING AVG(Pages) > 400; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך SELECT Year, COUNT(Book_Id) FROM Books WHERE Pages > 200 GROUP BY Year HAVING AVG(Pages) > 400; Books: WHERE Pages > 200 DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך SELECT Year, COUNT(Book_Id) FROM Books WHERE Pages > 200 GROUP BY Year HAVING AVG(Pages) > 400; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך • הסבר (שלבים): • WHERE: בחירת הרשומות של הספרים שמכילים יותר מ- 200 עמודים. • GROUP BY: קיבוץ הרשומות לקבוצות, כך שבכל קבוצה יש לכל הרשומות (הספרים) אותו Year. • פונ' סטטיסטיות: חישוב מספר העמודים הממוצע בכל קבוצה, ואת מס' הספרים בכל קבוצה. • HAVING: בחירת הקבוצות בהן הממוצע הוא לפחות 400. DBMS - 236363, שפות שאילתה: SQL
דוגמא נוספת • דוגמא: מה עושה שאילתה זו? SELECT Cust_Name, Customers.Cust_Id, COUNT(Book_Id) FROM Customers LEFT OUTER JOIN Ordered ON (Customers.Cust_Id = Ordered. Cust_Id) GROUP BY Customers.Cust_Id, Cust_Name; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך (OUTER JOIN) SELECT Customer.Cust_Id, Cust_Name, Book_Id FROM Customer LEFT OUTER JOIN Ordered ON( Customer.Cust_Id = Ordered. Cust_Id ); SELECT Customers.Cust_Id, Cust_Name, COUNT(Book_Id) FROM Customers LEFT OUTER JOIN Ordered ON( Customers.Cust_Id = Ordered. Cust_Id ) GROUP BY Customers.Cust_Id, Cust_Name; DBMS - 236363, שפות שאילתה: SQL
דוגמא – המשך • תשובה: השאילתה מחזירה לכל לקוח ID, שם ומס' הספרים שהזמין. • תוצאה: • מה הייתה התוצאה ללא ה-OUTER JOIN? DBMS - 236363, שפות שאילתה: SQL
ALIAS: שליפה מאותה טבלה פעמיים SELECT DISTINCT C1.Cust_Name FROM Customers C1, Customers C2 WHERE C1. Cust_Name = C2. Cust_Name AND C1.Cust_Id <> C2.Cust_Id; • שאלה: מה מחזירה השאילתה? • תשובה: שמות כל הלקוחות כך שיש בספרייה עוד לקוח עם אותו שם. DBMS - 236363, שפות שאילתה: SQL
תתי-שאילתות – SUBQUERIES • מוטיבציה: התנאי ב-WHERE מכיל ביטוי שלא ידוע מראש, אלא תלוי בתוכן המסד. • דוגמא: שליפת כל שמות הספרים שיצאו לאור באותה שנה כמו ספר מס' 1112. SELECT Book_Name FROM Books WHERE Year = (SELECT Year FROM Books WHERE Book_Id = 1112); DBMS - 236363, שפות שאילתה: SQL
תתי-שאילתות – המשך • תת-שאילתה יכולה לשלוף כמה ביטויים. • אפשר להשוות לערכים של כל הביטויים האלה בו זמנית. • דוגמא: שליפת כל הספרים שיצאו לאור באותה שנה ונמצאים באותה פקולטה כמו ספר מס' 1112. SELECT Book_Name FROM Books WHERE (Year, Faculty) = (SELECT Year, Faculty FROM Books WHERE Book_Id = 1112); DBMS - 236363, שפות שאילתה: SQL
תתי-שאילתות – המשך • תת שאילתה יכולה להופיע בחלק ה-From. • תת השאילתה חייבת לקבל Alias. • דוגמא: שליפת מספרי הספרים שהוזמנו אחרי 20-0ct-98 ע"י לקוח 12345. SELECT Book_Id FROM(SELECT * FROM Ordered Where Order_Date > '20-0ct-98') O WHERE O. Cust_Id = 1234; DBMS - 236363, שפות שאילתה: SQL
כמתים • מוטיבציה: השוואת ערך בודד לקבוצת ערכים • בהינתן ערך x וקבוצה A, נרצה לבטא: • x גדול מכל הערכים ב-A (yA:x>y) • x קטן מערך כלשהו ב-A (yA:x<y) • xA (yA:x=y) • כמתים ב-SQL: • ANY -- קיים • ALL -- לכל DBMS - 236363, שפות שאילתה: SQL
כמתים – המשך • הכימות נעשה ע"י כתיבת המילה ANY או ALL אחרי סימן ההשוואה • דוגמא: שליפת שמות ספרים בעלי יותר עמודים מכל הספרים בפקולטה למדעי המחשב. SELECT Book_Name FROM Books WHERE Pages >ALL (SELECT Pages FROM Books WHERE Faculty = 'CS'); DBMS - 236363, שפות שאילתה: SQL
כמתים – המשך (אופרטור שייכות) • ניתן לממש אופרטור שייכות באמצעות כמתים: • =ANYIN • <>ALLNOT IN • דוגמא: SELECT Book_Name, Year FROM Books WHERE Year = ANY (SELECT Year FROM Books WHERE Faculty = ‘MED’); SELECT Book_Name, Year FROM Books WHERE Year IN (SELECT Year FROM Books WHERE Faculty = 'MED'); DBMS - 236363, שפות שאילתה: SQL
תתי-שאילתות מקוננות • ניתן לקונן תתי-שאילתות • דוגמה: כל הפקולטות שמחזיקות ספרים שהזמין לקוח בשם ליאור אדרי: SELECT Faculty FROM Books WHERE Book_Id IN (SELECT Book_Id FROM Ordered WHERECust_Id IN (SELECT Cust_Id FROM Customers WHERECust_Name = 'Lior Edri')); DBMS - 236363, שפות שאילתה: SQL
תתי-שאילתות – המשך • תתי-שאילתות לעומת JOIN • דוגמא: נכתוב את אותה שאילתה ללא שימוש בתתי שאילתות SELECT B.Faculty FROM Books B, Customers C, Ordered O WHERE B.Book_Id = O.Book_Id AND C.Cust_Id = O. Cust_Id AND C.Cust_Name = 'Lior Edri'; • שאלה: איזו מהן יותר יעילה? • תשובה: תלוי באופטימיזציה בשרת, בד"כ הפתרון עם תתי-השאילתות יעיל יותר DBMS - 236363, שפות שאילתה: SQL
תתי-שאילתות קשורות הדדית • מוטיבציה: יש קשר דו-כיווני בין הפרמטרים של השאילתה החיצונית והפנימית • דוגמה: החזירו את מספרי הספרים ,שמות הספרים וזמן ההשאלה עבור ספרים שניתן להשאיל אותם לתקופה ארוכה מהממוצע באותה פקולטה SELECT Book_Id, Book_Name, Max_Time FROM Books B WHERE Max_Time > (SELECT AVG(Max_Time) FROM Books WHERE Faculty = B.Faculty); DBMS - 236363, שפות שאילתה: SQL
אופרטור EXISTS • EXISTS הוא אופרטור בוליאני שפועל על תת-שאילתה. • מחזיר True אם תת-השאילתה מחזירה ערך כלשהו, False אם אינה מחזירה דבר. • דוגמה: שליפת כל שמות הלקוחות שהזמינו ספר כלשהו SELECT Cust_Name FROM Customers C WHERE EXISTS (SELECT * FROM Ordered WHERECust_Id = C.Cust_Id); DBMS - 236363, שפות שאילתה: SQL
מבטים – VIEWS • מוטיבציה: להתייחס לפלט של שאילתה כאל טבלה נפרדת (בלי ליצור אותה פיזית). • בפועל: השאילתה שמגדירה את המבט נשמרת במסד הנתונים ומופעלת כל פעם מחדש. • אינטואיציה: המבט מהווה מעין "חלון" דרכו אפשר להסתכל על חלק ממסד הנתונים. • מטרה: הסתרת מידע, פישוט שאילתות... DBMS - 236363, DDL+DML: SQL
מבטים - המשך • יצירת מבט: CREATE VIEW view_name AS SELECT…; • דוגמא: CREATE VIEW CSBooks AS SELECT Book_Id, Book_Name, Max_Time FROM Books WHERE Faculty = 'CS'; • ב-CSBooksמוסתרות כל העמודות של Books פרט ל- Book_Id, Book_Name, Max_Time וכל השורות פרט לספרים של מדעי מחשב. • בשאילתה אסור שיופיע ORDER BY. DBMS - 236363, DDL+DML: SQL
Book_Id Book_Name Max_Time 1111 Database Systems 7 1112 Database Systems 14 CSBooks 1113 Database Systems 7 2222 Database And Knowledge 1 דוגמא – המשך Books: DBMS - 236363, DDL+DML: SQL
מבטים – המשך (שאילתות) • על מבט ניתן לבצע שאילתות ממש כאילו היה טבלה. • דוגמה: שליפת כל הספרים של מדעי מחשב שמשך ההשאלה שלהם הוא 7 ימים. SELECT Book_Name FROM CSBooks WHERE Max_Time = 7; DBMS - 236363, DDL+DML: SQL
מבטים – המשך (מחיקה) • מחיקת מבט: DROP VIEW • דוגמה: DROP VIEW CSBooks; • לטבלה שעליה מבוסס המבט לא קורה כלום. DBMS - 236363, DDL+DML: SQL
Triggers • Custom code that fires upon database updates • Used for: • Integrity testing (throws exception) • Propagating updates among relations • A trigger language has two components: • A mapping of a function to update events • A programming language for functions • Example: PL/SQL combines SQL with ordinary program controls (conditions, loops, etc.)
Example 1 2 4 6 5 3 CREATE TABLE Node( idint PRIMARY KEY, color text ) CREATE TABLE Edge( srcint REFERENCES Node(id), tgtint REFERENCES Node(id), PRIMARY KEY (src,tgt) ) • Right now, we cannot add any edge before we add the adjacent node to the Node relation • We would like to allow an easier behavior: whenever an edge is added, its nodes are added with the default black color
Trigger Example A mapping of a function to update events CREATE TRIGGER edge_trigger BEFORE INSERT ON Edge FOR EACH ROW EXECUTE PROCEDURE add_missing_nodes(); Function declaration CREATE OR REPLACE FUNCTION add_missing_nodes() RETURNS TRIGGER AS $$ BEGIN IF (NEW.src NOT IN (SELECT id FROM Node)) THEN INSERT INTO Node VALUES(NEW.src,'black'); END IF; IF (NEW.tgt NOT IN (SELECT id FROM Node)) THEN INSERT INTO Node VALUES(NEW.tgt,'black'); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; PL/SQL code
Some Built-In Variables • NEW: new tuple (insert/update) • OLD: old tuple (update/delete) • Trigger info: • TG_NAME, TG_WHEN, TG_OP, TG_TABLE_NAME