انتقال للمقال

إنشاء قاعدة بيانات وجداول في الـ SQL

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

وقت القراءة: ≈ 10 دقائق

المقدمة

في هذه المقالة، سنتناول أمر الـ CREATE في SQL وهو أحد الأوامر الأساسية التي ستحتاجها لإنشاء قواعد البيانات والجداول

بمعنى أن لديك أمر CREATE لإنشاء قاعدة بيانات ونفس الأمر لإنشاء جدول داخل قاعدة البيانات

ما هي قاعدة البيانات ؟

قبل أن نكمل، كيف ستنشيء شيء لا تعرف ما هو ؟

الـ Database أو قاعدة البيانات وهو كما يوحي الاسم هو مكان لتخزين البيانات بشكل عام
وهو يتكون من مجموعة من الجداول

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

              +----------------+
              |   School DB    |
              +----------------+
                |            |
                |            |
        +-------+            +-------+
        |                            |
        V                            V
+---------------+            +---------------+
|    Students   |            |    Teachers   |
+---------------+            +---------------+

إنشاء قاعدة بيانات باستخدام CREATE

لإنشاء قاعدة بيانات جديدة، نستخدم الأمر CREATE DATABASE متبوعًا باسم قاعدة البيانات التي نريد إنشائها

على سبيل المثال، لإنشاء قاعدة بيانات باسم School، نكتب:

CREATE DATABASE School;

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

لنفترض أنك لديك ثلاث تطبيقات مختلفة، كل تطبيق له قاعدة بيانات خاصة به
وقمت بإنشاء ثلاث قواعد بيانات باسم School, Library, و Hospital

CREATE DATABASE School;
CREATE DATABASE Library;
CREATE DATABASE Hospital;

الاطلاع على قواعد البيانات الموجودة

كيف يمكننا الاطلاع على قواعد البيانات الموجودة؟

يمكنك معرفة قواعد البيانات الموجودة لديك باستخدام الأمر SHOW DATABASES;

SHOW DATABASES;

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

+--------------------+
| Database           |
+--------------------+
| Hospital           |
| Library            |
| School             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

لاحظ أن هناك قواعد بيانات إضافية مثل information_schema, mysql, performance_schema, و sys
هذه قواعد بيانات نظامية تستخدمها MySQL لإدارة النظام نفسه ولا تحتاج إلى تعديلها أو التعامل معها بشكل مباشر
فأنا استخدم MySQL كمثال، ولكن نفس الأمر ينطبق على PostgreSQL و SQLite وغيرها من أنظمة إدارة قواعد البيانات

كيفية الإنتقال و اختيار قاعدة بيانات

للإنتقال إلى قاعدة بيانات معينة، يمكنك استخدام الأمر USE متبوعًا باسم قاعدة البيانات التي تريد الإنتقال إليها
على سبيل المثال، للإنتقال إلى قاعدة بيانات باسم School، نكتب:

USE School;

حذف قاعدة بيانات باستخدام DROP

إذا كنت تريد حذف قاعدة بيانات، يمكنك استخدام الأمر DROP DATABASE متبوعًا باسم قاعدة البيانات التي تريد حذفها
على سبيل المثال، لحذف قاعدة بيانات باسم School، نكتب:

DROP DATABASE Hospital;

لكن هذا الأمر وأموامر الحذف بشكل عام يجب استخدامه بحذر
لأنه عند تنفيذ هذا الأمر، سيتم حذف قاعدة البيانات وكل الجداول والبيانات الموجودة فيها بشكل نهائي
ولا يوجد طريقة لاسترجاعها بعد ذلك

لذا يجب التأكد من أنك تريد حقًا حذف قاعدة البيانات قبل تنفيذ هذا الأمر
وغالبًا في التطبيقات الحقيقية تمنع أو تعطل الأوامر المتعلقة بالحذف بشكل نهائي لتجنب الأخطاء غير المقصودة

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

الجداول في قاعدة البيانات

