أوامر SQL على كل مبرمج أن يعرفهم

|
أوامر SQL على كل مبرمج أن يعرفهم

يكاد لايوجد أي موقع إلكتروني في العالم لا يستعمل قواعد البيانات بطريقة أو بأخرى، فكل البيانات الموجودة في الانترنت تقوم قواعد البيانات بإدارتها حتى هذه التدوينة التي تقرأها الآن مرت عن طريق قاعدة بيانات أثناء التخزين، وهاهي الآن تظهر لك.

تعتبر SQL أو لغة الاستعلامات البنيوية Structured Query Language لغة تواصل المبرمج –السيرفر- مع قاعدة البيانات لإدارة البيانات عليها، كإضافة حذف تعديل وجلب البيانات المخزنة في الجداول.

في هذه التدوينة سنرى أهم 13 استعلام التي يجب على كل مطور ومبرمج أن يكون على دراية بهم.

كل الأمثلة المتواجد في هذه التدوينة مبنية على الجداول التالية :

جدول الزبون Customer


جدول الأطوال Heights


جدول الفريق Staff


جدول الأشخاص People


1. SELECT


استعلام SELECT -تحديد- من أسهل الاستعلامات وأكثرها استخداما في القواعد البيانات، فمهمته الأساسية جلب البيانات.

مثال بسيط لهذا الإستعلام:

SELECT * FROM table

الاستعلام أعلاه ينقسم إلى قسمين، القسم الأول SELECT * الذي يحدد الأعمدة التي نريد قراءتها. النجمة تعني كل الأعمدة الموجودة في الجدول. القسم الثاني FROM table يحدد الجداول التي سيتم جلب البيانات منها. يتم تعوض "table" بإسم الجدول في قاعدة البيانات.

غالبا ما نستعمل تحديد الكل SELECT * أثناء التطوير لرؤية البيانات المتواجدة في الجدول، لكن لا يُنصح استعمالها أثناء الإنتاج.

عندما نقوم بتحديد كل الأعمدة عن طريق SEELCT * فإننا نترك محرك قاعدة البيانات يتولى مسؤولية ترتيب الأعمدة والبيانات وعرضها، مثلا عندما يضاف عمود جديد في جدول ما وكنت تستعمل هذه الطريقة -الاستعلام- في لغتك البرمجية فقد تجد ترتيب المتغيرات الخاصة بالأعمدة خاطئ.

الحل هو تعويض النجمة * بإسم الأعمدة مثل :

SELECT age, name FROM people

في الاستعلام أعلاه قمنا بتحديد عمودي age و name من جدول people، قد يبدو أن تحديد اسم الأعمدة سيشكل عائق للاستعلام خصوصا عندما يكون عددها كبيرة جدا، لكن فعل ذلك يغنيك عن الوقوع في المشاكل مستقبلا بالإضافة إلى جعل قابلية قراءة الاستعلام سهلة جدا.

إذا أردت إرجاع البيانات لكنها غير موجودة من الأساس في الجدول نستعمل الآتي :

SELECT age, '1234' FROM people

سيكون الخرج على الشكل التالي :


2. WHERE


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

هنا يأتي دور أمر حثيما WHERE ، فهذا الأمر يضيف لاستعلام التحديد SELECT مرونة أكثر للتعامل مع البيانات، بمعنى آخر فـ WHERE تقوم بعملية فلترة للبيانات على حسب الشروط المحددة.

SELECT age, name from people WHERE age > 10

الخرج سيكون كالتالي :


الاستعلام أعلاه قام بعملية فلترة على جدول الأشخاص people وتحديد فقط الأشخاص الذين سنهم age فوق العشر سنوات قطعا.

يمكنك إضافة أكثر من شرط باستعمال العامل "و" AND :

SELECT age, name from people WHERE age > 10 AND age < 20

أمر AND يعمل على تطبيق أمر آخر على الاستعلام حيث في الاستعلام أعلاه قمنا بتحديد السن age على أن يكون أكبر قطعا من 10 وأن يكون أصغر قطعا من 20.

الشروط التي ضمن AND يتحتم عليها أن تكون صحيحة true لكي يظهر الناتج.

