SQL: معالجة البيانات

مثل إدارة مستودع — استلام البضائع (INSERT)، تعديل ملصقات الرفوف (UPDATE)، مسح المنتجات منتهية الصلاحية (DELETE)، وتفريغ المستودع بالكامل (TRUNCATE) — عمليات CRUD في قاعدة البيانات هي جوهر إدارة البيانات اليومية. تعلم تشغيل البيانات بشكل آمن أهم من تعلم العمليات نفسها.


1. المفاهيم الأساسية

المفهوم الوصف
INSERT INTO إدراج بيانات جديدة في جدول، يدعم الإدراج الفردي ومتعدد الصفوف
UPDATE ... SET تعديل بيانات موجودة في جدول، يجب استخدام WHERE لتحديد النطاق
DELETE FROM حذف صفوف محددة من جدول، يجب استخدام WHERE لتحديد النطاق
TRUNCATE TABLE مسح جميع البيانات من جدول بسرعة، أسرع من DELETE لكنه أكثر خطورة
عادات التشغيل الآمن قبل تنفيذ DELETE/UPDATE، استخدم SELECT لتأكيد نطاق التأثير
⚠️ تحذير أساسي: UPDATE و DELETE بدون WHERE سيؤثران على جميع الصفوف في الجدول! هذا هو الخطأ الكارثي الأكثر شيوعًا الذي يرتكبه المبتدئون.



2. بناء الجملة الأساسي

(1) INSERT INTO — إدراج البيانات

SQL
-- إدراج صف واحد (تحديد الأعمدة)
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);
💡 نصيحة: يُوصى بشدة بتحديد أسماء الأعمدة. لا تعتمد على الترتيب الافتراضي للأعمدة. إذا تغير هيكل الجدول (مثل إضافة أعمدة جديدة)، قد تُخطئ جمل INSERT بدون أسماء أعمدة أو تُدرج بيانات غير صحيحة.

(2) UPDATE — تحديث البيانات

SQL
-- تحديث صفوف محددة
UPDATE table_name
SET column1 = new_value1, column2 = new_value2
WHERE condition;

-- تحديث بتعبيرات
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;
💡 نصيحة: قبل تنفيذ UPDATE، استخدم SELECT لتأكيد أي الصفوف يطابقها شرط WHERE. على سبيل المثال، نفّذ أولاً SELECT * FROM employees WHERE department_id = 1; لمعرفة عدد الصفوف المتأثرة.

(3) DELETE — حذف البيانات

SQL
-- حذف صفوف محددة
DELETE FROM table_name
WHERE condition;

-- حذف جميع الصفوف (صف بصف، يحتفظ بهيكل الجدول)
DELETE FROM table_name;
💡 نصيحة: البيانات المحذوفة يمكن استعادتها عبر تراجع المعاملة (إذا كانت ضمن معاملة)، لكن لا يمكن استعادتها بعد الالتزام. نمِّ العادة: SELECT أولاً، ثم DELETE.

(4) TRUNCATE — مسح الجدول

SQL
-- مسح الجدول بالكامل (يحتفظ بهيكل الجدول)
TRUNCATE TABLE table_name;
💡 نصيحة: TRUNCATE في SQLite يعادل DELETE FROM table_name (SQLite لا يدعم صيغة TRUNCATE). في MySQL/PostgreSQL، TRUNCATE أسرع بكثير من DELETE لأنه لا يحذف صف بصف ويُعيد تعيين معرّف الزيادة التلقائية.

(5) مقارنة INSERT و DELETE و TRUNCATE

العملية التأثير قابل للتراجع إعادة تعيين معرّف الزيادة التلقائية السرعة
INSERT إدراج صفوف جديدة
DELETE حذف صف بصف (يمكن استخدام WHERE) بطيء
TRUNCATE مسح الجدول بالكامل سريع


3. أمثلة الشيفرة

▶ مثال: إدراج بيانات الموظف والقسم (الصعوبة ⭐)

إدراج البيانات الأولية في جداول الأقسام والموظفين.

SQL
-- إدراج بيانات الأقسام أولاً
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;
▶ جرّب الكود

الإخراج:

TEXT 📖 للعرض فقط
id  name         location
--  -----------  ----------
1   Engineering  New York
2   Marketing    Los Angeles
3   Finance      New York

▶ مثال: تحديث آمن لرواتب الموظفين (الصعوبة ⭐⭐)

ارفع راتب جميع موظفي قسم الهندسة بنسبة 10%. أكد أولاً، ثم نفّذ.