الآن بعد أن قمنا بإنشاء قاعدة بيانات، نحتاج إلى إنشاء جدول داخل هذه القاعدة لتخزين البيانات

نحن الآن لدينا قاعدة بيانات تسمى School ونحن قررنا أننا نريد إنشاء جدول لتخزين بيانات الطلاب
قبل أن نبدأ في إنشاء الجدول، يجب أن نفكر في البيانات التي نريد تخزينها
أولًا نحتاج إلى تحديد اسم الجدول، ولنفترض أننا سنسميه Students

ويفضل كتابة أسماء الجداول بصيغة الجمع، لذا سيكون الاسم Students وليس Student
ثم نحتاج إلى تحديد الأعمدة التي سنقوم بتخزينها في هذا الجدول
بديهيًا سيكون لدينا عمود id لتخزين معرف الطالب، وعمود name لتخزين اسم الطالب، وعمود age لتخزين عمر الطالب
ويمكننا أيضًا إضافة عمود level لتخزين مستوى الطالب في المدرسة

إنشاء جدول باستخدام CREATE

أولًا قبل أن ننشيء الجدول تأكد أنك قمت بتحديد قاعدة البيانات التي تريد إنشاء الجدول فيها باستخدام الأمر USE

USE School;

الآن نحن داخل قاعدة البيانات School، ويمكننا البدء في إنشاء الجدول
لإنشاء الجدول، نستخدم الأمر CREATE TABLE متبوعًا باسم الجدول
ثم نفتح قوسين ( ) ونحدد الأعمدة الذي نريدها

CREATE TABLE Students (
    id,
    name,
    age,
    level
);

هنا قمنا بإنشاء جدول باسم Students يحتوي على أربعة أعمدة id, name, age, و level
لكن هذا الأمر غير مكتمل، لأننا لم نحدد نوع البيانات لكل عمود

هنا يجب علينا تحديد نوع البيانات لكل عمود
في الـ SQL، هناك أنواع بيانات مختلفة مثل INT للأعداد الصحيحة، و VARCHAR للنصوص، و DATE للتواريخ، وغيرها
لذا يجب علينا تحديد نوع البيانات لكل عمود في الجدول

لذلك، سنقوم بتحديث الأمر السابق لتحديد نوع البيانات لكل عمود

  • id سيكون من نوع INT
  • name سيكون من نوع VARCHAR(100)
  • age سيكون من نوع INT
  • level سيكون من نوع VARCHAR(50)

حيث أن INT يعني عدد صحيح، و VARCHAR(n) يعني نص يمكن أن يكون بطول يصل إلى n حرفًا
لذا سيكون الأمر الكامل لإنشاء الجدول كالتالي:

CREATE TABLE Students (
    id INT,
    name VARCHAR(100),
    age INT,
    level VARCHAR(50)
);

الآن أصبح لدينا جدول باسم Students يحتوي على أربعة أعمدة مع تحديد نوع البيانات لكل عمود

الاطلاع على الجداول الموجودة

لمعرفة الجداول الموجودة في قاعدة البيانات الحالية، يمكنك استخدام الأمر SHOW TABLES;

SHOW TABLES;

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

+-------------------+
| Tables_in_School  |
+-------------------+
| Students          |
+-------------------+

رؤية هيكل الجدول

لمعرفة هيكل الجدول، أي الأعمدة وأنواع البيانات الخاصة بها، يمكنك استخدام الأمر DESCRIBE أو DESC متبوعًا باسم الجدول

DESCRIBE Students;

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

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | INT         | YES  |     | NULL    |                |
| name  | VARCHAR(100)| YES  |     | NULL    |                |
| age   | INT         | YES  |     | NULL    |                |
| level | VARCHAR(50) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

تذكر أن هذا الجدول الذي يظهر هو مجرد جدول يصف الأعمدة وأنواع البيانات الخاصة بها
وليست البيانات الفعلية الموجودة في الجدول
حاليًا جدول Students فارغ ولا يحتوي على أي بيانات
سنتعلم في المقالة القادمة كيفية إضافة بيانات إلى هذا الجدول باستخدام الأمر INSERT