هناك عامل آخر هو "أو" OR فهو مثل العامل AND يستعمل لفلترة البيانات. مثال :

SELECT age, name FROM people WHERE age > 10 OR name ='Joe'


الاستعلام أعلاه يظهر عمودي السن age و الإسم name من جدول الأشخاص people الذي يتوفرون على سن أكبر قطعا من 10 أو الذين يتوفرون على إسم Joe.

لاحظ أننا أثناء إضافة شرط الإسم 'name='Joe استخدمنا علامة تساوي = واحدة وليست علامتين تساوي == والتي أغلب لغات البرمجة تستعملها للتأكد من التساوي، هذا الأمر يُطبق على معظم محركات قواعد البيانات.

3. Order


أمر ترتيب Order يستعمل عندما نريد ترتيب البيانات بطريقة خاصة وتضاف في آخر الاستعلام.

SELECT name, age FROM people ORDER BY age DESC


في الاستعلام أعلاه قمنا بإضافة أمر ترتيب على السن age وأضفنا بعدها كلمة DESC والتي تعني Descending أي تنازلي من القيمة الأكبر إلى الأصغر. ويمكن تغير DESC بـ ASC والتي تعني Ascending أي تصاعدي من القيمة الأصغر إلى الأكبر كما يمكننا أيضا دمج أكثر من ترتيب كالتالي :

SELECT name, age FROM people ORDER BY name ASC, age DESC


فاستعلام أعلاه سيقوم بترتيب الأشخاص people على حساب الأسماء name بشكل تصاعدي ASC ، حسب حروف الإسم، في حالة تساوي الأسماء سيلجأ الاستعلام على تطبيق أمر ترتيب الذي يتبعه وهو السن بشكل تنازل DESC.

طبعاً يمكننا إضافة أكثر من أمر ترتيب ORDER على حسب الحاجة.

4. Join


أمر الانضمام Join يستعمل عندما نريد جلب بيانات تكون متفرقة على أكثر من جدول، فالاستعلامات التي رأيناها في الأعلى كلها تأتي من جدول واحد، ماذا لو أردنا أن نجلب البيانات من أكثر من جدول واحد ؟. هنا يأتي دور Join

SELECT age, name, height, FROM people LEFT JOIN heights USING(name)

أكيد أنك رأيت كلمات جديدة لا تقلق سنقوم بشرح الاستعلام خطوة خطوة، نبدأ بأمر LEFT JOIN هذا الأمر يُحدد بعده إسم الجدول المراد ضمه أو ربطه والذي هو heights، بعدها استخدمنا كلمة USING وبداخلها قمنا بتحديد اسم العمود name المراد ضمه بين جدول people و جدول heights.

فهنا يتحتم على عمود الاسم name أن يكون موجود في كلا الجدولين وبنفس الإسم. في حالة كان العمود يحمل اسم مختلف نستعمل كلمة ON بدلاً من USING :

SELECT age, name, height FROM people LEFT JOIN heights ON (namea = nameb)


كما لاحظت فإننا قمنا بتحديد اسم العمودين لكلا الجدولين، فأمر الإنضمام JOIN يحتوي على عدة أنواع :

  • (INNER) JOIN – تُرجع الصفوف في حالة واحدة عندما تكون ضمن الجدولين.
  • LEFT (OUTER) JOIN - تُرجع كل الصفوف من الجدول المتواجد على يسارها، سواء كان الجدول الذي على اليمين يحتوي هذه البيانات أو لا .
  • RIGHT (OUTER) JOIN – على كعس الأمر أعلاه فهي تُرجع كل الصفوف من الجدول المتواجد على اليمين، سواء كان الجدول الذي على اليسار يحتوي هذه البيانات أو لا.
  • FULL (OUTER) JOIN – تُرجع كل البيانات سواء أكانت في الجدول الأيمن أو الأيسر.

إضافة كلمة INNER أو OUTER تبقى اختيارية، فهي تجعل الاستعلام سهل الفهم، لكنها تبقى غير إجبارية.

5. Alias


