Presentation is loading. Please wait.

Presentation is loading. Please wait.

חורף 2008-9DBMS - 236363, שפות שאילתה: SQL 1 SQL questions.

Similar presentations


Presentation on theme: "חורף 2008-9DBMS - 236363, שפות שאילתה: SQL 1 SQL questions."— Presentation transcript:

1 חורף 2008-9DBMS - 236363, שפות שאילתה: SQL 1 SQL questions

2 שאלה 1: מציאת שמות לא יחודיים חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 2 נתונה הסכמה : Customers(Cust_Id, Cust_Name, Faculty) המטרה : למצוא כמה שמות לא ייחודיים ( כפולים ) ישנם במערכת.

3 שאלה 1: מציאת שמות לא יחודיים חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 3 Customers(Cust_Id, Cust_Name, Faculty) SELECT COUNT (Cust_Name) AS res FROM Customers AS c1 WHERE EXISTS (SELECT 1 FROM Customers AS c2 WHERE c1.Cust_Name = c2.Cust_Name); מדוע ביצענו SELECT 1? כי אין צורך במידע עצמו עבור Exists האם השאילתא תחזיר את המידע הרצוי ? לא, היא תחזיר את מספר השמות שישנם במערכת ( כל רשומה מקיימת את התנאי בתוך ה -Exists כאשר אנו מצליבים אותה עם עצמה )

4 שאלה 1: מציאת שמות לא יחודיים חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 4 Customers(Cust_Id, Cust_Name, Faculty) SELECT COUNT (DISTINCT Cust_Name) AS res FROM Customers AS c1 WHERE EXISTS (SELECT 1 FROM Customers AS c2 WHERE c1.Cust_Name = c2.Cust_Name AND c1.Cust_Id <> c2.Cust_Id); יש צורך ב -DISTINCT בשביל לא לספור רשומות פעמיים

5 שאלה 2: מציאת VIPs חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 5 נתונה הסכמה : Borrowed(Book_Id, Cust_Id, From_Date, To_Date) המטרה : למצוא כמה מהלקוחות שאלו יותר ספרים מהממוצע.

6 שאלה 2: מציאת VIPs חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 6 נתונה הסכמה : Sale(Cust_Id, qty, amount) המטרה : למצוא כמה לקוחות קנו באחת הפעמים יותר מהכמות הממוצעת במכירה. SELECT COUNT(DISTINCT Cust_Id) FROM Sale GROUP BY Cust_Id HAVING AVG(qty) < qty; תקין ? לא תקין אפילו מבחינת Syntax – לא ניתן להתייחס ל -qty ב -HAVING כאשר לא קיבצנו לפיו ( לעומת זאת ניתן להתייחס ל -AVG(qty) ) אם נקבץ לפי qty הרי שלא נוכל להתייחס ל -AVG(qty) יש צורך ב -subquery על - מנת לחשב את הממוצע HAVING (SELECT AVG(qty) FROM Sale) < qty

7 שאלה 3: תנאים מורכבים חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 7 נתונה הסכמה : Customers(Cust_Id, Cust_Name, Faculty) Borrowed(Book_Id, Cust_Id, From_Date, To_Date) Excellent(Cust_Id, Semester, Type) כאשר הרלציה הראשונה והשנייה הן אלו המוכרות לנו, והשלישית מתארת הצטיינויות סטודנטים. המטרה : למצוא כמה סטונדטים הם מצטיינים או לוו יותר מ - 10 ספרים. כיצד כדאי לעשות זאת ?

8 שאלה 3 : ניסיון 1 חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 8 אפשרות 1: SELECT t2.tot + t3.tot FROM (SELECT COUNT(t1.Cust_Id) FROM (SELECT Borrowed.Cust_Id as tot FROM Borrowed GROUP BY Borrowed.Cust_Id HAVING COUNT(Borrowed.Cust_Id)>10) AS t1) AS t2, (SELECT COUNT(Excellent.Cust_Id) as tot FROM Excellent) AS t3 הרעיון : t2 מחזירה את הסטודנטים ששאלו מעל 10 ספרים t3 מחזירה את מספרם של סטודנטים אלו t1 מחזירה את מספר המצטיינים תקין ? באילו בעיות אנו עלולים להיתקל ?