لكن الآن نحن فقط ننشيء الجدول ونحدد الاعمدة ونوع كل عمود

على أي حال، عندما تتأمل في الجدول الذي أنشأناه، وترى المعلومات التي ظهرت لنا من خلال الأمر DESCRIBE
ستجد الاعمدة التي قمنا بتحديدها، ونوع كل عمود، وما إذا كان يمكن أن يكون فارغًا (NULL) أم لا

لكن لاحظ وجود معلومات مثل Null, Key, Default, و Extra
هذه معلومات إضافية عن كل عمود:

  • Field: اسم العمود
  • Type: نوع البيانات للعمود، مثل INT أو VARCHAR(n) أو غيرها من الأنواع التي سنتعرف عليها لاحقًا
  • Null: تشير إلى ما إذا كان العمود يمكن أن يكون فارغًا (YES) أو لا (NO)
    والـ Null كمعنى في لغة الـ SQL أو حتى في لغات البرمجة بشكل عام تعني عدم وجود قيمة
  • Key: تشير إلى ما إذا كان العمود نوع من أنواع الـ Key أم لا
    مثل PRIMARY KEY أو FOREIGN KEY، وفي هذه الحالة لا يوجد أي مفتاح محدد
    وبالطبع سنعرف عن الـ Keys فيما بعد
  • Default: تشير إلى القيمة الافتراضية للعمود إذا لم يتم تحديد قيمة عند إدخال البيانات
    وبالطبع يمكننا تحديد قيمة افتراضية لكل عمود إذا أردنا ذلك
    وفي حالة عدم تحديدها ستكون NULL في حالة إذا كان العمود يقبل NULL
  • Extra: تشير إلى أي خصائص إضافية للعمود مثل auto_increment إذا كان العمود نوعه INT يتزايد تلقائيًا

حسنًا لنفكر قليلًا في ما قمنا به حتى الآن
لقد قمنا بإنشاء قاعدة بيانات باسم School، ثم أنشأنا جدولًا باسم Students داخل هذه القاعدة
ولدينا جدول يحتوي على أربعة أعمدة: id, name, age, و level

الآن سؤال مكتوب في وصف الجدول أن العمود id من نوع INT ويقبل أن يكون فارغًا أي NULL
فهل هذا منطقي ؟ الاجابة هي لا
لأن الـ id هو أشبه برقم تسلسلي لا يتكرر ويجب أن يكون مختلفًا لكل طالب
لذا يجب أن نجعل العمود id لا يقبل NULL ويكون شيء مختلف ومميز لا يتكرر
فهنا تعديل الـ id ليكون PRIMARY KEY ويقبل أن يكون NOT NULL

والـ PRIMARY KEY هو نوع من أنواع الـ Keys في الـ SQL وهو يعني أن هذا العمود هو المفتاح الأساسي للجدول
ولا يجب أن يتكرر أو يكون فارغًا NULL

لذا سنقوم بتحديث الأمر لإنشاء الجدول ليكون كالتالي:

CREATE TABLE Students (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    level VARCHAR(50) NOT NULL DEFAULT 'Beginner'
);

الآن أصبح لدينا جدول Students يحتوي على أربعة أعمدة، والعمود id هو المفتاح الأساسي للجدول ولا يقبل NULL
ولاحظ أيضًا أننا جعلنا العمود level لا يقبل NULL وأعطيناه قيمة افتراضية 'Beginner'

لكن إن نفذنا أمر CREATE TABLE Students مرة أخرى، سيظهر لنا رسالة جميلة تخبرنا أن الجدول موجود بالفعل

SQL ERROR: Table 'Students' already exists

لذلك إذا أردنا إنشاء جدول جديد بنفس الاسم، يجب علينا أولًا حذف الجدول القديم باستخدام الأمر DROP TABLE