الاسم المستعار Alias هذا الأمر يستعمل إذا أردنا تغير اسم الجدول أثناء الاستعلام فقط، بمعنى أن الإسم المستعار Alias سيكون مؤقت خلال الاستعلام فقط، ولا يؤثر على الإسم الحقيقي للجدول.

SELECT A.age FROM people A

هنا في الاستعلام أعلاه قمنا بإعطاء الجدول people اسم مستعار Alias يحمل A طبعا يمكنك استعمال أي اسم تريده، وقبل اسم أي عمود نقوم بإضافة هذا Alias لتوضيح لمحرك قواعد البيانات بأن عمود age متعلق بالجدول people والذي يحمل الاسم المؤقت A.

فبشكل افتراضي فإسم الجدول يكون هو اسم المستعار مثل :

SELECT people.age FROM people

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

SELECT staff.age, staff.name, customers.age, customers.name, FROM staff, customers

أو نستعمل الاسم المستعار :
SELECT A.age, A.name, B.age, B.name FROM staff A, customers B

فجدول الفريق staff استعمل الاسم المستعار A وجدول الزبناء customers استعمل الاسم المستعار B، كما تلاحظ أصبح الاستعلام جد واضح ومفهوم.

أمر أخر في الأسماء المستعارة Alias أنه يمكننا إضافتها للأعمدة كذلك عن طريق أمر AS مثل :

SELECT age AS person_age FROM people


فعمود age سيصبح اسمه في الخرج person_age

6. Union


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

SELECT age, name FROM customers
UNION
SELECT age, name FROM staff


يمكننا القول أن Union تقوم بجمع بين استعلامين أو أكثر، فهي تقوم بجلب الصفوف الفريدة unique  بين الجدولين. في حالة أردت إرجاع كل الصفوف بدون الاهتمام إلى تكرار الصوف استعمل UNION ALL مثل :

SELECT age, name FROM customers
UNION ALL
SELECT age, name FROM staff


الأمر قام بجلب كافة الصفوف بين الجدولين، وتغير في ترتيب عرض الصفوف.

7. Insert


الآن عرفنا كيفية جلب البيانات من قاعدة البيانات، ماذا عن إضافة بيانات جديدة؟، هنا يأتي أمر إضافة Insert الذي يخول لك إضافة بيانات جديدة إلى قاعدة البيانات.

INSERT INTO people(name, age) VALUES('Joe', 102)

الأمر أعلاه يقوم يإضافة شخص جديد إلى جدول people بتحديد العمودين name و age ، ثم بعد VALUES قيمة البيانات التي تريد إدخالها يجب أن تكون بنفس ترتيب تحديد الأعمدة.

في الأمر INSERT لا تستطيع إضافة أمر الشرط WHERE عن إضافة صف جديد، والبيانات المدخلة يجب أن تحترم القيود Constraints الموجودة على الجدول.

8. Update


بعد إضافة لصف جديد أمر عادي أن نستطيع كذلك تعديل على الصفوف –البيانات- المخزنة في قواعد البيانات، أمر تحديث Update يقوم بتنفيذ هذه المهمة.

UPDATE people SET name = 'Joe', age = 101

عليك أولا تحديد اسم الجدول المراد تغير البيانات فيه، هنا جدول people، بعدها كلمة SET متبوعة بإسم الجدول المراد تحديثه بعدها علامة = مباشرة قيمة المراد التحديث إليها. المثال أعلاه جيد، لكنه سيقوم بالتعديل على كل الصفوف المتواجدة بجدول people وغالبنا لا نحتاج لذلك بل نريد تغيير صف أو صفوف بعينها هنا يمكنك إضافة أمر حيثما WHERE إلى الاستعلام لتحديد الصفوف المراد تحديثها بدقة مثل:

UPDATE people SET name ='Joe', age = 101 WHERE name ='James'

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

UPDATE people SET name = 'Joe', age = 101 WHERE ( name='James' AND age = 100 ) OR name = 'Ryan'

لاحظ كيف استخدمت الأقواص لربط الشروط.

9. Upsert


