View
231
Download
0
Category
Preview:
Citation preview
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
1
SQLשאילתות
. קיימות selectקיימת שאילתה בסיסית אחת לאיחזור מידע מבסיס הנתונים: פקודת SQLב , שיתוארו בהדרגה. נשתמש בתבניות בסיס הנתונים של SQLב selectאופציות רבות לפקודת ה
מערכת הבנק:
•Branch-scheme=(branch-name, assets, branch-city)
•Customer-scheme=(customer-name, street,customer-city)
•Deposit-scheme=(branch-name, account-number, customer-name, balance)
•Borrow-scheme=(branch-name, loan-number, customer-name, amount)
טבלה עשויה SQLלבין שאילתת אלגברת יחסים: ב SQLנציין כי יש הבדל חשוב בין שאילתת יות, כיוון nשל קבוצהאינה, בדרך כלל, SQLיות זהות )או יותר(. כלומר טבלת nכיל שתי לה
)או שק( של multisetמהוות אוסף, SQLשבקבוצה אין משמעות לשני אברים זהים. טבלות n יות. טבלאותSQL תקיימו עליהן אילוצים של מפתח או אם נעשה שימוש יתהיינה קבוצות אם
. distinctבאופצית
בסיסיות SQLשאילתות .1
. המבנה של select, from, whereהבסיסית מורכבת משלושת פסוקים: SQLשאילתת השאילתה הבסיסית הוא:
select <attribute list>
from <table list>
where <condition> כאשר:
<attribute list> .היא רשימה של תכונות שאת ערכיהן מאחזרים
<table list> .היא רשימה של שמות יחסים שעליהם פועלת השאילתה <condition> הוא ביטוי בוליאני המזהה את הn.יות המאוחזרות
נציג כעת את השאילתה הבסיסית בעזרת כמה דוגמאות.
0שאילתא '.Moragמצא את הרחוב ושם העיר של לקוח ששמו '
select street, customer-city
from customer
where customer-name=’Morag’
יות n. השאילתה מאחזרת את הfromהמופיע בפסוק customerשאילתה זו ניגשה רק ליחס , ואז מטילה את התוצאה על התכונות whereהמקיימות את התנאי בפסוק ה customerביחס
street וcustomer-city:שאילתה זו שקולה לביטוי הבא באלגברת יחסים .
street, customer-city (customer-name=’Morag’ (customer))
, השאילתה שקולה )כמעט( SQLשל שאילתת fromכלומר כאשר מופיע יחס אחד בפסוק ה מגדיר את התכונות שעליהן selectלצירוף של פעולות בחירה והטלה של אלגברת יחסים. פסוק ה
מגדיר את תנאי הבחירה. whereמבצעים הטלה, ופסוק ה יות כפולות, כיוון שהשאילתה nעשויה לכלול SQLההבדל היחיד הוא שהתוצאה של שאילתת
אינה כופה את האילוץ שיחס הוא למעשה קבוצה.
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
2
1שאילתא
ש"ח 300בסכום מעל ’Aviv‘מצא את שמות הלקוחות שיש להם חשבון חיסכון בסניף select customer-name
from deposit
where branch-name=’Aviv' and balance>300
and, or, notניתן להרכיב פרדיקטים מורכבים מפרדיקטים פשוטים יותר ע"י המקשרים בדומה לאלגברת יחסים.
מכפלה קרטזית .2
2שאילתא '.Avivמצא את שמות וכתובות הלקוחות שיש להם חשבון חיסכון בסניף '
select customer.customer-name,street, customer-city
from customer, deposit
where customer.customer-name = deposit.customer-name
and branch-name=’Aviv'
בחירה, והתנאי -הוא תנאי 'branch-name=’Avivהתנאי whereבפסוק ה customer.customer-name = deposit.customer-name הוא תנאי הצירוף בין היחסים
deposit וcustomer ,כפי שניתן לראות כאשר מופיעות שתי תכונות )או יותר( בעלות שם זהה .חייבים לשייך כל אחת מהתכונות ליחס שאליו היא שייכת. הדבר נעשה כמו באלגברת היחסים,
(.deposit.customer-nameע"י הקדמת שם היחס לשם התכונה, והפרדתם בעזרת נקודה )למשל
לשאילתת אלגברת יחסים הכוללת מכפלה קרטזית, בחירה והטלה:שאילתה זו שקולה ( city-name street, customer-customer.customer
customer.customer-name =deposit. customer-name branch-name=’Aviv' (customer x deposit))
3שאילתא
’Jaffa‘ניף כלשהו הנמצא בעיר מצא את שמות וכתובות הלקוחות שיש להם חשבון חיסכון בסselect customer.customer-name,street, customer-city
from customer, deposit, branch
where customer.customer-name = deposit.customer-name
and deposit.branch-name= branch.branch-name and branch-city=’Jaffa’
כינוי .3 4שאילתא
’Morag‘את שמות וכתובות הלקוחות שגרים בעיר שבה גר מצא
select C.customer-name,C.street, C.customer-city
from customer M, customer C
where C.customer-city = M.customer-city and M. customer-name=’Morag’
מיד אחרי שם היחס בפסוק ה . הכינוי יבוא customerליחס Cו Mכאן הכרזנו על כינויים from ניתן לחשוב על הכינויים .C וM כעל שני עותקים שונים של היחסcustomer ניתן ;
, גם אם אין בה גישה ליחס מסוים יותר מפעם אחת. למשל SQLלהשתמש בכינוי בכל שאילתת בצורה הבאה: 2ניתן לכתוב את שאילתה
select C.customer-name,street, customer-city
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
3
from customer C, deposit D
where C.customer-name = D.customer-name
and branch-name=’Aviv'
ושימוש ב * whereהעדר פסוק .4
יות. כלומר כל n, אין בשאילתה תנאי בחירה על whereפסוק אינה כוללת SQLכאשר שאילתת כאשר . where TRUEה. זה שקול ל ייבחרו בתוצאת השאילת fromיות של היחס בפסוק ה nה
יות של nכולל יותר מיחס אחד, אזי כל ה fromופסוק ה whereפסוק אינה כוללת SQLשאילתת יבחרו. fromהמכפלה הקרטזית של היחסים בפסוק ה
5שאילתא
מצא את שמות כל סניפי הבנקselect branch-name
from branch 6שאילתא
יות של שמות סניפים עם מספרי חשבונות חיסכוןמצא את כל הקומבינצselect branch-name, account-number
from branch, deposit
יות שנבחרו, אין צורך לציין את שם כל התכונות בפסוק nכדי לאחזר את ערכי כל התכונות של התציג את כל 7 שקול ל"כל התכונות". שאילתה select )כוכבית( בפסוק ה *. ציון של selectה
depositתציג את כל התכונות של 8; שאילתה ’Jaffa‘ערכי התכונות של סניפים הנמצאים בעיר והלקוחות המהווים בעלי ’Aviv‘לכל חשבונות החיסכון בסניף customerואת כל התכונות של
החשבונות הללו.
7שאילתה select *
from branch
where branch-city=’Jaffa’ 8אילתה ש
select *
from customer, deposit
where customer.customer-name = deposit.customer-name
and branch-name=’Aviv'
SQLטבלאות כקבוצות ב .5
אינה מתייחסת ליחס )בסיסי או תוצאה של שאילתה( כאל קבוצה. SQLכפי שצוין, בדרך כלל אינה מסלקת כפילויות כאלה SQLות זהות אחדות. יnבתוצאה של שאילתה, עשויות להופיע
באופן אוטומטי מכמה סיבות:סילוק כפילויות היא פעולה יקרה. אחת הדרכים היעילות לממש אותה היא ראשית למיין את
יות ואז לסלק כפילויות.nה יות כפילות בתוצאה של שאילתה.nהמשתמש עשוי להיות מעוניין לראות
יות כפילות.nיות, ברוב המקרים אין מעוניינים לסלק nופעלת על כאשר פונקצית הקבצה מ
, selectבפסוק ה distinctיות כפילות משתמשים במילת המפתח nאם בכל זאת מעוניינים לסלק SQLיות שונות זו מזו תישארנה בתוצאה. זה הופך את תוצאת שאילתת nשפירושה היא שרק
ורמלית של יחס.יות בהתאם להגדרה הפnליחס, קבוצה של . אם סכום ’Aviv‘תאחזר את סכומי היתרות של חשבונות החיסכון בסניף 9למשל, שאילתה
פעמים אחדות )למשל אם חשבון מסוים שייך ללקוחות אחדים(, הוא depositמסוים מופיע ביחס יופיע פעמים אחדות גם בתוצאת השאילתה:
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
4
9שאילתה
.’Aviv‘יף בסנמצא את יתרות חשבונות החיסכון
select balance
from deposit
where branch-name=’Aviv’
אם מעוניינים רק ברשימת ערכים ללא כפילויות, כלומר שכל סכום יופיע פעם אחת בלבד,
: distinctמשתמשים ב select distinct balance
from deposit
where branch-name=’Aviv’
SQL לותממשה באופן ישיר את פעו-( הקבוצהset operations של אלגברת יחסים: פעולת )( וחיתוך exceptאו minus(, וכן בניבים שונים גם פעולות של החיסור )unionהאיחוד )
(intersectהתוצאה של שאילתה המשתמש בפעולת .)- קבוצה היא תמיד קבוצה, כלומרn יותמייד אחרי הפעולה, למשל allתח כפילות מסולקות מהתוצאה )אלא אם כן מופיעה מילת המפ
union allקבוצה מוגדרת רק אם היחסים שעליהם היא פועלת -(. כמו באלגברת יחסים, פעולת הם בעלי תבניות תואמות.
10שאילתה
)בעלי חשבונות חיסכון ו/או חשבונות הלוואה( ’Aviv‘מצא את שמות כל הלקוחות של סניף
(select customer-name
from deposit
where branch-name=’Aviv’)
union
(select customer-name
from borrow
where branch-name=’Aviv’)
SQLחישובים בשאילתות .6. whereאו כחלק מפסוק ה selectבפסוק ה SQLניתן לכלול חישובים אריתמטיים בשאילתת
'/' )חיבור, חיסור, כפל, חילוק( על ', '*' ו-ניתן להפעיל את האופרטורים האריתמטיים '+' , ' ערכים נומריים בשאילתה.
11שאילתה
אם כל חשבון חיסכון ’Aviv‘הראה את מספרי החשבון ואת יתרות כל חשבונות החיסכון בסניף מיתרתו. 10%בסניף זה יזכה בתוספת של
select account-number, 1.1*balance
from deposit
where branch-name=’Aviv’
12שאילתה
, המתאר את interest -נניח כי תבנית חשבונות החיסכון כוללת גם את התכונה "ריבית שנתית" מצא את שם הבעלים, מספרי חשבונות החיסכון ואת היתרות של . הריבית השנתית באחוזים
ש"ח. 500חשבונות החיסכון שהריבית השנתית שלהם גדולה מ
select customer-name, account-number, balance
from deposit
where balance*interest/100 > 500
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
5
שאילתות מקוננות והשוואת קבוצות .7
הנתונים יאוחזרו ראשית ואז יעשה בהם -ביצוע שאילתות מסוימות מחייב כי ערכים מבסיסות מקוננות, שימוש בתנאי של השוואה. שאילתות מסוג זה ניתן לנסח על ידי שימוש בשאילת
של שאילתה אחרת. השאילתה ה"אחרת" whereשלמות בתוך פסוק selectשמהוות שאילתות למשל, בוצעה ללא שאילתה מקוננת, אך 9(.שאילתה outer queryנקראת "שאילתה חיצונית" )
ניתן לבצעה גם במבנה מקונן:select customer-name
from customer
where customer-name in (select customer-name
from deposit
where branch-name=’Aviv’)
or
customer-name in (select customer-name
from borrow
where branch-name=’Aviv’)
היות והשאילתה הראשית שולפת distinctראוי לשים לב כי בשאילתה הראשית אין צורך לציין יות nשבו היא מהווה מפתח קביל, כך ש customerהיחס מ customer-nameאת הערך של
של השאילתה הראשית היינו מציינים את fromכפילות לא תיתכנה בתוצאה. אילו בפסוק ה .selectבפסוק ה distinct במקום זאת, היינו צריכים לציין depositהיחס
ות בעלות אותו מבנה. יnית ערכים בסוגריים עם קבוצה של nיכול גם להשוות inהאופרטור למשל השאילתה
13שאילתה
select customer-name
from customer
where (street, customer-city) in (select street, customer-city
from customer
where customer-name=’Morag’)
. ’Morag‘תבחר את שמותיהם של כל הלקוחות שגרים באותו רחוב ועיר שבה גר הלקוח
vיש מספר אופרטורי השוואה נוספים שבאמצעותם ניתן להשוות שערך יחיד inבנוסף לאופרטור )בדרך כלל שאילתה מקוננת(. V)בדרך כלל ערך של תכונה מסוימת( לקבוצת ערכים
, ולכן שקול Vשווה לאחד הערכים בקבוצה vאם הערך trueמחזיר ערך some=האופרטור . <> ,=> ,> ,=< ,<כוללים: some. אופרטורים נוספים שניתן לשלב עם inלאופרטור
(. למשל, <> ,=> ,> ,=< ,< ,=לכל אחד מהאופרטורים הנ"ל ) allניתן לצרף את מילת המפתח . כדוגמה:Vגדול מכל הערכים בקבוצה vאם הערך true( יחזיר v > all Vהתנאי )
14שאילתה
’Aviv‘שיש להם חשבון חסכון בעל יתרה הגדולה מכל היתרות בסניף מצא את שמות החוסכיםselect distinct customer-name
from deposit
where balance > all (select balance
from deposit
where branch-name=’Aviv’)
-ל דובמקרה הכללי עשויות להיות מספר רמות של שאילתות מקוננות. שוב קיימת אפשרות שמשמעות של שמות התכונות אם קיימות תכונות בעלות שמות זהים בשאילתה החיצונית
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
6
ובשאילתה הפנימית. הכלל הוא שאם מצוינת תכונה ללא שם יחס, היא מתייחסת ליחס המוגדר בשאילתה המקוננת הפנימית. כלל זה דומה מאד לצורה שבה מוגדרים משתנים לוקליים בשפות
קל. לדוגמה:עיליות רבות כמו פס
15שאילתה מצא את הסכום ואת מספר החשבון של כל חשבון הלוואה שיש חשבון חיסכון בסכום זהה לסכום
של חשבון ההלוואה באותו סניף.select distinct loan-number, amount
from borrow B
where amount in (select balance
from deposit
where branch-name=B.branch-name)
-branchכיוון שתכונה זו מתייחסת ל תכונה B.branch-nameבשאילתה המקוננת חייבים לציין
name שלborrow בשאילתה החיצונית. התכונהbranch-name ללא ציון שם יחס מתייחסת בשאילתה הפנימית. depositליחס
תוך select… from … whereבלוקים של באופן כללי, שאילתה הנכתבת במבנה מקונן של
או אופרטור השוויון יכולה תמיד להיכתב בשאילתה של בלוק אחד. inשימוש ב יכולה להיכתב גם בצורה: 15למשל שאילתה מס'
select distinct loan-number, amount
from borrow B, deposit D
where B.branch-name=D.branch-name and amount = balance
SQL וללת גם אופרטור השוואה כcontains בין קבוצות. אופרטור זה אינו ממומש בחלק מןאם אחת true. אופרטור זה משווה שתי קבוצות ומחזיר ערך SQLהניבים המסחריים של
הקבוצות מכילה את הקבוצה האחרת.
16שאילתה חיסכון. יש בהם חשבונות ’jaffa‘מצא את שמות הסניפים שלכל האנשים הגרים ב
select branch-name
from branch B
where (select customer-name
from deposit
where branch-name=B.branch-name)
contains
(select customer-name
from customer
where customer-city=’jaffa’)
שאילתה החיצונית( בשאילתה זו, השאילתה המקוננת השנייה )שהיא קבועה ואינה מקושרת ל( השאילתה המקוננת הראשונה Bיה של סניף )n. לכל ’jaffa‘מוצאת את שמות כל הלקוחות ב
מוצאת את שמות הלקוחות שביש להם חשבון חיסכון באותו סניף. שים לב כי פעולה זו שקולה לפעולת החילוק באלגברת היחסים.
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
7
existsפונקצית .8
בדוק אם התוצאה של שאילתה מקוננת אינה ריקה. הפונקציה ל SQLמשמשת ב existsפונקצית יות . לדוגמא:nהשאילתה מכילה -אם תת trueמחזירה ערך
17שאילתה
’Aviv‘מצא את שמות האנשים שיש להם חשבון חיסכון וגם חשבון הלוואה בסניף select distinct customer-name
from deposit D
where branch-name=’Aviv’ and
exists (select *
from borrow B
where branch-name=’Aviv’ and D.customer-name=B. customer-name )
.9במבנה של שאילתה intersectשאילתה זו ניתן כמובן לבצע גם בדרכים אחרות, למשל בעזרת ריקה.השאילתה -אם תת trueהמחזירה ערך not existsניתן באופן דומה להשתמש ב
18שאילתה
ש"ח. 400מצא את שמות האנשים שאין להם אף חשבון חיסכון בסכום מעל select customer-name
from customer C
where not exists (select *
from deposit D
where D.customer-name=C. customer-name
and balance>400)
( מחשבים את השאילתה המקוננת, שמאחזרת Cית לקוח )nניתן להבין שאילתה זו כדלקמן: לכל ש"ח. אם קבוצה זו ריקה, 400יות חשבונות ההפקדה של הלקוח בסכום מעל nאת קבוצת כל
ש"ח. 400ללקוח אין אף חשבון בסכום מעל
. למשל, containsגם בדיקת הכלה שבוצעה בעזרת not existsו existsניתן לבצע באמצעות יכולה להתבצע גם בדרך הבאה: 16' שאילתה מס
16שאילתה א יש בהם חשבונות חיסכון. ’jaffa‘מצא את שמות הסניפים שלכל האנשים הגרים ב
select branch-name
from branch B
where not exists
(select *
from customer
where customer-city=’jaffa’ and
customer-name not in (select customer-name
from deposit
where branch-name=B.branch-name)
: מצא שמות סניפים, כך שלא 16המבנה של שאילתה זו תואם את הניסוח מחדש של שאילתה שאין לו חשבון חיסכון בסניף. ’jaffa‘קיים אדם הגר ב
זוהי צורה נוספת לבצע את פעולת החילוק של אלגברת היחסים.
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
8
nullרשות וערכי קבוצות מפו .9
גם בקבוצות מפורשות של ערכים. קבוצה כזו מוקפת בסוגריים. whereניתן להשתמש בפסוק ה
19שאילתה .’Tsafon‘או ’Darom’, ‘Merkaz‘מצא את שמות האנשים שיש להם חשבון חיסכון בסניף
select distinct customer-name
from deposit
where branch-name in (‘Darom’, ‘Merkaz’, ‘Tsafon’)
SQL ( מאפשרת גם לבדוק אם ערך מסוים הוא ערך דמהnull כלומר חסר או לא מוגדר. אבל ,), false. השוואה כזו תיתן תמיד nullלא ניתן להשתמש ב = או >< לצורתך השוואה של תכונה ל
אחרים! nullכאל ערך ייחודי, שונה מערכי nullמתייחסת לכל ערך SQLמפני ש . is not nullאו ב is nullבמקום זאת ב :SQLלכן משתמשים ב
20שאילתה
, כלומר ששם הסניף כלל לא מצא את מספרי חשבונות החיסכון שאינם משוייכים לסניף כלשהו . )מצב בלתי רצוי כלל שבמערכת ריאלית לא היה קורה(מוזן
select distinct account-number
from deposit
where branch-name is null
פונקציות הקבצה והקבצה .10
יות. פונקציות אלה נקראות פונקציות nלעתים שכיחות יש צורך להפעיל פונקציות על קבוצות של (. הארגומנט של פונקצית הקבצה הוא אוסף של ערכים )לאו aggregate functionsהקבצה )
ה תמיד ערך יחיד. דווקא קבוצה( . פונקצית הקבצה מחזיר count. הפונקציה count, sum, max, min, avgיש חמש פונקציות הקבצה מובנות: SQLב
avgו max, min, sumיות או הערכים הנבחרים בשאילתה. הפונקציות nמחזירה את מספר המחזירות בהתאמה את סכום הערכים, את הערך המינימלי, המקסימלי, ואת הערך הממוצע של
)שיתואר havingאו בפסוק selectם אלה. ניתן להשתמש בפונקציות אלה בפסוק ה ערכי . )בהמשך
count(*) מספר השורות
count(column) שורות שבהן הערך בעמודה אינו ספר המ null
count(distinct column) שאינם ,בעמודה כים השוניםהערמספרnull
sum(column) םאינש ,הערכים בעמודה סכום null
max(column), min(column) שאינם מינימום ומקסימום של הערכים בעמודה ,null
avg(column) םאינש ,הערכים בעמודה ממוצע null
דוגמאות:
21שאילתה מצא את הסכום, ואת הערך המירבי והמינימלי של ערכי הנכסים של הבנקים.
select sum(assets), max(assets), min(assets)
from branch
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
9
מתאים. whereיות אזי יש להשתמש בפסוק nאם ברצוננו לבצע שאילתה כזו על חלק מה
22שאילתה . ’Jaffa‘מצא את הערך המירבי והמינימלי של חשבונות החיסכון של לקוחות שגרים בעיר
select sum(balance), max(balance s), min(balance)
from deposit, customer
where customer-city=’Jaffa’ and customer.customer-name=deposit.customer-name
23שאילתה מצא את מספר סניפי הבנקים
select count(*)
from branch
24שאילתה . ’Jaffa‘חשבונות החיסכון של לקוחות שגרים בעיר מצא את מספר
select count(*)
from deposit, customer
where customer-city=’Jaffa’ and customer.customer-name=deposit.customer-name
מחזירה את מספר (*)countיות(, כלומר nהכוכבית )*( מתייחסת לשורות ) 24ו 23בשאילתות , אם יש חשבון מסוים שמשותף לשני לקוחות הגרים ב 24השורות בתוצאת השאילתה. בשאילתה
‘jaffa’ א ייספר פעמיים, כיוון שיהיו שתי הוn יות שיענו על קריטריון הבחירה בפסוק הwhere . לספור ערכים בעמודה מסוימת. למשל בדוגמה הבאה: countניתן להשתמש ב
25שאילתה
הערים השונות שבהם יש לקוחות של הבנקמצא את מספר select count(distinct customer-city)
from customer , כיוון (*)countהיה נותן ערך כמו של count(customer-city)ש לשים לב כי בשאילתה זו, י
שסופרים גם ערכים חוזרים.
26שאילתה מצא את שמות הלקוחות שיש להם חשבונות חיסכון בסניפי בנק בשתי ערים שונות לפחות.
select distinct D.customer-name
from deposit D
where (select count(distinct branch-city)
from deposit P, branch B
where B.customer-name=D.customer-name and
P.branch-name= B.branch-name) >=2
השאילתה הפנימית סופרת את מספר הסניפים השונים שלכל לקוח יש; אם ערך זה גדול או שווה ( תיבחר.Dיה של חשבון הלקוח )nלשתים , ה
יות ביחס, בהתאם nקבוצות של -במקרים רבים מעוניינים להפעיל פונקצית ההקבצה על תת
לערכים של תכונה מסוימת. למשל, אם אנו מעוניינים למצוא את היתרה הממוצעת בכל סניף, או יות שיש להם ערך משותף nחשבונות החיסכון של כל לקוח. במקרה זה עלינו לקבץ את המספר
המתאימה, ולהפעיל את פונקצית ההקבצה על כל קבוצה כזו בנפרד. את זה עושה פסוק בתכונה
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
10
group by שלSQL פסוק .group by מציין את התכונה )תכונות( שערכיה מגדירים את . selectעשויות להופיע בפסוק ה group byהקבוצות. רק תכונות המופיעות בפסוק ה
27שאילתה
שבון חיסכון אחד או יותר, הדפס את שם הלקוח, את מספר חשבונות לכל לקוח שיש לו ח החיסכון שלו ואת הסכום הכולל של היתרות.
select customer-name, count(*), sum(balance)
from deposit
group by customer-name
"התכונה יות עם אותו ערך של nחולקו לקבוצות. בכל קבוצה depositיות היחס nבשאילתה זו . כלומר בכל קבוצה יופיעו רק חשבונות חיסכון של לקוח אחד. customer-nameהמקבצת" מופעלות על כל אחת מהקבוצות הללו. sumו countהפונקציות
התוצאה של שאילתה כזו עשויה להיראות כדלקמן:Sum(balance) count(*) customer-name
300 1 Even
550 2 Morag
1500 4 Tal
1200 3 Levi
28שאילתה עבור לקוחות שיש להם חשבונות חיסכון: מצא כמה חשבונות חיסכון יש ללקוחות הגרים בכל
רחוב בכל עיר.select customer.customer-city, street, count(distinct account-number)
from customer C, deposit D
where C. customer-name=D. customer-name
group by street, customer-city
(. במקרה זה, group by( וכן הקבצה ) whereבשאילתה זו מופיעה תנאי בחירה )בפסוק ה יות על פי תנאי הבחירה בפסוק ה nפונקציות ההקבצה מופעלות לאחר בחירת ה ההקבצה וכן
whereבות בלבד(: . דוגמא לתוצאה אפשרית )בהנחה שלקוחות הבנק גרים בארבעה רחו
count(distinct account-number) Street customer-city
3 Pinkas Jaffa
5 Allenby Jaffa
4 Etzel Rishon
6 Lehi Rishon
לעתים מעוניינים באיחזור של ערכי פונקציות הקבצה רק לגבי קבוצות המקיימות תנאי כלשהו.. . group byשוי להופיע יחד עם פסוק ה , שע havingאת הפסוק SQLלצורך זה מספקת
having מהווה תנאי על קבוצות שלn יות, כפי שקובצו על ידי פסוק הgroup by רק קבוצות , תופענה בתוצאת השאילתה. havingהמקיימות את תנאי ה
29שאילתה
לכל לקוח שיש לו חשבון לפחות שלושה חשבונות חיסכון, הדפס את שם הלקוח, את מספר בונות החיסכון שלו ואת הסכום הכולל של היתרות.חש
select customer-name, count(*), sum(balance)
from deposit
group by customer-name
having count(*)>=3
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
11
יות שעליהן יפעלו הפונקציות, פסוק ה nמגביל whereחשוב לשים לב כי תנאי הבחירה בפסוק ה
having מות של מגביל קבוצות שלn.יות
והשני על הפונקציה בפסוק selectבמקרה שיש שני תנאים שונים )האחד על הפונקציה בפסוק ה (. למשל, נניח כי אנו מעוניינים לספור בכל סניף את מספר הלקוחות שיש להם חשבון havingה
כון.חשבונות חיס 5ש"ח, אבל רק לסניפים שיש בהם לפחות 4000חיסכון עם יתרה גדולה מ
select branch-name, count(distinct customer-name)
from deposit
where balance>4000
group by branch-name
having count(distinct account-number)>=5
חשבונות חיסכון עם יתרה 5שאילתה זו שגויה, מכיוון שהיא תציג רק סניפים שיש בהם לפחות יות הבודדות. אז nמבוצע ראשון לבחירת ה whereשהכלל הוא: פסוק ה . זאת מפני4000גדולה מ
יות. הדרך הנכונה לבצע nלבחירת קבוצות של havingמתבצעת ההקבצה ורק אז מתבצע פסוק ה את השאילתה היא:
30שאילתה
חשבונות חיסכון, הצג את מספר הלקוחות שיש להם חשבון 5עבור סניפים שיש בהם לפחות ש"ח. 4000עם יתרה גדולה מ חיסכון
select branch-name, count(distinct customer-name)
from deposit
where balance>4000 and
branch-name in (select branch-name
from deposit
group by branch-name
having count(distinct account-number)>=5 )
group by branch-name
השוואת תת מחרוזות .11
SQL מחרוזת של תווים באמצעות אופרטור ההשוואה -מאפשרת לבצע השוואה על תתיlike .מחרוזות חלקיות ניתנות להגדרה באמצעות שני תווים שמורים: '%' מייצג מספר כלשהו של
תווים )כולל מחרוזת ריקה(, ו '_' מייצג תו שרירותי אחד.
31שאילתה . ’R‘הלקוחות ששם העיר בה הם גרים מתחילה ב מצא את פרטי
select *
from customer
where customer-city like ‘R%’
32שאילתה . ’t‘מצא את פרטי הסניפים שהאות השנייה של שמם היא
select *
from branch
where branch like ‘_t%’
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
12
מיון התצוגה .12
SQL מאפשרת למשתמש לסדר את הnוצאה של שאילתה על פי הערכים של תכונה אחת יות בת . order byאו יותר, באמצעות פסוק ה
33שאילתה
. מיין את החשבונות על פי שמות הלקוחות, ואת ’Aviv‘מצא את פרטי חשבונות חיסכון בסניף כל החשבונות השייכים ללקוח אחד מיין על פי היתרה.
select *
from deposit
where branch-name=’Aviv’
order by customer-name, balance
. descברירת המחדל היא מיון בסדר עולה. לצורך מיון בסדר יורד יש לציין את מילת המפתח כדי לציין מפורשות מיון בסדר עולה. למשל אם בשאילתה ascניתן גם להשתמש במילת המפתח
בסדר יורד )כלומר בין כל החשבונות של הקודמת היינו רוצים שהמיון המשני, על פי היתרה יהיהשל השאילתה order byלקוח מסוים יופיע ראשון החשבון עם יתרה מירבית וכו'( אזי פסוק ה
היהorder by customer-name asc, balance desc
joinפעולות .13
יות מיחסים אחדים, על פי שדה/שדות nדרכים נוספות לצרף QL Sפרט למכפלה קרטזית ישבפעולה אחת, ללא צורך במכפלה קרטזית ובחירה SQL למשל צירוף טבעי מתאפשר ב. משותפים
(. 3ו 2)וראה שאילתות .fromנכתבות כמעין תת שאילתה בפסוק ה joinת ה פעולו
, הבאיםעם המופעים הרגעיים accountו ownerנדגים את פעולות הצירוף עם היחסים
owner account-num customer-name
101 Even
203 Morag
417 Tal
account balance branch-name account-num
3000 Darom 101 4000 Aviv 203 7000 Tsafon 155
34שאילתה . 5000שמות בעלי חשבונות החיסכון שיתרתם קטנה מ מצא את
select customer_name
from owner inner join account on owner.account-num = account. account-num
where balance < 5000
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
13
מאפשרת ביצוע של פעולת הצירוף הטבעי )של אלגברת היחסים( והכללה של inner joinפעולת ה צירוף טבעי בכל מקרה שלעמודות שאנו רוצים לצרף יש שמות שונים.
ת השאילתה תכלול עמודות כפולותתוצאbalance branch-name account-num account-num customer-name
3000 Darom 101 101 Even 4000 Aviv 203 203 Morag
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
14
, ניתן לבצע צירוף טבעי בדומה לצירוף זהיםשלעמודות שאנו רוצים לצרף יש שמות מקרה בכל הטבעי שראינו באלגברת היחסים. זהו בדיוק המקרה של השאילתא הנ"ל )לשתי העמודות
(. account-num –רפות יש שם זהה המצו
select customer_name
from owner natural inner join account
where balance < 5000
תופיע בתוצאה פעם אחת בלבד. account-numבמקרה זה העמודה
balance branch-name account-num customer-name 3000 Darom 101 Even 4000 Aviv 203 Morag
. כדוגמא joinהוא דוגמא נוספת של left outer joinהאופרטור from owner left outer join account on owner.account-num = account. account-num
התואמת. בנוסף תכיל inner joinיות של פעולת הnכוללת את כל ה left outer joinהתוצאה של יה ביחס הימני, n, שאינן מתאימות לאף ownerהשמאלי, יות של היחסnהתוצאה את כל ה
account . בn העמודות שמקורן ביחס הימנייות אלה, כל (account) יופיעו בתוצאה עם ערכיnullהיא לעיל . תוצאת הביטוי
from owner left outer join account on owner.account-num = account. account-
num
balance branch-name account-num account-num customer-name 3000 Darom 101 101 Even 4000 Aviv 203 203 Morag
null null null 417 Tal
, אבל ניתן להשתמש בהן בכל מקום שבו fromהוא בדרך כלל בפסוק ה join השימוש בפעולות ניתן להשתמש ביחס.
יות משני היחסים nמגדיר אילו join. תנאי ה joinתנאי הומ joinסוג ה ממורכב joinהשימוש יות בכל nמגדיר כיצד לטפל ב joinסוג ה . joinיצטרפו זו לזו, ואילו עמודות יופיעו בתוצאת ה
(. joinיה מהיחס האחר )בהתאם לתנאי הnאחד מהיחסים, שאינן מצטרפות לאף העיקריים. joinותנאי ה joinברשימה להלן מופיעים סוגי ה
join סוגים של
joinתנאי
inner join natural
left outer join on <predicate>
right outer join using (A1, A2, An)
full outer join
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
15
. לא נפרט את השימוש ב onוב naturalראינו קודם דוגמאות לשימוש ב joinמבין תנאי ה using . דקדוק, המילה השמורה מבחינת הnatural מופיעה לפני סוג הjoin כפי שהודגם קודם
outerו inner. המילים השמורות joinיופיע לאחר סוג ה using ו onלכן, בעוד שהשימוש ב .outer joinאו ב inner joinאם מדובר ב joinהן אופציונאליות כיוון שניתן להסיק מסוג ה
right outer join הוא סימטרי לleft outer join . הn ,יות של היחס הימניaccount שאינן ,
, יופיעו בתוצאה כאשר כל העמודות שמקורן ביחס ownerיה ביחס השמאלי, nמתאימות לאף . למשל התוצאה של nullיופיעו בתוצאה עם ערכי השמאלי
from owner right outer join account on owner.account-num = account. account-num
balance branch-name account-num account-num customer-name 3000 Darom 101 101 Even 4000 Aviv 203 203 Morag 7000 Tsafon 155 null null
ולכתוב, למשל join naturalגם את תנאי ה outer joinאפשר כמובן לשלב עם סוגי ה
from owner natural right outer join account
ובמקרה זה התוצאה תהיה
balance branch-name account-num customer-name 3000 Darom 101 Even 4000 Aviv 203 Morag 7000 Tsafon 155 null
full outer join פשוט שילוב של שני סוגי ה הואouter join left וright outer join . כלומרשמאלי היחס ה יותnהמוסיפים לתוצאה את inner joinלאחר שהפעולה מחשבת את תוצאת ה
יות היחס nלתוצאה את ה (. כעת מוסיפים nullיה ביחס הימני )ומרצפים ב nשלא התאימו לאף (. למשל nullיה ביחס השמאלי )ומרצפים ב nהימני שלא התאימו לאף
from owner natural full outer join account
balance branch-name account-num customer-name 3000 Darom 101 Even 4000 Aviv 203 Morag 7000 Tsafon 155 null
null null 417 Tal
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
16
: outer joinמועיל בפעולת ה דוגמא לשימוש 35שאילתה
זו אנו מתייחסים חזרה לבסיס את סכום חשבונות החיסכון בכל סניף בנק. )בשאילתה מצא (.1הנתונים שבעמוד
התשובה הפשוטה היא
select branch_name, sum(balance) sum-balance
from deposit
group by branch_name
בשאילתה זו, סניפים, שמסיבה כלשהי אין בהם חשבונות חיסכון לא יופיעו כלל בתשובה. זהו מאפיין של שימוש בהקבצה.
כך שסניפים ללא חשבונות חיסכון יופיעו עם , כל הסניפיםך לעיתים רוצים לראות בתוצאה את אsum-balance = 0 והדרך הפשוטה להשיג זאת היא על ידי שימוש ב ,outer join :כדלקמן
select branch_name, sum(balance) sum-balance
from deposit natural right outer join branch
group by branch_name
עם ערכי depositיופיעו כשכל עמודות depositללא חשבונות branchשל יותnכל ה outer joinב null מה שחשוב הוא שכל סניף יופיע בתוצאה. מכיוון שפונקצית ה .sum מחזירה אפס על ערכי
null - .נקבל את התוצאה הרצויה
multiple join בפסוק :from ניתן( לבצע צירוףjoin של יותר משני יחסים. למשל, על ידי )join באופן קומפקטי בהרבה: 3ניתן לבצע את שאילתא
36שאילתה
’Jaffa‘צא את שמות וכתובות הלקוחות שיש להם חשבון חיסכון בסניף כלשהו הנמצא בעיר מ
select customer-name, street, customer-city
from customer natural inner join deposit natural inner join branch
where branch-city=’Jaffa’
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
17
פעולות עדכון
insertפקודת .1
יה ליחס. יש לציים את שם היחס ואת nמשמשת להוספת insertבצורתה הפשוטה ביותר בהגדרת יה. יש לציין את הערכים על פי הסדר שבו מופיעות התכונות nרשימת הערכים של ה
(. create tableהתבנית )פקודת
1הוספה customerית לקוח ליחס nהוסף
insert into customer
values (‘Aharoni’, ‘Dizengof’, ‘Tel Aviv’)
מאפשרת למשתמש לציין במפורש שמות של תכונות המתאימות insertצורה שנייה של פקודת ( או ברירת nullיתן להשמיט תכונות עם ערכי דמה ). במקרה זה, נinsertלערכים בפקודת ה
מחדל. למשל:
2הוספה insert into deposit(branch-name, customer-name, account-number)
values (‘Aviv’,‘Davidi’, 123)
או ערך ברירת מחדל )אם הוגדרה ברירת מחדל(. nullשהושמטה, תקבל ערך balanceהתכונה עצמה. insertזו מצוינים בסדר שבו מצוינות התכונות בפקודת ה הערכים בפקודה
יות אחדות ליחס משתמשת בתוצאה של nהמאפשרת להוסיף insertוריאציה של פקודת
שאילתה. למשל:
3הוספה יה של חשבון הפקדה באותו סניף עם nהוסף ’Aviv‘לכל לקוח שיש לו חשבון הלוואה בסניף
סכום ההלוואה שלו, ומספר חשבון הפקדה זהה למספר חשבון ההלוואה.יתרה שהיא עשירית מ
insert into deposit
select branch-name,loan-number,customer-name,amount*0.1
from borrow
where branch-name=’Aviv’
deleteפקודת .2
. SQLשבשאילתת , בדומה לזהwhereיות מיחס. הפקודה כוללת פסוק nמוחקת deleteפקודת n .יחד עם זאת, בגלל אילוצים של שלמות קשר, יות נמחקות באופן מפורש מיחס אחד בכל פעם(
אחת הוא deleteיות הנמחקות בפקודת nהמחיקות עלולות לעבור ליחסים אחרים(. מספר ה עם יות היחס יימחקו; יחד nכל where. בהיעדר פסוק whereהנבחרות בפסוק ה יותnכמספר ה
זאת, היחס עצמו לא יימחק, אלא יישאר בבסיס הנתונים כיחס ריק.
1מחיקה ’Morag‘ית הלקוח nמחק את
delete customer
where customer-name=’Morag’
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
18
2מחיקה מחק את כל חשבונות החיסכון של סניפים שערך הנכסים שלהם שלילי
delete deposit
where branch-name in (select branch-name
from branch
where assets <0)
3מחיקה
מחק את כל חשבונות ההלוואה. delete borrow
updateפקודות .3
deleteיה אחת או יותר.כמו בפקודת ה nמשמשת לעדכון ערכים של תכונות ב updateפקודת
יחס אחד. )יחד עם זאת, בוחרת את האניות שיש לעדכן מתוך updateבפקודת ה whereפסוק ה עדכון של מפתח ראשי עלול לגרום לעדכונים של מפתחות זרים ביחסים אחרים, בהתאם לאילוצי
מגדיר את התכונות שמעדכנים ואת ערכיהן החדשים. למשל: setשלמות קשר שהוגדרו(. פסוק
1עדכון . ’Dizengof‘ל ’Morag‘שנה את שם הרחוב שבו גר
update customer
set street= ‘Dizengof’
where customer-name=‘Morag’
אחת. למשל: updateיות אחדות בפקודת nניתן לשנות 2עדכון . ’jaffa‘לכל היתרות של חשבונות חיסכון של לקוחות הגרים ב 5%הוסף
update deposit
set balance= balance*1.05
where customer-name in (select customer-name
from customer
where customer-city=’Jaffa’)
למשל: לעדכן ערכים בטבלה אחת בהסתמך על ערכים בטבלה אחרת.ניתן 3עדכון
נניח שללקוח מותר שיהיה רק חשבון חיסכון אחד לכל היותר וכן חשבון הלוואה אחד לכל היותר. מס' חשבון חשבון חיסכון להיות ואה של לקוחות שיש להם גםוההל נותעדכן את מס' חשבו
לא יותר מחשבון חיסכון אחד וחשבון הלוואה )לצורך שאילתא זו נניח כי ללקוח החיסכון שלהם. אחד(
update borrow
set loan_number = (select account_number
from deposit
where deposit.customer-name = borrow.customer-name)
where exists (select *
from deposit
where deposit.customer-name = borrow.customer-name)
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
19
SQLתצפיות ב
SQL. מושג התצפית ב 1
היא טבלה המופקת מטבלאות אחרות. הטבלאות האחרות עשויות להיות טבלאות SQLתצפית ב כרח ממומשת בצורה פיזית; בסיסיות או תצפיות אחרות שהוגדרו קודם לכן. תצפית אינה בה
יות שלהם nאלא ניתן לראותה כטבלה וירטואלית, בניגוד לטבלאות )היחסים( הבסיסיים,שהאינה מאוחסנות פיסית בבסיס הנתונים. עובדה זו מגבילה את אפשרות העדכון של תצפית, אך
מטילה מגבלה כלשהי על שאילתות על התצפית.לה שניגשים אליה לעתים תכופות, למרות שאינה קיימת ניתן לראות תצפית כדרך להגדיר טב
פיסית. למשל, אם שאילתה רבות מאחזרות פרטי הלקוח יחד עם פרטי חשבונות החיסכון שלו, , ועליה depositו customerניתן להגדיר תצפית שהיא תוצאה של הצירוף הטבעי של היחסים
לבצע כל פעם את השאילתה. . הגדרת תצפית 2
. התצפית מקבלת שם טבלה )וירטואלי(, create viewהתצפית מגדירים בעזרת הפקודה את רשימה של תכונות, וכן שאילתה המגדירה את תוכן התצפית. אם אף אחת מהתכונות בתצפית
אינה תוצאה של הפעלת פונקציות או אופרטורים אריתמטיים, אין צורך להגדיר את שמות ות יהיו זהים לשמות התכונות בטבלאות המקוריות המגדירות התכונות בתצפית, ושמות התכונ
את התצפית. למשל:
1תצפית create view customer-deposits
as select C.customer-name, street, customer-city, account-number, balance
from customer C, deposit D
where C.customer-name= D.customer-name
בתצפית זו לא הגדרנו את שמות התכונות, כך שהם יהיו כשמות ביחסים המקוריים.
2תצפית
create view total-branch-deposits (branch-name, total-balance)
as select branch-name, sum(balance)
from deposit
group by branch-name
נות. זאת כדי לתת שם לעמודה המחושבת על ידי פונקצית בתצפית זו הגדרנו את שמות התכו
.sumההקבצה
משהוגדרה תצפית, ניתן לבצע עליה שאילתות למשל:
1שאילתת תצפית ’Jaffa’הצג את כל מספרי חשבונות החיסכון שיש ללקוחות הגרים ב
select distinct account-number
from customer-deposits
where customer-city=’Jaffa’
2שאילתת תצפית ’Aviv‘הצג את סכום ההפקדות בסניף
(c .כל הזכויות שמורות לפרופ' גדעון דרור, ביה"ס למדעי המחשב, המכללה האקדמית של ת"א יפו )2018
20
select * from total-branch-deposits
where branch-name=’Aviv’
. למשל: drop viewניתן לסלק הגדרה של תצפית שאין בה צורך יותר בעזרת הפקודה drop view total-branch-deposits
. עדכון התצפיות 3
משמעי. בנושא זה מתנהל מחקר נמרץ. באופן -ן תצפיות הוא מורכב ופעמים רבות אינו חדעדכוכללי, עדכון של תצפית, המבוססת על טבלה בסיסית אחת, ושאינה כוללת פונקציה הקבצה, ניתן
לתרגום לעדכון של הטבלה הבסיסית. בכל מקרה אחר יש דרכים אחדות למפות את עדכון לאות הבסיסיות. התצפית לעדכון של הטב
total-branch-deposits למשל, אם מתבצעת פעולת העדכון הבאה על התצפית
update total-branch-deposits
set total-balance=42000
where branch-name =‘Aviv’
יש לעדכן, ובאיזה אופן!!! depositיות של היחס nלא ברור אילו לסיכום:
ית אחת ניתנת לעדכון אם תכונות התצפית כוללות את המפתח תצפית הבנויה מטבלה בסיסהראשי של הטבלה הבסיסית או מפתח קביל אחר שלה. כמו כן, כל תכונה ביחס הבסיסי
( חייבת להיכלל בתצפית.nullשאינה יכולה לקבל ערך דמה ) .תצפיות המוגדרות על טבלאות אחדות באמצעות צירוף אינן ניתנות לעדכון בדרך כלל צפיות המוגדרות בעזרת הקבצה או פונקציות הקבצה אינן ניתנות לעדכון. ת
Recommended