bassam4000
27-08-2003, 02:37 AM
الـSQL هو عبارة عن فاصل بين تبوبين ( تصنيفين ) منفصلين , كلاهما سوف يتم مناقشته بشكل مفصل في هذا الملحق .
التبويب ( التصنيف ) الأول هو الـData Definition Language DDL لغة تعريف البيانات , وهو يستخدم لانشأ , تعديل , أو إزالة تعريف حقيقي في قاعدة بيانات محددة .
التبويب ( التصنيف ) الثاني هو الـData Manipulation Language DML لغة التعامل مع البيانات وهو يستخدم من اجل انشأ , تعديل , إزالة , وتجميع المعلومات التي تحتل بنية قاعدة البيانات . بكلمات أخرى , سوف تتمكن من استخدام الـDLL في انشأ الجداول والحقول , والفهارس , , سوف تستخدم الـDML في إحلال , استبدال , استعادة المعلومات التي تحتل الجداول والحقول .
الجدول A.1 فية سبعة أوامر SQL التي تكون أساسية في أي إعلان SQL :
COMMAND Classification De******ion
CREATE Definition Create a table, a field, or an index.
ALTER Definition Modify a table by adding a field or changing a field definition.
DROP Definition Drop a table or an index.
SELECT Manipulation Query a data**** with given parameters.
INSERT Manipulation Insert multiple records with one operation.
UPDATE Manipulation Change information throughout a range with given parameters.
DELETE Manipulation Remove records from the table.
هذة الأوامر تتحقق من نوع الاستفهام query في إعلان الـSQL . وفي الجدول السابق يوجد تبويب لكل أمر من الأوامر إما كونة DDL اوDML .
الـSQL command يستخدم الى جانب العناصر الاخرى من تصريح الـSQL statement وذلك لاٍنشأ اما فعل استفهام او استفهام محدد.
حدث الاستفهام Action query هي التي تبداء مع الـSQL statement عوضاً عن الـselect .
كما قد تخمن البداية مع الـselect هو selection query .
عندما تستخدم الاستفهام query سوف تستخدم شروط (مفرد شرط) مختلفة التي تنفذ في الـSQL statement .
في الجدول A.2 فية عدد من الشروط المتوفرة من اجل الـSQL تستخدم Microsoft Jet Engine (محرك =Engine , دفق=Jet )
CLAUSE De******ions
FROM Specifies the table from which data is queried
WHERE Specifies the condition(s) for the query
GROUP BY Specifies the group(s) for the selected information
HAVING Specifies the condition(s) for each group in the query
ORDER BY Specifies the order of the query
الشرط الاول من هذة الشروط هو , FORM , وهو يستخدم في يدل على الجدول او الاستفهام المستخدمة لتجميع المعلومات من اجل الـSQL statement . اكثر من واحد من واحد من الجداول او الاستفهام يمكن وضعها في الاعلان , بأستخدام الشرطFORM .
عندما تعمل ذلك فأنك تنشأ على الاقل ملحق واحد للاستفهام .
الملحق او المنضمjoin سيناقش لاحقاً في هذا الملحق .
الشرط الثاني , WHERE , يعبر عن الحالة التي يجب ان تكون ملائمة للسجل لكي يصبح مضمن في نتيجة الاستفهام .
كل واحد من هذة الحالات قادرة على استخدام عامل الشرط .
الحالات الشرطية المتعددةMultiple condition تستخدم العامل المنطقي logical operators .
الجدول A.3 يحوي الـconditional & logical المتوفرة :
OPERATOR TYPE Condition Is Met When
AND Logical Both expressions are true.
OR Logical Either expression is true.
NOT Logical The expression is false.
< Comparison The first expression is less than the second expression.
<= Comparison The first expression is less than or equal to the second expression.
> Comparison The first expression is greater than the second expression.
>= Comparison The first expression is greater than or equal to the second expression.
= Comparison The first expression is equal to the second expression.
<> Comparison The first expression is not equal to the second expression.
BETWEEN Comparison The value belongs to a specified set of values.
LIKE Comparison The value matches the pattern specified.
IN Comparison The record belongs to a particular group in a data****
شرط الـSQL الثالث , GROUP BY , وهو يستخدم لوضع نتائج الاستفهام في مجموعة .
الـGROUP BY يستخدم على الاقل اسم حقل واحد من الجدول او قائمة الاستفهام في اعلان الشرطFORM لكي يقيم السجل والمجموعة على انها قيم .
يمكنك ايضاً وظيفة تجميع الحاصل aggregate function في اعلان الـSQL لانشأ ملخص عن المجموعات في الـrecordset .
في الجدول A.4 هناك قائمة بوظائف تجميع الحاصل aggregate function :
AVG Returns the average value of a specified field
COUNT Returns the number of records in a query
SUM Returns the sum of the values in a specified field
MAX Returns the largest value in a specified field
MIN Returns the smallest value in a specified field
شرط الـSQL الرابع , HAVING , يعين الحالة الشرطية ( بنفس الطريقة المستخدمة مع شرط FORM ) المجموعات يجب ان تكون ملائمة لكي تتضمن نتائج الـrecordset .
شرط الـSQL الاخير , ORDER , يستخدم اسماء الحقول للامر باعداد النتيجة في اسلوب معين .
Data Definition Language لغة تعريف البيانات :
اعلانات الـDDL تستخدم لانشأ , استبدال و وازالة الجداول , الحقول , الفهارس من قاعدة البيانات .
اوامر الـSQL الثلاثة لعمل , CREATE , DROP ,ALTER كلها عبارة عن حدث استفهام Action query .
الـAction queries في الفيجوال بيسك يمكن استهلالها بأحدى طريقتين .
الطريقة الاولى في مناشدة الـaction query تكون بأستخدام الـQueryDef object .
الطريقة الثانية بأستخدام طريقة التنفيذ Execute method لقاعدة البيانات كالتالي :
db.Execute sSQLStatement
هذا يفترض ان الـdb هو مشروع قاعدة بيانات متغير تم اعدادة بنجاح الى قاعدة بيانات شرعية , والـ sSQLStatement هي string شرعية متغيرة تشمل حدث SQL statement شرعي .
The CREATE Command الامر المنشأ :
الامر المنشأ يستخدم لانشأ جدول وفهرس في قاعدة بيانات محددة , لكي تنشأ جدول في قاعدة بيانات معطاة , استخدم the CREATE TABLE statement على النحو التالي :
CREATE TABLE table (fld1 type [(sz)] [NOT NULL] [idx1] [, fld2 type [(sz)]
[NOT NULL] [idx2] [, ...]] [, CONSTRAINT MFidx [, ...]])
في السطور السابقة , اسم الجدول يُنجح اعلان انشأ الجدول ويتبع بـcomma-delimited list فاصلة محدودة لتعريف الحقل الذي استخدم لأنشأ جدول معين . على الاقل حقل واحد يجب ان يكون بين هلالين كما يظهر .
أي نموذج شرعي من قواعد البيانات يمكن استخدامة لكي يدل على نموذج الحقل لكي يتم انشائة , والحجم( SZ ) يمكن ان تعين من اجل النص في الحقول المزدوجة .
المثال التالي ينشأ جدول جديد في الـdb قاعدة البيانات مع ثلاثة حقول :
db.Execute "CREATE TABLE Customers (CustNum INTEGER, " _
& "CustName TEXT (25), Address TEXT (30))"
الحقل الجديد المنشأ يدعى Customers =الزبائن . يشمل على حقل عداد اسمة CustNum وحقلين نص اسمهما CustName &Address .
استخدام الـNOT NULL الثابتة اختيارية , يمكنك تعيين ان الحقل لايمكن ان يكون لدية قيمة NULL . اذا كانت الـNULL value
منسوبة الى الحقل المنشأ بهذا الخيار , فان خطاء سوف يظهر . المثال التالي هو تعريف لجدول محصن بشكل جيد :
db.Execute "CREATE TABLE Customers (CustNum INTEGER NOT NULL, " _
& "CustName TEXT NOT NULL (25), Address TEXT (30))"
نسخة الـ CREATE TABLE حدث استفهام يعين ان الارقام وقيمة حقل الـCustName لايمكن ان تحتوي على أي من قيم الـNULL
مع ذلك فان حقل الـAddress يمكن ان يكون محتوي عليها .
يمكنك ايضاً استخدام شرط التقييد CONSTRAINT clause في اعلان الـ CREATE TABLE لانشأ فهرس اما على حقل مفرد او حقول متعددة . المثال التالي ينشأ فهرس في جدول جديد :
db.Execute "CREATE TABLE Customers (CustNum INTEGER, " _
& "CustName TEXT (25), Address TEXT (30), " _
& "CONSTRAINT CustIndex UNIQUE (CustNum, CustName))"
هذا المثال انشأ جدول مع ثلاثة حقول كما ظهر قبلاً , لكنة ايضأ اضاف فهرس اسمة CustNumIndex
لاحظ ان الفهرس الجديد المنشأ بواسطة شرط الـ CONSTRAINT , اسمة CustIndex , يكون رابط الجأش في كلا الحقلين الـCustName & CustNum الموصفين في اعلان الـSQL .
الفرق بين انشأ فهرس حقل فردي واخر متعدد الحقول مع الـcreate table statement هو ان في الحقل الفردي يمكنك ان تدل على شرط الـCONSTRAINT التقييد , بعد اعطاء الحقل , بدون فاصلةcomma .
اما انشأ فهرس لحقول متعددة بشرط التقييدCONSTRAINT , فانك تعين الفهرس بعد ان انشأ الحقول في الفهرس .
كما سيظهر في المثال الاخير .
للمزيد من المعلومات عن شرط التقييد CONSTRAINT ستجدها في " Using the CONSTRAINT Clause "
ليس من الضروري ان تقوم بأنشأ الفهرس في الـCREATE TABLE STATEMENT --- يمكنك ايضاً انشأ الفهرس في باستخدام
الـCREATE INDEX STATEMENT كما في المثال التالي :
db.Execute "CREATE UNIQUE INDEX CustIndex ON Customers (CustNum, CustName)"
هذا الاعلان يؤدي الى نفس النتيجة المستمدة من الـCREATE TABLE statement
الاسلوب ( النحو syntax ) المتبع من اجل الـCREATE INDEX statement كالتالي :
CREATE [UNIQUE] INDEX idx ON table (fld1 [ASC|DESC]
[, fld2 [ASC|DESC], ...])
[WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]
عندما تستخدم الـCREATE INDEX statement , فانك تعين خيار الـUNIQUE كما في المثال السابق ,
فانت تخبر الـJet Engine انة لا يوجد مجموعين , من اجل قيم الحقول المدرجة , التي اصبحت مسموح بها , هكذا تنشأ الـunique index فهرس فردي على الحقول .
بشكل افتراضي فان الفهارس يتم انشائها بامر صاعدASC Keyword , لكن يمكنك ان تعيين قائمة الاوامر للقيم في الفهرس بأمر نازل
بأستخدام DESC Keyword بعد ارسال اسم الحقل .
القسم الاخير من الـ CREATE INDEX statement يسمح لك ان تعين , بشكل اكثر تفصيلاً , كيف يمكن التعامل مع الفهرس .
يمكنك عمل هذا بواسطة الشرط الـ WITH للـCREATE INDEX statement . لاْنشا مفتاح اساسي في في الجدول , استخدم الـWITH PRIMARY statement .
الاعلان ينشأ فهرس فريد unique index الذي هو الان مفتاح اساسي . فقط مسموح بمفتاح اساسي واحد في الجدول ومحاولة انشأ واحد اخر ستؤل الى ظهور رسالة خطاء .
يمكنك ايضاً منع استخدام قيمة الـNULL في الفهرس بواسطةWITH DISALLOW NULL statement او يمكنك السماح لقيمة الـNULL
بواسطة الـWITH IGNORE NULL statement .
The ALTER Command امر الاستبدال :
الامر الثاني المنتمي للـSQL DDL . يمكنك ايضاً استخدام الـALTER TABLE statement لاكمال اربعة مهام كاملة ومنفصلة .
• Add a new field to a table.
• Delete a field from a table.
• Add a new index to a table.
• Delete an index from a table.
يمكنك اضافة او ازالة فقط حقل واحد او فهرس واحد لكل واحد من الـALTER TABLE statement . النحو الذي يقوم علية الـALTER TABLE statement كالتالي :
ALTER TABLE table {ADD {COLUMN fld type[(size)] [NOT NULL] [CONSTRAINT idx]
| CONSTRAINT MFidx} | DROP {COLUMN fld | CONSTRAINT indexname}}
المثال التالي ينشأ حقل جديد في الجدول الموجود والمسمى Customers :
db.Execute "ALTER TABLE Customers ADD COLUMN PhoneNum TEXT (12)"
تماما كما يمكنك اضافة حقل الى الجدول يمكنك ازالتة منة , كما في المثال التالي :
db.Execute "ALTER TABLE Customers DROP PhoneNum"
يمكنك ايضاً تعيين فهارس جديدة تماماً كما فعلت مع الـCREATE TABLE , وتوقع انة يمكنك اضافة فهرس بعد ان يكون الجدول يكون منشأ اصلا ً كما يظهر في التالي :
db.Execute "ALTER TABLE Customers " _
& "ADD CONSTRAINT NameAndPhoneIndex (CustName, PhoneNum)"
الان يمكنك ازالة الفهرس بهذا المثال النهائي :
db.Execute "ALTER TABLE Customers DROP CONSTRAINT NameAndPhoneIndex"
Using the CONSTRAINT Clause استخدام شرط التقييد :
حتى الان لقد رايت ان شرط التقييد موجود في كلا الـCREATE & ALTER SQL command .
الان القي نظرة قريبة على هذا الشرط واكتشف مدى قوتة . في شكله غير المركب , فان الـconstraint هو فهرس , ليس فقط شرط التقييد هو السماح لك بأنشأ او ازالة الفهارس كما يظهر في قطاعي الـ CREATE & ALTER command , لكنة ايضاً يسمح لك بانشأ مفتاح اساسي & foreign key لتعريف العلاقة و يؤكد صلة الوحدات . كما ظهر مؤخراً , بالمثال السابق , هناك نسختين من الـCONSTRAINT statement , واحد من اجل فهارس الحقول الفردية , والثاني من اجل فهارس الحقول المتعددة . بالنسبة للحقل الواحد كما يظهر في التالي :
CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreigntable
[(foreignfield1, foreignfield2)]}
اما من اجل فهرس الحقول المتعددة هو هذا :
{PRIMARY KEY (primary1[, primary2 [, ...]]) |
UNIQUE (unique1[, unique2 [, ...]]) |
NOT NULL (notnull1[, notnull2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]])
REFERENCES foreigntable
[(foreignfield1 [, foreignfield2 [, ...]])]}
اسم الفهرس لكي يتم انشائة , يتم تعيينة مباشرة بعد الـ CONSTRAINT keyword . في نسخة اخرى يمكنك انشأ ثلاثة نماذج من الفهارس :
*A UNIQUE index , هذا الفهرس المفرد ليس لدية حقلين ,كما يدلل على ذلك في شرط التقييد , بنفس القيمة .
*A PRIMARY KEY index , هو مفتاح اساسي , بواسطة التعريف , والـunique . هذا يعني ان كل الحقول تضمن في تعريف المفتاح الاساسي الذي يجب ان يكونunique .
*A FOREIGN KEY index . مفتاح الـforeign هو فهرس يستخدم جدول اخر من اجل انشأ فهرس على الجدول الصحيح .
يمكنك انشأ foreign key لاْنشأ علاقة بين حقول متعددة كما في المثال التالي :
db.Execute "ALTER TABLE Customers " _
& "ADD CONSTRAINT NewIndex " _
& "FOREIGN KEY (CustNum) REFERENCES Orders (CustNum)"
هذا المثال ينشأ علاقة بين جدول الـCustomers وجدول الـOrders لمشروع قاعدة البيانات . فهرس جديد تم انشائة , NewIndex , الذي يربط قاعدة الجدولين علىاسم حقل CustNum .
The DROP Command امر الانسدال :
The DROP command يأتي بنكهتين : DROP TABLE وDROP INDEX كما يمكن ان تخمن ببساطة , الـthe DROP TABLE statement
يزيل الجدول الموجود من قاعدة البيانات كما يظهر هنا :
db.Execute "DROP TABLE Customers"
The DROP INDEX statement تعمل بشكل مشابة DROP TABLE statement , ما عدا ان ذلك يزيل الفهرس من الجدول المعطى كما في المثال التالي :
db.Execute "DROP INDEX CustNumIndex ON Customers"
للذكر , تصرف الـDROP command يكون كالتالي:
DROP {TABLE table | INDEX idx ON table}
Data Manipulation Language لغة التعامل مع البيانات DML :
اوامر الـDML تعمل مزيج من الاحداث والاستفهامات المحددات .الاوامر SELECT, INSERT, UPDATE, and DELETE تستخدم من اجل تسريع وتفعيل اداء الـJet Engine , والتعامل مع احلال البيانات في جداول معينة .
The SELECT Command:
هذا الامر يختلف عن كل الاوامر الاخرى في الـSQL مع انة جزء من تحديد الاستفهام او بالاحرى حدث استفهام . عندما تستخدم تحديد الاستفهام في تطبيقات الفيجوال بيسك , انة لمن الشائع في الـrecordset لقاعدة البيانات المعطاة . على افتراض ان الـrs هو اختصار الـrecordset الشرعي والـdb هو اختصار قاعدة البيانات التي هي في الاصل معدة على انها ملف قاعدة البيانات الشرعية , يمكنك استخدام الاعلان التالي لتجميع كل الـrecordset في جدول التCustomers لاختصار الـdb :
Set rs = db.OpenRecordset("SELECT * FROM Customers")
المثال يستخدم اغلب صفات وشكل القاعدة في الـ SELECT statement . هذا القسم سوف يوضح لك العناصر المختلفة من الـSELECT statement ويصور كيف يمكن للمبرمج ان يستخدم كل واحدة من المحتويات بأسلوب فعال وتنقية filter السجلات حسب حاجتة .
مثال على الـSELECT statement :
SELECT [predicate]
{ * | table.* |
[table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...] [IN externaldata****]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
انة سهل الفهم للغاية لكي تغمر بهذا التصريح , لكن ليس كل الشرط مضمنة في هذا المثال ان تكون مستخدمة بجانب بعضها ---مع انة من الممكن ان تكون كذلك :
خذ هذا المثال فرضاً :
SELECT DISTINCT CUSTNUM, CUSTNAME
FROM Customers
WHERE (CustNum >= 100) AND (CustNum <= 120)
ORDER BY CustName;
هذا الاعلان statement يسترد فقط حقلي الـCustNum & CustName من جدول الزبائن . شرط الـWHERE في هذا الاعلان يظهر حالتين شرطيتين . الحالة الاولى تقول ان قيمة حقل الـCustNum يجب ان تكون اكبر او تساوي 100 . الحالة الثانية تقرر ان قيمة حقل الـcustNum يجب ان اقل او تساوي 120 . حتى الان , يمكنك رؤية ان اعلان الـselect يظهر انة سوف يسرع من اعادة الـCustNum والـCustName من اجل كل السجلات مع ارقام الزبائن بين 100-120 . الجزء الاخير من هذا الاعلان هو امر اعادة السجل بواسطة الاستفهام بواسطة حقل الـCustName بكلمات اخرى , في اساسيات الامر. يمكنك ايضاً طلب السجلات لكي يتم اعادتها returned في اساسيات الامر بواسطة وضع الـDESC Keyword بعد الشرط الـORDER BY CustName .
يمكنك ايضاً استخدام حالات الشرط المتعددة في الـSELECT statement كما يظهر في هذا الاعلان . من اجل قائمة كاملة من عوامل حالات الشرط operators conditions , كلا هما منطقيان ومتوازيان , القي نظرة على الجدولA.4 في بداية هذا القسم .
انة لمن المهم ملاحظة ان الـDISTINCT keyword تتبع امر الــSELECT الذي يدعى اعلان او تصريح . هذة الـKeyword تدل على انة هناك جمع من الحقول المفردة unique مميزة سوف يتم اعادتها . في هذا المثال , اذا كان لديك ثلاثة سجلات في جدول الزبائن بنفس ارقام واسماء الزبائن , لكن بعنوان مختلف , لكن سجل واحد سوف يمكن اعادتة . اذا كنت قد اضفت حقل العنوانAddress field في قائمة الحقول في اعلان التحديد SELECT statement , سوف تتلقى لكل سجل معاد , نفس رقم الزبون نفس الاسم , لأن الجمع للـ(الرقم , الاسم والعنوان ) كان مفردUNIQUE لكل سجل معاد .
DISTINCT keyword ليست التصريح الوحيد المتوفر في الـSELECT statement . في الجدول A.5 سنورد الخمسة تصريحات المتوفرة في الـSELECT statement :
PREDICATE De******ion
ALL Returns all records, even duplicates
DISTINCT Returns only unique records, ****d on fields specified in the statement
DISTINCTROW Returns only unique records, ****d on all fields in the specified table(s), even those not listed in the SELECT statement
TOP Returns the first n records or the top p percentage of records of the selected recordset
التصريح الافتراضي المستخدم في الـSELECT statements لا يصرح عن الكل , كلها تعيد السجلات التي تلاقي حالات الشرط للـselection query . التصريح TOP يستخدم في ارتباط مع الـORDER BY clause في الـSELECT statement . يمكن استخدامة بأحدى طريقتين:
*TOP n يعيد السجل n الاول .
*TOP p PERCENT يعيد النسبة المئوية لكامل السجل .
اتبع المثال التالي لتصريح الـTOP (TOP predicate ) :
SELECT TOP 10 PERCENT OrderNum, OrderPrice
FROM Orders
ORDER BY OrderPrice;
هذا الاعلان سوف يعيد الـtop 10% من السجل في جدول الـOrders . مبنياً على حقل السعرOrderPrice field . اذا كنت قد امرت اعادة السجل بهذا الاعلانstatement بواسطة حقل الـOrderNum field , سوف تحصل على التtop 10% من السجل المبني على الـOrderNum , والتي من الممكن ان لا تكون منطقية تدخل العقل .
انها نقطة قيمة في حال كان هناك قيمة لحقل للـORDER BY المعين , حيث هناك فرصة التي تكون اكثر من الرغبة في الحصول رقم السجل سوف يتم اعادتها , لنفترض على سبيل المثال انني اردت على الـtop 10 parts المبنية على كمية كبيرة من الاوامر , اذا كان هناك 9 كميات كبيرة ومنفصلة من القيم في قمة القائمة واثتين اخريين تتبعها , بنفس القيمة . سوف احصل على 11 سجل بدلاً من الـ10 التي اردٌتها .نفس الشيء صحيح مع الـTOP p PERCENT format . اذا اردت تلقي الـtop 2% من السعر بواسطة استفهامي الشرطي my selection query . سوف اتبع الاعلان التالي :
SELECT TOP 2 PERCENT PartName
FROM Orders
ORDER BY PartPrice;
هذا المثال يعيد اسماء المواد المسعرة في الـtop 2% . اذا كان لديك مواد رقمية كلها بنفس السعر , يتم اعتبارها مادة واحدة . لذلك انا استطيع بسهولة تلقي المزيد من السجلات اكثر مما توقعت . انة ايضاً لمن الضروري ان تفهم لماذا تطلب متى تستخدم الـTOP predicate .عل سبيل المثال , انة لمن المحتمل ان تعتقد انة يمكنك الحصول على الـtop 10 customers بناءً على المال المنفق . لكن عليك ان تعين الحالة التي تريد ان تحددها لكي يتم جعلها على الحقل كـTotalMoneySpent ومقارنتها مع الـTotalOrderPrice .
يمكنك ايضاً جعل السجلات في مجموعة التي يتم اعادتها من الاستفهام بواسطة شرط الـGROUP BY في الـSELECT statement , كما يظهر في المثال التالي :
SELECT PartName, Count(PartName)
FROM Orders
WHERE (PartPrice > 10)
GROUP BY PartName;
اعلان التحديد هذا يجمع السجلات ويجعلها في مجموعات من جدول الـOrders التي يكون فيها قيم حقل الـPartPrice اكبر من 10 .
هذة السجلات يتم وضعها في مجموعات في حقل الـPartNum فقط , احصاء ارقام كل نموذج من الأجزاء المبيوعة المعادة . بكلمات اخرى ,نتيجة الـrecordset تحتوي على اسماء منفصلة من الاجزاء تكلف اكثر من 10$ واحصاء ارقام الاوامر لكل جزء .
وظيفة الاحصاء COUNT , في هذا المثال تدعى aggregate function وظيفة تجميع حاصل . وظائف تجميع الحاصل الاخرى تتضمن AVG,SUM,MAX,MIN ....ارجع للجدول A.4 .
مثال اخ لاستخدام وظيفة التaggregate كما يلي:
SELECT PartName, SUM(PartPrice)
FROM Orders
WHERE (PartPrice > 10)
GROUP BY PartName
HAVING (SUM(PartPrice
HAVING (SUM(PartPrice) > 1000) AND (PartName LIKE "WIDGET*");
هذا المثال يقدم شرط الـHAVING . هذا الشرط تظاهر بتشابة كبير مع شرط الـWHERE , توقع انة يقوم بأختبار الحالة الشرطية المعينة بعد حدوث عملية وضعها في مجموعة , بعكس شرط الـWHERE , التي تختبر الحالة الشرطية للسجل لكي يتم تضمينها في مجموعه . اعلان التحديد السابق يجمع اسماء الاجزاء المنفصلة المميزة وحاصلsum اجمالي سعر البيع من جدول الـOrders . حالة الشرط الوحيدة من اجل السجل لكي يتم تضمينة في هذة عملية التجميع هذةgrouping هي ان السعر لكل جزء يكون اكبر من 10 . بعد ان تكون المجموعات قد اُنشأت بواسطة الـJet Engine , فقط المجموعات بملخص اجمالي PartPrice التي هي اكثر من 1,000 يتم تضمينها . في اضافات لهذة الحالة الشرطية , يمكنك رؤية الاستخدام للـLIKE keyword . يمكنك استخدام الـLIKE keyword في أي مكان تستطيع ان تعيين فية الحالة الشرطية . الـLIKE تستخدم نموذج ملائم لتفحص أي الحقول يجب ان يضمن في نتيجة الـrecordset . في هذا المثال , فقط المجموعات بقيمة حقل الـPartName تبداءبمحرف الاستنباط WIDGET سيضمن في الـrecordset .
Joins الضم :
الضم وظيفة شائعة الاستخدام في الـSELECT statement . الضم يستخدم لانشأ علاقة مؤقتة بين الجداول عند القيام بالاستفهام . كما في المثال التالي :
SELECT ...
FROM table1 [LEFT | RIGHT] JOIN table2 ON (table1.fld1 CompOp table2.fld2)
الـ CompOp هو عامل مقارنة ( ارجع للجدول A.4 ) . الضم يفعل شرط الـ FROM للـ SELECT statementكما يظهر في الاعلان السابق.
الضم الايسر والضم الايمن هما مراة كل واحد للاخر في التعريف . الضم الايسر ( يدعى الضم الخارجي الايسر ) يتضمن جميع السجلات من جدول1 , حتى اذا لم توجد علاقة سجلات موجودة في الجدول 2 . الضم الايمن ( يدعى الضم الخارجي الايمن ) يضمن كل السجلات من جدول2 حتى اذا لم توجد علاقة سجلات في الجدول 1 , اتبع الاعلان التالي , على سبيل المثال :
SELECT Customers.*, Orders.*
FROM Customers LEFT JOIN Orders ON (Customers.CustNum = Orders.CustNum);
المثال السابق يعيد كل الحقول من جدول الزبائن وفقط الحقول من جدول الطلبات الـOrders المطابقة لحقول الـ CustNum. بكلمات اخرى نتيجة الـrecordset من هذا الاعلان يمكن ان يتضمن كل الزبائن والمعلومات على الطلبات لهؤلاء الزبائن الذين طلبوها .
لأنشأ ضم يعيد فقط السجلات التي تكون مضمنة في كلا الجدولين (الضم الداخلي ) , ليس بمقدورك استخدام شرط الـ JOIN على الاطلاق كما يظهر في المثال التالي :
SELECT Customers.*, Orders.*
FROM Customers, Orders
WHERE (Customers.CustNum = Orders.CustNum);
هذا الاعلان يمكنة ان يعيد recordset مختصر عوضاً عن الاعلان السابق ,وافتراض ان هناك زبائن لم يقوموا بتقديم طلبات , في اعلان التحديد هذا SELECT statement , هناك الزبائن اللذين وضعوا طلبات فقط هم المؤهلين لكي يتم اعادتهم الى الـrecordset . وبالرغم من انة من الضروري عمل ذلك , هناك شرط SQL لتعيين الضم الداخلي , كما يظهر في المثال التالي :
SELECT Customers.*, Orders.*
FROM Customers INNER JOIN Orders ON (Customers.CustNum = Orders.CustNum);
هذا الاعلان مساوي للذي سبقة , و في كثير من الحالات انة سهل في الحقيقة ان تقراء وتفهم بلمح البصر. ربما ايضاً تهتم بتعيين اكثر من حالة شؤط واحدة في أي واحدة من عمليات الضم , كما في المثال التالي :
SELECT Customers.*, Orders.*
FROM Customers INNER JOIN Orders
ON ((Customers.CustNum = Orders.CustNum)
AND (Customers.Flag = Orders.Flag));
اذا كنت حقيقة تريد ان تتجاوز , وفي كثير من الاوقات انت بحاجة الى ذلك , فيمكنك جعل الضم مع كل واحد من الاخريات كما يظهر في المثال التالي :
SELECT Customers.*, Orders.*, Tax.*
FROM Customers INNER JOIN
(Orders INNER JOIN Tax ON (Orders.State = Tax.State))
ON (Customers.CustNum = Orders.CustNum));
هذا الـ SELECT statement يعيد كل السجلات والتي يكون فيها ارقام الزبائن من جدول الزبائن و جدول الطلبات والحالة في جدول الطلبات وجدول الضرائب . يمكنك وضع ايضاً اما الضم الايسر او الايمن داخل الضم الداخلي INNER JOIN ,من ناحية اخرى , لا يمكنك وضع INNER JOIN داخل اما الـ LEFT JOIN or a RIGHT JOIN .
The INSERT Command
مر الادراج يستخدم في الـ INSERT INTO statement لانشأ استفهام ملحق , نموذج حدث الاستفهام . يمكنك استخدام الامر لاضافة rows مفرد او متعدد الى الجدول . نتبع المثال التالي لاضافة rows مفرد بأستخدام الـ INSERT INTO statement :
INSERT INTO table [(fld1[, fld2[, ...]])]
VALUES (val1[, val2[, ...])
استخدام هذا النحو , يمكنك اضافة rows مفرد الى الجدول . يجب ان تعين كل واحد من الحقول وقيمتة التي تريد ان تضيفها . اذا اردت ان تخرج من الحقل وقيمته المرسلة , قيمة الـ NULL تدرج بشكل تلقائي في الحقل , السجلات الجديدة تلحق في نهاية الجدول . اتبع لالمثال التالي حول كيف تضيف صف اوrow على جدول معين :
INSERT INTO Customers (CustNum, CustName)
VALUES (1, "Kimberly");
اذا كانت الحقول الاخرى في جدول الزبائن , وهي مفترضه لقيمة الـ NULL . اما المثال على اضافة rows متعددة يختلف قليلاً :
INSERT INTO table2 [(fld1[, fld2[, ...]])]
SELECT [table1.]fld1[, fld2[, ...]
FROM ...
هذا الاسلوب يأخذ تحديد معين من السجلات من الجدول 1 وادراجها في الجدول 2 . ارقام الحقول من اجل كلا الجدولين يجب ان تكون نفسها في الطلب الصحيح . المثال التالي يوضح الـ INSERT INTO statement :
INSERT INTO Delivered (CustNum, DelPart, PriceCharged)
SELECT CustNum, PartName, PartPrice
FROM Orders
WHERE (Delivered = True);
المثال يدرج كل الطلبات الواصلة من جدول الطلبات في حقل المراسلات من جدول الطلبات . الـ INSERT INTO statement يٌلحق السجل في نهاية الجدول الموجود , لكن يمكنك ايضاً استخدام اعلان و تحديد مشابهه للسجلات لاْنشأ جدول جديد , كما في المثال التالي:
SELECT CustNum, PartName, PartPrice
INTO DeliveredBackup
FROM Orders
WHERE (Delivered = True);
هذا المثال ينشأ جدول جديد يدعى DeliveredBackup , مع حقول و خصائص متطابقة لما هو مدرج في الحقول في شرط الـ SELECT من جدول الطلبات . الجدول الجديد سوف يتضمن كل السجلات مع قيمة حقل الـ Delivered الى true .
The UPDATE Command
امر التحديث UPDATE يستخدم لاعداد المعلومات الى الجدول الصحيح الى قيمة جديدة , اسلوب امر التحديث يكون على الشكل التالي :
UPDATE table
SET value
WHERE criteria
قيمة ال
كل عام وانت بخير
التبويب ( التصنيف ) الأول هو الـData Definition Language DDL لغة تعريف البيانات , وهو يستخدم لانشأ , تعديل , أو إزالة تعريف حقيقي في قاعدة بيانات محددة .
التبويب ( التصنيف ) الثاني هو الـData Manipulation Language DML لغة التعامل مع البيانات وهو يستخدم من اجل انشأ , تعديل , إزالة , وتجميع المعلومات التي تحتل بنية قاعدة البيانات . بكلمات أخرى , سوف تتمكن من استخدام الـDLL في انشأ الجداول والحقول , والفهارس , , سوف تستخدم الـDML في إحلال , استبدال , استعادة المعلومات التي تحتل الجداول والحقول .
الجدول A.1 فية سبعة أوامر SQL التي تكون أساسية في أي إعلان SQL :
COMMAND Classification De******ion
CREATE Definition Create a table, a field, or an index.
ALTER Definition Modify a table by adding a field or changing a field definition.
DROP Definition Drop a table or an index.
SELECT Manipulation Query a data**** with given parameters.
INSERT Manipulation Insert multiple records with one operation.
UPDATE Manipulation Change information throughout a range with given parameters.
DELETE Manipulation Remove records from the table.
هذة الأوامر تتحقق من نوع الاستفهام query في إعلان الـSQL . وفي الجدول السابق يوجد تبويب لكل أمر من الأوامر إما كونة DDL اوDML .
الـSQL command يستخدم الى جانب العناصر الاخرى من تصريح الـSQL statement وذلك لاٍنشأ اما فعل استفهام او استفهام محدد.
حدث الاستفهام Action query هي التي تبداء مع الـSQL statement عوضاً عن الـselect .
كما قد تخمن البداية مع الـselect هو selection query .
عندما تستخدم الاستفهام query سوف تستخدم شروط (مفرد شرط) مختلفة التي تنفذ في الـSQL statement .
في الجدول A.2 فية عدد من الشروط المتوفرة من اجل الـSQL تستخدم Microsoft Jet Engine (محرك =Engine , دفق=Jet )
CLAUSE De******ions
FROM Specifies the table from which data is queried
WHERE Specifies the condition(s) for the query
GROUP BY Specifies the group(s) for the selected information
HAVING Specifies the condition(s) for each group in the query
ORDER BY Specifies the order of the query
الشرط الاول من هذة الشروط هو , FORM , وهو يستخدم في يدل على الجدول او الاستفهام المستخدمة لتجميع المعلومات من اجل الـSQL statement . اكثر من واحد من واحد من الجداول او الاستفهام يمكن وضعها في الاعلان , بأستخدام الشرطFORM .
عندما تعمل ذلك فأنك تنشأ على الاقل ملحق واحد للاستفهام .
الملحق او المنضمjoin سيناقش لاحقاً في هذا الملحق .
الشرط الثاني , WHERE , يعبر عن الحالة التي يجب ان تكون ملائمة للسجل لكي يصبح مضمن في نتيجة الاستفهام .
كل واحد من هذة الحالات قادرة على استخدام عامل الشرط .
الحالات الشرطية المتعددةMultiple condition تستخدم العامل المنطقي logical operators .
الجدول A.3 يحوي الـconditional & logical المتوفرة :
OPERATOR TYPE Condition Is Met When
AND Logical Both expressions are true.
OR Logical Either expression is true.
NOT Logical The expression is false.
< Comparison The first expression is less than the second expression.
<= Comparison The first expression is less than or equal to the second expression.
> Comparison The first expression is greater than the second expression.
>= Comparison The first expression is greater than or equal to the second expression.
= Comparison The first expression is equal to the second expression.
<> Comparison The first expression is not equal to the second expression.
BETWEEN Comparison The value belongs to a specified set of values.
LIKE Comparison The value matches the pattern specified.
IN Comparison The record belongs to a particular group in a data****
شرط الـSQL الثالث , GROUP BY , وهو يستخدم لوضع نتائج الاستفهام في مجموعة .
الـGROUP BY يستخدم على الاقل اسم حقل واحد من الجدول او قائمة الاستفهام في اعلان الشرطFORM لكي يقيم السجل والمجموعة على انها قيم .
يمكنك ايضاً وظيفة تجميع الحاصل aggregate function في اعلان الـSQL لانشأ ملخص عن المجموعات في الـrecordset .
في الجدول A.4 هناك قائمة بوظائف تجميع الحاصل aggregate function :
AVG Returns the average value of a specified field
COUNT Returns the number of records in a query
SUM Returns the sum of the values in a specified field
MAX Returns the largest value in a specified field
MIN Returns the smallest value in a specified field
شرط الـSQL الرابع , HAVING , يعين الحالة الشرطية ( بنفس الطريقة المستخدمة مع شرط FORM ) المجموعات يجب ان تكون ملائمة لكي تتضمن نتائج الـrecordset .
شرط الـSQL الاخير , ORDER , يستخدم اسماء الحقول للامر باعداد النتيجة في اسلوب معين .
Data Definition Language لغة تعريف البيانات :
اعلانات الـDDL تستخدم لانشأ , استبدال و وازالة الجداول , الحقول , الفهارس من قاعدة البيانات .
اوامر الـSQL الثلاثة لعمل , CREATE , DROP ,ALTER كلها عبارة عن حدث استفهام Action query .
الـAction queries في الفيجوال بيسك يمكن استهلالها بأحدى طريقتين .
الطريقة الاولى في مناشدة الـaction query تكون بأستخدام الـQueryDef object .
الطريقة الثانية بأستخدام طريقة التنفيذ Execute method لقاعدة البيانات كالتالي :
db.Execute sSQLStatement
هذا يفترض ان الـdb هو مشروع قاعدة بيانات متغير تم اعدادة بنجاح الى قاعدة بيانات شرعية , والـ sSQLStatement هي string شرعية متغيرة تشمل حدث SQL statement شرعي .
The CREATE Command الامر المنشأ :
الامر المنشأ يستخدم لانشأ جدول وفهرس في قاعدة بيانات محددة , لكي تنشأ جدول في قاعدة بيانات معطاة , استخدم the CREATE TABLE statement على النحو التالي :
CREATE TABLE table (fld1 type [(sz)] [NOT NULL] [idx1] [, fld2 type [(sz)]
[NOT NULL] [idx2] [, ...]] [, CONSTRAINT MFidx [, ...]])
في السطور السابقة , اسم الجدول يُنجح اعلان انشأ الجدول ويتبع بـcomma-delimited list فاصلة محدودة لتعريف الحقل الذي استخدم لأنشأ جدول معين . على الاقل حقل واحد يجب ان يكون بين هلالين كما يظهر .
أي نموذج شرعي من قواعد البيانات يمكن استخدامة لكي يدل على نموذج الحقل لكي يتم انشائة , والحجم( SZ ) يمكن ان تعين من اجل النص في الحقول المزدوجة .
المثال التالي ينشأ جدول جديد في الـdb قاعدة البيانات مع ثلاثة حقول :
db.Execute "CREATE TABLE Customers (CustNum INTEGER, " _
& "CustName TEXT (25), Address TEXT (30))"
الحقل الجديد المنشأ يدعى Customers =الزبائن . يشمل على حقل عداد اسمة CustNum وحقلين نص اسمهما CustName &Address .
استخدام الـNOT NULL الثابتة اختيارية , يمكنك تعيين ان الحقل لايمكن ان يكون لدية قيمة NULL . اذا كانت الـNULL value
منسوبة الى الحقل المنشأ بهذا الخيار , فان خطاء سوف يظهر . المثال التالي هو تعريف لجدول محصن بشكل جيد :
db.Execute "CREATE TABLE Customers (CustNum INTEGER NOT NULL, " _
& "CustName TEXT NOT NULL (25), Address TEXT (30))"
نسخة الـ CREATE TABLE حدث استفهام يعين ان الارقام وقيمة حقل الـCustName لايمكن ان تحتوي على أي من قيم الـNULL
مع ذلك فان حقل الـAddress يمكن ان يكون محتوي عليها .
يمكنك ايضاً استخدام شرط التقييد CONSTRAINT clause في اعلان الـ CREATE TABLE لانشأ فهرس اما على حقل مفرد او حقول متعددة . المثال التالي ينشأ فهرس في جدول جديد :
db.Execute "CREATE TABLE Customers (CustNum INTEGER, " _
& "CustName TEXT (25), Address TEXT (30), " _
& "CONSTRAINT CustIndex UNIQUE (CustNum, CustName))"
هذا المثال انشأ جدول مع ثلاثة حقول كما ظهر قبلاً , لكنة ايضأ اضاف فهرس اسمة CustNumIndex
لاحظ ان الفهرس الجديد المنشأ بواسطة شرط الـ CONSTRAINT , اسمة CustIndex , يكون رابط الجأش في كلا الحقلين الـCustName & CustNum الموصفين في اعلان الـSQL .
الفرق بين انشأ فهرس حقل فردي واخر متعدد الحقول مع الـcreate table statement هو ان في الحقل الفردي يمكنك ان تدل على شرط الـCONSTRAINT التقييد , بعد اعطاء الحقل , بدون فاصلةcomma .
اما انشأ فهرس لحقول متعددة بشرط التقييدCONSTRAINT , فانك تعين الفهرس بعد ان انشأ الحقول في الفهرس .
كما سيظهر في المثال الاخير .
للمزيد من المعلومات عن شرط التقييد CONSTRAINT ستجدها في " Using the CONSTRAINT Clause "
ليس من الضروري ان تقوم بأنشأ الفهرس في الـCREATE TABLE STATEMENT --- يمكنك ايضاً انشأ الفهرس في باستخدام
الـCREATE INDEX STATEMENT كما في المثال التالي :
db.Execute "CREATE UNIQUE INDEX CustIndex ON Customers (CustNum, CustName)"
هذا الاعلان يؤدي الى نفس النتيجة المستمدة من الـCREATE TABLE statement
الاسلوب ( النحو syntax ) المتبع من اجل الـCREATE INDEX statement كالتالي :
CREATE [UNIQUE] INDEX idx ON table (fld1 [ASC|DESC]
[, fld2 [ASC|DESC], ...])
[WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]
عندما تستخدم الـCREATE INDEX statement , فانك تعين خيار الـUNIQUE كما في المثال السابق ,
فانت تخبر الـJet Engine انة لا يوجد مجموعين , من اجل قيم الحقول المدرجة , التي اصبحت مسموح بها , هكذا تنشأ الـunique index فهرس فردي على الحقول .
بشكل افتراضي فان الفهارس يتم انشائها بامر صاعدASC Keyword , لكن يمكنك ان تعيين قائمة الاوامر للقيم في الفهرس بأمر نازل
بأستخدام DESC Keyword بعد ارسال اسم الحقل .
القسم الاخير من الـ CREATE INDEX statement يسمح لك ان تعين , بشكل اكثر تفصيلاً , كيف يمكن التعامل مع الفهرس .
يمكنك عمل هذا بواسطة الشرط الـ WITH للـCREATE INDEX statement . لاْنشا مفتاح اساسي في في الجدول , استخدم الـWITH PRIMARY statement .
الاعلان ينشأ فهرس فريد unique index الذي هو الان مفتاح اساسي . فقط مسموح بمفتاح اساسي واحد في الجدول ومحاولة انشأ واحد اخر ستؤل الى ظهور رسالة خطاء .
يمكنك ايضاً منع استخدام قيمة الـNULL في الفهرس بواسطةWITH DISALLOW NULL statement او يمكنك السماح لقيمة الـNULL
بواسطة الـWITH IGNORE NULL statement .
The ALTER Command امر الاستبدال :
الامر الثاني المنتمي للـSQL DDL . يمكنك ايضاً استخدام الـALTER TABLE statement لاكمال اربعة مهام كاملة ومنفصلة .
• Add a new field to a table.
• Delete a field from a table.
• Add a new index to a table.
• Delete an index from a table.
يمكنك اضافة او ازالة فقط حقل واحد او فهرس واحد لكل واحد من الـALTER TABLE statement . النحو الذي يقوم علية الـALTER TABLE statement كالتالي :
ALTER TABLE table {ADD {COLUMN fld type[(size)] [NOT NULL] [CONSTRAINT idx]
| CONSTRAINT MFidx} | DROP {COLUMN fld | CONSTRAINT indexname}}
المثال التالي ينشأ حقل جديد في الجدول الموجود والمسمى Customers :
db.Execute "ALTER TABLE Customers ADD COLUMN PhoneNum TEXT (12)"
تماما كما يمكنك اضافة حقل الى الجدول يمكنك ازالتة منة , كما في المثال التالي :
db.Execute "ALTER TABLE Customers DROP PhoneNum"
يمكنك ايضاً تعيين فهارس جديدة تماماً كما فعلت مع الـCREATE TABLE , وتوقع انة يمكنك اضافة فهرس بعد ان يكون الجدول يكون منشأ اصلا ً كما يظهر في التالي :
db.Execute "ALTER TABLE Customers " _
& "ADD CONSTRAINT NameAndPhoneIndex (CustName, PhoneNum)"
الان يمكنك ازالة الفهرس بهذا المثال النهائي :
db.Execute "ALTER TABLE Customers DROP CONSTRAINT NameAndPhoneIndex"
Using the CONSTRAINT Clause استخدام شرط التقييد :
حتى الان لقد رايت ان شرط التقييد موجود في كلا الـCREATE & ALTER SQL command .
الان القي نظرة قريبة على هذا الشرط واكتشف مدى قوتة . في شكله غير المركب , فان الـconstraint هو فهرس , ليس فقط شرط التقييد هو السماح لك بأنشأ او ازالة الفهارس كما يظهر في قطاعي الـ CREATE & ALTER command , لكنة ايضاً يسمح لك بانشأ مفتاح اساسي & foreign key لتعريف العلاقة و يؤكد صلة الوحدات . كما ظهر مؤخراً , بالمثال السابق , هناك نسختين من الـCONSTRAINT statement , واحد من اجل فهارس الحقول الفردية , والثاني من اجل فهارس الحقول المتعددة . بالنسبة للحقل الواحد كما يظهر في التالي :
CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreigntable
[(foreignfield1, foreignfield2)]}
اما من اجل فهرس الحقول المتعددة هو هذا :
{PRIMARY KEY (primary1[, primary2 [, ...]]) |
UNIQUE (unique1[, unique2 [, ...]]) |
NOT NULL (notnull1[, notnull2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]])
REFERENCES foreigntable
[(foreignfield1 [, foreignfield2 [, ...]])]}
اسم الفهرس لكي يتم انشائة , يتم تعيينة مباشرة بعد الـ CONSTRAINT keyword . في نسخة اخرى يمكنك انشأ ثلاثة نماذج من الفهارس :
*A UNIQUE index , هذا الفهرس المفرد ليس لدية حقلين ,كما يدلل على ذلك في شرط التقييد , بنفس القيمة .
*A PRIMARY KEY index , هو مفتاح اساسي , بواسطة التعريف , والـunique . هذا يعني ان كل الحقول تضمن في تعريف المفتاح الاساسي الذي يجب ان يكونunique .
*A FOREIGN KEY index . مفتاح الـforeign هو فهرس يستخدم جدول اخر من اجل انشأ فهرس على الجدول الصحيح .
يمكنك انشأ foreign key لاْنشأ علاقة بين حقول متعددة كما في المثال التالي :
db.Execute "ALTER TABLE Customers " _
& "ADD CONSTRAINT NewIndex " _
& "FOREIGN KEY (CustNum) REFERENCES Orders (CustNum)"
هذا المثال ينشأ علاقة بين جدول الـCustomers وجدول الـOrders لمشروع قاعدة البيانات . فهرس جديد تم انشائة , NewIndex , الذي يربط قاعدة الجدولين علىاسم حقل CustNum .
The DROP Command امر الانسدال :
The DROP command يأتي بنكهتين : DROP TABLE وDROP INDEX كما يمكن ان تخمن ببساطة , الـthe DROP TABLE statement
يزيل الجدول الموجود من قاعدة البيانات كما يظهر هنا :
db.Execute "DROP TABLE Customers"
The DROP INDEX statement تعمل بشكل مشابة DROP TABLE statement , ما عدا ان ذلك يزيل الفهرس من الجدول المعطى كما في المثال التالي :
db.Execute "DROP INDEX CustNumIndex ON Customers"
للذكر , تصرف الـDROP command يكون كالتالي:
DROP {TABLE table | INDEX idx ON table}
Data Manipulation Language لغة التعامل مع البيانات DML :
اوامر الـDML تعمل مزيج من الاحداث والاستفهامات المحددات .الاوامر SELECT, INSERT, UPDATE, and DELETE تستخدم من اجل تسريع وتفعيل اداء الـJet Engine , والتعامل مع احلال البيانات في جداول معينة .
The SELECT Command:
هذا الامر يختلف عن كل الاوامر الاخرى في الـSQL مع انة جزء من تحديد الاستفهام او بالاحرى حدث استفهام . عندما تستخدم تحديد الاستفهام في تطبيقات الفيجوال بيسك , انة لمن الشائع في الـrecordset لقاعدة البيانات المعطاة . على افتراض ان الـrs هو اختصار الـrecordset الشرعي والـdb هو اختصار قاعدة البيانات التي هي في الاصل معدة على انها ملف قاعدة البيانات الشرعية , يمكنك استخدام الاعلان التالي لتجميع كل الـrecordset في جدول التCustomers لاختصار الـdb :
Set rs = db.OpenRecordset("SELECT * FROM Customers")
المثال يستخدم اغلب صفات وشكل القاعدة في الـ SELECT statement . هذا القسم سوف يوضح لك العناصر المختلفة من الـSELECT statement ويصور كيف يمكن للمبرمج ان يستخدم كل واحدة من المحتويات بأسلوب فعال وتنقية filter السجلات حسب حاجتة .
مثال على الـSELECT statement :
SELECT [predicate]
{ * | table.* |
[table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...] [IN externaldata****]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
انة سهل الفهم للغاية لكي تغمر بهذا التصريح , لكن ليس كل الشرط مضمنة في هذا المثال ان تكون مستخدمة بجانب بعضها ---مع انة من الممكن ان تكون كذلك :
خذ هذا المثال فرضاً :
SELECT DISTINCT CUSTNUM, CUSTNAME
FROM Customers
WHERE (CustNum >= 100) AND (CustNum <= 120)
ORDER BY CustName;
هذا الاعلان statement يسترد فقط حقلي الـCustNum & CustName من جدول الزبائن . شرط الـWHERE في هذا الاعلان يظهر حالتين شرطيتين . الحالة الاولى تقول ان قيمة حقل الـCustNum يجب ان تكون اكبر او تساوي 100 . الحالة الثانية تقرر ان قيمة حقل الـcustNum يجب ان اقل او تساوي 120 . حتى الان , يمكنك رؤية ان اعلان الـselect يظهر انة سوف يسرع من اعادة الـCustNum والـCustName من اجل كل السجلات مع ارقام الزبائن بين 100-120 . الجزء الاخير من هذا الاعلان هو امر اعادة السجل بواسطة الاستفهام بواسطة حقل الـCustName بكلمات اخرى , في اساسيات الامر. يمكنك ايضاً طلب السجلات لكي يتم اعادتها returned في اساسيات الامر بواسطة وضع الـDESC Keyword بعد الشرط الـORDER BY CustName .
يمكنك ايضاً استخدام حالات الشرط المتعددة في الـSELECT statement كما يظهر في هذا الاعلان . من اجل قائمة كاملة من عوامل حالات الشرط operators conditions , كلا هما منطقيان ومتوازيان , القي نظرة على الجدولA.4 في بداية هذا القسم .
انة لمن المهم ملاحظة ان الـDISTINCT keyword تتبع امر الــSELECT الذي يدعى اعلان او تصريح . هذة الـKeyword تدل على انة هناك جمع من الحقول المفردة unique مميزة سوف يتم اعادتها . في هذا المثال , اذا كان لديك ثلاثة سجلات في جدول الزبائن بنفس ارقام واسماء الزبائن , لكن بعنوان مختلف , لكن سجل واحد سوف يمكن اعادتة . اذا كنت قد اضفت حقل العنوانAddress field في قائمة الحقول في اعلان التحديد SELECT statement , سوف تتلقى لكل سجل معاد , نفس رقم الزبون نفس الاسم , لأن الجمع للـ(الرقم , الاسم والعنوان ) كان مفردUNIQUE لكل سجل معاد .
DISTINCT keyword ليست التصريح الوحيد المتوفر في الـSELECT statement . في الجدول A.5 سنورد الخمسة تصريحات المتوفرة في الـSELECT statement :
PREDICATE De******ion
ALL Returns all records, even duplicates
DISTINCT Returns only unique records, ****d on fields specified in the statement
DISTINCTROW Returns only unique records, ****d on all fields in the specified table(s), even those not listed in the SELECT statement
TOP Returns the first n records or the top p percentage of records of the selected recordset
التصريح الافتراضي المستخدم في الـSELECT statements لا يصرح عن الكل , كلها تعيد السجلات التي تلاقي حالات الشرط للـselection query . التصريح TOP يستخدم في ارتباط مع الـORDER BY clause في الـSELECT statement . يمكن استخدامة بأحدى طريقتين:
*TOP n يعيد السجل n الاول .
*TOP p PERCENT يعيد النسبة المئوية لكامل السجل .
اتبع المثال التالي لتصريح الـTOP (TOP predicate ) :
SELECT TOP 10 PERCENT OrderNum, OrderPrice
FROM Orders
ORDER BY OrderPrice;
هذا الاعلان سوف يعيد الـtop 10% من السجل في جدول الـOrders . مبنياً على حقل السعرOrderPrice field . اذا كنت قد امرت اعادة السجل بهذا الاعلانstatement بواسطة حقل الـOrderNum field , سوف تحصل على التtop 10% من السجل المبني على الـOrderNum , والتي من الممكن ان لا تكون منطقية تدخل العقل .
انها نقطة قيمة في حال كان هناك قيمة لحقل للـORDER BY المعين , حيث هناك فرصة التي تكون اكثر من الرغبة في الحصول رقم السجل سوف يتم اعادتها , لنفترض على سبيل المثال انني اردت على الـtop 10 parts المبنية على كمية كبيرة من الاوامر , اذا كان هناك 9 كميات كبيرة ومنفصلة من القيم في قمة القائمة واثتين اخريين تتبعها , بنفس القيمة . سوف احصل على 11 سجل بدلاً من الـ10 التي اردٌتها .نفس الشيء صحيح مع الـTOP p PERCENT format . اذا اردت تلقي الـtop 2% من السعر بواسطة استفهامي الشرطي my selection query . سوف اتبع الاعلان التالي :
SELECT TOP 2 PERCENT PartName
FROM Orders
ORDER BY PartPrice;
هذا المثال يعيد اسماء المواد المسعرة في الـtop 2% . اذا كان لديك مواد رقمية كلها بنفس السعر , يتم اعتبارها مادة واحدة . لذلك انا استطيع بسهولة تلقي المزيد من السجلات اكثر مما توقعت . انة ايضاً لمن الضروري ان تفهم لماذا تطلب متى تستخدم الـTOP predicate .عل سبيل المثال , انة لمن المحتمل ان تعتقد انة يمكنك الحصول على الـtop 10 customers بناءً على المال المنفق . لكن عليك ان تعين الحالة التي تريد ان تحددها لكي يتم جعلها على الحقل كـTotalMoneySpent ومقارنتها مع الـTotalOrderPrice .
يمكنك ايضاً جعل السجلات في مجموعة التي يتم اعادتها من الاستفهام بواسطة شرط الـGROUP BY في الـSELECT statement , كما يظهر في المثال التالي :
SELECT PartName, Count(PartName)
FROM Orders
WHERE (PartPrice > 10)
GROUP BY PartName;
اعلان التحديد هذا يجمع السجلات ويجعلها في مجموعات من جدول الـOrders التي يكون فيها قيم حقل الـPartPrice اكبر من 10 .
هذة السجلات يتم وضعها في مجموعات في حقل الـPartNum فقط , احصاء ارقام كل نموذج من الأجزاء المبيوعة المعادة . بكلمات اخرى ,نتيجة الـrecordset تحتوي على اسماء منفصلة من الاجزاء تكلف اكثر من 10$ واحصاء ارقام الاوامر لكل جزء .
وظيفة الاحصاء COUNT , في هذا المثال تدعى aggregate function وظيفة تجميع حاصل . وظائف تجميع الحاصل الاخرى تتضمن AVG,SUM,MAX,MIN ....ارجع للجدول A.4 .
مثال اخ لاستخدام وظيفة التaggregate كما يلي:
SELECT PartName, SUM(PartPrice)
FROM Orders
WHERE (PartPrice > 10)
GROUP BY PartName
HAVING (SUM(PartPrice
HAVING (SUM(PartPrice) > 1000) AND (PartName LIKE "WIDGET*");
هذا المثال يقدم شرط الـHAVING . هذا الشرط تظاهر بتشابة كبير مع شرط الـWHERE , توقع انة يقوم بأختبار الحالة الشرطية المعينة بعد حدوث عملية وضعها في مجموعة , بعكس شرط الـWHERE , التي تختبر الحالة الشرطية للسجل لكي يتم تضمينها في مجموعه . اعلان التحديد السابق يجمع اسماء الاجزاء المنفصلة المميزة وحاصلsum اجمالي سعر البيع من جدول الـOrders . حالة الشرط الوحيدة من اجل السجل لكي يتم تضمينة في هذة عملية التجميع هذةgrouping هي ان السعر لكل جزء يكون اكبر من 10 . بعد ان تكون المجموعات قد اُنشأت بواسطة الـJet Engine , فقط المجموعات بملخص اجمالي PartPrice التي هي اكثر من 1,000 يتم تضمينها . في اضافات لهذة الحالة الشرطية , يمكنك رؤية الاستخدام للـLIKE keyword . يمكنك استخدام الـLIKE keyword في أي مكان تستطيع ان تعيين فية الحالة الشرطية . الـLIKE تستخدم نموذج ملائم لتفحص أي الحقول يجب ان يضمن في نتيجة الـrecordset . في هذا المثال , فقط المجموعات بقيمة حقل الـPartName تبداءبمحرف الاستنباط WIDGET سيضمن في الـrecordset .
Joins الضم :
الضم وظيفة شائعة الاستخدام في الـSELECT statement . الضم يستخدم لانشأ علاقة مؤقتة بين الجداول عند القيام بالاستفهام . كما في المثال التالي :
SELECT ...
FROM table1 [LEFT | RIGHT] JOIN table2 ON (table1.fld1 CompOp table2.fld2)
الـ CompOp هو عامل مقارنة ( ارجع للجدول A.4 ) . الضم يفعل شرط الـ FROM للـ SELECT statementكما يظهر في الاعلان السابق.
الضم الايسر والضم الايمن هما مراة كل واحد للاخر في التعريف . الضم الايسر ( يدعى الضم الخارجي الايسر ) يتضمن جميع السجلات من جدول1 , حتى اذا لم توجد علاقة سجلات موجودة في الجدول 2 . الضم الايمن ( يدعى الضم الخارجي الايمن ) يضمن كل السجلات من جدول2 حتى اذا لم توجد علاقة سجلات في الجدول 1 , اتبع الاعلان التالي , على سبيل المثال :
SELECT Customers.*, Orders.*
FROM Customers LEFT JOIN Orders ON (Customers.CustNum = Orders.CustNum);
المثال السابق يعيد كل الحقول من جدول الزبائن وفقط الحقول من جدول الطلبات الـOrders المطابقة لحقول الـ CustNum. بكلمات اخرى نتيجة الـrecordset من هذا الاعلان يمكن ان يتضمن كل الزبائن والمعلومات على الطلبات لهؤلاء الزبائن الذين طلبوها .
لأنشأ ضم يعيد فقط السجلات التي تكون مضمنة في كلا الجدولين (الضم الداخلي ) , ليس بمقدورك استخدام شرط الـ JOIN على الاطلاق كما يظهر في المثال التالي :
SELECT Customers.*, Orders.*
FROM Customers, Orders
WHERE (Customers.CustNum = Orders.CustNum);
هذا الاعلان يمكنة ان يعيد recordset مختصر عوضاً عن الاعلان السابق ,وافتراض ان هناك زبائن لم يقوموا بتقديم طلبات , في اعلان التحديد هذا SELECT statement , هناك الزبائن اللذين وضعوا طلبات فقط هم المؤهلين لكي يتم اعادتهم الى الـrecordset . وبالرغم من انة من الضروري عمل ذلك , هناك شرط SQL لتعيين الضم الداخلي , كما يظهر في المثال التالي :
SELECT Customers.*, Orders.*
FROM Customers INNER JOIN Orders ON (Customers.CustNum = Orders.CustNum);
هذا الاعلان مساوي للذي سبقة , و في كثير من الحالات انة سهل في الحقيقة ان تقراء وتفهم بلمح البصر. ربما ايضاً تهتم بتعيين اكثر من حالة شؤط واحدة في أي واحدة من عمليات الضم , كما في المثال التالي :
SELECT Customers.*, Orders.*
FROM Customers INNER JOIN Orders
ON ((Customers.CustNum = Orders.CustNum)
AND (Customers.Flag = Orders.Flag));
اذا كنت حقيقة تريد ان تتجاوز , وفي كثير من الاوقات انت بحاجة الى ذلك , فيمكنك جعل الضم مع كل واحد من الاخريات كما يظهر في المثال التالي :
SELECT Customers.*, Orders.*, Tax.*
FROM Customers INNER JOIN
(Orders INNER JOIN Tax ON (Orders.State = Tax.State))
ON (Customers.CustNum = Orders.CustNum));
هذا الـ SELECT statement يعيد كل السجلات والتي يكون فيها ارقام الزبائن من جدول الزبائن و جدول الطلبات والحالة في جدول الطلبات وجدول الضرائب . يمكنك وضع ايضاً اما الضم الايسر او الايمن داخل الضم الداخلي INNER JOIN ,من ناحية اخرى , لا يمكنك وضع INNER JOIN داخل اما الـ LEFT JOIN or a RIGHT JOIN .
The INSERT Command
مر الادراج يستخدم في الـ INSERT INTO statement لانشأ استفهام ملحق , نموذج حدث الاستفهام . يمكنك استخدام الامر لاضافة rows مفرد او متعدد الى الجدول . نتبع المثال التالي لاضافة rows مفرد بأستخدام الـ INSERT INTO statement :
INSERT INTO table [(fld1[, fld2[, ...]])]
VALUES (val1[, val2[, ...])
استخدام هذا النحو , يمكنك اضافة rows مفرد الى الجدول . يجب ان تعين كل واحد من الحقول وقيمتة التي تريد ان تضيفها . اذا اردت ان تخرج من الحقل وقيمته المرسلة , قيمة الـ NULL تدرج بشكل تلقائي في الحقل , السجلات الجديدة تلحق في نهاية الجدول . اتبع لالمثال التالي حول كيف تضيف صف اوrow على جدول معين :
INSERT INTO Customers (CustNum, CustName)
VALUES (1, "Kimberly");
اذا كانت الحقول الاخرى في جدول الزبائن , وهي مفترضه لقيمة الـ NULL . اما المثال على اضافة rows متعددة يختلف قليلاً :
INSERT INTO table2 [(fld1[, fld2[, ...]])]
SELECT [table1.]fld1[, fld2[, ...]
FROM ...
هذا الاسلوب يأخذ تحديد معين من السجلات من الجدول 1 وادراجها في الجدول 2 . ارقام الحقول من اجل كلا الجدولين يجب ان تكون نفسها في الطلب الصحيح . المثال التالي يوضح الـ INSERT INTO statement :
INSERT INTO Delivered (CustNum, DelPart, PriceCharged)
SELECT CustNum, PartName, PartPrice
FROM Orders
WHERE (Delivered = True);
المثال يدرج كل الطلبات الواصلة من جدول الطلبات في حقل المراسلات من جدول الطلبات . الـ INSERT INTO statement يٌلحق السجل في نهاية الجدول الموجود , لكن يمكنك ايضاً استخدام اعلان و تحديد مشابهه للسجلات لاْنشأ جدول جديد , كما في المثال التالي:
SELECT CustNum, PartName, PartPrice
INTO DeliveredBackup
FROM Orders
WHERE (Delivered = True);
هذا المثال ينشأ جدول جديد يدعى DeliveredBackup , مع حقول و خصائص متطابقة لما هو مدرج في الحقول في شرط الـ SELECT من جدول الطلبات . الجدول الجديد سوف يتضمن كل السجلات مع قيمة حقل الـ Delivered الى true .
The UPDATE Command
امر التحديث UPDATE يستخدم لاعداد المعلومات الى الجدول الصحيح الى قيمة جديدة , اسلوب امر التحديث يكون على الشكل التالي :
UPDATE table
SET value
WHERE criteria
قيمة ال
كل عام وانت بخير