Upsert قد تكون لم تسمع بهذه الكلمة من قبل في SQL ، لكن مهمتها مفيدة جدا، فمثلاً غالبا ما يكون جدول ما يحتوي على قيود constraint عليه، مثل فرض قيد على أن يكون عمود name يحتوي على أسماء فريدة Unique يعني لا يمكن أن يتكرر اسم مرتين في هذا العمود ضمن الصفوف. فعندما تريد إضافة مثلا صفين جديدين يحتويان على اسم name يحمل قيمة Joe فمحرك قاعدة البيانات يمنع إضافة الصفين بكل بساطة لأن القيد لا يسمح بذلك.

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

لسوء الحظ فإن Syntax الخاص بـ UPSERT يختلف بين محرك قواعد البيانات، فمحرك PostgreSQL أضاف هذه الخاصية مؤخرا، بينما في MySQL موجود منذ مدة.

هذا مثال في MySQL :

INSERT INTO people(name, age)
VALUES('Joe', 101)
ON DUPLICATE KEY UPDATE age = 101

10. Delete


أمر الحذف DELETE يتيح لك حذف صف أو صفوف من الجدول، عليك أن تكون حذر أثناء التعامل مع هذا الأمر فمثلاً :

DELETE FROM people

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

لذا غالبا ما نضيف الشروط على الاستعلام لتحديد بالضبط أي الصف أو الصفوف المراد حذفهم، مثل :

DELETE FROM people WHERE name = 'Joe'

هنا في هذا الاستعلام قمنا بتحديد بدقة الأشخاص المراد حذفهم والذين يحملون اسم Joe.

كما سبق الإشارة إليه فأمر DELETE خطير ويجب التعامل معه بحذر، لذا أثناء تطويرك لأي منتج معلوماتي استعمل ما يسمى بـ Soft delete . يعني أن لا تستعمل أمر الحذف بشكل مباشر بل ما تقوم به هو تغير قيمة أحد الأعمدة التي تعتمد عليها أثناء عملية تحديد البيانات SELECT. لجعل الصف غير ظاهر أثناء عرض جلب البيانات. بهذه الطريقة يمكنك الابتعاد عن مشاكل أنت غنى هنا.

11. Create Table


إنشاء جدول Create table نستعمل هذا الأمر من أجل إنشاء جدول جديد. مثل :

CREATE TABLE people (
  name TEXT,
  age INTEGER,
  PRIMARY KEY(name)
)

لاحظ أن أسماء الأعمدة والقيود تكتب داخل الأقواص، وفي كل عمود يتم تحديد نوع البيانات التي يستطيع تخزينها، فالمفتاح الأساسي Primary Key مطلوب تواجده في كل عمود من أجل ترتيب أفضل للبيانات.

12. Alter Table


رأينا أمر التحديث UPDATE يقوم بتحديث على البيانات المتواجدة في الجدول، ماذا لو أردنا تعديل الجدول نفسه أي هيكلة الجدول ؟.

فأمر ALTER TABLE يقوم بذلك، مثلاً نريد تغير نوع البيانات لعمود height من string إلى integer، سيصبح الأمر كالتالي :

ALTER TABLE people ADD height integer

طبعاً سيتغير نوع البيانات إذا رأى محرك قواعد البيانات بأنه أمر مسموح ولا يسبب أي مشاكل، ويمكنك إضافة أي عدد من الأعمدة التي تريدها وبأي نوع من أنواع بيانات.

13. Drop table


أمر Drop table يشبه تماما أمر DELETE الذي يحذف الصفوف، إضافة إلى حذف الصفوف فأمر DROP TABLE يحذف حتى هيكلة الجدول، يعني أن الجدول سيحذف بشكل كلي من قاعدة البيانات.

DROP TABLE people

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

خلاصة


هذه أغلب الأوامر والاستعلامات التي يجب على كل مبرمج أو مطور أن يكون على دراية بها، فحتى غير المبرمجون والمطورون يجب أن يكونوا على الأقل مطلعين عليها، طبعاً لا يمكننا تناول كل الجوانب المتعلقة بهذه الأوامر والاستعلامات في تدوينة واحدة، ويبقى أمر التعمق خاص بك ومدى اختصاصك.



البرمجة قواعد البيانات programming SQL

مواضيع ذات صلة