بحث مخصص من جوجل فى أوفيسنا
Custom Search
|
-
Posts
319 -
تاريخ الانضمام
-
تاريخ اخر زياره
نوع المحتوي
المنتدى
مكتبة الموقع
معرض الصور
المدونات
الوسائط المتعددة
مشاركات المكتوبه بواسطه أبو امين
-
-
ما شاء الله عليك يا دكتور و الله مبدع : شكرا جزيلا على المساعدة جعلها الله في ميزان حسناتك
ذعوة خير تونسية : " الله يستر حالك و يعطيك الخير "
-
استاذي الكريم طبقت الكود مثلما ذكر لكن اولا
1/ المكتبة التي ذكرتها لم اجدها و انما وجدت المكتبة التالية المبينة بالصورة
2/ عندما اردت استيراد الحقول ظهر هذا الخطا
مع العلم انني مثبت الاكساس 2010 على حاسوبي بنظام 32 بايت
و اشتغل على اكسيس 2007
شكرا
-
يا اللله بارك الله فيك : سواء استطعت التطبيق ام لا المهم اشكرك جزيل الشكر على سرعة الرد و ان شاء الله في ميزان حسناتك .
سانكب على تطبيق الاكواد و اوافيك بالنتيجة يا غالي
-
-
في 16/5/2022 at 20:16, ابا عمرو said:
الاساتذة أعضاء المنتدى الكرام / السلام عليكم ورحمة الله
لدي قاعدة بيانات اكسس 2003 تم انشاءها منذ فترة طويلة جدا
في اسماء الحقول في الجدول قمت بتسجيل الاسماء باللغة الانجليزية
وفي الخصائص قمت بتسجيل في تسمية توضيحة بالاسماء العربية لكل حقل
المشكلة عند تصدير الجدول في جداول اكسل تظهر عناوين بعض الحقول باللغة الاجنبية
المطلوب تحويل اسماء الاعمدة عند تصدير الجداول الى اكسل تظهر باللغة العربية في الاكسل
علما بأن بعض اسماء هذه الاعمدة تظهر باللغة العربية وذلك منذ انشائها قديما (وبنفس الطريقة) ولم أنجح حاليا في تحويل جميع الحقول باللغة العربية لاني نسيت كيف تم تحويلها سابقا الى اللغة العربية في جداول اكسل
وجزاكم الله خيراالسلام عليكم و رحمة الله و بركاته هذه صورة تبين لك كيفية جعل تسمية الحقول بالعربية انظر للون الاصفر : تسمية class تسمية الحقل في الجدول ثم انظر اسفل الصورة اللون الاصفر امام كلمة legend اكتب التسمية بالعربية و ستظهر لك ان شاء الله في الاكساس بالعربية
-
السلام عليكم و رحمة الله و بركاته اساتذتي الافاضل هذا بالنسبة لاستيراد جدول كامل من الاكسال الى الاكساس :
و في عندما اريد جلب حقل او اثنين فقط من جدول اكسال لاضافتهما الى جدول موجود بالاكسيس
مثال :
لي جدول على الاكسال يحتوي على :
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
و جدول على الاكسيس يحتوي
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
5/ القسم
6/ المنحة
7/ الحالة
لكنني اريد جلب الحقول التالية من الاكسال و اضافتها مكان نفس الحقول في الاكسيس :
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
حيث ياخذ حقل :
( الاسم و اللقب) من جدول الاكسال مكان حقل (الاسم و اللقب) بجدول الاكسيس
( تاريخ الولادة) من جدول الاكسال مكان حقل (تاريخ الولادة) بجدول الاكسيس
( الجنس ) من جدول الاكسال مكان حقل (الجنس ) بجدول الاكسيس
و هكذا دواليك
شكرا على كل حال و على المساعدة و النصح و الارشاد الذي تقدمونه لكل مبتدئ بهذا المنتدى الرائع
-
السلام عليكم و رحمة الله و بركاته اساتذتي الافاضل هذا بالنسبة لاستيراد جدول كامل من الاكسال الى الاكساس :
و في عندما اريد جلب حقل او اثنين فقط من جدول اكسال لاضافتهما الى جدول موجود بالاكسيس
مثال :
لي جدول على الاكسال يحتوي على :
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
و جدول على الاكسيس يحتوي
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
5/ القسم
6/ المنحة
7/ الحالة
لكنني اريد جلب الحقول التالية من الاكسال و اضافتها مكان نفس الحقول في الاكسيس :
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
حيث ياخذ حقل :
( الاسم و اللقب) من جدول الاكسال مكان حقل (الاسم و اللقب) بجدول الاكسيس
( تاريخ الولادة) من جدول الاكسال مكان حقل (تاريخ الولادة) بجدول الاكسيس
( الجنس ) من جدول الاكسال مكان حقل (الجنس ) بجدول الاكسيس
و هكذا دواليك
شكرا على كل حال و على المساعدة و النصح و الارشاد الذي تقدمونه لكل مبتدئ بهذا المنتدى الرائع
-
في 4/1/2004 at 03:40, Alhaithm said:
الأخوة الأعزاء
تحياتي وتقديري لكم على جهودكم
بالرغم من أنكم لم توفقوا في الإجابة أو فهم ما أريد.
وقد وجدت الجواب وانتهت المشكلة ، شكرا ، شكرا ، شكرا.
مادام من الله سبحانه و تعالى عليك بالاجابة افدنا بها حتى نتمكن من التعلم و شكرا حتى لا نكون من المستهلكين فقط ههههههه
-
استاذي الكريم جربت الملف الذي ارسلته لفتح ملف وورد لكنه بفتح ملف فارغ
-
كيفية تحويل ملف أكسيس ( Accde ) إلى ملف تنفيذى ( exe )
نظرا لطلبات الاخوة المتابعين للمنتدى اردت نقل هذا البرنامج للاستفادة منه
طريقة تحويل ملف قاعدة بيانات الأكسيس ( Microsoft access ) الى ملف تنفيذى :
1- أولا قم بفتح الملف المراد تحويله لملف تنفيذى ، ثم إذهب إلى أدوات قاعدة البيانات ( Data Base tools ) وإضغط على ( Make accde ) ، وإذا كنت من مستخدمى اوفيس 2010 ، ستجد زر ( Make accde ) فى القائمة الرئيسية للبرنامج داخل صفحة حفظ بالإسم .
2- ثانيا : عند الإنتهاء من قاعدة البيانات ، يجب عليك حفظها حتى تقوم بتحويل لملف accde ، قم بحفظها فى الفولدر المطلوب .
3- ثالثا : بعد حفظ قاعدة البيانات ، سيتطلب تنزيل برنامج خاص بالتحويل الى صيغة exe ، وهو برنامج inno setup من اللينك التالى : www.jrsoftware.org
4- رابعا : قم بتنزيل البرنامج وتسطيبه كاملا وحسب الإعدادات الموصى بها فى الفيديو المرفق .
5- خامسا : قم بفتح البرنامج وإختار ( الآن انقر على إنشاء ملف نصي جديد باستخدام المعالج النصي.) أو ( Create a new script file using script wizard. ) من الصفحة التى تظهر أمامك ، ثم حدد معلومات الناشر ، ونسخة البرنامج والتى يتم تحديدها ب ( 1.0 ) وموقع الناشر أو قاعدة البيانات ، ثم إضغط التالى .
6-سادسا : إضافة ملفات التطبيق: الآن سوف تكون هناك حاجة لتحديد الملفات التطبيق، ولكن في حالتنا ليس لدينا أي حاجة لذلك ، دعونا نختار الخيار 2 وانقر “إضافة ملفات”.
7- سابعا : تحديد موقع الملف ACCDE .
8 – ثامنا : إستكمال المعالج ( wizard ) ، وبعد إعطاء المعلومات اللازمة ، أنهى العملية .
9 – تاسعا : – فحص الملف التنفيذي : يجب بعد إنشاء الملف التنفيذى معاينته وتسطيبه وحفظ مسار التسطيب لديه .
10 – عاشرا : التحقق من نتيجة التثبيت : بعد انتهاء التثبيت، يصبح بإستطاعتنا تصفح مجلد التثبيت لدينا، وهناك يمكننا أن نرى ملف ACCDE .
البرنامج بالرابط :
https://drive.google.com/file/d/1U_J3bso-9WI2pyWKtwRdqKqtvoZ9HTqD/view?usp=sharing
-
الان, محمد احمد لطفى said:
مشكور استاذ : محمد احمد لطفى على المعلومة القيمة : بارك الله فيك
تابعت المثال وهو حل جيد التحويل من :
DD/MM/YYYY الى YYYY/MM/DD حتى يصبح التاريخ مقروء بالعربي
- 2
- 1
-
- 4
- 1
-
في 10/2/2022 at 14:11, Ahmed_J said:
السلام عليكم
توجد اكثر من طريقة لاستيراد ملفات الاكسل الى الاكسس
احدى هذه الطرق هذا الملف لاحد الاخوة بالموقع
اول شيء تختار مسار الملف
ثاني شيء تختار اسم ورقة العمل من القائمة المنسدلة تحت مسار الملف
ثالث شيء تضغط على البيانات من ملف اكسل
اتمنى ان يكون المطلوب
ما شاء الله شكرا كثيرا على هذا المثال الرائع
- 1
-
شكرا اخي نريد رد الجميل بالبحث و التجميع و النشر حتى يستفاد كل مبتدئ مثلي لاني عانيت الامرين كلما اردت البحث عن معلومة معينة
- 1
-
Structured Query Language
لغة الاستعلام البنوية
SQL
الكتاب منقول للامانة : عمار دربالي
SQL
SQL هي اختصارٌ للعبارة Structured Query Language (أي لغة الاستعلام البنوية)، وهي اللغة المستخدمة لإجراء عمليات على قواعد البيانات، بما في ذلك إضافة أو تحديث أو حذف البيانات من قاعدة البيانات، أو لتعديل بينة قاعدة البيانات نفسها.
محتويات
o 3.4الاستعلامات الفرعية Subqueries
o 4.6الحصول على عدد محدد من النتائج
o 4.7إدخال السجلات للجدول INSERT
o 4.8حذف السجلات من الجدول DELETE
o 6.2النتائج المتمايزة DISTINCT
o 6.3التأكد من وجود سجل EXISTS
o 6.5المعاملات المنطقية AND, OR, NOT
o 6.6معاملات المجال IN, BETWEEN
o 6.7معاملات الضم UNION, INTERSECT, EXCEPT
o 6.8معاملات المقارنة ALL, SOME, ANY
o 8.2أمر بدأ العمليات START TRANSACTION
o 9.1إنشاء المستخدم CREATE USER
o 9.2تعديل المستخدم ALTER USER
o 10.1إنشاء الفهرس CREATE INDEX
o 10.2تعديل الفهرس ALTER INDEX
o 11.1إنشاء قاعدة البيانات CREATE DATABASE
o 11.2حذف قاعدة البيانات DROP DATABASE
o 12.1مفاتيح الجداول Table Keys
o 12.2إنشاء الجدول CREATE TABLE
o 13.1بعض الدوال المساعدة في SQL
o 13.2إنشاء الدالة CREATE FUNCTION
o 13.3تعديل الدالة ALTER FUNCTION
o 13.4حذف الدالة DROP FUNCTION
· 15مصادر
بنية تعليمات SQL
تُنفَّذ تعليمات SQL على الجداول الموجودة في قواعد البيانات، وتلك الجداول تتألف من أعمدة وسجلات؛ أما التعليمات فهي تتألف من كلمات محجوزة ومتغيرات ومعاملات (وغير ذلك) التي تُحدِّد ما هي العملية التي نريد تنفيذها.
لغة SQL تُصرِّح عن النتيجة النهائية للعملية التي نريد إجراءها، وليس عن التفاصيل اللازمة لطريقة إجراء تلك العملية، إذ إنَّ محركات قواعد البيانات هي المسؤولة عن تلك التفاصيل.
المثال الآتي يُبيّن استخدام الاستعلام SELECT لتحديد عمودين من أحد الجداول، مع توفير اسم بديل (AS) لأحد الأعمدة، لتحديد السجلات التي ينطبق عليها شرطٌ معيّن (WHERE)، وترتيبها وفق أحد الأعمدة (ORDER BY):
SELECT name, age*365 AS AgeDays
FROM students
WHERE age > 10
ORDER BY name;
نُظِّم هذا الدليل بتخصيص صفحة لكل عبارة أو كلمة محجوزة أو معامل في SQL، ويكون اسم تلك الصفحة بأحرفٍ صغيرة، وإذا تألفت العبارة من أكثر من كلمة فيُفصَل بينها بشرطة سفلية؛ فمثلًا صفحة الاستعلام SELECT ستكون موجودةً على الرابط SQL/select، أما صفحة ORDER BY فهي موجودة في SQL/order_by وهكذا...
أنواع البيانات التي يمكن استخدامها مع محركات قواعد البيانات المختلفة (البيانات العددية، والبيانات النصية، والوقت والتاريخ، والبيانات الثنائية ...إلخ.).
أساسيات لغة SQL
يستخدم التعبير IS NULL للتأكد من خلو القيمة (أي لا توجد قيمة في الحقل المحدد).
تضاف التعليقات إلى الشيفرة بهدف تسهيل قراءتها أو كتابة ملاحظات جانبية مساعدة.
SELECT count(*); -- This comment continues to the end of line
SELECT count(*); /* This is an inline comment */;
يمكن إطلاق تسمية على الجداول أو الحقول تسهيلًا للتعامل معها بالاسم البديل المؤقت، وذلك عند الحاجة إلى الوصول إلى نفس الجدول أو الحقل عدة مرات، وعندما يكون اسم الجدول أو الحقل طويلًا وصعب الكتابة.
الاستعلامات الفرعية Subqueries
هي استعلام واقعٌ ضمن استعلام آخر بهدف استخدام البيانات الناتجة عنه في الاستعلام الرئيسي الذي يحتويه.
التعامل مع السجلات
يُستخدَم للحصول على سجلات البيانات من الجداول المخزنة في قاعدة البيانات، قد تكون نتيجة الاستعلام سجلًا أو أكثر، وعمودًا أو أكثر.
يُستخدم ضمن استعلام SELECT لتحديد الشروط التي تُعرض أو تحذف السجلات أو تُعدل قيم حقولها وفقًا لها، إذ يُمكن أن تستخدم أيضًا مع استعلامَي DELETE و UPDATE.
تُستخدم في استعلام SELECT بهدف تجميع النتائج ضمن مجموعات بحسب عمود أو أكثر من الجدول.
يُستخدم ضمن استعلام SELECT لتحديد شرطٍ معينٍ عند تجميع السجلات مع بعضها GROUP BY.
تتلخص مهمة عبارة ORDER BY بترتيب النتائج (تصاعديًا أو تنازليًا) ضمن استعلام SELECT وفق عمودٍ (أو أكثر) من الجدول.
الحصول على عدد محدد من النتائج
يمكن تحديد عدد السجلات التي ستُجلب من الجدول ضمن استعلام SELECT أو التي ستُحذف من الجدول ضمن استعلام DELETE أو ستُحدَّث قيمها ضمن استعلام UPDATE، هنالك اختلافات بين محركات قواعد البيانات، ويُفضَّل العودة إلى هذه الصفحة للتفاصيل.
مهمة هذا الاستعلام هي إنشاء سجل جديد في الجدول.
يُستخدم لحذف سجل أو أكثر.
هو استعلام يستخدم للقيام بنفس مهمة الاستعلام INSERT (إضافة سجل جديد للجدول) ولكن لإدخال سجلٍ بنفس القيمة الموجودة مسبقًا في عمود المفتاح الأوليّ وذلك منعًا لحدوث التكرار.
يُستخدم هذا الاستعلام من أجل تحديث قيم البيانات المخزنة في سجلات الجداول.
يُستخدم لتحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط.
يُستخدم لتحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط.
يُستخدم لتحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني.
يُستخدم لتحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط.
المعاملات
تتضمن المعاملات الأساسية المعاملات الرياضية، والمعاملات الثنائية، ومعاملات المقارنة، والمعاملات المنطقية، وتحتوي الصفحة أيضًا على جداول تبيّن أولوية المعاملات.
تستخدم للحصول على قيمٍ فريدةٍ غير مكررة، وغالبًا ما تستخدم في استعلام SELECT للحصول على سجلات لا تتكرر القيم فيما بينها.
يستخدم للتأكد من وجود سجلات ناتجة عن الاستعلام الفرعي المستخدم في الاستعلام الرئيسي.
يستخدم لتحديد نمط معين للسلسلة النصية يُحدد الشرط وفقًا له.
المعاملات المنطقية AND, OR, NOT
غالبًا ما تستخدم المعاملات المنطقية (AND و OR و NOT) في عبارة WHERE للربط ما بين الشروط أو نفيها.
تُستخدَم هذه المعاملات لتحديد مجال أو عدد محدّد من القيم في SQL.
معاملات الضم UNION, INTERSECT, EXCEPT
تُستخدَم هذه المعاملات للربط بين نتائج الاستعلامات في SQL.
معاملات المقارنة ALL, SOME, ANY
تستخدم بهدف المقارنة مع القيم الناتجة (لعمودٍ واحدٍ) عن أحد الاستعلامات الفرعية.
بنى التحكم
تستخدم صيغة IF لاختبار شرط معين للتأكّد من تحقّقه أو عدم تحقّقه وإجراء ما يتناسب مع ذلك.
تستخدم لاختبار شرط معين بشكل مشابه لتعليمات if/else في لغات البرمجة الأخرى لتعيد أحد التعابير الممكنة.
تهدف حلقة WHILE إلى تكرار عددٍ من التعليمات باستمرار تحقق الشرط ضمنها، إذ يُتأكَّد من تحقّق الشرط قبل البدء بتنفيذ التعليمات التي تحتويه.
العمليات
العملية هي مجموعة من التعديلات التي تتم في قاعدة البيانات وفق تسلسل منطقي، وينتج عنها بعض التغييرات في القاعدة كحذف سجل أو تعديل بيانات أو إنشاء سجل جديد، هذه كلها عبارة عن عمليات، وتصبح هذه التغييرات جزءًا دائمًا من قاعدة البيانات إذا نُفذَّت بشكل تامّ دون أخطاء، أما في حال حدوث أيّ خطأ فيُتراجَع عن هذه التغييرات وتعود قاعدة البيانات كما هي قبل إنجاز العمليات عليها.
أمر بدأ العمليات START TRANSACTION
يُستخدم هذا الأمر للإعلام بالبدء بإجراء مجموعة من العمليات التي قد تنتهي بأمر COMMIT أو ROLLBACK.
يستخدم بهدف حفظ التغييرات المُجراة على قاعدة البيانات نتيجة لتنفيذ العمليات، إذ تحفظ كافة التغييرات منذ آخر أمر COMMIT أو ROLLBACK.
يستخدم لإلغاء العمليات المُجراة على قاعدة البيانات مما يعني تجاهل التغييرات التي طرأت عليها.
التعامل مع المستخدمين
يُستخدم لإنشاء مستخدم جديد، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.
يُستخدم للتعديل من خصائص وسماحيات المستخدم، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.
يُستخدَم لحذف مستخدم.
يستخدم لمنح صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.
يستخدم لإلغاء صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.
التعامل مع الفهارس
يستخدم لإنشاء فهرس للجدول.
يستخدم لتعديل الفهرس المُنشأ عبر الأمر CREATE INDEX.
يستخدم لحذف فهرس أو أكثر.
التعامل مع قواعد البيانات
إنشاء قاعدة البيانات CREATE DATABASE
يستخدم لإنشاء قاعدة بيانات جديدة.
حذف قاعدة البيانات DROP DATABASE
يستخدم لحذف قاعدة البيانات.
يستخدم لتحديد قاعدة البيانات التي يتَعامَل معها لنقل السياق context لها.
التعامل مع الجداول
تستخدم المفاتيح بهدف الربط ما بين الجداول في قواعد البيانات. ومن أنواعها: المفتاح الأولي، والمفتاح الثانوي.
يستخدم لإنشاء جدولٍ جديدٍ في قاعدة البيانات.
يستخدم لتعديل تعريف الجدول المُنشأ مسبقًا عبر الأمر CREATE TABLE.
يستخدم لحذف جدول أو أكثر من قاعدة البيانات.
التعامل مع الدوال
هذه الدوال تساعد في إجراء العمليات الرياضية والإحصائية، مثل إيجاد عدد السجلات، وإعادة أكبر أو أصغر قيمة، وغيرها من العمليات.
يستخدم لتعريف دالة جديدة.
يستخدم لتعديل تعريف دالة مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION.
يستخدم لحذف دالة (أو إجراء) أو أكثر مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION.
تستخدم لإنهاء الدالة وإعادة قيمة ما للموقع الذي استُدعيت فيه الدالة.
التعامل مع العرض
يستخدم لإنشاء عرضٍ والذي هو عبارة عن جدول افتراضي يُبنى بالاعتماد على نتائج استعلامٍ ما.
يستخدم لتعديل عرضٍ مُنشَأ مسبقًا عبر الأمر CREATE VIEW.
يستخدم لحذف view أو أكثر مُنشئ مسبقًا عبر الأمر CREATE VIEW.
التأكد من خُلوّ القيمة IS NULL في SQL
يستخدم التعبير IS NULL للتأكد من خلو القيمة (أي لا توجد قيمة في الحقل المحدد)، ويكون سياق التعبير بالشكل الآتي:
column IS [NOT] NULL
وغالبًا ما تستخدم في العبارة WHERE للتحقق من وجود القيمة في إحدى حقول السجلات.
مثال
إن كانت قاعدة البيانات تحتوي الجدول
customers
الآتي:Bill
OrderID
Phone
FullName
CustomerID
160
0291
NULL
Abd al-Salam Hadi
1156
170
0302
(171) 555-2222
Ahmad Mostafa
1157
210
0203
(100) 555-4822
Reem Hammad
1158
350
0294
NULL
Abd Allah Sadiq
1159
185
0255
(03) 3555-5011
Raghad al-Hamdan
1160
165
0276
(98) 598 76 54
Abd al-Razzaq Salloum
1161
175
0247
NULL
Hussam Siraj
1162
180
0208
NULL
Hiba Maktabi
1163
170
0219
(06) 431-7877
Abd al-Rahman Rida
1164
220
0210
NULL
Abd al-Qader Khalil
1165
إن الاستعلام الآتي:
SELECT *
FROM customers
WHERE Phone IS NULL;
سيُظهر السجلات التي لا تحتوي على أي قيمة في حقل
Phone
على النحو الآتي:Bill
OrderID
Phone
FullName
CustomerID
160
0291
NULL
Abd al-Salam Hadi
1156
350
0294
NULL
Abd Allah Sadiq
1159
175
0247
NULL
Hussam Siraj
1162
180
0208
NULL
Hiba Maktabi
1163
220
0210
NULL
Abd al-Qader Khalil
1165
أما لعرض الزبائن الذي زوّدوا قاعدة البيانات برقم الهاتف، يستخدم الاستعلام الآتي:
SELECT *
FROM customers
WHERE Phone IS NOT NULL;
لتظهر النتائج:
Bill
OrderID
Phone
FullName
CustomerID
170
0302
(171) 555-2222
Ahmad Mostafa
1157
210
0203
(100) 555-4822
Reem Hammad
1158
185
0255
(03) 3555-5011
Raghad al-Hamdan
1160
165
0276
(98) 598 76 54
Abd al-Razzaq Salloum
1161
170
0219
(06) 431-7877
Abd al-Rahman Rida
1164
التسمية البديلة Alias في SQL
يمكن إطلاق تسمية على الجداول أو الحقول تسهيلًا للتعامل معها بالاسم البديل المؤقت (وقد يكون أكثر اختصارًا)، وذلك عند الحاجة إلى الوصول إلى نفس الجدول أو الحقل عدة مرات، ويعبًّر عن ذلك بالكلمة المفتاحية
AS
، ويمكن الاستغناء عنها عند تسمية الجدول.أمثلة
في الاستعلام الآتي:
SELECT Name AS Top Students, Age, GPA
FROM students
سيظهر العمود
Name
باسمTop Students
في النتائج. وفي الاستعلام:SELECT StudentID, FirstName, Course, Lecturer
FROM students st
LEFT JOIN courses co
ON st.CourseID = co.CourseID;
سُمي الجدول
students
باسمst
والجدولcourses
باسمco
وذلك تسهيلًا لعملية الربط بين الجدولين.الاستعلامات الفرعية Subqueries في SQL
< SQL
الاستعلام الفرعي هو استعلام واقعٌ ضمن استعلام آخر بهدف استخدام البيانات الناتجة عنه في الاستعلام الرئيسي الذي يحتويه، وغالبًا ما يكون الاستعلام الفرعي عبارة عن استعلام SELECT، ويمكن استخدامه مع أي من استعلامات SELECT أو INSERT أو UPDATE أو DELETE.
محتويات
· 1استخدام الاستعلام الفرعي في استعلام SELECT
o 1.1تحديد الاستعلام الفرعي كأحد الأعمدة
o 1.2تحديد الاستعلام الفرعي كجدول جزئي من جدول أساسي
o 1.3استخدام الاستعلام الفرعي لتحديد قيم ضمن الشرط WHERE
· 2حذف السجلات التي تحقق شرط محدد باستعلام فرعي
· 3تحديث قيم السجلات اعتمادًا على الاستعلام الفرعي
· 4إضافة سجلات في جدول من جدول آخر باستخدام الاستعلام الفرعي
· 6مصادر
استخدام الاستعلام الفرعي في استعلام SELECT
تحديد الاستعلام الفرعي كأحد الأعمدة
يُمكن تحديد أحد الأعمدة التي ستظهر بتنفيذ استعلام SELECT من خلال الاستعلام الفرعي الذي يعيد قيمة وحيدة لكل سجل.
مثال
إن كانت الجداول الآتية موجودة في قاعدة البيانات:
الجدول الأول: السيارات
cars
Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Black
31,990
2017
KIA
Cadenza
05084
Blue
23,240
2018
KIA
Niro
05085
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
18,200
2018
KIA
Forte5
05087
Blue
32,250
2017
KIA
Soul EV
05088
Red
23,385
2017
Nissan
Altima
05089
White
46,195
2017
Nissan
Armada
05090
Black
33,495
2017
Nissan
Maxima
05091
Black
30,715
2017
Nissan
Murano
05092
Grey
31,265
2017
Nissan
Pathfinder
05093
White
17,875
2017
Nissan
Sentra
05094
Red
12,875
2017
Nissan
Versa
05095
الجدول الثاني: الزبائن
customers
Remaining
CarID
Name
CustomerID
15,495
05091
Mona Sinno
0156
8,875
05095
Ahmad Najjar
0157
19,500
05081
Kareem al-Hamdan
0158
11,875
05094
Mohammad Qadi
0159
17,500
05081
Rasha Mostafa
0160
10,200
05087
Jaber Hammad
0161
19,990
05084
Wessam Fattah
0162
8,875
05094
Shadi Sharif
0163
12,500
05081
Iman Mansour
0164
6,875
05095
Monther Zein
0165
9,200
05087
Rami Fares
0166
18,240
05085
Ammar Arab
0167
إن تنفيذ الاستعلام الآتي:
SELECT CarID, Model, Company,
( SELECT count(*)
FROM customers
WHERE customers.CarID = cars.CarID
) AS NumberOrders
FROM cars;
سيعرض عدد المشترين لكل سيارة من السيارات بعمودٍ منفصلٍ (
NumberOrders
) اعتمادًا على الاستعلام الفرعي المُنفَّذ في الجدولcustomers
بحيث يكون الرقم التسلسلي لطلب السيارة في جدول الزبائن مساويًا للرقم التسلسلي للسيارة في جدول السيارات، وستظهر النتائج:NumberOrders
Company
Model
CarID
3
KIA
Optima
05081
0
KIA
Optima Hybrid
05082
0
KIA
Stinger
05083
1
KIA
Cadenza
05084
1
KIA
Niro
05085
0
KIA
Rio 5-Door
05086
2
KIA
Forte5
05087
0
KIA
Soul EV
05088
0
Nissan
Altima
05089
0
Nissan
Armada
05090
1
Nissan
Maxima
05091
0
Nissan
Murano
05092
0
Nissan
Pathfinder
05093
2
Nissan
Sentra
05094
2
Nissan
Versa
05095
تحديد الاستعلام الفرعي كجدول جزئي من جدول أساسي
يمكن استخدام الاستعلام الفرعي للحصول على جدول جزئي مقتبس من جدول أساسي لاستخدامه في عبارة
FROM
، كما في الاستعلام الآتي:SELECT cars.CarID, cars.Model, result.CustomerID
FROM cars JOIN
(SELECT * FROM customers
WHERE CustomerID BETWEEN 0160 AND 0165
) AS result
ON cars.CarID = result.CarID;
إن تنفيذ هذا الاستعلام على الجدولين
cars
وcustomers
في قاعدة البيانات سيؤدي إلى عرض الرقم التسلسلي ونوع السيارة من الجدول الناتج عن الربط ما بين جدولcars
وجدول فرعي يُؤخذ من جدولcustomers
بحيث يكون الرقم التسلسلي للزبون واقعًا ما بين الرقمين 0160 و 0165 وتسميته باسمresult
إذ يتم الربط عندما يكون الرقم التسلسلي في الجدولين متساويًا، وتكون نتيجة تنفيذه:CustomerID
Model
CarID
0160
Optima
05081
0164
Optima
05081
0162
Cadenza
05084
0161
Forte5
05087
0163
Sentra
05094
0165
Versa
05095
استخدام الاستعلام الفرعي لتحديد قيم ضمن الشرط WHERE
تمكن الاستفادة من الاستعلام الفرعي لتحديد عدد من القيم لتوضع ضمن الشرط في عبارة WHERE.
لمعرفة السيارات التي لم تُشترَ من قبل أيّ من الزبائن يمكن استخدام الاستعلام الآتي:
SELECT *
FROM cars
WHERE CarID NOT IN(
SELECT CarID
FROM customers
);
لتظهر النتائج:
Colour
Price
Year
Company
Model
CarID
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
32,250
2017
KIA
Soul EV
05088
Red
23,385
2017
Nissan
Altima
05089
White
46,195
2017
Nissan
Armada
05090
Black
30,715
2017
Nissan
Murano
05092
Grey
31,265
2017
Nissan
Pathfinder
05093
ولمعرفة مجموع أسعار السيارات التي لم تُشترى يمكن إضافة الدالة التجميعيّة sum للاستعلام السابق ليصبح:
SELECT SUM(Price) AS Total
FROM cars
WHERE CarID NOT IN(
SELECT CarID
FROM customers
);
وتظهر النتيجة:
Total
235,905
حذف السجلات التي تحقق شرط محدد باستعلام فرعي
يمكن تحديد الشرط الذي ستحذف وفقًا له البيانات ضمن الاستعلام الفرعي في عبارة WHERE.
فلحذف السيارات التي اشتراها أيّ من الزبائن في جدول
customers
من الجدولcars
، يصبح الاستعلام بالشكل الآتي:DELETE FROM cars
WHERE CarID IN(
SELECT CarID
FROM customers
);
ليصبح الجدول
cars
في قاعدة البيانات على النحو الآتي:Colour
Price
Year
Company
Model
CarID
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
32,250
2017
KIA
Soul EV
05088
Red
23,385
2017
Nissan
Altima
05089
White
46,195
2017
Nissan
Armada
05090
Black
30,715
2017
Nissan
Murano
05092
Grey
31,265
2017
Nissan
Pathfinder
05093
تحديث قيم السجلات اعتمادًا على الاستعلام الفرعي
يمكن الاعتماد على الاستعلام الفرعي لتحديد القيم الجديدة التي ستوضع في الحقل المطلوب في استعلام UPDATE، إن كان جدول الأقساط
installments
الآتي موجودًا في قاعدة البيانات:Date
CustomerID
Amount
TransactionID
04/11/2017
0156
7,000
0206
11/11/2017
0157
5,000
0207
01/11/2017
0158
9,000
0208
09/11/2017
0159
6,000
0209
24/11/2017
0160
8,000
0210
11/11/2017
0161
7,000
0211
04/11/2017
0162
9,000
0212
09/11/2017
0163
5,000
0213
01/11/2017
0164
8,000
0214
09/11/2017
0165
4,000
0215
04/11/2017
0166
5,000
0216
01/11/2017
0167
10,000
0217
فلتحديث قيمة المبلغ المتبقي في جدول الزبائن
customers
بحسب القيمة المدفوعة في الجدول السابق يُنفذ الاستعلام الآتي:UPDATE customers
SET remaining = remaining -
(SELECT Amount
FROM installments
WHERE customers.CustomerID = installments.CustomerID);
ليصبح الجدول كما يلي:
Remaining
CarID
Name
CustomerID
8,495
05091
Mona Sinno
0156
3,875
05095
Ahmad Najjar
0157
10,500
05081
Kareem al-Hamdan
0158
5,875
05094
Mohammad Qadi
0159
9,500
05081
Rasha Mostafa
0160
3,200
05087
Jaber Hammad
0161
10,990
05084
Wessam Fattah
0162
3,875
05094
Shadi Sharif
0163
4,500
05081
Iman Mansour
0164
2,875
05095
Monther Zein
0165
4,200
05087
Rami Fares
0166
8,240
05085
Ammar Arab
0167
إضافة سجلات في جدول من جدول آخر باستخدام الاستعلام الفرعي
تمكن إضافة بعض السجلات إلى الجدول من جدول آخر اعتمادًا على استعلام فرعي بحيث تتوافق أسماء الأعمدة المختارة ما بين الجدولين.
ليكن الجدول الآتي
cheapCars
موجودًا في قاعدة البيانات:Colour
Price
Year
Company
Model
CarID
Grey
12,800
2014
Nissan
Versa 1.6 S
06002
WHITE
14,700
2014
KIA
Rio LX
06003
Blue
13,790
2014
Mitsubishi
Mirage DE
06004
لإضافة سيارات أخرى لهذا الجدول من الجدول الأساسي
cars
يُمكن الاعتماد على الاستعلام الفرعي بالشكل الآتي:INSERT INTO cheapCars
SELECT * FROM cars WHERE Price < 20000;
لاحظ : في استعلام INSERT INTO لم نضع أقواس حول الإستعلام الفرعي.
ليصبح الجدول:
Colour
Price
Year
Company
Model
CarID
Grey
12,800
2014
Nissan
Versa 1.6 S
06002
WHITE
14,700
2014
KIA
Rio LX
06003
Blue
13,790
2014
Mitsubishi
Mirage DE
06004
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
18,200
2018
KIA
Forte5
05087
White
17,875
2017
Nissan
Sentra
05094
Red
12,875
2017
Nissan
Versa
05095
التعامل مع السجلات
الاستعلام SELECT
يُستخدَم استعلام SELECT للحصول على سجلات البيانات من الجداول المخزنة في قاعدة البيانات، قد تكون نتيجة الاستعلام سجلًا أو أكثر، وعمودًا أو أكثر.
محتويات
· 2أمثلة
o 2.1تحديد كافة أعمدة أحد الجداول
o 3.1تحديد السجلات وفق ترتيبٍ معيّن
o 3.2تحديد السجلات التي ينطبق عليها شرطٌ معيّن
o 3.3تحديد السجلات التي قيمة أحد حقولها فريدة
o 3.4استخدام الدوال مع بيانات الجدول
o 3.5جلب البيانات من أكثر من جدول
· 4مصادر
البنية العامة
SELECT [DISTINCT | TOP] select_list
[FROM table_source]
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ ASC | DESC]];
ويمكن أن تُستخدَم بعض المعاملات مثل UNION و EXCEPT و INTERSECT لدمج نتائج الاستعلامات أو مقارنتها مع بعضها، وتجب مراعاة ترتيب الكلمات المفتاحية المستخدمة في الصياغة السابقة لدى وجود العديد منها ضمن استعلامٍ واحد.
أمثلة
فيما يلي أمثلةٌ مختلفةٌ عن استخدام الاستعلام SELECT مع مختلف المعاملات، يُمكن الاطلاع على صفحات تلك المعاملات لمزيدٍ من المعلومات والأمثلة عنها.
تحديد كافة أعمدة أحد الجداول
يُستخدَم الرمز * للحصول على كافة الأعمدة من الجدول (وهو أحد رموز المحارف البديلة Wildcards):
SELECT *
FROM table_source;
إذا نُفِذ الاستعلام السابق على جدولٍ باسم riverTable (الذي يضم أسماء بعض الأنهار وأطوالها ومصبها والقارة التي يوجد فيها) فسيظهر لدينا الجدول الآتي:
Continent
Outflow
LengthMiles
LengthKm
River
Serial
South America
Atlantic Ocean
4345
6992
Amazon
1
Africa
Mediterranean
4258
6853
Nile
2
North America
Gulf of Mexico
3902
6275
Mississippi
3
Asia
Bohai Sea
3395
5464
Yellow River
4
Africa
Atlantic Ocean
2922
4700
Congo
5
Asia
Laptev Sea
2736
4400
Lena
6
Africa
Gulf of Guinea
2611
4200
Niger
7
Europe
Caspian Sea
2266
3645
Volga
8
Asia
Andaman Sea
1901
3060
Salween
9
تحديد ظهور بعض الأعمدة
يمكن تحديد مجموعة الأعمدة التي ستظهر في الناتج عبر فصل أسماء تلك الأعمدة بفاصلة ,، وذلك مبيّن في الاستعلام الآتي الذي يُظهِر أسماء الأنهار ومصبّاتها وطولها بالكيلومتر:
SELECT River, Outflow, LengthKm
FROM riverTable;
الاستعلام السابق سيُظِهر الناتج الآتي حيث يُلاحظ اختلاف ترتيب الأعمدة عن الترتيب في الجدول الأصلي:
LengthKm
Outflow
River
6992
Atlantic Ocean
Amazon
6853
Mediterranean
Nile
6275
Gulf of Mexico
Mississippi
5464
Bohai Sea
Yellow River
4700
Atlantic Ocean
Congo
4400
Laptev Sea
Lena
4200
Gulf of Guinea
Niger
3645
Caspian Sea
Volga
3060
Andaman Sea
Salween
تحديد السجلات وفق ترتيبٍ معيّن
الاستعلام الآتي يُحدِّد الأعمدة River و LengthKm و Continent من الجدول riverTable الظاهر في القسم السابق، ويضيف اسمًا بديلًا (التسمية alias عبر المعامل AS) للعمود Continent لجعله يظهر باسم Place، ثم يرتِّب النتائج ترتيبًا هجائيًا تصاعديًا عبر التعبير ORDER BY:
SELECT River, LengthKm, Continent AS Place
FROM riverTable
ORDER BY Continent;
تظهر النتيجة المبيّنة في الجدول الآتي، ويُلاحظ كيف ظهر عمود القارة باسم Place:
Place
LengthKm
River
Africa
6853
Nile
Africa
4700
Congo
Africa
4200
Niger
Asia
5464
Yellow River
Asia
4400
Lena
Asia
3060
Salween
Europe
3645
Volga
North America
6275
Mississippi
South America
6992
Amazon
تحديد السجلات التي ينطبق عليها شرطٌ معيّن
سيُنفَّذ الاستعلام الآتي على الجدول riverTable وهو يُحدِّد اسم النهر River ويُظهِر طوله بالمتر (بتحديد العمود LengthKm ثم ضربه بالعدد 1000 لتحويله إلى المتر، وذلك باستخدام المعاملات الرياضية ويبيّن مكان وجوده Continent، وذلك من الجدول riverTable، على أن يكون طوله أكبر من 4000 كيلومتر (المعامل WHERE)، ثم يُرتِّب الناتج كله ترتيبًا هجائيًا تصاعديًا عبر اسم القارة:
SELECT River, LengthKm*1000 AS LengthM, Continent
FROM riverTable
WHERE LengthKm > 4000
ORDER BY Continent;
ستظهر النتيجة المبيّنة في الجدول الآتي:
Continent
LengthM
River
Africa
6853000
Nile
Africa
4700000
Congo
Africa
4200000
Niger
Asia
5464000
Yellow River
Asia
4400000
Lena
North America
6275000
Mississippi
South America
6992000
Amazon
تحديد السجلات التي قيمة أحد حقولها فريدة
تضاف الكلمة المفتاحية DISTINCT في استعلام SELECT للحصول على قيم مختلفة وغير مكررة (أي فريدة)، إذ إن الاستعلام الآتي الذي يُحدِّد أسماء القارات الفريدة من الجدول riverTable:
SELECT DISTINCT Continent
FROM riverTable
سيُظهِر النتيجة:
Continent
South America
Africa
North America
Asia
Europe
استخدام الدوال مع بيانات الجدول
الاستعلام الآتي سيُنفَّذ على جدول riverTable وسيؤدي إلى إظهار طول النهر الأقصر ما بين الأنهار، وطول النهر الأطول، والمتوسط الحسابي للأطوال جميعها، وذلك عبر استخدام الدوال min() و max() و avg() في SQL:
SELECT MIN(LengthKm) AS Minimum Length, MAX(LengthKm) AS Maximum Length, AVG(LengthKm) AS Average Length
FROM riverTable;
وتظهر النتائج الآتية:
Average Length
Maximum Length
Minimum Length
5065.444
3060
6992
جلب البيانات من أكثر من جدول
يمكن أن تجلب البيانات من أكثر من جدول ضمن قاعدة البيانات وذلك بتحديد أسماء الجداول المطلوب إظهار بياناتها عند الكلمة المفتاحية FROM، إن تنفيذ الاستعلام الآتي سيجلب الأعمدة المطلوبة بحسب وجودها في الجدول المناسب لها:
SELECT River, LengthKm, Mountain, HeightKm
FROM riverTable, mountainTable;
ولدى التعامل مع أكثر من جدول تُربط الجداول فيما بينها بإحدى معاملات الربط.
عبارة WHERE
تُستخدم عبارة WHERE ضمن استعلام SELECT لتحديد الشروط التي تُعرض أو تحذف السجلات أو تُعدل قيم حقولها وفقًا لها، إذ يُمكن أن تستخدم أيضًا مع استعلامَي DELETE و UPDATE، وتعتمد اعتمادًا أساسيًا على المُعاملات المنطقية والحسابية وبعض المعاملات الأخرى في صياغة تلك الشروط.
محتويات
· 1الحصول على البيانات وفق شرطٍ بسيط
· 2حذف السجل المُحقِّق لشرط معين
· 3تعديل القيم في السجلات وفق شرطٍ مُحدَّد
· 4ربط الشروط باستخدام المعاملات المنطقية
o 4.1عرض عدد السجلات المُحقِّقَة لشرط معيّن
· 5المعاملات المساعدة في عبارة WHERE
· 7مصادر
الحصول على البيانات وفق شرطٍ بسيط
إن كان الجدول الآتي موجودًا في قاعدة البيانات:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
الاستعلام الآتي يُحدد شرط وجود قيمة السلسلة النصية 'Amin' في الحقل Name:
SELECT *
FROM students
WHERE Name=’Amin’;
وتكون نتيجة تنفيذه:
GPA
Age
Name
StudentID
1.96
22
Amin
1066
حذف السجل المُحقِّق لشرط معين
يمكن حذف سجل أو أكثر إن كان مُحقِّقًا لشرط يُحدد من خلال عبارة WHERE.
إن تنفيذ الاستعلام الآتي يؤدي لحذف جميع سجلات الطلاب بمعدل أقل من 2.5 وذلك بالاعتماد على استعلام DELETE:
DELETE FROM students
WHERE GPA<2.5;
تعديل القيم في السجلات وفق شرطٍ مُحدَّد
تحدد عبارة WHERE الشرط الذي من خلاله ستُحدد السجلات التي ستُعدَّل قيمها بالاستفادة من الاستعلام UPDATE، إذ يمكن تعديل قيمة أو أكثر.
الاستعلام الآتي سيُعدِّل قيمتي العمر والمعدل للسجل الذي يكون فيه الاسم بقيمة Yusuf:
UPDATE students
SET Age = 24, GPA= 3.4
WHERE Name = 'Yusuf';
ويُلاحظ هنا أنه إن لم تُذكر عبارة WHERE في هذا الاستعلام فسيشمل التعديل كافة السجلات الموجودة في الجدول.
ربط الشروط باستخدام المعاملات المنطقية
يُستفاد من المُعاملات المنطقية (AND, OR, NOT) بربط أكثر من شرط أو نفيها ضمن عبارة WHERE.
إن تنفيذ الاستعلام الآتي يُحدد شرط وجود قيمة أكبر من 3.00 في حقل المعدل الوسطيّ وقيمة أكبر من 24 سنة في حقل العمر، ويُرتِّب النتائج بحسب المعدل الوسطيّ ترتيبًا تنازليًا وتصبح تسمية Top Students بدلًا من Name في الجدول بالاستفادة من التسمية عبر الكلمة المفتاحية AS:
SELECT Name AS Top Students, Age, GPA
FROM students
WHERE GPA>3.00 AND age>24
ORDER BY GPA DESC;
وستظهر النتائج الآتية:
GPA
Age
Top Students
4.00
26
Sarah
3.68
25
Mona
عرض عدد السجلات المُحقِّقَة لشرط معيّن
تمكن معرفة عدد السجلات التي تُحقِّق شرطًا معينًا بالاعتماد على الدالة count، مع تحديد الشرط المطلوب في عبارة WHERE، فلدى تنفيذ الاستعلام الآتي على الجدول السابق (باستخدام المعامل BETWEEN الذي يقوم بتحديد مجال للقيم المحتملة في الحقل Age):
SELECT count(*) AS Count
FROM students
WHERE age BETWEEN 23 AND 25;
ستظهر النتيجة:
Count
4
المعاملات المساعدة في عبارة WHERE
يُوضح الجدول الآتي بعض المعاملات المُستخدمة لدى صياغة الشرط الذي تحدده الكلمة المفتاحية WHERE:
المعامل
الوصف
=
حالة التساوي
<>
حالة عدم التساوي
<
أكبر من
>
أصغر من
=<
أكبر من أو يساوي
=>
أصغر من أو يساوي
BETWEEN
واقعٌ ضمن مجال محدَّد
LIKE
مماثل لنمط محدد يلي الكلمة المفتاحية
IN
لتحديد عدة قيم ممكنة للقيمة المأخوذة من العمود
ويُمكن كذلك استخدام المعاملات المنطقية الآتية للربط ما بين عدة شروط أو نفيها:
المعامل
الوصف
AND
لعرض السجل إذا تحققت كافة الشروط
OR
لعرض السجل إذا تحقق واحدٌ من الشروط أو أكثر
NOT
إذا تحقق نفي الشرط
عبارة GROUP BY
تُستخدم عبارة GROUP BY في استعلام SELECT بهدف تجميع النتائج ضمن مجموعات بحسب عمود أو أكثر من الجدول.
محتويات
· 1استخدام GROUP BY لمعرفة عدد السجلات الممكن تجميعها سويةً
· 2تجميع النتائج المحققة لشرط محدد
· 5مصادر
استخدام GROUP BY لمعرفة عدد السجلات الممكن تجميعها سويةً
ليكن الجدول الآتي (patients) موجودًا في قاعدة البيانات:
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Fateh
Cardiology
65
Rami
1070
Kareem
Neurology
19
Abd al-Rahim
1150
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Hadi
Critical Care
58
Ahmad
1154
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
Fateh
Cardiology
55
Sarah
1180
Hadi
Critical Care
23
Fadi
1076
Abd Allah
Neurology
36
Naim
987
Fateh
Cardiology
70
Batoul
1156
Amnah
Maternity
24
Rahaf
1181
Nasser
Cardiology
66
Aya
808
الاستعلام الآتي يحدد عدد المرضى في كل قسم اعتمادًا على الدالة التجميعيّة count():
SELECT Section, count(*) AS Number of patients
FROM patients
GROUP BY Section;
وتظهر النتائج كما الآتي:
Number of patients
Section
5
Cardiology
5
Neurology
4
Maternity
3
Critical Care
ولدى استخدام حقلين ضمن عبارة GROUP BY كما في الاستعلام الآتي:
SELECT Section, Doctor, count(Patient) AS Number of patients
FROM patients
GROUP BY Section, Doctor
تُجمَّع النتائج بحسب العمود المُحدد أولًا ثم العمود الثاني وهكذا، وستظهر النتائج الآتية:
Number of patients
Doctor
Section
2
Nasser
Cardiology
3
Fateh
Cardiology
3
Abd Allah
Neurology
2
Kareem
Neurology
2
Reem
Maternity
2
Amnah
Maternity
3
Hadi
Critical Care
تجميع النتائج المحققة لشرط محدد
الاستعلام الآتي يحدد عدد المرضى لدى كل طبيب ويستثني الأطباء المعالجِين لأقل من 3 مرضى اعتمادًا على العبارة HAVING التي تقوم بتحديد الشرط المطلوب عند استخدام التجميع:
SELECT Doctor, count(Patient) AS Number of patients
FROM patients
GROUP BY Doctor
HAVING count(Patient)>2 ;
وتظهر النتائج كما يلي:
Number of patients
Doctor
3
Fateh
3
Abd Allah
3
Hadi
تجميع النتائج من عدة جداول
ليكن الجدول الآتي (doctors) في قاعدة البيانات (إضافة للجدول السابق بأسماء المرضى):
City
DoctorName
Damascus
Nasser
Aleppo
Fateh
Aleppo
Abd Allah
Hama
Kareem
Damascus
Reem
Aleppo
Amnah
Damascus
Hadi
إن تنفيذ الاستعلام الآتي:
SELECT doctors.City, count(patients.Patient) AS Number of patients in city
FROM patients
LEFT JOIN doctors ON patients.Doctor = doctors.DoctorName
GROUP BY City;
يربط ما بين الجدولين ربطًا يساريًا ويرتب النتائج بمجموعات حسب عمود المدينة الموجود في جدول الأطباء، وهذا يؤدي لظهور عدد المرضى في كل مدينة على النحو الآتي:
City
Number of patients in city
Damascus
7
Aleppo
8
Hama
2
ملاحظة: لا يمكن استخدام الأعمدة التي نوعها text أو ntext أو image ضمن عبارة GROUP BY.
عبارة HAVING
< SQL
تستخدم عبارة HAVING ضمن استعلام SELECT لتحديد شرطٍ معينٍ عند تجميع السجلات مع بعضها GROUP BY، وقد أُضيف إلى لغة SQL لأنه لا يمكن استخدام عبارة WHERE مع الدوال التجميعيّة مثل SUM و MIN و MAX ...إلخ.
محتويات
· 1تجميع السجلات وفق شرط مُحدّد
· 2الفرق ما بين WHERE و HAVING
· 4مصادر
تجميع السجلات وفق شرط مُحدّد
ليكن الجدول الآتي (patients) موجودًا في قاعدة البيانات:
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Fateh
Cardiology
65
Rami
1070
Kareem
Neurology
19
Abd al-Rahim
1150
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Hadi
Critical Care
58
Ahmad
1154
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
Fateh
Cardiology
55
Sarah
1180
Hadi
Critical Care
23
Fadi
1076
Abd Allah
Neurology
36
Naim
987
Fateh
Cardiology
70
Batoul
1156
Amnah
Maternity
24
Rahaf
1181
Nasser
Cardiology
66
Aya
808
الاستعلام الآتي يحدد عدد المرضى المعالجِين لدى كل طبيب اعتمادًا على الدالة count() بشرط ألا يقلَّ هذا العدد عن ثلاثة مرضى:
SELECT Doctor, count(Patient) AS Number of patients
FROM patients
GROUP BY Doctor
HAVING count(Patient)>2 ;
وتظهر النتائج كما الآتي:
Number of patients
Doctor
3
Fateh
3
Abd Allah
3
Hadi
الفرق ما بين WHERE و HAVING
يكمُن الفرق الرئيسي بين العبارتين بأن عبارة HAVING متناسبة مع الدوال التجميعية أما عبارة WHERE فتُستخدم للتحقق من الشرط دون وجود أي دالة تجميعية، وبالتالي فإن الاستعلامَين الآتيَين متكافئان تمامًا:
SELECT Section, count(Patient) AS Number
FROM patients
GROUP BY Section
HAVING Age>25 ;
SELECT Section, count(Patient) AS Number
FROM patients
WHERE Age>25
GROUP BY Section;
وتكون نتيجتهما:
Number
Section
5
Cardiology
3
Neurology
2
Maternity
2
Critical Care
أما في حال استخدام إحدى الدوال التجميعيّة مثل معرفة عدد المرضى في كل قسم واستبعاد الأقسام بعددٍ من المرضى أقل من ثلاثة، فإن الاستعلامَين الآتييَن ليسا متكافئين:
SELECT Section, count(Patient) AS Number
FROM patients
GROUP BY Section
HAVING count(Patient)>2 ;
SELECT Section, count(Patient) AS Number
FROM patients
WHERE count(Patient)>2 -- استخدم GROUP BY;
ذلك لأنه لا يمكن استخدام العبارة WHERE مع الدوال التجميعية، ويجب بهذه الحالة استخدام العبارة HAVING للحصول على النتيجة الآتية:
Number
Section
5
Cardiology
3
Neurology
العبارة ORDER BY
تتلخص مهمة عبارة ORDER BY بترتيب النتائج (تصاعديًا أو تنازليًا) ضمن استعلام SELECT وفق عمودٍ (أو أكثر) من الجدول.
محتويات
· 1تحديد نمط الترتيب التصاعدي أو التنازلي
· 6مصادر
تحديد نمط الترتيب التصاعدي أو التنازلي
تُستخدم الكلمتان المفتاحيتان ASC و DESC لتحديد نمط الترتيب التصاعدي ASC والتنازلي DESC بعدّ الترتيب التصاعدي الحالة الافتراضية للعبارة.
ليكن الجدول rivers الآتي موجودًا في قاعدة البيانات:
Continent
Outflow
LengthMiles
LengthKm
River
Serial
South America
Atlantic Ocean
4345
6992
Amazon
1
Africa
Mediterranean
4258
6853
Nile
2
North America
Gulf of Mexico
3902
6275
Mississippi
3
Asia
Bohai Sea
3395
5464
Yellow River
4
Africa
Atlantic Ocean
2922
4700
Congo
5
Asia
Laptev Sea
2736
4400
Lena
6
Africa
Gulf of Guinea
2611
4200
Niger
7
Europe
Caspian Sea
2266
3645
Volga
8
Asia
Andaman Sea
1901
3060
Salween
9
لدى تنفيذ الاستعلام الآتي:
SELECT *
FROM rivers
ORDER BY Serial DESC;
ستظهر السجلات مرتبة ترتيبًا تنازليًا وفق العمود Serial، أي سيظهر الجدول بترتيب عكسي:
Continent
Outflow
LengthMiles
LengthKm
River
Serial
Asia
Andaman Sea
1901
3060
Salween
9
Europe
Caspian Sea
2266
3645
Volga
8
Africa
Gulf of Guinea
2611
4200
Niger
7
Asia
Laptev Sea
2736
4400
Lena
6
Africa
Atlantic Ocean
2922
4700
Congo
5
Asia
Bohai Sea
3395
5464
Yellow River
4
North America
Gulf of Mexico
3902
6275
Mississippi
3
Africa
Mediterranean
4258
6853
Nile
2
South America
Atlantic Ocean
4345
6992
Amazon
1
ولا يشترط وجود العمود المذكور في عبارة ORDER BY ضمن قائمة الأعمدة المذكورة في SELECT، أي أن الاستعلام الآتي صحيح أيضًا (لا يُعرض عمود Serial في النتائج):
SELECT River, LengthKm, LengthMiles, Outflow, Continent
FROM rivers
ORDER BY Serial DESC;
ويُمكن استخدام التسمية البديلة (alias) في عبارة ORDER BY كما في الاستعلام الآتي (الذي نتيجته تماثل نتيجة الاستعلام الأول):
SELECT Serial AS sortingCol, River, LengthKm, LengthMiles, Outflow, Continent
FROM rivers
ORDER BY sortingCol DESC;
الترتيب وفق أكثر من عمود
عند وجود أكثر من عمود في عبارة ORDER BY تُرتَّب النتائج وفقًا للعمود المذكور أولًأ ثم تُرتب السجلات الناتجة عن الترتيب السابق وفقًا للعمود الثاني وهكذا.
الاستعلام الآتي يُرتب الجدول وفقًا لعمود القارة ترتيبًا هجائيًا تصاعديًا (لا يُشترَط ذكر الكلمة المفتاحية ASC) ومن ثم ترتيبًا تنازليًا وفقًا لعمود الطول المقدر بالكيلومتر:
SELECT River, LengthKm, Continent
FROM rivers
ORDER BY Continent ASC, LengthKm DESC;
وتظهر النتائج الآتية:
Continent
LengthKm
River
Africa
6853
Nile
Africa
4700
Congo
Africa
4200
Niger
Asia
5464
Yellow River
Asia
4400
Lena
Asia
3060
Salween
Europe
3645
Volga
North America
6275
Mississippi
South America
6992
Amazon
الترتيب الشرطي
يمكن تحديد الترتيب ضمن عبارة ORDER BY وفقًا لشرط محدد وذلك باستخدام الكلمات المفتاحية CASE و WHEN و THEN و END والتي تعبر عن الشرط CASE المعروف في لغات البرمجة.
لترتيب السجلات وفقًا لأطوالها في قارة Africa ووفقًا لأسمائها في القارات البقية، يُنفذ الاستعلام الآتي:
SELECT *
FROM rivers
ORDER BY
CASE Country
WHEN 'Africa' THEN length
ELSE Name
END;
والذي يفحص القيمة الموجودة في حقل Country للسجل، فإن كانت Africa فترتب بحسب الترتيب التصاعدي للطول أما في الحالات الأخرى فستُرتب ترتيبًا هجائيًا تصاعديًا حسب اسم القارة، إذ إن الكلمات المفتاحية السابقة لها الصيغة التالية:
CASE field_name
WHEN value THEN expression
ELSE expression
END
وستظهر النتائج الآتية:
Continent
LengthKm
River
Africa
4200
Niger
Africa
4700
Congo
Africa
6853
Nile
Asia
4400
Lena
Asia
3060
Salween
Asia
5464
Yellow River
Europe
3645
Volga
North America
6275
Mississippi
South America
6992
Amazon
مثال ثانٍ
إن كان الجدول الآتي (patients) موجودًا في قاعدة البيانات:
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Fateh
Cardiology
65
Rami
1070
Kareem
Neurology
19
Abd al-Rahim
1150
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Hadi
Critical Care
58
Ahmad
1154
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
الاستعلام الآتي يرتب السجلات ترتيبًا تصاعديًا بحسب العمر إن كان القسم Cardiology وبحسب الاسم إن كان القسم Neurology وبحسب الرقم التسلسلي فيما تبقى من حالات:
SELECT *
FROM patients
ORDER BY
CASE Section
WHEN 'Cardiology' THEN Age
WHEN 'Neurology' THEN Name
ELSE PatientID
END;
وتظهر النتائج الآتية:
Doctor
Section
Age
Patient
PatientID
Fateh
Cardiology
65
Rami
1070
Nasser
Cardiology
76
Salem
1029
Kareem
Neurology
19
Abd al-Rahim
1150
Abd Allah
Neurology
17
Hasan
896
Abd Allah
Neurology
49
Helen
963
Kareem
Neurology
40
Maher
1069
Reem
Maternity
23
Nadine
964
Amnah
Maternity
30
Zeina
1028
Reem
Maternity
27
Sana
1034
Hadi
Critical Care
65
Roushd
1097
Hadi
Critical Care
58
Ahmad
1154
ترتيب نتائج الربط
يمكن ترتيب نتائج الربط ما بين جدولين أو جزئين من جدول عبر معاملات الربط UNION أو EXCEPT أو INTERSECT وذلك بذكر العمود الذي سترتب النتائج وفقًا له عند عبارة ORDER BY.
لترتيب الأنهار الواقعة في قارتي آسيا وإفريقيا فقط بحسب أطوالها ترتيبًا تنازليًا، يُنفذ الاستعلام الآتي:
SELECT River, LengthKm, Continent
FROM rivers
WHERE Continent = ‘Asia’
UNION ALL
SELECT River, LengthKm, Continent
FROM rivers
WHERE Continent = ‘Africa’
ORDER BY LengthKm;
وتكون النتيجة:
Continent
LengthKm
River
Africa
6853
Nile
Asia
5464
Yellow River
Africa
4700
Congo
Asia
4400
Lena
Africa
4200
Niger
Asia
3060
Salween
تحديد عدد السجلات في استعلامات SQL
يمكن تحديد عدد السجلات التي ستُجلب من الجدول ضمن استعلام SELECT أو التي ستُحذف من الجدول ضمن استعلام DELETE أو ستُحدَّث قيمها ضمن استعلام UPDATE، ولكن تختلف محركات قواعد البيانات فيما بينها بالصياغة العامة للاستعلام، وسيُذكر ذلك تباعًا.
محتويات
· 2أمثلة
o 3.1مثال
· 4الحصول على عدد نتائج محدد مع الإزاحة
o 4.1مثال
· 5مصادر
تحديد عدد سجلات النتائج
يكون للاستعلام البنية العامة الآتية في محرك SQL Server، والتي تعتمد على الكلمة المفتاحية TOP:
SELECT TOP number | percent col_name(s)
FROM tbl_name
WHERE condition;
إذ يُعبّر المتحول number عن عدد السجلات المطلوبة، وتُعبّر الكلمة المفتاحية percent عن نسبة السجلات المئوية التي نريد عرضها (أي يُمكن جلب نسبة محددة من عدد السجلات الإجمالي). ويكون للاستعلام البنية العامة الآتية في محركات PostgreSQL و SQLite و MySQL، والتي تعتمد على الكلمة المفتاحية LIMIT:
SELECT col_name(s)
FROM tbl_name
WHERE condition
LIMIT number;
ويمكن استخدام العبارة المفتاحية FETCH FIRST number ROWS ONLY في محرك PostgreSQL بدلًا من LIMIT، إذ يُعبِّر المتحول number عن عدد السجلات المطلوبة، أما في محرك Oracle، فيكون للاستعلام البنية العامة الآتية، والتي تعتمد على الكلمة المفتاحية ROWNUM:
SELECT col_name(s)
FROM tbl_name
WHERE ROWNUM <= number;
إذ يُعبّر المتحول number عن عدد السجلات المطلوبة.
أمثلة
يُراد الحصول على السجلات الخمس الأولى المحققة لشرط العمر أكبر من 25 سنة من الجدول الآتي (باسم patients):
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Fateh
Cardiology
65
Rami
1070
Kareem
Neurology
19
Abd al-Rahim
1150
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Hadi
Critical Care
58
Ahmad
1154
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
Fateh
Cardiology
55
Sarah
1180
Hadi
Critical Care
23
Fadi
1076
Abd Allah
Neurology
36
Naim
987
Fateh
Cardiology
70
Batoul
1156
Amnah
Maternity
24
Rahaf
1181
Nasser
Cardiology
66
Aya
808
Fateh
Cardiology
30
Raghad
1256
Amnah
Maternity
17
Mona
1161
Nasser
Cardiology
50
Sami
809
فيكون الاستعلام المطلوب تنفيذه هو (بحسب المحركات المختلفة):
في محرك SQL Server:
SELECT TOP 3 *
FROM patients
WHERE Age>25;
أو بالاستفادة من النسبة المئوية (5 مرضى من أصل 20 مريضًا تعادل نسبة 25%):
SELECT TOP 25 PERCENT *
FROM patients
WHERE Age>25;
في محركات PostgreSQL و SQLite و MySQL:
SELECT *
FROM patients
WHERE Age>25
LIMIT 5;
في محرك Oracle:
SELECT *
FROM patients
WHERE Age>25 AND ROWNUM <= 5;
وستظهر النتائج الآتية:
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Fateh
Cardiology
65
Rami
1070
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
حذف عدد محدد من السجلات
تكون للاستعلام البنية العامة الآتية في محرك SQL Server:
DELETE TOP number FROM tbl_name;
أما في محركات PostgreSQL و SQLite و MySQL، فتكون البنية العامة له كما يلي:
DELETE FROM tbl_name
LIMIT number;
مثال
لحذف المرضى الخمسة الأكبر سنًا من جدول المرضى patients السابق، يُستخدَم الاستعلام الآتي في محرك SQL Server:
DELETE TOP 5 FROM patients
ORDER BY age DESC;
في محركات PostgreSQL و SQLite و MySQL:
DELETE FROM patients
ORDER BY age DESC
LIMIT 5;
الحصول على عدد نتائج محدد مع الإزاحة
تستخدم الإزاحة مع العبارة ORDER BY وذلك لاستبعاد عددٍ مُحدّدٍ من النتائج الأولى في الجدول.
مثال
إن كان الجدول cars الآتي موجودًا في قاعدة البيانات:
Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Black
31,990
2017
KIA
Cadenza
05084
Blue
23,240
2018
KIA
Niro
05085
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
18,200
2018
KIA
Forte5
05087
Blue
32,250
2017
KIA
Soul EV
05088
للحصول على السيارات ذات الثمن الأعلى بدءًا من الرابعة حتى الأقل ثمنًا، يصبح الاستعلام بالشكل الآتي:
SELECT *
FROM cars
ORDER BY Price DESC
OFFSET 3 ROWS;
لتظهر النتائج بالشكل:
Colour
Price
Year
Company
Model
CarID
Red
25,995
2017
KIA
Optima Hybrid
05082
Blue
23,240
2018
KIA
Niro
05085
White
22,500
2018
KIA
Optima
05081
Blue
18,200
2018
KIA
Forte5
05087
Grey
14,200
2018
KIA
Rio 5-Door
05086
استعلام INSERT
مهمة هذا الاستعلام هي إنشاء سجل جديد في الجدول، وله البنية العامة:
INSERT INTO tbl_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
إذ تجب مراعاة التوافقية ما بين اسم العمود والقيمة التي ستوضع فيه على التوالي وبالترتيب، وأن تكون متوافقةً مع نوع بيانات الحقل، أي أن التوافق يجب أن يكون بالترتيب والعدد والنوع. ولإسناد قيم إلى كافة الحقول في السجل يُمكن الاستغناء عن أسماء الأعمدة ليصبح الاستعلام بالشكل:
INSERT INTO tbl_name VALUES (value1, value2, value3, ...);
إذ تجب مراعاة ترتيب القيم وعددها ونوعها ليتوافق مع الأعمدة في الجدول. أما إن كان الاستعلام بالشكل:
INSERT INTO tbl DEFAULT VALUES;
فتنفيذه يؤدي إلى إنشاء سجل جديدٍ في الجدول يحتوي على القيم الافتراضية بحسب نوع البيانات المحدد لكل عمود على حدة. وكما أن محرك MySQL يدعم الصيغة الآتية لاستعلام INSERT:
INSERT INTO tbl_name
SET assignment_list
إذ إن assignment_list هي عدد من عمليات إسناد القيم للحقول المناسبة لها.
محتويات
· 1مثال
· 2إضافة سجل لا يحتوي على كافة بيانات الأعمدة
· 3إضافة عدد من السجلات باستعلام واحد
· 4إضافة سجلات إلى الجدول من جدول آخر
· 6مصادر
مثال
إن كان الجدول students التالي موجودًا في قاعدة البيانات:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
لإضافة سجل طالب جديد رقمه التسلسلي 1075 واسمه Abed وعمره 21 سنة ومعدله 1.90 في هذا الجدول، يصبح الاستعلام بالشكل الآتي:
INSERT INTO students (StudentID, Name, Age, GPA)
VALUES (1075, Abed, 21, 1.90);
ويصبح الجدول بعد تنفيذ هذا الاستعلام:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
1.90
21
Abed
1075
إضافة سجل لا يحتوي على كافة بيانات الأعمدة
تمكن إضافة سجل لا يحتوي على كافة بيانات الأعمدة وحينئذٍ ستُملأ الأعمدة المتبقية بالقيم الافتراضية لنوع البيانات المحددة في هذه الأعمدة.
إن تنفيذ الاستعلام الآتي على الجدول الأساسي students:
INSERT INTO students (StudentID, Name, Age)
VALUES (NEWID(), Abed, 21);
سيؤدي لإضافة طالب اسمه Abed وعمره 21 وبمعدل 0.0 لأنها القيمة الافتراضية لعمود GPA أما رقمه التسلسلي فسيصبح 1086 لأن الدالة NEWID() مسؤولة عن إعطاء الرقم التسلسلي التالي لآخر رقم تسلسلي مستخدم في الجدول، ويصبح الجدول كما يلي:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
0.0
21
Abed
1086
إضافة عدد من السجلات باستعلام واحد
من الممكن أن تُضاف عدة سجلات بآن واحد ضمن نفس الاستعلام INSERT وذلك بفصل السجلات عن بعضها بفاصلة كما في الاستعلام الآتي:
INSERT INTO students (StudentID, Name, Age, GPA)
VALUES (1075, Abed, 21, 1.90), (1076, Taimaa, 23, 2.75), (1077, Mohammad, 22, 1.85);
إذ تُضاف ثلاثة سجلات للجدول ليصبح كالآتي:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
1.90
21
Abed
1075
2.75
23
Taimaa
1076
1.85
22
Mohammad
1077
إضافة سجلات إلى الجدول من جدول آخر
تمكن إضافة سجلات للجدول من جدول آخر بالاعتماد على استعلام SELECT.
ليكن الجدول الآتي newStudents موجودًا في قاعدة البيانات التي تحوي الجدول students:
GPA
Age
Name
StudentID
1.86
21
Maher
2027
3.57
23
Joud
2051
2.40
22
Kawthar
2082
3.68
25
Asmaa
2075
لدى تنفيذ الاستعلام الآتي:
INSERT INTO students (StudentID, Name, Age, GPA)
SELECT StudentID, Name, Age, GPA
FROM newStudents
WHERE GPA > 2.50;
ستضاف السجلات من الجدول newStudents والتي معدل الطالب فيها أكبر من 2.50 إلى الجدول students، ليصبح الجدول students بالشكل الآتي:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
3.57
23
Joud
2051
3.68
25
Asmaa
2075
استعلام DELETE
يُستخدم استعلام DELETE لحذف سجل أو أكثر، وله البنية العامة:
DELETE FROM tbl_name
WHERE condition;
إذ يُحدد الشرط الذي ستُحذف السجلات وفقًا له في عبارة WHERE. أما تنفيذ الاستعلامَيْن الآتيين:
DELETE * FROM tbl_name;
DELETE FROM tbl_name;
فيؤدي لحذف كافة السجلات الموجودة في الجدول.
محتويات
· 1مثال
· 3حذف البيانات من الجدول اعتمادًا على قيم البيانات في جدول آخر
· 5مصادر
مثال
إن كان جدول الزبائن customers موجودًا في قاعدة البيانات على النحو الآتي:
Bill
OrderID
FullName
CustomerID
160
0291
Abd al-Salam Hadi
1156
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
350
0294
Abd Allah Sadiq
1159
185
0255
Raghad al-Hamdan
1160
165
0276
Abd al-Razzaq Salloum
1161
175
0247
Hussam Siraj
1162
180
0208
Hiba Maktabi
1163
170
0219
Abd al-Rahman Rida
1164
220
0210
Abd al-Qader Khalil
1165
350
0211
Fateh Hammad
1166
185
0202
Abd al-Azziz Othman
1167
400
0213
Zahraa Qasem
1168
350
0314
Abd al-Wahhab Masri
1169
185
0215
Mona Saber
1170
لحذف السجلات التي يبدأ فيها اسم الزبون بكلمة Abd أو تتراوح فاتورته ما بين 150 - 200 $ يصبح الاستعلام بالشكل الآتي:
DELETE FROM customers
WHERE FullName LIKE ‘Abd%’ OR Bill BETWEEN 150 AND 200;
إذ إنَّ المعامل LIKE يحدد نمطًا للسلسلة النصية الموجودة في حقل FullName وهو تتابع أي تسلسل للمحارف من بعد البدء بكلمة Abd، والمعامل BETWEEN يحدد المجال الواقع بين القيمتَيْن المحدّدتين.
بعد تنفيذ الاستعلام سيصبح الجدول بالشكل:
Bill
OrderID
FullName
CustomerID
210
0203
Reem Hammad
1158
350
0211
Fateh Hammad
1166
400
0213
Zahraa Qasem
1168
حذف عدد محدد من السجلات
يمكن تعيين عدد محدد من السجلات التي ستُحذف وذلك بالاعتماد على الكلمة المفتاحية TOP في محرك SQL Server والكلمة المفتاحية LIMIT في محركات PostgreSQL و SQLite و MySQL والكلمة المفتاحية ROWNUM في محرك Oracle وذلك بنفس الطريقة المستخدمة لتحديد عدد السجلات في استعلام SELECT، واستعلام UPDATE.
لدى تنفيذ الاستعلام السابق بإضافة TOP بمحرك SQL Server يصبح بالشكل الآتي:
DELETE TOP (5) FROM customers
WHERE FullName LIKE ‘Abd%’ OR Bill BETWEEN 150 AND 200;
وفي محركات PostgreSQL و SQLite و MySQL بالشكل:
DELETE FROM customers
WHERE FullName LIKE ‘Abd%’ OR Bill BETWEEN 150 AND 200;
LIMIT 5;
وعند تنفيذ الاستعلامات الثلاثة السابقة ستُحذَف 5 سجلات فقط ، أي ستصبح القيم بالجدول على النحو الآتي:
Bill
OrderID
FullName
CustomerID
210
0203
Reem Hammad
1158
175
0247
Hussam Siraj
1162
180
0208
Hiba Maktabi
1163
170
0219
Abd al-Rahman Rida
1164
220
0210
Abd al-Qader Khalil
1165
350
0211
Fateh Hammad
1166
185
0202
Abd al-Azziz Othman
1167
400
0213
Zahraa Qasem
1168
350
0314
Abd al-Wahhab Masri
1169
185
0215
Mona Saber
1170
وفي حال استخدام عبارة الترتيب ORDER BY في الاستعلام فسيُحذَف العدد المطلوب من السجلات بعد ترتيبها بحسب العمود المُحدَّد، إن تنفيذ الاستعلام الآتي في محرك SQL Server بالشكل:
DELETE TOP (5) FROM customers
ORDER BY Bill;
أو في محركات PostgreSQL و SQLite و MySQL بالشكل:
DELETE FROM customers
ORDER BY Bill
LIMIT 5;
سيؤدي إلى حذف السجلات الخمس الأولى من بعد ترتيبها بحسب عمود Bill ترتيبًا تصاعديًا، وسيصبح الجدول:
Bill
OrderID
FullName
CustomerID
160
0291
Abd al-Salam Hadi
1156
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
185
0255
Raghad al-Hamdan
1160
165
0276
Abd al-Razzaq Salloum
1161
175
0247
Hussam Siraj
1162
180
0208
Hiba Maktabi
1163
170
0219
Abd al-Rahman Rida
1164
185
0202
Abd al-Azziz Othman
1167
185
0215
Mona Saber
1170
يُلاحظ هنا أن الترتيب مستخدَم مع استعلام DELETE ولذلك فإن سجلات الجدول السابق غير مرتبة لأنها ليست ناتجة عن استعلام الحصول على السجلات SELECT وبقيت بترتيبها الأصلي في الجدول.
حذف البيانات من الجدول اعتمادًا على قيم البيانات في جدول آخر
إن كان الجدول الآتي orders موجودًا في قاعدة البيانات السابقة التي تحوي جدول الزبائن customers السابق:
Item
EmployeeID
OrderID
ZenFone 4 Max
096
0302
ZenFone 3 Max
054
0291
ZenFone 4 4G LTE
096
0213
VivoBook Max
054
0210
ZenFone 3 Deluxe 5.7”
054
0314
ZenFone 3 Laser (ZC551KL)
054
0276
ولحذف السجلات من جدول customers التي طلبها موظف محدد في الجدول orders، سيصبح الاستعلام بالشكل الآتي:
DELETE FROM customers
WHERE OrderID IN
(SELECT OrderID
FROM orders
WHERE EmployeeID = 054);
وهذا بالاعتماد على مفهوم الاستعلام الفرعي Subquery الموجود في قائمة المعامل IN الذي يحدد عددًا من القيم المحتملة لقيمة الحقل OrderID، وبعد تنفيذ الاستعلام السابق سيصبح جدول الزبائن customers على النحو الآتي:
Bill
OrderID
FullName
CustomerID
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
350
0294
Abd Allah Sadiq
1159
185
0255
Raghad al-Hamdan
1160
175
0247
Hussam Siraj
1162
180
0208
Hiba Maktabi
1163
170
0219
Abd al-Rahman Rida
1164
350
0211
Fateh Hammad
1166
185
0202
Abd al-Azziz Othman
1167
400
0213
Zahraa Qasem
1168
185
0215
Mona Saber
1170
استعلام الاستبدال REPLACE
هو استعلام يستخدم للقيام بنفس مهمة الاستعلام INSERT (إضافة سجل جديد للجدول) ولكن لإدخال سجلٍ بنفس القيمة الموجودة مسبقًا في عمود المفتاح الأوليّ وذلك منعًا لحدوث التكرار، إذ يُحذف السجل المحتوي لهذه القيمة ليُضاف سجلٌ جديدٌ بدلًا منه، وتكون الصيغة العامة للاستعلام على النحو الآتي:
REPLACE INTO tbl VALUES (col_name [, col_name] ...);
إذ إن
table
هو اسم الجدول الذي سيُعدَّل فيه السجل، وتوضع القيم الجديدة ضمن القوسين.مثال
إن كان الجدول الآتي
students
موجودًا في قاعدة البيانات:GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
فلاستبدال السجل ذو الرقم الفريد 1066 (وهو رقم لا يمكن تكراره لأن هذا الحقل يعدّ مفتاحًا أوليًا للجدول) ببياناتٍ متعلقة بطالب آخر يُنفذ الاستعلام الآتي:
REPLACE INTO students VALUES (1066, 'Ahmad', 21, 3.15);
ليصبح الجدول بعد الاستبدال بالشكل الآتي:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
3.15
21
Ahmad
1066
2.87
23
Yusuf
1056
الاستعلام UPDATE
يُستخدم هذا الاستعلام من أجل تحديث قيم البيانات المخزنة في سجلات الجداول.
البنية العامة للاستعلام:
UPDATE tbl_name
SET col_name = [|DEFAULT], col_name = value [|DEFAULT], …
WHERE condition
إذ من الممكن تحديث عدة قيم في عدة سجلات ضمن نفس الاستعلام، وعند استخدام الكلمة المفتاحية DEFAULT ستصبح القيمة في الحقل هي القيمة الافتراضية لنوع البيانات فيه، أما إن كان الاستعلام بالشكل:
UPDATE tbl_name
SET col_name = value [|DEFAULT], col_name = value [|DEFAULT], …
فتنفيذه يؤدي لتعديل قيمة الحقل المحدد بكافة السجلات الموجودة في الجدول بسبب عدم وجود الشرط الذي يحدد السجلات التي ستُعدل.
محتويات
· 1مثال
· 2تحديث قيمة عدد محدد من السجلات
· 3تحديث القيم في السجلات اعتمادًا على قيم مخزنة في جدول آخر
· 5مصادر
مثال
إن كان الجدول التالي (employees) موجودًا في قاعدة البيانات:
WeeklyHours
Work
City
Salary
Name
EmployeeID
25
In centre
Beruit
200
Natalie Sinno
0156
30
In centre
Alexandria
275
Ahmad Rida
0157
25
In centre
Aleppo
210
Kareem al-Hamdan
0158
28
In centre
Rabat
190
Mahdi Thabit
0159
36
In centre
Jedda
300
Rabie al-Sadi
0160
36
In centre
Amman
290
Jaber Hammad
0161
30
In centre
Cairo
210
Rawda Hussien
0162
ويُراد زيادة 10% لقيمة الراتب وتعديل طبيعة العمل لتصبح عبر شبكة الإنترنت بدلًا من المركز، وذلك لكل موظف يسكن في أيّ من المدن (Aleppo, Cairo, Rabat) بالاستفادة من المعامل IN، فسيكون الاستعلام المطلوب:
UPDATE employees
SET Salary = Salary * 1.1 , Work =’online’
WHERE City IN (Aleppo, Cairo, Rabat);
وسيصبح الجدول بالقيم الجديدة كالآتي:
WeeklyHours
Work
City
Salary
Name
EmployeeID
25
In centre
Beruit
200
Natalie Sinno
0156
30
In centre
Alexandria
275
Ahmad Rida
0157
25
online
Aleppo
231
Kareem al-Hamdan
0158
28
online
Rabat
209
Mahdi Thabit
0159
36
In centre
Jedda
300
Rabie al-Sadi
0160
36
In centre
Amman
290
Jaber Hammad
0161
30
online
Cairo
231
Rawda Hussien
0162
تحديث قيمة عدد محدد من السجلات
يمكن تعيين عدد محدد من السجلات التي ستُحدّث قيمتها وذلك بالاعتماد على الكلمة المفتاحية TOP في محرك SQL Server والكلمة المفتاحية LIMIT في محركات PostgreSQL و SQLite و MySQL والكلمة المفتاحية ROWNUM في محرك Oracle وذلك بنفس الطريقة المستخدمة لتحديد عدد السجلات في استعلام SELECT، واستعلام DELETE.
لدى تنفيذ نفس الاستعلام السابق بإضافة TOP بمحرك SQL Server يصبح بالشكل الآتي:
UPDATE TOP (2) employees
SET Salary = Salary * 1.1, Work =’online’
WHERE City IN (Aleppo, Cairo, Rabat);
وفي محركات PostgreSQL و SQLite و MySQL بالشكل:
UPDATE employees
SET Salary = Salary * 1.1, Work =’online’
WHERE City IN (Aleppo, Cairo, Rabat)
LIMIT 2;
وفي محرك Oracle بالشكل:
UPDATE employees
SET Salary = Salary * 1.1, Work =’online’
WHERE City IN (Aleppo, Cairo, Rabat) AND ROWNUM <= 2;
وعند تنفيذ الاستعلامات الثلاثة السابقة ستُحدَّث قيمة الراتب ومكان العمل في سجلين فقط دون تعديل الثالث، أي تصبح القيم بالجدول على النحو الآتي:
WeeklyHours
Work
City
Salary
Name
EmployeeID
25
In centre
Beruit
200
Natalie Sinno
0156
30
In centre
Alexandria
275
Ahmad Rida
0157
25
online
Aleppo
231
Kareem al-Hamdan
0158
28
online
Rabat
209
Mahdi Thabit
0159
36
In centre
Jedda
300
Rabie al-Sadi
0160
36
In centre
Amman
290
Jaber Hammad
0161
30
In centre
Cairo
210
Rawda Hussien
0162
تحديث القيم في السجلات اعتمادًا على قيم مخزنة في جدول آخر
ليكن الجدول الآتي باسم leaves موجودًا في قاعدة البيانات السابقة التي تحوي جدول الموظفين (employees):
AnnualLeave
EmployeeID
10
0156
12
0157
10
0158
11
0159
15
0160
15
0161
12
0162
لإضافة يوميّ إجازة إضافيَّين للجدول leaves اعتمادًا على عدد ساعات العمل المحددة في جدول employees بحيث تكون ساعات عمل الموظف أكثر من 25 ساعة، سيُستخدم الاستعلام الآتي:
UPDATE leaves
SET AnnualLeave = AnnualLeave + 2
FROM (SELECT EmployeeID FROM employees WHERE WeeklyHours > 25 ) AS tempTable
WHERE leaves.EmployeeID = tempTable.EmployeeID;
إذ إنَّ هذا الاستعلام يعتمد على مفهوم الاستعلام الفرعي في عبارة FROM والذي حَدَّد السجلات من الجدول employees التي ساعات العمل فيها أكثر من 25، وسُمّي الجدول الناتج باسم tempTable بالاستفادة من المعامل AS، وتحقق التقابل ما بين الجدولين ضمن عبارة WHERE.
الربط بين الجداول
تخزن البيانات عادةً في قواعد البيانات بأكثر من جدول لتسهيل تنظيمها وإدارتها، وتُربط هذه الجداول فيما بينها من خلال الأعمدة المترابطة فيما بينها، وذلك بالاعتماد على مفهومي المفتاح الأولي Primary Key والمفتاح الثانوي Foreign Key، وله عدة أنواع ستُذكر تباعًا.
محتويات
o 2.1مثال
· 3دمج النتائج من استعلامي SELECT في جدول واحد
o 3.1مثال
· 5مصادر
أنواع ربط الجداول
توجد عدة أنواع للربط بين جدولين (أو أكثر)، إذ يسمى الجدول الأول يساريًا والجدول الثاني يمينًا:
1. الربط الداخلي INNER JOIN: تحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط.
2. الربط اليساري LEFT JOIN: تحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط.
3. الربط اليميني RIGHT JOIN: تحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني.
4. الربط التام FULL JOIN: تحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط.
وهذه الأنواع موضحة باستخدام مخططات Venn.
ربط أكثر من جدولين
عند ربط أكثر من جدول يكون الربط باستخدام JOIN (بأحد الأنواع الأربع) عدة مرات لتشكيل جداول مرحلية يُربط فيما بينها للحصول على جدول الربط النهائي.
مثال
تحتوي قاعدة بيانات أحد المراكز التعليمية الجداول الآتية:
الجدول الأول: جدول الطلاب students
(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)
RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
07-JUL-2017
0509
Khatib
Mohammad
1157
20-AUG-2017
0801
Sharif
Ibrahim
1158
24-OCT-2017
0802
Fehmi
Hanin
1159
20-AUG-2017
0204
Zein
Loujain
1160
08-NOV-2017
0503
Helali
Ammar
1161
الجدول الثاني: جدول الدورات التدريبية courses
(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)
DepartmentID
Lecturer
Course
CourseID
EN01
Dr. Reem Hadi
English (Adv)
0204
EN01
Dr. Shadi Balid
English (Int)
0206
EN02
Dr. Firas Abd
English (TOEFL)
0211
IT01
Eng. Nasser Sharif
Artificial Intelligence
0604
IT01
Eng. Amal Safi
Networks
0607
IT01
Eng. Salem Najm
ICDL
0610
IT02
Eng. Nasser Sharif
SQL Programming
0703
IT02
Eng. Amal Safi
FrontEnd Programming
0704
IT03
Mr. Maher Siraj
Photoshop Design
0801
IT03
Ms. Nadia Taleb
Illustrator Design
0802
IT03
Mr. Maher Siraj
UI Design
0803
الجدول الثالث: جدول الأقسام departments
(المفتاح الأولي فيه هو DepartmentID)
Head
DepatementName
DepartmentID
Dr. Firas Abd
General English
EN01
Dr. Saer Raslan
Advanced English
EN02
Dr. Osama Najjar
Information Technology
IT01
Eng. Amal Safi
Programming
IT02
Eng. Fares Ahmad
Graphic Design
IT03
لربط الجداول الثلاث السابقة يُربط الجدول الأول students مع الجدول الثاني courses عبر العمود CourseID بالعبارة:
students INNER JOIN courses ON students.CourseID = courses.CourseID
ومن ثم يربط الجدول الناتج مع الجدول الثالث عبر العمود DepartmentID بالعبارة:
INNER JOIN departments ON courses.DepartmentID = departments.DepartmentID
ليصبح الاستعلام بشكله الكامل:
SELECT StudentID, FirstName, Course, Lecturer, DepartmentName
FROM (
(students INNER JOIN courses ON students.CourseID = courses.CourseID)
INNER JOIN departments ON courses.DepartmentID = departments.DepartmentID);
وتظهر النتائج بالشكل الآتي:
DepartmentName
Lecturer
Course
FirstName
StudentID
General English
Dr. Shadi Balid
English (Int)
Rama
1147
Information Technology
Eng. Nasser Sharif
Artificial Intelligence
Jenan
1148
General English
Dr. Shadi Balid
English (Int)
Rahaf
1149
Information Technology
Eng. Amal Safi
Networks
Farah
1150
Information Technology
Eng. Salem Najm
ICDL
Rami
1151
Graphic Design
Mr. Maher Siraj
UI Design
Aya
1152
Graphic Design
Mr. Maher Siraj
Photoshop Design
Tasneem
1154
Information Technology
Eng. Amal Safi
Networks
Monther
1155
Information Technology
Eng. Amal Safi
Networks
Hiba
1156
Graphic Design
Mr. Maher Siraj
Photoshop Design
Ibrahim
1158
Graphic Design
Ms. Nadia Taleb
Illustrator Design
Hanin
1159
General English
Dr. Reem Hadi
English (Adv)
Loujain
1160
دمج النتائج من استعلامي SELECT في جدول واحد
يمكن دمج السجلات الناتجة عن استعلامي SELECT في جدول واحد من خلال الكلمة المفتاحية UNION التي توضع بين الاستعلامين.
مثال
إذا كان الجدولان الآتيان موجودَين في قاعدة البيانات بالشكل الآتي:
الجدول الأول: مجموعة الدورات التدريبية في المركز الأول
Lecturer
Course
CourseID
Dr. Reem Hadi
English (Adv)
0204
Dr. Shadi Balid
English (Int)
0206
Dr. Firas Abd
English (TOEFL)
0211
Eng. Nasser Sharif
Artificial Intelligence
0604
Eng. Amal Safi
Networks
0607
Eng. Salem Najm
ICDL
0610
Eng. Nasser Sharif
SQL Programming
0703
Eng. Amal Safi
FrontEnd Programming
0704
Mr. Maher Siraj
Photoshop Design
0801
Ms. Nadia Taleb
Illustrator Design
0802
Mr. Maher Siraj
UI Design
0803
الجدول الثاني: مجموعة الدورات التدريبية في المركز الثاني
Lecturer
Course
CourseID
Dr. Reem Hadi
English (Bas)
0205
Dr. Shadi Balid
English (Int)
0206
Dr. Firas Abd
English (IELTS)
0208
Eng. Nasser Sharif
C# Programming
0705
Eng. Amal Safi
PHP Programming
0706
Mr. Maher Siraj
AfterEffects Design
0804
Ms. Nadia Taleb
3D MAX Design
0805
فيمكن عرض سجلات الجدولين ضمن جدول واحد عبر الاستعلام الآتي:
SELECT CourseID, Course
FROM firstCentre
UNION
SELECT CourseID, Course
FROM secondCentre
ORDER BY Course DESC;
إذ دُمجت سجلات الجدولين عبر الكلمة المفتاحية UNION ورُتبت النتائج بشكل تنازليّ بحسب اسم الدورة التدريبية لتظهر النتائج الآتية:
Course
CourseID
UI Design
0803
SQL Programming
0703
PHP Programming
0706
Photoshop Design
0801
Networks
0607
Illustrator Design
0802
ICDL
0610
FrontEnd Programming
0704
English (TOEFL)
0211
English (Int)
0206
English (IELTS)
0208
English (Bas)
0205
English (Adv)
0204
C# Programming
0705
Artificial Intelligence
0604
AfterEffects Design
0804
3D MAX Design
0805
ويُلاحظ أن السجل المكرر في الجدولين لم يظهر سوى كسجل وحيد في النتائج لأن الكلمة المفتاحية UNION لا تعرض السجلات المكررة إلا بوجود الكلمة المفتاحية ALL والتي ستحدد عرض كافة السجلات متضمنةً التكرار إن وُجد، أي يصبح الاستعلام بالشكل الآتي:
SELECT CourseID, Course
FROM firstCentre
UNION ALL
SELECT CourseID, Course
FROM secondCentre
ORDER BY Course DESC;
وستظهر نفس النتائج السابقة مع تكرار سجل الدورة التدريبية English (Int).
الربط الداخلي INNER JOIN
يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط، وتكون له البنية العامّة الآتية:
SELECT col_names
FROM tbl_name1
[INNER] JOIN tbl_name2
ON col_name1 = col_name2
وكما يُلاحظ أن وجود كلمة
INNER
اختياريّ لأن الربط الداخلي هو الحالة الافتراضية في الربط.مثال
إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:
الجدول الأول: جدول الطلاب
students
(المفتاح الأولي فيه هو عمود
StudentID
والمفتاح الثانوي هو عمودCourseID
للربط مع جدول الدورات التدريبية)RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
07-JUL-2017
0509
Khatib
Mohammad
1157
20-AUG-2017
0801
Sharif
Ibrahim
1158
24-OCT-2017
0802
Fehmi
Hanin
1159
20-AUG-2017
0204
Zein
Loujain
1160
08-NOV-2017
0503
Helali
Ammar
1161
الجدول الثاني: جدول الدورات التدريبية
courses
(المفتاح الأولي فيه هو عمود
CourseID
والمفتاح الثانوي هو عمودDepartmentID
للربط مع جدول الأقسام)CourseID
Course
Lecturer
DepartmentID
0204
English (Adv)
Dr. Reem Hadi
EN01
0206
English (Int)
Dr. Shadi Balid
EN01
0211
English (TOEFL)
Dr. Firas Abd
EN02
0604
Artificial Intelligence
Eng. Nasser Sharif
IT01
0607
Networks
Eng. Amal Safi
IT01
0610
ICDL
Eng. Salem Najm
IT01
0703
SQL Programming
Eng. Nasser Sharif
IT02
0704
FrontEnd Programming
Eng. Amal Safi
IT02
0801
Photoshop Design
Mr. Maher Siraj
IT03
0802
Illustrator Design
Ms. Nadia Taleb
IT03
0803
UI Design
Mr. Maher Siraj
IT03
الجدول الثالث: جدول الأقسام departments
(المفتاح الأولي فيه هو DepartmentID)
Head
DepatementName
DepartmentID
Dr. Firas Abd
General English
EN01
Dr. Saer Raslan
Advanced English
EN02
Dr. Osama Najjar
Information Technology
IT01
Eng. Amal Safi
Programming
IT02
Eng. Fares Ahmad
Graphic Design
IT03
فإن تنفيذ الاستعلام الآتي:
SELECT StudentID, FirstName, Course, Lecturer
FROM students st
INNER JOIN courses co
ON st.CourseID = co.CourseID;
سيُظهر السجلات من الجدول
students
(والذي سُمي باسمst
ضمن الشيفرة) والجدولcourses
(والذي سُمي باسمco
ضمن الشيفرة) بالربط بينهما داخليًا عبر العمودCourseID
لتظهر النتائج الآتية:Lecturer
Course
FirstName
StudentID
Dr. Shadi Balid
English (Int)
Rama
1147
Eng. Nasser Sharif
Artificial Intelligence
Jenan
1148
Dr. Shadi Balid
English (Int)
Rahaf
1149
Eng. Amal Safi
Networks
Farah
1150
Eng. Salem Najm
ICDL
Rami
1151
Mr. Maher Siraj
UI Design
Aya
1152
Mr. Maher Siraj
Photoshop Design
Tasneem
1154
Eng. Amal Safi
Networks
Monther
1155
Eng. Amal Safi
Networks
Hiba
1156
Mr. Maher Siraj
Photoshop Design
Ibrahim
1158
Ms. Nadia Taleb
Illustrator Design
Hanin
1159
Dr. Reem Hadi
English (Adv)
Loujain
1160
ويُلاحظ أنه لم تظهر كافة سجلات الطلاب إذ استُثني الطلاب الذين لديهم دورات تدريبية غير موجودة في جدول الدورات التدريبية (مثل الطالب Abed Haddad)، وكذلك لم تظهر الدورات التدريبية التي لا يوجد فيها أي طلاب مسجلين (مثل دورة SQL Programming).
الربط اليساري LEFT JOIN
يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط، وتكون له البنية العامّة الآتية:
SELECT col_names
FROM tbl_name1
LEFT [OUTER] JOIN tbl_name2
ON col_name1 = col_name2
مثال
إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:
الجدول الأول: جدول الطلاب
students
(المفتاح الأولي فيه هو عمود
StudentID
والمفتاح الثانوي هو عمودCourseID
للربط مع جدول الدورات التدريبية)RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
07-JUL-2017
0509
Khatib
Mohammad
1157
20-AUG-2017
0801
Sharif
Ibrahim
1158
24-OCT-2017
0802
Fehmi
Hanin
1159
20-AUG-2017
0204
Zein
Loujain
1160
08-NOV-2017
0503
Helali
Ammar
1161
الجدول الثاني: جدول الدورات التدريبية
courses
(المفتاح الأولي فيه هو عمود
CourseID
والمفتاح الثانوي هو عمودDepartmentID
للربط مع جدول الأقسام)DepartmentID
Lecturer
Course
CourseID
EN01
Dr. Reem Hadi
English (Adv)
0204
EN01
Dr. Shadi Balid
English (Int)
0206
EN02
Dr. Firas Abd
English (TOEFL)
0211
IT01
Eng. Nasser Sharif
Artificial Intelligence
0604
IT01
Eng. Amal Safi
Networks
0607
IT01
Eng. Salem Najm
ICDL
0610
IT02
Eng. Nasser Sharif
SQL Programming
0703
IT02
Eng. Amal Safi
FrontEnd Programming
0704
IT03
Mr. Maher Siraj
Photoshop Design
0801
IT03
Ms. Nadia Taleb
Illustrator Design
0802
IT03
Mr. Maher Siraj
UI Design
0803
الجدول الثالث: جدول الأقسام
departments
(المفتاح الأولي فيه هو
DepartmentID
)Head
DepatementName
DepartmentID
Dr. Firas Abd
General English
EN01
Dr. Saer Raslan
Advanced English
EN02
Dr. Osama Najjar
Information Technology
IT01
Eng. Amal Safi
Programming
IT02
Eng. Fares Ahmad
Graphic Design
IT03
فإن تنفيذ الاستعلام الآتي:
SELECT StudentID, FirstName, Course, Lecturer
FROM students st
LEFT JOIN courses co
ON st.CourseID = co.CourseID;
سيُظهر كافة السجلات من الجدول
students
(والذي سُمي باسمst
ضمن الشيفرة) وسجلات الجدولcourses
(والذي سُمي باسمco
ضمن الشيفرة) المرتبطة فقط بالجدولstudents
عبر العمودCourseID
لتظهر النتائج الآتية:Lecturer
Course
FirstName
StudentID
Dr. Shadi Balid
English (Int)
Rama
1147
Eng. Nasser Sharif
Artificial Intelligence
Jenan
1148
Dr. Shadi Balid
English (Int)
Rahaf
1149
Eng. Amal Safi
Networks
Farah
1150
Eng. Salem Najm
ICDL
Rami
1151
Mr. Maher Siraj
UI Design
Aya
1152
NULL
NULL
Abed
1153
Mr. Maher Siraj
Photoshop Design
Tasneem
1154
Eng. Amal Safi
Networks
Monther
1155
Eng. Amal Safi
Networks
Hiba
1156
NULL
NULL
Mohammad
1157
Mr. Maher Siraj
Photoshop Design
Ibrahim
1158
Ms. Nadia Taleb
Illustrator Design
Hanin
1159
Dr. Reem Hadi
English (Adv)
Loujain
1160
NULL
NULL
Ammar
1161
الربط اليميني RIGHT JOIN
يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني، وتكون له البنية العامّة الآتية:
SELECT col_names
FROM tbl_name1
RIGHT [OUTER] JOIN tbl_name2
ON col_name1 = col_name2
مثال
إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:
الجدول الأول: جدول الطلاب
students
(المفتاح الأولي فيه هو عمود
StudentID
والمفتاح الثانوي هو عمودCourseID
للربط مع جدول الدورات التدريبية)RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
07-JUL-2017
0509
Khatib
Mohammad
1157
20-AUG-2017
0801
Sharif
Ibrahim
1158
24-OCT-2017
0802
Fehmi
Hanin
1159
20-AUG-2017
0204
Zein
Loujain
1160
08-NOV-2017
0503
Helali
Ammar
1161
الجدول الثاني: جدول الدورات التدريبية
courses
(المفتاح الأولي فيه هو عمود
CourseID
والمفتاح الثانوي هو عمودDepartmentID
للربط مع جدول الأقسام)DepartmentID
Lecturer
Course
CourseID
EN01
Dr. Reem Hadi
English (Adv)
0204
EN01
Dr. Shadi Balid
English (Int)
0206
EN02
Dr. Firas Abd
English (TOEFL)
0211
IT01
Eng. Nasser Sharif
Artificial Intelligence
0604
IT01
Eng. Amal Safi
Networks
0607
IT01
Eng. Salem Najm
ICDL
0610
IT02
Eng. Nasser Sharif
SQL Programming
0703
IT02
Eng. Amal Safi
FrontEnd Programming
0704
IT03
Mr. Maher Siraj
Photoshop Design
0801
IT03
Ms. Nadia Taleb
Illustrator Design
0802
IT03
Mr. Maher Siraj
UI Design
0803
الجدول الثالث: جدول الأقسام
departments
(المفتاح الأولي فيه هو
DepartmentID
)Head
DepatementName
DepartmentID
Dr. Firas Abd
General English
EN01
Dr. Saer Raslan
Advanced English
EN02
Dr. Osama Najjar
Information Technology
IT01
Eng. Amal Safi
Programming
IT02
Eng. Fares Ahmad
Graphic Design
IT03
فإن تنفيذ الاستعلام الآتي:
SELECT StudentID, FirstName, Course, Lecturer
FROM students st
RIGHT JOIN courses co
ON st.CourseID = co.CourseID;
سيُظهر سجلات الجدول
students
(والذي سُمي باسمst
ضمن الشيفرة) المرتبطة فقط بالجدولcourses
(والذي سُمي باسمco
ضمن الشيفرة) عبر العمودCourseID
، إضافةً إلى كافة السجلات الموجودة في جدولcourses
سواء أكان لها ارتباط بجدولstudents
أو لم يكن، لتظهر النتائج الآتية:Lecturer
Course
FirstName
StudentID
Dr. Shadi Balid
English (Int)
Rama
1147
Eng. Nasser Sharif
Artificial Intelligence
Jenan
1148
Dr. Shadi Balid
English (Int)
Rahaf
1149
Eng. Amal Safi
Networks
Farah
1150
Eng. Salem Najm
ICDL
Rami
1151
Mr. Maher Siraj
UI Design
Aya
1152
Mr. Maher Siraj
Photoshop Design
Tasneem
1154
Eng. Amal Safi
Networks
Monther
1155
Eng. Amal Safi
Networks
Hiba
1156
Mr. Maher Siraj
Photoshop Design
Ibrahim
1158
Ms. Nadia Taleb
Illustrator Design
Hanin
1159
Dr. Reem Hadi
English (Adv)
Loujain
1160
Dr. Firas Abd
English (TOEFL)
NULL
NULL
Eng. Nasser Sharif
SQL Programming
NULL
NULL
Eng. Amal Safi
FrontEnd Programming
NULL
NULL
الربط التام FULL JOIN
يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط، وتكون له البنية العامّة الآتية:
SELECT col_names
FROM tbl_name1
FULL JOIN tbl_name2
ON col_name1 = col_name2
مثال
إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:
الجدول الأول: جدول الطلاب
students
(المفتاح الأولي فيه هو عمود
StudentID
والمفتاح الثانوي هو عمودCourseID
للربط مع جدول الدورات التدريبية)RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
07-JUL-2017
0509
Khatib
Mohammad
1157
20-AUG-2017
0801
Sharif
Ibrahim
1158
24-OCT-2017
0802
Fehmi
Hanin
1159
20-AUG-2017
0204
Zein
Loujain
1160
08-NOV-2017
0503
Helali
Ammar
1161
الجدول الثاني: جدول الدورات التدريبية
courses
(المفتاح الأولي فيه هو عمود
CourseID
والمفتاح الثانوي هو عمودDepartmentID
للربط مع جدول الأقسام)DepartmentID
Lecturer
Course
CourseID
EN01
Dr. Reem Hadi
English (Adv)
0204
EN01
Dr. Shadi Balid
English (Int)
0206
EN02
Dr. Firas Abd
English (TOEFL)
0211
IT01
Eng. Nasser Sharif
Artificial Intelligence
0604
IT01
Eng. Amal Safi
Networks
0607
IT01
Eng. Salem Najm
ICDL
0610
IT02
Eng. Nasser Sharif
SQL Programming
0703
IT02
Eng. Amal Safi
FrontEnd Programming
0704
IT03
Mr. Maher Siraj
Photoshop Design
0801
IT03
Ms. Nadia Taleb
Illustrator Design
0802
IT03
Mr. Maher Siraj
UI Design
0803
الجدول الثالث: جدول الأقسام departments
(المفتاح الأولي فيه هو DepartmentID)
Head
DepatementName
DepartmentID
Dr. Firas Abd
General English
EN01
Dr. Saer Raslan
Advanced English
EN02
Dr. Osama Najjar
Information Technology
IT01
Eng. Amal Safi
Programming
IT02
Eng. Fares Ahmad
Graphic Design
IT03
فإن تنفيذ الاستعلام الآتي:
SELECT StudentID, FirstName, Course, Lecturer
FROM students st
FULL JOIN courses co
ON st.CourseID = co.CourseID;
سيُظهر كافة السجلات من الجدول
students
(والذي سُمي باسمst
ضمن الشيفرة) وكافة سجلات الجدولcourses
(والذي سُمي باسمco
ضمن الشيفرة) سواءً كانت مرتبطة عبر العمودCourseID
أو لم تكن، لتظهر النتائج الآتية:Lecturer
Course
FirstName
StudentID
Dr. Shadi Balid
English (Int)
Rama
1147
Eng. Nasser Sharif
Artificial Intelligence
Jenan
1148
Dr. Shadi Balid
English (Int)
Rahaf
1149
Eng. Amal Safi
Networks
Farah
1150
Eng. Salem Najm
ICDL
Rami
1151
Mr. Maher Siraj
UI Design
Aya
1152
NULL
NULL
Abed
1153
Mr. Maher Siraj
Photoshop Design
Tasneem
1154
Eng. Amal Safi
Networks
Monther
1155
Eng. Amal Safi
Networks
Hiba
1156
NULL
NULL
Mohammad
1157
Mr. Maher Siraj
Photoshop Design
Ibrahim
1158
Ms. Nadia Taleb
Illustrator Design
Hanin
1159
Dr. Reem Hadi
English (Adv)
Loujain
1160
NULL
NULL
Ammar
1161
Dr. Firas Abd
English (TOEFL)
NULL
NULL
Eng. Nasser Sharif
SQL Programming
NULL
NULL
Eng. Amal Safi
FrontEnd Programming
NULL
NULL
المعاملات
المعاملات Operators في SQL
محتويات
· 1المعاملات الرياضية Arithmetic Operators
o 1.1مثال
· 2المعاملات الثنائية Bitwise Operators
o 2.1أمثلة
· 3معاملات المقارنة Comparison Operators
o 3.1مثال
· 4المعاملات المركبة مع الإسناد Compound Operators
· 5المعاملات المنطقية Logical Operators
o 6.1أولوية المعاملات في محرك SQL Server
o 6.2أولوية المعاملات في محرك SQLite
o 6.3أولوية المعاملات في محرك Oracle
o 6.4أولوية المعاملات في محرك MySQL
o 6.5أولوية المعاملات في محرك Postgresql
o 6.6مثال
· 8مصادر
المعاملات الرياضية Arithmetic Operators
تستخدم لإجراء العمليات الحسابية على البيانات العددية في الجداول، وهي:
المعامل
المهمة
+
الجمع
-
الطرح
*
الضرب
/
القسمة
%
باقي القسمة
ويضاف إليها المعامل ^ في محرك PostgreSQL للقيام بعملية الرفع إلى قوة.
مثال
إن كان الجدول الآتي items موجودًا في قاعدة البيانات:
DiscountPercent
No
Price
ItemID
20
2
25
157
10
2
5
203
30
3
10
109
فيمكن حساب قيمة الشراء النهائية من خلال إجراء العملية الحسابية وجمع النتائج باستخدام الدالة التجميعية SUM() كما في الاستعلام الآتي:
SELECT SUM((Price * No) - (Price * No * DiscountPercent * 0.01)) AS FinalBill
From items;
لتظهر النتيجة الآتية:
FinalBill
70
ملاحظة
يمكن استخدام المعامل + للربط ما بين السلاسل النصية فمثلًا في الاستعلام الآتي:
SELECT (FirstName + LastName) AS FullName
FROM students;
يقوم معامل + بالربط ما بين العمودين FirstName و LastName وعرضهما في عمود واحد باسم FullName.
وهذا مختلف في محركات Oracle و SQLite و PostgreSQL إذ يستخدم المعامل || للربط ما بين السلاسل النصية بدلًا من +، أما في محرك MySQL فإن المعامل || يستخدم للعملية المنطقية OR.
المعاملات الثنائية Bitwise Operators
تستخدم للقيام بالعمليات الثنائية على البيانات العددية الصحيحة، إذ تُحوّل القيم الصحيحة إلى خانات ثنائية bits توافق القيم لتُجرى عليها العمليات ثم تُحول النتيجة إلى قيمة صحيحة من جديد، وهي:
المعامل
المهمة
&
AND (تصبح الخانة بقيمة 1 إن كانت الخانتان المتقابلتان بقيمة 1)
|
OR (تصبح الخانة بقيمة 1 إن كانت الخانتان المتقابلتان أو إحداهما بقيمة 1)
^
XOR (تصبح الخانة بقيمة 1 إن كانت خانة واحدة فقط من الخانتين المتقابلتين بقيمة 1)
~
NOT (تعكس حالة الخانة من 0 إلى 1 أو بالعكس)
ويضاف لها في محركات MySQL و SQLite و Postgresql المعاملَين:
· المعامل << للإزاحة نحو اليسار بعدد الخانات المحدد بالعدد بعد المعامل.
· المعامل >> للإزاحة نحو اليمين بعدد الخانات المحدد بالعدد بعد المعامل.
أما في محرك PostgreSQL فإن المعامل # يقوم بالعملية الثنائية XOR للخانات.
أمثلة
لدى تنفيذ العمليات السابقة على العددين 110 (بالتمثيل الثنائي 01101110) و 96 (بالتمثيل الثنائي 01100000) يعطي النتائج الآتية:
AND
01101110
01100000
-------------
01100000
OR
01101110
01100000
-------------
01101110
XOR
01101110
01100000
-------------
00001110
NOT
01101110
-------------
10010001
معاملات المقارنة Comparison Operators
تستخدم للمقارنة ما بين قيمتين من أي نوع من أنواع البيانات باستثناء السلاسل النصية، وتكون قيمة النتيجة قيمة بوليانية إما TRUE أو FALSE، وهي:
المعامل
المهمة
=
يساوي
<
أصغر من
>
أكبر من
<=
أصغر من أو يساوي
>=
أكبر من أو يساوي
<>
لا يساوي
مثال
ليكن الجدول الآتي students موجودًا في قاعدة البيانات:
RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
إن تنفيذ الاستعلام الآتي:
SELECT *
FROM students
WHERE StudentID >= 1150 AND FirstName <> Rami;
سيجلب السجلات التي يكون الرقم التسلسلي فيها أكبر من أو يساوي القيمة 1150 باستثناء السجلات التي يكون فيها الاسم الأول للطالب Rami، لتظهر النتائج الآتية:
RegDate
CourseID
LastName
FirstName
StudentID
20-AUG-2017
0607
Taweel
Farah
1150
24-OCT-2017
0803
Akkad
Aya
1152
المعاملات المركبة مع الإسناد Compound Operators
تستخدم لإجراء العمليات على القيمة المخزنة بالمتحول وإعادة تخزين القيمة الجديدة بالمتحول نفسه، وهي:
المعامل
المهمة
+=
الجمع والإسناد
-=
الطرح والإسناد
*=
الضرب والإسناد
/=
القسمة والإسناد
%=
باقي القسمة والإسناد
&=
العملية الثنائية AND والإسناد
|=
العملية الثنائية OR والإسناد
^=
العملية الثنائية XOR والإسناد
المعاملات المنطقية Logical Operators
وتشمل:
· AND و OR و NOT
· BETWEEN و IN
· ALL و ANY و SOME
· UNION و INTERSECT و EXCEPT
· LIKE
· EXISTS
· IS NULL
· ON
· UNIQUE
أولوية المعاملات
عند وجود أكثر من معامل معًا في نفس العبارة تُحدِّد أولويةُ المعاملات الترتيبَ الذي تتم العمليات وفقًا له، وعند وجود أكثر من معامل ضمن نفس مستوى الأولوية تنفذ العمليات بحسب ورودها بدءًا من اليسار إلى اليمين.
أولوية المعاملات في محرك SQL Server
مستوى الأولوية
المعاملات
1
المعامل الثنائي للنفي ~
2
الضرب * والقسمة / وباقي القسمة %
3
+ (لتحديد قيمة موجبة أو الجمع أو ربط السلاسل النصية)
- (لتحديد قيمة سالبة أو الطرح)
المعاملات الثنائية & و | و ^
4
معاملات المقارنة = و > و < و >= و <= و <>
5
NOT
6
AND
7
ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
8
معامل الإسناد =
أولوية المعاملات في محرك SQLite
مستوى الأولوية
المعاملات
1
معامل الربط ||
2
الضرب * والقسمة / وباقي القسمة %
3
+ (الجمع)
- (الطرح)
4
المعاملات الثنائية & و |
معاملات الإزاحة << و >>
5
معاملات المقارنة = و > و < و >= و <=
6
معاملات المقارنة = و <>
IN, LIKE
7
AND
8
OR
أولوية المعاملات في محرك Oracle
مستوى الأولوية
المعاملات
1
المعاملات الأحادية + و - (لتحديد إشارة العدد الموجب أو السالب)
2
الضرب * والقسمة /
3
+ (الجمع)
- (الطرح)
معامل ربط السلاسل النصية
4
كافة معاملات المقارنة
5
NOT
6
AND
7
OR
أولوية المعاملات في محرك MySQL
مستوى الأولوية
المعاملات
1
المعاملات الأحادية + و - (لتحديد إشارة العدد الموجب أو السالب)
2
المعامل الثنائي ^
3
الضرب * والقسمة / وباقي القسمة %
4
+ (الجمع) و - (الطرح)
5
معاملات الإزاحة << و >>
6
المعامل الثنائي &
7
المعامل الثنائي |
8
معاملات المقارنة = و > و < و >= و <= و <>
المعاملات IS, LIKE, IN
9
BETWEEN, CASE, WHEN, THEN, ELSE
10
NOT
11
AND
12
XOR
13
OR
14
معامل الإسناد =
أولوية المعاملات في محرك Postgresql
مستوى الأولوية
المعاملات
1
المعامل الأحادي - (لتحديد إشارة العدد السالب)
2
المعامل ^ للرفع إلى قوة
3
الضرب * والقسمة / وباقي القسمة %
4
+ (الجمع) و - (الطرح)
5
IS
6
IN
7
BETWEEN
8
LIKE
9
معاملات المقارنة
10
= معامل الإسناد والتساوي
11
NOT
12
AND
13
OR
مثال
في عبارة WHERE الآتية:
WHERE salary-tax*0.5 BETWEEN 500 AND 550
ستُنفذ عملية الضرب * ثم الطرح - ثم تحديد المجال للقيمة الناتجة عبر المعامل BETWEEN.
DISTINCT
تستخدم العبارة DISTINCT للحصول على قيمٍ فريدةٍ غير مكررة، وغالبًا ما تستخدم في استعلام SELECT للحصول على سجلات لا تتكرر القيم فيما بينها، إذ يصبح الاستعلام بالشكل الآتي:
SELECT DISTINCT columns
FROM tbl;
محتويات
· 1مثال
o 2.1مثال
· 4مصادر
مثال
إن كان الجدول الآتي patients موجودًا في قاعدة البيانات:
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Fateh
Cardiology
65
Rami
1070
Kareem
Neurology
19
Abd al-Rahim
1150
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Hadi
Critical Care
58
Ahmad
1154
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
Fateh
Cardiology
55
Sarah
1180
Hadi
Critical Care
23
Fadi
1076
فللحصول على أسماء الأقسام الخاصة بالمرضى Section دون أي تكرار يُستخدَم الاستعلام الآتي:
SELECT DISTINCT Section
FROM patients;
وتظهر النتائج بالشكل الآتي:
Section
Cardiology
Neurology
Maternity
Critical Care
الحصول على سجل واحد فقط
تُمكن الاستفادة من عبارة DISTINCT للحصول على سجلٍ واحدٍ فقط لكل مجموعةٍ من السجلات التي تحتوي نفس القيمة، ولضمان الحصول على السجل المطلوب تستخدم عبارة ORDER BY في الاستعلام، ليصبح بالشكل:
SELECT DISTINCT ON (col) cols
FROM tbl
ORDER BY cols;
مثال
إن كان الجدول weather الآتي موجودًا في قاعدة البيانات:
Report
Time
Location
Mostly Cloudy
4:30
Aleppo
Showers
4:30
Damascus
Partly Cloudy
13:00
Damascus
Showers
5:00
Aleppo
Partly Cloudy
17:00
Aleppo
Sunny
15:00
Damascus
Showers
12:30
Aleppo
عند تنفيذ الاستعلام الآتي:
SELECT DISTINCT ON (Location) Location, Time, Report
FROM weather
ORDER BY Location, Time DESC;
تُجلب السجلات الأحدث (اعتمادًا على الترتيب الزمني التنازليّ) لكل موقعٍ دون تكرار أيّ منها، وتظهر النتائج:
Report
Time
Location
Partly Cloudy
17:00
Aleppo
Sunny
15:00
Damascus
المعامل EXISTS
<
يستخدم المعامل EXISTS للتأكد من وجود سجلات ناتجة عن الاستعلام الفرعي المستخدم في الاستعلام الرئيسي.
محتويات
· 1مثال
· 3مثال
· 5مصادر
مثال
إن كان في قاعدة البيانات الجدولان الآتيان:
الجدول الأول: جدول الطلاب students
RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
الجدول الثاني: جدول الدورات التدريبية courses
DepartmentID
Lecturer
Course
CourseID
EN01
Dr. Reem Hadi
English (Adv)
0204
EN01
Dr. Shadi Balid
English (Int)
0206
EN02
Dr. Firas Abd
English (TOEFL)
0211
IT01
Eng. Nasser Sharif
Artificial Intelligence
0604
IT01
Eng. Amal Safi
Networks
0607
IT01
Eng. Salem Najm
ICDL
0610
IT02
Eng. Nasser Sharif
SQL Programming
0703
IT02
Eng. Amal Safi
FrontEnd Programming
0704
IT03
Mr. Maher Siraj
Photoshop Design
0801
IT03
Ms. Nadia Taleb
Illustrator Design
0802
IT03
Mr. Maher Siraj
UI Design
0803
فإن الاستعلام الآتي:
SELECT Course
FROM courses
WHERE EXISTS
(SELECT *
FROM students
WHERE CourseID = courses.CourseID);
يعرض أسماء الدورات التدريبية التي يوجد فيها طالب أو أكثر دون أيّ من الدورات الخالية، أي تظهر الدورات الآتية:
Course
English (Int)
Artificial Intelligence
Networks
ICDL
Photoshop Design
UI Design
المعامل NOT EXISTS
يعمل بمهمة معاكسة للمعامل EXISTS أي للتأكد من عدم وجود سجلات ناتجة عن الاستعلام الفرعي المستخدم في الاستعلام الرئيسي.
مثال
إن تنفيذ الاستعلام الآتي:
SELECT Course
FROM courses
WHERE NOT EXISTS
(SELECT *
FROM students
WHERE CourseID = courses.CourseID);
سيعرِض أسماء الدورات التدريبية التي لم يُسجّل فيها أي طالب، لتظهر النتائج:
Course
English (Adv)
English (TOEFL)
SQL Programming
FrontEnd Programming
Illustrator Design
المعامل LIKE
يستخدم هذا المعامل لتحديد نمط معين للسلسلة النصية يُحدد الشرط وفقًا له، ويوضح الجدول الآتي الرموز المستخدمة في صياغة هذا النمط:
الرمز
استخدامه
%
أي سلسلة نصّية خالية أو بمحرف أو أكثر
_
محرف وحيد
مثال
إن كان الجدول الآتي
customers
في قاعدة البيانات:Bill
OrderID
FullName
CustomerID
160
0291
Abd al-Salam Hadi
1156
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
350
0294
Abd Allah Sadiq
1159
185
0255
Raghad al-Hamdan
1160
165
0276
Abd al-Razzaq Salloum
1161
175
0247
Hussam Siraj
1162
180
0208
Hiba Maktabi
1163
170
0219
Abd al-Rahman Rida
1164
220
0210
Abd al-Qader Khalil
1165
إن تنفيذ الاستعلام الآتي:
SELECT *
FROM customers
WHERE FullName LIKE 'H%' OR (FullName LIKE 'A%' AND FullName NOT LIKE '_b_%');
حيث أن :
أي سلسلة نصية في بدايتها H
'H%'
أي سلسلة نصية في بدايتها A
'A%'
أي سلسلة نصية في بدايتها على الأقل ثلاث محارف والمحرف الثاني حصراً b
'%_b_'
سيؤدي لعرض كافة النتائج للزبائن الذين تبدأ أسماؤهم بحرف H أو بحرف A ولكن دون أن يكون الحرف الثاني b ويليه حرف ثم أي تسلسل للمحارف، وستظهر النتائج:
Bill
OrderID
FullName
CustomerID
170
0302
Ahmad Mostafa
1157
175
0247
Hussam Siraj
1162
180
0208
Hiba Maktabi
1163
المعاملات المنطقية في SQL
غالبًا ما تستخدم المعاملات المنطقية (
AND
وOR
وNOT
) في عبارة WHERE للربط ما بين الشروط أو نفيها، إذ يستخدم المعاملAND
للربط ما بين الشروط للتأكد من تحققها جميعًا، أما معاملOR
فيستخدم للربط ما بين الشروط للتأكد من تحقّق شرطٍ أو أكثر من بينها، أماNOT
فيستخدم بغرض النفي، وتكون قيمة التعبير النهائية منطقية (Boolean) إماTRUE
أوFALSE
.ويُضاف لها معامل
XOR
في محرك MySQL والذي يتحقق من تحقّق شرطٍ واحدٍ فقط دون الشروط الأخرى.مثال
إن كان الجدول الآتي
cars
موجودًا في قاعدة البيانات:Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Black
31,990
2017
KIA
Cadenza
05084
Blue
23,240
2018
KIA
Niro
05085
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
18,200
2018
KIA
Forte5
05087
Blue
32,250
2017
KIA
Soul EV
05088
إن تنفيذ الاستعلام الآتي:
SELECT *
FROM cars
WHERE Year=2018 AND NOT (Colour = ‘Red’ OR Colour = ‘Blue’);
سيُظهِر كافة السيارات التي تكون فيها قيمة السنة 2018 وأي قيمة للون باستثناء القيمتين Red أو Blue، وستظهر النتائج الآتية:
Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Grey
14,200
2018
KIA
Rio 5-Door
05086
تحديد مجال أو عدد محدّد من القيم في SQL
محتويات
o 1.1مثال
o 2.1مثال
· 4مصادر
معامل IN
يستخدم لتحديد عددٍ معيّنٍ من القيم المحتملة لأحد حقول البيانات.
مثال
إن كان الجدولان الآتيان موجوديَن في قاعدة البيانات:
الجدول الأول: جدول السيارات cars
Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Black
31,990
2017
KIA
Cadenza
05084
Blue
23,240
2018
KIA
Niro
05085
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
18,200
2018
KIA
Forte5
05087
الجدول الثاني: جدول الزبائن customers
Remaining
CarID
Name
CustomerID
19,500
05081
Kareem al-Hamdan
0158
17,500
05081
Rasha Mostafa
0160
10,200
05087
Jaber Hammad
0161
19,990
05084
Wessam Fattah
0162
إن تنفيذ الاستعلام الآتي:
SELECT *
FROM cars
WHERE Colour IN ( 'Red' , 'Black', 'White');
سيُظهِر كافة السيارات التي تكون فيها قيمة اللون إحدى القيم Red أو Black أو White، وستظهر النتائج الآتية:
Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Black
31,990
2017
KIA
Cadenza
05084
لمعرفة السيارات التي لم تُشترَ من قبل أيّ من الزبائن يمكن استخدام الاستعلام الآتي:
SELECT *
FROM cars
WHERE CarID NOT IN(
SELECT CarID
FROM customers
);
وذلك اعتمادًا على مفهوم الاستعلام الفرعي، لتظهر النتائج الآتية:
Colour
Price
Year
Model
Company
CarID
Red
25,995
2017
Optima Hybrid
KIA
05082
Red
31,900
2018
Stinger
KIA
05083
Blue
23,240
2018
Niro
KIA
05085
Grey
14,200
2018
Rio 5-Door
KIA
05086
معامل BETWEEN
يستخدم لتحديد قيمتي البداية والنهاية لمجال من القيم، ويستخدم معه المعامل AND للوصل ما بين القيمتين.
مثال
لِعرض كافة السيارات التي يقع رقمها التسلسلي في المجال ما بين القيمتين 5081 و 5084 يصبح الاستعلام بالشكل الآتي:
SELECT *
FROM cars
WHERE CarID BETWEEN 5081 AND 5084;
لتظهر النتائج:
Colour
Price
Year
Model
Company
CarID
White
22,500
2018
Optima
KIA
05081
Red
25,995
2017
Optima Hybrid
KIA
05082
Red
31,900
2018
Stinger
KIA
05083
Black
31,990
2017
Cadenza
KIA
05084
معاملات الربط بين نتائج الاستعلامات في SQL
<
تستخدم لدمج نتائج عدد من الاستعلامات وفق ثلاثة معاملات:
الضم UNION: وهي عملية احتواء نتائج كافة الاستعلامات التي يربط بينها المعامل UNION دون أي تكرار في السجلات.
التقاطع INTERSECT: عملية تقاطع النتائج ما بين الاستعلامات، أي إظهار النتائج المشتركة فقط ما بين الاستعلامات التي يربط بينها المعامل INTERSECT.
الاستثناء EXCEPT: عملية استثناء نتائج الاستعلام الذي يلي المعامل EXCEPT، وتختلف الكلمة المفتاحية لهذا المعامل في محرك Oracle إذ هي MINUS بدلًا من EXCEPT.
انظر إلى مخططات فن Venn Diagrams لرسومات توضيحية.
محتويات
· 1مثال
· 2عرض السجلات المكررة UNION ALL
o 2.1مثال
· 4مصادر
مثال
إن كان الجدول الآتي patients موجودًا في قاعدة البيانات:
Doctor
Section
Age
Patient
PatientID
Nasser
Cardiology
76
Salem
1029
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Fateh
Cardiology
65
Rami
1070
Kareem
Neurology
19
Abd al-Rahim
1150
Hadi
Critical Care
65
Roushd
1097
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Hadi
Critical Care
58
Ahmad
1154
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
إن كان الاستعلام الآتي:
SELECT *
FROM patients
WHERE Age<45
UNION
SELECT *
FROM patients
WHERE Doctor='Abd Allah';
فإن المعامل UNION يربط نتائج الاستعلامين ليشمل السجلات الواردة في كليهما أي ستظهر السجلات التي عمر المريض فيها أقل من 45 سنة والسجلات التي اسم الطبيب فيها هو Abd Allah، لتظهر النتائج الآتية:
Doctor
Section
Age
Patient
PatientID
Abd Allah
Neurology
17
Hasan
896
Reem
Maternity
23
Nadine
964
Kareem
Neurology
19
Abd al-Rahim
1150
Reem
Maternity
27
Sana
1034
Abd Allah
Neurology
49
Helen
963
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
أما في الاستعلام الآتي:
SELECT *
FROM patients
WHERE Age<45
INTERSECT
SELECT *
FROM patients
WHERE Doctor='Abd Allah';
فإن المعامل INTERSECT يُبقي السجلات المشتركة ما بين الاستعلامين فقط ولا يظهر سواها، تظهر النتائج الآتية:
Doctor
Section
Age
Patient
PatientID
Abd Allah
Neurology
17
Hasan
896
أما في الاستعلام الآتي:
SELECT *
FROM patients
WHERE Age<45
EXCEPT -- MINUS in Oracle DB
SELECT *
FROM patients
WHERE Doctor='Abd Allah';
فتظهر سجلات الاستعلام الأول من بعد استثناء سجلات الاستعلام الثاني منها أي سيُحذف منها كل سجل فيه اسم الطبيب Abd Allah ، لتظهر النتائج:
Doctor
Section
Age
Patient
PatientID
Reem
Maternity
23
Nadine
964
Kareem
Neurology
19
Abd al-Rahim
1150
Reem
Maternity
27
Sana
1034
Kareem
Neurology
40
Maher
1069
Amnah
Maternity
30
Zeina
1028
عرض السجلات المكررة UNION ALL
تستخدم الكلمة المفتاحية ALL لضمان عرض السجلات بتكرارها دون حذفه.
مثال
ليكن لدينا الجدولان الآتيان في قاعدة البيانات:
الجدول الأول: المدرسون teachers
Course
Name
TeacherID
English (Adv)
Dr. Reem Hadi
1024
Artificial Intelligence
Eng. Nasser Sharif
1025
Photoshop Design
Mr. Maher Siraj
1026
الجدول الثاني: الطلاب students
Course
Name
StudentID
Photoshop Design
Aya Akkad
820
Networks
Hiba Abd Allah
821
SQL Programming
Ammar Helali
822
Artificial Intelligence
Loujain Zein
823
إن تنفيذ الاستعلام الآتي:
SELECT Course FROM teachers
UNION ALL
SELECT Course FROM students
ORDER BY Course;
سيؤدي لظهور أسماء الدورات التدريبية دون حذف أي تكرار فيها كما يلي:
Course
Artificial Intelligence
Artificial Intelligence
English (Adv)
Networks
Photoshop Design
Photoshop Design
SQL Programming
أما بحذف الكلمة المفتاحية ALL من الاستعلام، أي بالشكل:
SELECT Course FROM teachers
UNION ALL
SELECT Course FROM students
ORDER BY Course;
سيؤدي لحذف النتائج المكررة لتصبح بالشكل:
Course
Artificial Intelligence
English (Adv)
Networks
Photoshop Design
SQL Programming
معاملات المقارنة مع نتائج الاستعلام الفرعي
<
تستخدم المعاملات SOME و ANY و ALL بهدف المقارنة مع القيم الناتجة (لعمودٍ واحدٍ) عن أحد الاستعلامات الفرعية، وستُذكر تباعًا.
محتويات
· 4مثال
· 6مصادر
معامل ANY
إذ تعيد المقارنة قيمة TRUE في حال تطابق التعبير مع قيمة أيّ من السجلات الناتجة عن الاستعلام الفرعي وقيمة FALSE في حال عدم وجود أي نتيجة مطابقة.
معامل SOME
إذ تعيد المقارنة قيمة TRUE في حال وجود بعض القيم في السجلات الناتجة عن الاستعلام الفرعي والمطابقة لقيمة التعبير الذي تُقارن معه، وهي بهذا مماثلة لنتيجة المعامل ANY.
معامل ALL
إذ تعيد المقارنة قيمة TRUE في حال تطابق التعبير مع كل قيمة موجودة في السجلات الناتجة عن الاستعلام الفرعي وقيمة FALSE في حال عدم وجود نتيجة مخالفة واحدة على الأقل.
مثال
ليكن الجدولان الآتيان موجودان في قاعدة البيانات:
الجدول الأول boys: والذي يعبّر عن أداء الفتيان في أحد الامتحانات
Mark
Name
StudentID
97
Mohammad
127
59
Hasan
128
72
Ayham
129
63
Kareem
130
88
Yamen
131
76
Ahmad
132
الجدول الثاني girls: والذي يعبّر عن أداء الفتيات في نفس الامتحان السابق
Mark
Name
StudentID
76
Sarah
133
82
Rama
134
95
Zeina
135
99
Aalaa
136
63
Farah
137
79
Aya
138
إن تنفيذ الاستعلام الآتي:
SELECT Name, Mark FROM girls WHERE mark = ANY (SELECT mark FROM boys);
سيعرض الاسم والنتيجة للفتيات اللواتي حصلن على علامات متماثلة مع أيّ من العلامات الناتجة عن الاستعلام الفرعي (علامات السجلات الموجودة في جدول الفتيان)، لتظهر النتيجة الآتية:
Mark
Name
76
Sarah
63
Farah
وإن تنفيذ الاستعلام الآتي:
SELECT Name, Mark FROM girls WHERE mark > ALL (SELECT mark FROM boys);
سيعرض الاسم والنتيجة للطالبة التي حصلت على العلامة الأعلى من كافة العلامات الناتجة عن الاستعلام الفرعي (علامات السجلات الموجودة في جدول الفتيان)، لتظهر النتيجة الآتية:
Mark
Name
99
Aalaa
بنى التحكم
الاختبار الشرطي IF في SQL
<
تستخدم صيغة
IF
لاختبار شرط معين للتأكّد من تحقّقه أو عدم تحقّقه وإجراء ما يتناسب مع ذلك، وتكون البنية العامة لها بالشكل الآتي:IF condition THEN statements
[ ELSEIF condition THEN statements
[ ELSEIF condition THEN statements
...]]
[ ELSE statements ]
END IF;
إذ تعبّر الكلمة
condition
عن الشرط المُختبَر، وكلمةstatements
عن التعليمات التي ستُجرى أو قد تكون تعابير بدلًا من التعليمات.ويلاحظ في محركي PostgreSQL و Oracle أن الكلمة المفتاحية
ELSEIF
تصبحELSIF
، وفي محرك SQL Server فهي كلمتان منفصلتان أيّELSE IF
، أما في محرك SQLite فلا يوجد شرطIF
ويُستعاض عنه بشرط CASE.مثال
ليكن الجدول rivers الآتي موجودًا في قاعدة البيانات:
Continent
Outflow
LengthMiles
LengthKm
River
Serial
South America
Atlantic Ocean
4345
6992
Amazon
1
Africa
Mediterranean
4258
6853
Nile
2
North America
Gulf of Mexico
3902
6275
Mississippi
3
Asia
Bohai Sea
3395
5464
Yellow River
4
Africa
Atlantic Ocean
2922
4700
Congo
5
Asia
Laptev Sea
2736
4400
Lena
6
Africa
Gulf of Guinea
2611
4200
Niger
7
Europe
Caspian Sea
2266
3645
Volga
8
Asia
Andaman Sea
1901
3060
Salween
9
إن تنفيذ استعلام SELECT الآتي:
SELECT Name, Length =
IF LengthKm>5000 THEN 'Long'
ELSEIF LengthKm>3500 THEN 'Medium'
ELSE 'Short'
END
FROM rivers;
سيظهر تقديرًا لطول النهر في عمود
Length
وذلك بالاعتماد على الشرط المُختبَر في حالات اختبار الشرطIF
، لتظهر النتائج الآتية:Length
LengthKm
Name
Long
6992
Amazon
Long
6853
Nile
Long
6275
Mississippi
Long
5464
Yellow River
Medium
4700
Congo
Medium
4400
Lena
Medium
4200
Niger
Medium
3645
Volga
Short
3060
Salween
ويمكن تحديد عدد الأنهار الإجمالي مقارنة بالعدد 5 كما في الشيفرة الآتية:
IF (SELECT COUNT(*) FROM rivers) > 5
PRINT 'There are more than 5 rivers.'
ELSE PRINT 'There are 5 or less rivers.' ;
ولدى تنفيذها في محرك SQL Server ستُطبَع العبارة:
There are more than 5 rivers.
الشرط CASE في SQL
تستخدم لاختبار شرط معين بشكل مشابه لتعليمات if/else في لغات البرمجة الأخرى لتعيد أحد التعابير الممكنة، وتكون البنية العامة لها بالشكل الآتي:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
إذ تعبر الكلمة condition عن الشرط المُختبَر، وكلمة result عن التعبير المُعاد.
محتويات
· 1مثال
· 2استخدام CASE مع العبارة ORDER BY
o 2.1مثال
· 4مصادر
مثال
ليكن الجدول الآتي students موجودًا في قاعدة البيانات:
GPA
Age
Name
StudentID
3.68
25
Mona
1024
3.57
24
Radi
1081
2.50
25
Leen
1012
4.00
26
Sarah
1085
1.96
22
Amin
1066
2.87
23
Yusuf
1056
إن تنفيذ استعلام SELECT الآتي:
SELECT Name, Result =
CASE
WHEN GPA = 4 THEN 'A+'
WHEN GPA > 3.7 THEN 'A'
WHEN GPA > 3.3 THEN 'A-'
WHEN GPA > 3 THEN 'B+'
WHEN GPA > 2.7 THEN 'B'
WHEN GPA > 2.3 THEN 'B-'
WHEN GPA > 2 THEN 'C+'
WHEN GPA > 1.7 THEN 'C'
WHEN GPA > 1.3 THEN 'C-'
WHEN GPA > 1 THEN 'D+'
WHEN GPA > 0 THEN 'D'
ELSE 'F'
END
FROM students;
سيظهر الأحرف التقييميّة بحسب القيمة الموجودة في عمود GPA وذلك بالاعتماد على الشرط المُختبَر في حالات CASE، لتظهر النتائج الآتية:
Result
Name
B+
Mona
B+
Radi
C+
Leen
A+
Sarah
C-
Amin
B-
Yusuf
استخدام CASE مع العبارة ORDER BY
يمكن تحديد الترتيب ضمن عبارة ORDER BY وفقًا لشرط محدد وذلك باستخدام الكلمات المفتاحية CASE و WHEN و THEN و END.
مثال
إن كان الجدول الآتي rivers موجودًا في قاعدة البيانات:
Continent
Outflow
LengthMiles
LengthKm
River
Serial
South America
Atlantic Ocean
4345
6992
Amazon
1
Africa
Mediterranean
4258
6853
Nile
2
North America
Gulf of Mexico
3902
6275
Mississippi
3
Asia
Bohai Sea
3395
5464
Yellow River
4
Africa
Atlantic Ocean
2922
4700
Congo
5
Asia
Laptev Sea
2736
4400
Lena
6
Africa
Gulf of Guinea
2611
4200
Niger
7
Europe
Caspian Sea
2266
3645
Volga
8
Asia
Andaman Sea
1901
3060
Salween
9
لترتيب السجلات وفقًا لأطوالها في قارة Africa ووفقًا لأسمائها في القارات البقية، يُنفذ الاستعلام الآتي:
SELECT *
FROM rivers
ORDER BY
CASE Country
WHEN 'Africa' THEN length
ELSE Name
END;
وستظهر النتائج الآتية:
Continent
LengthKm
River
Africa
4200
Niger
Africa
4700
Congo
Africa
6853
Nile
Asia
4400
Lena
Asia
3060
Salween
Asia
5464
Yellow River
Europe
3645
Volga
North America
6275
Mississippi
South America
6992
Amazon
حلقة WHILE في SQL
تهدف حلقة
WHILE
إلى تكرار عددٍ من التعليمات باستمرار تحقق الشرط ضمنها، إذ يُتأكَّد من تحقّق الشرط قبل البدء بتنفيذ التعليمات التي تحتويه، وتكون البنية العامّة لها:[ <<label>> ]
WHILE boolean-expression LOOP
statements
END LOOP [ label ];
إذ يمكن تحديد تسمية
label
لها وتوضع التعليماتstatements
ضمنها بعد الكلمة المفتاحيةLOOP
. أما في محرك MySQL فتصبح بالشكل الآتي:[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label];
وفي محرك SQL Server تكون بالشكل:
WHILE boolean_expression
{ sql_statement | statement_block}
إذ تبتدئ كتلة التعليمات
statement_block
بالكلمة المفتاحيةBEGIN
وتنتهي بالكلمة المفتاحيةEND
.مثال
في حلقة WHILE الآتية تستمر زيادة الفاتورة
bill
بقيمة 500 وإنقاص نفس القيمة من البضائعgoods
إلى أن تبلغ قيمةbill
القيمة 2000 أو أكثر أو أن تصبح قيمةgoods
القيمة صفر أو أقل، وحينها تنتهي الحلقة.WHILE bill < 2000 AND goods > 0 LOOP
bill = bill + 500;
goods = goods - 500;
END LOOP;
العمليات
لمحة عن العمليات
العملية هي مجموعة من التعديلات التي تتم في قاعدة البيانات وفق تسلسل منطقي، وينتج عنها بعض التغييرات في القاعدة كحذف سجل أو تعديل بيانات أو إنشاء سجل جديد، هذه كلها عبارة عن عمليات، وتصبح هذه التغييرات جزءًا دائمًا من قاعدة البيانات إذا نُفذَّت بشكل تامّ دون أخطاء، أما في حال حدوث أيّ خطأ فيُتراجَع عن هذه التغييرات وتعود قاعدة البيانات كما هي قبل إنجاز العمليات عليها.
الأمر START TRANSACTION
<
يُستخدم هذا الأمر للإعلام بالبدء بإجراء مجموعة من العمليات التي قد تنتهي بأمر COMMIT أو ROLLBACK، وله الصيغة التالية:
START TRANSACTION;
وتختلف هذه الصيغة باستخدام الكلمة المفتاحية
BEGIN
في محرك SQL Server لتصبح:BEGIN TRANSACTION;
أما في محرك SQLite فهي الكلمة المفتاحية
BEGIN
فقط، أيّ:BEGIN;
وفي محرك Oracle يصبح الأمر على النحو الآتي:
SET TRANSACTION NAME 'name';
ويكون هذا الأمر مسؤولًا عن البدء بالعمليات وتسميتها بآن واحد بالاسم الذي يُحدد عبر name.
مثال
إذا كان الجدول الآتي موجودًا في قاعدة البيانات:
Bill
OrderID
FullName
CustomerID
160
0291
Abd al-Salam Hadi
1156
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
350
0294
Abd Allah Sadiq
1159
185
0255
Raghad al-Hamdan
1160
165
0276
Abd al-Razzaq Salloum
1161
175
0247
Hussam Siraj
1162
تبدأ العمليات في الشيفرة الآتية باستخدام
BEGIN TRANSACTION
لتُجرَى العمليات بعدها (حذف السجلات التي تكون فيها قيمة الفاتورة أكبر من 200) وتُحفَظ التغييرات عبر الأمر COMMIT:BEGIN TRANSACTION;
DELETE FROM customers
WHERE Bill>200;
COMMIT;
الأمر COMMIT في SQL
يستخدم هذا الأمر بهدف حفظ التغييرات المُجراة على قاعدة البيانات نتيجة لتنفيذ العمليات، إذ تحفظ كافة التغييرات منذ آخر أمر
COMMIT
أوROLLBACK
.صيغة الأمر:
COMMIT [TRANSACTION];
مثال
إن كان جدول الزبائن
customers
موجودًا في قاعدة البيانات على النحو الآتي:Bill
OrderID
FullName
CustomerID
160
0291
Abd al-Salam Hadi
1156
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
350
0294
Abd Allah Sadiq
1159
185
0255
Raghad al-Hamdan
1160
165
0276
Abd al-Razzaq Salloum
1161
175
0247
Hussam Siraj
1162
فعند تطبيق الاستعلام الآتي:
BEGIN TRANSACTION;
DELETE FROM customers
WHERE Bill>200;
إذ إن
BEGIN TRANSACTION
تبدأ بالعملية التي ستحذف السجلات التي قيمة فاتورتها أكبر من 200 (عدد السجلات المحذوفة 2)، ولحفظ التغييرات التي جرت على قاعدة البيانات التي تحوي الجدول السابق يُستخدم الأمر:COMMIT;
الأمر ROLLBACK
يستخدم هذا الأمر لإلغاء العمليات المُجراة على قاعدة البيانات مما يعني تجاهل التغييرات التي طرأت عليها.
صيغة الأمر:
ROLLBACK [TRANSACTION];
وفي محركات SQLite و MySQL و PostgreSQL تمكن العودة إلى نقطة محددة حُفظت مسبقًا، وذلك عبر الأمر:
ROLLBACK TO SAVEPOINT savePointName;
إذ إن savePointName هو اسم نقطة الحفظ التي سيُرجع لها بتجاهل أية تغييرات طرأت بعدها.
مثال
إن كان جدول الزبائن
customers
موجودًا في قاعدة البيانات على النحو الآتي:Bill
OrderID
FullName
CustomerID
160
0291
Abd al-Salam Hadi
1156
170
0302
Ahmad Mostafa
1157
210
0203
Reem Hammad
1158
350
0294
Abd Allah Sadiq
1159
185
0255
Raghad al-Hamdan
1160
165
0276
Abd al-Razzaq Salloum
1161
175
0247
Hussam Siraj
1162
فعند تطبيق الاستعلام الآتي:
BEGIN TRANSACTION;
DELETE FROM customers
WHERE Bill>200;
إذ إن
BEGIN TRANSACTION
تبدأ بالعملية التي ستحذف السجلات التي قيمة فاتورتها أكبر من 200 (عدد السجلات المحذوفة 2)، وللتراجع عن هذه التعديلات ليُعاد الجدول كما كان يُستخدم الأمر:ROLLBACK;
التعامل مع المستخدمين
إنشاء مستخدم جديد CREATE USER
يُستخدم هذا الأمر لإنشاء مستخدم جديد، وله الصيغ الآتية (بحسب محركات قواعد البيانات المختلفة).
محتويات
· 1في محرك البيانات PostgreSQL
o 1.1أمثلة
· 2في محركي البيانات MySQL وOracle
o 2.1خيارات المصادر resource_option
o 2.2خيارات كلمة المرور password_option
· 3أمثلة
o 3.1مثال
· 5مصادر
في محرك البيانات PostgreSQL
CREATE USER name [ [ WITH ] option [ ... ] ]
إذ إن name هو اسم المستخدم المنشَأ ويمكن أن يكون الخيار option أحد الكلمات المفتاحية الآتية:
الخيار
مهمته
SUPERUSER
لجعل المستخدم SUPERUSER أي له كافة صلاحيات الوصول access privileges في قاعدة البيانات
CREATEDB
لإعطاء المستخدم صلاحية إنشاء قاعدة بيانات جديدة
CREATEROLE
لإعطاء المستخدم صلاحية إنشاء مستخدم آخر جديد
CONNECTION LIMIT connlimit
لتحديد عدد من الاتصالات connlimit التزامنية التي يستطيع المستخدم القيام بها مع قاعدة البيانات
PASSWORD 'password'
لتحديد كلمة المرور password للمستخدم
VALID UNTIL 'timestamp'
لتحديد مدة صلاحية كلمة المرور لهذا المستخدم حتى التاريخ والتوقيت timestamp، وإن لم يُحدد فهي صالحة دائمًا
أمثلة
لإنشاء مستخدم جديد باسم Ahmad وبكلمة مرور ah1751m صالحة حتى تاريخ 1/1/2019، يستخدم الأمر الآتي:
CREATE USER Ahmad WITH PASSWORD 'ah1751m' VALID UNTIL '2019-01-01';
ولإنشاء مستخدم جديد باسم Baraa وإعطائه صلاحية إنشاء قاعدة بيانات جديدة ومستخدمين جدد، يستخدم الأمر الآتي:
CREATE USER Baraa WITH CREATEDB CREATEROLE;
في محركي البيانات MySQL وOracle
CREATE USER [IF NOT EXISTS] name
[IDENTIFIED BY PASSWORD 'password']
[WITH resource_option]
[password_option]
إذ ينشئ هذا الأمر مستخدمًا جديدًا باسم user، ويُمكن تحديد كلمة المرور password له، إضافة إلى بعض خيارات المصادر وخيارات أخرى متعلقة بكلمة المرور، وستُذكر تباعًا.
خيارات المصادر resource_option
الخيار
مهمته
MAX_QUERIES_PER_HOUR count
لتحديد العدد الأقصى للاستعلامات المسموحة خلال الساعة بالعدد count
MAX_UPDATES_PER_HOUR count
لتحديد العدد الأقصى للتحديثات (التعديلات) المسموحة خلال الساعة بالعدد count
MAX_CONNECTIONS_PER_HOUR count
لتحديد العدد الأقصى للاتصالات المسموحة خلال الساعة بالعدد count
خيارات كلمة المرور password_option
مهمته
الخيار
لضمان استمرار كلمة المرور لهذا المستخدم بشكل دائم
PASSWORD EXPIRE NEVER
لتحديد n يومًا لصلاحية كلمة المرور
PASSWORD EXPIRE INTERVAL n DAY
أمثلة
لإنشاء مستخدم جديد باسم Ahmad وبكلمة مرور ah1751m صالحة لمدة 180 يومًا، يستخدم الأمر الآتي:
CREATE USER Ahmad IDENTIFIED BY PASSWORD 'ah1751m' PASSWORD EXPIRE INTERVAL 180 DAY;
ولإنشاء مستخدم جديد باسم Baraa وتحديد العدد الأقصى لاستعلاماته خلال الساعة (500 استعلام)، يستخدم الأمر الآتي:
CREATE USER Baraa WITH MAX_QUERIES_PER_HOUR 500;
في محرك البيانات SQL Server
CREATE USER name
[WITH PASSWORD = 'password' ;
إذ إن name هو اسم المستخدم المنشَأ وتُحدَّد كلمة المرور بالكلمة المفتاحية PASSWORD.
مثال
لإنشاء مستخدم جديد باسم Ahmad وبكلمة مرور ah1751m، يستخدم الأمر الآتي:
CREATE USER Ahmad WITH PASSWORD 'ah1751m';
تعديل المستخدم ALTER USER
يُستخدم هذا الأمر للتعديل من خصائص وسماحيات المستخدم، وله الصيغ الآتية (بحسب محركات قواعد البيانات المختلفة):
محتويات
· 1في محرك البيانات PostgreSQL
o 1.1أمثلة
· 2في محركي البيانات MySQL وOracle
o 2.1خيارات المصادر resource_option
o 2.2خيارات كلمة المرور password_option
o 2.3أمثلة
· 3في محرك البيانات SQL Server
o 3.1مثال
· 5مصادر
في محرك البيانات PostgreSQL
ALTER USER {name | CURRENT_USER} [ WITH ] option [ ... ]
إذ إن name هو اسم المستخدم الذي ستطرأ التعديلات عليه، ويمكن أن يكون الخيار option أحد الكلمات المفتاحية الآتية:
الخيار
مهمته
SUPERUSER
لجعل المستخدم SUPERUSER أي له كافة صلاحيات الوصول access privileges في قاعدة البيانات
CREATEDB
لإعطاء المستخدم صلاحية إنشاء قاعدة بيانات جديدة
CREATEROLE
لإعطاء المستخدم صلاحية إنشاء مستخدم آخر جديد
CONNECTION LIMIT connlimit
لتحديد عدد من الاتصالات connlimit التزامنية التي يستطيع المستخدم القيام بها مع قاعدة البيانات
PASSWORD 'password'
لتحديد كلمة المرور password للمستخدم
VALID UNTIL 'timestamp'
لتحديد مدة صلاحية كلمة المرور لهذا المستخدم حتى التاريخ والتوقيت timestamp، وإن لم يُحدد فهي صالحة دائمًا
RENAME to new_name
لإعادة تسمية المستخدم باسم جديد new_name
أمثلة
لتعديل كلمة المرور للمستخدم Ahmad لتصبح '1751ah'، يستخدم الأمر الآتي:
ALTER USER Ahmad WITH PASSWORD '1751ah';
أو لإزالة كلمة المرور الخاصة به:
ALTER USER Ahmad WITH PASSWORD NULL;
ولإعطائه صلاحية إنشاء قاعدة بيانات جديدة ومستخدمين جدد، يستخدم الأمر الآتي:
ALTER USER Ahmad CREATEROLE CREATEDB;
في محركي البيانات MySQL وOracle
ALTER USER [IF NOT EXISTS] name
[IDENTIFIED BY PASSWORD 'password']
[WITH resource_option]
[password_option]
إذ إن name هو اسم المستخدم الذي ستطرأ التعديلات عليه، ويمكن تعديل أي من خيارات المصادر وخيارات أخرى متعلقة بكلمة المرور، وستُذكر تباعًا.
خيارات المصادر resource_option
الخيار
مهمته
MAX_QUERIES_PER_HOUR count
لتحديد العدد الأقصى للاستعلامات المسموحة خلال الساعة بالعدد count
MAX_UPDATES_PER_HOUR count
لتحديد العدد الأقصى للتحديثات (التعديلات) المسموحة خلال الساعة بالعدد count
MAX_CONNECTIONS_PER_HOUR count
لتحديد العدد الأقصى للاتصالات المسموحة خلال الساعة بالعدد count
خيارات كلمة المرور password_option
مهمته
الخيار
لضمان استمرار كلمة المرور لهذا المستخدم بشكل دائم
PASSWORD EXPIRE NEVER
لتحديد n يومًا لصلاحية كلمة المرور
PASSWORD EXPIRE INTERVAL n DAY
أمثلة
لتعديل كلمة المرور للمستخدم Ahmad لتصبح '1751ah' وبصلاحية لمدة 200 يومًا، يستخدم الأمر الآتي:
ALTER USER Ahmad IDENTIFIED BY PASSWORD '1751ah' PASSWORD EXPIRE INTERVAL 180 DAY;
ولإعطائه حدًا أقصى لاستعلاماته خلال الساعة (500 استعلام)، يستخدم الأمر الآتي:
ALTER USER Ahmad WITH MAX_QUERIES_PER_HOUR 500;
في محرك البيانات SQL Server
ALTER USER name
WITH <set_item> ;
إذ إن name هو اسم المستخدم الذي ستطرأ التعديلات عليه و من خلال set_item يمكن تعديل أحد الخصائص الآتية:
الخاصية
مهمتها
NAME = newUserName
لتعديل اسم المستخدم ليصبح newUserName
PASSWORD = 'newpassword'
لتعديل كلمة المرور لتصبح 'newpassword'
مثال
لتعديل اسم المستخدم Ahmad ليصبح accountant وكلمة مروره لتصبح '1751ah' ، يستخدم الأمر الآتي:
ALTER USER Ahmad NAME = accountant, PASSWORD = '1751ah' ;
حذف مستخدم DROP USER
يُستخدَم هذا الأمر لحذف مستخدم، وله الصيغة العامّة الآتية:
DROP USER [IF EXISTS] name;
إذ يحذف المستخدم ذو الاسم
name
إن وُجد.مثال
لحذف المستخدمَين
accountant
وcustomer
(إن وُجدا) يُستخدم الأمر الآتي:DROP USER IF EXISTS accountant, customer;
منح صلاحيات الوصول GRANT
يستخدم هذا الأمر لمنح صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وله إحدى الصيغ العامّة الآتية (بحسب محركات البيانات المختلفة):
محتويات
· 1في محرك البيانات PostgreSQL
o 1.1أمثلة
· 2في محركي البيانات MySQL و Oracle
o 2.1خيارات نوع الصلاحية priv_type
o 2.2خيارات مستوى الصلاحية priv_level
o 2.3خيارات المصادر resource_option
o 2.4أمثلة
· 3في محرك البيانات SQL Server
o 3.1أمثلة
· 5مصادر
في محرك البيانات PostgreSQL
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }
[, ...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tbl_name [, ...]
TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } [ WITH GRANT OPTION ];
إعطاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE و DELETE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] tbl_name [, ...]
TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } [ WITH GRANT OPTION ];
إعطاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على العمود column_name (أو أكثر من عمود) في الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.
GRANT { { CREATE | CONNECT | TEMPORARY} [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] }[ WITH GRANT OPTION ];
إعطاء الصلاحيات بإنشاء العناصر (كالجداول أو الفهارس، ...إلخ.) CREATE أو الاتصال بقاعدة البيانات CONNECT أو إنشاء جداول مؤقتة TEMPORARY في قاعدة البيانات باسم database_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } [ WITH GRANT OPTION ];
إعطاء الصلاحيات بتنفيذ EXECUTE (أو كافة الصلاحيات المتاحة ALL PRIVILEGES) للدالة المحددة باسم function_name (والتي تحدد معاملاتها بالنوع argmode كدخل أو خرج والاسم arg_name ونوع البيانات arg_type) وذلك للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.
أمثلة
لمنح صلاحية إدخال سجلات جديدة للجدول books لكافة المستخدمين يُستخدم الأمر:
GRANT INSERT ON books TO PUBLIC;
ولمنح كافة الصلاحيات المتعلقة بقاعدة البيانات centre_db للمستخدم الحالي والسماح له بمنح الصلاحيات لمستخدم آخر، يُستخدَم الأمر:
GRANT ALL PRIVILEGES ON DATABASE centre_db
TO CURRENT_USER WITH GRANT OPTION;
ولمنح صلاحية تنفيذ الدالة get_final_bill للمستخدم mohammad يُستخدم الأمر:
GRANT EXECUTE ON FUNCTION get_final_bill (customer_id int) TO mohammad;
في محركي البيانات MySQL و Oracle
GRANT
priv_type [(column_list)]
ON [ {TABLE | FUNCTION} ] priv_level
TO user
[WITH {GRANT OPTION | resource_option} ...]
وذلك لإعطاء المستخدم user نوع صلاحية priv_type على الأعمدة column_list الموجودة في العنصر المحدد (جدول أو دالة) بمستوى معين من الصلاحيات priv_level ومنحه إمكانية إعطاء الصلاحيات لمستخدم آخر WITH GRANT OPTION أو تحديد بعض خيارات المصادر resource_option، وتوضح الجداول الآتية الخيارات الممكنة لكلّ مما سبق.
خيارات نوع الصلاحية priv_type
الخيار
مهمته
ALL [PRIVILEGES]
كافة الصلاحيات
ALTER
صلاحية تعديل الجدول ALTER TABLE
CREATE
صلاحية إنشاء قاعدة بيانات جديدة أو جدول جديد
CREATE USER
صلاحية إنشاء مستخدم جديد
CREATE VIEW
صلاحية إنشاء عرض جديد
DELETE
صلاحية الحذف DELETE
DROP
صلاحية الحذف DROP
EXECUTE
صلاحية التنفيذ
INDEX
INSERT
صلاحية إضافة سجلات جديدة
REFERENCES
صلاحية ربط الجداول عبر المفتاح الثانوي
SELECT
صلاحية تنفيذ استعلام SELECT
UPDATE
صلاحية تنفيذ استعلام UPDATE
خيارات مستوى الصلاحية priv_level
المستوى
دلالته
*
كافة الجداول في قاعدة البيانات الحالية
*.*
كافة الجداول في كافة قواعد البيانات الموجودة
db_name.*
كافة الجداول الموجودة في قاعدة البيانات db_name
db_name.tbl_name
الجدول tbl_name الموجود في قاعدة البيانات db_name
tbl_name
الجدول tbl_name
خيارات المصادر resource_option
الخيار
مهمته
MAX_QUERIES_PER_HOUR count
لتحديد العدد الأقصى للاستعلامات المسموحة خلال الساعة بالعدد count
MAX_UPDATES_PER_HOUR count
لتحديد العدد الأقصى للتحديثات (التعديلات) المسموحة خلال الساعة بالعدد count
MAX_CONNECTIONS_PER_HOUR count
لتحديد العدد الأقصى للاتصالات المسموحة خلال الساعة بالعدد count
أمثلة
لمنح صلاحية إدخال سجلات جديدة للجدول books الموجود في قاعدة البيانات centre_db للمستخدم ahmad مع إمكانية إعطائه الصلاحيات لمستخدم آخر وبحد أقصى 5 اتصالات خلال الساعة، يُستخدم الأمر:
GRANT INSERT ON TABLE centre_db.books TO ahmad WITH GRANT OPTION MAX_CONNECTIONS_PER_HOUR 5;
ولمنح كافة الصلاحيات المتعلقة بكافة الجداول الموجودة في قاعدة البيانات centre_db للمستخدم mohammad يُستخدَم الأمر:
GRANT ALL PRIVILEGES ON centre_db.* TO mohammad;
في محرك البيانات SQL Server
GRANT { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON object ] TO name [ ,...n ]
[ WITH GRANT OPTION ];
إذ يمكن منح بعض الصلاحيات أو كلها على الأعمدة المحدد باللائحة column والموجودة في العنصر object للمستخدم باسم name مع إعطائه إمكانية منح الصلاحيات لمستخدم آخر WITH GRANT OPTION، وتختلف الصلاحيات المتاحة بحسب العنصر المحدد object كما هو موضح في الجدول الآتي:
العنصر
الصلاحيات المتاحة
قاعدة بيانات
دالة تعيد قيمة أوليّة scalar
EXECUTE
دالة تعيد جدول من النتائج
جدول
REFERENCES
عرض VIEW
وللعودة إلى كافة الأذونات permission التي يتيحها محرك SQL Server تمكن الاستفادة من الصفحة.
أمثلة
لمنح صلاحية إنشاء عرض view للمستخدم mohammad في قاعدة البيانات centre_db والسماح له بمنح الصلاحيات لمستخدم آخر يُستخدم الأمر:
GRANT CREATE VIEW ON centre_db TO mohammad WITH GRANT OPTION;
ولمنح كافة الصلاحيات المتعلقة بالجدول books للمستخدم sarah يُستخدَم الأمر:
GRANT ALL ON books TO sarah;
إلغاء صلاحيات الوصول REVOKE
يستخدم هذا الأمر لإلغاء صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وله إحدى الصيغ العامّة الآتية (بحسب محركات البيانات المختلفة):
محتويات
· 1في محرك البيانات PostgreSQL
o 1.1أمثلة
· 2في محركي البيانات MySQL و Oracle
o 2.1خيارات نوع الصلاحية priv_type
o 2.2خيارات مستوى الصلاحية priv_level
o 2.3أمثلة
· 3في محرك البيانات SQL Server
o 3.1أمثلة
· 5مصادر
في محرك البيانات PostgreSQL
REVOKE { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }
[, ...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tbl_name [, ...]
FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] };
إلغاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE و DELETE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER.
REVOKE { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( col_name [, ...] ) }
ON [ TABLE ] tbl_name [, ...]
FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } ;
إلغاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على العمود col_name (أو أكثر من عمود) في الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي.
REVOKE { { CREATE | CONNECT | TEMPORARY} [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] };
إلغاء الصلاحيات بإنشاء العناصر (كالجداول أو الفهارس، ...إلخ.) CREATE أو الاتصال بقاعدة البيانات CONNECT أو إنشاء جداول مؤقتة TEMPORARY في قاعدة البيانات باسم database_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER.
REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } ;
إلغاء الصلاحيات بتنفيذ EXECUTE (أو كافة الصلاحيات المتاحة ALL PRIVILEGES) للدالة المحددة باسم function_name (والتي تحدد معاملاتها بالنوع argmode كدخل أو خرج والاسم arg_name ونوع البيانات arg_type) وذلك للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER.
أمثلة
لإلغاء صلاحية إدخال سجلات جديدة للجدول books لكافة المستخدمين يُستخدم الأمر:
REVOKE INSERT ON books FROM PUBLIC;
ولإلغاء كافة الصلاحيات المتعلقة بقاعدة البيانات centre_db للمستخدم الحالي يُستخدَم الأمر:
REVOKE ALL PRIVILEGES ON DATABASE centre_db
FROM CURRENT_USER;
ولإلغاء صلاحية تنفيذ الدالة get_final_bill للمستخدم mohammad يُستخدم الأمر:
REVOKE EXECUTE ON FUNCTION get_final_bill (customer_id int) FROM mohammad;
في محركي البيانات MySQL و Oracle
REVOKE
priv_type [(column_list)]
ON [ {TABLE | FUNCTION} ] priv_level
FROM user
وذلك لإلغاء صلاحية المستخدم user من النوع priv_type على الأعمدة column_list الموجودة في العنصر المحدد (جدول أو دالة) بمستوى معين من الصلاحيات priv_level، وتوضح الجداول الآتية الخيارات الممكنة لكلّ مما سبق.
خيارات نوع الصلاحية priv_type
الخيار
مهمته
ALL [PRIVILEGES]
كافة الصلاحيات
ALTER
صلاحية تعديل الجدول ALTER TABLE
CREATE
صلاحية إنشاء قاعدة بيانات جديدة أو جدول جديد
CREATE USER
صلاحية إنشاء مستخدم جديد
CREATE VIEW
صلاحية إنشاء عرض جديد
DELETE
صلاحية الحذف DELETE
DROP
صلاحية الحذف DROP
EXECUTE
صلاحية التنفيذ
INDEX
INSERT
صلاحية إضافة سجلات جديدة
REFERENCES
صلاحية ربط الجداول عبر المفتاح الثانوي
SELECT
صلاحية تنفيذ استعلام SELECT
UPDATE
صلاحية تنفيذ استعلام UPDATE
خيارات مستوى الصلاحية priv_level
المستوى
دلالته
*
كافة الجداول في قاعدة البيانات الحالية
*.*
كافة الجداول في كافة قواعد البيانات الموجودة
db_name.*
كافة الجداول الموجودة في قاعدة البيانات db_name
db_name.tbl_name
الجدول tbl_name الموجود في قاعدة البيانات db_name
tbl_name
الجدول tbl_name
أمثلة
لإلغاء صلاحية إدخال سجلات جديدة للجدول books الموجود في قاعدة البيانات centre_db للمستخدم ahmad يُستخدم الأمر:
REVOKE INSERT ON TABLE centre_db.books FROM ahmad;
ولإلغاء كافة الصلاحيات المتعلقة بكافة الجداول الموجودة في قاعدة البيانات centre_db للمستخدم mohammad يُستخدَم الأمر:
REVOKE ALL PRIVILEGES ON centre_db.* FROM mohammad;
في محرك البيانات SQL Server
REVOKE { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON object ] FROM name [ ,...n ] ;
إذ يمكن إلغاء بعض الصلاحيات أو كلها على الأعمدة المحدد باللائحة column والموجودة في العنصر object من المستخدم باسم name، وتختلف الصلاحيات الملغية بحسب العنصر المحدد object كما هو موضح في الجدول الآتي:
العنصر
الصلاحيات المتاحة
قاعدة بيانات
دالة تعيد قيمة أوليّة scalar
EXECUTE
دالة تعيد جدول من النتائج
جدول
REFERENCES
عرض VIEW
وللعودة إلى كافة الأذونات permission التي يتيحها محرك SQL Server تمكن الاستفادة من هذه الصفحة.
أمثلة
لإلغاء صلاحية إنشاء عرض view للمستخدم mohammad في قاعدة البيانات centre_db يُستخدم الأمر:
REVOKE CREATE VIEW ON centre_db FROM mohammad;
ولإلغاء كافة الصلاحيات المتعلقة بالجدول books للمستخدم sarah يُستخدَم الأمر:
REVOKE ALL ON books FROM sarah;
التعامل مع الفهارس
إنشاء فهرس CREATE INDEX
يستخدم هذا الأمر لإنشاء فهرس للجدول وفق البنية العامّة الآتية:
CREATE INDEX [ name ] ON tbl ( col [, ...]);
إذ يُنشأ الفهرس باسم
name
للجدول المسمىtbl
الذي يحتوي على العمود المسمىcol
، وتُعتَبر الفهارس إحدى المفاهيم الأساسية في قواعد البيانات إذ تُسرِّع أداء الاستعلامات من خلال تقليل عدد صفحات البيانات التي تُمسح بياناتها (scanned) في القاعدة.مثال
يستخدم الأمر الآتي لإنشاء مؤشر باسم
idx
على الجدولrecords
عبر العمودtitle
:CREATE INDEX idx ON records (title);
تعديل الفهرس ALTER INDEX
يستخدم هذا الأمر لتعديل الفهرس المُنشأ عبر الأمر CREATE INDEX، وله الصيغ الآتية:
ALTER INDEX [ IF EXISTS ] name RENAME TO new_name
لتغيير اسم الفهرس المسمى
name
(إن وُجد) ليصبح باسمnew_name
.ALTER INDEX [ IF EXISTS ] name SET ( storage_parameter = value [, ... ] )
لتعديل أيّ من قيم معاملات التخزين المتعلقة بالفهرس (إن وُجد).
ALTER INDEX [ IF EXISTS ] name RESET ( storage_parameter [, ... ] )
لإعادة ضبط كافة قيم معاملات التخزين لهذا الفهرس (إن وُجد) إلى القيم الافتراضية. أما في محرك SQL فيجب تحديد الكائن object الذي سيُعدّل فهرسه لتصبح البنية العامة بالشكل:
ALTER INDEX index_name ON <object>
{
DISABLE
| SET ( <set_index_option> [ ,...n ] )
| PAUSE
} ;
إذ إن الكلمة المفتاحية
DISABLE
تستخدم لتعطيل الفهرس، وSET
لضبط قيم خياراته، أماPAUSE
فلإيقافه بشكل مؤقّت.مثال
لضبط قيمة التخزين
fillfactor
للفهرسdistributers
لتصبح 75 يُستخدَم الأمر:ALTER INDEX distributors SET (fillfactor = 75);
حذف الفهرس DROP INDEX
يستخدم هذا الأمر لحذف فهرس أو أكثر في قاعدة البيانات وفق البنية العامّة الآتية:
DROP INDEX [ IF EXISTS ] name [ CASCADE | RESTRICT ]
إذ يُحذف الفهرس المحدد باسم name، وتمنع IF EXISTS حدوث أي خطأ في حال عدم وجود هذا الفهرس في قاعدة البيانات، أما الكلمة المفتاحية CASCADE فهي للإعلام بحذف أي كائنات objects معتمدة على الفهرس المحذوف، وبالحالة الافتراضية فإن RESTRICT تمنع حذف الفهرس إن كان هناك اعتماد عليه من قبل كائن ما.
محتويات
· 1بعض أمور التوافقية في المحركات
· 2مثال
· 4مصادر
بعض أمور التوافقية في المحركات
في محرك Oracle: لدى حذف الفهرس فيُلغى تفعيل كافة الكائنات المعتمدة عليه تلقائيًا.
في محركي SQL Server و MySQL: يجب ذكر الجدول في الأمر ليصبح بالشكل الآتي:
DROP INDEX index_name ON tbl_name
مثال
لحذف الفهرس title_index يستخدم الأمر الآتي:
DROP INDEX title_index;
التعامل مع قواعد البيانات
إنشاء قاعدة البيانات CREATE DATABASE
يستخدم هذا الأمر لإنشاء قاعدة بيانات جديدة، وله البنية العامة التالية:
CREATE DATABASE name;
إذ إن name هو اسم قاعدة البيانات التي ستُنشأ ولا يسمح بتنفيذ هذا الاستعلام ضمن بنية عمليات (transaction block).
مثال
لإنشاء قاعدة بيانات باسم
CompanyRecords
يُستخدم الأمر:CREATE DATABASE CompanyRecords;
حذف قاعدة البيانات DROP DATABASE
يستخدم هذا الأمر لحذف قاعدة البيانات، وله البنية العامة التالية:
DROP DATABASE [IF EXISTS] name;
إذ إن
name
هو اسم قاعدة البيانات التي ستُحذف ولا يسمح بتنفيذ هذا الاستعلام إلا من مالك قاعدة البيانات ولا يمكن التراجع عن الحذف فيما بعد، وتمنع العبارةIF EXISTS
حدوث أي خطأ في حال عدم وجودة قاعدة بيانات بهذا الاسم.يتضمن الحذف كافة الملفات المرتبطة بقاعدة البيانات بالصيغ التالية:
.TRN
.BAK
.DAT
.HSH
.MRG
.frm
.ibd
.MYD
.MYI
.TRG
.ndb
.par
.cfg
.db
مثال
لحذف قواعد البيانات
Students
وTeachers
يُستخدم الأمر:DROP DATABASE IF EXISTS Students, Teachers;
فإذا وُجدت قاعدة بيانات باسم
Students
أوTeachers
ستحذف.الأمر USE في SQL
يستخدم هذا الأمر لتحديد قاعدة البيانات التي يتَعامَل معها لنقل السياق
context
لها، وله الصيغة الآتية:USE { database_name} [;]
مثال
لاستخدام قاعدة البيانات المُسماة
centre
يكون الأمر بالشكل:USE centre;
التعامل مع الجداول
مفاتيح الجداول
تستخدم المفاتيح بهدف الربط ما بين الجداول في قواعد البيانات.
محتويات
· 1المفتاح الأوليّ PRIMARY KEY
· 2المفتاح الثانويّ FOREIGN KEY
o 2.1مثال
· 3تعيين قيود المفاتيح الأولية والثانوية لأعمدة الجدول
o 3.1تعيين أعمدة المفاتيح لجدول جديد
· 4تعيين أعمدة المفاتيح لجدول موجود
o 4.1مثال
· 5حذف قيود المفاتيح من الجدول
· 7مصادر
المفتاح الأوليّ PRIMARY KEY
هو عمود (أو أكثر) من الجدول والذي يميّز السجلات عن بعضها، تكون القيم فيه فريدة (غير مكررة) ولا يمكن ألّا يحتوي قيمة (قيمته NULL)، ويكون للجدول مفتاح أولي وحيد.
المفتاح الثانويّ FOREIGN KEY
هو عمود (أو أكثر) من الجدول والذي يمكن عدّه مرجعيةً (reference) لعمود آخر في جدول ثانٍ (وغالبًا ما يكون هذا العمود هو المفتاح الأولي للجدول الثاني).
مثال
تحتوي قاعدة بيانات أحد المراكز التعليمية الجداول الآتية:
الجدول الأول: جدول الطلاب
students
المفتاح الأولي فيه هو عمود
StudentID
والمفتاح الثانوي هو عمودCourseID
للربط مع جدول الدورات التدريبيةcourses
RegDate
CourseID
LastName
FirstName
StudentID
07-JUL-2017
0206
Najjar
Rama
1147
08-NOV-2017
0604
Kordi
Jenan
1148
07-JUL-2017
0206
Bitar
Rahaf
1149
20-AUG-2017
0607
Taweel
Farah
1150
08-NOV-2017
0610
Arab
Rami
1151
24-OCT-2017
0803
Akkad
Aya
1152
08-NOV-2017
0504
Haddad
Abed
1153
20-AUG-2017
0801
Fares
Tasneem
1154
24-OCT-2017
0607
Hamsho
Monther
1155
30-SEP-2017
0607
Abd Allah
Hiba
1156
07-JUL-2017
0509
Khatib
Mohammad
1157
20-AUG-2017
0801
Sharif
Ibrahim
1158
24-OCT-2017
0802
Fehmi
Hanin
1159
20-AUG-2017
0204
Zein
Loujain
1160
08-NOV-2017
0503
Helali
Ammar
1161
الجدول الثاني: جدول الدورات التدريبية
courses
المفتاح الأولي فيه هو عمود
CourseID
والمفتاح الثانوي هو عمودDepartmentID
للربط مع جدول الأقسامdepartments
DepartmentID
Lecturer
Course
CourseID
EN01
Dr. Reem Hadi
English (Adv)
0204
EN01
Dr. Shadi Balid
English (Int)
0206
EN02
Dr. Firas Abd
English (TOEFL)
0211
IT01
Eng. Nasser Sharif
Artificial Intelligence
0604
IT01
Eng. Amal Safi
Networks
0607
IT01
Eng. Salem Najm
ICDL
0610
IT02
Eng. Nasser Sharif
SQL Programming
0703
IT02
Eng. Amal Safi
FrontEnd Programming
0704
IT03
Mr. Maher Siraj
Photoshop Design
0801
IT03
Ms. Nadia Taleb
Illustrator Design
0802
IT03
Mr. Maher Siraj
UI Design
0803
الجدول الثالث: جدول الأقسام departments
المفتاح الأولي فيه هو DepartmentID وبقاعدة البيانات في هذا المثال لا توجد مرجعية له لربطه مع جدول آخر.
Head
DepatementName
DepartmentID
Dr. Firas Abd
General English
EN01
Dr. Saer Raslan
Advanced English
EN02
Dr. Osama Najjar
Information Technology
IT01
Eng. Amal Safi
Programming
IT02
Eng. Fares Ahmad
Graphic Design
IT03
تعيين قيود المفاتيح الأولية والثانوية لأعمدة الجدول
تعيين أعمدة المفاتيح لجدول جديد
لتعيين قيود المفاتيح الأوليّة والثانويّة تضاف العبارة المفتاحية
PRIMARY KEY
وFOREIGN KEY
في تعليمة إنشاء الجدول CREATE TABLE.مثال
لإضافة المفاتيح على الجدول السابق
students
، يصبح الاستعلام بالشكل الآتي:CREATE TABLE students(
StudentID INTEGER NOT NULL,
LastName TEXT,
FirstName TEXT,
CourseID INTEGER,
RegDate DATE,
PRIMARY KEY (StudentID),
FOREIGN KEY (CourseID) REFERENCES courses (CourseID)
);
أما عندما يكون هناك أكثر من عمود للمفتاح فتُضاف كافة الأعمدة المطلوبة ضمن القوسين بجانب الكلمة المفتاحية لتصبح بالشكل:
PRIMARY KEY (StudentID, FirstName)
تعيين أعمدة المفاتيح لجدول موجود
يُمكن تعيين أعمدة المفاتيح لجدول موجود مسبقًا من خلال الكلمة المفتاحية
ADD
في تعليمة تعديل الجدول ALTER TABLE ليصبح استعلام إضافة المفتاح الأوليّ بالشكل الآتي:ALTER TABLE tbl_name
ADD PRIMARY KEY (col_name);
وإضافة المفتاح الثانوي بالشكل:
ALTER TABLE tbl_name
ADD FOREIGN KEY (col_name) REFERENCES tbl_name2 (col_name2);
مثال
لإضافة المفتاحين الأوليّ والثانويّ للجدول السابق
students
يُستخدَم الاستعلام الآتي:ALTER TABLE students
ADD PRIMARY KEY (StudentID)
ADD FOREIGN KEY (CourseID) REFERENCES courses (CourseID);
حذف قيود المفاتيح من الجدول
يُمكن حذف قيود المفاتيح لجدول موجود مسبقًا من خلال الكلمة المفتاحية
DROP
في تعليمة تعديل الجدول ALTER TABLE ليصبح الاستعلام عند حذف المفتاح الأوليّ بالشكل الآتي:ALTER TABLE students
DROP PRIMARY KEY;
وحذف مفتاح الثانوي بالشكل:
ALTER TABLE students
DROP FOREIGN KEY;
إنشاء جدول CREATE TABLE
يستخدم هذا الأمر لإنشاء جدولٍ جديدٍ في قاعدة البيانات وفق البنية العامّة الآتية:
CREATE TABLE [ IF NOT EXISTS ] tbl_name ( [
{ col_name data_type [ column_constraint [ ... ] | table_constraint }
[, ... ]
] )
إذ يُنشأ الجدول الجديد باسم tbl_name وتُحدَّد أعمدته ما بين القوسين وذلك بتحديد اسم العمود col_name ونوع بياناته data_type وتحديد القيود على مستوى العمود أو الجدول.
محتويات
· 3مثال
· 5مصادر
قيود العمود
يُمكن ضبط بعض القيود على العمود مثل:
القيد
دلالته
NOT NULL
ألا تكون قيمة الحقل NULL
DEFAULT default_expr
لتحديد القيمة الافتراضية للحقل
UNIQUE
ألا تتكرر القيم ما بين السجلات ضمن نفس الحقل (العمود)
PRIMARY KEY
لتحديد العمود كمفتاح أولي للجدول
REFERENCES reftable [ ( refcolumn )]
لتحديد العمود refcolum كمفتاح ثانوي بمرجعية للجدول reftable
قيود الجدول
يُمكن تحديد بعض القيود على مستوى الجدول مثل:
القيد
دلالته
UNIQUE ( column_name [, ... ] )
عدم تكرار القيم ما بين السجلات ضمن الحقل (العمود) المحدد
PRIMARY KEY ( column_name [, ... ] )
لتحديد العمود (أو الأعمدة) ما بين القوسين كمفتاح أولي للجدول
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
لتحديد العمود (أو الأعمدة) ما بين القوسين كمفتاح ثانوي بمرجعية للجدول reftable
مثال
لإنشاء الجدول الآتي باسم students:
StudentID
FirstName
LastName
E-mail
CourseID
RegDate
والذي يحتوي على 5 أعمدة بأنواع بيانات مختلفة على ألا يتكرر عنوان البريد الالكتروني بين أكثر من طالب وألا يكون حقل تاريخ التسجيل فارغًا، ويكون حقل StudentID مفتاحًا أوليًا وحقل CourseID مفتاحًا ثانويًا يربط هذا الجدول مع جدول آخر (courses)، ولتحقيق ذلك يستخدم الأمر الآتي:
CREATE TABLE students ();
StudentID INT PRIMARY KEY,
FirstName VARCHAR(20) ,
LastName VARCHAR(20) ,
E-mail VARCHAR(50) UNIQUE,
CourseID INT REFERENCES courses (courseID),
RegDate DATE NOT NULL
);
تعديل الجدول ALTER TABLE
يُستخدَم هذا الأمر لتعديل تعريف الجدول المُنشأ مسبقًا عبر الأمر CREATE TABLE، وله الصيغ الآتية:
ALTER TABLE [ IF EXISTS ] name
RENAME [ COLUMN ] col_name TO new_col_name
لإعادة تسمية عمود اسمه
col_name
في الجدول الذي اسمهname
(إن وُجد) باسمٍ جديدnew_col_name
.ALTER TABLE [ IF EXISTS ] name
RENAME CONSTRAINT const_name TO new_const_name
لإعادة تسمية قيد اسمه
const_name
في الجدول الذي اسمهname
(إن وُجد) باسمٍ جديدnew_const_name
.ALTER TABLE [ IF EXISTS ] name
RENAME TO new_name
لإعادة تسمية الجدول الذي اسمه
name
(إن وُجد) باسمٍ جديدnew_name
.ALTER TABLE [ IF EXISTS ] name
action [, ... ]
لتنفيذ تعديل على الجدول من بين التعديلات الآتية:
التعديل المُنفّذ
الشيفرة action
إضافة عمود جديد (إن لم يوجد مسبقًا) باسم
column_name
وبنوع بياناتdata_type
وإضافة قيود لهADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ column_constraint [ ... ]
]
حذف عمود باسم
column_name
(إن وُجد) وتستخدم الكلمة المفتاحيةCASCADE
في حال وجود أي اعتماد على هذا العمود من أي عنصر آخر خارج الجدول (مثل حالة المفتاح الثانوي)DROP [ COLUMN ] [ IF EXISTS ] column_name [CASCADE ]
تعديل نوع البيانات بالعمود
column_name
ليصبح بنوعdata_type
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type
تعديل القيمة الافتراضية للعمود
column_name
لتصبح بقيمةexpression
ALTER [ COLUMN ] column_name SET DEFAULT expression
حذف القيمة الافتراضية الحالية للعمود
column_name
ALTER [ COLUMN ] column_name DROP DEFAULT
إضافة/حذف قيد ألا تكون القيمة خالية
NOT NULL
في العمودcolumn_name
ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
تعديل قيمة إحدى صفات
attribute_option
العمودcolumn_name
لتصبحvalue
ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ]
)
إعادة ضبط قيمة إحدى صفات
attribute_option
العمودcolumn_name
لتصبح القيمة الافتراضيةALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ]
)
إضافة قيد على مستوى الجدول
ADD table_constraint
حذف القيد
constraint_name
(إن وُجد)DROP CONSTRAINT [ IF EXISTS ] constraint_name
لتعديل أيّ من قيم معاملات التخزين المتعلقة بالجدول
SET ( storage_parameter = value [, ... ] )
لإعادة ضبط قيمة أحد معاملات التخزين المتعلقة بالجدول
RESET ( storage_parameter [, ... ] )
لنقل ملكية الجدول إلى مالك جديد new_owner أو المستخدم الحالي
CURRENT_USER
OWNER TO { new_owner | CURRENT_USER }
أمثلة
لإضافة عمود جديد إلى جدول الطلاب
students
باسمaddress
يستخدم الأمر الآتي:ALTER TABLE students ADD COLUMN address varchar(50);
ولتعديل عدد محارفه المتاحة:
ALTER TABLE students ALTER COLUMN address TYPE varchar(100);
ولإضافة قيد ألا يكون بقيمة
NULL
:ALTER TABLE students ALTER COLUMN address SET NOT NULL;
ولإزالة هذا القيد:
ALTER TABLE students ALTER COLUMN address DROP NOT NULL;
ولإضافة قيد على مستوى الجدول
students
بأن يكون هذا العمود مفتاحًا ثانويًا باسمst_fk
يرتبط مع الجدولaddresses
عبر العمودaddress
:ALTER TABLE students ADD CONSTRAINT st_fk FOREIGN KEY (address) REFERENCES addresses (address);
ولجعل هذا العمود بقيمة فريدة بقيدٍ باسم
add_uniq
:ALTER TABLE students ADD CONSTRAINT add_uniq UNIQUE (address);
ولحذفه من جديد:
ALTER TABLE students DROP COLUMN address;
ولجعل العمود
studentID
مفتاحًا أوليًا للجدولstudents
:ALTER TABLE students ADD PRIMARY KEY (studentID);
ولإعادة تسمية الجدول باسم
schoolStudents
:ALTER TABLE students RENAME TO schoolStudents;
حذف الجدول DROP TABLE
يستخدم هذا الأمر لحذف جدول أو أكثر من قاعدة البيانات، وله البنية العامّة الآتية:
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
إذ يُحذف الجدول المحدد باسم
name
، وتمنعIF EXISTS
حدوث أي خطأ في حال عدم وجود هذا الجدول في قاعدة البيانات، أما الكلمة المفتاحيةCASCADE
فهي للإعلام بحذف أي كائنات objects معتمدة عليه (مثل Views)، وبالحالة الافتراضية فإنRESTRICT
تمنع حذفه إن كان هناك اعتماد عليه من قبل كائن ما.أما لحذف كافة السجلات من الجدول دون الحاجة إلى حذفه يمكن استخدام الأمر DELETE.
مثال
لحذف الجدولين
Students
وTeachers
من قاعدة البيانات يستخدم الأمر الآتي:DROP TABLE Students, Teachers;
أما لحذف الجدول
Courses
دون تنفيذ أي أمر في حال عدم وجوده:DROP TABLE IF EXISTS Courses;
التعامل مع الدوال
بعض الدوال المساعدة في SQL
محتويات
· 3مثال
· 4توافقية الدوال مع محركات البيانات
الدوال الرياضية
الدالة
مهمتها
COUNT(*)
تعيد عدد السجلات الموجودة في الجدول
MAX(col_name)
تعيد القيمة الأكبر في حقل col_name في سجلات الجدول
MIN(col_name)
تعيد القيمة الأصغر في حقل col_name في سجلات الجدول
AVG(col_name)
تعيد قيمة المتوسط الحسابي لقيم الحقل col_name في سجلات الجدول
SUM(col_name)
تعيد قيمة مجموع قيم الحقل col_name في سجلات الجدول
SQRT(m)
تعيد قيمة الجذر التربيعي للقيمة m (قد تكون قيمة أحد الحقول)
RAND()
تعيد قيمة عشوائية مُولّدة واقعة في المجال ما بين القيمة 0 والقيمة 1
MOD(N,M)
تعيد باقي قسمة N على M
OCT(N)
تعيد سلسلة من الخانات الثنائية bits تعبر عن تمثيل العدد N بالنظام الثماني Octal
HEX(N)
تعيد سلسلة نصية تعبّر عن تمثيل N بالنظام الست عشري Hexadecimal
PI()
تعيد قيمة النسبة PI
POW(X,Y) | POWER(X,Y)
تعيد قيمة العدد X مرفوعًا للقوة Y
ROUND(X)
تعيد أقرب صحيح يمكن تقريب العدد X له
الدوال النصيّة
الدالة
مهمتها
CONCAT('string1','string2')
تعيد سلسلة نصية وحيدة ناتجة عن لربط السلسلتين 'string1' و 'string2'
LOWER('string')
تعيد سلسلة نصية بعد تحويل كافة الأحرف الواردة في السلسلة 'string' إلى حالة الأحرف الصغيرة
UPPER('string')
تعيد سلسلة نصية بعد تحويل كافة الأحرف الواردة في السلسلة 'string' إلى حالة الأحرف الكبيرة
CHAR_LENGTH('string')
تعيد عدد أحرف السلسلة النصية 'string'
TRIM('string')
تعيد السلسلة النصية 'string' بعد إزالة الفراغات على طرفيها (إن وُجدت)
مثال
إذا كان الجدول الآتي cars موجودًا في قاعدة البيانات:
Colour
Price
Year
Company
Model
CarID
White
22,500
2018
KIA
Optima
05081
Red
25,995
2017
KIA
Optima Hybrid
05082
Red
31,900
2018
KIA
Stinger
05083
Black
31,990
2017
KIA
Cadenza
05084
Blue
23,240
2018
KIA
Niro
05085
Grey
14,200
2018
KIA
Rio 5-Door
05086
Blue
18,200
2018
KIA
Forte5
05087
Blue
32,250
2017
KIA
Soul EV
05088
Red
23,385
2017
Nissan
Altima
05089
White
46,195
2017
Nissan
Armada
05090
Black
33,495
2017
Nissan
Maxima
05091
Black
30,715
2017
Nissan
Murano
05092
Grey
31,265
2017
Nissan
Pathfinder
05093
White
17,875
2017
Nissan
Sentra
05094
Red
12,875
2017
Nissan
Versa
05095
إن تنفيذ الاستعلام الآتي:
SELECT count(*) AS Total Number, MAX(Price) AS Most Expensive, MIN(Price) AS Cheapest, ROUND(AVG(Price)) AS Average, SUM(Price) AS Total Sum
FROM cars;
سيُظهر العدد الإجمالي للسيارات الموجودة في الجدول بمسمى Total Number وقيمة السيارة الأعلى سعرًا بمسمى Most Expensive وقيمة السيارة الأقل سعرًا Cheapest والمتوسط الحسابي لسعر السيارات من بعد تقريبه لأقرب عدد صحيح Average والمجموع الإجمالي لأسعار السيارات Total Sum، لتظهر النتائج الآتية:
Total Sum
Average
Cheapest
Most Expensive
Total Number
396,080
26,404
12,875
46,195
15
وعند تنفيذ الاستعلام الآتي:
SELECT CONCAT(UPPER(Model), ' - ' , Company, ' - ' , LOWER(Colour)) AS Name
FROM cars
ORDER BY RAND();
سيظهر عمود واحد يحتوي على نوع السيارة (بعد تحويله لأحرف كبيرة) متبوعًا بشركتها المنتجة ولونها (بعد تحويله لأحرف صغيرة)، وترتيب النتائج الصادرة ترتيبًا عشوائيًا، لتظهر النتائج الآتية:
Name
RIO 5-DOOR - KIA - grey
STINGER - KIA - red
ARMADA - Nissan - white
SOUL EV - KIA - blue
PATHFINDER - Nissan - grey
MAXIMA - Nissan - black
ALTIMA - Nissan - red
OPTIMA HYBRID - KIA - red
OPTIMA - KIA - white
MURANO - Nissan - black
CADENZA - KIA - black
NIRO - KIA - blue
FORTE5 - KIA - blue
SENTRA - Nissan - white
VERSA - Nissan - red
توافقية الدوال مع محركات البيانات
الدالة
MySQL
PostgreSQL
Oracle
SQLite
SQL Server
COUNT(*)
نعم
نعم
نعم
نعم
نعم
MAX(col_name)
نعم
نعم
نعم
نعم
نعم
MIN(col_name)
نعم
نعم
نعم
نعم
نعم
AVG(col_name)
نعم
نعم
نعم
نعم
نعم
SUM(col_name)
نعم
نعم
نعم
نعم
نعم
SQRT(m)
نعم
نعم
نعم
لا
نعم
RAND()
نعم
RANDOM()
DBMS_RANDOM.VALUE()
RANDOM()
نعم
MOD(N,M)
نعم
نعم
نعم
%
%
OCT(N)
نعم
لا
لا
لا
لا
HEX(N)
نعم
TO_HEX(N)
RAWTOHEX(N)
نعم
لا
PI()
نعم
نعم
نعم
نعم
نعم
POW(X,Y) | POWER(X,Y)
نعم
نعم
نعم
لا
نعم
ROUND(X)
نعم
نعم
نعم
نعم
نعم
CONCAT('string1','string2')
نعم
نعم
نعم
||
نعم
LOWER('string')
نعم
نعم
نعم
نعم
نعم
UPPER('string')
نعم
نعم
نعم
نعم
نعم
CHAR_LENGTH('string')
نعم
نعم
LENGTH('string')
LENGTH('string')
LEN('string')
·
إنشاء دالة CREATE FUNCTION في SQL
يستخدم هذا الأمر لتعريف دالة جديدة، وله البنية العامّة الآتية:
CREATE [ OR REPLACE ] FUNCTION name ( [[argmode] [ argname ] argtype [, ...] ] ) [RETURNS rettype]
AS 'definition'
إذ ينشئ هذا الأمر دالةً جديدةً (أو يستبدلها في حال وجود دالة سابقة) باسم
name
وتوضع معاملاتها ما بين القوسين وذلك بتحديد نوع المعاملargmode
(كدخلIN
أو خرجOUT
أو دخل وخرج معًاINOUT
) ومن ثم اسم المعاملargname
ونوع قيمتهargtype
وكما يمكن تحديد نوع القيمة المُعادةrettype
.أمثلة
لإنشاء دالة باسم add لجمع عددين صحيحين وإعادة الناتج، يُستخدَم الأمر:
CREATE FUNCTION add(x INTEGER, y INTEGER) RETURNS INTEGER AS
RETURN x + y;
لإنشاء دالة باسم hello تعيد العبارة النصية Hello مضافةً لها السلسلة s التي تدخل للدالة في لائحة المعاملات، يُستخدَم الأمر:
CREATE FUNCTION hello (s VARCHAR(20)) RETURNS VARCHAR(50) AS
RETURN CONCAT('Hello, ',s,'!');
إذ إن الدالة
CONCAT
تستخدم للربط ما بين السلاسل النصية التي تدخل في معاملاتها. لإنشاء دالة باسمget_count
تعيد عدد السجلات الموجودة في جدولstudents
عبر متحول باسمnum
، يُستخدَم الأمر:CREATE FUNCTION get_count (OUT num INTEGER) AS
SELECT COUNT(*) INTO num FROM students;
تعديل الدالة ALTER FUNCTION في SQL
يستخدم هذا الأمر لتعديل تعريف دالة مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION، وله الصيغ الآتية:
ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
RENAME TO new_name;
لإعادة تسمية الدالة
name
(والتي معاملاتها محددة بالنوعargmode
والاسمargname
ونوع البياناتargtype
) باسم جديدnew_name
.ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
OWNER TO { new_owner | CURRENT_USER | SESSION_USER };
لنقل ملكية الدالة
name
(والتي معاملاتها محددة بالنوعargmode
والاسمargname
ونوع البياناتargtype
) إلى مالك جديدnew_owner
أو المستخدم الحاليCURRENT_USER
. أما لتغيير مهمة الدالة (بنيتها الداخليةbody
) فيُستخدم الأمر بالشكل:ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
RETURNS return_data_type
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
;
إذ يمكن تعديل أيّ من الخصائص الواردة بتعريف الدالة كما هو الحال عند إنشائها عبر الأمر CREATE FUNCTION.
أمثلة
لإعادة تسمية الدالة
sqrt
لتصبح باسمsquare_root
، يستخدم الأمر:ALTER FUNCTION sqrt(integer) RENAME TO square_root;
لتعديل الدالة
get_count
المُنشأة مسبقًا لتعيد عدد السجلات التي يكون فيها معدل الطالب أكبر من 2 بدلًا من العدد الإجمالي، يستخدم الأمر:ALTER FUNCTION get_count (OUT num INTEGER) AS
SELECT COUNT(*) INTO num FROM students
WHERE GPA>2;
حذف الدالة DROP FUNCTION
يستخدم هذا الأمر لحذف دالة (أو إجراء) أو أكثر مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION، وله البنية العامّة الآتية:
DROP {FUNCTION | PROCEDURE} [ IF EXISTS ] name [ ( [argtype [, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]
إذ تُحذف الدالة المحدد باسم
name
، وتمنعIF EXISTS
حدوث أي خطأ في حال عدم وجود دالة بهذا الاسم في قاعدة البيانات، ويُحدد نوع البيانات لمتغيرات الدالة ما بين قوسين لاحتمال تكرار نفس اسم الدالة بلائحة مختلفة لمتغيراتها، أما الكلمة المفتاحيةCASCADE
فهي للإعلام بحذف أي كائناتobjects
معتمدة على الدالة، وبالحالة الافتراضية فإنRESTRICT
تمنع حذفها إن كان هناك اعتماد عليها من قبل كائن ما.ويمكن الاستغناء عن لائحة المتغيرات للدالة في حال كان اسمها فريدًا.
مثال
لحذف الدالتين باسم
findSqrt
(مع اختلاف نوع العدد) يستخدم الأمر الآتي:DROP FUNCTION findSqrt(INTEGER), findSqrt(BIGINTEGER);
تعبير الإعادة RETURN في SQL
تستخدم لإنهاء الدالة وإعادة قيمة ما للموقع الذي استُدعيت فيه الدالة، وتكون الصيغة العامّة بالشكل الآتي:
RETURN [expression];
إذ إن
expression
هي قيمة التعبير التي ستُعاد (وقد تكون قيمة أوليّة scalar مباشرة أو قيمة مركّبة كسجل)، أما إن كانت الدالة تحتوي بتعريفها متحولات للخرج (من نوعOUT
) أو عند الحاجة للخروج من الدالة فيُكتفى بكلمةRETURN
فقط، أي بالشكل الآتي:RETURN;
مثال
تعيد الدالة الآتية
double_it
المُعرَّفة من المستخدم عبر محرك Oracle القيمة العددية (نوعهاNUMBER
) المُدخلة إليها بعد مضاعفتها:FUNCTION double_it (n NUMBER) RETURN NUMBER IS
BEGIN
RETURN n * 2;
END double_it;
التعامل مع العرض
إنشاء العرض CREATE VIEW
يستخدم هذا الأمر لإنشاء عرضٍ والذي هو عبارة عن جدول افتراضي يُبنى بالاعتماد على نتائج استعلامٍ ما، وله البنية العامّة الآتية:
CREATE VIEW name [ ( col_name [, ...] ) ]
AS query
إذ إن
name
هو اسم العرض المُنشَأ وتُحدّد الأعمدة المطلوبة بين قوسين، وتُعبِّر كلمةquery
عن الاستعلام الذي سيُؤخذ العرضُ منه، ويُمكن استخدام هذا العرض المنشأ في عبارةFROM
بأي استعلام SELECT آخر.مثال
لإنشاء عرض باسم
novels
يحتوي كافة الكتب الروائية المتوفرة في سجلات المكتبة الموجودة بالجدولbooks
، يستخدم الأمر التالي:CREATE VIEW novels AS
SELECT *
FROM books
WHERE category= 'Novel';
تعديل العرض ALTER VIEW
يستخدم هذا الأمر لتعديل عرضٍ مُنشَأ مسبقًا عبر الأمر CREATE VIEW، وله الصيغ الآتية:
ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] col_name SET DEFAULT expression;
لتحديد قيمة افتراضية
expression
للعمودcol_name
الموجود في العرضname
(إن وُجد).ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] col_name DROP DEFAULT;
لحذف القيمة الافتراضية للعمود
col_name
الموجود في العرضname
(إن وُجد).ALTER VIEW [ IF EXISTS ] name OWNER TO new_owner;
لنقل ملكية العرض
name
إلى المالكnew_owner
.ALTER VIEW [ IF EXISTS ] name RENAME TO new_name;
لإعادة تسمية العرض
name
باسمnew_name
.ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] );
لتعديل أيّ من قيم الخيارات
options
العرضname
.ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] );
لإعادة ضبط أيّ من قيم الخيارات
options
العرضname
لتصبح القيمة الافتراضية.ALTER VIEW name [(column_list)]
AS select_statement;
لتعديل تعريف العرض
name
ليصبح اعتمادًا على استعلام جديدselect_statement
.مثال
لإعادة تعريف العرض
novels
المنشَأ مسبقًا نستخدم الأمر التالي:ALTER VIEW novels AS
SELECT *
FROM books
WHERE category = ‘novel’ OR category = 'story' ;
لضبط القيمة الافتراضية
'
anonymous
'
لعمودauthor
في العرضnovels
يستخدم الأمر:ALTER VIEW novels ALTER author SET DEFAULT 'anonymous';
لإعادة تسمية العرض باسم
novels
ليصبحstories
، يستخدم الأمر التالي:ALTER VIEW novels RENAME TO stories;
حذف العرض DROP VIEW
يستخدم هذا الأمر لحذف
view
أو أكثر مُنشئ مسبقًا عبر الأمر CREATE VIEW، وله البنية العامّة الآتية:DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
إذ يُحذف
view
المحدد باسمname
، وتمنعIF EXISTS
حدوث أي خطأ في حال عدم وجوده في قاعدة البيانات، أما الكلمة المفتاحيةCASCADE
فهي للإعلام بحذف أي كائنات objects معتمدة عليه، وبالحالة الافتراضية فإنRESTRICT
تمنع حذفه إن كان هناك اعتماد عليه من قبل كائن ما.مثال
لحذف
view
باسمshowKinds
يستخدم الأمر الآتي:DROP VIEW showKinds;
- 2
-
Derbali بالفرنسية اي دربالي باللغة العربية وهو لقب العائلة : لقب منتشر كثيرا بتونس و الجزائر و المغرب و ليبيا
مشكور اخي على المرور
و على قول استاذنا :Eng.Qassim
I care of my self
على الاقل في جانب تعلم البرمجة
- 1
-
في 18/8/2021 at 21:42, د.كاف يار said:
تفضل هذا التعديل شامل لكل ما طلبت
سوف تتمكن من اختيار الجداول التي ترغب في افراغ البيانات منها
الرقم السري داخل الكود لإفراغ البيانات 123
رحم الله والديك على هذا المثال الجيد صراحة ابدعت استاذي الكريم
-
قمنا بتصميم قاعدة بيانات و مررنا بكل المراحل بمساعدة الاساتذة الافاضل ووفقنا في ذلك و الحمد لله :
لكن لنفترض ان اصبح للبرنامج مثلا 3 سنوات شغل و اصبح يتطلب تحيين و ترقية و اظافة جداول و استعلامات و حذف اخرى :
كيف نستطيع فعل ذلك ؟
-
السلام عليكم و رحمة الله و بركاته :
لي طلب للاخوة هل بالامكان مدي بكود او رابط موجود بالمنتدى لطريقة حذف بيانات عدة جداول حسب الخيارات :
مثلا عندما اضغط على زر الحذف ينبثق مثلا نموذج فيه جملة من الخيارات مثل هل تريد حذف بيانات الجدول مثلا 1 او 2 او 3 او 4 و هكذا دواليك
مشكورين على التفاعل و المساعدة و جعلها الله في ميزان حسناتك
-
مشاء الله شكرا للاستاذ على النموذج الجيد و السريع و البسيط
جعله الله في ميزان حسناتك
-
وجدت هذه الاكواد فاردت ان يستفاد منها المبرمج المبتدئ مثلي
1 DoCmd.OpenForm "", acNormalفتح نموذج
2 DoCmd.OpenQuery "", acViewNormalفتح استعلام
3 DoCmd.OpenReport "", acViewNormalفتح تقرير
4 DoCmd.OpenTable "", acViewDesignفتح جدول
5 DoCmd.CloseacForm, ""
فتح نموذج 6 DoCmd.CloseacQuery, "" فتح استعلام
7 DoCmd.CloseacReport, ""
فتح تقرير 8 DoCmd.CloseacTable, "" فتح جدول
9 DoCmd.Beepصوت بيب + فيديو
10 DoCmd.CancelEventالغاء الامر
11 DoCmd.Quitاغلاق البرنامج
12 DoCmd.CloseDatabaseاغلاق قاعدة البيانات
13 DoCmd.DeleteObjectacForm, "" حذف نموذج
14 DoCmd.DeleteObjectacQuery, "" حذف استعلام
15 DoCmd.DeleteObjectacReport, "" حذف تقرير
16 DoCmd.DeleteObjectacTable, "" حذف جدول
17 DoCmd.GoToRecord , , acFirstالذهاب للسجل الاول
18 DoCmd.GoToRecord , ,acLastالذهاب للسجل الاخير
19 DoCmd.GoToRecord , ,acNewRecالذهاب للسجل الجديد
20 DoCmd.GoToRecord , ,acNextالذهاب للسجل التالى
21 DoCmd.GoToRecord , ,acPreviousالذهاب للسجل السابق
22 DoCmd.GoToRecord , , acGoTo, 2 الذهاب للسجل رقم2
23 DoCmd.Maximizeتكبير 24 DoCmd.Minimizeتصغير
25 DoCmd.Restoreاستعادة الوضع
26 DoCmd.MoveSize 2000, 5000 تموضع النموذج من الاعلى5000 واليسار2000
27 DoCmd.RefreshRecordتحديث الصفحة
28 DoCmd.Rename "2", acForm, "20" تغير اسم نموذج من 20 الى2
29 DoCmd.Rename "2", acQuery, "20" تغير اسم استعلام
30 DoCmd.Rename "2", acReport, "20" تغير اسم تقرير
31 DoCmd.Rename "2", acTable, "20" تغير اسم جدول
32 DoCmd.Requeryاعادة الاستعلام
33 [].Requeryاعادة استعلام داخل متغير
34 DoCmd.RunCommandacCmdDataEntryتحويل النموذج الى ادخال بيانات فقط
35 DoCmd.RunCommandacCmdNewObjectFormفتح معالج نموذج
36 DoCmd.RunCommandacCmdNewObjectQueryفتح معالج استعلام
37 DoCmd.RunCommandacCmdNewObjectReportفتح معالج تقرير
38 DoCmd.RunCommandacCmdNewObjectTableفتح معالج جدول
39 DoCmd.RunCommandacCmdOptionsفتح شاشة خيارات
40 DoCmd.RunCommandacCmdStartupPropertiesفتح بدا التشغيل
41 DoCmd.RunCommandacCmdOutputToExcelتصدير نموذج مجدول الى اكسيل
42 DoCmd.RunCommandacCmdPrintمربع حوار الطباعة
43 DoCmd.RunCommandacCmdQuickPrintطباعة الحالى
44 DoCmd.RunCommandacCmdRegisterActiveXControlsإظهار مربع حوار تسجيل عناصر تحكم أكتف أكس 45 DoCmd.RunCommandacCmdRelationshipsالعلاقات
46 DoCmd.RunCommandacCmdUndoتراجع عن
47 DoCmd.RunCommandacCmdWindowHideاخفاء جزء الانتقال
48 DoCmd.OpenReport "2", acViewPreviewDoCmd.RunCommand acCmdZoom500 فتح التقرير فى حجم 5 اضعاف
49 DoCmd.SetWarnings False ايقاف رسائل التاكيد الاجرائية
50 DoCmd.ShowToolbar "ribbon", acToolbarNoاخفاء الاشرطة
- 3
- 1
-
استاذي الكريم اذا ممكن هل بالامكان ارفاق مثال بسيط و مشكور
-
-
نجحت العملية بامتياز بارك الله فيكم و جعل اعمالكم في ميزان حسنتاكم .....
- 1
هل نستطيع جلب حقل او اثنين من الاكسال الى اكسيس
في قسم الأكسيس Access
قام بنشر · تم تعديل بواسطه derbali ammar
استاذي الكريم : نجحت العملية و استطعت الدخول للاستيراد لكن تخرج رسالة مثل ما هو مبين بالصورة
مع العلم ان الجدول الذي اردت تصديره يوجد به 4 حقول فقط و هم :
1/ الاسم و اللقب
2/ تاريخ الولادة
3/ الجنس
4/ اسم الاب
في حين الجدول الموجود بالاكساس يوجد به العديد من الحقول
هل ان المشكلة تتمثل في ضرورة وجود نفس الحقول في الاكسيس و الاكسال ام هناك مشكلة اخرى