SQL: معالجة البيانات
مثل إدارة مستودع — استلام البضائع (INSERT)، تعديل ملصقات الرفوف (UPDATE)، مسح المنتجات منتهية الصلاحية (DELETE)، وتفريغ المستودع بالكامل (TRUNCATE) — عمليات CRUD في قاعدة البيانات هي جوهر إدارة البيانات اليومية. تعلم تشغيل البيانات بشكل آمن أهم من تعلم العمليات نفسها.
1. المفاهيم الأساسية
| المفهوم | الوصف |
|---|---|
INSERT INTO |
إدراج بيانات جديدة في جدول، يدعم الإدراج الفردي ومتعدد الصفوف |
UPDATE ... SET |
تعديل بيانات موجودة في جدول، يجب استخدام WHERE لتحديد النطاق |
DELETE FROM |
حذف صفوف محددة من جدول، يجب استخدام WHERE لتحديد النطاق |
TRUNCATE TABLE |
مسح جميع البيانات من جدول بسرعة، أسرع من DELETE لكنه أكثر خطورة |
| عادات التشغيل الآمن | قبل تنفيذ DELETE/UPDATE، استخدم SELECT لتأكيد نطاق التأثير |
2. بناء الجملة الأساسي
(1) INSERT INTO — إدراج البيانات
-- إدراج صف واحد (تحديد الأعمدة)
INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);
-- إدراج صف واحد (جميع الأعمدة، بترتيب إنشاء الجدول)
INSERT INTO table_name
VALUES (value1, value2, value3);
-- إدراج صفوف متعددة
INSERT INTO table_name (column1, column2)
VALUES (value1, value2),
(value3, value4),
(value5, value6);
(2) UPDATE — تحديث البيانات
-- تحديث صفوف محددة
UPDATE table_name
SET column1 = new_value1, column2 = new_value2
WHERE condition;
-- تحديث بتعبيرات
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;
SELECT * FROM employees WHERE department_id = 1; لمعرفة عدد الصفوف المتأثرة.
(3) DELETE — حذف البيانات
-- حذف صفوف محددة
DELETE FROM table_name
WHERE condition;
-- حذف جميع الصفوف (صف بصف، يحتفظ بهيكل الجدول)
DELETE FROM table_name;
(4) TRUNCATE — مسح الجدول
-- مسح الجدول بالكامل (يحتفظ بهيكل الجدول)
TRUNCATE TABLE table_name;
DELETE FROM table_name (SQLite لا يدعم صيغة TRUNCATE). في MySQL/PostgreSQL، TRUNCATE أسرع بكثير من DELETE لأنه لا يحذف صف بصف ويُعيد تعيين معرّف الزيادة التلقائية.
(5) مقارنة INSERT و DELETE و TRUNCATE
| العملية | التأثير | قابل للتراجع | إعادة تعيين معرّف الزيادة التلقائية | السرعة |
|---|---|---|---|---|
INSERT |
إدراج صفوف جديدة | ✅ | — | — |
DELETE |
حذف صف بصف (يمكن استخدام WHERE) | ✅ | ❌ | بطيء |
TRUNCATE |
مسح الجدول بالكامل | ❌ | ✅ | سريع |
3. أمثلة الشيفرة
▶ مثال: إدراج بيانات الموظف والقسم (الصعوبة ⭐)
إدراج البيانات الأولية في جداول الأقسام والموظفين.
-- إدراج بيانات الأقسام أولاً
INSERT INTO departments (name, location)
VALUES ('Engineering', 'New York'),
('Marketing', 'Los Angeles'),
('Finance', 'New York');
-- ثم إدراج بيانات الموظفين
INSERT INTO employees (name, department_id, salary, hire_date)
VALUES ('John', 1, 15000.00, '2023-01-15'),
('Jane', 1, 18000.00, '2022-06-01'),
('Bob', 2, 12000.00, '2023-03-20'),
('Alice', 3, 13000.00, '2021-11-10');
-- التحقق من نتائج الإدراج
SELECT * FROM departments;
الإخراج:
id name location
-- ----------- ----------
1 Engineering New York
2 Marketing Los Angeles
3 Finance New York
▶ مثال: تحديث آمن لرواتب الموظفين (الصعوبة ⭐⭐)
ارفع راتب جميع موظفي قسم الهندسة بنسبة 10%. أكد أولاً، ثم نفّذ.
-- الخطوة 1: استخدم SELECT لتأكيد نطاق التأثير
SELECT name, salary
FROM employees
WHERE department_id = 1;
قبل التحديث:
name salary
------ --------
John 15000.00
Jane 18000.00
-- الخطوة 2: نفّذ التحديث بعد التأكيد
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;
-- الخطوة 3: التحقق من نتائج التحديث
SELECT name, salary
FROM employees
WHERE department_id = 1;
بعد التحديث:
name salary
------ --------
John 16500.00
Jane 19800.00
▶ مثال: مقارنة عمليات الحذف والمسح (الصعوبة ⭐⭐⭐)
قارن سلوك DELETE و TRUNCATE.
-- إنشاء جدول اختبار مؤقت
CREATE TABLE test_delete (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
);
-- إدراج بيانات اختبار
INSERT INTO test_delete (name) VALUES ('A'), ('B'), ('C');
-- حذف صف محدد باستخدام DELETE
DELETE FROM test_delete WHERE name = 'B';
SELECT * FROM test_delete;
الإخراج:
id name
-- ----
1 A
3 C
-- مسح البيانات المتبقية باستخدام DELETE
DELETE FROM test_delete;
-- إدراج بيانات جديدة وملاحظة معرّف الزيادة التلقائية
INSERT INTO test_delete (name) VALUES ('D');
SELECT * FROM test_delete;
الإخراج (لاحظ أن ID يبدأ من 4؛ لم يتم إعادة تعيين معرّف الزيادة التلقائية):
id name
-- ----
4 D
TRUNCATE TABLE test_delete; لمسح الجدول، سيبدأ ID من 1 عند إدراج بيانات جديدة.
4. سيناريوهات التطبيق الشائعة
(1) السيناريو 1: استيراد بيانات مجمعة
استيراد مجمع من جدول مؤقت أو مصدر بيانات خارجي:
-- نسخ الموظفين أصحاب الرواتب المرتفعة إلى جدول احتياطي
INSERT INTO employees_backup (name, department_id, salary, hire_date)
SELECT name, department_id, salary, hire_date
FROM employees
WHERE salary > 15000;
(2) السيناريو 2: تحديث مجمع مشروط
تعديل البيانات تحت شروط محددة:
-- رفع راتب الموظفين الذين التحقوا منذ أكثر من 3 سنوات بنسبة 5%
UPDATE employees
SET salary = salary * 1.05
WHERE hire_date < DATE('now', '-3 years');
❓ أسئلة شائعة
INSERT INTO employees (name, salary) VALUES ('New Employee', 10000); — سيكون department_id و hire_date بقيمة NULL.DELETE FROM table_name; بدلاً من ذلك. التأثير هو نفسه، لكن معرّف الزيادة التلقائية لن يُعاد تعيينه. لإعادة تعيين معرّف الزيادة التلقائية، نفّذ DELETE FROM sqlite_sequence WHERE name='table_name'; بعد الحذف.📖 ملخص
- INSERT INTO يُستخدم لإدراج البيانات؛ حدد دائمًا أسماء الأعمدة؛ يدعم إدراج صفوف متعددة دفعة واحدة
- UPDATE SET يُستخدم لتحديث البيانات؛ يجب استخدام شرط WHERE، وإلا سيتم تحديث الجدول بالكامل
- DELETE FROM يُستخدم لحذف البيانات؛ يجب استخدام شرط WHERE، وإلا سيتم حذف الجدول بالكامل
- TRUNCATE TABLE يُستخدم لمسح جدول بالكامل بسرعة؛ أسرع من DELETE لكن غير قابل للتراجع
- عادات آمنة: قبل تنفيذ DELETE أو UPDATE، استخدم SELECT لتأكيد نطاق التأثير
- SQLite لا يدعم TRUNCATE؛ استخدم
DELETE FROM table_nameبدلاً من ذلك
📝 تمارين
(1) التمرين 1 (⭐)
أدرج بيانات المنتجات التالية في جدول products، ثم استعلم للتحقق:
| name | category | price | stock |
|---|---|---|---|
| iPhone 15 | Phone | 5999.00 | 100 |
| MacBook Pro | Computer | 12999.00 | 50 |
| AirPods Pro | Accessory | 1899.00 | 200 |
| iPad Air | Tablet | 4799.00 | 80 |
(2) التمرين 2 (⭐⭐)
أكمل العمليات التالية، مع كتابة SELECT للتأكيد قبل كل خطوة:
- زيادة سعر جميع المنتجات whose مخزونها أقل من 100 بنسبة 5%
- زيادة مخزون منتجات فئة "Accessory" بمقدار 50
- حذف المنتجات whose سعرها أقل من 2000
(3) التمرين 3 (⭐⭐⭐)
محاكاة عملية "إيقاف منتج":
- انسخ المنتجات whose مخزونها = 0 من جدول products إلى جدول جديد products_offline (أنشئ الجدول أولاً)
- احذف هذه المنتجات نفدت المخزون من جدول products
- تحقق من صحة البيانات في كلا الجدولين