SQL
-- الخطوة 1: استخدم SELECT لتأكيد نطاق التأثير
SELECT name, salary
FROM employees
WHERE department_id = 1;
▶ جرّب الكود

قبل التحديث:

TEXT 📖 للعرض فقط
name    salary
------  --------
John    15000.00
Jane    18000.00
SQL
-- الخطوة 2: نفّذ التحديث بعد التأكيد
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;

-- الخطوة 3: التحقق من نتائج التحديث
SELECT name, salary
FROM employees
WHERE department_id = 1;

بعد التحديث:

TEXT 📖 للعرض فقط
name    salary
------  --------
John    16500.00
Jane    19800.00

▶ مثال: مقارنة عمليات الحذف والمسح (الصعوبة ⭐⭐⭐)

قارن سلوك DELETE و TRUNCATE.

SQL
-- إنشاء جدول اختبار مؤقت
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;
▶ جرّب الكود

الإخراج:

TEXT 📖 للعرض فقط
id  name
--  ----
1   A
3   C
SQL
-- مسح البيانات المتبقية باستخدام DELETE
DELETE FROM test_delete;

-- إدراج بيانات جديدة وملاحظة معرّف الزيادة التلقائية
INSERT INTO test_delete (name) VALUES ('D');

SELECT * FROM test_delete;

الإخراج (لاحظ أن ID يبدأ من 4؛ لم يتم إعادة تعيين معرّف الزيادة التلقائية):

TEXT 📖 للعرض فقط
id  name
--  ----
4   D
💡 في MySQL، إذا استخدمت TRUNCATE TABLE test_delete; لمسح الجدول، سيبدأ ID من 1 عند إدراج بيانات جديدة.



4. سيناريوهات التطبيق الشائعة

(1) السيناريو 1: استيراد بيانات مجمعة

استيراد مجمع من جدول مؤقت أو مصدر بيانات خارجي:

SQL
-- نسخ الموظفين أصحاب الرواتب المرتفعة إلى جدول احتياطي
INSERT INTO employees_backup (name, department_id, salary, hire_date)
SELECT name, department_id, salary, hire_date
FROM employees
WHERE salary > 15000;

(2) السيناريو 2: تحديث مجمع مشروط

تعديل البيانات تحت شروط محددة:

SQL
-- رفع راتب الموظفين الذين التحقوا منذ أكثر من 3 سنوات بنسبة 5%
UPDATE employees
SET salary = salary * 1.05
WHERE hire_date < DATE('now', '-3 years');


❓ أسئلة شائعة

س كل من DELETE و TRUNCATE يمكنهما مسح الجدول. أيهما أستخدم؟
ج إذا كنت تريد مسح الجدول بالكامل ولا تهتم بمعرّف الزيادة التلقائية، استخدم TRUNCATE (أسرع). إذا كنت تريد حذف بيانات جزئية أو تريد الحفاظ على القدرة على التراجع، استخدم DELETE. في التطوير اليومي، DELETE أكثر أمانًا؛ TRUNCATE يُستخدم عادة فقط عند تهيئة بيانات الاختبار.
س ماذا لو لم أريد ملء أعمدة معينة أثناء INSERT؟
ج ببساطة احذفها من قائمة أعمدة INSERT. ستستخدم هذه الأعمدة قيمها الافتراضية (DEFAULT) أو NULL. على سبيل المثال، INSERT INTO employees (name, salary) VALUES ('New Employee', 10000); — سيكون department_id و hire_date بقيمة NULL.
س هل SQLite يدعم TRUNCATE؟
ج لا. في SQLite، استخدم DELETE FROM table_name; بدلاً من ذلك. التأثير هو نفسه، لكن معرّف الزيادة التلقائية لن يُعاد تعيينه. لإعادة تعيين معرّف الزيادة التلقائية، نفّذ DELETE FROM sqlite_sequence WHERE name='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 للتأكيد قبل كل خطوة:

  1. زيادة سعر جميع المنتجات whose مخزونها أقل من 100 بنسبة 5%
  2. زيادة مخزون منتجات فئة "Accessory" بمقدار 50
  3. حذف المنتجات whose سعرها أقل من 2000

(3) التمرين 3 (⭐⭐⭐)

محاكاة عملية "إيقاف منتج":

  1. انسخ المنتجات whose مخزونها = 0 من جدول products إلى جدول جديد products_offline (أنشئ الجدول أولاً)
  2. احذف هذه المنتجات نفدت المخزون من جدول products
  3. تحقق من صحة البيانات في كلا الجدولين


5. الدرس التالي

👉 05-data-types - أنواع البيانات

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%