Lesson5-Part1

Lesson5-Part1

Beginning with SQL

إبـــــــــــــــــــــــــــــــــدأ مع SQL

 

بسـم الله والصلاة والسلام على رسول الله,

حان الوقت للعب بأوامر SQL, ولكن قبل أن نبدأ بحديثنا ولقائاتنا الشيقة معها, دعني أوضح لك شيئاً عن تلك اللغة الرقيقة. يتبين من إسـم تلك اللغة (SQL: Structured Query Language) أنها لغة إستعلام توفر إمكانية الحصول على بيانات من قاعدة مُحددة فحسب.

ولكنها فى الحقيقة على العكس تماماً, حيث أن أوامر وجمل SQL تنقسم إلى قسمين فقط يحتوي كل منهم على ثلاثة فروع, وهي كالتالي:

القسـم الأول ويُمكنك تسميته بـ Section Basic أو القسم الأساسي (تلك تسمية شخصية!) ويحتوي على الفروع التالية:

Data Definition Language (DDL)

Data Manipulation Language (DML)

Data Query Language (DQL)

القسم الثاني ويُمكنك تسميته بـ Control Section أو قسم التحكم (تسمية شخصية أيضاً) ويحتوي على الفروع التالية:

Data Control Language (DCL)

Data Administration Commands

Transactional Control Commands

قبل أن أبدأ بشرح المصطلحات السابقة دعني أعترف لك بشئ وهو أن فكرة تقسيم الستة أجزاء الخاصة بلغة SQL المذكورة أعلاه هي فكرة شخصية ليس أكثر. حيث أنني وجدت تلك الفكرة تُعطي أكثر تنظيماً وقابلية للإستيعاب بشكل متدرج –كرأي شخصي- عموما لن نختلف مادام سينتهي بك الحال بإذن الله بفهمهم جميعاً, وسـوف نبدأ بالقسم الأول وهو القسم الأهم بالنسبة لك ولي وهو الأكثر إستخداماً أيضاً, هيـا.

1 – القسم الأول (Basic Section):

لقد قمت بتسمية ذلك القسم بـ Basic Section حيث أنه يحتوي على أهم وأشهر وأكثر أوامر SQL إستخداماً وذكرت ثلاثة فروع تابعة لذلك القسم وهي كالتالي:

أ – لغة تعريف البيانات (Data Definition Language (DDL)):

يختص هذا الفرع من لغة SQL بـالتحكم والتعامل مع الكائنات الأساسية لقواعد البيانات من إنشاء وتعديل وحذف, ويحتوي على ثمانية أوامر أساسية فقط كل منهم له طريقة تركيبه ليعمل بشكل صحيح, وهي كالتالي:



CREATE TABLE –إنشـاء وحدة (جدول)-

ALTER TABLE  --تعديل وحــــــــدة

DROP TABLE   --حــــــذف وحــــدة

CREATE INDEX –-إنشـاء حقل

ALTER INDEX  -تعديل حقل-

DROP INDEX   --حــذف حقل

CREATE VIEW  -إنشـاء جدول إستعـلام-

حــذف جدول إستعــلام--DROP VIEW

ب- لغة التعامل مع –أو التلاعب بـ- البيانات (Data Manipulation Language (DML)):

يشمل هذا الفرع جميع العمليات التي يُمكن أن تُجرى على بيانات كائنات قواعد البيانات من إنشاء وتعديل وحذف وكذلك كل منهم له طريقة تركيبة داخل SQL, ويحتوي على ثلاثة أوامر أساسية فقط وهي:



INSERT –-إدخــال

UPDATE –تعديــل-

DELETE –حــذف-

جـ - لغة إستعلامات البيانات (Data Query Language (DQL)):

أهم فرع فى فروع البيانات حيث انه المُتخصص والمسؤال الأول عن توفير المعلومات من قواعد البيانات ويحتوي على أمر أساسي واحد ويُعد أكثر أوامر SQL إستخداماً ألا وهو:


إختـيار أو إحضـار (حبيب الملايين)–SELECT

