SQL: إنشاء وإدارة قواعد البيانات
إنشاء قاعدة بيانات
قبل أن تتمكن من تخزين البيانات، تحتاج إلى إنشاء قاعدة بيانات. عبارة CREATE DATABASE تنشئ قاعدة بيانات جديدة.
الصيغة الأساسية
CREATE DATABASE database_name;
مثال: إنشاء قاعدة بيانات
CREATE DATABASE my_shop;
اصطلاحات التسمية:
- استخدم أحرف صغيرة
- استخدم شرطات سفلية بدلاً من المسافات:
my_shopوليسMy Shop - كن وصفياً:
ecommerce_dbأفضل منdb1 - تجنب الأحرف الخاصة والكلمات المحجوزة
إنشاء قاعدة بيانات إذا لم تكن موجودة
لتجنب الأخطاء إذا كانت قاعدة البيانات موجودة بالفعل، استخدم IF NOT EXISTS:
CREATE DATABASE IF NOT EXISTS my_shop;
مجموعة الأحرف والترتيب
حدد ترميز الأحرف للتعامل الصحيح مع الأحرف الدولية:
CREATE DATABASE my_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
خيارات مجموعة الأحرف
- utf8mb4: موصى به للدعم الكامل لـ Unicode (الرموز التعبيرية، الأحرف الدولية)
- utf8: Unicode الأساسي (دعم محدود للرموز التعبيرية)
- latin1: أحرف أوروبا الغربية فقط
Collation يحدد كيفية مقارنة النص وفرزه:
- utf8mb4_unicode_ci: غير حساس لحالة الأحرف، فرز دقيق
- utf8mb4_bin: حساس لحالة الأحرف، مقارنة ثنائية
تحديد قاعدة بيانات
قبل العمل مع الجداول، تحتاج إلى تحديد قاعدة البيانات المراد استخدامها:
USE my_shop;
عرض قواعد البيانات
قائمة بجميع قواعد البيانات
SHOW DATABASES;
مثال على المخرجات:
+--------------------+ | Database | +--------------------+ | information_schema | | my_shop | | mysql | | performance_schema | +--------------------+
إظهار قاعدة البيانات الحالية
SELECT DATABASE();
إنشاء الجداول
يتم إنشاء الجداول داخل قاعدة البيانات باستخدام عبارة CREATE TABLE.
هيكل الجدول الأساسي
CREATE TABLE table_name (
column1 datatype constraints,
column2 datatype constraints,
column3 datatype constraints
);
مثال: جدول المستخدمين
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
فهم قيود الأعمدة
القيود الشائعة
- PRIMARY KEY: يحدد كل صف بشكل فريد (تلقائياً NOT NULL)
- AUTO_INCREMENT: ينشئ أرقاماً متسلسلة تلقائياً
- NOT NULL: العمود لا يمكن أن يحتوي على قيم NULL
- UNIQUE: يجب أن تكون جميع القيم في العمود مختلفة
- DEFAULT: يحدد قيمة افتراضية إذا لم يتم توفير أي قيمة
- FOREIGN KEY: يرتبط بجدول آخر (سنغطيه لاحقاً)
مثال: جدول المنتجات
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
category VARCHAR(50),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
DECIMAL للأموال: استخدم دائماً DECIMAL للقيم النقدية، وليس FLOAT أو DOUBLE. DECIMAL يوفر دقة بالضبط، بينما أنواع الفاصلة العائمة يمكن أن تسبب أخطاء تقريب.
مثال: DECIMAL(10, 2) = 10 أرقام إجمالي، 2 بعد الفاصلة (الحد الأقصى: 99999999.99)
مثال: جدول الطلبات مع مفتاح خارجي
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
total_amount DECIMAL(10, 2) NOT NULL,
status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
إجراءات المفتاح الخارجي
- ON DELETE CASCADE: حذف الطلبات عند حذف المستخدم
- ON DELETE SET NULL: تعيين user_id إلى NULL عند حذف المستخدم
- ON DELETE RESTRICT: منع حذف المستخدم إذا كانت الطلبات موجودة
- ON UPDATE CASCADE: تحديث المفتاح الخارجي إذا تغير المفتاح المشار إليه
إنشاء جدول إذا لم يكن موجوداً
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL
);
عرض الجداول
قائمة بجميع الجداول في قاعدة البيانات الحالية
SHOW TABLES;
مثال على المخرجات:
+-------------------+ | Tables_in_my_shop | +-------------------+ | orders | | products | | users | +-------------------+
عرض هيكل الجدول
DESCRIBE users; -- أو DESC users; -- أو SHOW COLUMNS FROM users;
مثال على المخرجات:
+------------+--------------+------+-----+-------------------+ | Field | Type | Null | Key | Default | +------------+--------------+------+-----+-------------------+ | id | int(11) | NO | PRI | NULL | | username | varchar(50) | NO | UNI | NULL | | email | varchar(100) | NO | UNI | NULL | | password | varchar(255) | NO | | NULL | | created_at | timestamp | NO | | CURRENT_TIMESTAMP | +------------+--------------+------+-----+-------------------+
عرض عبارة إنشاء الجدول الكاملة
SHOW CREATE TABLE users;
تعديل الجداول
إضافة عمود
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
إضافة أعمدة متعددة
ALTER TABLE users ADD COLUMN address TEXT, ADD COLUMN city VARCHAR(50), ADD COLUMN country VARCHAR(50);
إضافة عمود في موضع محدد
-- إضافة بعد عمود محدد ALTER TABLE users ADD COLUMN middle_name VARCHAR(50) AFTER username; -- إضافة كأول عمود ALTER TABLE users ADD COLUMN user_id INT FIRST;
تعديل عمود
-- تغيير نوع بيانات العمود ALTER TABLE users MODIFY COLUMN phone VARCHAR(30); -- تغيير اسم ونوع العمود ALTER TABLE users CHANGE COLUMN phone phone_number VARCHAR(30);
حذف عمود
ALTER TABLE users DROP COLUMN middle_name;
تحذير: حذف عمود يحذف جميع البيانات في ذلك العمود بشكل دائم. احتفظ دائماً بنسخة احتياطية من قاعدة بياناتك قبل إجراء تغييرات هيكلية!
إضافة القيود
-- إضافة قيد UNIQUE ALTER TABLE users ADD UNIQUE (email); -- إضافة INDEX لعمليات بحث أسرع ALTER TABLE products ADD INDEX idx_category (category); -- إضافة PRIMARY KEY (إذا لم يكن موجوداً) ALTER TABLE users ADD PRIMARY KEY (id);
إعادة تسمية جدول
RENAME TABLE old_name TO new_name; -- أو ALTER TABLE old_name RENAME TO new_name;
حذف الجداول وقواعد البيانات
حذف جدول
DROP TABLE table_name; -- نسخة آمنة (بدون خطأ إذا لم يكن موجوداً) DROP TABLE IF EXISTS table_name;
إفراغ جدول (حذف جميع البيانات، الاحتفاظ بالهيكل)
TRUNCATE TABLE users;
DROP مقابل TRUNCATE مقابل DELETE
- DROP TABLE: يزيل الجدول بأكمله وجميع البيانات بشكل دائم
- TRUNCATE TABLE: يزيل جميع البيانات لكن يحتفظ بهيكل الجدول، يعيد تعيين AUTO_INCREMENT
- DELETE FROM: يزيل البيانات صفاً تلو الآخر، يمكن استخدام شرط WHERE، لا يعيد تعيين AUTO_INCREMENT
حذف قاعدة بيانات
DROP DATABASE database_name; -- نسخة آمنة DROP DATABASE IF EXISTS database_name;
منطقة خطر: DROP DATABASE يحذف قاعدة البيانات بأكملها وجميع جداولها بشكل دائم. لا يوجد تراجع! أنشئ دائماً نسخ احتياطية أولاً.
الفهارس للأداء
الفهارس تسرع استرجاع البيانات لكنها تبطئ الإدراج/التحديثات. استخدمها على الأعمدة المستخدمة بشكل متكرر في شروط WHERE و ORDER BY و JOIN.
إنشاء الفهارس
-- فهرس عمود واحد CREATE INDEX idx_username ON users(username); -- فهرس أعمدة متعددة (مركب) CREATE INDEX idx_name_category ON products(name, category); -- فهرس فريد CREATE UNIQUE INDEX idx_email ON users(email);
عرض الفهارس
SHOW INDEX FROM users;
حذف فهرس
DROP INDEX idx_username ON users; -- أو ALTER TABLE users DROP INDEX idx_username;
مثال عملي: قاعدة بيانات تجارة إلكترونية كاملة
-- إنشاء قاعدة البيانات
CREATE DATABASE IF NOT EXISTS ecommerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE ecommerce;
-- جدول المستخدمين
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
full_name VARCHAR(100),
phone VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_email (email)
);
-- جدول الفئات
CREATE TABLE categories (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL UNIQUE,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- جدول المنتجات
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
category_id INT,
name VARCHAR(200) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
image_url VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL,
INDEX idx_category (category_id),
INDEX idx_price (price)
);
-- جدول الطلبات
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
total_amount DECIMAL(10, 2) NOT NULL,
status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
shipping_address TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user (user_id),
INDEX idx_status (status)
);
-- جدول عناصر الطلب (علاقة متعدد لمتعدد)
CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);
تمرين: بناء قاعدة بيانات مدونة
أنشئ هيكل قاعدة بيانات لمنصة مدونة بهذه المتطلبات:
- قاعدة البيانات: أنشئ
blog_platformمع دعم UTF-8 - جدول المؤلفين: id, name, email (فريد), bio, created_at
- جدول المنشورات: id, author_id (مفتاح خارجي), title, content, published_at, views (افتراضي 0), created_at, updated_at
- جدول التعليقات: id, post_id (مفتاح خارجي), author_name, email, content, created_at
- جدول الوسوم: id, name (فريد)
- جدول Post_tags: post_id, tag_id (علاقة متعدد لمتعدد)
أضف فهارس مناسبة على المفاتيح الخارجية والأعمدة المبحوث عنها بشكل متكرر.
ملخص أفضل الممارسات
- استخدم دائماً
IF NOT EXISTSعند إنشاء قواعد البيانات/الجداول في السكريبتات - قم بتعيين ترميز UTF-8 (
utf8mb4) لدعم الأحرف الدولية - يجب أن يحتوي كل جدول على PRIMARY KEY مع AUTO_INCREMENT
- استخدم NOT NULL للحقول المطلوبة
- أضف الطوابع الزمنية (
created_at,updated_at) لتتبع التغييرات - استخدم DECIMAL للأموال، وليس FLOAT أو DOUBLE
- أضف فهارس على المفاتيح الخارجية والأعمدة المستعلم عنها بشكل متكرر
- استخدم اصطلاحات تسمية وصفية ومتسقة
- وثق هيكل قاعدة بياناتك
- احتفظ دائماً بنسخة احتياطية قبل إجراء تغييرات هيكلية
ما التالي؟
الآن بعد أن تعرف كيفية إنشاء وإدارة قواعد البيانات والجداول، سيغطي الدرس التالي إدراج واختيار البيانات باستخدام عبارات SQL INSERT و SELECT.