Presentation is loading. Please wait.

Presentation is loading. Please wait.

קורס קבצים ובסיסי נתונים

Similar presentations


Presentation on theme: "קורס קבצים ובסיסי נתונים"— Presentation transcript:

1 קורס קבצים ובסיסי נתונים
SQL Structured Query Language (Part 2) © פרופ' יהושע שגיב, האוניברסיטה העברית

2 שפת SQL שפת שאילתה מסחרית למסדי נתונים טבלאיים
כיום, כמעט כל מערכות מסדי הנתונים משתמשות בה כוללת: DDL = Data Definition Language Creating tables, views, indexes, triggers, assertions DML = Data Manipulation Language Insertions, Queries, Updates, Deletes

3 שאילתת SQL שאילתה כוללת את החלקים הבאים : Select From Where Group By
Having Order By שאילתה לא חייבת לכלול את כל המרכיבים מסדי נתונים תשס"ג הסדר בין מרכיבי שאילתה תמיד נשמר

4 שאילתת SQL בסיסית SELECT [Distinct] target-list FROM relation-list
WHERE condition; relation-list: רשימת היחסים המשתתפים בשאילתה target-list: רשימת התכונות שעליהן מתבצעת הטלת התוצאה condition: תנאי בוליאני DISTINCT: הורדת כפילויות מהתוצאה

5 הסמנטיקה של שאילתה A1,…,An((r1 … rm)) Select Distinct A1,…,An
From r1,…,rm Where  A1,…,An((r1 … rm))

6 שאילתה בלא Where A1,…,An(r1 … rm) Select Distinct A1,…,An
From r1,…,rm A1,…,An(r1 … rm)

7 שאילתה בלא הטלה Select Distinct * From r1,…,rm Where  (r1 … rm)

8 שאילתה בלא בחירה ובלא הטלה
Select Distinct * From r1,…,rm (r1 … rm)

9 טבלאות דוגמה Sailors sid sname rating age 22 31 58 Dustin Lubber Rusty
7 8 10 45.0 55.5 35.0 Boats bid bname color 101 103 Nancy Gloria red green Reserves sid bid day 22 58 101 103 10/10/02 11/12/02

10 שמות השייטים שהזמינו סירה אדומה לפחות פעם אחת
Select sname From Sailors S, Reserves R, Boats B Where S.sid = R.sid and B.bid = R.bid and color = ‘red’; Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

11 שמות של שייטים שמעולם לא הזמינו סירה אדומה (גרסה א')
Sailors that reserved a red boat All sailors Select sname From Sailors Minus Select sname From Sailors S, Reserves R, Boats B Where S.sid = R.sid and B.bid = R.bid and color = ‘red’; Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

12 שמות של שייטים שמעולם לא הזמינו סירה אדומה (גרסה ב')
Select sname From Sailors Where sid not in (Select R.sid From Reserves R, Boats B Where R.bid = B.bid and color = ‘red’); All sailors that are not in… Sailors that reserved a red boat Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

13 שמות של שייטים שמעולם לא הזמינו סירה אדומה (גרסה ג')
Select sname From Sailors S Where not exists (Select * From Reserves R, Boats B Where S.sid = R.sid and B.bid = R.bid and color = ‘red’); מדוע היחס Sailors לא מופיע בפסוקית From של תת השאילתה? Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

14 שאילתות לביטוי הכלה B  A  B – A = 
In B and not in A A B A B not in B  A  B – A =  not exists מסדי נתונים תשס"ג

15 שייט שהזמין את כל הסירות
שייט S שקבוצת הסירות שהזמין מכילה את קבוצת הסירות שיש ביחס Boats שייט S שעבורו לא קיימת סירה B ביחס Boats שהוא לא הזמין שייט S שעבורו לא קיימת (not exists) סירה B ביחס Boats כך ש-B אינה בקבוצת הסירות (not in) שהוזמנו על ידי S

16 שייטים שהזמינו את כל הסירות (I)
Select sname From Sailors S Where not exists (Select B.bno From Boats B Where B.bno not in (Select R.bno From Reserves R Where R.sid = S.sid)); סירות ש-S לא הזמין סירות ש-S הזמין

17 שייטים שהזמינו את כל הסירות (II)
Select sname From Sailors S Where not exists (Select bno From Boats B Minus Select R.bno From Reserves R Where R.sid = S.sid);

18 שייטים שהזמינו את כל הסירות (III)
Select sname From Sailors S Where not exists (Select * From Boats B Where not exists ( Select * From Reserves R Where R.bid = B.bid and R.sid = S.sid));

19 שאילתות SQL עם הקבצה Aggregate Queries

20 שאילתות עם הקבצה מוסיפים לשאילתות פסוקיות ליצירת הקבצה: Select From
Where Group By Having Order By Aggregation

21 פונקציות ההקבצה פונקציות ההקבצה (aggregate operators) ב-SQL הן:
COUNT(*) COUNT([DISTINCT] A) SUM([DISTINCT] A) AVG([DISTINCT] A) MAX(A) MIN(A)

22 מספר הסירות שיש ביחס Boats
Select count(*) From Boats; Select count(bid) From Boats; or Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

23 מספר הצבעים שיש לסירות Select count(distinct color) From Boats;
Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

24 הגיל הממוצע של שייטים שהזמינו סירות אדומות
Select avg(age) From Sailors S, Boats B, Reserves R Where S.sid = R.sid and B.bid = R.bid and color = ‘red’; Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

25 מהו הגיל של השייט המבוגר ביותר?
Select sname, max(age) From Sailors; Is this correct? Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

26 מהו הגיל של השייט המבוגר ביותר? (גרסה I)
Select sname, age From Sailors Where age = ( Select max(age) From Sailors); Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

27 מהו הגיל של השייט המבוגר ביותר? (גרסה II)
Select sname, age From Sailors Where age >=all(Select age From Sailors); Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

28 שאילתות SQL בסיסיות SELECT [Distinct] target-list FROM relation-list
WHERE condition GROUP BY grouping-list HAVING group-condition; target-list: שדות שמופיעים ב- grouping-list ופונקציות הקבצה group-condition: תנאי על פונקציות הקבצה ושדות שמופיעים ב- grouping-list

29 חישוב שאילתה מחשבים מכפלה קרטזית של היחסים שמופיעים ב- From
מוחקים רשומות שלא מקיימות את התנאי המופיע ב- Where מחלקים את הרשומות לקבוצות על פי ערכיהן בשדות המופיעים ב- grouping-list של ה- Group by מוחקים קבוצות שאינן מקיימות את התנאי המופיע ב- Having (group-condition) מכל קבוצה יוצרים רשומת תוצאה אחת על פי המופיע ב- Select

30 לכל דרגה, ממוצע הגילאים של שייטים מדרגה זו
כיצד מחשבים את הממוצע? כיצד בוחרים את השדות שלפיהם תתבצע ההקבצה (שימו לב ל-"לכל")

31 לכל דרגה, ממוצע הגילאים של שייטים מדרגה זו
Select rating, avg(age) From Sailors Group By rating; Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

32 40 55.5 34 Sailors sid sname rating age 22 31 58 63 78 84 Dustin
Lubber Rusty Fluffy Morley Popeye 7 8 10 45.0 55.5 35.0 44.0 31.0 33.0 Sailors sid sname rating age 22 63 78 31 58 84 Dustin Fluffy Morley Lubber Rusty Popeye 7 8 10 45.0 44.0 31.0 55.5 35.0 33.0 40 55.5 34

33 מספר ההזמנות לכל סירה אדומה
Select B.bid, count(*) as ResNo From Boats B, Reserves R Where R.bid = B.bid and B.color = ‘red’ Group By B.bid; האם ניתן להעביר את התנאי על הצבע ל- Having? Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

34 שמות של סירות שהוזמנו בלא יותר מ-5 ימים שונים
Select bname From Boats B, Reserves R Where B.bid = R.bid Group By B.bid, bname Having count(distinct day)<=5; האם ניתן להעביר את התנאי שמופיע ב- Having ל-Where? Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

35 הצבע שיש ממנו הכי הרבה סירות
האם השאילתה הבאה נכונה? Select color From Boats B Group By color Having max(count(bid)); מה הבעיה ?

36 הצבע שיש ממנו הכי הרבה סירות
Select color From Boats B Group By color Having count(bid) >=all (Select count(bid) Group By color);

37 שימוש בהקבצה לביטוי של כמתים
ניתן לעיתים להשתמש בפונקציות הקבצה כדי לבטא תנאי קיים (Exists) לכל (For all)

38 צבע שקיימת רק סירה אחת מצבע זה
Select color From Boats B1 Where not exists ( Select * From Boats B2 Where B1.bno <> B2.bno and B1.color = B2.color); בלא הקבצה כיצד ניתן להשתמש כאן בהקבצה? Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

39 צבע שקיימת רק סירה אחת מצבע זה
עם הקבצה Select color From Boats Group By color Having count(bid) = 1; Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

40 שייטים שהזמינו את כל הסירות
Select sname From Sailors S Where not exists (Select B.bno From Boats B Where B.bno not in (Select R.bno From Reserves R Where R.sid = S.sid)); בלי הקבצה, כפי שראינו קודם כיצד ניתן להשתמש כאן בהקבצה?

41 שייטים שהזמינו את כל הסירות
Select sname From Sailors S, Reserves R Where S.sid = R.sid Group By S.sid, sname Having count(distinct bno) = (Select count(bno) From Boats); עם הקבצה Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

42 מיון התוצאות ניתן להשתמש בפסוקית ORDER BY על מנת למיין את התוצאות של שאילתה לפי שדה אחד או יותר ניתן לקבוע האם המיון יהיה בסדר עולה ASC או יורד DESC ברירת המחדל היא סדר עולה

43 שמות השייטים שגילם מעל 50 בסדר עולה על פי דירוג ותת סידור יורד לפי גיל
Select sname, rating, age From Sailors S Where age > 50 Order By rating Asc, age Desc Sailors(pid, sname, rating, age) Boats(bid, bname, color) Reserves(sid, bid, day)

44 שאילתות מורכבות מעוניינים בשאילתה שתוצאתה כוללת את שלוש העמודות הבאות:
מזהה שייט גיל שייט גיל מכסימלי של כל שייטים כיצד ניתן לבצע זאת?

45 ניסיון 1 האם זהו פתרון נכון? Select S.sid, S.age, MAX(S.age)
From Sailors S; האם זהו פתרון נכון?

46 ניסיון 2 האם זהו פתרון נכון? Select S.sid, S.age, MAX(S.age)
From Sailors S Group By S.name, S.age; האם זהו פתרון נכון?

47 פתרון 1: תת-שאילתה ב- From
Select S.sid, S.age, M.mxage From Sailors S,(Select MAX(S2.age) as mxage From Sailors S2) M; ניתן לכתוב תת-שאילתה ב- From ולהתייחס אל תוצאת השאילתה כאל טבלה לשאילתה ב- From יש לתת שם על ידי משתנה (M בדוגמה זו)

48 פתרון 2: תת-שאילתה ב- Select
Select S.sid, S.age, (Select MAX(S2.age) From Sailors S2) From Sailors S; שאילתה ב- Select חייבת להחזיר ערך יחיד עבור כל שורת Select

49 דוגמה נוספת לתת-שאילתה ב- Select
Select S.sid, S.age, (Select MAX(S2.age) From Sailors S2 Where S2.age<S.age) From Sailors S; השאילתה מחזירה, לכל שייט S, את הגיל של השייט המבוגר ביותר מבין השייטים הצעירים מ- S שימו לב לשימוש של המשתנה S, שמוגדר מחוץ לשאילתה הפנימית, בשאילתה

50 דוגמה נוספת לתת-שאילתה ב- From
Select S.sid, S.age, M.mxage From Sailors S, (Select MAX(S2.age) as mxage From Sailors S2 Where S2.age<S.age); האם זוהי שאילתה תקינה?

51 פתרון 3: טבלת ביניים ניתן לייצר טבלה שהיא תוצאה של שאילתה
Create Table MaxAge as Select MAX(S.age) as mxage From Sailors S; Select S.sid, S.age, M.mxage From Sailors S, MaxAge M;

52 תצפיות (Views) תצפית (View) היא מעין טבלה וירטואלית המוגדרת בעזרת שאילתה ניתן להתייחס ל-View כאל טבלה ולהשתמש בו כטבלה אף שהוא לא מכיל נתונים (פרט למקרה מיוחד שנקרא materialized view) תצפית מאפשרת למשל הסתרה של הלוגיקה של שאילתה מסובכת לשימוש בשאילתות עתידיות

53 תצפיות יתרונות: חסרונות: לא נדרשת הקצאת זיכרון כמו לטבלה
עדכון טבלאות לא דורש עדכון של תצפיות שמתבססות על טבלאות אלו (מדוע?) מאפשר אופטימיזציה של שאילתות שתצפית משולבת בהן חסרונות: עלות של זמן חישוב ושל משאבי חישוב בעת חישוב שאילתות מעל תצפיות תצפית לא נשמרת אם נעשית מחיקה של טבלאות שהתצפית מתבססת עליהן

54 הגדרת תצפיות (Views) במקום לייצר טבלה ניתן לייצר תצפית (View)
Create Or Replace View MaxAge as Select MAX(S.age) as mxage From Sailors S; Select S.sid, S.age, M.mxage From Sailors S, MaxAge M;

55 דוגמה נוספת לשימוש בתצפית
Create Or Replace View MaxAges as Select S1.sid, S2.age as mxage From Sailors S1, Sailors S2 Where S2.age = (Select MAX(S3.age) From Sailors S3 Where S3.age < S1.age); Select S.sid, S.age, M.mxage From Sailors S, MaxAges M Where S.sid = M.sid;

56 Grades(Login, Exercise, Grade)
תצפיות להגבלת גישה נתונה הטבלה הבאה: Grades(Login, Exercise, Grade) רוצים שמשתמש יוכל לראות את הציונים שלו בלבד יוצרים את התצפית הבאה ומעניקים הרשאות לשאילתות על התצפית Create Or Replace View UserGrades as Select * From Grades Where Login = User; שדה שמגדירה המערכת ומכיל את שם המשתמש


Download ppt "קורס קבצים ובסיסי נתונים"

Similar presentations


Ads by Google