تعلم قواعدالبيانات ب sql

الكاتب : ابوالبراء   المشاهدات : 5,491   الردود : 5    ‏2004-04-11
      مشاركة رقم : 1    ‏2004-04-11
  1. ابوالبراء

    ابوالبراء عضو

    التسجيل :
    ‏2004-04-08
    المشاركات:
    52
    الإعجاب :
    0
    بســـــــــم الله الرحمن الرحيم
    الاخوة الاعزاء السلام عليكم ورحمة الله وبركاته
    اقدم لكم هذه المشاركة وهي اول مشاركة لي والتقصير اكيد موجود لكن العفو منكم
    ارجو ان تنال هذه المشاركة رضاكم وتعم الفائدة
    لشيء الذي لن تستطيع تجاهله عند تعلم قواعد البيانات هو لغةة الاستفسار او الاستعلام و التي يعبر عنها بـ SQL ، فما هي الـ SQL ؟
    • SQL اختصار لـ Structured Query Language
    • SQL لغة ANSI قياسية
    • SQL تسمح لك بالوصول إلى قواعد البيانات ومن ثم التعامل معها
    • SQL تسمح لك باستخراج معلومات من قواعد البيانات
    • SQL تمكنك من إضافة سجل جديد إلى قاعدة البيانات
    • SQL تمكنك من حذف سجل من قاعدة البيانات
    • SQL تمكنك من تحديث سجل في قاعدة البيانات
    • SQL سهلة التعلم جداً جداً جداً
    ماذا يعني أن لغة SQL هي لغة ANSI قياسية ؟
    ANSI هي اختصار لـ (American National Standards Institute) ، اعتمد هذا المعهد لغة الـSQL لجعلها قياسية في التعامل مع جميع قواعد البيانات .
    SQL تعمل مع جميع برامج قواعد البيانات مثل : ( MS Access, DB2, Informix, MS SQL Server, Oracle, Sybase, وغيرها ) .
    والآن بعد ان تعرفنا على ماهيّة الـSQL ، نأتي إلى الجداول في قواعد البيانات ، وننشيء سوياً قاعدة البيانات التي سيتم عليها الشرح خلال هذه الدورة إن شاء الله .
    الجداول و قاعدة البيانات :
    قاعدة البيانات دائماً تتكون من جدول أو أكثر ، لكل جدول اسم خاص به ، في كل جدول صفوف وأعمدة ، كل صف يمثل سجل في قاعدة البيانات وكل عمود يمثل حقل .
    مثال : جدول الموظفين التالي - أحد الجداول التي سنعتمدها خلال الدورة إن شاء الله - :
    DNO ADDRESS BDATE NUMBER LNAME FNAME
    5 731 MAKKAH,SA 09/01/1980 11 علي محمد
    4 3321 JEDDAH,SA 12/10/1982 22 أحمد خالد
    4 778 RYADE,SA 01/08/1983 33 حمد محمد
    5 888 RYADE,SA 02/03/1979 44 علي بدر

    الجدول السابق يحتوي أربع سجلات ( سجل لكل موظف ) وستة حقول وهي على الترتيب : ( الاسم الأول ، الاسم الأخير ، رقم الموظف ، عنوانه ، يوم ميلاده ، رقم القسم الذي يعمل فيه - DNO = Department_Number- ) .

    لا بد أن يكون لكل جدول هام حقل مميز ، بحيث أن قيمة هذا الحقل في سجل ما داخل هذا الجدول يستحيل أن تتساوى مع قيمة نفس الحقل لسجل آخر في نفس الجدول .. هذا الحقل نطلق عليه المفتاح الرئيسي أو Primary Key ، ولعلك تتساءل الآن : ما فائدة المفتاح ؟
    في أي قاعدة بيانات ، لكي نربط الجداول مع بعضها البعض في هذه القاعدة نحتاج إلى علاقات فيما بين هذه الجداول ؛ ولتكوين العلاقات نستخدم هذه المفاتيح ، بحيث أن حقلاً معيناً يوجد في جدولين مثلاً : الجدول الأول لا تتكرر قيمة هذا الحقل فيه لجميع السجلات ، بينما في الجدول الثاني يوجد هذا الحقل ولكن قد تتكرر أحدى قيمه .. .. إذن نختار هذا الحقل كمفتاح للجدول الأول ونربط بهذا المفتاح الجدولين .
    ومن هنا نستطيع استرجاع المعلومات التي نريدها من أكثر من جدول باستخدام هذه العلاقات ..
    سيساعدك العرض الفلاشي التالي إن شاء الله في فهم الموضوع بطريقة أكثر تنظيماً وعمقاً ، يوضح هذا العرض الثلاث جداول التي سنعتمدها خلال الدورة إن شاء الله والعلاقات فيما بينها ، هذه الجداول تابعة لقاعدة بيانات إحدى الشركات ، هذه الشركة لها قسمين ( 5و 4 ) وفي كل قسم يوجد مشاريع خاصة يعمل فيها الموظفون :




    والآن نأتي للجزء الاكثر متعة في درس اليوم" الجزء العملي " : سننشيء معاً في الآكسس الآن معاً الجداول والعلاقات التي سيتم عليها شرح الدورة وطلب تنفيذ الواجبات ، على مرحلتين :
    • وصف الجداول وبيانات كل جدول
    • إنشاء الجداول والعلاقات خطوة بخطوة على الآكسس
    • أولاً : وصف الجداول وبيانات كل جدول :
    سندرس الإس كيو إل على هذه الثلاث جداول إن شاء الله :
    1. الجدول الأول جدول الموظفين EMPLYEE ، وهو الجدول الذي تحدثنا عنه قبل قليل ، مع ملاحظة ان الحقل NUMBER يعتبر المفتاح Primary Key لهذا الجدول .
    2. الجدول الثاني هو جدول المشروع PROJECT وحقوله كالتالي، مع ملاحظة ان الحقلان PNUMBER & DNUM كل منهما عبارة عن مفتاح Primary Key لهذا الجدول
    3.
    4. :
    DNUM PNUMBER PNAME
    5 1 المنتج س
    4 2 المنتج ص
    5.

    6. الجدول الثالث هو جدول العمال WORKS_ON وحقوله كالتالي :
    HOURS PNO ENUMBER
    20.5 1 11
    17.5 2 22
    10 2 33
    10 1 44

    ثانياً : إنشاء الجداول والعلاقات خطوة بخطوة على الآكسس :
    افتح برنامج الآكسس التابع للأوفيس ، ثم اطلب قاعدة بيانات جديدة باتباع المسار التالي : File \ Blank DataBase
    ثم سمّي قاعدة البيانات هذه SQLDB مثلاً .
    الآن نأتي إلى إنشاء الجداول وحداً تلو الآخر وتحديد المفاتيح فيها وتكوين العلاقات بينها ، كما يوضح العرض الفلاشي التالي :
    بعد ذلك قم بتعبئة بيانات كل جدول كما وضحنا في المرحلة الأولى .. تذكر دوماً ان تنشئ العلاقات بين الجداول قبل أن تقم بتعبئتها بالبيانات ، و تذكر أن تكتب البيانات سليمة كي تستطيع متابعة الشرح وحل الواجبات معنا في هذه الدورة إن شاء الله :sport:
    والآن ستوضح هذه الصورة المصطلحات العربية التي سنستخدمها في الشرح ، والمقابل لها باللغة الإنجليزية والتي ستجدها في الكتب أو على صفحات الانترنت التي تتحدث عن قواعد البيانات :
    تعرفنا في الدرس الأول على لغة السيكيول وإمكانياتها ، وأنشأنا سوياً قاعدة البيانات التي سنطبق عليها دورتنا :) .اليوم سنبدأ بالإبحار الفعلي في لغة الاستعلامات ( السيكيول SQL ) وسنتعلم كيف ننشئ قاعدة بياناتنا بأوامرSQL :
    قواعد اللغة :
    1. لغة SQL لاتفرق بين الحروف الكبيرة والصغيرة .
    2. لغة SQL لاتهتم بالمسافات البيضاء .
    3. تنتهي جميع الاستعلامات بالفاصلة المنقوطة (;) بعض البرامج لا تشترط وجود هذه الفاصلة وبعضها يوجب وجودها .
    تدشين قاعدة بيانات وإنشاء الجداول في السيكيول SQL Create Database and Table :
    لإنشاء قاعدة بيانات : نستخدم هذا الأمر :
    CREATE DATABASE database_name;

    ولإنشاء جداول فيها ، نستخدم هذا الأمر :

    CREATE TABLE table_name OR CREATE TABLE database_name.table_name ( column_name1 data_type, column_name2 data_type, ....... );

    نلاحظ أننا :
    1. نستخدم الأقواس لتعريف حقول الجدول بداخلها .
    2. نستخدم الفاصلة (،) للفصل بين الحقول .
    3. ونستخدم الفاصلة المنقوطة (؛ ) بعد إغلاق أقواس تعريف الحقول ، أي بعد الانتهاء من الأمر تماماً ..
    وبعد الفاصلة المنقوطة نستطيع الشروع في تدشين جدول جديد . وهكذا ..
    أما أنواع البيانات (data type) التي يمكن أن تحتويها حقول الجداول في السيكيول فهي كما موضحة في الجدول التالي :
    Data Type نوع البيان Description الوصف

    integer(size)
    int(size)
    smallint(size)
    tinyint(size)
    لتعريف أعداد صحيحة ، عدد خانات العدد يمكن أن نحدده بين القوسين ، نطاق الأعداد التي يمكن تعريفها هنا يبدأ من (-2147483648) إلى (2147483647) والنطاق المستخدم في الواقع من الصفر إلى 4294967295 .

    Hold integers only. The maximum number of digits are specified in parenthesis.

    decimal(size,d)
    numeric(size,d)
    لتعريف الأعداد ذات الكسور العشرية ،داخل القوسين نحدد في المتغير الأول أكبر عدد لخانات الرقم الصحيح ، وفي المتغير الثاني نحدد عدد الخانات العشرية بعد الفاصلة .

    Hold numbers with fractions. The maximum number of digits are specified in "size". The maximum number of digits to the right of the decimal is specified in "d".

    char(size)
    لتعريف نص ذو حجم محدد ، نحدد الحجم داخل القوسين .. هذه الجمل من الممكن أن تتكون من أحرف وأرقام وعلامات

    Holds a fixed length string (can contain letters, numbers, and special characters). The fixed size is specified in parenthesis.

    varchar(size)
    لتعريف نص ذو حجم متغير ، نحدد أكبر حجم ممكن لها داخل الأقواس .. هذه الجمل من الممكن أن تتكون من أحرف وأرقام وعلامات .

    Holds a variable length string (can contain letters, numbers, and special characters). The maximum size is specified in parenthesis.

    text
    لتعريف حقل نص يستقبل 65535 حرف كحد أقصى

    A field with a maximum lenght of 65535 ,(2^16-1), characters.

    mediumtext
    لتعريف حقل نص يستقبل 16777215 حرف كحد أقصى

    A field with a maximum lenght of 16777215 ,(2^24-1), characters.

    date(yyyymmdd)
    date

    لتعريف تاريخ ، أكبر حجم نستطيع تحديده داخل القوسين هو عشرة خانات : أربع للعام واثنان للشهر واثنان لليوم وخانتان للفواصل بين البيانات ، والنطاق المسموح به هنا من 1000-01-01 إلى 9999-12-31
    Holds a date.

    timestamp(yyyynnddhhmmss)
    يحتوي على التاريخ والتوقيت ، نطاقه يبدأ من "1970-01-01-00:00:00" وهي تقابل (January .1,1970 00:00:00) وينتهي النطاق بـ "2038-01-18-19:14:07"

    include both the Date & Time.
    مثال :
    في المثال التالي سنستعرض كيفية إنشاء جدولانا الثاني ( جدول المشاريع PROJECT) والثالث ( جدول العمل WORKS_ON ) كالتالي :


    CREATE TABLE PROJECT ( PNAME varchar(15) , PNUMPER int(2) NOT NULL, DNUM int NOT NULL );
    /* تذكر ان آخر سطر في تعريف حقول الجدول لا ينتهي بفاصلة ، لأن القوس سيغلق بعده */


    CREATE TABLE WORKS_ON ( ENUMBER int(2) NOT NULL, PNO int(2) NOT NULL, HOURS decimal(3,1) );


    إذا كان الحقل مفتاحاً ، فمن الضروري أن لا يكون خالياً ، لذلك نشترط ونضع حدود عليه بكلمة NOT NULL ، وفي حالة لم يدخل له المستخدم قيمة حين إدخال البيانات إلى الجدول فإن رسالة خطأ ستظهر له ، أو ستعتمد القيمة الـDefault في هذا الحقل إذ لا يترك فارغاً دون قيمة .. تذكر دوماً ان تستخدم NOT NULL مع تعريف الحقل إذا كان مفتاحاً !!
    حذف قاعدة بيانات أو جدول Delete a Database or Table :
    لحذف قاعدة بيانات كامل نستخدم الأمر التالي " كن حذراً عند استخدامك له ، فقد تفقد الكثير من البيانات "

    DROP DATABASE database_name;

    أما لحذف جدول بكل محتوياته ، نستخدم الأمر التالي :

    DROP TABLE table_name;

    وإذا كان هذا الجدول مرتبط بعلاقات مع جداول أخرى في قاعدة البيانات ، فلا بد علينا من تحديث بيانات الجداول المتبقية لدينا ، ويكون ذلك بإضافة كلمة CASCADE بعد أمر الحذف مباشرة وقبل الفاصلة المنقوطة ، مثال :
    حذف جدول الموظفين والذي يرتبط بعلاقة مع جدول المشاريع بالأمر التالي :

    DROP TABLE EMPLOYEE CASCADE;

    إضافة أو حذف حقل لجدول موجود في قاعدة البيانات Alter Table Command:
    لإضافة أو حذف حقل في أي جدول موجود لدينا في قاعدة البيانات ، نستخدم أحد الأمرين التاليين :

    /* أمر إضافة حقل : */


    ALTER TABLE table_name ADD column_name data_type;

    /* أمر حذف حقل : */

    ALTER TABLE table_name DROP COLUMN column_name CASCADE;

    OR

    ALTER TABLE table_name DROP column_name CASCADE;

    وكما ذكرنا ، عند الحذف إذا كان الحقل الذي نريد حذفه مرتبط بعلاقات مع حقول أخرى في الجداول الأخرى في قاعدة البيانات ، فلا بد علينا من تحديث بيانات الحقول المتبقية لدينا ، ويكون ذلك بإضافة كلمة CASCADE بعد أمر الحذف مباشرة وقبل الفاصلة المنقوطة ، عموماً يفضل استخدام التحديث دوماً .
    مثال : لإضافة حقل جديد إلى جدوال العمل ، وليكن اسم هذا الحقل Location ، نستخدم الأمر التالي :

    ALTER TABLE WORKS_ON ADD Location VARCHAR(12);

    وبهذا نكون قد أنتهينا من درس اليوم الثاني ، لا يوجد جزء عملي في درس اليوم !!
    الواجب :اكتب أوامر SQL لتدشين جدوال الموظفين EMPLOYEE والذي يحتوي على الحقول التالية :

    ثم اكتب أمر إضافة حقل جديد إلى هذا الجدول ، اسمه : JOB ونوعه VARCHAR(10) ..
    بعد أن تعرفنا على أوامر إنشاء قاعدة البيانات وجداولها وما إلى ذلك ، نأتي إلى درس اليوم والذي يعتبر مخ استخدام قواعد البيانات في أي مجال ، وهو استخراج البيانات من اي قاعدة بيانات .
    الأمر SELECT - SELECT Statement : يستخدم هذا الأمر لتحديد واسترجاع حقول البيانات التي تريدها من أي جدول في قاعدة البيانات ، يقدم لك النتيجة في جدول أيضاً ، صيغة هذا الأمر كالتالي :
    SELECT column_name(s)

    FROM table_name;
    نفصل بين الحقول المطلوبة عند استخدام هذا الأمر بالفاصلة (،) .. مثال : لتحديد واسترجاع حقول اسماء الموظفين من جدول الموظفين ، نكتب :
    SELECT FNAME , LNAME

    FROM EMPLOYEE;
    والنتيجة هي :

    وهكذا ، يمكننا تحديد الحقل بياناته الخاصة بكل السجلات الموجودة في قاعدة البيانات ،أما لو كانت البيانات في الحقل الواحد من الممكن أن تكون متكررة ( مثل رقم القسم في حقل DNO في جدول الموظفين ) فإنه ليس من العملي ان نسترجع قيم مكررة ، وعليه نستطيع أن نستخدم كلمة DISTINCT مع أمر SELECT فيعطينا النتيجة بدون تكرار للقيم ، مثال :
    SELECT DISTINCT DNO

    FROM EMPLOYEE;
    والنتيجة هي :

    أعطانا أرقام الأقسام بدون تكرار :)
    إذن كلمة DISTINCT تستخدم مع الأمر SELECT لاسترجاع أو استخراج القيم المختلفة ، وعليه تكون صياغة الأمر كالتالي :
    SELECT DISTINCT column-name(s) FROM table-name;
    وأما إذا كنّا نريد استخراج جميع الحقول من جدول محدد أو من عدة جداول ، فليس علينا ان نكتب جميع أسماء الحقول أو الأعمدة ، بل يكفي فقط أن نضع النجمة (*) ليعطينا جميع الحقول ، مثال :
    SELECT * FROM EMPLOYEE;
    والنتيجة تكون :


    وإذا كنّا نريد أن تظهر لنا النتائج مرتبة ترتيباً أبجدياً أو تصاعدياً أو أبجدي بطريقة عكسية أو تنازلي .. نستخدم كلمة ORDER BY في آخر أمر SELECT ،ونضع بعدها اسم السجل ( العمود ) الذي نريد أن تظهر لنا النتيجة مرتبة من خلاله ، الجدول التالي يوضح أوامر الترتيب الممكنة في SQL :
    صيغة الأمر وظيفته
    ORDER BY columnX تكون الصفوف( السجلات) في جدول النتيجة مرتبة ترتيباً أبجدياً أو تصاعدياً بالنسبة لقيم العمود X .
    ORDER BY columnX DESC
    تكون الصفوف( السجلات) في جدول النتيجة مرتبة ترتيباً أبجدياً عكسياً أو تنازلياً بالنسبة لقيم العمود X .
    من الممكن ان نطلب الترتيب في اكثر من حقل (عمود) واحد ، فتأتينا النتيجة مرتبة على حسب قيم الحقل الأول ومن ثم تنتقل لترتيب قيم الحقل الثاني في ظل ترتيب الحقل الأول ، مثال :
    SELECT * FROM EMPLOYEE

    ORDER BY FNAME, DNO DESC;
    والنتيجة ستكون عبارة عن جدول ترتبت فيه قيم حقل FNAME أبجدياً من ثم ترتبت فيه قيم حقل DNO تنازلياً في ظل الترتيب الأبجدي الأول !! كما توضح الصورة :


    لا يستخدم الأمر SELECT فقط لإسترجاع بيانات من الجداول سواء كانت مرتبة أو لا ، وإنما يمكننا أن نستخدم العمليات الرياضية الاعتيادية فيه ، فمثلاً لو زدنا عدد ساعات عمل الموظفين بمقدار ساعتين ، فيمكننا من خلال استخدام أمر SELECT أن نسترجع عدد ساعات العمل الجديدة للموظفين لحساب الزيادة في رواتبهم مثلاً .. كما يوضح الأمر التالي :
    SELECT HOURS+2 AS New_Hours
    FROM WORKS_ON;
    والنتيجة هي :

    استخدمنا AS لإعادة تسمية الحقل عند عرض النتيجة فقط ، ولا يؤدي ذلك إلى تغيير اسم الحقل الأساسي في الجدول !!
    الشرط WHERE Clause :الشرط هو أحد أجزاء الأمر SELECT ، نستخدمه حينما نريد استرجاع قيم معينة ومحددة من أي حقل ، لا جميع القيم الموجودة في الحقل وإنما القيم التي نريدها وفق المعايير التي نحددها في الشرط ، صيغته كالتالي :
    SELECT columnX FROM table

    WHERE columnY operator value;
    من الممكن أن يكون columnX هو نفسه columnY ومن الممكن ان يكون حقل مختلف تماماً ولكن في نفس الجدول ، والعمليات التي نستخدمها في الشرط هي :

    Operator العملية Description وصفها
    = Equal يساوي
    <> Not equal لا يساوي
    < Greater than أكبر من
    > Less than أصغر من
    =< Greater than or equal أكبر من أو يساوي
    => Less than or equal أصغر من أو يساوي
    BETWEEN Between an inclusive range بين قيمتين
    LIKE Search for a pattern للبحث عن تشابة
    مثال :كي نستخرج السجلات كاملة لجميع الموظفين الذين يشتركون في اسم " محمد " :
    SELECT *
    FROM EMPLOYEE
    WHERE FNAME = 'محمد';
    والنتيجة هي فقط سجلات الموظفين الذين اسمهم محمد :


    وهكذا بالنسبة للعمليات الاعتيادية ذات اللون الاسود في الجدول ، أما طريقة استخدام كلمة BETWEEN & LIKE ففي الشرط فسنتعرف عليها إن شاء الله في الجظء الثاني من هذا الدرس . :)
    ملاحظة مهمة جداً :
    في الشرط ، نستخدم قوس الاقتباس المفرد ( ' ) فقط حينما يكون الشرط عبارة عن نص ، أما إذا كان رقم فلا نحتاج للقوس .
    إذن تعلمنا في الجزء الأول من الدرس الثالث التالي :
    • الأمر SELECT ...... FROM .
    • استرجاع القيم المختلفة باستخدام كلمة DISTINCT .
    • عرض جميع الحقول باستخدام النجمة * .
    • ترتيب النتائج باستخدام ORDER BY .
    • تسمية الحقل في جدول النتائج باستخدام AS .
    • الشرط WHERE واستخدام العمليات المنطقية المعتادة فيه .
    إذا أردت أن تطبق هذه الأوامر عملياً في برنامج الأكسس ، شاهد العرض الفلاشي التالي لتتعرف على الطريقة :
    واجب الجزء الأول :اكتب أمر SQL لعرض حقل hours من جدول العمل WORKS_ON بدون تكرار لقيمه ، وبترتيب تصاعدي !!
    نكمل معاً درسنا الثالث :) فبعد أن تعرفنا على ماهيّة الشرط في أمر Select في الجزء الأول من الدرس .. نتحدث عن الشروط بإسهاب في الجزء الثاني :
    طريقة استخدام كلمة BETWEEN في الشرط فهي كالتالي :
    نستخدم BETWEEN ... AND في الشرط لتحديد النطاق أو المدى للبيانات التي نريدها ، فنطلب بيانات محصورة بين قيمتين عن طريق إضافة هذه القيمتين في الشرط باستخدام BETWEEN ... AND ،القيم من الممكن أن تكون نصوص أو أرقام أو تواريخ ، صياغة الأمر في هذه الحالة تكون كالتالي :
    SELECT column_name FROM table_name
    WHERE column_name
    BETWEEN value1 AND value2;
    أمثلة :
    كي نسترجع سجلات الموظفين الذين تتراوح أرقامهم ما بين الرقم 10 إلى الرقم 40 ، نكتب الأمر التالي :
    SELECT * FROM EMPLOYEE

    WHERE NUMBER BETWEEN 10 AND 40;
    وفي النتيجة ستترتب السجلات تصاعدياً من حيث الحقل الذي ذكرناه في الشرط ، وهو في هذا المثال : NUMBER كالتالي :


    عندما تكون القيمتين عبارة عن نص ، فإننا نسترجع القيم التي بينهما مرتبة أبجدياً ، وليس كما هي مرتبة أو مخزنة في الجدول ، مثال : لاسترجاع سجلات الموظفين الذين تقع أسماؤهم الأخيرة بين " حمد " و " علي " نكتب الأمر - تذكر أن البحث عن النصوص خاضع لحكم الترتيب الأبجدي -:
    SELECT * FROM EMPLOYEE

    WHERE LNAME BETWEEN 'حمد' AND 'علي';
    والنتيجة هنا ستكون عبارة عن ثلاث سجلات فقط ومرتبة أبجدياً كما سنرى في الصورة حيث أن سجل حمد قبل سجلا علي ( في حقل LNAME ) :


    ملاحظة مهمة :
    تختلف برامج قواعد البيانات في طريقة تعاملها مع BETWEEN ... AND ، فبعض البرامج تعتبر القمتين المحددتين من ضمن نطاق البحث فتكون موجودة في النتائج ، وبعضها لا تعتبرها كذلك فلا تشملها النتائج ، وبعضها يعتبر القيمة الأولى داخل نطاق البحث والقيمة الثانية خارج النطاق وهكذا ، لذلك لابد من أن تتعرف على برنامجك بالتجربة !!والتجربة خير برهان .
    هذا بالنسبة لكلمة BETWEEN ، أما طريقة استخدام كلمة LIKE في الشرط فهي كالتالي :
    نستخدم كلمة LIKE في الشرط كي تبحث لنا عن جميع البيانات التي تشترك في معيار معين نحدده نحن بواسطة هذه الكلمة ، وصياغة الأمر في هذه الحالة يكون كالتالي :
    SELECT column FROM table

    WHERE column LIKE pattern معيار ;
    الحكمة في استخدام LIKE هي أنه يمكنك أن تبحث بها بواسطة جزء من البيان إن لم تكن تعرف البيان كاملاً ، فلو كنّا نعرفه كاملاً لاستخدمنا علامة المساواة ( = ) مباشرةً ،فمثلاً لو كنا نريد استرجاع سجلات الموظفين الذين تبدأ أسماؤهم بحرف الباء فقط لن نستطيع حصر جميع الأسماء التي تبدأ بحرف الباء لذلك نستخدم LIKE ، أو لو كنا نريد استرجاع سجلات الموظفين الذين يسكنون في مدينة الرياض مثلاً ، من المستحيل أن نحفظ عناوينهم كاملة ، ولكن نستطيع البحث عن سجلاتهم عن طريق استخدام كلمة " الرياض " في الشرط LIKE ، نستخدم مع LIKE علامة النسبة المئوية (%) في مكان الخانات التي لا نعرفها " المفقودة " في المعيار .
    أمثلة 1:.للبحث عن سجلات الموظفين الذين تبدأ أسماؤهم بحرف الباء في جدول الموظفين نستخدم الأمر التالي :
    SELECT * FROM EMPLOYEE

    WHERE FNAME LIKE 'ب%';
    /* وضعنا (%) بعد حرف الباء أي في مكان الخانات المفقودة */
    والنتيجة هي :

    2 للبحث عن سجلات الموظفين الذين ينتهي اسمهم الأول بحرف الدال ، نستخدم الأمر التالي :
    SELECT * FROM EMPLOYEE

    WHERE FNAME LIKE '%د';
    /* وضعنا (%) قبل حرف الدال ، أي في مكان الخانات المفقودة */
    والنتيجة هي :


    3. للبحث عن سجلات الموظفين الذين يسكنون في مدينة الرياض ، نستخدم الأمر التالي :
    SELECT * FROM EMPLOYEE

    WHERE ADDRESS LIKE '%RYADE%';
    /*استخدمنا (%) مرتين في البداية والنهاية لأن العنوان في جدول الموظفين يبدأ برقم المنزل، ثم المدينة ( الرياض )، ثم الدولة*/
    والنتيجة هي :


    4. للبحث عن الموظفين الذين ولدوا في الثمانينات ، نستخدم الأمر التالي:
    SELECT * FROM EMPLOYEE

    WHERE BDATE Like '--8-------';
    /* استخدمنا (-) مكان الخانات المفقودة لأننا نعلم أن حقل تاريخ الميلاد من نوع DATE

    وأن هذا النوع من البيانات يحجز له عشر خانات ،راجع انواع البيانات في الدرس الثاني */
    والنتيجة ستكون :

    ملاحظة هامة :
    في برنامج الآكسس استخدم علامة النجمة * بدلاً من علامة النسبة المئوية % في الشرط LIKE .
    هذا كل شئ بالنسبة للشرط ، أما عندما يكون لدينا أكثر من شرط : في هذه الحالة فإننا نشملها جميعها في WHERE عن طريق وضع الروابط المنطقية بينها مثل : AND, OR كالتالي :
    عند استخدام AND بين الشروط :
    النتيجة تكون عبارة عن جميع السجلات التي تحققت فيها جميع الشروط ، أي أن الشروط التي وضعنا بينها AND لا بد أن تكون جميعها محققة True كي يظهر السجل في النتيجة ، مثال :
    لكي نطلب سجل الموظف المسمى بـ :"محمد علي" نكتب الأمر التالي:
    SELECT * FROM EMPLOYEE

    WHERE FNAME = 'محمد' AND LNAME = 'علي';
    فإن النتيجة التي ستظهر لنا تحتوي فقط على سجلات الموظفين الذين اسمهم " محمد علي "، ولن تظهر سجلات الموظفين الآخرين الذين اسمهم " محمد فلان " أو " فلان علي " ، كالتالي :

    عند استخدام OR بين الشروط :
    النتيجة ستحوي سجلات الموظفين الذين تحققت فيهم أحد الشروط أو جميعها ، يكفي فقط في أي سجل أن يكون شرط واحد محقق كي يظهر السجل في النتيجة ، مثال :
    لكي نطلب سجلات الموظفين الذين اسمهم الأول " محمد " أو اسمهم الأخير " علي " نكتب الأمر التالي :
    SELECT * FROM EMPLOYEE

    WHERE FNAME = 'محمد' OR LNAME = 'علي';
    والنتيجة ستحوي سجلات الموظفين الذين اسمهم الأول " محمد " أو اسمهم الأخير " علي " أو اسمهم كاملاً : " محمد علي " ، ستشملهم النتيجة جميعاً إن شاء الله كالتالي :


    يمكنك كذلك أن تستخدم AND + OR بين الشروط باختلاف اشكالها لاستعلام واحد ، كن حذراً واستخدم الأقواس في ذلك ، مثال :
    SELECT * FROM EMPLOYEE

    WHERE ( FNAME = 'محمد' OR LNAME = 'علي') AND NUMPER BETWEEN 30 AND 50;
    والنتيجة ستكون :



    بهذا نكون انتيهنا من الشروط بجميع أجزاءها واختلاف ألوانها وصيغها ، تعلمنا في الجزء الثاني من الدرس الثالث :
    • استخدام BETWEEN ... AND في الشرط .
    • استخدام LIKE في الشرط .
    • الجمع بين الشروط باستخدام AND .
    • الجمع بين الشروط باستخدام OR .
    • الجمع بين الشروط باستخدام AND + OR واستخدام الأقواس في ذلك .

    وهكذا يكون الدرس الثالث بجزأيه قد انتهي بفضل من الله ..
    ولتلخيص لما درسناه اليوم ، احتفظ بالصورة التالية والتي توضح ترتيب الأوامر عند استخدامها مع SELECT ، جميع الأوامر المكتوبة باللون الأحمر اختيارية ويتم اختيار أحد الأوامر من بين الاقواس لاستخدامه :


    واجب الجزء الثاني :
    أكتب أمر SQL لعرض سجلات الموظفين الذين يشتغلون في القسم رقم "5" و الذين يسكنون في مدينة مكة المكرمة

    بعد أن تعرفنا على أمر Select بحذافيره ومن ثم تعرفنا على الشروط فيه بالتفصيل كذلك ، نأتي لدرس اليوم الرابع وهو درس سهل وممتع جداً .. في جزأه الأول سنتعرف على الدوال الموجودة في لغة الإس كيو إل ، وفي الجزء الثاني سنتطرق إلى أوامر إضافة سجلات جديدة إلى الجداول ، و تحديث سجلات موجودة ، وأخيراً حذف السجلات التي لا نحتاج إليها .. فإلى الجزء الاول :

    دوال الإس كيو إل SQL Functions :
    في لغة السيكيول عدد من الدوال الجاهزة والتي لكل منها وظيفة معينة ، الصيغة العامة لهذه الدوال يوضحها الأمر كالتالي :

    SELECT function(column) FROM table WHERE condition;

    سندرس معاً خمسة دوال بإذن الله ، وهي : ( AVG, SUM, MAX, MIN, COUNT ).

    AVG(column) Function :
    تعيد لنا متوسط قيم الحقل ( العمود ) الذي حددناه لها ، إذا صادفتها سجلات كان فيها هذا الحقل فارغ فإنها ستتجاهلها ، مثال :

    SELECT AVG(HOURS) FROM WORKS_ON WHERE HOURS<20;

    وستعطينا النتيجة = 12.5 .

    SUM(column) Function :
    تعطينا مجموع الكلي لقيم الحقل( العمود ) الذي حددناه لها ، إذا صادفتها سجلات كان فيها هذا الحقل فارغ فإنها ستتجاهلها ، مثال :

    SELECT SUM(HOURS) FROM WORKS_ON;

    وستعطينا النتيجة = 58 .

    MAX(column) Function :
    تعطينا أعلى قيمة للحقل ( العمود ) الذي حددناه لها ، إذا صادفتها سجلات كان فيها هذا الحقل فارغ فإنها ستتجاهلها ، مثال :

    SELECT MAX(HOURS) FROM WORKS_ON;

    ستكون النتيجة = 20.5 .

    MIN(column) Function :
    تعطينا أصغر قيمة للحقل ( العمود ) الذي حددناه لها ، إذا صادفتها سجلات كان فيها هذا الحقل فارغ فإنها ستتجاهلها ، مثال :

    SELECT MIN(HOURS) FROM WORKS_ON;

    ستكون النتيجة = 10 .

    الدالة COUNT :
    هذه الدالة تأخذ ثلاث أشكال :
    1- الشكل الأول:
    COUNT(column)
    تعيد لنا عدد السجلات ( الصفوف ) الموجودة في الجدول ، تقوم بمعرفة العدد عن طريق الحقل ( العمود) الذي حددناه لها وعليه إن صادفتها سجلات كان فيها هذا الحقل فارغ فإنها لن تقوم بعدها بل ستتجاهلها ، مثال :

    SELECT COUNT(PNO) FROM WORKS_ON;

    ستكون النتيجة = 4 ..
    2- الشكل الثاني:
    COUNT(DISTINCT column(s))
    تعيد لنا عدد السجلات ( الصفوف ) الموجودة في الجدول والتي تختلف فيها قيم الحقل ( العمود) الذي حددناه لها ،بمعنى إن تكررت قيمة الحقل فإنها لن تقوم بعد السجل وستتجاهله ، مثال :

    SELECT COUNT(DISTINCT PNO) FROM WORKS_ON;

    ستكون النتيجة هنا = 2 ..
    ملاحظة : هذا الشكل يعمل فقط مع ORACLE and Microsoft SQL server ولا يعمل مع الآكسس !!
    3-الشكل الثالث:
    COUNT(*)
    تعيد لنا عدد السجلات ( الصفوف) في الجدول ، مثال :

    SELECT COUNT(*) FROM WORKS_ON;

    ستكون النتيجة = 4 .

    بهذا يكون الجزء الأول من درس اليوم قد انتهى ، تعلمنا فيه الدوال ( AVG, SUM, MAX, MIN, COUNT )وعملها في الـSQL.
    خذ قسطاً من الراحة وتنفس بعمق ثم انتقل لقراءة الجزء الثاني :)


    واجب الجزء الأول :
    أكتب أوامر SQL التي تعطينا :
    • عدد العمال الذين يعملون 10 ساعات في المشاريع ؟
    • أكبر رقم في أرقام الموظفين ؟
    وصلنا إلى الجزء الثاني من درس اليوم الرابع ولله الحمد .. تعرفنا في الجزء الأول على دوال الإس كيو إل ، سنتطرق الآن إلى أوامر إضافة سجلات جديدة إلى الجداول ، و تحديث سجلات موجودة ، وأخيراً حذف السجلات التي لا نحتاج إليها ..
    إضافة سجل(صف) جديد إلى الجدول عن طريق أمر INSERT INTO :صيغة الأمر :
    INSERT INTO table_name
    VALUES (value1, value2,....);
    هذا إذا كنت تحفظ عدد الحقول ( الأعمدة ) في الجدول ،أما إن لم تكن تعرفها وتريد فقط أن تملأ حقولاً معينة فإنك تستطيع أن نحدد الحقول ( العمدة) التي تريد أن تضيف فيها فقط ، بالطريقة التالية :
    INSERT INTO table_name (column1, column2,...)

    VALUES (value1, value2,....);
    مثال : لإضافة سجل للموظف الجديد " محمد أحمد " في جدول الموظفين ، نكتب الأمر التالي :
    INSERT INTO EMPLOYEE

    VALUES ('MODH','AHMED',55,'30/12/1899','22 MAKKAH,SA',5);
    والنتيجة تظهر لدينا :

    تحديث سجل في الجدول عن طريق أمر Update :
    يتسخدم هذا الأمر تعديل أو تحديث البيانات في الجدول ، صيغته :
    UPDATE table_name

    SET column1_name = new_value
    WHERE column_name = some_value ;
    نحتاج في هذا الأمر إلى اسم الجدول واسم الحقل الذي نريد تعديله ، وشرط يحدد لنا السجل الذي نريد تحديثه !! إذا أردنا تحديث أكثر من حقل في نفس السجل فإننا نكتب أسماء الحقول وقيمها الجديدة ونفصل بينها بالفاصلة (،) ..كالتالي :
    UPDATE table_name

    SET column1_name = new_value , column2_name = new_value
    WHERE column_name = some_value ;
    مثال :
    كلا الأمران التاليان يؤديان نفس الوظيفة ، ونتعلم منهما أن الحقل المستخدم في الشرط من الممكن أن يكو نفس الحقل الذي نريد تحديثه ومن الممكن أن يكون حقلاً آخر :
    UPDATE WORKS_ON

    SET HOURS = 18 ,PNO = 2

    WHERE HOURS =20.5;
    OR
    UPDATE WORKS_ON

    SET HOURS = 18 ,PNO = 2

    WHERE ENUMBER = 11;
    والنتيجة :

    لو كانت الحقول التي حدثناها مفاتيح ، لتحدثت على إثر تحديثها جميع الحقول التي ترتبط بها في الجداول الأخرى !! تذكر ذلك دوماً ..حذف سجل من الجدول عن طريق أمر DELETE :
    يستخدم هذا الأمر لحذف سجل (صف) من أي جدول ، صيغة الأمر :
    DELETE FROM table_name

    WHERE column_name = some_value;
    مثال :لحذف سجل الموظف الذي أضفناه قبل قليل " MOHD AHMED" جرب الأمر التالي :
    DELETE FROM EMPLOYEE

    WHERE FNAME ='MOHD';
    والنتيجة هي حذف هذا السجل ،ستظهر كالتالي في الآكسس :


    ما إذا كنا نريد حذف جميع السجلات وإعادة الجدول خالياً لنملأه من جديد ، فإننا لن نحتاج إلى عبارة الشرط HWERE في الأمر ، وإذا أردنا يمكننا استخدام النجمة :
    DELETE FROM table_name;
    OR
    DELETE * FROM table_name;

    هذا كل شئ في أمر الحذف ، وبذلك يكون الجزء الثاني وبالتالي درس اليوم الرابع في دورتنا الممتعة قد انتهى ولله الحمد .. إذا أحببت أن تطبق كل هذه الاستعلامات في برنامج الآكسس ، شاهد العرض الفلاشي التالي لتتعرف على الطريقة :
    واجب الجزء الثاني :
    اكتب أمر SQL لإضافة مشروع جديد ( سجل ) في جدول المشاريع Project ولك الحرية في اختيار القيم كما تحب :) .
    بعد أن تعرفنا على أوامر السيكيول ودوالها خلال الأربعة أيام الماضية ، وقطعنا شوطاً كبيراً فيها ولله الحمد ، نأتي اليوم إلى نهاية المطاف ، الدرس الخامس والأخير في الدورة ، ولكن الدروس ستستمر بعد الدورة إن شاء الله للتعمق أكثر في اللغة .
    ***درس اليوم هو ربط الجداول وكيفية استخدام هذا الربط في الأوامر وبالتالي استخراج بيانات من أكثر من جدول في قاعدة البيانات .المفاهيم التي تعلمناها في أول أيام الدورة ستفيدنا كثيراً كثيراً بإذن الله :) فهل تذكرون هذا العرض :الربط في السيكيول SQL Join :
    الغرض من ربط الجداول ببعضها هو استخراج البيانات من أكثر من جدول في قاعدة البيانات !! كذلك يستخدم الربط كوسيلة لمنع تكرار القيم في أي حقل من حقول الجداول بصورة مزعجة أحياناً ، فمثلاً حينما يكون للطالب أكثر من مادة وتدرج جميع المواد مع اسم الطالب في نفس الجدول ، ستكون النتيجة وجود عدد كبير من السجلات لنفس الطالب في نفس الجدول ، كل سجل خاص بمادة !! وهذا غير عملي أبداً إذ أنه يؤدي إلى كبر الجدول وبالتالي زيادة المساحة التخزينية له !! لذلك فإننا نقوم بعمل جدولين جدول للطالب بكامل بياناته ( الاسم -الرقم - تاريخ الميلاد -التخصص - المعدل ... ألخ ) وجدول آخر للمواد يحوي أسم المادة وأرقام الطلاب الذين يدرسونها ، ونربط بين الجدولين برقم الطالب بالتأكيد حيث أننا اخترناه مفتاحاً لاستحالة تكراره لأكثر من طالب !!
    ولاستخراج بيانات من جدولين ، نستخدم المفتاح الذي يربط بينهما في الشرط ، كالتالي :
    SELECT Table1.any_column, Table2.any_column

    FROM Table1, Table2

    WHERE Table1.Keycolumn = Table2.foreign_Keycolumn;
    مثال :
    اطبع اسماء الموظفين ورقم القسم الذي يعملون فيه واسم المشروع الذي يعملون عليه ؟ - ملاحظة : هذه البيانات موجودة في جدولين -
    الحل :
    SELECT FNAME , DNUM, PNAME

    FROM EMPLOYEE , PROJECT

    WHERE DNUM = DNO;
    OR
    SELECT EMPLOYEE.FNAME, PROJECT.DNUM, PROJECT.PNAME

    FROM EMPLOYEE, PROJECT

    WHERE PROJECT. DNUM = EMPLOYEE.DNO;
    والنتيجة :

    هذه هي الطريقة الاعتيادية ، بينما يوجد في لغة السيكيول كلمة Join إحدى كلمات اللغة .. ولها عدة أشكال أيضاً :
    الشكل الأول :INNER JOIN:
    هذا النوع من الربط سيعطينا النتائج من الجدولين والتي يتحقق فيها الشرط ، صيغته :
    SELECT field1, field2, field3

    FROM first_table INNER JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield;
    مثال :
    نفس المثال السابق :اطبع اسماء الموظفين ورقم القسم الذي يعملون فيه واسم المشروع الذي يعملون عليه ؟
    الحل :
    SELECT EMPLOYEE.FNAME, PROJECT.DNUM, PROJECT.PNAME

    FROM EMPLOYEE INNER JOIN PROJECT ON EMPLOYEE.DNO = PROJECT.DNUM;
    والنتيجة هي نفسها كما في الصورة السابقة .
    الشكل الثاني : LEFT JOIN:
    هذا النوع من الربط يعطينا جميع السجلات ( الصفوف ) من الجدول الأول ( وهو الجدول الذي ييكتب على يسار كلمة LEFT JOIN في الأمر ) سواء المرتبطة بقيم في الجدول الثاني أو غير المرتبطة ، جميع سجلات الجدول الأول ستظهر في النتائج ، صيغته :
    SELECT field1, field2, field3

    FROM first_table LEFT JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield;
    مثال :
    اطبع قائمة باسماء الموظفين وعدد ساعات عملهم ؟
    الحل :
    SELECT EMPLOYEE.FNAME, WORKS_ON.HOURS

    FROM EMPLOYEE LEFT JOIN WORKS_ON ON EMPLOYEE.NUMBER = WORKS_ON.ENUMBER;
    والنتيجة : ظهر لدينا السجل الذي أضفناه إلى جدول الموظفين في الدرس السابق ، سجل الموظف "MOHD AHMED" بالرغم من أننا لم نحدد له ساعات العمل في جدول العمل ،لذلك خانة الساعات أمام هذا الموظف ظهرت خالية :

    الشكل الثالث : RIGHT JOIN:
    هذا النوع من الربط هو معكوس النوع السابق تماماً ، فهو يعطينا جميع السجلات ( الصفوف ) من الجدول الثاني ( وهو الجدول الذي يأتي على يمين كلمة RIGHT JOIN عند كتابة الأمر ) سواء كانت مرتبطة بقيم في الجدول الأول أو لا ، جميع سجلات الجدول الثاني ستظهر في النتائج ، صيغته :
    SELECT field1, field2, field3

    FROM first_table RIGHT JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield;
    وكمثال عليه :
    سنأخذ نفس المثال السابق ولكن سنغير ترتيب الجداول في FROM وكذلك ترتيب الحقول في SELECT ولا ننسى أن نكتب RIGHT JOIN ، كالتالي :
    SELECT WORKS_ON.HOURS, EMPLOYEE.FNAME

    FROM WORKS_ON RIGHT JOIN EMPLOYEE ON EMPLOYEE.NUMBER = WORKS_ON.ENUMBER;
    والنتيجة هي :


    مثال يوضح ربط ثلاثة جداول ببعضها البعض :
    اطبع اسماء الموظفين ورقم القسم الذي يعمل فيه كل موظف واسم المشروع الذي يعمل عليه وعدد ساعات عمله !
    الحل :
    SELECT EMPLOYEE.FNAME, EMPLOYEE.DNO, PROJECT.PNAME,WORKS_ON.HOURS

    FROM (EMPLOYEE INNER JOIN PROJECT ON EMPLOYEE.DNO = PROJECT.DNUM)
    INNER JOIN WORKS_ON ON (PROJECT.PNUMBER = WORKS_ON.PNO) AND (EMPLOYEE.NUMBER = WORKS_ON.ENUMBER);
    والنتيجة :لا نرى فيها سجل الموظف الجديد " MOHD AHMED" كما توضح الصورة التالية :

    بهذا نكون قد أكملنا دروس دورتنا بفضل من الله .. .
    الواجب :اطبع اسماء جميع الموظفين الذين تتوفر لهم البيانات التالية مع ملاحظة أن هذه البيانات ستظهر في جدول النتائج :( رقم الموظف - رقم القسم الذي يعمل فيه هذا الموظف - اسم المشروع الذي يعمل عليه - عدد ساعات عمله ) ؟
    لا تنسوا أختكم رسيــــس من دعوة صالحة في ظهر الغيب يا أعزائي :) والسلام عليكم ورحمة الله وبركاته ..
    الشروط
    يمكنك أثناء جلب السجلات أن تضع شروطا معينة للسجلات التي تريد الحصول عليها بواسطة العبارة SELECT وذلك باستخدام المقطع WHERE وبعده تضع الشروط التي تريدها، أنظر مثلا : SELECT telephone FROM directory WHERE name='Tim';
    فإن ناتج تنفيذ الاستعلام السابق سيكون كالتالي :
    name='Tim'
    telephone
    1682340
    حيث أن هنالك حقلا واحد فقط يطابق الشرط، والشرط هو أن يكون الاسم name يساوي Tim ولأن كلمة Tim جزء من البيانات المخزنة في قاعدة البيانات فإننا نحيطها بعلامات الاقتباس المفردة، لاحظ أيضا أن البرنامج لن يعيد الاسم أيضا ضمن النتائج وذلك لأننا لم نطلب الاسم في عبارتنا، ويمكننا الحصول على الاسم أيضا باستخدام هذه العبارة : SELECT telephone, name FROM directory WHERE name='Tim';
    كما تلاحظ فإن عبارة SELECT من بدايتها وحتى ما قبل كلمة WHERE تعمل كما شرحنا في السابق بالضبط.
    الجزء الذي يهمنا الآن في العبارة هو الجزء الذي يأتي بعد الكلمة WHERE أو ما يسمى بالشرط condition، تتكون عبارة الشرط الواحدة من ثلاثة أجزاء، الجزء الأول هو الطرف الأيسر من العبارة والجزء الثاني هو الطرف الأيمن من العبارة والجزء الثالث هو المعامل الذي يقع بين الطرفين، والمعامل في مثالنا السابق هو علامة المساواة ( = ) حيث أن شرطنا هو أن يكون الطرف الأيمن يساوي الطرف الأيسر حتى يتحقق الشرط :
    leftside operator rightside
    name = 'Tim'
    والعوامل المستخدمة في الشروط مختلفة، أهما ما يلي :
    معاملات الاختبار في SQL
    المعامل اسمه
    = يساوي
    > أكبر من
    < أصغر من
    <= أكبر من أو يساوي
    >= أصغر من أو يساوي
    <> لا يساوي
    LIKE يشبه
    العامل الأول هو عامل المساواة وهو يتحقق عندما يكون الطرف الأيمن والأيسر متساويان، كما رأينا في المثال السابق، العوامل التالية تبدو واضحة وهي > ويتحقق عندما يكون الطرف الأيسر أكبر من الطرف الأيمن، < ويتحقق عندما يكون الطرف الأيمن أصغر من الطرف الأيسر، وبعدها أكبر من أو يساوي ثم أصغر من أو يساوي.
    أما المعامل السادس <> فيعني لا يساوي ويتحقق الشرط فيه عندما يكون الطرف الأيمن لا يساوي الطرف الأيسر.
    قد تبدو مقارنة النصوص باستخدام العوامل < و > غريبة نوعا ما، فكيف نقول مثلا بأن 'Tim' < 'Jim' ؟ الأمر في غاية البساطة، كل ما عليك فعله هو أن تتخيل بأنك تريد أن ترتب هذا الجدول تنازليا فهذا يعني بأن القيم العليا تكون فوق والقيم الدنيا تكون في أسفل الترتيب، ولهذا فإن 'z' > 'a' تعتبر عبارة صحيحة.
    العامل الأخير من عوامل المقارنه هو العامل LIKE ( يشبه ) وهو يستخدم لمقارنة النصوص عادة، ويتحقق الشرط فيه عندما يكون الطرف الأيمن يشبه الطرف الأيسر، ويكتب طرفها الأيمن في صورة نص يحتوي على علامات النسبة المؤوية ( % ) وهي تعني ( أي شيء ) بمعني أنك إذا قلت : SELECT name,telephone FROM directory WHERE name LIKE '%m';
    فهذا يعني بأن الاسم يجب أن يكون ( أي شيء ) ثم الحرف 'm'، أو بمعنى آخر سيكون الشرط متحققا في السجلات التي ينتهي الاسم فيها بالحرف 'm'، وإذا كتبنا : SELECT name,telephone FROM directory WHERE name LIKE 'm%';
    فهذا يعني m ثم ( أي شيء ) أي أنها تطابق حقول name التي تبدأ بالحرف m، حسنا ماذا لو قلنا : SELECT name,telephone FROM directory WHERE name LIKE '%m%';
    أما هذه فتعني ( أي شيء ) ثم الحرف m ثم ( أي شيء ) أي أنها ستطابق جميع السجلات التي يحتوي الحقل name فيها على الحرف m.
    يمكنك أن تقيس على ذلك الكثير من الأمور، فيمكنك أن تبحث في قاعدة البيانات عن حقل يبدأ بكلمة 'this' وبعدها بعدة أحرف أو كلمات أو ( أي شيء ) تأتي كلمة 'one' فتكتب هكذا : text LIKE 'this%one%'
    دعنا نجرب تطبيق هذا الاستعلام على قاعدة البيانات التي نعمل عليها : SELECT name,telephone FROM directory WHERE name LIKE '%m';
    فإن النتائج ستكون كالتالي :
    name LIKE '%m'
    Name Telephone
    Tim 1682340
    Jim 2462466
    استخدام أكثر من شرط
    يمكنك استخدام أكثر من شرط واحد عن جلب سجلات بياناتك، فيمكنك مثلا أن تبحث عن جميع الحقول التي يبدأ اسم صاحبها بالحرف J والحرف D، أو ربما تريد البحث عن جميع الأشخاص الذين تاريخ ميلادهم أكبر من 1 يناير 2000 وأصغر من 5 فبراير 2000 وهكذا أمور، يمكنك أن تربط بين الشروط باستخدام أداتين مختلفتين للربط هما AND و OR، وهاتان الأداتان تساويان && و || على التوالي في بعض لغات البرمجة.
    الأداة الأولى ومن اسمها AND ( و ) تجعل السجل محققا للشرط عندما يتحقق الشرط الذي على يمينها والشرط الذي على يسارها معا، فمثلا عندما نقول :
    SELECT name,telephone FROM directory WHERE
    name LIKE '%m' AND telephone > 20000000;
    ويعني ذلك بأن السجلات الوحيدة التي سيتم عرضها هي التي يتحقق فيها كل من الشرطان معا، فتكون name تنتهي بالحرف m ورقم الهاتف أكبر من 20000000، فهي تعيد السجل الوحيد الذي يحقق الشرطان كالتالي :
    name LIKE '%m' AND telephone > 20000000
    Name Telephone
    Jim 2462466
    أما OR ( أو ) فيكفي لتحققها أن يتحقق أحد الشرطان فقط، فإذا قلنا :
    SELECT name,telephone FROM directory WHERE
    name LIKE '%m' OR telephone > 20000000;
    فإن جميع الحقول التي ينتهي فيها الحقل name بالحرف m بالإضافة إلى جميع الحقول التي يكون فيها الحقل telephone أكبر من 20000000، أي أنها تعيد جميع الحقول التي تحقق الشرط الأول، وجميع الحقول التي تحقق الشرط الثاني وجميع الحقول التي تحقق الشرطان معا، ولذلك فإن ناتج تنفيذ العبارة هو ثلاثة سجلات كالتالي :
    name LIKE '%m' OR telephone > 20000000
    Name Telephone
    Jim 2462466
    Tim 1682340
    Dill 3636778
    كما تلاحظ، السجل الأول Tim كان من ضمن السجلات التي حققت الشرطان معا فكان من ضمن جدول النتائج، أما السجل الثاني Jim فلم يحقق الشرط الثاني وكان الحقل telephone فيه أقل من 20000000 إلا أنه كان من ضمن جدول النتائج لأنه حقق الشرط الأول وهذا كاف، والسجل الثالث Dill حقق الشرط الثاني ولم يحقق الأول حيث أنه لا ينتهي بالحرف m.
    استخدام OR و AND معا
    يمكنك ربط أكثر من شرط باستخدام أكثر من أداة ربط ولأكثر من مرة، فيمكنك أن تقول مثلا :
    SELECT name,telephone FROM directory WHERE
    telephone > 20000000 OR telephone = 30000000 AND name LIKE '%m';
    العبارة السابقة تنطوي على حيلة ما، قد يبدو لك في الوهلة الأولى أن العبارة تقوم بمطابقة جميع السجلات التي يكون الحقل name فيها ينتهي بالحرف m وفي نفس الوقت يكون رقم الهاتف فيها أكبر من 20000000 أو يكون يساوي 30000000، ولكن الواقع يختلف عن ذلك، عندما يكون هنالك أكثر من أداة ربط، ويكون هنالك أكثر من شرطين، فإن برنامج قاعدة البيانات سيقوم بتنفيذ أداة الربط AND أولا حسب ترتيبها بالجملة، وبعد ذلك يقوم بربط الجمل التي تستخدم الأداة OR.
    يعني ذلك بأنه في العبارة السابقة الأداة AND تربط شرطان هما telephone = 30000000 و name LIKE '%m' أما الأداة OR فتربط شرطان هما telephone > 20000000 و telephone = 30000000 AND name LIKE '%m'، ونقول هنا بأن AND لها أولوية التنفيذ حيث قامت بربط الشروط التي على جانبيها، وأصبح شرطا واحدا وبعد ذلك يبدأ عمل الأداة OR في ربط الشروط التي على جانبيها واللذان كانا الشرط الكبير الناتج من ربط الأداة AND للشرطان الصغيران، بالإضافة إلى الشرط الآخر الذي على شمالها.
    ماذا لو أردنا الآن أن نجبر برنامج قاعدة البيانات على تنفيذ الشرط OR أولا ؟ لعمل ذلك نقوم بإحاطة الشرطان اللذان على جانبا الأداة OR بالأقواس، فتصبح العبارة هكذا :
    SELECT name,telephone FROM directory WHERE
    (telephone > 20000000 OR telephone = 30000000) AND name LIKE '%m';
    لأن الأقواس لها أولوية أعلى في التنفيذ من العبارة OR ( الأقواس لها أعلى أولوية على الإطلاق )، فإن البرنامج يقوم بتنفيذ ما بداخل الأقواس أولا، وفي داخل الأقواس سيجد شرطان مربوطان بالأداة OR فيقوم بربطهما وينتج شرط واحد كبير، وبعد ذلك يأتي دور العبارة AND فترتبط الشرط الكبير الذي بداخل الأقواس مع الشرط الذي يأتي على يمينها وهو name LIKE '%m'.
    لاحظ أن الجزء الذي أتى بعد العبارة OR داخل الأقواس غير ضروري أبدا لأن الشرط سيتحقق دائما إذا كان الرقم يساوي 30000000 حتى لو لم نطلب منه ذلك تحديدا، حيث أن الشرط الذي على يسار العبارة يكفي لذلك ( تذكر بأن 30000000 أكبر دائما من 20000000 )، ولكننا أوردناها هنا كمثال فقط.
    النفي بالعبارة NOT
    تقوم العبارة NOT بنفي الشرط الذي يأتي بعدها، فتصبح العبارة صحيحة إذا كانت خاطئة وتصبح خاطئة إذا كانت صحيحة، مثلا العبارة التالية : SELECT name,telephone FROM directory WHERE NOT name = 'Tim';
    ستعيد جميع السجلات التي لا يكون فيها الحقل name يساوي Tim وهكذا، ويمكن استخدامها في تراكيب أكثر تعقيدا مع الأداتان AND و OR والأقواس.
    في المرة القادمة ..
    إلى هنا نكون قد عرفنا أساسيات العبارة SELECT وكيفية اختيار السجلات من جداول قواعد البيانات، وكيفية وضع الشروط وربط أكثر من شرط ونفي الشروط، في الجزء القادم من الدورة سنتعلم المزيد عن كيفية إنشاء الجداول وملئها بالحقول وكيفية تعديل الحقول، إذا كانت لديك أية اقتراحات أو مشاركات في هذه السلسلة من الدورات أو أي موضوع آخر يتعلق بالكمبيوتر فيمكنك الإتصال بنا للتنسيق لنشره بالموقع ليستفيد منه الجميع.
    لغة SQL
    لا بد أنك قد لاحظت الآن أن هنالك الكثير من العمليات التي تستطيع قاعدة البيانات أدائها، فيمكنها أن تنشأ سجلا أو تحذف سجلات أو تعدل سجلا أو تغير جدولا أو تحذف جدولا وغيرها الكثير، هذه العمليات تجرى بواسطة لغة SQL وهي اختصار لعبارة Structured Query Language أي لغة الاستعلامات البنيوية، تسمى كل عملية تنفذ عن طريق لغة SQL بالاستعلام Query، وعلى حسب لغة البرمجة التي تستخدمها وبرنامج قواعد البيانات الذي تستخدمه فإن الاستعلامات ترسل وتنفذ بطرق مختلفة وكيفية الحصول على نتائج الاستعلام تختلف أيضا، في هذه الدورة لن يهمنا كيف تقوم بإرسال الإستعلام إلى قاعدة البيانات وتنفذه وتحصل على نتائجه، ولكن ما سنتحدث عنه هو كيفية كتابة الاستعلام نفسه، لغة SQL شبه متفق عليها بين جميع نظم قواعد البيانات، على سبيل المثال في موقعنا نستخدم لغة البرمجة PHP للوصول إلى مزود قاعدة البيانات MySQL، وهي من التوليفات الشهيرة، ومنها أيضا استخدام برنامج Visual Basic للوصول إلى مزود قاعدة بيانات Microsoft SQL Server لعمل البرامج التي تتطلب وصولا إلى بيانات مركزية كما في المحلات والأسواق والمخازن والمستشفيات وغيرها، ويمكن استخدام لغة SQL أيضا عن طريق البرامج المكتوبة بلغة C و C++ و Perl و Delphi للوصول إلى بيانات مخزنة في قواعد بيانات Oracle و Sybase و Informix و IBM/DB2 و Access وغيرها.
    مزودات قواعد البيانات
    من الطرق الشهيرة لتخزين قواعد البيانات هي وضعها في صورة ملفات نصية بسيطة Plain Text، بحيث يوضع كل سجل في سطر من أسطر الملف ويفصل بين الحقول المختلفة في كل سجل بفاصلة comma ( , )، وتكون أحيانا في صورة ملفات أكثر تعقيدا بحيث يحتوي الملف على الكثير من الجدوال والفهارس التي تسرع عمليات البحث في قواعد البيانات والاستعلامات الجاهزة والنماذج كما في قواعد بيانات Microsoft Access.
    هذه الطريقة قد تعتبر جيدة في البرامج البسيطة ولكن في بيئات الشبكات المعقدة والبرامج التي تحتاج وصولا مشتركا إلى البيانات تصبح هذه الفكرة صعبة التطبيق حيث أن ملف البيانات يكون في جهاز المزود، ويتم الوصول إليه عبر الشبكة من قبل الزبون، وفي حالة الملفات الثابته يجب أن يتم نقل ملف البيانات بأكمله عبر الشبكة حتى يصل إلى الزبون الذي يأخذ المعلومات منه وإذا قام الزبون بتغيير أي من المعلومات فإن المزود يجب أن ينتظر حتى يقوم الزبون بإعادة الملف بعد عمل التغييرات عليه، وهذا أمر يستغرق الكثير من الوقت خاصة إذا كان حجم الملف كبيرا وكانت الشبكة بطيئة، وكذلك إذا أراد أكثر من شخص الوصول إلى البيانات في نفس الوقت وتغييرها في نفس الوقت سيؤدي ذلك إلى عطب البيانات وحدوث خلل فيها، لهذا فإن المزود يقوم بإعطاء الملف لمن يطلبه أولا ويقوم بقفل الملف بحيث يجب على كل من يطلب الملف بعد ذلك أن ينتظهر حتى ينتهي هذا الشخص من الملف، وبعدها الذي يليه وهكذا، وهو أمر غير معقول أبدا!
    الحل لهذه المشكلة كان بعمل ما يسمى بمزود SQL، يقوم مزود SQL باستقبال جميع الأوامر والطلبات في صورة استعلامات SQL ثم يقوم بتنفيذ هذه العمليات على المزود ويرسل نتيجة التنفيذ فقط إلى الزبون دون الحاجة إلى إرسال قاعدة البيانات بأكملها، فإذا أردت أن تحصل على حقل واحد فقط من أحد السجلات في أحد الجداول في قاعدة البيانات فإن الجزء الذي سيتم إرساله عبر الشبكة هو الطلب في صورة SQL والجزء الذي سيتم إعادته عبر الشبكة هو هذا الحقل فقط والذي قد لا يصل في حجمه إلى 10 بايتات مثلا إذا كان مكونه من 10 أحرف، مقارنة مع عملية إرسال قاعدة البيانات بأكملها والتي قد يصل حجمها إلى العديد من الميجابايتات وربما الجيجابايتات في بعض الأحيان، إضافة إلى ذلك فإن مزود SQL يقوم يقوم بتوزيع الأعباء على الطلبات بشكل رائع عندما يكون هنالك أكثر من طلب في نفس الوقت.
    العبارة -:SELECTيمكنك الحصول على البيانات في صورة سجلات باستخدام لغة SQL وذلك عن طريق العبارة SELECT والتي تأخذ الشكل العام التالي : SELECT fields FROM tables
    حيث أن fields هي أسماء الحقول وtables هي أسماء الجداول التي نريد أن نحصل على الحقول منها، فإذا كان لدينا الجدول التالي في قاعدة البيانات على سبيل المثال :
    Directory Table
    Name Telephone
    John 1291233
    Tim 1682340
    Jim 2462466
    Dill 3636778
    إذا أردنا أن نحصل على الحقلين Name و Telephone في الجدول السابق فإن العبارة التي سنستخدمها هي : SELECT name,telephone FROM directory;
    والعبارة السابقة تعيد الجدول كما هو في الأعلى بالضبط، ولكن ماذا لو كتبنا كلمة telephone قبل كلمة name في عبارة SQL السابقة فتصبح كالتالي : SELECT telephone,name FROM directory;
    عند تنفيذ العبارة السابقة سنحصل على الجدول التالي :
    telephone,name
    Telephone Name
    1291233 John
    1682340 Tim
    2462466 Jim
    3636778 Dill
    أما إذا كتبنا العبارة كالتالي : SELECT name,telephone,name FROM directory;
    فسنحصل على النتيجة التالية :
    name,telephone,name
    Name Telephone Name
    John 1291233 John
    Tim 1682340 Tim
    Jim 2462466 Jim
    Dill 3636778 Dill
    وماذا لو قمنا بتنفيذ العبارة التالية : SELECT name FROM directory;
    فالناتج سيكون كالتالي :

    name
    Name
    John
    Tim
    Jim
    Dill
    كما تلاحظ ليست هنالك أية قواعد ثابته، فلا يمكنك أن تقول بأن الحقل name هو الحقل الأول في الجدول، أنت من يحدد الآن ما هو الحقل الأول وما هو الحقل الثاني وهكذا.
    قد تحتاج في بعض الأحيان أن تعرض جميع الحقول في الجدول، فيمكنك استخدام علامة النجمة ( * ) في مكان الحقول للحصول على جميع الحقول التي في الجدول، فاستخدام العبارة التالية سيعيد الجدول بأكمله كما كتبناه أول مرة : SELECT * FROM directory;
    قواعد اللغة -:عند كتابتك لاستعلامات SQL يجب أن تتذكر الأمور التالية دائما :
    • لغة SQL لا تفرق بين الحروف الكبيرة والصغيرة فلا فرق بين كتابة الكلمة SELECT والكلمة select والكلمة SeLeCt وكلها تعامل بنفس الطريقة، قد تكون هنالك بعض الاستثناءات في أسماء الجداول أو الحقول، يجب أن تراجع دليل الاستخدام المرفق مع برنامج قاعدة البيانات الذي تستخدمه للتأكد من ذلك.
    • المسافات البيضاء ليس لها اعتبار في لغة SQL، فيمكنك وضع أي قدر تريد من المسافات البيضاء لتنسيق استعلاماتك، فيمكنك مثلا أن تكتب الاستعلام في الصورة التالية، ولا توجد أية مشكلة في ذلك :
    • SELECT *
    • FROM directory;
    • تنتهي جميع الاستعلامات بالفاصلة المنقوطة ( ; ).
    • العبارات النصية التي لا تعتبر جزءا من عبارات الاستعلامات توضع بين قوسي اقتباس مفردين ويتيح بعض برامج قواعد البيانات استخدام أقواس الاقتباس المزودجة أيضا ( " .. " ).
    • إذا كنت تريد استخدام علامات الاقتباس كجزء من النص الذي تريد إدخاله إلى قاعدة البيانات فإنك تضع قبلها علامة الشرطة الخلفية لتصبح هكذا ( \' ) أو في بعض برامج قواعد البيانات فيتم ذلك بمضاعفة علامة الاقتباس ( '' )، فمثلا إذا أردت وضع العبارة التالية في قاعدة البيانات : I'm me
    فإنك تكتبها في أحد الصور التالية حسب برنامج قاعدة البيانات الذي تستخدمه :
    'I\'m me'
    'I''m me'
    العبارة SELECTيمكنك الحصول على البيانات في صورة سجلات باستخدام لغة SQL وذلك عن طريق العبارة SELECT والتي تأخذ الشكل العام التالي : SELECT fields FROM tables;
    حيث أن fields هي أسماء الحقول وtables هي أسماء الجداول التي نريد أن نحصل على الحقول منها، فإذا كان لدينا الجدول التالي في قاعدة البيانات على سبيل المثال :
    Directory Table
    Name Telephone
    John 1291233
    Tim 1682340
    Jim 2462466
    Dill 3636778
    إذا أردنا أن نحصل على الحقلين Name و Telephone في الجدول السابق فإن العبارة التي سنستخدمها هي : SELECT name,telephone FROM directory;
    والعبارة السابقة تعيد الجدول كما هو في الأعلى بالضبط، ولكن ماذا لو كتبنا كلمة telephone قبل كلمة name في عبارة SQL السابقة فتصبح كالتالي : SELECT telephone,name FROM directory;
    عند تنفيذ العبارة السابقة سنحصل على الجدول التالي :
    telephone,name
    Telephone Name
    1291233 John
    1682340 Tim
    2462466 Jim
    3636778 Dill
    أما إذا كتبنا العبارة كالتالي : SELECT name,telephone,name FROM directory;
    فسنحصل على النتيجة التالية :
    name,telephone,name
    Name Telephone Name
    John 1291233 John
    Tim 1682340 Tim
    Jim 2462466 Jim
    Dill 3636778 Dill
    وماذا لو قمنا بتنفيذ العبارة التالية : SELECT name FROM directory;
    فالناتج سيكون كالتالي :

    name
    Name
    John
    Tim
    Jim
    Dill
    كما تلاحظ ليست هنالك أية قواعد ثابته، فلا يمكنك أن تقول بأن الحقل name هو الحقل الأول في الجدول، أنت من يحدد الآن ما هو الحقل الأول وما هو الحقل الثاني وهكذا.
    قد تحتاج في بعض الأحيان أن تعرض جميع الحقول في الجدول، فيمكنك استخدام علامة النجمة ( * ) في مكان الحقول للحصول على جميع الحقول التي في الجدول، فاستخدام العبارة التالية سيعيد الجدول بأكمله كما كتبناه أول مرة : SELECT * FROM directory;
    قواعد اللغة
    عند كتابتك لاستعلامات SQL يجب أن تتذكر الأمور التالية دائما :
    • لغة SQL لا تفرق بين الحروف الكبيرة والصغيرة فلا فرق بين كتابة الكلمة SELECT والكلمة select والكلمة SeLeCt وكلها تعامل بنفس الطريقة، قد تكون هنالك بعض الاستثناءات في أسماء الجداول أو الحقول، يجب أن تراجع دليل الاستخدام المرفق مع برنامج قاعدة البيانات الذي تستخدمه للتأكد من ذلك.
    • المسافات البيضاء ليس لها اعتبار في لغة SQL، فيمكنك وضع أي قدر تريد من المسافات البيضاء لتنسيق استعلاماتك، فيمكنك مثلا أن تكتب الاستعلام في الصورة التالية، ولا توجد أية مشكلة في ذلك :
    • SELECT *
    • FROM directory;
    • تنتهي جميع الاستعلامات بالفاصلة المنقوطة ( ; ).
    • العبارات النصية التي لا تعتبر جزءا من عبارات الاستعلامات توضع بين قوسي اقتباس مفردين ويتيح بعض برامج قواعد البيانات استخدام أقواس الاقتباس المزودجة أيضا ( " .. " ).
    • إذا كنت تريد استخدام علامات الاقتباس كجزء من النص الذي تريد إدخاله إلى قاعدة البيانات فإنك تضع قبلها علامة الشرطة الخلفية لتصبح هكذا ( \' ) أو في بعض برامج قواعد البيانات فيتم ذلك بمضاعفة علامة الاقتباس ( '' )، فمثلا إذا أردت وضع العبارة التالية في قاعدة البيانات : I'm me
    فإنك تكتبها في أحد الصور التالية حسب برنامج قاعدة البيانات الذي تستخدمه :
    'I\'m me'
    'I''m me'

    اخيرا تقبلوا تحيات اخوكم/ ابـــــ البراءـــــــــــو
     
  2.   مشاركة رقم : 2    ‏2004-04-11
  3. نسراليمن

    نسراليمن عضو متميّز

    التسجيل :
    ‏2003-09-30
    المشاركات:
    1,233
    الإعجاب :
    0
    مشكور اخي ,,
    بس الموضوع طويل , لو كنت عملته علي شكل دروس كان افضل
    وشكرا لك مره ثانيه ,,
     
  4.   مشاركة رقم : 3    ‏2004-04-11
  5. ابوالبراء

    ابوالبراء عضو

    التسجيل :
    ‏2004-04-08
    المشاركات:
    52
    الإعجاب :
    0
    الرجاء المعذرة اخي نسر اليمن لاني لازلت مبتدئ وفعلا لو كانت على شكل دروس افضل مرة اخرى مشكور اخي على مرورك
     
  6.   مشاركة رقم : 4    ‏2004-04-13
  7. ثمرة العلم

    ثمرة العلم عضو

    التسجيل :
    ‏2004-04-12
    المشاركات:
    5
    الإعجاب :
    0
    [color=FF0066] السلام عليكم ورحمة الله وبركاته

    أخي البراء موضوعك الذي عرضتة حول SQL موضوع رائع جداً جداُ,
    وانا ايضاً أقوم بداسة هدة المادة ولذلك أرجو أن نتعاون على نشر هدة المادة على المنتدى نظراًلاهميتها وجزاك الله خيرا مرة أخرى.[/color]
     
  8.   مشاركة رقم : 5    ‏2004-04-13
  9. ثمرة العلم

    ثمرة العلم عضو

    التسجيل :
    ‏2004-04-12
    المشاركات:
    5
    الإعجاب :
    0
    SQL

    السلام عليكم ورحمة الله وبركاته

    أخي البراء موضوعك الذي عرضتة حول SQL موضوع رائع جداً جداُ,
    وانا ايضاً أقوم بداسة هدة المادة ولذلك أرجو أن نتعاون على نشر هدة المادة على المنتدى نظراًلاهميتها وجزاك الله خيرا مرة أخرى.
     
  10.   مشاركة رقم : 6    ‏2004-04-13
  11. ابوالبراء

    ابوالبراء عضو

    التسجيل :
    ‏2004-04-08
    المشاركات:
    52
    الإعجاب :
    0
    Re: SQL

    شكرا لمرورك على الموضوع وكما قلت التعاون معا ان شاء الله لتعم الفائدة
     

مشاركة هذه الصفحة