أ – لغة تعريف البيانات (Data Definition Language (DDL)):

1 – الأمر CREATE TABLE:

يتكون هذا الأمر من إثنين من الكلمات المحجوزة (Keywords) للغة SQL –الكلمات المحجوزة هي الكلمات الخاصة بلغة SQL, وسُميت بمحجوزة حيث أنه لا يُمكنك إستخدامها (تقريباً!) لتسمية كائن مُعين داخل قواعد البيانات وذلك لأن SQL Complier أو مُترجم لغة SQL المتواجد داخل المُحرك (Engine) يعتمد على  تلك الكلمات حتى يستوعب منك الأمر الذي تُريد تنفيذه- تعني الكلمة الأولى “إنشاء” والثانية “وحدة أو جدول” على التوالي وكما يتبين لك من المعنى أن ذلك الأمر خاص بإنشـاء الجداول داخل قواعد البيانات, ولكن له طريقة أو صيغة تركيب مُعينة حتى يعمل بشكل صحيح وهي كالتالي:



CREATE TABLE [YourTableName]([Field1] DataType(length), [Field2] DataType(length),....)

كما ترى, يأتي الأمر فى بداية الجملة ويعقبه إسم الجدول المُراد إنشائه ثم إثنين من الأقواس (Parenthesis) تحمل داخلها جميع الحقول المُراد إنشاءها داخل الجدول وكذلك أنواع البيانات الخاصة بكل منهم والطول المُراد تحديده لقيم تلك الحقل.

بالمثـال يتضح المقال, لنقوم الأن بكتابة أولى أوامر SQL لإنشاء جدول بإسم “Numbers” يحتوي على حقل واحد فقط –أقل نسبة للحقول داخل الجدول, حيث لا يُمكنك أبدأ إنشاء جدول بدون حقول- بإسم “numValue” ومن نوع “رقم” وليكن الغاية منه تسجيل الأعداد (….1,2,3) حتى يُمكننا العودة إليه فى حالة نسيان ترتيب عدد داخل سلسلة الأعداد المنطقية!.

دعنا ننظر لصيغة تركيب الأمر السابقة ونحللها إلى أمرنا الحالي…… بعدها ستجد التركيب الصحيح للأمر كالتالي:



CREATE TABLE Numbers(numValue BIGINT)

إنتهت الجملة!

ملحوظة

نوع البيانات المُحدد فى جملة SQL (SQL Statement) السابقة (BIGINT) هو أحد الـ Data Types الخاصة بنظـام Ms-SQL Server وإذا كُنت تعمل على أي من أنظمة إدراة قواعد البيانات الأخرى فاستبدل ذلك النوع بالمقابل له داخل النظام الذي تستخدم, وبنفس الطريقة على أي من الجمل التي سوف نقوم بكتابتها معاً خلال تلك الدروس.

الجملة السابقة يُمكنها وبكامل ثقتها بذاتها أن تقوم بإنشاء جدول جديد لك بإسم “Numbers” ويحتوي على حقل واحد فقط بإسم “numValue” ونوع بياناته “رقم”.

إذا كنت قد دققت النظر فى الصيغة الخاصة بالأمر CREATE TABLE لكنت قد لاحظت شئ مقارنةً بالجملة التى قُمنا بكتابته معاً!

الطول(Length)… نعم. لو لاحظت فى الصيغة ستجد أنه يعقب نوع البيانات (Data Type) إثنين من الأقواس (Parenthesis) من المفترض أن تحمل داخلها الطول المُحدد للحقل, ولكننا لم نقم بتحديد طول الحقل “numValue” داخل الجملة السابقة, ما السبب؟

