Document 7679434
Download
Report
Transcript Document 7679434
SQL
SQLהינה השפה הדומיננטית לטיפול בבסיסי נתונים יחסיים ,אך
לא קיים סטנדרט SQLיחיד(SQL92, SQL3 …)ׁ .
ניתן לחלק את פקודות SQLלארבע משפחות:
•פקודות להגדרת בסיס הנתונים ()Data Definition
•פקודות לטיפול בנתונים ()Data Manipulation
•פקודות בקרת גישה לבסיס הנתונים ()Data Access Control
•פקודות לטיפול בתנועות ()Transaction Management
שאילתות בסיסיות
שאילתת SQLפועלת על יחסים ,ותוצאתה היא יחס.
השאילתה הבסיסית מורכבת משלושה רכיבים:
•פסוק : selectמקביל לאופרטור ההטלה בא”י.
•פסוק : fromמקביל למכפלה קרטזית בא”י .הפסוק מפרט את
היחסים המשתתפים בהערכת הביטוי.
•פסוק : whereמקביל לאופרטור הבחירה בא”י.
תכונות
יחסים
פרדיקט
select A1,A2,…An
from r1,r2,…rm
where P
פסוק זה שקול (כמעט) לשאילתת אלגברת היחסים
))A1,A2,…An(P (r1r2 ... rm
השמטת פסוק ה whereשקולה להשמטת פעולת הבחירה
ניתן להחליף את רשימת התכונות A1,A2,…Anב כוכבית (*) כדי
להציג את כל התכונות ביחסים המופיעים בפסוק ה . from
מצא את שמות כל הסניפים ביחס deposit
select branch-name
from deposit
בשאילתת SQLזו אין אלימינציה של nיות חוזרות!!
סילוק הnיות החוזרות מתקבל על ידי שימוש ב distinct
select distinct branch-name
from deposit
פרדיקטים מורכבים
במקוםnot אוand, or משמשים המקשרים הלוגייםSQL ב
. של אלגברת יחסים ו, הסימנים המתמטיים
מצא את שמות הלקוחות שיש להם חשבון הלוואה בסניף כלשהו
ואת ערי מגוריהם
select distinct customer.customer-name,customer-city
from borrow,customer
where borrow.customer-name= customer.customer-name
מצא את שמות הלקוחות שיש להם חשבון הלוואה בסניף
ואת ערי מגוריהםmerkazi
select distinct customer.customer-name,customer-city
from borrow,customer
where branch_name = ‘merkazi’ and
borrow.customer-name= customer.customer-name
משתני nיה -כינוי
SQLשואלת את הסימון של משתני nיה מתחשיב יחסים לפי
nיות.
מצא את שמות הלקוחות שיש להם חשבון חיסכון בסניף כלשהו
ואת ערי מגוריהם.
select distinct T.customer-name,customer-city
from deposit S, customer T
where S.customer-name = T.customer-name
scope
בתת-שאילתה ניתן להשתמש רק במשתני nיה שהוגדרו בתת-השאילתה
עצמה או בכל שאילתה שמכילה אותה.
אם משתנה nיה מוגדר גם לוקלית בתת-שאילתה וגם גלובלית ,תופסת
ההגדרה הלוקלית.
התאמת מחרוזות
תבניות תווים מתוארות בעזרת שני תווים מיוחדים:
• תו האחוזים ( - )%מתאים לכל תת מחרוזת.
• קו תחתי ( _ ) -מתאים לכל תו בודד.
תבניות תוים הן .case sensitive
התאמת תבניות ב - SQLבעזרת אופרטור ההשוואה like
מצא את שמות הלקוחות הגרים ברחוב ששמו כולל את תת-
המחרוזת ‘.’ha
select customer-name
from customer
’where street like ‘%ha%
חישובים על עמודות
ניתן לבצע חישובים נומריים על הערכים המופיעים ביחס .ניתן להציג
תוצאה של חישוב כזה כ”עמודה מדומה”.
הדפס לכל חשבון חסכון ,שסכום החיסכון שלו הוא מעל 0.001
מסך נכסי הסניף ,את שם הלקוח ,מספר החשבון ,הסניף בו
מתנהל ואת היחס בין סכום החיסכון לסך הנכסים של הסניף.
select customer-name, account-number, branch_name, amount / assets
from deposit, branch
where deposit.branch-name = branch.branch-name
and amount / assets > 0.001
צירוף של שאילתות בסיסיות
פעולות minus, intersect, unionשקולות ל - ,, באלגברת
יחסים.
מצא את שמות הלקוחות שיש להם חשבון חיסכון או הלוואה או
שניהם בסניף ‘’aviv
(select distinct customer-name
from deposit
)’where branch-name=‘aviv
union
(select distinct customer-name
from borrow
)’where branch-name=‘aviv
מצא את שמות הלקוחות שיש להם גם חשבון חיסכון וגם הלוואה
בסניף ‘’aviv
כנ”ל ,אך במקום unionצ”ל intersect
שאילתות עם תתי-שאילתות
שייכות לקבוצות
האופרטור inבודק לשייכות לקבוצה .הקבוצה עשויה להיות קבועה ,או
תוצאה של תת-שאילתה.
מצא את שמות הלקוחות שיש להם חשבון הלוואה וגם חשבון
חיסכון בסניף ‘.’Aviv
select distinct customer-name
from borrow
where branch-name=‘Aviv’ and
customer-name in (select customer-name
from deposit
)’where branch-name=‘Aviv
האופרטור not inפועל באופן דומה (למשל ,מצא שמות הלקוחות שיש
להם חשבון הלוואה אך לא חשבון חיסכון בסניף ‘.)’Aviv
מצא את שמות הלקוחות שיש להם חשבון חיסכון באחד הסניפים
’Morag‘ שבהם חוסך
select distinct T.customer-name
from deposit T, deposit S
where S.customer-name = ‘Morag’ and
S.branch-name=T. branch-name
השוואה לקבוצות
> some, some, < some, some, =some, some
> all, all,
< all, all, =all, all
מצא את רשימת הסניפים שערך נכסיהם גדול מערך נכסיו של
’Jaffa‘ סניף כלשהו ב
select branch-name
from branch
where assets > some
(select assets
from branch
where branch-city=‘Jaffa’)
מבצעים בדיקת האם קבוצה שלnot contains וcontains הפסוקים
in, > some, > all (בניגוד ל.ערכים מכילה קבוצת ערכים אחרת
) המשווים ערך בודד לקבוצת ערכים,ודומיהם
מצא את שמות הלקוחות שיש להם חשבונות חיסכון בכל הסניפים
. ’Jaffa‘ הנמצאים בעיר
select distinct S.customer-name
from deposit S
where (select T.branch-name
from deposit T
where S.customer-name = T.customer-name)
contains
(select branch-name
from branch
where branch-city= ‘Jaffa’)
בדיקת יחסים ריקים
שאילתה כוללת (לא- מאפשרת לבדוק האם התוצאה של תתSQL
) not exists (בהתאמהexists יות באמצעות האופרטורn )כוללת
מצא את שמות הלקוחות שיש להם חשבון חיסכון וגם חשבון
.’Aviv‘ הלוואה בסניף
select customer-name
from customer C
where exists (select *
from deposit
where deposit.customer-name = C.customer-name
branch-name=‘Aviv’)
and exists (select *
from borrow
where borrow.customer-name = C.customer-name
branch-name=‘Aviv’)
and
and
מצא את שמות הלקוחות שיש להם חשבונות חיסכון בכל הסניפים
.’Jaffa‘ ב
select distinct S.customer-name
from deposit S
where
not exists (
(select branch-name
from branch
where branch-city = ‘Jaffa’)
minus
(select T. branch-name
from deposit T
where S.customer-name=T.customer-name) )
)Join( צירופים
)Join( מאפשרת לבצע צירופים טבעיים ופעולות צירוףSQL •
אחרות
מצא את שמות הלקוחות שיש להם חשבון חיסכון בסניף כלשהו
.ואת ערי מגוריהם
select distinct customer-name,customer-city
from deposit inner join customer on
deposit.customer-name = customer.customer-name
במקרה שלעמודות עליהן מתבצע הצירוף שמות,• לחילופין
ניתן להשתמש בצירוף טבעי,זהים
select distinct customer-name,customer-city
from deposit natural inner join customer
)Join( סוגי צירופים
•
•
•
•
inner join
left outer join
right outer join
full outer join
תנאי צירוף
• natural
• on <predicate>
• using (A1, A2, …An)
דוגמאות
Customername
Morag
Tamir
Avivi
Street
Pinkas
Allenby
Pinkas
Customercity
Rishon
Haifa
Rishon
Customername
Even
Tamir
Avivi
deposit
customer
Customername
Morag
Tamir
Avivi
Street
Pinkas
Allenby
Pinkas
Accountnumber
101
215
102
Customercity
Rishon
Haifa
Rishon
Accountnumber
null
215
102
balance
null
700
400
customer natural left outer join deposit
Customername
Morag
Tamir
Avivi
Even
Street
Pinkas
Allenby
Pinkas
Null
Customercity
Rishon
Haifa
Rishon
Null
Accountnumber
null
215
102
101
customer natural full outer join deposit
balance
null
700
400
500
balance
500
700
400
מיון התצוגה
.יות בתצוגהn גורם למיון הorder by [asc/desc[
רשימה של שמות הלקוחות שיש להם חשבונות הלוואה בסניף
.’ ממוינת בסדר אלפביתיAviv‘
select distinct customer-name
from borrow
where branch-name=‘Aviv’
order by customer-name
.ניתן לבצע מיון על שדות אחדים
select *
from borrow
order by amount desc, loan-number asc
הקבצה ופונקציות הקבצה
פונקציות על קבוצות של nיות מתבצעות בעזרת פסוק group by
.התכונה/תכונות המופיעות בפסוק group byמגדירות קבוצות
של nיות שערכיהן זהים בתכונות המצוינות.
פונקציות הקבצה:
avg
• ממוצע:
min
• מינימום:
max
• מקסימום:
sum
• סכום:
count
• ספירה:
פונקציות ההקבצה פועלות על קבוצה של nיות .תוצאת הפעולה
היא מספר יחיד לכל קבוצה.
מצא את יתרת החיסכון הממוצעת בכל סניף
select branch-name,avg(balance)
from deposit
group by branch-name
מצא את מספר בעלי חשבונות החיסכון בכל סניף
select branch-name,count( distinct customer-name)
from deposit
group by branch-name
. מציין תנאי על קבוצותhaving פסוק
1200מצא שמות הסניפים שממוצע יתרות החיסכון שלהם גדול מ
ואת ממוצע היתרות
select branch-name,avg(balance)
from deposit
group by branch-name
having avg(balance) > 1200
מצא את הסניפים שממוצע יתרות החיסכון שלהם מירבי
!!!אין לבצע הרכבה של פונקציות הקבצה
having(max(avg…))
select branch-name
from deposit
group by branch-name
having avg(balance) all (select avg(balance)
from deposit
group by branch-name)
פונקצית ההקבצה תפעל על, group by במקרה של השמטת פסוק
היחס כולו
select avg(balance)
ממוצע יתרות החיסכון של כל
from deposit
החשבונות
יחד סדר הביצועhaving ופסוקwhere כאשר מופיעים פסוק
:הוא
where
group by
having
מצא את ממוצע יתרות חשבונות החיסכון של כל החוסכים הגרים
חשבונות חיסכון3 ’ ושיש להם לפחותHaifa’ב
select avg(balance)
from deposit,customer
where deposit.customer-name=customer.customer-name
and customer-city=‘Haifa’
group by deposit.customer-name
having count(distinct account-number)>2
עדכונים בבסיס הנתונים
.1מחיקה
מבנה פקודת המחיקה
delete r
where P
פעולה זו מוחקת מהיחס rאת הnיות שעבורן הפרדיקט Pנותן
ערך אמת.
מחק את כל הnיות ביחס borrow
delete borrow
מחק את כל חשבונות החיסכון של ‘’Tamir
delete borrow
’where customer-name=‘Tamir
הוספה.2
:ניתן להוסיף מידע ליחס בשתי צורות
יה מפורשתn • הוספה של
insert into deposit
values (‘hamerkaz’,55,’Cohen’,1500)
יות שהיא תוצאה של שאילתהn •הוספת קבוצת
insert into deposit
select branch-name,loan-number,customer-name,200
from borrow
where branch-name=‘Aviv’
.3עדכון
פקודת updateמאפשרת לשנות חלק מהתכונות בnיה.
ניתן לבחור את הnיות לעדכון כמו במחיקה ובהוספה.
הוסף 5%לכל יתרות חשבונות החיסכון
update deposit
set balance=balance*1.05
הוסף 6%ליתרות חשבונות החיסכון מעל 1000ו 5%ליתרות
החיסכון בסכום מתחת ל 1000
update deposit
set balance=balance*1.06
where balance>1000
update deposit
set balance=balance*1.05
where balance1000
תצפיות
מבנה הפקודה. מאפשרת להגדיר תצפיותcreate view פקודת
הוא
create view v as query
. הוא שם התצפיתv . הוא ביטוי שאילתה חוקיquery
בהם יש להם,תצפית של שמות כל הלקוחות והסניפים
.חשבונות
create view all-customer as
(select branch-name,customer-name
from deposit )
union
(select branch-name,customer-name
from borrow )
.)update anomaly( עדכון בתצפית עלולה לגרום לאנומלית עדכון
create view loan-info as
select branch-name,loan-number,customer-name
from borrow
Insert into loan-info
values (‘Aviv’,89,’Levy’)
יהn מאפשרת לבצע הוספה של
הגדרת תבניות יחסים
SQL DDLמאפיינת את היחסים בבה”נ:
•התבנית של כל יחס.
•תחום הערכים המתאים לכל תכונה.
•אוסף של אינדקסים לכל יחס.
•הרשאות לכל יחס.
•אילוצי שלמות.
•מבנה האכסון הפיסי של כל יחס על הדיסק.
)create table r ( A1 D1, A2 D2 ….,An Dn
rהוא שם היחס ו Diהוא תחום התכונה . Ai
מחיקת יחס מבה”נ מתבצעת באמצעות drop table
drop table r