9 שאלה 3 : ניסיון 2 חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 9 אפשרות 2: SELECT Customers.Cust_Id, COUNT(DISTINCT Excellent.Cust_Id) + COUNT(DISTINCT t1.Cust_Id) AS totStudents LEFT OUTER JOIN Excellent ON Customers.Cust_Id=Excellent.Cust_Id LEFT OUTER JOIN (SELECT DISTINCT Borrowed.Cust_Id FROM Borrowed GROUP BY Borrowed.Cust_Id HAVING COUNT (Borrowed.Cust_Id)>10 ) AS t1 ON t1.Cust_Id=Excellent.Cust_Id AND COALESCE(Excellent.Cust_Id, -1)<>t1.Cust_Id GROUP BY Customers.Cust_Id הרעיון – מהטבלה Borrowed נבחר רק סטודנטים שאינם מצטיינים

10 שאלה 3 : ניסיון 2 חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 10 האם ה -DISTINCT הכרחי ? עבור Excellent - כן, סטודנטים יכולים להצטיין ביותר מסמסטר אחד עבור Borrowed – לא, ביצענו כבר GROUP BY על - פי Cust_Id עבור t1 – כן, פעולת ה -Join תיצור כפילויות ( עבור רשומה אחת מ -t1 עלולות מספר רשומות מ -Excellent להיות תואמות ) למה אנו צריכים COALESCE? ייתכנו ערכי NULL בפעולת LEFT OUTER JOIN וללא COALESCE כל פעולה עליהם תחזיר NULL שאינו TRUE ואינו FALSE האם ספרנו סטודנטים פעמיים ? לא – הורדנו את החיתוך באמצעות התנאי COALESCE(Excellent.Cust_Id, -1)<>t1.Cust_Id אם הסטודנט הצטיין התנאי לא מתקיים ( בהנחה ש - 1 - הוא ID לא חוקי ) תקין ? כמעט, אבל לא. ההשוואה t1.Cust_Id=Excellent.Cust_Id מתבצעת למרות שעבור רשומה מסוימת ייתכן שלא קיימת n- יה ב -Excellent המקיימת Customers.Cust_Id=Excellent.Cust_Id – שהוא תנאי קודם ( כי הסטודנט אינו מצטיין ). מכאן ש -Excellent.Cust_Id המושווה עלול להיות NULL ולא יתקיים t1.Cust_Id=Excellent.Cust_Id. היה צריך להיות t1.Cust_Id=Customer.Cust_Id

11 שאלה 3 : ניסיון 3 חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 11 אפשרות 3: SELECT COUNT(t1.Cust_Id) FROM (SELECT Cust_Id From Excellent UNION SELECT Cust_Id FROM Borrowed GROUP BY Cust_Id HAVING Count(Cust_Id)>10) AS t1 האם יש צורך ב -DISTINCT? לא – פעולת ה -UNION תוריד את כל האיברים הלא ייחודיים תקין ? כן...

12 שאלה 4: מציאת מחיר חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 12 עבור חברה המוכרת פריט בודד מוגדרת הסכמה הבאה : Sales(Qty, Price, Time) יש למצוא את המחיר הממוצע של 100 הפריטים הראשונים ( נניח שנמכרו יותר מ - 100). האם יש איזשהו קושי ?

13 שאלה 4: הקושי חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 13 הקושי : ייתכן שאם נסכום את x המכירות הראשונות נקבל מתחת ל - 100 פריטים אך כאשר נסכום את x+1 המכירות הראשונות נקבל מעבר ל - 100 פריטים. TimePriceQty 2007-01-0110090 2008-01-012008 2009-01-0110010

14 שאלה 4: שלב 1 חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 14 שלב 1 : ניצור מבט totSales המגדיר לכל תאריך מבין תאריכי המכירה – כמה פריטים נמכרו עד אותו התאריך ומה היה סך מחיריהם. CREATE VIEW totSales AS SELECT t1.time, SUM(t2.price) AS totPrice, SUM(t2.qty) AS totQty FROM Sales AS t1, Sales AS t2 WHERE t2.time <= t1.time GROUP BY t1.time; איזו n- יה במבט תעניין אותנו ? בהמשך...