-أولاً تحديد الطول للحقول إختياري (Optional) داخل لغة SQL حيث أنك إذا لم تقم بتحديد طول الحقل سوف يقوم المُحرر بإعتماد الطول الإفتراضي لذلك النوع المُحدد ولكن يُفضل دائماً أن تتحرى الدقة فى تحديدك لأطوال الحقول حتى لا تُعطي حقلاً طولاً أكثر مما يحتاج وما ترتب على ذلك من فقدان لمساحة قاعدة البيانات دون أي فائدة ووجه حق. ولكن فى الحقيقة ليس ذلك السبب فى عدم تحديدنا للطول فى الأمر السابق ولكن السبب أنه البيانات من نوع “رقم” لا يُمكن تحديد الطول الخاص بها وذلك لأن الأعداد بالمنطق لا تُقاس بالطول ولكن تُقاس بالقيمة. فإذا حاولت مثلا أن تقول:



CREATE TABLE Numbers(numValue BIGINT(10))

لن يعترض مُحرر لغة SQL على ما قمت بكتابته حيث أنك وضعتها فى صيغة صحيحة فعلاً تُرضيه, ولكنه سيعترض وقت التنفيذ ولن يقم بتنفيذ الجملة حيث أنك حددت طولاً لبيانات من نوع “رقم”. إذن تفوز جملتنا الأول بالصحة و التنفيذ.

هُناك شيئاً أخر نلاحظه أيضاً بمقارنة بصيغة الأمر CREATE TABLE مع الجملة التي قُمنا بكتابتها معاً وهو وجود الأقواس المُربعة [] (Right-Left Square Brackets) فى بداية ونهاية إسماء الحقول والجداول مع العلم أننا لم نستخدمها داخل جملتنا السابقة, لمـــا يا تُرى؟!

-لو تتذكر منذ قليل حينما تحدثنا عن الكلمات المحجوزة (Keywords) لـ SQL وقد تكون إستغربت حينما أخبرتك بأنه لا يُمكنك (تقريباً) إستخدام تلك الكلمات المحجوزة لتسمية كائنات قواعد البيانات.

ذكري لكلمة تقريباً هُنا كان السبب بها هو ضميري حيث أنني كُنت أريد أن أُخفي عليك أنه يُمكنك إستخدام الكلمات المحجوزة لتسمية الكائنات بطريقة ما وذلك لأن ذلك الأمر غير مُفضل تماااماً ولكن إذا أردت ذلك مع أني لا أنصحك أبداً هُنا يأتي دور الأقواس المُربعة [] (Right-Left Square Brackets) حيث أن SQL لم تكن لتُقيدك بشئ وسمحت لك بتسمية الكائنات بما تشاء وحتى أن إستخدمت كلماتها المحجوزة ولكن بشرط أن تضع ذلك الإسم ما بين إثنين من الـ Right-Left Square Brackets, فمثلاً إذا أردنا أن نقوم بإنشاء جدول بإسم CREATE و CREATE من أهم الكلمات المحجوزة لـ SQL كيف ستكون الجملة؟!, سيراً على جملتنا السابقة ستكون كالتالي:



CREATE TABLE [CREATE](numValue BIGINT)

هُنا قد تأكد فعلاً المُحرر أنك تقصد بكلمة CREATE الثانية فى الجملة السابقة إسم الجدول وليس الأمر CREATE, ونفس الفكرة بالنسبة لتسمية الحقول أيضاً وليكن أننا سنقوم بتسمية الجدول بإسم CREATE والحقل بإسم TABLE والإثنين من الكلمات المحجوزة, إذن ستكون الجملة كالتالي:



CREATE TABLE [CREATE]([TABLE] BIGINT)

ولكن ضع فى الإعتبار أن إسم الجدول والحقل فى الجملة السابقة ليس بـ CREATE و TABLE ولكنهم [CREATE] و [TABLE] يعني ذلك أنك حينما تود التحدث مع SQL Compiler عن الجدول والحقل السابقين ستذكر له الجدول [CREATE] وليس الجدول CREATE وكذلك ستذكر له الحقل [TABLE]  وليس الحقل  TABLE حيث أن الـ Brackets الأن هي جزء من إسماء تلك الكائنات.

ولكن كيف الحال إن لم أقم بوضع الـ Brackets فى الجملة السابقة؟!

