SQL Structured Query Language DBMS - 236363, שאילתה :שפות SQL 1
דוגמא של מסד נתונים - תזכורת מסד נתונים של ספרייה Customers Cust_Id Cust_Name Faculty Ordered Cust_Id Book_Id Order_Date Borrowed Cust_Id Book_Id From_Date To_Date Books Book_Id Book_Name Year Max_Time Faculty Pages DBMS - 236363, שאילתה :שפות SQL 2
פירוט הטבלאות Customers(Cust_Id, Cust_Name, Faculty) מס ' זהות של לקוח )ייחודי לכל לקוח ) Cust_Id: שם לקוח Cust_Name: שם פקולטה Faculty: DBMS - 236363, שאילתה :שפות SQL 3
הטבלה Customers Cust_Id 12345 23456 3456 4568 5689 6890 Cust_Name Moshe Cohen Avi Barak Avi Barak Lior Edri Moshe Cohen Moshe Cohen Faculty CS EE MED EE EE EE DBMS - 236363, שאילתה :שפות SQL 4
פירוט הטבלאות )המשך...( Books(Book_Id, Book_Name, Year, Max_Time, Faculty, Pages) מס ' מזהה )ייחודי לכל עותק( Book_Id: שם הכותר Book_Name: שנת הוצאה Year: משך השאלה מקס ' אפשרי )בימים( Max_Time: שם פקולטה Faculty: מס ' עמודים Pages: DBMS - 236363, שאילתה :שפות SQL 5
הטבלה Books Book_Id Book_Name Year Max_Time Pages Faculty 1111 Database Systems 348 CS 1112 Database Systems 14 348 CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED DBMS - 236363, שאילתה :שפות SQL 6
פירוט הטבלאות )המשך...( Ordered(Cust_Id, Book_Id, Order_Date) מס ' זהות של לקוח Cust_Id: מס ' מזהה )ייחודי לכל עותק( : Book_Id תאריך הזמנת הכותר Order_Date: DBMS - 236363, שאילתה :שפות SQL
טבלת Ordered Cust_Id 12345 4568 12345 4568 Book_Id 1111 1112 1113 2222 Order_Date 14-Oct-2002 24-Oct-2002 30-Oct-2002 12-Oct-2002 DBMS - 236363, שאילתה :שפות SQL 8
פירוט הטבלאות )המשך...( Borrowed(Book_Id, Cust_Id, From_Date, To_Date) מס ' מזהה של ספר Book_Id: מס ' זהות של לקוח Cust_Id: תאריך השאלת הספר From_Date: תאריך החזרת הספר To_Date: DBMS - 236363, שאילתה :שפות SQL 9
טבלת Borrowed Book_Id Cust_Id From_Date To_Date 5555 5689 13-Oct-2002 DBMS - 236363, שאילתה :שפות SQL 10
שאילתות ב- 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], ]; DBMS - 236363, שאילתה :שפות SQL 11
WHERE מה תחזיר השאילתה הבאה? SELECT Book_Name FROM Books WHERE Year >= 1990 AND Year <= 2000; כל הספרים שהוצאו בין השנים 1990 ו- 2000. DBMS - 236363, שאילתה :שפות SQL 12
המשך דוגמא - Books: Book_Id SELECT Book_Name FROM Books WHERE Year >= 1990 AND Year <= 2000; Book_Name Year Max_Time Pages Faculty 1111 Database Systems 348 CS 1112 Database Systems 14 348 CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED DBMS - 236363, שאילתה :שפות SQL 13
דוגמא - תוצאה SELECT Book_Name FROM Books WHERE Year >= 1990 AND Year <= 2000 : Book_Name Database Systems Database Systems Database And Knowledge Database And Knowledge Electronic Circuits DBMS - 236363, שאילתה :שפות SQL 14
האופרטור LIKE DBMS - 236363, שאילתה :שפות SQL 15
האופרטור LIKE האופרטור LIKE בודק התאמה של מחרוזת לתבנית נתונה.)wildcards( התו "_" מתאים לתו בודד. התו "%" מתאים לסדרת תווים כלשהי, באורך 0 או יותר. דוגמא: שליפת כל שמות הספרים ששמם מכיל את המחרוזת Database והאות לפני אחרונה היא m: SELECT Book_Name FROM Books WHERE Book_Name LIKE '%Database%m_'; DBMS - 236363, שאילתה :שפות SQL 16
דוגמא - המשך Books: SELECT Book_Name FROM Books WHERE Book_Name LIKE '%Database%m_'; Book_Id Book_Name Year Max_Time Pages Faculty 1111 Database Systems 348 CS 1112 Database Systems 14 348 CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED DBMS - 236363, שאילתה :שפות SQL 1
דוגמא - תוצאה SELECT Book_Name FROM Books WHERE Book_Name LIKE '%Database%m_' : Book_Name Database Systems Database Systems Database Systems DBMS - 236363, שאילתה :שפות SQL 18
ערכים חסרים NULL ערך מיוחד המציין ערך חסר )"משבצת ריקה"( NULL NULL לדוגמא: תאריך החזרה של ספר שעדיין לא הוחזר השוואה ל- NULL : אם expr הוא ערך מחזיר true expr IS NULL expr IS NOT NULL דוגמא: שליפת כל הספרים שעוד לא הוחזרו. SELECT Book_Id FROM Borrowed WHERE To_Date IS NULL; DBMS - 236363, שאילתה :שפות SQL 19
ערכי NULL )המשך( בעיה: ערך של ביטוי אריתמטי או ביטוי לוגי המכיל NULL תמיד יהיה.NULL פתרון: קביעת "ברירת מחדל" עבור ערך שיכול להיות :NULL COALESCE(value, default) דוגמא: הצגת משך ההשאלה בשבועות של כל הספרים )עבור ספרים שעדיין לא הוחזרו יש להציג 0(. SELECT Book_Id, COALESCE(To_Date From_Date, 0) / FROM Borrowed; בצורה כללית: COALESCE(expr1,expr2, ) מחזיר את הערך הראשון השונה מ- NULL DBMS - 236363, שאילתה :שפות SQL 20
פונקציות סטטיסטיות SQL ב- ישנן הפונקציות הסטטיסטיות הבאות: מינימום מקסימום ממוצע סכום MIN MAX AVG SUM COUNT מספר הרשומות כל אחת מפונקציות אלה פועלת על קבוצת ערכים ומחזירה ערך אחד. DBMS - 236363, שאילתה :שפות SQL 21
דוגמא דוגמא: חשב את מספר העמודים הממוצע והמקסימלי בין כל הספרים: פתרון: SELECT AVG(Pages), MAX(Pages) FROM Books; DBMS - 236363, שאילתה :שפות SQL 22
דוגמא המשך SELECT AVG(Pages), MAX(Pages) FROM books; Book_Id Book_Name Year Max_Time Pages Faculty 1111 Database Systems 348 CS 1112 Database Systems 14 348 CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED DBMS - 236363, שאילתה :שפות SQL 23
דוגמא המשך SELECT AVG(Pages), MAX(Pages) FROM books; AVG(Pages) MAX(Pages) 389 580 Pages 348 348 424 390 390 180 580 450 DBMS - 236363, שאילתה :שפות SQL 24
ו) פעולות סטטיסטיות על ערכי NULL כל הפונקציות הסטטיסטיות מתעלמות מערכי.NULL יוצא מן הכלל:.COUNT(*) ההבדל בין count לבין פונקציות סטטיסטיות אחרות הוא ש- count תחזיר 0 כאשר הוא תקבל אף ערך והפונקציות הסטטיסטיות האחרות יחזירו.null לכן פונקציות סטטיסטיות שמקבלות עמודה של null יחזירו null )הן מתעלמות מערכי ה- null ומקבלות כלום, לכן מחזירות )null פרט ל- count שתחזיר count(*)- 0 תחזיר את מספר השורות( DBMS - 236363, שאילתה :שפות SQL 25
פעולות סטטיסטיות על ערכי NULL Borrowed: Book_Id Cust_Id From_Date To_Date 5555 5689 13-Oct-2002 SELECT MAX(To_Date) FROM Borrowed; SELECT COUNT(To_Date) FROM Borrowed; SELECT COUNT(*) FROM Borrowed; יחזיר NULL יחזיר 0 יחזיר 1 DBMS - 236363, שאילתה :שפות SQL 26
פונקציות סטטיסטיות המשך דוגמא: שליפת מספר הספרים בכל שנה פתרון שגוי: SELECT Year, COUNT(Book_Id) FROM Books; לא חוקי! )הרבה ערכים של.)COUNT,Year ערך אחד של DBMS - 236363, שאילתה :שפות SQL 2
קיבוץ BY GROUP הפעלת פונקציות סטטיסטיות על קבוצות של רשומות. המשך הדוגמא )תיקון(: SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year; לכל ערך של ה, COUNT- מחושב בנפרד. Year DBMS - 236363, שאילתה :שפות SQL 28
המשך BY( )GROUP SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year; Book_Id Book_Name Year Max_Time דוגמא Pages Faculty 1111 Database Systems 348 CS 1112 Database Systems 14 348 CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED DBMS - 236363, שאילתה :שפות SQL 29
)GROUP BY( Book_Id 1111 1112 1113 2222 2223 3333 4444 5555 Year 2001 1985 1988 המשך SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year; Year 1988 2001 1985 דוגמא COUNT(Book_Id) 5 1 1 1 DBMS - 236363, שאילתה :שפות SQL 30
קיבוץ המשך דוגמא שגויה אחרת: SELECT Faculty, COUNT(Book_Id) FROM Books GROUP BY Year; לא חוקי! לאחר הקיבוץ לפי,Year בכל קבוצה יכולים להיות ערכי Faculty שונים. כלל: בנוסף לפעולות סטטיסטיות, מותר לשלוף רק שדות לפיהם מתבצע הקיבוץ )וביטויים(. DBMS - 236363, שאילתה :שפות SQL 31
בחירה לאחר קיבוץ - HAVING האופציה :HAVING condition בחירת חלק מהקבוצות המתקבלות מ-.GROUP BY התנאי :condition פונקציות סטטיסטיות, שדות לפיהם מתבצע הקיבוץ, ביטויים. DBMS - 236363, שאילתה :שפות SQL 32
דוגמא )HAVING( דוגמא: מה מחזירה השאילתה הבאה? SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year HAVING AVG(Pages) > 400; הסבר: לאחר הקיבוץ לפי,Year מבין כל הקבוצות נבחרות כאלה שבהן ממוצע מספרי העמודים גדול מ-.400 DBMS - 236363, שאילתה :שפות SQL 33
דוגמא המשך )HAVING( SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year HAVING AVG(Pages) > 400; Book_Id Book_Name Year Max_Time Pages Faculty 1111 Database Systems 348 CS 1112 Database Systems 14 348 CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED DBMS - 236363, שאילתה :שפות SQL 34
דוגמא המשך )HAVING( SELECT Year, COUNT(Book_Id) FROM Books GROUP BY Year HAVING AVG(Pages) > 400; Year COUNT(Book_Id) AVG(Pages) 5 331 1988 1 450 2001 1 424 1985 1 580 Year COUNT(Book_Id) 1988 1 2001 1 1985 1 AVG(Pages) > 400 DBMS - 236363, שאילתה :שפות SQL 35
בחירה: WHERE לעומת HAVING בחירת רשומות בחירת קבוצות לפני הקיבוץ אחרי הקיבוץ. :WHERE :HAVING דוגמא: בין כל הספרים עם יותר מ- 200 עמודים, חשב בכל שנה את מס' הספרים שיצאו לאור, בתנאי שבממוצע מספר העמודים באותה שנה גדול מ- 400. DBMS - 236363, שאילתה :שפות SQL 36
דוגמא המשך דוגמא: בין כל הספרים עם יותר מ- 200 עמודים, חשב בכל שנה את מס' הספרים שיצאו לאור, בתנאי שבממוצע מספר העמודים באותה שנה גדול מ- 400. SELECT Year, COUNT(Book_Id) FROM Books WHERE Pages > 200 GROUP BY Year HAVING AVG(Pages) > 400; DBMS - 236363, שאילתה :שפות SQL 3
Books: דוגמא המשך SELECT Year, COUNT(Book_Id) FROM Books WHERE Pages > 200 GROUP BY Year HAVING AVG(Pages) > 400; Book_Id Book_Name Year Max_Time Pages Faculty 1111 1112 Database Systems Database Systems 14 348 348 CS CS 1113 Database Systems 2001 424 CS 2222 Database And Knowledge 1 390 CS 2223 Database And Knowledge 390 EE 3333 Electronic Circuits 21 180 EE 4444 Genes 1985 580 MED 5555 Anatomy 1988 450 MED WHERE Pages > 200 DBMS - 236363, שאילתה :שפות SQL 38
דוגמא המשך SELECT Year, COUNT(Book_Id) FROM Books WHERE Pages > 200 GROUP BY Year HAVING AVG(Pages) > 400; Year 1988 2001 1985 COUNT(Book_Id) 4 1 1 1 AVG(Pages) 369 450 424 580 Year 1988 2001 1985 COUNT(Book_Id) 1 1 1 DBMS - 236363, שאילתה :שפות SQL 39
דוגמא המשך הסבר )שלבים(: 1. :WHERE בחירת הרשומות של הספרים שמכילים יותר מ- 200 עמודים. 2. BY :GROUP קיבוץ הרשומות לקבוצות, כך שבכל קבוצה יש לכל הרשומות )הספרים( אותו.Year 3. פונ' סטטיסטיות: חישוב מספר העמודים הממוצע בכל קבוצה, ואת מס' הספרים בכל קבוצה. 4. :HAVING בחירת הקבוצות בהן הממוצע הוא לפחות.400 DBMS - 236363, שאילתה :שפות SQL 40
דוגמא נוספת דוגמא: מה עושה שאילתה זו? 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; DBMS - 236363, שאילתה :שפות SQL 41
דוגמא המשך JOIN( )OUTER SELECT Customers.Cust_Id, Customer.Cust_Id, Cust_Name, COUNT(Book_Id) FROM Customers LEFT OUTER JOIN Ordered ON ( Customers.Cust_Id Customer.Cust_Id = Ordered. Cust_Id ); ) GROUP BY Customers.Cust_Id, Cust_Name; Cust_Id Cust_Name Book_Id 12345 Moshe Cohen 1111 12345 Moshe Cohen 1112 4568 Lior Edri 1113 4568 23456 3456 5689 6890 Lior Edri Avi Barak Avi Barak Moshe Cohen Moshe Cohen 2222 DBMS - 236363, שאילתה :שפות SQL 42
דוגמא המשך תשובה: השאילתה מחזירה לכל לקוח,ID שם ומס' הספרים שהזמין. Cust_Id Cust_Name תוצאה: (Book_Id) COUNT 12345 4568 23456 3456 5689 6890 Moshe Cohen Lior Edri Avi Barak Avi Barak Moshe Cohen Moshe Cohen 2 2 0 0 0 0 מה הייתה התוצאה ללא ה- JOIN?OUTER DBMS - 236363, שאילתה :שפות SQL 43
:ALIAS שליפה מאותה טבלה פעמיים SELECT DISTINCT C1.Cust_Name FROM Customers C1, Customers C2 WHERE C1. Cust_Name = C2. Cust_Name AND C1.Cust_Id <> C2.Cust_Id; שאלה: מה מחזירה השאילתה? תשובה: שמות כל הלקוחות כך שיש בספרייה עוד לקוח עם אותו שם. DBMS - 236363, שאילתה :שפות SQL 44
תתי-שאילתות SUBQUERIES מוטיבציה: התנאי ב- WHERE מכיל ביטוי שלא ידוע מראש, אלא תלוי בתוכן המסד. דוגמא: שליפת כל שמות הספרים שיצאו לאור באותה שנה כמו ספר מס' 1112. SELECT Book_Name FROM Books WHERE Year = (SELECT Year FROM Books WHERE Book_Id = 1112); DBMS - 236363, שאילתה :שפות SQL 45
תתי-שאילתות המשך תת-שאילתה יכולה לשלוף כמה ביטויים. אפשר להשוות לערכים של כל הביטויים האלה בו זמנית. דוגמא: שליפת כל הספרים שיצאו לאור באותה שנה ונמצאים באותה פקולטה כמו ספר מס' 1112. SELECT Book_Name FROM Books WHERE (Year, Faculty) = (SELECT Year, Faculty FROM Books WHERE Book_Id = 1112); DBMS - 236363, שאילתה :שפות SQL 46
תתי-שאילתות המשך תת שאילתה יכולה להופיע בחלק ה- From. תת השאילתה חייבת לקבל.Alias דוגמא: שליפת מספרי הספרים שהוזמנו אחרי 20-0ct-98 ע"י לקוח 12345. SELECT Book_Id FROM (SELECT * FROM Ordered Where Order_Date > '20-0ct-98') O WHERE O. Cust_Id = 1234; DBMS - 236363, שאילתה :שפות SQL 4
כמתים מוטיבציה: השוואת ערך בודד לקבוצת ערכים בהינתן ערך,A וקבוצה x x גדול מכל הערכים ב- A נרצה לבטא: ) y A:x>y( קטן מערך כלשהו ב- A x ) y A:x<y( ) y A:x=y( x A כמתים ב- SQL : -- קיים -- ANY ALL.1.2 לכל DBMS - 236363, שאילתה :שפות SQL 48
כמתים המשך הכימות נעשה ע"י כתיבת המילה ANY או ALL אחרי סימן ההשוואה דוגמא: שליפת שמות ספרים בעלי יותר עמודים מכל הספרים בפקולטה למדעי המחשב. SELECT Book_Name FROM Books WHERE Pages >ALL (SELECT Pages FROM Books WHERE Faculty = 'CS'); DBMS - 236363, שאילתה :שפות SQL 49
כמתים המשך )אופרטור שייכות( ניתן לממש אופרטור שייכות באמצעות כמתים: SELECT Book_Name, Year FROM Books IN NOT IN =ANY <>ALL דוגמא: WHERE Year = IN ANY (SELECT (SELECT Year Year FROM FROM Books Books WHERE Faculty = 'MED'); MED );.1.2 DBMS - 236363, שאילתה :שפות SQL 50
תתי-שאילתות מקוננות ניתן לקונן תתי-שאילתות דוגמה: כל הפקולטות שמחזיקות ספרים שהזמין לקוח בשם ליאור אדרי: 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')); DBMS - 236363, שאילתה :שפות SQL 51
תתי-שאילתות המשך תתי-שאילתות לעומת 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'; שאלה: איזו מהן יותר יעילה? תשובה: תלוי באופטימיזציה בשרת, בד"כ הפתרון עם תתי-השאילתות יעיל יותר DBMS - 236363, שאילתה :שפות SQL 52
תתי-שאילתות קשורות הדדית מוטיבציה: יש קשר דו-כיווני בין הפרמטרים של השאילתה החיצונית והפנימית דוגמה: החזירו את מספרי הספרים,שמות הספרים וזמן ההשאלה עבור ספרים שניתן להשאיל אותם לתקופה ארוכה מהממוצע באותה פקולטה SELECT Book_Id, Book_Name, Max_Time FROM Books B WHERE Max_Time > (SELECT AVG(Max_Time) FROM Books WHERE Faculty = B.Faculty); DBMS - 236363, שאילתה :שפות SQL 53
אופרטור EXISTS EXISTS הוא אופרטור בוליאני שפועל על תת-שאילתה. מחזיר True אם תת-השאילתה מחזירה ערך כלשהו, False אם אינה מחזירה דבר. דוגמה: שליפת כל שמות הלקוחות שהזמינו ספר כלשהו SELECT Cust_Name FROM Customers C WHERE EXISTS (SELECT * FROM Ordered WHERE Cust_Id = C.Cust_Id); DBMS - 236363, שאילתה :שפות SQL 54
מבטים VIEWS מוטיבציה: להתייחס לפלט של שאילתה כאל טבלה נפרדת )בלי ליצור אותה פיזית(. בפועל: השאילתה שמגדירה את המבט נשמרת במסד הנתונים ומופעלת כל פעם מחדש. אינטואיציה: המבט מהווה מעין "חלון" להסתכל על חלק ממסד הנתונים. מטרה: הסתרת מידע, פישוט שאילתות... דרכו אפשר DBMS - LQS :LMD+LDD, 236363 55
מבטים - המשך יצירת מבט: 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 DBMS - LQS :LMD+LDD, 236363 56
דוגמא המשך Books: Book_Id Book_Name Year 1111 Database Systems 1112 Database Systems 1113 Database Systems 2001 2222 Database And Knowledge 2223 Database And Knowledge 3333 Electronic Circuits 4444 5555 Book_Id 1111 1112 1113 2222 Genes Book_Name Anatomy Database Systems 1985 1988 Database Systems Database Systems Database And Knowledge Max_Time 14 1 14 1 21 Max_Time Pages Faculty 348 CS 348 CS 424 CS 390 CS 390 EE 180 EE 580 MED 450 MED CSBooks DBMS - LQS :LMD+LDD, 236363 5
מבטים המשך )שאילתות( על מבט ניתן לבצע שאילתות ממש כאילו היה טבלה. דוגמה: שליפת כל הספרים של מדעי מחשב שמשך ההשאלה שלהם הוא ימים. SELECT Book_Name FROM CSBooks WHERE Max_Time = ; DBMS - LQS :LMD+LDD, 236363 58
מבטים המשך )מחיקה( DROP VIEW CSBooks; מחיקת מבט: DROP VIEW דוגמה: לטבלה שעליה מבוסס המבט לא קורה כלום. DBMS - LQS :LMD+LDD, 236363 59
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 1 2 4 6 5 3 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) ) 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 A mapping of a function to update events CREATE TRIGGER edge_trigger BEFORE INSERT ON Edge FOR EACH ROW EXECUTE PROCEDURE add_missing_nodes(); Function declaration CREATE OR REPLACE FUNCTION add_missing_nodes() RETURNS TRIGGER AS $$ BEGIN IF (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; 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 <name> <BEFORE/AFTER> <INSERT/UPDATE/DELETE> ON <relationname> FOR EACH <ROW/STATEMENT> EXECUTE PROCEDURE <functionname>; WHEN (<condition>); CREATE TRIGGER edge_trigger BEFORE INSERT ON Edge FOR EACH ROW EXECUTE PROCEDURE add_missing_nodes(); What would happen if we replaced BEFORE with AFTER?