15 שאלה 4: שלב 1א חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 15 בפועל בשביל החישוב, אנו זקוקים למידע נוסף : CREATE VIEW totSales AS SELECT t1.time, t1.price, t1.qty, SUM(t2.price) as totPrice, SUM(t2.qty) AS totQty FROM Sales AS t1, Sales AS t2 WHERE t2.time <= t1.time GROUP BY t1.time, t1.price, t1.qty;

16 שאלה 4: שלב 2 חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 16 כעת עלינו להחליט מהי ה -n- יה שתעניין אותנו. תהיה זאת ה -n- יה שמספר הפריטים שנמכרו עד לאותו הזמן גדול - שווה ל - 100 – נבחר אותה מהמבט שיצרנו. SELECT t1.time, t1.price, t1.qty, t1.totPrice, t1.totQty FROM totSales AS t1 WHERE NOT EXISTS (SELECT 1 FROM totSales AS t2 WHERE t2.totQty>=100 AND t2.time<t1.time);

17 שאלה 4: שלב אחרון חורף 2008-9DBMS - 236363, שפות שאילתה : SQL 17 כל שנותר הוא לחשב על - ידי המידע ב -n- יה את החישוב הנחוץ : SELECT (t1.totPrice-t1.price*(t1.qty-100))/100 as res FROM totSales AS t1 WHERE NOT EXISTS (SELECT 1 FROM totSales AS t2 WHERE t2.totQty>=100 AND t2.time<t1.time);

18 שאלה 5 נתון מסד נתונים למערכת השכרת רכב: Cars: {CarNumber, Brand, Year, Miles, DailyCharge} Customer: {CustomerLicenseNo, CustomerName} Rent: {CustomerLicenseNo, CarNumber, RentingStartDate} הסבר למסד הנתונים: Cars: טבלת מכוניות. לכל מכונית נשמרים מספר זיהוי הרכב (CarNumber), סוג הרכב (Brand), שנת הייצור (Year), מספר הקילומטרים שנסעו בו (Miles) ומחיר ההשכרה ליום (DailyCharge). Customer: טבלת לקוחות. לכל לקוח נשמר נשמרים מס' רשיון הנהיגה של הנהג (CustomerLicenseNo). בנוסף, נשמר שם הלקוח (או החברה). נניח כי אין 2 לקוחות עם אותו השם (CustomerName ). Rent: טבלת השכרות רכב. עבור כל השכרה נשמרים מס' רשיון הנהיגה של הנהג, מס' זיהוי הרכב ותאריך התחלת ההשכרה RentingStartDate)).

19 1. כתבו את השאילתה הבאה ב-SQL: עבור כל לקוח, החזירו את התעריף היומי הממוצע ששילם עבור כל השכרה. החזירו את מספר רשיון הנהיגה של הלקוח ואת התעריף הממוצע. עבור לקוחות שלא השכירו רכבים יש להחזיר את המספר 0. דגשים: יש להחזיר את כל הלקוחות מה עושים עם לקוחות שלא השכירו רכבים? SELECT Customer.CustomerLicenseNo, COALESCE(AVG( DailyCharge), 0) FROM (Customer LEFT OUTER JOIN Rent ON (Customer.CustomerLicenseNo = Rent.CustomerLicenseNo)) LEFT OUTER JOIN Cars ON (Rent.CarNumber = Cars.CarNumber) GROUP BY Customer.CustomerLicenseNo

20 2. כתבו את השאילתה הבאה ב-SQL: לכל דגם של מכונית, כך שבכל מכונית מדגם זה נסעו לפחות 100 ק"מ, החזירו את מספר הלקוחות השונים ששכרו דגם זה ושמם מכיל את המילה "David". דגשים: איך מחזירים רק את הדגמים מתאימים? CREATE VIEW lessThen100 AS SELECT brand FROM Cars GROUP BY brand HAVING MIN(Miles)<100 השאילתה: SELECT Brand, COUNT( DISTINCT CustomerLicenseNo) FROM Cars C, Rent, Customer WHERE Brand NOT IN lessThen100 AND Cars.CarNumber = Rent.CarNumber AND Rent.CustomerLicenseNo = Customer.CustomerLicenseNo AND CustomerName LIKE %David% GROUP BY Brand

