إنشاء قاعدة بيانات وجداول في الـ SQL
السلام عليكم ورحمة الله وبركاته
المقدمة
في هذه المقالة، سنتناول أمر الـ 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
عدة وظائف رئيسية:
- تعديل الأعمدة الموجودة: مثل تغيير نوع البيانات أو إضافة خصائص جديدة
- إضافة أعمدة جديدة: مثل إضافة عمود جديد لتخزين بيانات إضافية
- حذف أعمدة موجودة: مثل حذف عمود لم يعد مطلوبًا
- إعادة تسمية العمود: مثل تغيير اسم عمود موجود إلى اسم آخر
- إضافة
Constraints
: مثل إضافة قيود على الأعمدة مثلNOT NULL
,UNIQUE
,CHECK
, وغيرها - حذف
Constraints
: مثل حذف قيود موجودة على الأعمدة - إضافة
Indexes
: لتحسين أداء الاستعلامات على الجدول - وأمور أخرى ستكتشفها لاحقًا
لاحظ أن الأمر 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