DROP TABLE Students;

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

لذا لدينا أمر آخر وهو ALTER TABLE الذي يسمح لنا بتعديل عمود موجود بالفعل في الجدول دون الحاجة لحذفه وإعادة إنشائه

تعديل الجدول باستخدام ALTER

إذا أردنا تعديل الجدول الذي أنشأناه بالفعل، يمكننا استخدام الأمر ALTER TABLE لتعديل هيكل الجدول والأعمدة الموجودة فيه
على سبيل المثال، إذا أردنا تعديل العمود id ليكون NOT NULL و PRIMARY KEY، يمكننا استخدام الأمر التالي:

ALTER TABLE Students
MODIFY id INT NOT NULL PRIMARY KEY;

لاحظ أننا نكتب ALTER TABLE متبوعًا باسم الجدول الذي نريد تعديله، ثم نستخدم MODIFY لتعديل العمود
ثم نكتب اسم العمود الذي نريد تعديله ونحدد نوع البيانات والخصائص الجديدة له

ويمكننا أيضًا تعديل العمود level ليكون NOT NULL وإعطائه قيمة افتراضية 'Beginner'

ALTER TABLE Students
MODIFY level VARCHAR(50) NOT NULL DEFAULT 'Beginner';

الآن إذا قمنا بتنفيذ الأمر DESCRIBE Students; مرة أخرى، سنرى التغييرات التي قمنا بها:

+-------+----------------+------+-----+----------------+----------------+
| Field | Type           | Null | Key | Default        | Extra          |
+-------+----------------+------+-----+----------------+----------------+
| id    | INT            | NO   | PRI | NULL           |                |
| name  | VARCHAR(100)   | YES  |     | NULL           |                |
| age   | INT            | YES  |     | NULL           |                |
| level | VARCHAR(50)    | NO   |     | Beginner       |                |
+-------+----------------+------+-----+----------------+----------------+

لاحظ أن العمود id الآن لا يقبل NULL وأصبح مفتاحًا أساسيًا PRI وهو اختصار لـ Primary Key
وأن العمود level لا يقبل NULL وأصبح له قيمة افتراضية 'Beginner'


الأمر ALTER TABLE لا يختصر فقط على تعديل الأعمدة، بل يمكننا أيضًا إضافة أعمدة جديدة أو حذف أعمدة موجودة

على سبيل المثال، إذا أردنا إضافة عمود جديد باسم email لتخزين بريد الطالب الإلكتروني، يمكننا استخدام الأمر التالي:

ALTER TABLE Students
ADD email VARCHAR(100);

الآن إذا قمنا بتنفيذ الأمر DESCRIBE Students; مرة أخرى، سنرى العمود الجديد email:

+-------+----------------+------+-----+----------------+----------------+
| Field | Type           | Null | Key | Default        | Extra          |
+-------+----------------+------+-----+----------------+----------------+
| id    | INT            | NO   | PRI | NULL           |                |
| name  | VARCHAR(100)   | YES  |     | NULL           |                |
| age   | INT            | YES  |     | NULL           |                |
| level | VARCHAR(50)    | NO   |     | Beginner       |                |
| email | VARCHAR(100)   | YES  |     | NULL           |                |
+-------+----------------+------+-----+----------------+----------------+

وإذا أردنا حذف عمود email الذي أضفناه للتو، يمكننا استخدام الأمر التالي:

ALTER TABLE Students
DROP COLUMN email;

الآن إذا قمنا بتنفيذ الأمر DESCRIBE Students; مرة أخرى، سنرى أن العمود email قد تم حذفه:

+-------+----------------+------+-----+----------------+----------------+
| Field | Type           | Null | Key | Default        | Extra          |
+-------+----------------+------+-----+----------------+----------------+
| id    | INT            | NO   | PRI | NULL           |                |
| name  | VARCHAR(100)   | YES  |     | NULL           |                |
| age   | INT            | YES  |     | NULL           |                |
| level | VARCHAR(50)    | NO   |     | Beginner       |                |
+-------+----------------+------+-----+----------------+----------------+