21 3. מה מחזירה השאילתה: SELECT DISTINCT Rent. CustomerLicenseNo, Rent.CarNumber FROM Rent WHERE (EXISTS (SELECT COUNT(*) FROM Rent AS MultRent WHERE MultRent.CustomerLicenseNo = Rent.CustomerLicenseNo GROUP BY MultRent.CarNumber HAVING Count(*) > 1)); כל הזוגות של נהג ומספר מכונית כך שהנהג שכר את המכונית וגם הנהג שכר מכונית כלשהי לפחות פעמיים

22 4. כתבו את השאילתה הבאה ב-SQL: עבור כל לקוח (בסדר עולה של שם לקוח) ששכר אי פעם רכב שמספר הקילומטרים שלו (כיום) גבוה מממוצע הקילומטרים של הרכבים הנמצאים בבסיס הנתונים (כיום), מצא את הקילומטרז' של הרכב בעל הקילומטרז' המינימלי שהוא שכר. החזירו את שמות הלקוחות ואת הקילומטראז'. SELECT CustomerName, min(miles) FROM Customers, Cars, Rent WHERE Customers.CustomerLicenseNo = Rent.CustomerLicenseNo AND Cars.CarNumber = Rent.CarNumber AND Customers.CustomerLicenseNo IN (SELECT Customers.CustomerLicenseNo FROM Rent, Cars, Customers WHERE Customers.CustomerLicenseNo = Rent.CustomerLicenseNo AND Cars.CarNumber = Rent.CarNumber AND Cars.Miles > (SELECT Avg(Miles) FROM Cars)) GROUP BY Customers.CustomerName ORDER BY Customers.CustomerName;

23 השאלה הבאה מתייחסת לרלציה Books(Book_Id, Book_Name, Faculty). נתונה השאילתא הבאה: SELECT B1.Faculty, COUNT (B1.Faculty) / (COUNT (DISTINCT B1.Book_Id) - 1) FROM Books B1, Books B2 WHERE B1.Faculty = B2.Faculty AND B1.Book_Id <> B2.Book_Id GROUP BY B1. Faculty; שאלה 6

24 מה מחזירה השאילתא עבור התוכן הבא של טבלת Books: Book_idBook_NameFaculty 1Database SystemsCS 2SQLCS 3Database SystemsCS 4Electronic CircuitsEE דוגמה – פתרון(1)

25 דוגמה – פתרון(2) לאחר הפעלת join ותנאי WHERE נקבל: Book_id1Book_Name1Faculty1Book_id2Book_Name2Faculty2 1Database SystemsCS2SQLCS 1Database SystemsCS3Database SystemsCS 2SQLCS1Database SystemsCS 2SQLCS3Database SystemsCS 3Database SystemsCS2SQLCS 3Database SystemsCS1Database SystemsCS

26 הסבר: קיבלנו עבור כל הקבצה של ספרים מאותה פקולטה, את כל הזוגות הסדורים השונים האפשריים של ספרים (שונים במובן שלא ייתכן שהזוג יופיע בתוצאת ה-join). לכן, אם בפקולטה מסוימת יש N ספרים שונים כך ש- N>1, אזי בהקבצה של הפקולטה הזו נקבל N*(N-1) רשומות (מספר הזוגות האפשריים) דוגמה – פתרון(3)

27 תוצאה סופית: כתבו במילים מה משמעות השאילתא. תשובה: לכל פקולטה שיש בה יותר מספר אחד, מוחזר שם הפקולטה ומספר הספרים (השונים) שנמצאים בה. דוגמה – פתרון(4) FacultyCount… CS3


Download ppt "חורף 2008-9DBMS - 236363, שפות שאילתה: SQL 1 SQL questions."

Similar presentations


Ads by Google