Professional Documents
Culture Documents
חוברת לימוד
חוברת לימוד
server 2016
27740-9287-02
תוכן עניינים
3 ..................................................................................................................................... מבוא
13 ................................................................ sql server managment studio – SSMS עבודה עם
15 ........................................................................................................ SELECT פקודת- 1פרק
20 ................................................................................................... WHERE משפט ה- 2 פרק
28 ........................................................................ )Scalar functions( פונקציות סקלריות- 3 פרק
41 ......................................................................................... SQL Server Data Types - 4 פרק
43 ...............................................................................)JOIN( שילוב מידע ממספר טבלאות-5 פרק
50 ....................................................................... Group Function And Grouping Sets - 6 פרק
56 ................................................................................. )SUBQUERIES( תתי שאילתות- 7 פרק
60 ....................................................................................................... SET Operators - 8 פרק
63 ................................................................................................. Window Functions - 9 פרק
70 .................................................................... Common Table Expressions (CTE) -10 פרק
72 ................................................................................................................. Pivoting- 11 פרק
75 ......................................................................................................... DML – פקודות12 פרק
81 .............................................................. Data Definition Language – DDL פקודות- 13 פרק
88 ...................................................................................................................... View -14 פרק
90 ....................................................................................................... T-SQL BASIC -15 פרק
100 ................................................................................................ Stored procedure -16 פרק
108 .............................................................................................................................. נספחים
139 ............................................................................................................. SQL תקציר פקודות
מושגי יסוד
Database מסד נתונים
Relational Database מסד נתונים יחסי
RDBMS מערכת לניהול מסד נתונים יחסי
שפת SQL
שפת T-SQL
אילוצים Constraints
בעבודה מול מסד נתונים ,אחד הדברים החשבים ביותר הוא אמינות הנתונים ( .)Data integrityכלומר ,חשוב
שעל עמודות מסויימות יקבעו חוקים שימנעו כניסת נתוני "זבל" לתוכן .חוקים אלה נקראים אילוצים.
-(UK) UNIQUE .2יחודיות .אילוץ Uniqueפירושו שלא יופיעו ערכים כפולים בעמודה מסויימת .למשל
עמודת מספר תעודת זהות ,עמודת מספר דרכון וכו'.
ניתן להגדיר את Uniqueעל עמודה אחת או על שילוב של כמה עמודות (למשל השילוב של קידומת ומספר
טלפון צריך להיות יחודי)
ב SQL-SERVER -מותר שיהיה רק ערך NULLאחד בעמודה המוגדרת .Unique
מבוא למסדי נתונים בסביבת SQL Server עמוד 4
© כל הזכויות שמורות לג'ון ברייס מכללת הי-טק מקבוצת מטריקס
-(CK) CHECK.3בדיקה .אפשר לבקש בדיקה מסויימת עבור עמודות .למשל אפשר לבדוק שמחירו של מוצר
תמיד חיובי ,או שתאריך הלידה קטן מתאריך תחילת העבודה וכו'.
- (PK) Primary Key .4מפתח ראשי .עמודת מפתח ראשי היא למעשה עמודה שהערכים בה שונים זה
מזה (כמו , )UNIQUEוכן יש בה חובת הזנה (כמו .)NOT NULLעמודת המפתח הראשי עוזרת לזהות
רשומות מסויימות בצורה פשוטה ומהירה.
בכל טבלה יכול להיות רק מפתח ראשי אחד ,שיכול להיות מוגדר על עמודה בודדת (למשל קוד מוצר) או על
שילוב עמודות.
- (FK) FOREIGN KEY .5מפתח זר .עמודה המקשרת בין טבלאות .זו למעשה עמודה הנשענת על עמודה
אחרת .עמודת כזו יכולה להשען על מפתח ראשי או .UNIQUE
העמודה עליה מוגדר ה FKהיא עמודת ה"בת" ( )childואילו העמודה עליה היא נשענת נראת עמודת ה"אם"
()parent
עמודת FKיכולה להכיל בתוכה רק ערכים הקיימים בעמודת האם (או .)NULL
בד"כ כאשר אומרים שיש "קשר" בין טבלאות הכוונה היא לקשר PK-FK
*להסבר מפורט יותר על תכנון מבנה הטבלאות ראה נספח ראשון :ניתוח ועיצוב מודל הנתונים
– NorthWindבסיס נתונים המכיל מידע לגבי חברה המייבאת ומייצאת מזון יחודי מכל העולם.
- Pubsבסיס נתונים המכיל מידע לגבי חברת הוצאת ספרים.
Object explorerהינו כלי גרפי המאפשר לנהל את ה Databases -ואת האובייקטים שלו כגון :טבלאות,
Stored Procedures ,Viewsוכו...
שימוש:
משפט selectמאפשר לקבל חתכי מידע שונים מתוך הטבלאות שבמאגר הנתונים.
ניתן לשלב במשפט חלקים שונים בהם נדון במהלך הפרקים הבאים.
דוגמה :
בסיס נתונים.Northwind:
בחירת כל העמודות שבטבלת Employees
* Select
From Employees
סדר העמודות בפלט יהיה זהה לסדר העמודות המוגדר בטבלה .שמות העמודות בטבלה יהוו את שמות
העמודות בפלט.
הצגת עמודות מסוימות מהטבלה
ניתן לבחור עמודות מסוימות מתוך בסיס הנתונים ע"י עריכת רשימה של העמודות הרצויות .בין שמות העמודות
השונים יש להוסיף פסיק .ערכי העמודות יוחזרו לפי סדר הופעתן ברשימת ה SELECTכאשר באופן אוטומטי
שמות העמודות יהוו כותרות עבור התוצאות המוחזרות.
דוגמה:
בסיס נתונים.Northwind:
שליפה של עמודה אחת בלבד ,למשל ,בחירת השמות הפרטיים של כל העובדים שבטבלת .Employees
Select FirstName
From Employees
FirstName
----------
Nancy
Andrew
Janet
Margaret
Steven
Michael
Robert
Laura
Anne
shay
shay
)11(row(s) affected
דוגמה:
בסיס נתונים.Northwind:
שליפה של מספר עמודות ,למשל ,בחירת מספר עובד ,שם פרטי ושם משפחה של כל העובדים שבטבלת
Employees
כאמור ,באופן אוטמטי כותרת עמודה בתוצאה היא שם השדה בבסיס הנתונים .אם רוצים להציג עמודה תחת
כותרת אחרת יש לתת לה כינוי (.)alias
"SELECT column_name AS "Alias
FROM table_name
דגשים
.1אם הכינוי לא מכיל תוים אסורים (למשל רווח) ואינו מילה שמורה (למשל ,)selectאין חובה להוסיף את
הגרשיים.
למשל במקרה בו מכנים עמודה f_nameאין חובה להשתמש בגרשיים.
Select FirstName AS f_name
From Employees
ואילו במקרה בו מכנים אותה , First Nameחייבים להשתמש בגרשיים.
"Select FirstName AS " First name
From Employees
שירשור פירושו הצגת שילוב שדות כשדה אחד בפלט .כשם שניתן לשרשר שדות ,אפשר לשרשר גם טקסט
חופשי .השירשור מתבצע באמצעות האופרטור .+בשרשור טקסט חופשי ,יש לתחום את הטקסט בגרשים.
כתוצאה מפעולת השרשור העמודה תקבל את הכותרת no column nameבפלט ,לכן רצוי לתת לה כינוי
(.)alias
דוגמה:
בסיס נתונים.Northwind:
הצגת פרטי העובדים שבטבלת Employeesבאופן הבא:
תחת עמודה בשם nameיופיעו שמו הפרטי ושם משפחתו של העובד ובעמודה נפרדת יופיע מספרו של
העובד .שים לב שרשור של מלל בין העמודות דורש שימוש בגרש בודד מכל צד של המחרוזת הנוספת
לשרשור.
התוצאה:
Name EmployeeID
----------- -------------------------------
Nancy Davolio 1
Andrew Fuller 2
Janet Leverling 3
Margaret Peacock 4
Steven Buchanan 5
Michael Suyama 6
Robert King 7
Laura Callahan 8
Anne Dodsworth 9
shay Fuller 15
shay ddd 16
שים לב פעולת שירשור זו אינה סטנדרטית .היא מתאימה ל SQL Server -ואך לא תתאים בהכרח לסביבות
אחרות!
דוגמה:
בסיס נתונים.Northwind:
בחירת שמות המוצרים,מחירם הרגיל (כפי שהוא מוגדר בבסיס הנתונים) ומחירם לאחר תוספת של 18%
(המוצרים מטבלת .)products
* גם בביצוע פעולה ארתמטית על עמודה תתקבל הכותרת ,No colum nameולכן במקרה זה ממולץ לתת
לעמודה כינוי (.)alias
דוגמה:
בסיס נתונים.Northwind:
הצגת שמות המוצרים ומחיריהם לאחר 10%הנחה.
ניתן למנוע חזרה של רשומות זהות בתוצאה ע"י שימוש במילה .DISTINCT
למשל,
נניח ורוצים לקבל את שמות וכתובות של כל הלקוחות שבצעו הזמנה של מוצר כלשהו ,כדי לשלוח להם
פרוספקט פרסומת .יכול להיווצר ,כמובן ,מצב שיתקבל אותו שם מספר פעמים ,שכן לקוח מסויים ביצע מספר
הזמנות שונות .אך כמובן שאין צורך לשלוח לו שני מכתבים ועל כן דרושה דרך לקבל שם של כל לקוח פעם
אחת בלבד.
דוגמה:
בסיס נתונים.Northwind:
בחירת ה id-של כל הלקוחות שביצעו הזמנה כלשהי.
Select distinct CustomerID
From Orders
התוצאה:
CategoryID SupplierID
----------- -------- ----------------------
1 1
1 7
1 10
2 1
2 2
2 3
… …
* מספר קטגוריה יכול לחזור כמה פעמים ,כל פעם בשילוב עם מספר ספק אחר.
ניתן להכניס תיעוד והסברים לתוך קוד SQLע"י שימוש בהערת שורה או הערת מקטע.
תיעוד קוד T-SQLאינו פוגע בביצועים! מכיוון שהן אינן נקראות בהרצת הקוד.
הערת שורה:
הערת מקטע:
*/
All the text in this paragraph will be treated as comments
by SQL Server.
*/
סינטקס:
]SELECT * / [DISTINCT] column_name [,column_name..
FROM table_name
] … ערך אופרטור עמודה [ AND / ORערך אופרטור עמודה WHERE
* Select
From Employees
'Where City='London
דוגמה:
שליפת פרטי ההזמנות שהגיעו ליעדן באיחור( .כלומר שתאריך המשלוח שלהן מאוחר מתאריך הדרישה).
* SELECT
FROM Orders
WHERE ShippedDate < RequiredDDate
… -Between…Andמאפשר לבדוק אם ערך בשדה נמצא בטווח ערכים מסוים .האופרטור NOT ...
Between…Andמאפשר לראות אם ערך נמצא מחוץ לטווח ערכים מסויים.
דוגמה:
בסיס נתונים.Northwind:
בחירת שמות כל המוצרים מטבלת Productsאשר מספר היחידות הקיים מהם בין 10
ל.20 -
Select ProductName
From Products
Where UnitsInStock Between 10 and 20
הערות:
)1האופרטור Betweenכולל בטווח המבוקש גם את ערכי הקצה.
בדוגמה לעיל נקבל גם את המוצרים שמחירם בדיוק 10או .20
) 2סדר הערכים חשוב .הערך הראשון צריך להיות הערך הקטן מבין השניים והערך
הגבוה צריך להופיע שני
– IN מאפשר השוואה מול רשימת ערכים .בודק למעשה אם השדה שווה לאחד הערכים ברשימה .בין
הערכים פועל אלגוריתם של ( ORיפורט בהמשך) .האופרטור NOT INמאפשר למצוא שדה שערכו שונה
מרשימת ערכים ,במקרה כזה פועל בין הערכים אלגוריתם של ( ANDיפורט בהמשך).
דוגמה:
בסיס נתונים.Northwind:
בחירת כל הפרטים של כל העובדים שבטבלת ,Employeesאשר גרים בעיר Londonאו Seattleאו
.Tacoma
* Select
From Employees
)‘Where City in ('London‘ ,’ Seattle‘,’ Tacom
- LIKEאופרטור זה מאפשר לבצע השוואה לחלקי מילים .שימושם נפוץ בשאילתות חיפוש כאשר הביטוי
המלא\המדוייק אותו מחפשים לא ידוע .החיפוש מתבצע בעזרת תווי ההכללה הבאים:
Expression Returns
LIKE '[a-cdf]%' a, b, c, d, or f %
LIKE '[-acdf]%' -, a, c, d, or f %
LIKE 'abc_d%' abc_d%
LIKE 'abc[def]' abcd, abce, and abcf
:דוגמה
.Northwind:בסיס נתונים
.A אשר שמם הפרטי מתחיל באותEmployees בחירת כל הפרטים של כל העובדים שבטבלת
Select *
From Employees
Where FirstName LIKE 'A%'
:דוגמה
.Northwind:בסיס נתונים
אשר המיקוד שלהם מתחיל במספר לא מכילEmployees בחירת כל הפרטים של כל העובדים שבטבלת
.9 את הספרה
* Select
From Employees
where postalcode NOT LIKE '%9%'
תחזיר,NULL או השוואה לNULL וכל חישוב עם. מייצג ערך בלתי ידועNULL הערך- IS NULL
במקום זה יש להשתמש במשפט. יחזיר תוצאה ריקהWHERE value = NULL הביטוי, לכן.NULL
לשליפתIS NOT NULL או בNULL לשליפת השדות שיש בהםIS NULL באופרטורWhere -ה
.השדות שיש בהם ערך ידוע כלשהו
דוגמה
עבור אותןCustomers מטבלתCustomerID, CompanyName, and Region שולפת את העמודות
.רשומות הנמצאות באזור בלתי ידוע
טבלת :And
טבלת :Or
טבלת :Not
select ProductName
from products
where UnitsInStock<20
and UnitPrice>30
:התוצאה
ProductName
----------------------------------------
Northwoods Cranberry Sauce
Alice Mutton
Gumb?r Gummib?rchen
Th?ringer Rostbratwurst
Mascarpone Fabioli
C?te de Blaye
Ipoh Coffee
Perth Pasties
Camembert Pierrot
Tarte au sucre
Mozzarella di Giovanni
11 row(s) affected))
המיון יכול לכלול מיון ראשי בלבד או שילוב, order by ניתן למיין את הרשומות החוזרות ע"י צרוף הפסוקית
. מיון ברירת המחדל – סדר עולה.של מיון ראשי עם מיונים משניים
:דוגמה
.Northwind:בסיס נתונים
ביתי בסדר עולה- מסודרות לפי סדר אלפאCategories הצגת כל הקטגוריות שבטבלת
select CategoryName
from Categories
order by CategoryName
. לאחר שם עמודת המיוןDESC מיון בסדר יורד יתבצע ע"י הוספת המילה
:דוגמה
select CategoryName
from Categories
order by CategoryName desc
דוגמה:
Select ProductName, UnitPrice
From Products
Order By 2
ניתן לבחור nרשומות עליונות מתוצאת השאילתה שהתקבלה ,כאשר nמייצג מספר שלם כלשהו.
יש לשלב את פקודת ה TOP -יחד עם Order byכדי לקבל תוצאות שליפה משמעותיות יותר.
דוגמה :
בסיס נתונים.Northwind:
select top 10 * from products
במקרה זה נקבל אך ורק את עשרת הרשומות הראשונות שחזרו כתוצאה מהרצת השאילתה.
WITH TIES
אופצייה זאת משולבת עם פקודת Top nכדי להביא את כל הרשומות התואמות לקבוצת הרשומות שנשלפו
באמצעות ה.top n -
דוגמה :
בסיס נתונים.Northwind:
שליפה זאת תציג את 5המכירות האחרונות שהתבצעו מטבלת Orders
Top N Percent
לאופרטור Topיש וריאציה נוספת המאפשרת לשלוף nאחוזים ראשונים של הרשומות מתוצאות השאילתה.
דוגמה :
בסיס נתונים.Northwind:
הערה:
בד"כ נעשה שימוש בסעיף ה Top -בשילוב עם סעיף ה Order By -שידון בהמשך הפרק .סעיף הOrder -
Byמאפשר למיין את הרשומות לפי הערכים בעמודה מסויימת .כך למשל נוכל לשלוף את עשרת המוצרים
היקרים ביותר מתוך טבלת .Products
דוגמה :
בסיס נתונים.Northwind:
* Select Top 10
From Products
Order By UnitPrice Desc
במסגרת החידושים והשינויים מ SQL Server 2012 -התווסף אפשרות של OFFSET – FETCH
שמאפשר ל"דפדף" בתוך תוצאת שאילתה ,להתחיל מאיזו שורה שרוצים ולהביא ,יחסית לשורה זו ,כמה
שורות שרוצים.
מבנה הפקודה:
דוגמה:
בסיס נתונים.Northwind:
נניח שאנו מעוניינים להחזיר מטבלת Ordersהמכילה 830רשומות ,לדלג על 10רשומות
ראשונות (כלומר יתחיל משורה ,)11ולשלוף רק 10שורות הבאות אחריה.
– Offsetמציין את מספר רשומות ראשונות שידלג עליהם מהתוצאה הממוינת ויחזיר את
הרשומות הנותרות.חייב להיות מסופק בפקודה.
)SELECT CEILING(8.4
תוצאת הרצת הקוד:
9.0
)(1 row(s) affected
דוגמה:
בסיס הנתונים NorthWind
דוגמה זו מחזירה את העמודה UnitPriceמטבלת Productsכולל מע"מ – 15%כאשר התוצאה מעוגלת
למקום 1אחרי הנקודה העשרונית.
27.900000
29.500000
15.500000
:
20.200000
דוגמה:
הדוגמה הבאה עושה שימוש בפונקציות LTRIMו RTRIM -על מנת להסיר את התווים הריקים המובילים
(לפני התו )Sוהתווים הריקים העוקבים (אחרי התו )Lמהמחרוזת.
דוגמה:
הדוגמה הבאה מדגימה איך הפונקציה מחזירה תת מחרוזת מתוך מחרוזת.
במקרה זה הפונקציה SUBSTRINGמחזירה מהמחרוזת ' 5 'SQLSERVERתווים החל מהתו השני.
)SELECT SUBSTRING (‘SQLSERVER', 2,5
פונקציות סקלאריות אלו מבצעות פעולות על תאריך וזמן המתקבלים כקלט ומחזירות מחרוזות ,ערכים נומריים
או ערכי תאריך וזמן.
מרבית הפונקציות מקבלות פרמטר בשם DatePartאשר מייצג את החלק בתאריך אליו מתייחסים בשאילתה.
2002-12-16 00:00:00.000
)(1 row(s) affected
דוגמה:
דוגמה זו מחשבת את ההפרש בימים בין שני התאריכים ' ‘1/1/2001ו.'1/2/2002' -
) 'SELECT DATEDIFF(hh,'2001-01-01','2001-02-01
8784
)(1 row(s) affected
דוגמה:
דוגמה:
הדוגמה הבאה מחזירה את מספר הימים ,מספר החודש והשנה מהתאריך .03/22/2002
פונקציות אלו מטפלות בהמרה מפורשת של ביטוי מטיפוס נתונים אחד לאחר.
מוגדר והיא מאחר לשתיהן תפקודיות דומה ,אך מומלץ להשתמש בפונקצית הCAST -
כ.ANSI standard -
DEC 20 2002
פקודת ה convertזהה בשימושה לפקודת ה ,castאך היא מאפשרת בנוסף להמרה להוסיף סגנון ואינה
סטנדרטית.
דוגמה ל : convert
בדוגמה הבאה אנו ממירים ערך שמוגדר כ datetime -למחרוזת עיצוב המחרוזת נקבע בהתאם לקוד תבנית
עיצוב(,ניתן לקבל את תבניות העיצוב השונות מתפריט העזרה).
12/20/2002
)(1 row(s) affected
------------
20/12/2002
)(1 row(s) affected
זוהי פונקצית המרה המאפשרת להמיר תאריכים טקסטואליים לתאריך תקני של
.SQL Serverבדומה לפונקציית Convertממירה לתבניות תאריך שונות אך אין צורך בפונקציה זאת לזכור
את קוד תבניות העיצוב ,אלא להשתמש בקודי מדינות.
דוגמה :
בדוגמה הבאה ממירים מחרוזת תאריכית בפורמט אנגליה לטיפוס נתונים תאריך אנגלית ארה"ב
)ISNULL(column_name, value
דוגמה:
בסיס נתונים.Northwind:
ומחליפה את הדוגמה הבאה שולפת את העמודות CompanyName, and Faxמטבלת Suppliers
מספרי הפקסים המוצגים כערכים בלתי ידועים (ערכי )NULLבמחרוזת. Unknown
CompanyName Fax
--------------------------- --------------------------
Exotic Liquids Unknown
New Orleans Cajun Delights Unknown
Grandma Kelly's Homestead (313) 555-3349
:
)(29 row(s) affected
שים לב יש הבדל בין ( ISNULLללא רווח) שהיא פונקציה סקלארית ,לבין ( IS NULLעם רווח) שהוא אופרטור
של תנאי .WHERE
ביטוי המספק אמצעי להחזרת נתונים שונים המבוסס על בדיקת הערך המוחזר.
ב SQL-קימות שתי ורסיות שונות של caseוהן:
ה Simple Case -מאפשר בדיקת ערך של משתנה בודד והצגת ערך אחר במקומו .דומה ל Caseמשפות
תיכנות אחרות.
משפט ה ELSEהוא אופציונאלי .אם משמיטם אותו ,כל הערכים שלא פורטו יקבלו .NULL
דוגמה ל : SIMPLE CASE
בסיס נתונים.Northwind:
הדוגמה הבאה עושה שימוש פשוט בביטוי CASEומדפיסה תאור עבור הנחה המוגדרת בשאילתה במידה
והיא קיימת בטבלת פרטי הזמנה.
Discount
--------------
Fine Discount
Small Discount
No Discount
)(3 row(s) affected
. ולאו דווקא שיוויון, מאפשר בדיקה מורכבת יותר של ערכיםSearch Case -ה
:מבנה
CASE
WHEN Boolean_expression THEN result_expression
[...n]
[
ELSE else_result_expression
]
END
.CASE לא כותבים את שם העמודה הנבדקת מיד לאחר המילהSearch Case ההבדל במבנה הוא שב
SELECT CustomerID,
CASE
WHEN ShippedDate IS NULL
THEN 'Call for schedule shipping'
WHEN DATEDIFF(dd,ShippedDate,RequiredDate) < 0
THEN 'Call and apologize'
ELSE 'Shipped O.K'
END AS 'Shipping Status'
FROM Orders
פונקציה זו מאפשר לנו לבדוק האם ערך מסויים אשר התקבל בפונקציה זו כפרמטר הינו מספרי ( או יכול
לשמש כערך מספרי ).
הערכים שפונצקיה זו מחזירה הם ( 1יכול לשמש כערך מספרי) ו ( 0 -לא יכול לשמש כערך מספרי)
פונקציית IIF
מבנה הפונקציה
בדומה לפונקציית ה CASEגם פונקציה זו מאפשר לנו לבדוק ערכים עפ"י תנאים מוגדרים מראש ,למשל :
פונקציה זו בודקת את מחירו את מוצר מסויים בהתאם לתנאי האם הוא נמוך \ גבוה מ 50 -
ומחזירה תוצאות בהתאם.
tinyint 0 to 255 1
31
int 2 (-2,147,483,648) to 4
31
2 -1 (2,147,483,647)
63 63
bigint -2 - 2 -1 8
(+/- 9 quintillion)
bit 1, 0 or NULL 1
38 38
decimal/numeric -10 +1 through 10 – 1 when maximum 5-17
precision is used
money -922,337,203,685,477.5808 to 8
922,337,203,685,477.5807
smallmoney -214,748.3648 to 214,748.3647 4
Binary Strings
binary- Fixed-length binary data with a maximum length of 8,000 bytes .
varbinary- Variable-length binary data with a maximum length of 8,000 bytes .
image- Variable-length binary data with a maximum length of 2^31 - 1 (2,147,483,647) bytes .
Synonyms
Data type synonyms are included for SQL-92 compatibility .
Synonym Mapped to system data type
binary varying varbinary
char varying varchar
character char
character char(1(
character( n ) char( n (
character varying( n ) varchar( n(
dec decimal
double precision float
float [ ( n ) ] for n = 1-7 real
float [ ( n ) ] for n = 8-15 float
integer int
national character( n ) nchar( n (
national char( n ) nchar( n (
national character varying( n ) nva0rchar( n)
national char varying( n ) nvarchar( n )
national text ntext
numeric decimal
][Join Type
קיימים שני סוגי JOINעיקריים שידונו להלן INNER JOIN :ו.OUTER JOIN -
][alias
נתחיל עם קצת רקע :לכל טבלה במסד נתונים יש שם יחידני המוגדר בעת יצירתה .לעיתים שם זה הוא ארוך
ומסורבל ,ולכן -כדי לשפר את הקריאות ,ניתן לקבוע שם חלופי ( כינוי – )aliasלטבלה במקום שמה האמיתי,
בדיוק כפי שביצענו עבור עמודות( .חשוב לזכור כי ה Aliases -תקפים רק בפקודת ה select -אשר יצרה
אותם).
על מנת ליצור aliasלטבלה מה שנדרש הוא להוסיף את שם הקיצור לאחר ציון שם הטבלה בתת פסוקית
.Fromמקובל לעשות שימוש באות הראשונה של שם הטבלה כ .Alias -
בנוסף ,רצוי לציין תמיד את שם הטבלה לפני שם העמודה ,שכן תהליך זה מקל על ביצועי השרת בעת השליפה
עצמה ,וגם הופך את השאילתא לקריאה יותר.
בדרך כלל ,כאשר JOINמתבסס על קשר ,PK-FKיופיע הסימן שווה במשפט ה .ONיחד עם זאת ,ניתן ,אם
רוצים ,לשלב מידע בין טבלאות על סמך קשר לוגי אחר ,ומותר להשתמש במשפט ה ON -בכל האופרטורים
המוכרים ,וכן ב AND/ORאם יש צורך.
מבנה משפט ה ONמזכיר מאוד מבנה של משפט ,WHEREאלא שבמשפט ה ON-יש לכתוב את התנאים
לפיהם יש לחבר את הטבלאות ,ובמשפט ה WHEREאת שאר התנאים .
INNER Join
זהו ה JOIN-הבסיסי ביותר ,והוא משמש כאמור על מנת לשלב מידע משתי טבלאות (בדרך כלל,בהסתמך על
קשר .)PK-FK
לדוגמה :אם נרצה לשלוף רשימה של שמות המוצרים מטבלת Productsולכל מוצר נרצה לשדך את שם
הקטגוריה אליה הוא שייך (מידע הנמצא בטבלת )Categoriesנדרש לעשות שימוש בפעולת ה Join -ולשדך
רשומות מתאימות מטבלאות Productsו .Categories -
השאילתה המתאימה תראה כך:
בדוגמה לעיל ,השרת יסרוק את הרשומות בטבלת Productsועבור כל מוצר יחפש את הרשומה המתאימה
לו בטבלת .Categoriesהקריטריון על פיו יחליט השרת מי היא הרשומה המתאימה מופיע בסעיף ה ,ON -
ומבוסס על השוואת הערך המופיע בעמודה CategoryIDבטבלת ( Productsעמודת "בת" עליה מוגדר
(Foreign Keyעם הערך המופיע בעמודת CategoryIDבטבלת ( Categoriesעמודת "אם" עליה מוגדר
)Primary Key
שים לב המילה INNERהיא אופציונאלית .כלומר ,אפשר להשמיטה ממשפט ה FROMולקבל את אותה
תוצאה בדיוק.
.Northwind:בסיס נתונים
עבור כל הזמנה מצוין שם. פריטים מאותו מוצר9 הדוגמה מציגה פרטי רשומות הזמנה אשר הוזמנו בהן
. הנתונים ממוינים ע"פ מחיר עלות המוצר. מחיר המוצר ליחידה וכמות הפריטים,המוצר
: המבנה הכללי יראה כך. יותר מצמד טבלאותjoin ניתן לשלב בשאילתת
: דוגמה
.Northwind:בסיס נתונים
כאשר עבור כל מוצר מצוין שם הקטגוריה שלו ושם החברה,products הצגת שמות המוצרים מטבלת
. המספקת את המוצר
ב Left Outer Join -השרת יחזיר את כל הרשומות מהטבלה השמאלית בסעיף ה From -ורק את
הרשומות המתאימות להן מהטבלה הימנית בסעיף ה .From
לדוגמה :ב Join -של טבלאות Customersו Orders -כאשר טבלת Customersמופיעה בתור הטבלה
השמאלית:
From Customers Left Outer Join Orders
נקבל את כל הרשומות מטבלת ( . Customersנקבל גם לקוחות שלא ביצעו הזמנות ולכן אין להם רשומות
מתאימות בטבלת .)Ordersמטבלת Ordersנקבל רק הזמנות שבוצעו ע"י לקוחות שמופיעים בטבלת
.Customersעבור לקוחות שלא ביצעו הזמנות נקבל ערכי Nullתחת העמודות שנשלפות מטבלת .Orders
ב Right Outer Join -העקרון דומה אלא שהפעם השרת יחזיר את כל הרשומות מהטבלה
שמופיעה בצד ימין של סעיף ה .From
ב FullOuter Join -השרת יחזיר את כל הרשומות משתי הטבלאות( .ישדך רשומות להן יש רשומה
מתאימה בטבלה השניה) .רשומות להן אי ן רשומה מתאימה בטבלה השניה יופיעו בתוצאה עם ערכי
Nullתחת העמודות השייכות לטבלה השניה.
דוגמה:
בסיס נתונים.Northwind:
הצגת שמות כל הלקוחות מטבלת customersליד כל לקוח שיש לו הזמנה נציין את מספרה (יכול להיות לקוח
שרשום במאגר אך ברגע זה אין לו הזמנה).
select c.customerid,o.orderid
from customers c left join orders o
on c.customerid=o.customerid
וכנ"ל בהרצת ,right joinשכן לא יכולה להיות הזמנה שאינה משויכת ללקוח.
select c.customerid,o.orderid
from customers c right join orders o
on c.customerid=o.customerid
התוצאה:
)830row(s) affected
Cross join
זהו Joinאשר מציג תוצאות של כל הצירופים האפשריים בין השורות של שתי הטבלאות.כלומר כל רשומה
מהטבלה הראשונה תהיה משולבת עם כל רשומה מהטבלה השנייה.
דוגמה:
בסיס נתונים Northwind
נסיון להציג את העובדים עם הטריטוריה שלהם .התוצאה שהתקבלה ,כל עובד מטבלת Employeesמשולב
עם כל טריטוריה מטבלת .EmployeesTerritories
* SELECT
FROM EmployeeTerritories cross join employees
התוצאה תהיה:
אם יש 9עובדים ו 49 -טריטוריות המכפלה שלהם תציג את השליפה הבאה.
)441row(s) affected
לעיתים קיים צורך לבצע צירוף של רשימות מטבלה לרשימות מאותה טבלה -מהלך הנקרא reflexive join
או .self join
Self Joinהוא Joinמיוחד מעט מבחינה לוגית ,אבל מבחינת סינטקס הוא מבוסס על מה שנלמד עד כה.
שפת SQLמאפשרת לפנות מספר פעמים אל אותה הטבלה במשפט selectכאילו הפניה נעשתה למספר
טבלאות שונות .היכולת להתיחס אל הטבלאות כאל שונות היא ע"י מתן aliasesשונים במשפט הfrom -
לטבלה עליה מתבצעת פעולת ה( self join -מעבר לכך פעולת הכתיבה רגילה).
לדוגמה :נניח כי היתה לנו טבלת עובדים אשר עבור כל עובד בין שאר הנתונים היה נשמר עבורו שמו ,מספר
העובד שלו ומספר העובד של המנהל שלו ,אילו היינו רוצים להדפיס את שמות העובדים ושמות מנהליהם היינו
צריכים לפנות פעמיים לאותה טבלה פעם אחת עבור לקיחת שמות העובדים ופעם שניה עבור לקיחת שמות
המנהלים שהם כמובן גם כן עובדים ולכן יופיעו באותה הטבלה -במקרה מסוג זה היינו משתמשים בself -
.join
שים לב ,שעובדים שלא מדווחים לאף אחד -לא התקבלו ,כדי להציגם יש להשתמש ב .Outer join
זהו סינטקס אשר היה מקובל לשימוש לפני גירסת .ANSI SQL 92הרעיון כמו ב , JOIN -לייבא מידע
ממספר טבלאות אך במקום השימוש במילה JOINנשתמש בפסיק כדי להפריד בין הטבלאות ,ובמקום
המילה ONנציין את הקשר בין הטבלאות באמצעות המילה .WHERE
דוגמה :
בסיס נתונים.Northwind:
הצגת שמות המוצרים מטבלת ,productsכאשר עבור כל מוצר מצוין שם הקטגוריה שלו ושם החברה
המספקת את המוצר .
לדוגמה :פונקצית - Maxפ ונקציה המקבלת מספר ערכים מרשומות שונות ומחזירה את הערך המקסימלי
שביניהן.
פונקציות מספריות:
- Avgמחזירה את ממוצע כל הערכים בקבוצה שהם לא .NULL
- Sumסוכמת את מספר הפריטים בקבוצה.
דוגמה:
בסיס נתונים.Northwind:
הצגת ממוצע המחירים של המוצרים בטבלת .products
)SELECT avg(UnitPrice
FROM Products
דוגמה:
בסיס נתונים.Northwind:
הצגת מספר העובדים שגרים בעיר .London
)*(SELECT count
FROM Employees
'WHERE city='London
דוגמה:
בסיס נתונים.Northwind:
הצגת מספר הלקוחות שביצעו הזמנה (אותו לקוח שביצע מספר הזמנות יספר פעם אחת בלבד).
שים לב כי Group Functionמתעלמות מערכי Nullכך שעלולות להתקבל תוצאות לא מדויקות אם לא נטפל
במקרים אלו ,לדוגמה בחישוב ממוצע.
כאשר משתמשים ב Group Function -ניתן לחלק את קבוצת הרשומות שעליה מבוצעת הפונקציה למספר
תתי קבוצות ,כך שהפונקציה תופעל על כל תת קבוצה בנפרד.
ההפרדה לתתי קבוצות מתבצעת ע"י הוספת משפט ה GROUP BYלמשפט ה SELECT -בתוספת ציון
העמודה על פיה תתבצע החלוקה לתתי הקבוצות.
דוגמה:
בסיס נתונים.Northwind:
הצגת שמות הערים ומספר העובדים שגרים בכל אחת מהן על פי הנתונים שבטבלת .Employees
( ) 5 row(s) affected
*ניתן להגדיר תת קבוצה לתת קבוצה ע"י סימון פסיק לאחר שם העמודה וציון שם עמודה נוספת ,שתהווה
בסיס למיון המשני.
שים לב:
.1כל עמודה אשר מופיעה במשפט ה SELECTולא מופעלת עליה פונקציה קבוצתית ,חייבת להופיע
במשפט ה .GROUP BY
.2ב SQL Server -אסור לבצע קינון של ( group functionאך קיימות סביבות אחרות המאפשרות
זאת) .לדוגמה:
SELECT max(avg(unitprice))...
לא ניתן להפעיל תנאי במשפט ה WHEREעל ערך המוחזר כתוצאה מ( Group Function -סדר ביצוע
הפעולות בפועל שונה מסדר הכתיבה) ולכן ,כאשר רוצים לבצע התניה על הערך שמחזירה הפונקציה
הקבוצתית יש לציין את התנאי במשפט ה .HAVING
דוגמה:
בסיס הנתונים NorthWind
הצגת שמות הערים שגרים בהן לפחות שני עובדים +ציון מספר העובדים ע"פ הנתונים מטבלת .Employees
דוגמה מסכמת:
הצגת ה id -של כל הלקוחות שביצעו יותר מ 5 -הזמנות משנת 1998ואילך +ציון מספר ההזמנות .הנתונים
המוחזרים יוצגו במיון אלפא-ביתי.
"SELECT customerid,count(*) as "num of order
FROM orders
'WHERE OrderDate>='01/01/1998
GROUP BY CustomerID
HAVING count(*)>=5
ORDER BY customerid
התוצאה המתקבלת מהרצת הקוד:
customerid num of orders
------------- ---------
BERGS 5
BONAP 6
BOTTM 8
ERNSH 9
FOLKO 9
:
:
REGGC 5
SAVEA 11
SUPRD 6
בשל סדר ביצועי פעולות המערכת לפקודת , Selectלא ניתן להפעיל תנאים על פונקציות קבוצה בשורת
, whereמכיוון שהמערכת מבצעת ראשית צמצום רשומות באמצעות שורה זאת ,ורק לאחר מכן מקבצת את
הנתונים לקבוצות משותפות .לכן שורת Havingהכרחית כאשר מעוניינים להוסיף תנאים על פונקציות קבוצה.
. מספר הרחבות אשר מאפשרות ליצור סיכומי ביניים בנוסף לחישובים של פונקציות הקבוצהGROUP BY-ל
GROUPING SETS
ROLLUP
CUBE
.Group by מאפשר ליצור סיכומי ביניים עפ"י קבוצות שונות בשורתGrouping set אופרטור
:מבנה הפקודה
Group by -פקודה הבאה מציגה את מס' הזמנות שביצע כל עובד לכל לקוח באמצעות שימוש בפקודת ה
שאילתות2 נאלצנו לכתוב, וכדי להציג מס' הזמנות לכל עובד בנפרד ממס' הזמנות לכל לקוח,הסטנדר טית
.נפרדות
SELECT EmployeeID,customerid, count(*)
FROM orders
WHERE customerid like 'b%'
GROUP BY EmployeeID,customerid
ORDER BY employeeid
תחשב את הסיכוםGroup by - ניתן לקבוע עפ"י איזה קבוצות שורת הGroupin set באמצעות פקודת
.הכולל
SELECT EmployeeID,customerid,year(orderdate), count(*)
FROM orders
WHERE customerid like 'b%'
GROUP BY GROUPING SETS (EmployeeID,customerid,year(orderdate))
ORDER BY employeeid
כמו פקודת ה ,Grouping sets-גם פקודות ה Rollup & cube -מאפשרות ליצור סיכומי ביניים לקבוצות
מרובות בשילוב עם פונקציות קבוצה .בשונה מ Grouping sets -אין צורך בפקודות אלה לקבוע את סדר
הקבוצות.
– Rollupיוצר קבוצות של סיכומי ביניים עפ"י סדר הנחת העמודות בשורת ה.Group by -
מבנה הפקודה:
>)SELECT <column(s) with aggregate(s
)FROM table(s
)…GROUP BY ROLLUP (column1, column2,column3,
בדוגמה הבאה בנוסף למספר מוצרים המסופקים ע"י ספק בכל קטגוריה ,תופיע שורת מספר כולל של מוצרים
לכל קטגוריה.
.Group by – Cubeיוצרת שורת סיכומי ביניים לכל שילוב של קבוצות המוגדרות בשורת ה-
מבנה הפקודה:
>)SELECT <column(s) with aggregate(s
)FROM table(s
)…GROUP BY cube (column1, column2,column3,
בדוגמה הבאה בנוסף למספר מוצרים המסופקים ע"י ספק בכל קטגוריה ,תופיע שורת מספר כולל של מוצרים
לכל קטגוריה ושורת מספר כולל של מוצרים לכל ספק ומספר המוצרים הכללי בכל הטבלה.
בנוסף ,כאשר נרצה לשלוף נתונים אליהם נבצע השוואה כלשהי ,אך יש צורך קודם למצוא את אותו הערך אליו
נרצה לבצע את ההשוואה.
לדוגמה :מציאת כל המוצרים אשר מחירם גדול ממחירו של המוצר ’ ,‘Chaiקודם עלינו למצוא מה הוא מחירו
של המוצר ' 'Chaiורק אחר כך לבצע את ההשוואה.
השאילתה הראשית תקרא Main Queryכאשר תתי השאילתות יקראו .Sub - Query
ניתן לכתוב מספר תתי שאילתות עבור שאילתה ראשית אחת.
ניתן לשלב תת שאילתה אחרי Having ,Where :ו.From-
התת שאילתה תמיד מורצת לפני השאילתה הראשית.
תת שאילתה תיכתב בסוגריים.
תת שאילתה תופיע בצד הימני של אופרטור ההשוואה.
אין להשתמש במשפט order byבתת שאילתה .
תת השאילתה תחזיר עמודה אחת אליה תבוצע ההשוואה (בבסיסי נתונים שונים מ SQL Server -קיימת
אפשרות שהתת שאילתה תחזיר יותר מעמודה אחת).
תת השאילתא תחזיר ערך מאותו ה DATA TYPEשל העמודה אליה היא מושוות בשאילתא החיצונית.
תת השאילתה חייבת להחזיר מספר ערכים בהתאם לאופרטור אליו היא מושוות בשאילתה החיצונית.
תת שאילתה המחזירה ערך בודד .האופרטורים לשאילתא מסוג זה הינם>= ,> ,<= ,< ,>< ,= :
דוגמה ל:single row subquery -
בסיס נתונים.Northwind:
הצגת המחירים ושמות המוצר בעלי עלות גבוהה מזו של מוצר מספר 2מטבלת products
שאילתה המחזירה יותר מערך בודד .האופרטורים לשאילתא מסוג זה הינםALL ,ANY ,NOT IN ,IN :
- INנשתמש בו כאשר נרצה לבצע השוואה מול אחד מהערכים שחזרו מתת השאילתה (ההתנהגות זהה
להתנהגות אופרטור INבתת משפט .)where
- Allנשתמש בו כאשר נרצה שהערך הנבדק יושווה ויקיים את התנאי מול ערכי המינימום והמקסימום שיחזרו
מתת השאילתה.
- <ALLגדול מערך מקסימלי שמחזירה תת השאילתא.
- > ALLקטן מהערך המינימלי שמחזירה תת השאילתא.
- Anyנשתמש בו כאשר נרצה שהערך הנבדק יושווה ויקיים את התנאי מול ערכי המינימום והמקסימום שיחזרו
מתת השאילתה.
- <ANYגדול מהערך המינימלי שמחזירה תת השאילתא.
- >ANYקטן מהערך המקסימלי שמחזירה תת השאילתי.
SELECT ProductID,ProductName
FROM products
WHERE ProductID IN(SELECT ProductID
]FROM [order details
GROUP BY ProductID
)HAVING sum(Quantity )>1200
ProductID ProductName
---------------------------------------- -----------
59 Raclette Courdavault
56 Gnocchi di nonna Alice
60 Camembert Pierrot
31 Gorgonzola Telino
30.00
23.25
45.60
53.00
10.00
שים לב!
EXISTS
אופרטור EXISTSבודק האם ערך מופיע ברשימת הערכים החוזרת מתת-שאילתה או לא.
אם הערך קיים ,אופרטור EXISTSמחזיר TRUEמבלי להמשיך ולבדוק את שאר הערכים ,ואם הערך אינו
קיים -מחזיר ( .FALSEאופרטור NOT EXISTSמבצע את הפעולה ההפוכה)
מבנה השאילתה:
טבלת עובדים
טבלת לקוחות
UNION
עובדים לקוחות
כאשר נשתמש ב UNIONכשילוב בין שתי השאילתות הבאות ,נקבל את השילוב הייחודי של
הערכים של שתיהן
ראש העין
תל אביב
רמת גן
חיפה
ירושלים
UNION ALL
עובדים לקוחות
כאשר נשתמש ב UNION ALLכשילוב בין שתי השאילתות הבאות נקבל את כל התוצאות מכל השורות של
שתיהן.
ראש העין
תל אביב
רמת גן
רמת גן
חיפה
ירושלים
תל אביב
חיפה
INTERSECT
עובדים לקוחות
כאשר נשתמש ב INTERSECTכשילוב בין שתי השאילתות הבאות נקבל את כל התוצאות אשר משותפות
לשתיהן.
תל אביב
EXCEPT
לקוחות עובדים
כאשר נשתמש ב EXCEPTבין תוצאות שתי השאילתות נקבל את הערכים אשר מופיעים בשאילתה
הראשונה אך לא בשניה
בדוגמאות הבאות נמחיש את נחיצות פונקציות החלון וכיצד ניתן להשתמש בהן בצורה בסיסית.
נתחיל בדוגמא הבאה :הפקודה הבאה מציגה את מס' וסכום הכולל של המוצרים לקטגוריות אולם אינה
מציגה את הנתונים בכל קבוצה.
CAT_COUNT CAT_SUM
------------------ --------------
25 603.83
כדי להציג מס' רשומות בכל קבוצת קטגוריה נאלצנו להשתמש בשורת Group byאשר קיבצה את הקטגוריות
לקבוצות משותפות ורק לאחר מכן התאפשר להוסיף את פונקציות הקבוצה.
החיסרון – לא ניתן לראות את פירוט הנתונים בכל קבוצה (הרי הנתונים מקובצים)
PARTITION -שימוש ב
:בדוגמא הבאה נגדיר לפונקצית הקבוצה תתי קבוצות
:דוגמה
:תוצאת השליפה
, משמשת ליצירת רצף של מספרים מבוסס על קבוצה עפ"י סדר המיון שלהםROW_NUMBER פונקציית
.כלומר מחזיר את המספר הסידרתי של כל רשומה בקבוצת המיון
:דוגמה
:תוצאת השליפה
1997 45.60 1
1997 18.00 2
1997 12.00 3
1997 43.90 4
1998 55.00 1
1998 13.00 2
1998 25.00 3
:בדוגמה הבאה אנו מעוניינים להציג את דירוג של מחיר המוצר ביחס לכל טבלת המוצרים עפ"י מיון בסדר יורד
ֹDENSE_RANK
הדירוגים שלהRANK- אך בניגוד ל,RANK עובדת בדיוק כמו הפונקציהDENSE_RANK הפונקציה
.עוקבים
. עם חריגה של איבר אחד לכל היותר, מחלקת את המידע לקבוצות שוות בגדלםNTILE הפונקציה
באמצעותן ניתן לקבל גישה בשורה הנוכחית לשדות אשר,פונקציות אלה נחשבות לחלק מפונקציות החלון
.קיימות בשורות הבאות והקודמות
נדגים את פונקציות אלה באמצעות השאילתה הבאה
SELECT productID,
ProductName ,
unitPrice ,
LAG(unitPrice, 1) OVER (ORDER BY unitPrice) as lag,
LEAD(unitPrice,1) OVER (ORDER BY unitPrice) as lead
FROM products
WHERE categoryID = 1
;ORDER BY unitPrice
בפונקצית Lagאשר מתייחסת לערכים הקודמים אנו מגדירים את הפרמטרים הבאים :
בפונקצית Leadאשר מתייחסת לערכים הבאים אנו מגדירים את הפרמטרים הבאים :
לסיכום:
פונקציות חלון מאפשרות להסתכל על רשומה בודדת כחלק מקבוצה לוגית של נתונים •
SELECT p.ProductName,
c.CategoryName,
p.UnitPrice
FROM Products p JOIN Categories c ON
c.CategoryID = p.CategoryID
WHERE p.UnitPrice > 10.0
אנו נותנים לכל אחד,בחלק זה אנו מגדירים את התכנים (עמודות וטבלאות) אשר ישמשו אותנו בחלק הבא
.מתכנים אלו כינויים לפי הבחירה שלנו
AS
(
SELECT
p.ProductName,
c.CategoryName,
p.UnitPrice
FROM Products p JOIN Categories c ON
c.CategoryID = p.CategoryID
WHERE p.UnitPrice > 10.0
)
בחלק זה אנו בונים את השאילתה עצמה ,שימו לב כי סדר הכינויים אשר הוגדרו בשלב א' חייב לתאום לסדר
העמודות בחלק ב' -שאילתת המקור.
באמצעות שלב זה אנו משלבים את חלק א' (יצירת הכינויים) וחלק ב' (שאילתת המקור) יחד ויוצרים שאילתה
אשר תהיה יותר ברורה ופשוטה לתחזוק.
דוגמה נוספת ליצירת שאילתת CTEוהפעם מתן כינויים לעמודות בחלק של שאילתת המקור < CTE
:>definition
WITH CTE_year
AS
(SELECT YEAR(orderdate) AS orderyear, customerid
) FROM orders
SELECT orderyear, count(DISTINCT customerid) AS cust_count
FROM CTE_year
;GROUP BY orderyear
PIVOT
ניתן להפוך מידע טבלאי רגיל המגיע כתוצאה משאילתות מסויימות למידע המופיעPivot באמצעות פקודת ה
.כטבלת ציר
.1חלק ראשון -מגדיר את התצוגה הרצויה כאשר העמודה הראשונה מייצגת את ציר ה Yושאר העמודות
מייצגות את ציר ה X
.2חלק שני -מ גדיר את את השאילתה אותה אנו רוצים להמיר לטבלת ציר (ממנה אנו למעשה שואבים
את הנתונים)
לשם כך ניצור את הטבלה הבאה המתארת את כמות הזמנות שביצע כל עובד בכל שנה .המידע של השנים
מוצג כעמודות.
פקודה זו מוסיפה שורה חדשה לבסיס הנתונים .הפקודה מכילה את שם הטבלה אליה יש להוסיף את השורה
החדשה ואת הערכים שעל השורה החדשה להכיל.
מבנה הפקודה:
שם טבלה INSERT INTO
)רשימת ערכים מופרדת ע"י פסיקים( VALUES
*הערכים חייבים להופיע לפי סדר הגדרתם בטבלה.
דוגמה:
בסיס נתונים.Northwind:
הוספת רשומה לטבלת .Order Details
דרך נוספת המאפשרת לא להכניס את כל נתוני הטבלה ,או לא לפי סדר הופעתם הינה ע"י ציון שמות העמודות
ע"פ המבנה הבא:
דוגמה:
בסיס נתונים.Northwind:
הוספת רשומה לטבלת .Order Details
ניתן לבצע הוספה של רשומות מטבלה אחת לטבלה שניה על ידי שימוש בשאילתא השולפת עמודות ורשומות
מסויימות (או את כולן) מהטבלה ממנה נרצה להעתיק את הרושמות .נבצע זאת ע"פ המבנה הבא:
דוגמה:
INSERT INTO A
SELECT * from B
…WHERE
דוגמה:
בסיס נתונים.Northwind:
הכנסת כל ההזמנות שבוצעו בשנת 1996לטבלה חדשה בשם .orders_96
(שים לב שהטבלה לא קיימת כרגע בבסיס הנתונים ,ועל כן על מנת להריץ את השאילתה יש ליצור אותה).
כאשר מזינים ערכים לטבלה ולא יודעים מהו הערך הרצוי עבור עמודה מסוימת או שהערך עדין לא קיים,
אפשר להזין לעמודה ( NULLאם העמודה מאפשרת הזנת ערכי .)NULL
כיוון שערך NULLהוא לא תמיד ערך רצוי ,פתרון טוב יותר הוא לספק ערך ברירת מחדל עבור העמודה (שים
לב כי בהמשך ערך ברירת המחדל נקבע בהגדרת מבנה הטבלה).
דוגמה:
בסיס נתונים.Northwind:
דוגמה זו מוסיפה שורה חדשה לטבלת .order details
ומגדירה OrderIDמספר 10248:ו ProductID-מספר .12
העמודות UnitPrice, Quantity, Discountמאפשרות ערכי NULLאו ברירת מחדל ולכן לא מקבלות ערך
ספציפי.
כאשר מבצעים שאילתה הפונה לטבלה המכילה מספור אוטומטי הערך אשר ניתן ע"י המערכת עבור הרשומה
שצורפה נשמר בתוך משתנה גלובלי ששמו @@IDENTITYהמאותחל כל ( SESSIONחיבור ל )DBולכן
לאחר הרצת משפט INSERTלטבלה המכילה מספור אוטומטי (עמודת ,)Identityניתן לפנות למשתנה
ולראות את הערך שבתוכו.
משום שהערך עבור עמודה זו מחולל בצורה אוטומטית ,לא ניתן להזין את הערך ידנית.
דוגמה:
בסיס נתונים.Northwind:
דוגמה זו מוסיפה מוביל חדש בשם Kangarooלטבלת .Shippers
העדכון מתבצע ללא שימוש ברשימת עמודות.
שים לב כי העמודה ShipperIDהיא בעלת התכונה ( IDENTITYמספור אוטומטי) ועל כן אינה מופיעה
ברשימת העמודות וזאת כיוון שהמערכת מזינה ערך לעמודה זו באופן עצמאי .העמודה Phoneמאפשרת
ערכי NULLולכן השתמשנו בערך זה.
הפקודה updateמאפשרת עדכון של ערכים ברשומה בודדת או עדכון בו-זמני של מספר רשומות המקיימות
תנאי לוגי כלשהו.
ניתן לעדכן בו זמנית מספר עמודות ע"י פסיק וצרוף צמדים נוספים של שם העמודה +ערך תחת אותו משפט
.SET
נהוג לצרף תנאי במשפט WHEREשכן אחרת כל הרשומות בטבלה מעודכנות.
דוגמה:
בסיס הנתוניםNorthwind :
הדוגמה הבאה מכפילה את ערך העמודה UnitPriceשל כל השורות בטבלה .Order Details
מבנה הפקודה:
שם טבלה ]DELETE [FROM
דוגמה:
בסיס הנתוניםNorthwind :
הדוגמה הבאה מוחקת את כל הרשומות מטבלת [.]Order Details
]DELETE FROM [Order Details
דוגמה:
בסיס הנתוניםNorthwind :
הדוגמה הבאה מוחקת את הרשומות מטבלת [ ]Order Detailsאשר שדה ה Quantity -שלהם קטן מ .5 -
ביצוע Truncateלטבלה
פעולת Truncateהינה פעולה המנקה את הטבלה מתוכנה ומחזירה אותה למצב ההתחלתי לפני הזנת נתונים
כלשהם בתוכה (מספורים אוטומטים מתאפסים).
הפעולה משחררת את הזיכרון שהוקצה עבור הנתונים.
היא מהירה יותר מפקודת deleteולא ניתן להפעילה על חלק מהרשומות אלא תמיד על כולן יחד.
מבנה הפקודה:
שם טבלה Truncate table
דוגמה:
Truncate table authors
טרנזקציה היא יחידה לוגית הכוללת פקודת DMLאחת או יותר ונסגרת בהצלחה או בכשלון.
ב SQL SERVERכברירת מחדל ,כל פקודת DMLהיא טרנזקציה בפני עצמה – כלומר הטרנזקציה נפתחת
באופן אוטומטי ונסגרת בסיום אותה פקודה.
ניתן לפתוח טרנזקציה בצורה מפורשת על ידי BEGIN TRANSACTIONולסגור טרנזקציה בכשלון על ידי
ROLLBACKאו בהצלחה על ידי .COMMIT
לדוגמא:
אובייקטים הם מבנים במערכת בעלי תכונות משותפות אשר נשמרים ב DATA BASEתחת שם ייחודי
המורכב מ – שם_אובייקט.שם_סכמה.שם_. DB
סכמה היא namespaceב data baseאשר מכיל אובייקטים בעלי הקשר ביניהם (קשר מקצועי כלשהו.
לדוגמא ,כל האובייקטים תחת נושא מכירות ישוייכו לסכמה שתקרא ,SALESכל האובייקטים תחת נושא כוח
אדם ישוייכו לסכמה שתקרא
HUMAN RESOURCEוכו')...
סכמת ברירת המחדל ב SQL SERVERנקראת ,DBOיצירת כל אובייקט ללא ציון שם הסכמה ישוייך בצורה
אוטומטית לסכמת ה .DBO
ניתן להגדיר עבור כל משתמש מהי סכמת ברירת המחדל שלו ,כך שבגישה לכל אובייקט (ללא ציון שם
האובייקט המלא) באותו היוזר תתבצע קודם לאותה סכמה ברירת המחדל אליו המשתמש שייך ובמידה
והאובייקט לא יימצא באותה הסכמה ,יבוצע חיפוש בצורה אוטומטית בסכמת ה .DBO
CREATE TABLE
פקודות DDLלאובייקט מסוג טבלה:
יצירת טבלה
שם טבלה Create table
(
]Column_name data_type [DEFAULT] [IDENTITY] [CONSTRAINT
][,column_name….
)
בדוגמה זו הגדרנו טבלה המכילה 5עמודות כאשר המגבלה היחידה אשר חלה עליהן היא סוג הנתונים אשר
יוזנו באותה העמודה .ניתן להגדיר מגבלות (או אילוצים) נוספים על אותן העמודות ,על כך נדון בהמשך.
* ניתן ליצור טבלה מבוססת על נתוני טבלה אחרת על ידי המבנה הפקודה הבא:
SELECT */column_name
INTO new_table_name
FROM table_name
][WHERE condition
מבנה:
Column_name data_type )ערך ברירת המחדל ( default
*שימו לב כמובן כי הערך שהוכנס כברירת מחדל מתאים ל datatype -שהוגדר עבור העמודה.
הגדרת שדה מספור אוטומטיIdentity -
שדה מספור אוטומטי הינו שדה אשר המערכת יוצרת עבורו מספרים ברצף כאשר מופע כל מספר הוא חד
ערכי.
שדה אוטומטי נקרא Identityוהוא מקבל שני פרמטרים:
-Seedהערך ההתחלתי של המספור
-Incrementהערך שיוסף בכל פעם למספר האחרון שנוצר.
מבנה המספור:
( IDENTITY ( seed , increment
דוגמאות:
הוספת עמודה לטבלה:
)ALTER TABLE customers ADD phone nvarchar(10
DROP TABLE
מחיקת טבלה -
שם טבלה Drop table
*שים לב שלא מדובר במחיקת הרשומות בטבלה אלא במחיקת כל הטבלה כולל הגדרת המבנה שלה.
כפי שכבר ציינו ,על מנת שבסיס הנתונים יהיה יציב ויכיל מידע חוקי יש בין השאר להכיל חוקים על עמודות
אשר יכפו על המערכת לקיימם.
- Constraintsקבוצת החוקים אשר ניתן להכיל על העמודות השונות והם:
רמת טבלה – לאחר הגדרת כל העמודות בטבלה מגדירים את האילוצים ומגדירים את העמודה עליה
חל האילוץ.
נשתמש ביצירת אילוץ ברמה זו במקרים הבאים:
oכאשר נרצה להוסיף אילוץ על עמודה אשר מוגדר עליה אילוץ (משום שלא ניתן לבצע ברמת
עמודה יותר מאילוץ אחד לכל עמודה).
oכאשר האילוץ חל על שילוב עמודות.
oכאשר יש צורך בהגדרת תנאי המבצע בדיקה של ערכים בעמודה אחת אל מול ערכים בעמודה
שניה.
מבנה:
! ניתן לציין ערכי DEFAULTאו הגדרת עמודה כ ( NULLכלומר ניתן להזין ערכי )NULL
Check
תנאי אשר מוסיפים על עמודה .תוצאת התנאי חייבת להיות ,trueעל מנת שהערך המוכנס יתקבל בשדה.
כל תנאי המוגדר בשאילת selectלאחר משפט ה where -יכול להופיע כ.check-
כפי שניתן לראות כעת ניתן להכניס לשדה discountערכים ביו 0ל 1-בלבד.
Unique
עמודה או מספר עמודות אשר שילובן מהווה ערך חד ערכי ,אך העמודה או שילוב העמודות המגדירות אותו
יכולות להכיל את הערך ,NULLמטרת השימוש ב unique -ליצור מפתחות קבילים נוספים שהם אינם
המפתחות הראשיים ,שוב עבור שלמות הנתונים ושיפור ביצועיים.
שילוב העמודות orderidו productid -מהווה מפתח ,שכן באותו מספר הזמנה שמייחדת הזמנת לקוח מסוים,
לא יכולות להיות שתי רשומות עבור אותו מוצר .אם הוזמן אותו מוצר שוב ,שדה הכמות אמור להתעדכן.
הגדרת האילוץ הנ"ל יתבצע ברמה של טבלה בלבד.
השדה המופיע בסוגריים הוא המפתח הזר אשר מצביע ( )REFERENCESלטבלת .Products
: מבנה הפקודה המלא.ALTER TABLE ניתן להוסיף אילוצים לטבלה קיימת על ידי שימוש ב
חייבת להיות ברמת שורה לכן יש לבצע שינוי של העמודהNOT NULL ! הוספת אילוץ
. NOT NULL כולה והגדרת האילוץ
בכל פעם שהמשתמש פונה ל – ,VIEWהוא מריץ מחדש מול בסיס הנתונים.
חשוב לציין כי עבור המשתמש המפעיל שאילתות ה VIEW -הוא טבלה לכל דבר.
יצירת VIEW
])…CREATE VIEW view_name [(alias,
AS
שאילתה
][WITH CHECK OPTION
דוגמה:
בסיס נתונים.Northwind:
יצירת VIEWהמציג את פרטי העובדים שיש להם איזור מוגדר()REGION
CREATE VIEW emp_det_vw
AS
SELECT employeeID, lastname, firstname, birthdate
FROM employees
WHERE Region IS NOT NULL
הפעלת פקודות DMLעל VIEWכמו עדכון ,הוספה ומחיקה אפשריות אך ורק במידה ו:
ניתנה למשתמש הרשאה לכך.
ה VIEWמורכב מנתונים של טבלה אחת בלבד.
קיימים בתצפית כל השדות המחויבים בהכנסת ערך (השדות שמוגדרים כ )not Null-או שהוגדר
בטבלה המקורית ערך ברירת מחדל עבורם.
לא קיימת המילה .DISTINCT
לא קיים משפט ה .GROUP BY
שינוי VIEW
])…ALTER VIEW view_name [(alias,
AS
שאילתה
VIEWעם CHECK OPTION
הוספה של משפט ה With Check Optionsלא יאפשר פעולות DMLהמפרות את תנאי ה WHERE -של
השאילתא שהגדירה את ה .VIEW -
דוגמה
יצירת VIEWשל מוצרים העולים פחות מ 20 -דולר.
CREATE VIEW LOW_PRICED_PRODUCTS
AS
* SELECT
FROM Products
WHERE UnitPrice < 20
WITH CHECK OPTION
היות וה view -הוגדר with check optionאפשר לבצע כל DMLפרט ובתנאי שלא מפרים את תנאי המחיר
כלומר:
א .לא ניתן להכניס מוצר חדש שמחירו מעל 20דולר
ב .לא ניתן לעדכן מחיר של מוצר קיים ליותר מ 20דולר
בפרק זה נעסוק בפקודות הבסיסיות של T-SQLעמן נעבוד ונעזר בהמשך הדרך באובייקטים נוספים אשר
יילמדו בהמשך:
oמושגי יסוד
oהגדרת משתנים מקומיים
oהשמת ערך למשתנה מקומי (אתחול משתנה)
oהשמת ערך למשתנה מתוך משפט SELECT
oהדפסת משתנה
oתנאים
CASE o
oלולאת WHILE
oלולאת GOTO
oטיפול בשגיאות
מושגי יסוד
– Batchאוסף פקודות הנשלחות לשרת לשם ביצוען יחדיו( .פקודות – DDLכל פקודה היא Batch
נפרד)
– GOמפריד בין Batchל ,Batchכאשר משתנים אשר יוגדרו יהיו רלוונטיים לאותו ה Batchבלבד.
[ ] – למילים שמורות או רווחים בשמות טבלאות או עמודות.
@ -סימון למשתנה.
- #משתנה זמני לוקאלי.
- ##משתנה זמני גלובלי.
– Shift+F1שימוש ב , on line helpעזרה ספציפית.
מבנה:
שימוש ב SETובכך לאתחל את המשתנה( .אתחול כל משתנה מתבצע על ידי שימוש במשפט SET
בנפרד)
מבנה:
SET @local_variable = value
השמת ערך מתוך בסיס הנתונים על ידי שימוש במשפט .SELECTכאשר משתנים מקומיים מוגדרים
ב select list -משפט ה SELECT-חייב להחזיר שורה אחת בלבד.
SELECT @local_variable = column_name
]…[,@local_variable = column_name
FROM table_name
WHERE condition
)row(s) affected)1
SELECT @CustomerID
(1 row(s) affected)
(1 row(s) affected)
הדפסת משתנים
במידת, מקבלת ערכים מחרוזתיים בלבדPRINT( PRINT על ידי שימוש בMESSAGE בחוצץ
)CONVERT אוCAST הצורך יש לבצע המרה – שימוש ב
:מבנה
PRINT @local_variable
לאחר המילה IFיופיע תנאי אשר לאחר בדיקתו נקבל TRUEאו FALSEבלבד ,כאשר הקוד שמצוין לאחר
מכן יתבצע במידה ותוצאת התנאי תהא .TRUE
ניתן לצרף למשפט את המילה ELSEולציין לאחריה מה יבוצע אם תוצאת התנאי תהא .FALSE
במידה ונרצה לציין יותר מפקודה אחת יש להשתמש בבלוק.
השימוש בפסוק BEGINו END -חייב להתבצע כצמד ,האחד לא יכול לבוא ללא השני .משפט הBEGIN -
מופיע בשורה משלו ואח"כ קטע של משפטי .Transact-SQLלבסוף מופיע משפט ה END -בשורה משלו
המציין את סוף הבלוק.
השימוש בבלוק יתבצע בשימוש במשפטי תנאי IF -ולולאות – .WHILE
(Loser ;-
* היות ושפת Transact-SQLהיא הרחבה לשפת לשפת SQLניתן להשתמש בה בפונקציות ואופרטורים
המוכרים מ ,SQLלמשל EXISTSו.CASE -
EXISTSמאפשר לבחון אם תת השאילתה החזירה שורות כלשהן ומחזירה ערך TRUEאו .FALSE
מבנה:
EXISTS subquery
Returns TRUE if a subquery contains any rows.
דוגמה ל : EXISTS
בסיס הנתונים NorthWind
הדוגמה הבאה מוחקת לקוח מרשימת הלקוחות אך טרם ביצוע הפעולה בודקת האם קיימת לו הזמנה .
IF EXISTS (SELECT * FROM Orders
)'WHERE CustomerID = 'VINET
BEGIN
'PRINT 'The Customer has Order
END
ELSE
BEGIN
'DELETE Customers WHERE CustomerID = 'VINET
'PRINT 'Customer deleted
END
להזכירך CASE ,הוא ביטוי המספק אמצעי להחזרת נתונים שונים המבוסס על בדיקת הערך המוחזר.
ב SQL-קימות שתי ורסיות שונות של caseוהן:
DECLARE
@x INT,
)@Case_result VARCHAR(20
SET @x =1
= SET @Case_Result CASE @x
'!WHEN 1 THEN 'You are number one
'… WHEN 2 THEN 'Almost
ELSE 'Loser :-(' END
PRINT @Case_Result
@@ROWCOUNT
משתנה גלובלי אשר מחזיר את מספר הרשומות שהושפעו מפקודה מסויימת ( SELECTאו .)DML
מבנה הלולאה:
WHILE Boolean_expression
{sql_statement | }statement_block
דוגמה :
בסיס הנתונים NorthWind
דוגמה לשימוש בלולאת :While
הדוגמה הבאה מגדירה משתנה מונה בשם .@nהלולאה מתבצעת כל עוד המשתנה @nקטן או שווה למספר
הרשומות הקיימות בטבלת .Employeesבבלוק שבתוך הלולאה מתבצע חיפוש עובד ששמו Kingשהערך
EmployeeIDשווה למשתנה המקומי המקודם בתוך הלולאה.
ברגע שהעובד נמצא או שתנאי הלולאה מפסיק להתקיים מסתיימת פעולה הלולאה.
DECLARE @n INT
SET @n = 1
WHILE (SELECT COUNT(*) FROM Employees) >= @n
BEGIN
IF (SELECT LastName FROM Employees
'WHERE EmployeeID = @n) = 'King
BEGIN
))PRINT 'King EmployeeID =' + CAST(@n AS VARCHAR(2
BREAK
END
ELSE
SET @n = @n + 1
END
לולאת GOTOמאפשרת הרצה מחזורית של משפטי ה SQLכל עוד תנאי שהוגדר מתקיים.
אך בניגוד ללולאת ,WHILEהלולאה תתבצע פעם אחת לפחות והתנאי ייבדק רק לאחר הביצוע הראשון.
לולאה מסוג זה משמשת גם לביצוע פעולות אשר חוזרות על עצמן בקוד.
מבנה הלולאה:
Label:
Sql_statments | statement block
LABEL:
SELECT @name =lastname, @b_date = birthdate
FROM employees
WHERE employeeid = @emp_id
)PRINT @name + CAST(@b_date AS VARCHAR
SET @emp_id = @emp_id +1
שים לב המילה LABELאינה מילה שמורה .ניתן להשתמש בכל רצף אותיות אחר.
Try… Catch
דרך לטיפול בשגיאות ,כל המשפטים שיימצאו בתוך ה TRYייבדקו וברגע שתעלה שגיאה ,השגיאה תטופל
בתוך ה .CATCH
מבנה:
BEGIN TRY
Sql statements
END TRY
BEGIN CATCH
Sql statements
END CATCH
דגשים:
.1יש לציין את בלוק ה CATCHישר אחרי ה ( END TRYלא ניתן להכניס משפטי SELECTבאמצע).
.2יש לבצע שימוש בטרנזקציות – במידה ופקודה אחת נכשלת ,כל קודמותיה ייכשלו .אחרת ,חלק
מהפעולות מתבצעות ורק הפעולה עם השגיאה תטופל בהתאם ותכשל.
דרך נוספת לטיפול בשגיאות ,השגיאה עולה בצורה יזומה .ניתן לשלב את משפט ה -RAISERRORבבלוקים
של TRYו .CATCH
RAISERRORיוצא מהבלוק SQL SERVER ,לא ייבצע את שאר הפעולות בבלוק .ומציג הודעת שגיאה
בהתאם RAISERROR .לא סוגר טרנזקציה ולא מבצע !ROLLBACK
מבנה:
VARIABLEמשתנה אשר יכול להיות מחרוזתי ואז יכיל הודעה ,או מספרי ויכיל מספר שגיאה
מבנה:
EXEC sp_addmessage
@msgnum = value over 50000,
@severity = value between 1 and 25,
’@msgtext = ‘The message
* SELECT
FROM sys.messages
מחיקה של הודעה ידנית:
@@ERROR
הפרוצדורות מאפשרות שיתוף קוד עבור אפליקציות שונות .כל שינוי מתבצע פעם אחת ואין צורך לעדכן .1
כל אפליקציה בנפרד.
חוסך מה user -להכיר את מבנה ה ,database-הפעולות עבורו מבוצעות דרך הפרוצדורה. .2
משתמש יכול לקבל הרשאה להריץ פרוצדורה בעוד אין לו הרשאה לגשת לטבלאות ותצפיות בסיס .3
הנתונים.
פרוצדורות משפרות ביצועים. .4
פרוצדורות מורידות עומס מהרשת שכן במקום לשלוח מספר הוראות כל אחת בנפרד ולקבל משוב על כל .5
אחת מהן ,נשלחת בקשה אחת ותגובה אחת.
דוגמה:
בסיס הנתוניםNorthWind :
CREATE PROCEDURE getEmployees AS
Select * from employees
*שים לב כי הדוגמה היא פשוטה לצורך הכרת סינטקס הכתיבה ,אך כפי שצוין קודם הפרוצדורה יכולה להכיל
קוד מורכב יותר שאתה כבר מכיר ,ותוספות שנכיר בהמשך.
! יש לשים לב כי הרצת הקוד יוצרת את הפרוצדורה ולא מריצה אותה! כדי להריץ את הפרוצדורה נבצע
EXECUTEלפרוצדורה.
הרצת פרוצדורה
שם הפרוצדורה ]EXE[CUTE
דוגמה:
בסיס הנתוניםNorthWind :
הרצת הפרוצדורה :getEmployees
EXECUTE getEmployees
מחיקת פרוצדורה
שם הפרוצדורה DROP PROCEDURE
דוגמה:
בסיס הנתונים NorthWind
מחיקת הפרוצדורה getEmployees
DROP PROCEDURE getEmployees
דוגמה:
שילוב פרוצדורה ופקודת .INSERT
הדוגמה הבאה מכניסה את העובדים שהועסקו עד היום (לא כולל) לטבלת הלקוחות.
ובהרצת הקוד משלבת שאילתה נוספת המבצעת את הכנסת הנתונים לטבלה האחרת:
שינוי פרוצדורה
מבנה:
שם הפרוצדורה ALTER PROCEDURE
AS
קוד הפרוצדורה החדש
הרצת הפרוצדורה:
'EXEC ShippedByDate '12-01-96','12-31-96
:הפרוצדורה
CREATE PROCEDURE AddCustomer
(
@CustomerId nchar(5),
@CompanyName nvchar(40)
@ContactName nvarchar (30) =NULL,
@ContactTitle nvarchar (30) =NULL,
@Address nvarchar (60) =NULL,
@City nvarchar (15) =NULL,
@Region nvarchar (15)= NULL,
@PostalCode nvarchar (10)= NULL,
@Country nvarchar (15)= NULL,
@Phone nvarchar (24) =NULL,
@Fax nvarchar (24)= NULL
)
AS
INSERT INTO Customers
VALUES (@CustomerId, @CompanyName,@ ContactName,@ContactTitle,
@ Address,@ City,@ Region,@ PostalCode,@ Country,
@Phone,@ Fax)
הרצת הפרוצדורה
:'דרך א
:'דרך ב
.)ציון הפרמטרים אליהם מועברים הערכים ולא בהכרח כל הערכים (במידה ומוגדר להם ערך ברירת מחדל
EXEC AddCustomer
@CustomerId=’ALFAKI’,
@ContactName=’Maria Anders’,
@CompanyName=’Alfreds Futterkiste’,
@ContactTitle = ’Sales Representive’,
@Address= ’Obere Str .57’,
@City = ’Berlin’,
@Region = Null,
@PostalCode = 12209,
@Country = ’Germany’,
@Phone = ’030-0074321’,
@Fax = Null
הרצת הפרוצדורה:
מאחר והפרוצדורה מחזירה ערך ,חובה להגדיר משתנה אשר יקבל את הערך אותו מחזירה הפרוצדורה.
ניתן להדפיס את הערך החוזר על ידי שימוש ב SELECTאו .PRINT
הרצת הפרוצדורה:
הרצת הפרוצדורה מחייבת הגדרת משתנה שיקלוט את הערך המוחזר ,שוב הפניה אליו בעזרת משפט
.SELECT
SELECT @returnCode
)sp_help (T-SQL
פרוצדורת מערכת המספקת מידע עבור האובייקטים בבסיס הנתונים.
אם נרשום sp_helpבלבד נקבל את כל המידע שניתן לשאוב ע"י פרוצדורה זו.
EXEC sp_help
על מנת לקבל מידע ספציפי נשתמש בכתיבת הקוד:
דוגמה:
הגדרת המבנה
קביעה מי הן הישויות הפועלות ,אילו תכונות יש להם ומה הקשרים ביניהן.
בניתוח המערכת נהוג ליצור מספר מודלים טרם קבלת המוצר הסופי המודלים ,מתייחסים ל 3 -שלבים בתהליך
הניתוח של המערכת והם:
שלב העיצוב התפיסתי -שלב העוסק בעיצוב מבנה המידע ללא מגבלות ואילוצים הנובעים משימוש בחומרה
ותוכנה -שלב זה מייצג את כל הדרישות שבאו לידי ביטוי בניתוח דרישות המערכת.
שלב העיצוב הלוגי – שלב העוסק בתרגום המבנה התפיסתי שהתקבל למבנה של מערכת בסיסי נתונים
מסוימת .בשלב זה כבר מתיי חסים למגבלות ויכולות בסיס הנתונים שנבחר ,לדוגמה בסיס נתונים DB2של
Oracle Server ,IBMשל SQL ,Oracleו Access-של .Microsoft
שלב העיצוב הפיסי -שלב בו מבצעים תרגום של הסכימה שנוצרה בשלב הקודם למבנה פיזי -חלוקה לטבלאות
הגדרת אינדקסים וכד' .שים לב כי מבנה זה כבר לוקח בחשבון אילוצים ומוגדר בהתאם לכך.
אחד המודלים הנפוצים לשלב העיצוב התפיסתי הוא מודל ישויות הקשרים E-R -בו נדון בהרחבה.
מושגים במודל:
ישות
ישות היא אובייקט מוחשי או מופשט שיש עליו מידע והוא נתון להבחנה משאר האובייקטים .לישות יש קיום
במציאות והיא בעלת משמעות ועניין בהקשר מסוים.
לדוגמה :משה כהן בעל תעודת זהות 01234567הוא ישות ,כיוון שתיאור זה מזהה אדם אחד מסוים .באופן
דומה חשבון מספר 123456בסניף השרון בבנק הפועלים הוא ישות ,כי זהו תאור של חשבון אחד מסוים.
ישות יכולה להיות ממשית כמו אדם או ספר ,או מופשטת כמו חופשה או רעיון.
תכונות ()attributes
קבוצת ישויות מיוצגת באמצעות קבוצה של תכונות .לדוגמה ,תכונות אפשריות לקבוצת הישויות לקוח הן :שם,
שם משפחה ,תעודת זהות ,גיל ,רחוב עיר וטלפון.
תחום ()domain
לכל תכונה יש קבוצה של ערכים שהיא יכולה לקבל ,המכונה התחום של התכונה .למשל :תחום התכונה "שם"
יכול להיות קבוצת כל המחרוזות של אותיות באורך נתון ,תחום התכונה "גיל" יכול להיות כל המספרים הטבעיים
החיוביים באורך נתון.
התבוננות בקבוצות הישות השונות מראה שמתקיימים קשרים ביניהן.
הטיפול המלא בקשרים אלה הוא המבדיל בין בסיס נתונים לבין סתם אוסף של קבצים.
קשר ()relationship
קשר הוא יחס בין כמה ישויות .לדוגמה :אפשר להגדיר קשר בין הלקוח משה לחשבון 123456ולבטא בכך
את העובדה שהלקוח משה הוא בעל חשבון מספר .123456
מעלה של קשר
מספר הישויות המשתתפות בקשר.
כפי שכבר ציינו בין ישויות שונות יכולים להיות קשרים ,הקשרים מתחלקים למספר סוגים.
סוגי קשרים
One-To-One
קשר אחד לאחד מסומן .1:1ישות אחת מטיפוס Aקשורה לכל היותר לישות אחת מטיפוס .Bישות אחת
מטיפוס Bקשורה לכל היותר לישות אחת מטיפוס .A
)One-to-One (1:1
a
b
a
b
a
b
a
b
a
)One-To-Many (1:N
a
b
a
b
a
b
a
b
a
Many-To-One
קשר רבים לאחד מסומן N:1ישות אחת מטיפוס Aקשורה לכל היותר לישות אחת מטיפוס .Bישות אחת
מטיפוס Bקשורה למספר כלשהו של ישויות מטיפוס .A
)Many-To-One (N:1
a
b
a
b
a
b
a
b
a
קשר רבים לרבים מסומן .M:Nישות אחת מטיפוס Aקשורה למספר כלשהו של ישויות מטיפוס .Bישות אחת
מטיפוס Bקשורה למספר כלשהו של ישויות מטיפוס .A
Many-To-Many
a
b
a
b
a
b
b
a
social-security customer-street
balance
account-number
customer-
name customer-city
מפתחות
כפי שראינו -קבוצת ישות אחת יכולה להיות בעלת מספר בלתי מוגבל של מופעים ,ועל כן כדי להבדיל בין
הישויות השונות השייכות לאותה קבוצת ישויות יש להשתמש במפתח.
מפתח -קבוצת תכונות המאפיינת ומזהה באופן חד ערכי ישות מסוימת.
סוגי המפתחות המזהים הקיימים:
מפתח על -מפתח המכיל קבוצת תכונות שערכיה מייחדים ישות.
מפתח קביל -מפתח על ,שאף תת קבוצה שלו אינה מפתח על.
מפתח ראשי -מפתח קביל שנבחר ע"י מתכנן היישום.
בבואנו לבנות בסיס נתונים עלינו לתכנן אותו היטב ,על מנת שיכיל את כל המידע הנדרש ,שיהיה קל לשלוף
ממנו חתכי מידע שונים וכי לא תהיה בו כפילות נתונים ,שכן מצב מסוג זה יגרום לקושי רב בעדכון ,ואף עלול
לחשוף אותנו למצב בו תהיה בנתונים סתירה.
אנו נגדיר סדרת נתונים מדגמיים ותוך כדי ניתוחם נגיע למסקנה כיצד לעצב את הנתונים ואיך לבנות את בסיס
המידע.
להזכירך -אנו עובדים במודל נתונים יחסי -מודל המבוסס על טבלאות נתונים כשבין הטבלאות קיימים קשרים.
בתצוגה הטבלה ברורה ,היא מכילה פרטים על קורסים נלמדים ,ניתן לראות כי עבור כל קורס מופיע קוד
הקורס ,שמו ושם המרצה שמלמדו .מי הסטודנטים שלמדו או ילמדו אותו ומה הציון שקיבלו.
אם נשמור כך את הנתונים בבסיס הנתונים תתעוררנה כמובן בעיות שכן קיים קושי בזיהוי רשומה מסוימת,
לא קיים שום שילוב תכונות המייחד רשומה ומכאן שלא נוכל לשלוף רשומה ספציפית.
על כן נוכל כפתרון לצרף את הנתונים החסרים בתאים הריקים ,כך שקומבינציה כלשהי של עמודות תזהה
רשומה ,אך שים לב כי בעקבות כך לנתונים זהים יהיה מספר רב של מופעים ומכאן שיהיה בזבוז משאבים
וקושי לבצע עדכונים.
ועל כן נשתמש בפתרון חדש ,נשלים את הנתונים ונוודא שעבור כל רשומה אין סדרה של נתונים או קבוצות
נתונים שחוזרים על עצמם ,אלא נתון אחד בלבד ,לדוגמה :עבור פרופסור ישמר רק שדה ה id-ושדה השם
יושמט מהטבלה.
כעת ניתן לראות כי אפשר לזהות כל רשומה( ,כשהזיהוי מתבצע ע"י שילוב העמודות Course_id :ו-
)Student_nameולהוציא את עמודת Professor_idכמעט ולא קיימת חזרה על נתונים.
את המידע שהוסר נעדכן בטבלאות נוספות ,אך לפני כן נבחן את שדות הנתונים שיש לאחסן (Course_name
Professor_id ,ו )Student_id -ואת הקשר ביניהם ,במקרה זה נראה ,כי אין קשר ישיר בין השדות ועל כן
נאחסנם בטבלאות נפרדות( ,שכן למזהה הסטודנט אין קשר למזהה הפרופסור ושם הקורס מאפיין קורס ולא
ישות אדם).
ומכאן שניצור 3טבלאות נוספות ,המכילות את השדות הנוספים ואת השדה שמייצג אותם בטבלת פרטי קורס.
Course_id Course_name
10455 Consumer
Behavior
20144 DataBase
system
טבלת סטודנטים:Students-
Student_id Student_name
014 Eyal Levin
015 Hadas
Grossman
236 Hilla
Zimerman
015 Youval
Perlmoter
258 Eran Lefler
231 Nahama stiv
Professor_id Professor_name
025 Dani Levi
036 Liat
Barel
עבור כל אחת מהטבלאות נגדיר מפתח (מזהה) ראשי שהוא שדה ה id-בכל אחת מהטבלאות.
כפי שכבר ציינו ,למרות מאמצינו עדין קיימת בסכימה פרטי קורס חזרה על נתונים ,שכן עמודת Professor_id
חוזרת פעמים רבות על אותו מידע .ולדוגמה -אם יוחלף פרופסור לקורס ,מספר המופעים שנצטרך לעדכן יהיה
רב ,לכן כעת נבצע הפרדה נוספת בטבלה וניצור יחס (טבלה) חדש אשר יגדיר עבור כל קורס מיהו הפרופסור
שילמדו ובמקביל נסירו מהטבלה הראשונה.
Proffesor_id Course_id
025 10455
036 20144
ציינו כבר קודם ,כי השילוב Course_idו Student_id -מזהה רשומה .נוודא כי בחירת כל אחת מהעמודות
בנפרד לא מהווה שילוב ייחודי אשר יזהה את הרשומה .מאחר ובמקרה שלנו תנאי זה מתקיים אז זהו מפתח
קביל ואנו נבחרו לתפקד כמפתח ראשי עבור הטבלה.
בפתרון שהתקבל קיבלנו סה"כ 5טבלאות שונות אשר היוו טבלה אחת במקור.
למעשה הפתרון שהשתמשנו בו הוא הסרת הכפילויות .חיפשנו תלויות חלקיות -ז"א שדות התלויים בחלק
משדות המפתח ולא במפתח כולו ויצרנו עבורם טבלאות חדשות.
בטבלאות החדשות אחסנו את השדות שהוסרו מטבלת המקור ואת השדה או קומבינצית השדות שהיוו תלות
חלקית.
פעולה זו של חלוקת סכמה (טבלה) אחת גדולה למספר טבלאות קטנות נקראת נירמול ומטרתה ליצור אוסף
של סכמות (טבלאות קטנות) אשר יאפשרו לעדכן בקלות בסיס הנתונים ,לאכוף ולמנוע מצבים שאותו מידע
ישמר במקומות שונים ועם זאת לא לאבד מן המידע והתלויות שבו בתהליך הפירוק לטבלאות.
בין הטבלאות שקיבלנו יש להגדיר קשרים ,שכן בין הטבלאות אנו משלבים אותו מידע .לדוגמה :מספר מזהה
של פרופסור בטבלה המגדירה קשר בין פרופסור לקורס ,צריך להיות כזה המופיע בטבלת הפרופסורים.
מבוא למסדי נתונים בסביבת SQL Server עמוד 116
© כל הזכויות שמורות לג'ון ברייס מכללת הי-טק מקבוצת מטריקס
קשרים בין טבלאות המבוססים על שדה משותף מבטיחים כי הנתונים יהיו משותפים וכופים על המערכת קיום
של שלמות רפרנציאלית.
אילוצי תחום
כל שדה יקבל סוג Data typeובמידת הצורך גודל בבתים.
כל אחד מהשדות נוכל להגדיר כ - not null -מה שיחייב הזנת ערך בו בהוספת רשומה ומפתח כמובן יוגדר כ-
.not null
לסיכום:
מנגנון הנעילות נועד לאפשר למספר טרנזקציות להתבצע במקביל מבלי שפעילות שמתבצעת בטרנזקציה
אחת תגרום לתוצאות שגויות במסגרת טרנזקציה שניה.
המנגנון מבוסס על הגבלת היכולת של טרנזקציות לגשת לרשומות בהן נעשה שימוש בטרנזקציות אחרות.
כמובן שלהגבלת הגישה האמורה יש גם עלויות אותן נרצה למזער.
המטרה של הפרק הבא היא לתאר את הצורך במנגנון נעילות ,לתאר את מנגנון הנעילות ב SQL Server -
ובעיקר להקנות את הכלים שיאפשרו למפתח שליטה בהתנהגות הנעילות של השרת.
ראשי פרקים:
השיקולים הנוגדים שהשרת לוקח בחשבון הם מצד אחד ,מידת ההפרעה למשתמשים אחרים ב ( .DB -זו
תגדל ככל שרמת הנעילה תהיה כוללנית יותר -נעילה ברמת ה Data Page -או הטבלה).
מצד שני השרת לוקח בחשבון את עלות משאבי הזיכרון שיאלץ להשקיע בתחזוקת הנעילות( .זו הולכת וגדלה
ככל שרמת הנעילות גרעינית יותר -נעילה ברמת הרשומה).
העיקרון שמנחה את SQL Serverהוא הענקת עדיפות למינימום הפרעה למשתמשים ב Database -אי
לכך ,השרת מתחיל מנעילות גרעיניות ככל האפשר אך כאשר כמות הנעילות גדלה השרת מבצע החמרה
לנעילות כוללניות יותר .ההחמרה של הנעילות מתבצעת כאשר SQL Serverמשקיע יותר מ 40% -משאבי
הזיכרון שלו ניהול הנעילות כפי שמתואר בסעיף הבא.
Lock Escalation
כל נעילה תופסת לפחות :96 bytes
Lock Types
Shared
השרת עושה שימוש בנעילה זו עבור פעולות .select
מאפשרות קריאה של הרשומה ע"י משתמשים אחרים אך מונעות עדכון.
Exclusive
השרת עושה שימוש בנעילה זו עבור פעולות עדכון.
מונעת ממשתמשים אחרים גישה אל הרשומה.
Update
סוג נעילה שמהווה שלב מקדמי להפעלת נעילת .Exclusive
מופעלת ע"י השרת בשלב של חיפוש הרשומה אותה הוא מתעתד לעדכן או למחוק.
מאפשרת נעילות Shaerdלא מאפשרת נעילות Updateאחרות
מאפשרת לטפל ב Conversion DeadLocks -
Intent
היות ונעילות יכולות להיווצר בכמה רמות גרעיניות ,השרת זקוק למנגנון איתות שיאפשר לו לדעת האם
קיימת נעילה ברמת גרעיניות נמוכה במשאב אותו הוא מתעתד לנעול.
לדוגמה :כאשר השרת רוצה ליצור נעילה ברמת הטבלה הוא צריך לדעת האם קיימות נעילות סותרות
ברמת Pageאו Rowהשייכים לאותה טבלה.
Bulk Insert
נעילה שנוצרת עבור פעולות .Bulk Insert
בפקודת ה Bulk Insert -יש לעשות שימוש ב – .TabLock
מונעת נעילה אחרת על הטבלה להוציא Buנוספת.
Schema stability
נוצרת בשלב הקמפול של תוכניות ביצוע בשביל למנוע שינויי מבנה באובייקטים אליהם מתייחסת
תוכנית הביצוע.
מונעת רכישת נעילה מסוג .Schema modification
Schema Modification
נוצרת כאשר מתבצע שינוי במבנה אובייקט ב – DB
SIX
Shared Intent Exclusive
לא מופעלת באופן ישיר אלא עשויה להיווצר
דוגמה :על טבלה מופעלת נעילת Shared
ובשלב מאוחר יותר נוצרת נעילת Exclusiveברמת רשומה.
על הטבלה נקבל נעילת SIX
הטבלה הבאה מסכמת את ההבדלים בין אופציות הנעילה השונות בינהן בוחר המתכנת.
למעשה האופציות הנ"ל משפיעות על משך הנעילה( .כמה זמן נעילה מחזיקה מעמד).
ככל שמדיניות הנעילה חמורה ותר נמנעת יותר בעיות אך מידת ההפרעה למשתמשים אחרים במד הנתונים
גדלה.
Lock
עד סוף טקנזקציה עד סוף טקנזקציה נקודתית בלבד נקודתית בלבד
Shared
Lock
Dirty Read Dirty Read Dirty Read
NonRepeatable NonRepeatable Concurrency
Read Read problems
Phantoms Prevented
Sp_lock
קיימים מספר Optimizer Hintsשמאפשרים לשלוט על היקף ,משך וסוג הנעילה בה משתמש השרת
חשוב למקם את ה Hint -בתוך סוגריים אחרת יחשב ע"י השרת ל – .Alias
TabLock
כופה נעילות Sharedו Exclusive -ברמת הטבלה .מאפשר ליצור Snap Shotשל טבלה.
TabLockX
כופה נעילות Exclusiveברמת הטבלה .שווה ערך לשילוב של TabLockעם .Xlock
PagLock
כופה שימוש בנעילות Sharedו Exclusive -ברמת ה .Page -אם נרצה נעילה מסוג Exclusive
עבור פעולות Selectנוכל לשלב רמז זה עם .XLock
RowLock
כופה שימוש בנעילות Sharedו Exclusiveברמת הרשומה .ניתן לשלב עם .Xlock
Updlock
מפעיל נעילת Updateבמקום נעילת Sharedעבור פעולת .Selectהנעילה מחזיקה עד סוף
הטרנזקציה .שימושי במניעת .Conversion DeadLocks
Xlock
כופה נעילת Exclusiveעד סוף טרנזקציה .יכול להיות משולב עם PagLockאו .TabLock
HoldLock
Special
ReadPast
DeadLocks
סוגים
טיפול
מניעה
סוגי DeadLocks
Cycle DeadLock
A B
Bמנסה לרכוש נעילה על 1אבל
נכשל בשל הנעילה של A
1 2
Bמחזיק Exclusiveעל 2
A B
השרת מתמודד עם DeadLocksע"י הקרבה של אחת משתי הטרנזקציות והחזרה של הודעת שגיאה .1205
איך השרת מאתר DeadLocks
ה Lock Monitor -מחפש DeadLocksבמערכת כל חמש שניות.
אם מאותר DeadLockהשרת מקדם מונה פנימי; DeadLock Detection Counterל .3 -המונה
יורד באחד בכל פעם שמתבצעת סריקה מבלי לאתר .DeadLockכאשר מונה זה גדול מ 0 -השרת
מחפש DeadLockעבור כל פעולה שמחכה למשאב נעול.
ע"י שימוש ב set DeadLock_Priority low -ניתן לגרום ל Proccess -להקריב עצמו במקרה של התנגשות.
מניעה של Deadlocks
המלצות כלליות
תחזוקה של אינדקסים
מאפיינים
External Fragmentatioהסדר הלוגי והסדר הפיסי של ה Data pages -עליהם מאוחסן האינדקס שונה.
הסדר הפיסי של דפי המידע הוא סדר הופעתם על הדיסק .הסדר הלוגי של הדפים הוא הסדר בו יש לקרוא
את הדפים כאשר מבצעים סריקה מסודרת של האינדקס.
- Internal Fragmentationדפי המידע עליהם מאוחסן האינדקס אינם מלאים כדי הקיבולת שלהם.
שני המצבים המתוארים לעיל פוגמים ביעילות של השימוש באינדקס היות והפעילות של קריאת הנתונים
מהדיסק הופכת לפחות יעילה.
פרגמנטציה -גורמים
Page Splits
הכנסה של רשומה חדשה ל Data page -שבו אין מקום גורמת ל .Page Split -
הדף מתפצל לשני דפים נפרדים שכל אחד מלא כדי .50%הדף החדש שנוצר ,נוצר בסוף הפיסי של הדיסק
ובכך תורם ליצירה של External Fragmentationו .Internal Fragmrntation-
פרגמנטציה -אבחון
DBCC Showcontig
מבצע סריקה לוגית של האינדקס ומחזיר דו"ח .שמאפשר לקבל מידע בנוגע לשני סוגי הפרגמנטציה
שהזכרנו.
מבנה:
DBCC SHOWCONTIG
} [ ({'table_name'|table_id|'view_name'|view_id
]) ] [ , 'index_name' | index_id
– Logical Scan Fragmentationאחוז ה Data Pages -שהסדר הלוגי שלהם לא תואם את הסדר
הפיסי בו הם מופיעים על הדיסק.
הרציונל העומד מאחרי פרמטרים אלה הוא השארת מקום פנוי ב Data Pages -עליהם יושב האינדקס כך
שתהליך ה Page Split -ידחה.
oמדובר באופציות בהן ניתן לעשות שימוש במסגרת פקודת ה .Create Index -
ההחלטה על מיקום אינדקסים במסד הנתונים אינה קלה .כמו שכבר ראינו לאינדקסים יש יתרונות אך יש
גם חסרונות משמעותיים ;פגיעה בביצועים של פעולות DMLכמו Insertובחלק מהמקרים .Upadateוכן
הצורך בתחזוקה מתמדת בשל פרגמנטציה.
מה שמסבך את העניינים עוד יותר הוא הצורך ליצור אינדקסים על טבלה לא רק עבור שאילתה אחת ספציפית,
אלא כאלה שיתמכו בשלוש ארבע שאילתות עיקריות שרצות מול אותה הטבלה.
פה בא לעזרנו הIndex Tuning Wizard -
כלי אוטומטי שמניב המלצות למבנה אינדקסים אופטימלי ב .db -
זקוק לקלט שמחזיק תיעוד של הפעילות ב ( db -הקלט מושג ע"י שימוש ב .)Profiler-
כללי
מנגנון שמשפר ביצועים של שאילתות באופן משמעותי ע"י הפחתה של כמות ה IO -שהשרת נאלץ
לבצע.
מימוש
יש ליצור NonClustered Indexesעל כל העמודות אליהן מתייחסת השאילתא.
המשמעות היא שהשרת מסוגל לענות על שאילתה ע"י שימוש ב Leaf level pages-של האינדקס
מבלי שיאלץ לבצע גישה ל Data pagesעליהם יושבת הטבלה.
דגשים
השרת מסוגל לשלב מספר אינדקסים בכדי לכסות שאילתה.
גם אינדקס מורכב שהעמודה הראשונה בו אינה רלוונטית יכול לשמש לכיסוי שאילתה.
גם העמודות עליהן מוגדר ה Clustered Index -נחשבות למכוסות.
Query Tuning
פרק זה נועד להקנות את הידע התאורטי והכישורים הטכניים הדרושים בכדי להבין את תהליך האופטימיזציה
של שאילתות ב SQL Server -ולעשות שימוש בכלים ש SQL Server -חושף לשם ניתוח תוכנית הביצוע
של שאילתה מסויימת ,השוואה בין שתי חלופות שונות לביצוע שאילתה ועוד.
הנושאים הנידונים:
הרכיב ב SQL Server -שאחראי על בחירת תוכנית הביצוע האופטימלית עבור שאילתה נתונה.
Execution Plan
צפייה בתוכנית הביצוע הגרפית של ה SQLSERVER MANAGEMENT STUDIOמאפשרת לקבל
oאת השלבים בביצוע השאילתא.
oעלות ביצוע השאילתא ואפשרות השוואה בין שתי חלופות שונות לביצוע השאילתה.
oעלות שאילתה לא מספקת את הערכים הגולמיים של כמות IOאו זמן CPUשהושקעו בביצוע
הפעולה ,אלא ערך משוקלל של שני הגורמים האלה( .יחידות עלות ).
יישום
יש לבחור בתפריט . include actual execution plan query
יש לקרוא את תוכנית הביצוע משמאל לימין.
כל אלמנט גרפי מייצג שלב בביצוע השאילתא.
סדר האלמנטים משמעותי -האלמנטים מסודרים לפי ציר הזמן.
בכדי לקבל מידע על כמות ה IO -וה CPU -שנצרכה ע"י השרת בפועל ניתן לעשות שימוש בכלים
הבאים:
Statistics I/O
מחזירה מידע על כמות ה I/O -שביצע השרת עבור שאילתה מסוימת.
Statistics Time
מחזירה מידע על כמות הזמן שעבר במהלך הביצוע של השאילתא.
TIPS
משפטי SELECT
יש לצמצם את השימוש ב distinct -ו .order by -
אם אין אינדקס על העמודות הרלוונטיות עשויה להיווצר טבלת עבודה לשם ביצוע המיון
יש להעדיף Union allע"פ Union
שאילתות AND
מספיק להגדיר אינדקס סלקטיבי על אחד מהחיפושים.
השרת יעשה שימוש באינדקס ואת כל שאר החיפושים יעשה ע"י ביצוע Filter
שאילתות OR
חייבים ליצור אינדקס יעיל עבור כל אחד מתנאי החיפוש.
במידה ולא השרת נאלץ לבצע .Table scan
שם_אובייקט - Sp_helpמציגה מידע בסיסי עבור כל אובייקט שהוא – מתי האובייקט נוצר ,מי יצר את
האובייקט ,מרכיבי האובייקט והגדרות נוספות.
ניתן להיעזר בפונקציות על מנת להציג מידע מסויים מתוך ה ,VIEWSבין אם מידע על אובייקט מסויים ובין
אם מידע על DATA BASEמסוים.
רשימת הפונקציות:
( מספר_אובייקט) – object_nameמקבלת מספר אובייקט ומחזירה את שמו.
SQL 92 Syntax
[ DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement
] ] } ] FOR { READ ONLY | UPDATE [ OF column_name [ ,...n
[;]
ארגומנטים
INSENSITIVE
מציין שנוצר עותק זמני של מידע הקרסור ב ,tempdbלפיכך ,כול שינוי שנעשה על הטבלה לא יראה בשליפות
מהקרסור והקרסור לא יאפשר שינוי בטבלה.
SCROLL
מציין שניתן לנוע על פני הקרסור קדימה ואחורה .אם לא מצוין אז ניתן לנוע רק קדימה ( .)NEXTלא ניתן לציין
SCROLLכאשר יש ציון של FAST_FORWARD
select_statement
משפט ה SELECTשל הקרסור ,אסור לפרט בו:
COMPUTE, COMPUTE BY, FOR BROWSE, INTO
READ ONLY
לא מאפשר עדכונים דרך הקרסור של טבלאות הבסיס .לא ניתן להתייחס לקרסור זה במשפט WHERE
CURRENT OFבפקודות DELETEאו .UPDATE
sp_cursor_list
Returns a list of cursors currently visible on the connection and their attributes.
sp_describe_cursor_columns
Describes the attributes of the columns in the cursor result set.
sp_describe_cursor_tables
Describes the base tables accessed by the cursor.
1- The FETCH statement failed or the row was beyond the result set.
:דוגמה
:קרסור חיצוני המדפיס את פרטי הספק וקרסור פנימי המדפיס את המוצרים מאותו ספק
OPEN vendor_cursor
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT' '
SELECT @message = '----- Products From Vendor + ' :
@vendor_name
PRINT @message
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
IF @@FETCH_STATUS <> 0
PRINT ' <<None '>>
WHILE @@FETCH_STATUS = 0
BEGIN
END
CLOSE product_cursor
DEALLOCATE product_cursor
טרנזאקציה – יחידת עבודה לוגית היכולה להכיל מספר פקודות .טרנזאקציה מבטיחה שכול הפקודות יבוצעו
כיחידה – או שכולן יצליחו ( )Commitאו שכולן יכשלו (.)Rollback
המידע עליו עובדים נעול עד סיום טרנזאקציה ולא מאפשר למשתמשים אחרים לשנות או לקרא את המידע.
,MSכברירת מחדל ,מבצע Autocommitאו Rollbackלכול פקודת T-SQLשמצליחה או נכשלת.
Explicit Transactions
לפתיחת טרנזאקציה – ]BEGIN TRAN[SACTION
לסיום טרנזאקציה – ]COMMIT TRAN[SACTION] / ROLLBACK TRAN[SACTION
XACT_ABORT
קובע האם יבוצע rollbackאוטומטי של כול הטרנזאקציה ולא רק של הפקודה שיצרה את השגיאה כאשר
מתרחשת שגיאת זמן ריצה בטרנזאקציה.
דוגמה:
BEGIN TRAN
COMMIT TRAN
XACT_ABORT
כאשר מופעל בתוך TRYאז הופך את הטרנזאקציה ל ,uncommittableבמקרה זה יש לבצע rollback
מפורש.
XACT_STATE
מכיל את הערך -1אם הטרנזאקציה הנוכחית היא uncommittable
מכיל את הערך 0אם אין טרנזאקציה פעילה
מכיל את הערך 1אם הטרנזאקציה הנוכחית היא committable
BEGIN TRY
BEGIN TRAN
….
COMMIT TRAN
END TRY
BEGIN CATCH
IF (XACT_STATE())=-1 --UNCOMMITABLE
ROLLBACK TRAN
ELSE IF (XACT_STATE())=1 --COMMITABLE
COMMIT TRAN
END CATCH
הערות:
* Try Catchמופעל רק בשלב ה Executeולכן לא יתפוס שגיאות sysntaxולא יתפוס שגיאות ( Resolveכן
יתפוס למשל מחיקה של רשומות שמפירות .)FK
* Try Catchלא יתפוס Fatal Errorsשגורמות לסגירת ה .Connection
Nested transactions
ניתן לקנן טרנזאקציות מפורשות ,בדר"כ קורה כאשר קוראים לפרוצדורה המכילה BEGIN TRAN
ניתן לדעת מה רמתהקינון ע"י תחקור המשתנה הגלובלי - @@trancount
ערכו 0אם אין טרנזאקציה פעילה
כול פתיחת טרנזאקציה מקדמת באחד
כול Commitמוריד אחד
פעולת Rollbackמאפסת אותו
כאשר מתבצעת קריאה לשאילתא MS ,מחפש ב procedure cacheהאם יש תוכנית פעולה מוכנה לאותה
שאילתה כדי לחסוך בחישוב תוכנית פעולה מחדש.
כאשר משתמשים בפרוצדורות ,לעיתים נרצה לקמפלן מחדש כדי לקבל תוכנית פעולה עדכנית יותר.
Sp_recompile
פרוצדורה היכולה לקבל שם טריגר או פרוצדורה אחרת ותגרום לקימפולם בקריאה הבאה להם .ניתן לפרט
גם שם טבלה או viewואז כול הפרוצדרות שהשתמשו בהם יקומפלו בפעם הבאה שיקראו.
דוגמה לשימוש :הוספת אינדקס לטבלה לא תגרום ליצירת תוכניות פעולה חדשות של השאילתות הפונות אליה
ולכן מומלץ במקרה זה להשתמש ב Sp_recompile
'sp_recompile 'Orders
סכמה זהו namespaceלאוביקטים .שמות סכמה צריכים להיות יחודיים בתוך .database
שם מלא לאובייקט הינוserver.database.schema.object :
בתוך databaseניתן לקצר את השם לschema.object :
סכמת הברירת מחדל הינה dboלכול המשתמשים שלא הוגדרה להם סכמת ברירת מחדל מפורשות.
כאשר משתמש פונה לאובייקט ללא ציון סכמה MS ,מחפש קודם את האובייקט תחת הסכמת הברירת מחדל
שהוגדרה לאותו משתמש ואם לא נמצא שם האובייקט (או שלא הוגדרה סכמת ברירת מחדל לאותו משתמש)
אז MSמחפש תחת הסכמה של dbo
יצירת סכמה:
USE NORTHWIND
GO
CREATE SCHEMA sales
GO
SELECT פקודת
Select column, group_function(column)
From table_name
[Where condition]
[Group By group_by_expression]
[Having group_function]
[Order By column]
CTE
update table_name
set column=value [,column=value , ….]
[where condition]
truncate table_name
DDL פקודות
create table table_name (
column data type [not null] [identity( )]
[default value] ,
……………….,
[primary key (column)]
[foreign key (column) refernces table_name(column)]
:
:
[check (condition)]
:)
VIEWS
Mathematical Functions-
CEILING(numeric_expression)
FLOOR(numeric_expression)
ROUND(numeric_expression, length[, function])
String Functions
ASCII(character_expression)
CHAR(INTEGER_EXPRESSION)
CHARINDEX(character_expression1, character_expression2 [,start_location])
RIGHT(character_expression, integer_expression)
LEFT(character_expression, integer_expression)
LEN(character_expression)
RTRIM(character_expression)
LTRIM(character_expression)
REPLACE('character_expression1','character_expression2',
character_expres sion3')
REVERSE(character_expression)
SUBSTRING(character _expression, start, length)
LOWER(character_expression)
UPPER(character_expression)
CAST(expression AS data_type)
ISNULL פונקציית
ISNULL(column_name, value)
case משפט
IIF פונקציית
משפטי תנאי
if boolean_expression
begin
{sql_statement | statement_block}
end
[else
begin
{sql_statement | statement_block}]
end
while לולאת
while bolean_expression
begin
{sql_statement | statement_block}
[break]
{sql_statement | statement_block}
[continue]
end
Stored procedure
קריאה לפרוצדורה
EXE[CUTE] שם הפרוצדורה