SQL...1113 Database Systems 2001 7 424 CS ביבא DBMS - 236363, התליאש תופש: SQL...

64
אביב2012 DBMS - 236363, שפות שאילתה: SQL 1 SQL Structured Query Language

Transcript of SQL...1113 Database Systems 2001 7 424 CS ביבא DBMS - 236363, התליאש תופש: SQL...

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 1

    SQL

    Structured Query Language

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 2

    Borrowed

    •Cust_Id

    •Book_Id

    •From_Date

    •To_Date

    Ordered

    •Cust_Id

    •Book_Id

    •Order_Date

    Books

    •Book_Id

    •Book_Name

    •Year

    •Max_Time

    •Faculty

    •Pages

    Customers

    •Cust_Id

    •Cust_Name

    •Faculty

    מסד נתונים של ספרייה

    תזכורת-דוגמא של מסד נתונים

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 3

    פירוט הטבלאות

    • Customers(Cust_Id, Cust_Name, Faculty)

    – Cust_Id: (ייחודי לכל לקוח) זהות של לקוח' מס

    – Cust_Name: שם לקוח

    – Faculty: שם פקולטה

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 4

    Customersהטבלה

    FacultyCust_NameCust_Id

    CSMoshe Cohen12345

    EEAvi Barak23456

    MEDAvi Barak34567

    EELior Edri45678

    EEMoshe Cohen56789

    EEMoshe Cohen67890

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 5

    ...(המשך)פירוט הטבלאות

    Books(Book_Id, Book_Name, Year,

    Max_Time, Faculty, Pages)

    Book_Id: ייחודי לכל עותק)מזהה ' מס)

    Book_Name: שם הכותר

    Year: שנת הוצאה

    Max_Time: בימים)אפשרי ' משך השאלה מקס)

    Faculty: שם פקולטה

    Pages: עמודים' מס

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 6

    Booksהטבלה

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 7

    ...(המשך)פירוט הטבלאות

    Ordered(Cust_Id, Book_Id, Order_Date)

    Cust_Id: זהות של לקוח' מס

    Book_Id (ייחודי לכל עותק)מזהה ' מס :

    Order_Date: תאריך הזמנת הכותר

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 8

    Orderedטבלת

    Order_DateBook_IdCust_Id14-Oct-2002111112345

    24-Oct-2002111245678

    30-Oct-2002111312345

    12-Oct-2002222245678

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 9

    ...(המשך)פירוט הטבלאות

    Borrowed(Book_Id, Cust_Id, From_Date,

    To_Date)

    Book_Id: מזהה של ספר' מס

    Cust_Id: זהות של לקוח' מס

    From_Date: תאריך השאלת הספר

    To_Date: תאריך החזרת הספר

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 10

    Borrowedטבלת

    To_DateFrom_DateCust_IdBook_Id

    13-Oct-2002567895555

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 11

    SQL-שאילתות ב

    SELECT [ALL | DISTINCT] {[table.]* | expr [alias], exp [alias], …}

    FROM table [alias], table [alias], …

    [WHERE condition]

    [GROUP BY expr, expr, … [HAVING condition]]

    [{INTERSECT | EXCEPT | UNION | UNION ALL } SELECT …]

    [ORDER BY expr [ASC | DESC ], expr [ASC | DESC],…];

    מבנה כללי של שאילתא

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 12

    WHERE

    מה תחזיר השאילתה הבאה?

    SELECT Book_Name

    FROM Books

    WHERE Year >= 1990 AND Year

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 13

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    Books:

    המשך-דוגמא

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems1111

    CS348141998Database Systems1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    SELECT Book_Name FROM Books

    WHERE Year >= 1990 AND Year

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 14

    Book_Name

    Database Systems

    Database Systems

    Database And Knowledge

    Database And Knowledge

    Electronic Circuits

    SELECT Book_Name FROM Books

    WHERE Year >= 1990 AND Year

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 15

    LIKEהאופרטור

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 16

    LIKEהאופרטור

    האופרטורLIKE בודק התאמה של מחרוזת לתבנית(.wildcards)נתונה

    מתאים לתו בודד" _"התו.

    או 0באורך , מתאים לסדרת תווים כלשהי" %"התו.יותר

    שליפת כל שמות הספרים ששמם מכיל את : דוגמא:mוהאות לפני אחרונה היא Databaseהמחרוזת

    SELECT Book_Name FROM Books

    WHERE Book_Name LIKE '%Database%m_';

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 17

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    המשך-דוגמא

    Books:

    SELECT Book_Name FROM Books

    WHERE Book_Name LIKE '%Database%m_';

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems1111

    CS348141998Database Systems1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 18

    Book_Name

    Database Systems

    Database Systems

    Database Systems

    תוצאה-דוגמא

    SELECT Book_Name FROM Books

    WHERE Book_Name LIKE '%Database%m_' :

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 19

    NULL–ערכים חסרים

    NULL– משבצת ריקה)"ערך מיוחד המציין ערך חסר)"

    לדוגמא:

    תאריך החזרה של ספר שעדיין לא הוחזר

    השוואה ל-NULL :

    expr IS NULL– מחזירtrue אםexpr הוא ערךNULL

    expr IS NOT NULL

    שליפת כל הספרים שעוד לא הוחזרו: דוגמא.

    SELECT Book_Id FROM Borrowed

    WHERE To_Date IS NULL;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 20

    (המשך)NULLערכי

    ערך של ביטוי אריתמטי או ביטוי לוגי המכיל :בעיהNULL תמיד

    .NULLיהיה

    עבור ערך שיכול להיות " ברירת מחדל"קביעת : פתרון:NULL

    COALESCE(value, default)

    עבור )הצגת משך ההשאלה בשבועות של כל הספרים : דוגמא

    (.0ספרים שעדיין לא הוחזרו יש להציג

    SELECT Book_Id , COALESCE(To_Date – From_Date, 0) / 7

    FROM Borrowed;

    בצורה כללית :COALESCE(expr1,expr2,…) מחזיר את הערך

    NULL-הראשון השונה מ

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 21

    פונקציות סטטיסטיות

    ב-SQLישנן הפונקציות הסטטיסטיות הבאות:

    MIN–מינימום

    MAX–מקסימום

    AVG–ממוצע

    SUM–סכום

    COUNT–מספר הרשומות

    כל אחת מפונקציות אלה פועלת על קבוצת ערכים

    . ומחזירה ערך אחד

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 22

    דוגמא

    חשב את מספר העמודים הממוצע : דוגמא

    :והמקסימלי בין כל הספרים

    פתרון:

    SELECT AVG(Pages), MAX(Pages)

    FROM Books;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 23

    המשך–דוגמא

    SELECT AVG(Pages), MAX(Pages)

    FROM books;

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 24

    המשך–דוגמא

    SELECT AVG(Pages), MAX(Pages)

    FROM books;

    Pages

    348

    348

    424

    390

    390

    180

    580

    450

    AVG(Pages) MAX(Pages)

    389 580

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 25

    NULLפעולות סטטיסטיות על ערכי

    כל הפונקציות הסטטיסטיות מתעלמות מערכי

    NULL.

    יוצא מן הכלל:COUNT(*).

    count-לבין פונקציות סטטיסטיות אחרות הוא שcountההבדל בין

    כאשר הוא תקבל אף ערך והפונקציות הסטטיסטיות 0תחזיר

    .nullהאחרות יחזירו

    הן )nullיחזירו nullלכן פונקציות סטטיסטיות שמקבלות עמודה של

    -פרט ל( nullלכן מחזירות , ומקבלות כלוםnull-מתעלמות מערכי ה

    count ו)0שתחזיר-count(*)תחזיר את מספר השורות)

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 26

    To_DateFrom_DateCust_IdBook_Id

    13-Oct-2002567895555

    NULLפעולות סטטיסטיות על ערכי

    Borrowed:

    SELECT MAX(To_Date) FROM Borrowed;

    NULLיחזיר

    SELECT COUNT(To_Date) FROM Borrowed;

    0יחזיר

    SELECT COUNT(*) FROM Borrowed;

    1יחזיר

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 27

    המשך–פונקציות סטטיסטיות

    שליפת מספר הספרים בכל שנה: דוגמא

    פתרון שגוי:

    SELECT Year, COUNT(Book_Id)

    FROM Books;

    הרבה ערכים של )!לא חוקיYear , ערך אחד של

    COUNT.)

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 28

    GROUP BY–קיבוץ

    הפעלת פונקציות סטטיסטיות על קבוצות של

    .רשומות

    תיקון)המשך הדוגמא:)

    SELECT Year, COUNT(Book_Id)

    FROM Books

    GROUP BY Year;

    לכל ערך שלYear ,ה-COUNTמחושב בנפרד.

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 29

    (GROUP BY)המשך–דוגמא SELECT Year, COUNT(Book_Id)

    FROM Books

    GROUP BY Year;

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 30

    (GROUP BY)המשך–דוגמא

    YearBook_Id

    19981111

    19981112

    20011113

    19982222

    19982223

    19983333

    19854444

    19885555

    COUNT(Book_Id)Year

    51998

    11988

    12001

    11985

    SELECT Year, COUNT(Book_Id)

    FROM Books

    GROUP BY Year;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 31

    המשך–קיבוץ

    דוגמא שגויה אחרת:

    SELECT Faculty, COUNT(Book_Id)

    FROM Books

    GROUP BY Year;

    לאחר הקיבוץ לפי !לא חוקיYear , בכל קבוצה יכולים

    .שוניםFacultyלהיות ערכי

    מותר לשלוף רק , בנוסף לפעולות סטטיסטיות: כלל

    (.וביטויים)שדות לפיהם מתבצע הקיבוץ

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 32

    HAVING-בחירה לאחר קיבוץ

    האופציהHAVING condition : בחירת חלק

    . GROUP BY-מהקבוצות המתקבלות מ

    התנאיcondition :שדות , פונקציות סטטיסטיות

    .ביטויים, לפיהם מתבצע הקיבוץ

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 33

    (HAVING)דוגמא

    מה מחזירה השאילתה הבאה: דוגמא?

    SELECT Year, COUNT(Book_Id)

    FROM Books

    GROUP BY Year

    HAVING AVG(Pages) > 400;

    מבין כל הקבוצות , Yearלאחר הקיבוץ לפי : הסבר•

    -נבחרות כאלה שבהן ממוצע מספרי העמודים גדול מ

    400.

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 34

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    (HAVING)המשך –דוגמא SELECT Year, COUNT(Book_Id) FROM Books

    GROUP BY Year

    HAVING AVG(Pages) > 400;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 35

    (HAVING)המשך –דוגמא

    AVG(Pages)COUNT(Book_Id)Year

    33151998

    45011988

    42412001

    58011985

    11988

    1

    1

    COUNT(Book_Id)

    1985

    2001

    Year

    AVG(Pages) > 400

    SELECT Year, COUNT(Book_Id) FROM Books

    GROUP BY Year

    HAVING AVG(Pages) > 400;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 36

    HAVINGלעומת WHERE: בחירה

    WHERE : הקיבוץלפנירשומות בחירת

    HAVING : הקיבוץאחריקבוצותבחירת.

    דוגמא :

    חשב בכל , עמודים200-עם יותר מבין כל הספרים

    ,הספרים שיצאו לאור' שנה את מס

    ממוצע מספר העמודים באותה שנה גדול בתנאי שב

    .400-מ

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 37

    המשך–דוגמא

    עמודים200-עם יותר מבין כל הספרים : דוגמא ,בתנאי , הספרים שיצאו לאור' חשב בכל שנה את מס

    .400-ממוצע מספר העמודים באותה שנה גדול משב

    SELECT Year, COUNT(Book_Id)

    FROM Books

    WHERE Pages > 200

    GROUP BY Year

    HAVING AVG(Pages) > 400;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 38

    המשך–דוגמא

    Books:

    SELECT Year, COUNT(Book_Id) FROM Books

    WHERE Pages > 200

    GROUP BY Year HAVING AVG(Pages) > 400;

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    MED58071985Genes 74444

    MED45071988Anatomy5555

    WHERE Pages > 200

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 39

    המשך–דוגמא

    COUNT(Book_Id)Year

    41998

    11988

    12001

    11985

    AVG(Pages)

    369

    450

    424

    580

    SELECT Year, COUNT(Book_Id) FROM Books

    WHERE Pages > 200

    GROUP BY Year HAVING AVG(Pages) > 400;

    COUNT(Book_Id)Year

    11988

    12001

    11985

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 40

    המשך–דוגמא

    שלבים)הסבר:)

    .1WHERE : בחירת הרשומות של הספרים שמכילים.עמודים200-יותר מ

    .2GROUP BY :כך שבכל , קיבוץ הרשומות לקבוצות.Yearאותו ( הספרים)קבוצה יש לכל הרשומות

    חישוב מספר העמודים הממוצע בכל : סטטיסטיות' פונ3..הספרים בכל קבוצה' ואת מס, קבוצה

    .4HAVING : בחירת הקבוצות בהן הממוצע הוא לפחות400.

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 41

    מה עושה שאילתה זו: דוגמא?

    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;

    דוגמא נוספת

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 42

    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;

    (OUTER JOIN)המשך –דוגמא

    Book_IdCust_NameCust_Id

    1111Moshe Cohen12345

    1112Moshe Cohen12345

    1113Lior Edri45678

    2222Lior Edri45678

    Avi Barak23456

    Avi Barak34567

    Moshe Cohen56789

    Moshe Cohen67890

    Cust_NameCust_Id

    Moshe Cohen12345

    Moshe Cohen12345

    Lior Edri45678

    Lior Edri45678

    Avi Barak23456

    Avi Barak34567

    Moshe Cohen56789

    Moshe Cohen67890

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 43

    השאילתה מחזירה לכל לקוח : תשובהID ,שם ומס '

    .הספרים שהזמין

    תוצאה:

    המשך–דוגמא

    COUNT (Book_Id)Cust_NameCust_Id

    2Moshe Cohen12345

    2Lior Edri45678

    0Avi Barak23456

    0Avi Barak34567

    0Moshe Cohen56789

    0Moshe Cohen67890

    ?OUTER JOIN-מה הייתה התוצאה ללא ה•

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 44

    SELECT DISTINCT C1.Cust_Name

    FROM Customers C1, Customers C2

    WHERE C1. Cust_Name = C2. Cust_Name

    AND C1.Cust_Id C2.Cust_Id;

    ALIAS : שליפה מאותה טבלה

    פעמיים

    ?מה מחזירה השאילתה: שאלה•

    שמות כל הלקוחות כך שיש בספרייה עוד : תשובה•

    .לקוח עם אותו שם

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 45

    התנאי ב: מוטיבציה-WHERE מכיל ביטוי שלא ידוע

    .אלא תלוי בתוכן המסד, מראש

    שליפת כל שמות הספרים שיצאו לאור באותה : דוגמא

    .1112' שנה כמו ספר מס

    SELECT Book_Name FROM Books

    WHERE Year =

    (SELECT Year FROM Books WHERE Book_Id = 1112);

    SUBQUERIES–שאילתות -תתי

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 46

    שאילתה יכולה לשלוף כמה ביטויים-תת.

    אפשר להשוות לערכים של כל הביטויים האלה בו זמנית.

    שליפת כל הספרים שיצאו לאור באותה שנה ונמצאים : דוגמא

    .1112' באותה פקולטה כמו ספר מס

    SELECT Book_Name FROM Books

    WHERE (Year, Faculty) =

    (SELECT Year, Faculty FROM Books

    WHERE Book_Id = 1112);

    המשך–שאילתות -תתי

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 47

    המשך–שאילתות -תתי

    תת שאילתה יכולה להופיע בחלק ה-From.

    לקבל חייבתתת השאילתהAlias.

    20-0שליפת מספרי הספרים שהוזמנו אחרי : דוגמאct-98

    .12345י לקוח "ע

    SELECT Book_Id

    FROM (SELECT * FROM Ordered

    Where Order_Date > '20-0ct-98') O

    WHERE O. Cust_Id = 1234;

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 48

    השוואת ערך בודד לקבוצת ערכים: מוטיבציה

    בהינתן ערךx וקבוצהA ,נרצה לבטא:

    xגדול מכל הערכים ב-A(yA:x>y)

    xקטן מערך כלשהו ב-A(yA:x

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 49

    י כתיבת המילה "הכימות נעשה עANY אוALL אחרי

    סימן ההשוואה

    שליפת שמות ספרים בעלי יותר עמודים מכל : דוגמא

    .הספרים בפקולטה למדעי המחשב

    SELECT Book_Name

    FROM Books

    WHERE Pages >ALL

    (SELECT Pages FROM Books WHERE Faculty = 'CS');

    המשך–כמתים

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 50

    ניתן לממש אופרטור שייכות באמצעות כמתים:

    .1=ANYIN

    .2ALLNOT 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');

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 51

    שאילתות-ניתן לקונן תתי

    כל הפקולטות שמחזיקות ספרים שהזמין לקוח : דוגמה

    :בשם ליאור אדרי

    שאילתות מקוננות-תתי

    SELECT Faculty FROM Books

    WHERE Book_Id IN

    (SELECT Book_Id FROM Ordered

    WHERE Cust_Id IN

    (SELECT Cust_Id FROM Customers

    WHERE Cust_Name = 'Lior Edri'));

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 52

    שאילתות לעומת -תתי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';

    ?איזו מהן יותר יעילה: שאלה•

    כ הפתרון עם "בד, תלוי באופטימיזציה בשרת: תשובה•השאילתות יעיל יותר-תתי

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 53

    כיווני בין הפרמטרים של השאילתה החיצונית -יש קשר דו: מוטיבציהוהפנימית

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

    שאילתות קשורות הדדית-תתי

    SELECT Book_Id, Book_Name, Max_Time

    FROM Books B

    WHERE Max_Time >

    (SELECT AVG(Max_Time) FROM Books

    WHERE Faculty = B.Faculty);

  • 2012אביב DBMS - SQL :שפות שאילתה ,236363 54

    EXISTSשאילתה-הוא אופרטור בוליאני שפועל על תת .

    מחזירTrueהשאילתה מחזירה ערך כלשהו-אם תת ,False

    .אם אינה מחזירה דבר

    שליפת כל שמות הלקוחות שהזמינו ספר כלשהו: דוגמה

    EXISTSאופרטור

    SELECT Cust_Name

    FROM Customers C

    WHERE EXISTS

    (SELECT * FROM Ordered

    WHERE Cust_Id = C.Cust_Id);

  • 55

    VIEWS–מבטים

    להתייחס לפלט של שאילתה כאל טבלה : מוטיבציה

    (.בלי ליצור אותה פיזית)נפרדת

    השאילתה שמגדירה את המבט נשמרת במסד : בפועל

    .הנתונים ומופעלת כל פעם מחדש

    דרכו אפשר " חלון"המבט מהווה מעין : אינטואיציה

    .להסתכל על חלק ממסד הנתונים

    פישוט שאילתות, הסתרת מידע: מטרה...

    2012אביב DBMS - 236363LQS :LMD+LDD ,

  • 56

    המשך-מבטים

    יצירת מבט:

    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.

    2012אביב DBMS - 236363LQS :LMD+LDD ,

  • 57

    המשך–דוגמא

    FacultyPagesMax_TimeYearBook_NameBook_Id

    CS34871998Database Systems 1111

    CS348141998Database Systems 1112

    CS42472001Database Systems1113

    CS39011998Database And Knowledge2222

    EE39071998Database And Knowledge2223

    EE180211998Electronic Circuits3333

    MED58071985Genes 74444

    MED45071988Anatomy5555

    Books:

    7Database Systems 1111

    14Database Systems 1112

    7Database Systems1113

    1Database And Knowledge2222

    Max_TimeBook_NameBook_Id

    CSBooks

    2012אביב DBMS - 236363LQS :LMD+LDD ,

  • 58

    (שאילתות)המשך –מבטים

    על מבט ניתן לבצע שאילתות ממש כאילו היה טבלה.

    שליפת כל הספרים של מדעי מחשב שמשך : דוגמה

    .ימים7ההשאלה שלהם הוא

    SELECT Book_Name

    FROM CSBooks

    WHERE Max_Time = 7;

    2012אביב DBMS - 236363LQS :LMD+LDD ,

  • 59

    (מחיקה)המשך –מבטים

    מחיקת מבט :DROP VIEW

    דוגמה:

    DROP VIEW CSBooks;

    לטבלה שעליה מבוסס המבט לא קורה כלום.

    2012אביב DBMS - 236363LQS :LMD+LDD ,

  • 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

    CREATE TABLE Node(id int PRIMARY KEY,color text

    )

    CREATE TABLE Edge(src int REFERENCES Node(id),tgt int REFERENCES Node(id),PRIMARY KEY (src,tgt)

    )

    1 2

    3

    4

    56

    • 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

    CREATE TRIGGER edge_triggerBEFORE INSERT ON Edge FOR EACH ROW EXECUTE PROCEDURE add_missing_nodes();

    CREATE OR REPLACE FUNCTION add_missing_nodes() RETURNS TRIGGER AS $$

    BEGINIF (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;

    A mapping of a function to update events

    Function declaration

    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

  • Trigger Syntax

    CREATE TRIGGER

    ON

    FOR EACH

    EXECUTE PROCEDURE ;

    WHEN ();

    What would happen if we replaced

    BEFORE with AFTER?

    CREATE TRIGGER edge_triggerBEFORE INSERT ON Edge FOR EACH ROW EXECUTE PROCEDURE add_missing_nodes();