كيف تدير قاعدة بيانات SQL: ورقة SQL مرجعيّة


Ali Issa

مقدمة

تأتي قواعد بيانات SQL مُثبّتة مع جميع الأوامر التي تحتاجها للإضافة، والتعديل، والحذف والاستعلام عن بياناتك. يوفّر هذا الدليل لنمط الورقة المرجعية cheat sheet مرجعًا سريعًا لبعضٍ من أوامر SQL الأكثر شيوعًا.

  • كيفية استخدام هذا الدليل:
  • هذا الدليل على شكل ورقة مرجعيّة فيها أمثلة منفصلة قابلة للاستخدام فرادى.
  • انتقل إلى أي مقطع ذي صلة بالمهمة التي تحاول إكمالها.
  • عندما ترى نصًّا مميّزًا في أوامر هذا الدليل، فضع بالحسبان أن هذا النص يشير إلى الأعمدة، والجداول، والبيانات في قاعدة البيانات الخاصة بك.
  • ضُمّنت قيم البيانات في هذا الدليل في الأمثلة المُعطاة بعلامة ('). من الضروري في SQL تضمين أي قيم بيانات تحتوي على سلاسل نصية في علامات اقتباس أحادية. هذا التضمين غير مطلوب من أجل البيانات الرقمية، ولكنه لن يتسبب بأيّة مشاكل أيضًا.

يرجى ملاحظة أنّه على الرغم من كون SQL معياريّة، إلاّ أنّ معظم برامج قواعد بيانات SQL لها إضافاتها الخاصّة. يستخدم هذا الدليل MySQL كنموذج لنظام إدارة قواعد البيانات العلائقية (RDBMS)، ولكن الأوامر المقدّمة ستعمل مع برامج قواعد البيانات العلائقية الأخرى، بما في ذلك PostgreSQL و MariaDB وSQLite. سنُضمّن الأوامر البديلة عند وجود فروق مهمّة بين أنظمة إدارة قواعد البيانات العلائقية RDBMSs.

بدء مِحث أوامر قاعدة البيانات (باستخدام استيثاق Socket/Trust)

يمكن لمستخدم MySQL الجذر root الاستيثاق بدون كلمة مرور بشكل افتراضي في نظام التشغيل أبونتو Ubuntu 18.04 باستخدام الأمر التالي:

$ sudo mysql

استخدم الأمر التالي لفتح مِحث أوامر PostgreSQL. سيُسجلك هذا المثال كمستخدم postgres، والذي يتضمن صلاحيات دور المستخدم المميّز superuser role، ولكن يمكنك استبداله بأي دور مُنشئ مُسبقًا:

$ sudo -u postgres psql

بدء مِحث أوامر قاعدة البيانات (باستخدام استيثاق كلمة المرور)

إذا ُضبط مستخدم MySQL الجذر root للاستيثاق باستخدام كلمة مرور، فبإمكانك استخدام الأمر التالي:

$ mysql -u root -p

إذا أعددت مُسبقًا حساب مستخدم عادي non-root لقاعدة بياناتك، فيمكنك أيضًا استخدام هذه الطريقة لتسجيل الدخول باسم هذا المستخدم:

$ mysql -u user -p

سيُقاطعك الأمر السابق بعد تشغيله للمطالبة بكلمة المرور الخاصّة بك. إذا كنت ترغب في جعل كلمة المرور كجزء من الأمر، فأَتبعْ الخيار p- مباشرة بكلمة مرورك، بدون ترك فراغ بينهما:

$ mysql -u root -ppassword

إنشاء قاعدة بيانات

يُنشئ الأمر التالي قاعدة بيانات بإعداداتٍ افتراضيّة:

mysql> CREATE DATABASE database_name;

يمكنك إذا أردت لقاعدة بياناتك أن تستخدم مجموعة محارف وتصنيف مختلفة عن الإعدادات الافتراضيّة تحديد ذلك باستخدام الصياغة التالية:

mysql> CREATE DATABASE database_name CHARACTER SET character_set COLLATE collation;

إظهار قائمة قواعد البيانات

شغّل الأمر التالي لرؤية قواعد البيانات الموجودة في نظام MySQL أو MariaDB:

mysql> SHOW DATABASES;

يمكنك في PostgreSQL مشاهدة قواعد البيانات المُنشأة باستخدام الأمر التالي:

postgres=# \list

حذف قاعدة البيانات

شغّل الأمر التالي لحذف قاعدة بيانات بما في ذلك ضمنًا أي جداول وبيانات موجودة فيها:

mysql> DROP DATABASE IF EXISTS database;

إنشاء مستخدم

نفّذ الأمر التالي لإنشاء معرّف مستخدِم لقاعدةِ بياناتك من دون تحديد أيّ امتيازاتٍ له:

mysql> CREATE USER username IDENTIFIED BY 'password';

تَستخدم PostgreSQL بنية مشابهة، ولكنها مختلفة قليلاً، إليك الصياغة:

postgres=# CREATE USER user WITH PASSWORD 'password';

يمكنك إذا أردتَ إنشاء مستخدم جديد ومنحه امتيازات باستخدام أمر واحد عن طريق إصدار عبارة GRANT. ينشئ الأمر التالي مستخدمًا جديدًا ويمنحه امتيازات كاملة لكامل قاعدة البيانات والجداول في نظام إدارة قواعد البيانات العلائقية RDBMS:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

لاحظ الكلمة المفتاحيّة PRIVILEGES في تعليمة GRANT السابقة. إن هذه الكلمة اختيارية في معظم أنظمة إدارة قواعد البيانات العلائقية، ويمكن كتابة هذه التعليمة بشكل مكافئ على النحو التالي:

mysql> GRANT ALL ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

كن منتبهًا مع ذلك، أنّ الكلمة المفتاحيّة PRIVILEGES مطلوبة لمنح امتيازات كهذه عندما يكون وضع Strict SQL مُشغّلًا.

حذف مستخدم

استخدم الصياغة التالية لحذف اسم مستخدم قاعدة البيانات:

mysql> DROP USER IF EXISTS username;

لاحظ أن هذا الأمر لا يحذف افتراضيًا أيّة جداول أُنشأت بواسطة المستخدم المحذوف، وقد تؤدي محاولات الوصول إلى جداول كهذه إلى حدوث أخطاء.

اختيار قاعدة البيانات

يجب أولًا إخبار RDBMS بقاعدة البيانات التي ترغب في إنشائها في MySQL و MariaDB قبل أن تتمكن من إنشاء جدول. استخدم الصياغة التالية للقيام بذلك:

mysql> USE database;

يجب عليك استخدام الأمر التالي في PostgreSQL لاختيار قاعدة بياناتك المرغوبة:

postgres=# \connect database

إنشاء جدول

تنشئ بنية الأمر التالية جدولًا جديدًا باسم table يحوي عمودين لكل منهما نوع بياناته الخاص:

mysql> CREATE TABLE table ( column_1 column_1_data_type, column_2 column_2_data_taype );

حذف جدول

نفّذ ما يلي لحذف جدول بالكامل، بما في ذلك جميع البيانات الخاصّة به:

mysql> DROP TABLE IF EXISTS table

إدخال البيانات في جدول

استخدم الصياغة التالية لملء جدول بصف واحد من البيانات (row):

mysql> INSERT INTO table ( column_A, column_B, column_C ) VALUES ( 'data_A', 'data_B', 'data_C' );

يمكنك أيضًا ملء جدول بعدة صفوف من البيانات باستخدام أمر واحد، على النحو التالي:

mysql> INSERT INTO table ( column_A, column_B, column_C ) VALUES ( 'data_1A', 'data_1B', 'data_1C' ),  ( 'data_2A', 'data_2B', 'data_2C' ), ( 'data_3A', 'data_3B', 'data_3C' ); 

حذف بيانات من جدول

استخدم بنية الأوامر التالية لحذف صف من البيانات من جدول. لاحظ أن value يجب أن تكون القيمة الموجودة في العمود المحدد column في الصف الذي تريد حذفه:

mysql> DELETE FROM table WHERE column='value';

ملاحظة: إذا لم تُضمّن عبارة WHERE في تعليمة DELETE، كما هو موضّح في المثال التالي، فستُحذف جميع البيانات الموجودة في الجدول، ولكن لن تُحذف الأعمدة أو الجدول نفسه:

mysql> DELETE FROM table;

تغيير البيانات في جدول

استخدم الصياغة التالية لتحديث البيانات الموجودة في الصف المُعطى. لاحظ أنّ عبارة WHERE في نهاية الأمر تُخبر SQL بالصف المطلوب تحديثه. إنّ value هي القيمة الموجودة في column_A المحاذية للصفِ الذي تريد تغييره. ملاحظة: إذا أهملتَ تضمين عبارة WHERE في تعليمة UPDATE، فسيَستبدِل الأمر البيانات الموجودة في كل صف من الجدول.

mysql> UPDATE table SET column_1 = value_1, column_2 = value_2 WHERE column_A=value;

إضافة عمود

ستضيف صياغة الأمر التالية عمودًا جديدًا إلى جدول:

mysql> ALTER TABLE table ADD COLUMN column data_type;

حذف عمود

سيؤدي هذا الأمر إلى حذف عمود من جدول:

mysql> ALTER TABLE table DROP COLUMN column; 

تنفيذ الاستعلامات الأساسيّة

استخدم الصياغة التالية لعرض جميع البيانات من عمود واحد من جدول:

mysql> SELECT column FROM table;

افصلْ بين أسماء الأعمدة بفاصلة للاستعلام عن أعمدة متعددة من نفس الجدول:

mysql> SELECT column_1, column_2 FROM table;

يمكنك أيضًا الاستعلام عن كل الأعمدة في جدول عن طريق استبدال أسماء الأعمدة بعلامة النجمة (*). تعمل علامات النجمة في SQL كبدائل لتمثيل "الكل":

mysql> SELECT * FROM table;

استخدام عبارات WHERE

يمكنك تضييق نطاق نتائج استعلام عن طريق إلحاق تعليمة SELECT بعبارة WHERE، كما يلي:

mysql> SELECT column FROM table WHERE conditions_that_apply;

يمكنك على سبيل المثال الاستعلام عن جميع البيانات من صف واحد من خلال صياغة مشابهة لما يلي. لاحظ أن value يجب أن تكون قيمة محفوظة في كل من column المحدّد والصف الذي تريد الاستعلام عنه:

mysql> SELECT * FROM table WHERE column = value;

العمل مع مُعاملات المقارنة

يحدّد مُعامل المقارنة في جملة WHERE كيفيّة مقارنة العمود المحدّد بقيمة ما. فيما يلي بعض معاملات المقارنة الشائعة لـ SQL:

  • = : اختبار المساواة
  • != : اختبار عدم المساواة
  • < : اختبار أقل من
  • > : اختبار أكبر من
  • <= : اختبار أقل من أو يساوي
  • >= : اختبار أكبر من أو يساوي 
  • BETWEEN : اختبار فيما إذا كانت القيمة ضمن مجال مُعطى
  • IN : اختبار ما إذا كانت قيمة الصّف مُتضَمّنة في مجموعة من القيم المحدّدة
  • EXISTS : اختبار ما إذا كانت صفوف موجودة، تبعاً للشروط المحدّدة
  • LIKE : اختبار فيما إذا كانت قيمة تتطابق مع سلسلة نصيّة محدّدة
  • IS NULL : اختبار القيم الفارغة
  • IS NOT NULL : اختبار كافّة القيم غير الفارغة "NULL"

العمل مع محارف البدل Wildcards

يسمح SQL باستخدام محارف البدل wildcard. وهي مفيدة عندما تحاول العثور على مُدخل محدّد في جدول، ولكنك لا تكون متأكدًا تماماً من هذا المُدخل. تعتبر علامات النجمة (*) عناصر بديلة لتمثيل "الكل"، حيث تقوم بالاستعلام كل الأعمدة في جدول:

mysql> SELECT * FROM table;

تمثل علامات النسبة المئوية (٪) صفراً أو أكثر من محارف غير معروفة.

mysql> SELECT * FROM table WHERE column LIKE val%;

يُستخدم التسطير السفلي (_) لتمثيل محرف واحد غير معروف:

mysql> SELECT * FROM table WHERE column LIKE v_lue;

حساب المُدخلات في عمود

تُستخدم الدّالة COUNT لإيجاد عدد الإدخالات في عمود محدّد. ستُرجع الصياغة التالية إجمالي عدد القيم الموجودة في column:

mysql> SELECT COUNT(column) FROM table;

يمكنك تضييق نتائج دالة COUNT من خلال إضافة عبارة WHERE، كما يلي:

mysql> SELECT COUNT(column) FROM table WHERE column=value;

إيجاد قيمة المعدل في عمود

تُستخدم الدّالة AVG لإيجاد المعدل بين القيم الموجودة في عمود محدّد. لاحظ أن دالة AVG ستعمل فقط مع الأعمدة التي تحتوي على قيم رقميّة. وقد تُعيد خطأ أو 0 عند استخدامها على عمود يحمل قيم نصيّة:

mysql> SELECT AVG(column) FROM table;

إيجاد مجموع القيم في عمود

تُستخدم الدّالة SUM لإجمالي مجموع القيم الرقميّة الموجودة في عمود:

mysql> SELECT SUM(column) FROM table;

كما هو الحال مع دالة AVG، إذا نَفّذتَ الدالة SUM على عمود يحوي قيم نصيّة، فقد تُعيد خطأ أو فقط 0، وذلك اعتمادًا على نظام إدارة قواعد البيانات العلائقية خاصتك.

إيجاد القيمة الكبرى في عمود

استخدم دالة MAX للعثور على أكبر قيمة رقميّة في عمود أو القيمة الأخيرة أبجديًا :

mysql> SELECT MAX(column) FROM table;

إيجاد القيمة الصغرى في عمود

استخدم الدّالة MIN للعثور على أصغر قيمة رقميّة في عمود أو القيمة الأولى أبجديًا:

mysql> SELECT MIN(column) FROM table;

فرز النتائج باستخدام عبارات ORDER BY

تُستخدم عبارة ORDER BY لفرز نتائج الاستعلام. تُعيد الصياغة التالية للاستعلام القيم من column_1 و column_2 وتُرتّب النتائج حسب القيم الموجودة في column_1 بترتيب تصاعدي، أو بترتيب أبجدي بالنسبة لقيم السلاسل النصيّة:

mysql> SELECT column_1, column_2 FROM table ORDER BY column_1;

أتبع الاستعلام بـ DESC لتنفيذ نفس الإجراء، ولكن مع ترتيب النتائج بترتيب أبجدي تنازلي:

mysql> SELECT column_1, column_2 FROM table ORDER BY column_1 DESC;

فرز النتائج باستخدام عبارات GROUP BY

تشبه عبارة GROUP BY عبارة ORDER BY، ولكنها تُستخدم لفرز نتائج استعلام يتضمن دالة مُجمِّعة مثل COUNT أو MAX أو MIN أو SUM. ستؤدي الدوال التجميعيّة الموضّحة في القسم السابق بمفردها إلى إرجاع قيمة واحدة فقط. ويمكنك مع ذلك عرض نتائج دالة التجميع المنفّذة على كل قيمة مطابقة في العمود من خلال تضمين عبارة GROUP BY. ستَحسب الصياغة التالية عدد القيم المطابقة في column_2 وتُجمّعها بترتيب تصاعدي أو أبجدي:

mysql> SELECT COUNT(column_1), column_2 FROM table GROUP BY column_2;

أتبِعْ الاستعلام بـ DESC لتنفيذ نفس الإجراء، ولكن بتجميع النتائج بالترتيب الأبجدي التنازلي:

mysql> SELECT COUNT(column_1), column_2 FROM table GROUP BY column_2 DESC;

الاستعلام عن جداول متعددة مع عبارات JOIN

تستخدم عبارات JOIN لإنشاء مجموعات نتائج تجمع بين صفوف من جدولين أو أكثر. لن تعمل عبارات JOIN إلا إذا كان لكل من الجدولين عمود له اسم ونوع بيانات متطابقان، كما في هذا المثال:

mysql> SELECT table_1.column_1, table_2.column_2 FROM table_1 JOIN table_2 ON table_1.common_column=table_2.common_column;

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

تُكتب عبارات JOIN الخارجية إما كـ LEFT JOIN أو RIGHT JOIN. تُرجع عبارة LEFT JOIN كافة السجلات من الجدول "الأيسر" والسجلات المطابقة فقط من الجدول "اليمين". في سياق عبارة JOIN الخارجيّة، يكون الجدول الأيسر هو المشار إليه في جملة FROM، والجدول الأيمن هو أي جدول آخر مشار إليه بعد عبارة JOIN.

سيَعرض الاستعلام التالي كل سجل من table_1 وفقط القيم المطابقة من table_2. ستظهر القيم غير المطابقة في table2 كـ NULL في مجموعة النتائج:

mysql> SELECT table_1.column_1, table_2.column_2 FROM table_1 LEFT JOIN table_2 ON table_1.common_column=table_2.common_column;

إن وظيفة عبارة RIGHT JOIN مماثلة لـ LEFT JOIN، ولكنها تُرجع جميع النتائج من الجدول الأيمن، والقيم المطابقة فقط من الجدول الأيسر:

mysql> SELECT table_1.column_1, table_2.column_2 FROM table_1 RIGHT JOIN table_2 ON table_1.common_column=table_2.common_column;

دمج تعليمات SELECT متعددة باستخدام عبارات UNION

يفيد مُعامل UNION في دمج نتائج تعليمتي SELECT (أو أكثر) في مجموعة نتائج واحدة:

mysql> SELECT column_1 FROM table UNION SELECT column_2 FROM table;

يمكن بالإضافة إلى ذلك أن تجمع عبارة UNION بين تعليمتي SELECT (أو أكثر) والتي تستعلم عن جداول مختلفة في نفس مجموعة النتائج:

mysql> SELECT column FROM table_1 UNION SELECT column FROM table_2;

الخلاصة

يغطي هذا الدليل بعضًا من الأوامر الأكثر شيوعًا في SQL المُستخدمة لإدارة قواعد البيانات، والمستخدمين، والجداول، والاستعلام عن المحتويات الموجودة في هذه الجداول. ومع ذلك، هناك العديد من تجميعات العبارات والمعاملات والتي تنتج جميعها مجموعات فريدة من النتائج. إذا كنت تبحث عن دليل أكثر شموليّة للعمل مع SQL، فإنّنا نُشجعك على مراجعة Oracle's Database SQL Reference

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

ترجمة بتصرّف للمقال How To Manage an SQL Database لصاحبه Mark Drake





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن