מתן הוראה למנגנון מסד הנתונים Jet של Microsoft להחזיר מידע ממסד הנתונים כערכת רשומות.
תחביר
SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...] [IN externaldatabase]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]
משפט SELECT כולל את החלקים הבאים:
| חלק | תיאור |
| predicate | אחד מהפרדיקאטים הבאים: ALL, DISTINCT, DISTINCTROW או TOP. השימוש בפרדיקאט נעשה כדי להגביל את מספר הרשומות המוחזרות. אם לא מצויינת כל רשומה, ברירת המחדל היא ALL. |
| * | ציון כי כל השדות של טבלה או טבלאות שצויינו נבחרו. |
| table | שם הטבלה המכילה את השדות מתוכם נבחרות רשומות. |
| field1, field2 | שמות השדות המכילים את הנתונים אותם ברצונך לאחזר. אם תכלול יותר משדה אחד, הנתונים יאוחזרו לפי הסדר הרשום. |
| alias1, alias2 | השמות בהם יש להשתמש ככותרות עמודה במקום שמות העמודה המקוריים תחת table. |
| tableexpression | שם הטבלה או הטבלאות המכילות את הנתונים אותם ברצונך לאחזר. |
| externaldatabase | השם של מסד הנתונים המכיל את הטבלאות ב- tableexpression אם הן אינן במסד הנתונים הנוכחי. |
הערות
לשם ביצוע פעולה זו, מנגנון מסד הנתונים Microsoft® Jet מבצע חיפוש בטבלה או בטבלאות שצויינו, מחלץ את העמודות הנבחרות, בוחר שורות המתאימות לקריטריון וממיין או מקבץ את השורות שהתקבלו מפעולה זו לפי הסדר שצויין.
משפטי SELECT אינם משנים נתונים במסד הנתונים.
SELECT היא בדרך כלל המילה הראשונה במשפט SQL. רוב משפטי SQL הם משפטי SELECT או SELECT...INTO.
התחביר המינימלי עבור משפט SELECT הוא:
SELECT fields FROM table
באפשרותך להשתמש בכוכבית (*) לשם בחירת כל השדות בטבלה. בדוגמה הבאה נבחרים כל השדות בטבלה Employees:
SELECT * FROM Employees;
אם שם שדה כלול ביותר מטבלה אחת בפסוקית FROM, מקם לפניו את שם הטבלה ואת האופרטור . (נקודה). בדוגמה הבאה, השדה Department נמצא הן בטבלה Employees והן בטבלה Supervisors. משפט SQL בוחר מחלקות מהטבלה Employees ושמות מפקחים מהטבלה Supervisors:
SELECT Employees.Department, Supervisors.SupvName
FROM Employees INNER JOIN Supervisors
WHERE Employees.Department = Supervisors.Department;
בעת יצירת אובייקט Recordset, משתמש מנגנון מסד הנתונים Jet של Microsoft בשם השדה של הטבלה כשם האובייקט Field באובייקט Recordset. אם דרוש לך שם שדה אחר או אם לא מצויין שם על-ידי הביטוי המשמש ליצירת השדה, השתמש במילה שמורה מסוג AS. בדוגמה הבאה נעשה שימוש בכותרת Birth לשם מתן שם לאובייקט Field המוחזר באובייקט Recordset המתקבל מפעולה זו:
SELECT BirthDate
AS Birth FROM Employees;
בכל עת בה נעשה שימוש בפונקציות צבירה או בשאילתות המחזירות שמות אובייקט Field דו-משמעיים או כפולים, עליך להשתמש בפסוקית AS כדי לספק שם חלופי עבור אובייקט Field. בדוגמה הבאה נעשה שימוש בכותרת HeadCount לשם מתן שם לאובייקט Field המוחזר באובייקט Recordset המתקבל מפעולה זו:
SELECT COUNT(EmployeeID)
AS HeadCount FROM Employees;
באפשרותך להשתמש בפסוקיות נוספות במשפט SELECT כדי להגביל ולארגן במידה מרובה יותר את הנתונים המוחזרים. לקבלת מידע נוסף, עיין בנושא העזרה עבור הפסוקית בה אתה משתמש.
דוגמה למשפט SELECT, פסוקית FROM
כמה מן הדוגמאות להלן מניחות את קיומו של שדה היפותטי Salary בטבלה Employees. שים לב כי שדה זה אינו קיים למעשה בטבלה Employees של מסד הנתונים Northwind.
דוגמה זו יוצרת Recordset מסוג קבוצת רשומות דינאמיות המתבססת על משפט SQL שבוחר את השדות LastName ו- FirstName בכל הרשומות בטבלה Employees. דוגמה זו שולחת קריאה לפרוצדורה EnumFields, אשר מדפיסה את תוכנו של אובייקט Recordset לחלון Debug.
Sub SelectX1()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Select the last name and first name values of all
' records in the Employees table.
Set rst = dbs.OpenRecordset("SELECT LastName, " _
& "FirstName FROM Employees;")
' Populate the recordset.
rst.MoveLast
' Call EnumFields to print the contents of the
' Recordset.
EnumFields rst,12
dbs.Close
End Sub
דוגמה זו סופרת את מספר הרשומות שיש להן ערך בשדה PostalCode ומכנה את השדה החוזר Tally.
Sub SelectX2()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Count the number of records with a PostalCode
' value and return the total in the Tally field.
Set rst = dbs.OpenRecordset("SELECT Count " _
& "(PostalCode) AS Tally FROM Customers;")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of
' the Recordset. Specify field width = 12.
EnumFields rst, 12
dbs.Close
End Sub
דוגמה זו מציגה את מספר העובדים ואת המשכורות הממוצעות והמקסימליות.
Sub SelectX3()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Count the number of employees, calculate the
' average salary, and return the highest salary.
Set rst = dbs.OpenRecordset("SELECT Count (*) " _
& "AS TotalEmployees, Avg(Salary) " _
& "AS AverageSalary, Max(Salary) " _
& "AS MaximumSalary FROM Employees;")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of
' the Recordset. Pass the Recordset object and
' desired field width.
EnumFields rst, 17
dbs.Close
End Sub
הפרוצדורה Sub EnumFields מעבירה אובייקט Recordset מן הפרוצדורה המבצעת קריאה. לאחר מכן, הפרוצדורה מעצבת ומדפיסה את השדות של אובייקט Recordset אל חלון Debug. המשתנה intFldLen הוא רוחב השדה המודפס המבוקש. ייתכן כי מספר שדות ייחתכו.
Sub EnumFields(rst As Recordset, intFldLen As Integer)
Dim lngRecords As Long, lngFields As Long
Dim lngRecCount As Long, lngFldCount As Long
Dim strTitle As String, strTemp As String
' Set the lngRecords variable to the number of
' records in the Recordset.
lngRecords = rst.RecordCount
' Set the lngFields variable to the number of
' fields in the Recordset.
lngFields = rst.Fields.Count
Debug.Print "There are " & lngRecords _
& " records containing " & lngFields _
& " fields in the recordset."
Debug.Print
' Form a string to print the column heading.
strTitle = "Record "
For lngFldCount = 0 To lngFields - 1
strTitle = strTitle _
& Left(rst.Fields(lngFldCount).Name _
& Space(intFldLen), intFldLen)
Next lngFldCount
' Print the column heading.
Debug.Print strTitle
Debug.Print
' Loop through the Recordset; print the record
' number and field values.
rst.MoveFirst
For lngRecCount = 0 To lngRecords - 1
Debug.Print Right(Space(6) & _
Str(lngRecCount), 6) & " ";
For lngFldCount = 0 To lngFields - 1
' Check for Null values.
If IsNull(rst.Fields(lngFldCount)) Then
strTemp = ""
Else
' Set strTemp to the field contents.
Select Case _
rst.Fields(lngFldCount).Type
Case 11
strTemp = ""
Case dbText, dbMemo
strTemp = _
rst.Fields(lngFldCount)
Case Else
strTemp = _
str(rst.Fields(lngFldCount))
End Select
End If
Debug.Print Left(strTemp _
& Space(intFldLen), intFldLen);
Next lngFldCount
Debug.Print
rst.MoveNext
Next lngRecCount
End Sub
|