ويمكننا أيضًا إعادة تسمية عمود باستخدام الأمر ALTER TABLE
لنفترض أننا نريد تغير اسم العمود name إلى full_name، يمكننا استخدام الأمر التالي

ALTER TABLE Students
RENAME COLUMN name TO full_name;

الآن إذا قمنا بتنفيذ الأمر DESCRIBE Students; مرة أخرى، سنرى أن العمود name قد تم إعادة تسميته إلى full_name:

+-----------+----------------+------+-----+----------------+----------------+
| Field     | Type           | Null | Key | Default        | Extra          |
+-----------+----------------+------+-----+----------------+----------------+
| id        | INT            | NO   | PRI | NULL           |                |
| full_name | VARCHAR(100)   | YES  |     | NULL           |                |
| age       | INT            | YES  |     | NULL           |                |
| level     | VARCHAR(50)    | NO   |     | Beginner       |                |
+-----------+----------------+------+-----+----------------+----------------+

بالتالي الأمر ALTER TABLE عدة وظائف رئيسية:

  1. تعديل الأعمدة الموجودة: مثل تغيير نوع البيانات أو إضافة خصائص جديدة
  2. إضافة أعمدة جديدة: مثل إضافة عمود جديد لتخزين بيانات إضافية
  3. حذف أعمدة موجودة: مثل حذف عمود لم يعد مطلوبًا
  4. إعادة تسمية العمود: مثل تغيير اسم عمود موجود إلى اسم آخر
  5. إضافة Constraints: مثل إضافة قيود على الأعمدة مثل NOT NULL, UNIQUE, CHECK, وغيرها
  6. حذف Constraints: مثل حذف قيود موجودة على الأعمدة
  7. إضافة Indexes: لتحسين أداء الاستعلامات على الجدول
  8. وأمور أخرى ستكتشفها لاحقًا

لاحظ أن الأمر ALTER TABLE هو أمر قوي ومرن يسمح لك بتعديل هيكل الجدول حسب احتياجاتك
مثل إضافة أعمدة جديدة أو تعديل الأعمدة الموجودة أو حذفها
وأعرف أنك لا تعرف ما هي الـ Constraints أو الـ Indexes الآن، لكن لا تقلق سنعرف عنها في المقالات القادمة

ملحوظة: قد يختلف شكل الأمر ALTER TABLE قليلًا حسب نظام إدارة قواعد البيانات الذي تستخدمه
فعلى سبيل المثال، في بعض الأنظمة الـ DBMS قد تحتاج إلى استخدام ALTER COLUMN بدلًا من MODIFY لتعديل عمود موجود
أو قد تحتاج إلى استخدام DROP COLUMN بدلًا من DROP لحذف عمود
لذا يجب عليك معرفة الـ SQL Syntax الخاص بالنظام الذي تستخدمه سواء كان MySQL أو PostgreSQL أو SQLite أو غيرها

ختامًا

في هذه المقالة، تعلمنا كيفية استخدام الأمر CREATE في SQL لإنشاء قواعد البيانات والجداول
كما تعلمنا كيفية استخدام الأمر ALTER TABLE لتعديل الجداول والأعمدة الموجودة فيها
لقد قمنا بإنشاء قاعدة بيانات باسم School، ثم أنشأنا جدولًا باسم Students يحتوي على أربعة أعمدة
كما تعلمنا كيفية تعديل الجدول باستخدام الأمر ALTER TABLE لإضافة أعمدة جديدة أو تعديل الأعمدة الموجودة أو حذفها

في المقالة القادمة، سنتعلم أكثر عن الـ SQL Constraints مثل NOT NULL, UNIQUE, CHECK

ثم في المقالات الأخرى سنتعلم كيفية إضافة البيانات إلى الجداول باستخدام الأمر INSERT وكيفية استرجاع البيانات باستخدام الأمر SELECT