-بكل بساطة سيعتبر المُحرر أنك تقصد بالكلمتين CREATE الأولى والثانية الكلمة المحجوزة CREATE وكذلك الكلمتين TABLE الأولى والثانية الكلمة المحجوزة TABLE وسيشك فعلاً فى مدى إستيعابك للغة SQL ويإخذ على خاطره منك ولن يقوم بتنفيذ الأمر حتى يَلِج الجَمل في سَم الخياط.

رائع.. ولكن كيف الحال إن حددت أسماء ليس بالكلمات المحجوزة لـ SQL وبنفس الوقت قُمت بكتابة الأسماء ما بين الـ Brackets ؟

هُنا سيعبرك الـ Complier مبرمج حذر ودقيق جداً فى عملك, وستعلو فى نطره حيث أنك قد قُمت بشئ لست مطالباً به, تلك الحالة تحدث حينما نقوم بكتابة جملتنا الأولى كالتالي:



CREATE TABLE [Numbers]([numValue] BIGINT) --Standard Statement

جملة قياسية فعلاً!

ويُمكنك أيضاً إستخدام الـ Righ-Left Square Brackts داخل SQL حين محاولة إستخدام المسافات (Spaces) داخل أسماء الكائنات كـ [employee table] (ويُفضل إستبدال المسافات بالـ Under Score (_) كـ  employee_tableولا داعي للـ Brackets  حينها من باب توفير الجهد).

دعنا الأن نقوم بإنشاء جدول يحتوي على أكثر من حقل, وليكن جدول لبيانات الأسماء الحقيقة والمستعارة (Name, Nick Name) لأعضاء منتدى فيجوال بيسيك للعرب وسيكون الجدول بإسم VB Members ويحتوي على ثلاثة حقول وهم mbr_ID و mbr_Name و mbr_NickName وهم على التوالي رقم العضو, الأسم, الإسم المستعار, الأول من نوع “رقم” أما الثاني والثالث فمن نوع “نص”.

ولكن هُنا دعني أسألك سؤالاً, كم أقصى طولاً مناسباً لأسم عضو داخل منتدى؟!

-هل سيتدعى الـ 40 حرف؟, أعتقد أنها نسبة كريمة جداً.

وأيضاً كم أقصى طولاً مناسباً لأسم مستعار لعضو داخل منتدى؟!

-هل سيتعدى الـ 20 حرف؟,طول مناسب جداً.

إذن ستكون جملتنا هُنا كالتالي:



CREATE TABLE vb_Members

(

             mbr_ID INT,

             mbr_Name NVARCHAR(40),

             mbr_NickName NVARCHAR(20)

)

ليس هُناك فرق ما بين إنشاء جدول يحتوي على حقل واحد وأخر يحتوي على أكثر من حقل سوى وجود الفاصلة والمسافة (Comma + Space(, )) كفاصل ما بين حقل والأخر.

ولكن هناك شيئاً يتناقد مع قوانين قواعد البيانات العلائقية فى الجدول السابق –vb_Members- وهو عدم وجود الحقل الأساسي!… صح؟

ولكن كيف يُمكن تحديد الحقل الإساسي بإستخدام SQL؟!

بجملة بسيطة جدا وستكون بنفس طريقة ترتيب الحقول ولكن سيكون موضعها بعد أخر حقل مُحدد للجدول, ولكن ما هي تلك الجملة؟, هي:



PRIMARY KEY ([Your Primary Key Field0], [Your Primary Key Field1])

ولو ولاحظت فى التركيب ستجد أن الحقل الأساسي يُحدد ما بين إثنين من الأقواس (Patenthesis) مما يُوحي إليك بمدى إستيعاب الـ Complier لإمكانية إحتياجك لتحديد أكثر من حقل أساسي داخل جدول واحد كـ علاقة Many To Many لو تتذكر!.

لنُحدد الأن الحقل الأساسي للجدول vb_Members وهو بالطبع الحقل vb_ID, هيا:



CREATE TABLE vb_Members

(

             mbr_ID INT,

             mbr_Name NVARCHAR(40),

             mbr_NickName NVARCHAR(20),

PRIMARY KEY (mbr_ID)

)

ما رأيك الأن بأن نقوم بإنشاء أكبر جدول “tblEmployees” داخل قاعدة البيانات التي قُمنا بإنشاءها فى الدرس السابق برمجياً؟!, هيـا بنا:

دون شرح وثرثرة وإعادة وأيضاً ثقةً مني في مدى إستيعابك, ستكون الجملة كالتالي:



CREATE TABLE tblEmployees

(

               empID INT,

               empSignUpDate DATE,

               empFirstName NVARCHAR(20),

               empMiddleName NVARCHAR(20),

               empLastName NVARCHAR(20),

               empDateOfBirth DATE,

               empGender REAL,

               empPhone NVARCHAR(20),

               empMobile NVARCHAR(20),

               jobID SMALLINT,

 PRIMARY KEY (empID)

)

الجملة السابقة يُمكنها أن تٌوم بإنشاء الجدول “tblEmployee” دون شك, ولكن ليس بنسبة 100%, لمــا؟!

لو تلاحظ فى تصميم قاعدة البيانات فى الدرس السابق ستجد أننا قُمنا بإعتماد إمكانية إحتواء بعض الحقول على فراغات والأخرى لا, وذلك لم نقم بإعتماده وتهيئته فى الجملة السابقة حيث أن الـ Compiler حينما لا يجد تمكين-تعطيل للفراغات داخل جملة مُعينة يقوم بإعتماد النمط الإفتراضي لذلك لديه وهو إعتماد الفراغات داخل جمييع الحقول, أي أن الجملة السابقة تسمح للمستخدم بفراغ بيانات أي من الحقول السابقة عدى الحقل الأساسي طبعاً لأنه بالفطرة لا يُمكن له أن يحتوي على فراغات. ولكن كيف يُمكن إعتماد ذلك؟!

-بإضافة احد إثنين من بنود (Clauses) الـ Keywords الخاصة بـ SQL تعقب نوع البيانات الطول فى تركيب الجملة وهما NULL وتختص بإعتماد الفراغات داخل بيانات الحقول وعكسها NOT NULL وتُعطل إمكانية الفراغات داخل بيانات الحقول, أي ستُحتم على المُستخدم إدخال بيانات فى ذلك الحقل أثناء الإدخال, وتكون صيغتها كالتالي:



[Field0] DataType(length) NULL OR NOT NULL

وبإعتمادها داخل جملتنا السابقة تُصبح الجملة:



CREATE TABLE tblEmployees

(

               empID INT NOT NULL,

               empSignUpDate DATE NOT NULL,

               empFirstName NVARCHAR(20) NOT NULL,

               empMiddleName NVARCHAR(20) NOT NULL,

               empLastName NVARCHAR(20) NOT NULL,

               empDateOfBirth DATE NOT NULL,

               empGender REAL NOT NULL,

               empPhone NVARCHAR(20) NOT NULL,

               empMobile NVARCHAR(20) NULL,

               jobID SMALLINT NOT NULL,

 PRIMARY KEY (empID)

)

هُنا يُمكنني أن أقول أن تلك الجملة تقوم بإنشاء الجدول كما قُمنا بإنشائه يدوياً بنسبة 90%, لــــــــــــما أيضاً؟

-ألم تلاحظ الحقل الغريب (Foreign Key Field) “jobID”  المتواجد فى  الجدول “tblEmployees” السابق؟, من المفترض أنه لا ينم لذلك الجدول بصلة وذلك لأنه هُناك علاقة بينه وبين جدول الأخر ولكن كيف يُمكن تحديد الـ Foreign Key Field داخل جمل SQL؟!

هذا ما سنتحدث عنه حين وصولنا للأمر ALTER TABLE حيث أنه من المُفترض عليك الأن ودون أدنى شك أن تقوم بإنشاء جميع جداول قاعدة البيانات التي أنشأناها فى الدرس السابق برمجياً بإستخدام الأمر CREATE TABLE (لا تنسى أن الـ Practice أو المُمارسة هو طريقك الوحيد للإحتراف) وذلك حتى نلتقي…..

فى الدرس القادم بإذن الله>>

Advertisements

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s