تجاوز إلى المحتوى

تعلم MySQL من الصفر: قواعد البيانات للمبتدئين

> mysql -u root -p

تعلم MySQL من الصفر: قواعد البيانات للمبتدئين

لو بتشتغل في الويب أو البيانات ولسه قواعد البيانات بالنسبة لك صندوق أسود مخيف، المقال ده معمول ليك. شرح عملي بالعربي من أول سطر: يعني إيه قاعدة بيانات، إزاي تنشئها، وإزاي تسألها أي سؤال وتاخد الإجابة في ثانية.

من الصفرمش محتاج أي خلفية برمجية — كل مصطلح بيتشرح قبل ما يستخدم
تطبيق أولًاأكتر من 40 أمر SQL جاهز للتجربة بنفسك خطوة بخطوة
مشروع كاملنظام متجر حقيقي: تصميم الجداول والعلاقات والاستعلامات
12 مصدرًاعربي وإنجليزي موثقين بروابط مباشرة وشارات صادقة

إعلان

لو البيانات عندك مبعثرة… عندك مشكلة

تخيل موقع متجر إلكتروني بيحفظ بيانات العملاء في ملف نصي، والطلبات في ملف تاني، والمنتجات في ملف تالت. العميل غيّر رقم تليفونه — هتعدّله في كام ملف؟ الطلب رقم 500 عاوز تعرف صاحبه اشترى إيه قبل كده — هتدور فين؟ مدير المتجر عاوز يعرف أكتر منتج اتباع الشهر اللي فات — هتحسبها إزاي؟

الموضوع مش إن الحل ده “غير احترافي”. الموضوع إنه بينهار أول ما البيانات تكبر. ملف نصي فيه 10 عملاء حاجة، وملف فيه 100 ألف عميل حاجة تانية خالص: البحث بقى بطيئًا، التعديل بقى خطر، والتقارير بقت مستحيلة.

هنا بقى تدخل قاعدة البيانات (Database): مكان منظم لتخزين البيانات، بيحفظها بشكل هيكلي، ويسمح لك تسألها أسئلة معقدة وتاخد الإجابة في أجزاء من الثانية — حتى لو البيانات ملايين السجلات.

التعريف بجملة واحدة

قاعدة البيانات = مخزن منظم للبيانات + لغة استعلام (SQL) تسأله بيها أي سؤال. وMySQL هو أشهر نظام مجاني ومفتوح المصدر لإدارة قواعد البيانات دي في العالم.

ولغة الاستعلام اسمها SQL (تُنطق “سيكوال”): لغة بسيطة شبه الإنجليزية، بتكتب بيها أوامر زي “هات كل العملاء اللي من القاهرة” أو “احسب مجموع مبيعات الشهر”. وMySQL هو البرنامج اللي بيفهم اللغة دي وينفذها. الفرق مهم: SQL هي اللغة، وMySQL هو واحد من البرامج اللي بتتكلمها — زي الفرق بين اللغة العربية وبين شخص بيتكلمها.

طيب، ليه المقال ده مهم ليك؟ لأن قواعد البيانات موجودة ورا كل حاجة بتستخدمها: حسابك في أي موقع، منشوراتك، رسائلك، مشترياتك — كلها سجلات في قاعدة بيانات. ولو ناوي تشتغل ويب أو تحليل بيانات أو حتى تفهم موقعك شغال إزاي، MySQL هي أول وأهم خطوة.

إعلان

ليه MySQL بالذات؟

السوق مليان أنظمة قواعد بيانات: PostgreSQL وSQLite وOracle وSQL Server وMongoDB. فليه نبدأ بـMySQL؟ خمس أسباب عملية:

  1. مجاني ومفتوح المصدر: تنزّله وتستخدمه ببلاش تمامًا، حتى في مشاريع تجارية. مفيش ترخيص ومفيش فاتورة.
  2. ورا معظم الويب: ووردبريس — اللي شغال عليه ملايين المواقع — بيستخدم MySQL. يعني أي موقع ووردبريس في الدنيا قاعد على قاعدة بيانات MySQL. لو فهمت MySQL، فهمت العقل المدبر ورا مواقع كتير.
  3. سهل البداية: التثبيت في دقائق، والأوامر الأساسية بسيطة، والمجتمع العربي والأجنبي ضخم — أي مشكلة هتقابلك حد سألها قبلك وحلها موجود.
  4. سريع وموثوق: شركات ضخمة بتعتمد عليه في أنظمة فيها ملايين المستخدمين. اللي هتتعلمه على جهازك هو نفس التقنية اللي شغالة في الإنتاج.
  5. بوابة لباقي الأنظمة: لغة SQL واحدة تقريبًا في كل الأنظمة. اللي هتتعلمه هنا هينفعك مع PostgreSQL وSQLite وغيرهم بنسبة كبيرة جدًا.
متى تختار حاجة تانية؟

لو بتبني تطبيق موبايل بسيط ومحتاج قاعدة بيانات محلية خفيفة: SQLite أنسب. لو شغال تحليل بيانات متقدم جدًا: PostgreSQL عنده مميزات إضافية. لكن كنقطة بداية للمبتدئ، MySQL هو الاختيار الآمن والعملي — وده اللي هنمشي عليه.

وهنا نقطة تستاهل التوقف عندها: كتير من الناس بيخلطوا بين SQL وMySQL. SQL هي اللغة اللي بتكتب بيها الأوامر. MySQL هو البرنامج (نظام إدارة قواعد البيانات أو DBMS) اللي بيستقبل الأوامر دي وينفذها ويرجعلك النتيجة. لما تقول “أنا بتعلم MySQL” فأنت فعليًا بتتعلم أمرين مع بعض: لغة SQL + أداة MySQL. والأخبار الحلوة إن لغة SQL سهلة — أوامرها كلمات إنجليزية عادية زي SELECT وWHERE وORDER BY.

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

جهّز بيئة العمل في 20 دقيقة

قبل أول أمر، محتاج حاجتين: خادم MySQL (البرنامج اللي بيشغّل قواعد البيانات) وأداة تكتب فيها الأوامر وتشوف النتائج. عندك 3 طرق، اختار اللي يناسبك:

الطريقة الأولى: XAMPP (الأسهل للمبتدئين)

XAMPP حزمة مجانية بتنزّل MySQL مع خادم ويب وأداة phpMyAdmin في ضغطة واحدة. الخطوات:

  1. نزّل XAMPP من الموقع الرسمي (الرابط في قسم المصادر) وثبّته عادي زي أي برنامج.
  2. افتح لوحة تحكم XAMPP وشغّل خدمتي Apache وMySQL بزرار Start.
  3. افتح المتصفح وروح للرابط المحلي الخاص بأداة phpMyAdmin — هتلاقي واجهة رسومية كاملة تدير بيها قواعد البيانات من غير سطر أوامر واحد في البداية.

الميزة: في 10 دقائق يبقى عندك بيئة كاملة. العيب: نسخة MySQL اللي معاه أحيانًا بتكون MariaDB (قريبة جدًا من MySQL — الأوامر اللي في المقال شغالة على الاتنين).

الطريقة الثانية: التثبيت الرسمي + MySQL Workbench

نزّل MySQL Installer من الموقع الرسمي، وثبّت منه MySQL Server وMySQL Workbench — أداة رسومية احترافية من نفس الشركة: محرر أوامر ملوّن، عارض جداول، وراسم مخططات علاقات. دي الطريقة الأنضف لو ناوي تكمل بجدية.

الطريقة الثالثة: جرّب أونلاين من غير تثبيت

لو عاوز تجرب الأوامر دلوقتي حالًا من المتصفح: موقع DB Fiddle بيديك بيئة MySQL حقيقية أونلاين تكتب فيها الأوامر وتشوف النتيجة فورًا — من غير ما تنزّل أي حاجة. ممتاز للتجربة السريعة، لكن للتعلم الجاد ثبّت بيئة محلية.

نصيحة البداية

ابدأ بـXAMPP + phpMyAdmin عشان تشوف النتيجة بعينك بسرعة، وبعد أسبوع انتقل لـMySQL Workbench لما تبقى مرتاح مع الأوامر. المهم تبدأ النهاردة مش بكرة.

إعلان

أول قاعدة بيانات لك

خلينا نتفق على التسلسل الهرمي قبل أول أمر: الخادم (Server) جواه قواعد بيانات (Databases)، وكل قاعدة بيانات جواها جداول (Tables)، وكل جدول جواه صفوف (Rows) وأعمدة (Columns). زي: العمارة فيها شقق، وكل شقة فيها أوض، وكل أوضة فيها عفش.

افتح أداة الأوامر (Workbench أو phpMyAdmin تبويب SQL) واكتب أول 4 أوامر:

CREATE DATABASE my_store;
SHOW DATABASES;
USE my_store;
SHOW TABLES;

خلينا نفكك اللي حصل:

  • CREATE DATABASE my_store; — أنشأ قاعدة بيانات جديدة اسمها my_store. لاحظ الفاصلة المنقوطة في الآخر: كل أمر SQL بينتهي بيها.
  • SHOW DATABASES; — عرض كل قواعد البيانات الموجودة على الخادم. هتلاقي my_store ظهرت في القائمة.
  • USE my_store; — اختار قاعدة البيانات دي عشان نشتغل جواها. من غير الأمر ده، MySQL مش هيعرف الأوامر الجاية تخص أنهي قاعدة.
  • SHOW TABLES; — عرض الجداول جوا القاعدة المختارة. لسه فاضية، فالنتيجة هتبقى فارغة — وده طبيعي.
قواعد كتابة SQL من أول يوم

أوامر SQL مش حساسة لحالة الحروف — select زي SELECT. لكن العُرف إن الكلمات المفتاحية تتكتب كابيتال والأسماء سمول، عشان الكود يبقى مقروء. والفاصلة المنقوطة ; في نهاية كل أمر إجبارية. التزم بالعُرف ده من أول يوم وهتشكر نفسك بعدين.

ولو عاوز تمسح قاعدة بيانات (بحذر شديد): DROP DATABASE my_store; — الأمر ده بيمسح القاعدة بكل اللي جواها ومن غير سؤال تاني. هنرجع لنقطة الحذر دي في قسم الحذف.

الجداول وأنواع البيانات

الجدول هو قلب قاعدة البيانات: شبكة من الصفوف والأعمدة زي جدول الإكسل بالظبط. كل عمود له اسم ونوع بيانات محدد، وكل صف هو سجل واحد (عميل واحد، منتج واحد، طلب واحد).

قبل ما تنشئ جدول، لازم تفهم أنواع البيانات — لأن اختيار النوع الصح بيأثر على المساحة والسرعة ودقة البيانات. دي أهم الأنواع اللي هتستخدمها كل يوم:

النوع بيخزن إيه مثال إمتى تستخدمه
INT أرقام صحيحة 25، 1000، 50000 الأعمار، الكميات، المعرّفات
DECIMAL(10,2) أرقام عشرية بدقة ثابتة 199.99 الأسعار والمبالغ المالية (مش FLOAT)
VARCHAR(100) نصوص متغيرة الطول “أحمد” الأسماء، العناوين، الإيميلات
TEXT نصوص طويلة وصف منتج كامل المقالات، الوصف التفصيلي
DATE تاريخ YYYY-MM-DD تواريخ الميلاد، تواريخ الطلبات
DATETIME تاريخ + وقت YYYY-MM-DD HH:MM:SS وقت إنشاء الحساب، وقت الطلب
BOOLEAN صح / خطأ TRUE / FALSE هل الحساب مفعّل؟ هل المنتج متوفر؟

نقطة مهمة جدًا: الأسعار والمبالغ المالية تُخزن بـDECIMAL مش FLOAT. النوع FLOAT بيخزن الأرقام العشرية بشكل تقريبي، فممكن 19.99 تتحفظ 19.989999 — وده كارثي في الفلوس. DECIMAL بيحفظ الرقم بالظبط زي ما هو. دي من الأخطاء اللي بتكلف شركات فلوس حقيقية.

ودلوقتي ننشئ أول جدول — جدول العملاء:

CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    full_name VARCHAR(100) NOT NULL,
    email VARCHAR(150) UNIQUE NOT NULL,
    phone VARCHAR(20),
    city VARCHAR(50) DEFAULT 'Cairo',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

فكك الأمر سطر سطر:

  • id INT AUTO_INCREMENT PRIMARY KEY — رقم تعريفي فريد لكل عميل، بيزيد تلقائيًا مع كل عميل جديد (1، 2، 3…). كلمة PRIMARY KEY معناها إن العمود ده هو الهوية الفريدة للصف — هنتكلم عنها بالتفصيل في القسم الجاي.
  • full_name VARCHAR(100) NOT NULL — اسم العميل، نص بحد أقصى 100 حرف، وNOT NULL معناها إن الخانة دي إجبارية: مينفعش تضيف عميل من غير اسم.
  • email VARCHAR(150) UNIQUE NOT NULL — الإيميل فريد (UNIQUE): مينفعش عميلين بنفس الإيميل، وإجباري.
  • phone VARCHAR(20) — رقم التليفون كنص مش رقم! ليه؟ لأنك مش هتعمل عليه عمليات حسابية، وفيه أصفار في الأول وعلامات زي +. دي قاعدة عامة: أي رقم مش هتحسب بيه، خزّنه كنص.
  • city VARCHAR(50) DEFAULT ‘Cairo’ — لو مدخلتش مدينة، القيمة الافتراضية تبقى Cairo.
  • created_at DATETIME DEFAULT CURRENT_TIMESTAMP — وقت إنشاء السجل بيتحط تلقائيًا.
القيود (Constraints) باختصار

القيود هي “قوانين” بتحطها على الأعمدة عشان البيانات تفضل سليمة: NOT NULL (الخانة إجبارية)، UNIQUE (القيمة متفردة)، DEFAULT (قيمة افتراضية)، PRIMARY KEY (الهوية الفريدة). قاعدة البيانات نفسها بترفض أي بيانات مخالفة — فالغلط بيتمسك على الباب مش بعد ما يدخل.

عشان تشوف هيكل الجدول اللي أنشأته: DESCRIBE customers; — هيعرض لك كل عمود ونوعه والقيود بتاعته في جدول منظم.

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

دي النقطة اللي بتفرّق بين اللي “يعرف أوامر SQL” واللي “يفهم قواعد بيانات”. الفكرة كلها في كلمتين: متكررش البيانات.

تخيل جدول طلبات فيه اسم العميل وعنوانه ورقم تليفونه مكتوبين مع كل طلب. العميل طلب 50 مرة — اسمه اتكتب 50 مرة. غيّر رقم تليفونه؟ لازم تعدّل 50 صف. نسيت صف؟ بقت البيانات متناقضة: نفس العميل برقمين مختلفين. الكارثة دي اسمها تكرار البيانات (Redundancy)، والحل هو العلاقات (Relationships).

الحل: جدول العملاء فيه بيانات العميل مرة واحدة، وجدول الطلبات فيه عمود customer_id بيشاور على العميل صاحب الطلب. رقم صغير بيربط الجدولين من غير تكرار.

المفتاح الأساسي (Primary Key)

هو العمود اللي بيميز كل صف عن التاني بشكل فريد ومضمون: رقم العميل، رقم المنتج، رقم الطلب. شروطه: فريد (مفيش قيمتين زي بعض)، مش فارغ (NOT NULL إجباري)، ثابت (مينفعش يتغير). عادة بنستخدم رقم تلقائي AUTO_INCREMENT.

المفتاح الأجنبي (Foreign Key)

هو عمود في جدول بيشاور على المفتاح الأساسي في جدول تاني — وهو اللي بيعمل العلاقة. مثال: عمود customer_id في جدول الطلبات بيشاور على عمود id في جدول العملاء.

خلينا ننشئ جدول المنتجات وجدول الطلبات بالعلاقات:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(150) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0
);

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    total DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

CREATE TABLE order_items (
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
);

customers id (PK) full_name email orders id (PK) customer_id (FK) total products id (PK) name price order_items order_id + product_id 1 : ∞ ∞ : ∞

المخطط بيوضح العلاقات: عميل واحد له طلبات كتير (واحد-للكثير)، والطلب الواحد فيه منتجات كتير والمنتج الواحد موجود في طلبات كتير — فمحتاجين جدول وسيط order_items (كثير-للكثير). دي أشهر 3 أنواع علاقات وهتقابلهم في كل تصميم.

الخلاصة اللي تحفظها

صمم جداولك بحيث كل معلومة تتخزن في مكان واحد بس، واربط الجداول بالمفاتيح الأجنبية. التصميم الصح قبل الكود الصح — 10 دقائق تخطيط على ورقة بتوفّر ساعات تعديل بعدين.

إعلان

إدخال البيانات: INSERT

عندنا جداول فاضية. وقت ملئها. أمر الإدخال بسيط ومباشر:

INSERT INTO customers (full_name, email, phone, city)
VALUES ('Mona Adel', 'mona@example.com', '01001234567', 'Cairo');

INSERT INTO customers (full_name, email, phone, city)
VALUES ('Karim Samy', 'karim@example.com', '01112345678', 'Alexandria'),
       ('Sara Nabil', 'sara@example.com', '01223456789', 'Giza');

ملاحظات مهمة:

  • مدخلناش عمود id — لأنه AUTO_INCREMENT فبيتولد تلقائيًا.
  • مدخلناش created_at — لأنه DEFAULT CURRENT_TIMESTAMP فبيتحط تلقائيًا.
  • الأمر التاني بيدخل 3 صفوف مرة واحدة — أسرع وأنضف من 3 أوامر منفصلة.
  • النصوص بين علامتي تنصيص مفردة ‘ ‘، والأرقام من غير تنصيص.

وندخل منتجات وطلبات عشان نجهز بيانات للتجربة:

INSERT INTO products (name, price, stock) VALUES
('Wireless Mouse', 349.99, 50),
('Mechanical Keyboard', 1299.00, 30),
('USB-C Hub', 599.50, 40),
('Laptop Stand', 450.00, 25);

INSERT INTO orders (customer_id, total) VALUES
(1, 1648.99),
(2, 599.50),
(1, 450.00);

INSERT INTO order_items (order_id, product_id, quantity) VALUES
(1, 1, 1),
(1, 2, 1),
(2, 3, 1),
(3, 4, 1);

جرّب بنفسك: لو حاولت تدخل طلب بـcustomer_id = 99 (عميل مش موجود)، قاعدة البيانات هترفض بسبب المفتاح الأجنبي. دي قوة القيود: الغلط بيتمسك لحظة الإدخال مش بعد شهور لما تكتشف إن التقارير كلها غلط.

انتبه

الإيميل عليه قيد UNIQUE — لو حاولت تدخل نفس الإيميل مرتين هيرفض. ولو نسيت عمود NOT NULL زي full_name هيرفض برضه. رسائل الخطأ دي صديقتك مش عدوك: هي اللي بتحمي بياناتك.

قلب الموضوع: SELECT

لو هتتعلم أمر واحد بس من المقال ده كله، يبقى SELECT. ده الأمر اللي هتستخدمه 80% من وقتك: استخراج البيانات والإجابة على الأسئلة. والقاعدة الذهبية: SELECT مش بيغيّر أي حاجة في البيانات — بيقرأ بس. فجرّب براحتك من غير خوف.

أبسط صورة:

SELECT * FROM customers;

النجمة * معناها “كل الأعمدة”. النتيجة: كل العملاء بكل بياناتهم. لكن في الشغل الحقيقي، حدد الأعمدة اللي محتاجها بس:

SELECT full_name, email, city FROM customers;

ليه التحديد أفضل؟ ثلاث أسباب: أسرع (بيانات أقل بتتنقل)، أوضح (النتيجة مركزة على سؤالك)، وأأمن (مش كل مرة تعرض بيانات حساسة). عادة سيئة منتشرة إن الناس تستخدم * في كل حاجة — اكسرها من أول يوم.

تسمية الأعمدة بالأسماء المستعارة (Aliases)

SELECT full_name AS customer_name, city AS customer_city
FROM customers;

كلمة AS بتدي اسمًا مؤقتًا للعمود في النتيجة بس — مش بتغيّر حاجة في الجدول. مفيدة جدًا لما تعمل حسابات أو تدمج أعمدة.

حسابات داخل الاستعلام

SQL مش بس بيعرض بيانات — بيحسب كمان:

SELECT name, price, price * 1.14 AS price_with_tax
FROM products;

SELECT full_name,
       CONCAT(full_name, ' - ', city) AS label
FROM customers;

الأمر الأول حسب السعر شامل الضريبة (افتراض 14%) وسمّى العمود price_with_tax. التاني دمج الاسم والمدينة بدالة CONCAT. كل ده بيحصل لحظة الاستعلام من غير ما يمس البيانات الأصلية.

عقلية الاستعلام الصح

فكّر في SELECT كسؤال بتسأله لقاعدة البيانات: إيه اللي عاوزه؟ (الأعمدة) منين؟ (الجدول) بشرط إيه؟ (WHERE — القسم الجاي) مترتب إزاي؟ (ORDER BY). كل جزء إضافي بيضيّق السؤال ويقرّبك للإجابة.

إعلان

الشروط: WHERE بكل تفاصيلها

SELECT لوحده بيجيب كل الصفوف. WHERE هي اللي بتخليك تجيب “الصفوف اللي تحقق شرط معين” — وهنا بتبدأ الأسئلة الحقيقية.

SELECT full_name, city FROM customers WHERE city = 'Cairo';

SELECT * FROM products WHERE price > 500;

SELECT * FROM products WHERE price >= 400 AND price <= 700;

SELECT * FROM customers WHERE city = 'Cairo' OR city = 'Giza';

عوامل المقارنة اللي هتستخدمها يوميًا:

العامل المعنى مثال
= يساوي WHERE city = 'Cairo'
<> أو != لا يساوي WHERE city <> 'Cairo'
> ، < أكبر / أصغر WHERE price > 500
>= ، <= أكبر أو يساوي / أصغر أو يساوي WHERE stock <= 10
BETWEEN بين قيمتين (شامل) WHERE price BETWEEN 400 AND 700
IN ضمن قائمة WHERE city IN ('Cairo','Giza','Alexandria')
LIKE مطابقة نمط نصي WHERE full_name LIKE 'M%'
IS NULL قيمة فارغة WHERE phone IS NULL

نقطتين بيوقع فيهم المبتدئين:

  • الأولوية المنطقية: AND بيتنفذ قبل OR. فـ WHERE city = 'Cairo' OR city = 'Giza' AND stock > 0 معناها "القاهرة، أو (الجيزة والمخزون متوفر)" — مش اللي في دماغك غالبًا. الحل: استخدم الأقواس دائمًا لما تدمج AND وOR: WHERE (city = 'Cairo' OR city = 'Giza') AND stock > 0.
  • NULL مش قيمة: مينفعش تقول WHERE phone = NULL — دايمًا غلط. الصح IS NULL أو IS NOT NULL. القيمة الفارغة في قواعد البيانات "غير معروفة" مش "صفر" ومش "نص فاضي".
SELECT name, price FROM products
WHERE (price BETWEEN 400 AND 1300)
  AND stock > 0
  AND name NOT LIKE '%Stand%';

الأمر ده بيجيب المنتجات اللي سعرها بين 400 و1300، ومخزونها متوفر، واسمها مش فيه كلمة Stand. لاحظ NOT LIKE للنفي، وعلامة % اللي معناها "أي حروف".

ترتيب وتصفية النتائج

جبت البيانات بالشرط الصح — دلوقتي رتّبها واعرض منها اللي محتاجه بس.

الترتيب: ORDER BY

SELECT name, price FROM products ORDER BY price ASC;

SELECT name, price FROM products ORDER BY price DESC;

SELECT full_name, city FROM customers
ORDER BY city ASC, full_name DESC;
  • ASC تصاعدي (من الصغير للكبير، أو أبجدي) — وده الافتراضي لو مكتبتش حاجة.
  • DESC تنازلي (من الكبير للصغير).
  • ممكن ترتب بأكتر من عمود: الأولوية للعمود الأول، والتعادل يتفك بالتاني.

تحديد العدد: LIMIT

SELECT name, price FROM products
ORDER BY price DESC
LIMIT 3;

SELECT * FROM orders
ORDER BY order_date DESC
LIMIT 5 OFFSET 5;

الأول: أغلى 3 منتجات. التاني: "الصفحة التانية" من الطلبات — تخطّي 5 واعرض 5. دي أساس فكرة ترقيم الصفحات (Pagination) في أي موقع: الصفحة رقم 2 معناها LIMIT 10 OFFSET 10.

القيم المميزة: DISTINCT

SELECT DISTINCT city FROM customers;

لو عندك 1000 عميل من 5 مدن، الأمر ده بيرجع الـ5 مدن بس من غير تكرار. مفيد جدًا لعمل قوائم وفلاتر.

البحث النصي: LIKE

SELECT full_name FROM customers WHERE full_name LIKE 'Mo%';
SELECT name FROM products WHERE name LIKE '%Hub%';
SELECT full_name FROM customers WHERE full_name LIKE '____';
  • % = أي عدد من الحروف (حتى صفر).
  • _ (شرطة سفلية) = حرف واحد بالظبط. المثال التالت بيجيب الأسماء المكونة من 4 حروف بالظبط.
تمرين سريع

اكتب استعلام يجيب أسماء وأسعار المنتجات اللي سعرها أكبر من 400، مترتبة من الأرخص للأغلى، وأول 2 بس. الإجابة: SELECT name, price FROM products WHERE price > 400 ORDER BY price ASC LIMIT 2; — لو كتبتها من دماغك من غير ما ترجع، انت ماشي صح.

التعديل والحذف: بحذر شديد

لحد دلوقتي كل اللي عملناه قراءة وإضافة — آمنين. UPDATE وDELETE مختلفين: بيغيّروا بيانات موجودة فعلًا. والقاعدة المقدسة هنا: مفيش UPDATE أو DELETE من غير WHERE — إلا لو قاصد فعلًا تغيّر كل الصفوف.

UPDATE products
SET price = 379.99, stock = 45
WHERE id = 1;

UPDATE customers
SET city = 'New Cairo'
WHERE city = 'Cairo';

الأول عدّل سعر ومخزون منتج واحد (id = 1). التاني عدّل كل عملاء القاهرة لمدينة جديدة — ده استخدام شرعي لـUPDATE على صفوف كتير بشرط واضح.

أخطر سطر في المقال

UPDATE products SET price = 0; — من غير WHERE — هيصفّر أسعار كل المنتجات في ثانية واحدة. وDELETE FROM customers; هيمسح كل العملاء. مفيش "تراجع" ومفيش سلة مهملات. عادة المحترفين: اكتب الـWHERE الأول، جرّبه بـSELECT، وبعدين نفّذ التعديل.

DELETE FROM order_items
WHERE order_id = 3 AND product_id = 4;

DELETE FROM products
WHERE stock = 0 AND id NOT IN (SELECT product_id FROM order_items);

الأول مسح صنف واحد من طلب واحد (المفتاح المركب). التاني مسح المنتجات اللي مخزونها صفر ومش موجودة في أي طلب — باستخدام استعلام فرعي (Subquery): استعلام جوا استعلام. الفكرة: "هات المنتجات اللي الـid بتاعها مش موجود في قائمة المنتجات المطلوبة".

الاستعلامات الفرعية (Subqueries)

SELECT full_name FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);

الاستعلام الداخلي بيجيب أرقام العملاء اللي طلباتهم فوق 1000، والخارجي بيجيب أسماءهم. اقرأها من جوا لبرا وهتفهمها فورًا. والبديل الأنضف غالبًا هو JOIN — اللي هو قسمّنا الجاي.

إعلان

ربط الجداول: JOIN

وصلنا لأقوى سلاح في SQL. فاكر لما قسمنا البيانات على جداول مربوطة بمفاتيح أجنبية؟ JOIN هو الأمر اللي بيرجع يجمعها تاني في نتيجة واحدة. من غيره، التقسيم ده كان هيبقى عديم الفايدة.

السؤال: "هات أسماء العملاء مع إجمالي طلباتهم" — الاسم في جدول customers والإجمالي في جدول orders. الحل:

SELECT customers.full_name, orders.id, orders.total
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;

فكك الأمر: من جدول customers، اربط جدول orders حيث رقم العميل في الطلب يساوي رقم العميل في جدول العملاء. النتيجة: كل طلب جنبه اسم صاحبه. الشرط بعد ON هو "قاعدة الربط" — غالبًا مفتاح أجنبي يساوي مفتاح أساسي.

أنواع الربط الأربعة

النوع بيرجع إيه مثال عملي
INNER JOIN الصفوف المشتركة فقط (اللي لها مقابل في الجدولين) العملاء اللي عندهم طلبات فعلًا
LEFT JOIN كل صفوف الجدول الأيسر + المقابل إن وُجد كل العملاء، حتى اللي مطلبوش (طلباتهم تظهر فارغة)
RIGHT JOIN كل صفوف الجدول الأيمن + المقابل إن وُجد كل الطلبات حتى لو العميل اتمسح
CROSS JOIN كل التركيبات الممكنة (نادر الاستخدام) حالات خاصة جدًا
SELECT c.full_name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
ORDER BY c.full_name;

هنا استخدمنا أسماء مستعارة للجداول (c وo) عشان نختصر — ضرورية لما الجداول أسماؤها طويلة. والـLEFT JOIN هيجيب كل العملاء: اللي عنده طلبات هتظهر طلباته، واللي معندوش هتظهر خانات الطلب فارغة (NULL). ده بالظبط اللي تحتاجه لما تسأل "مين العملاء اللي مطلبوش خالص؟" — ضيف WHERE o.id IS NULL.

ربط 3 جداول: السؤال الحقيقي

"هات اسم العميل واسم المنتج والكمية لكل صنف اتباع": البيانات متوزعة على 4 جداول. الحل ربط متسلسل:

SELECT c.full_name AS customer,
       p.name AS product,
       oi.quantity,
       (p.price * oi.quantity) AS line_total
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
ORDER BY o.id;

امشي مع السلسلة: عميل ← طلباته ← أصناف كل طلب ← بيانات كل منتج. كل JOIN بيضيف جدول للصورة. وحسبنا إجمالي السطر (السعر × الكمية) في نفس الاستعلام. ده شكل الاستعلامات الحقيقية في أي نظام — ولو فهمت المثال ده، فهمت 70% من شغل قواعد البيانات اليومي.

قاعدة ذهبية للـJOIN

لو الاستعلام رجع صفوف أكتر من المتوقع أو أرقام مضروبة (الإجمالي طالع ضعفين)، المشكلة غالبًا في شرط الـON: إما ناقص أو رابط غلط. راجع الـON قبل ما تشك في أي حاجة تانية.

الدوال التجميعية وGROUP BY

لحد دلوقتي بنسأل عن صفوف. لكن أسئلة الإدارة مختلفة: "كام عميل عندنا؟" "إيه إجمالي المبيعات؟" "متوسط سعر المنتجات؟" — دي أسئلة عن مجموعات، وإجابتها دوال تجميعية:

SELECT COUNT(*) AS total_customers FROM customers;
SELECT SUM(total) AS revenue FROM orders;
SELECT AVG(price) AS avg_price FROM products;
SELECT MIN(price) AS cheapest, MAX(price) AS most_expensive FROM products;
  • COUNT(*) — عدد الصفوف. وCOUNT(email) بيعد الصفوف اللي الإيميل فيها مش فارغ.
  • SUM / AVG / MIN / MAX — المجموع والمتوسط والأصغر والأكبر. بتشتغل على الأعمدة الرقمية.

لكن السؤال الأقوى: "إجمالي المبيعات لكل عميل" — يعني قسّم الطلبات حسب العميل واجمع كل مجموعة لوحدها. هنا ييجي GROUP BY:

SELECT c.full_name,
       COUNT(o.id) AS orders_count,
       SUM(o.total) AS total_spent
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.full_name
ORDER BY total_spent DESC;

المنطق: اجمع الصفوف اللي لها نفس العميل في مجموعة واحدة، وبعدين طبّق الدوال على كل مجموعة. النتيجة: كل عميل وعدد طلباته وإجمالي ما صرفه — مرتبة من الأعلى للأقل. ده بالظبط تقرير "أفضل العملاء" اللي أي مدير متجر بيطلبه.

التصفية بعد التجميع: HAVING

WHERE بتصفّي الصفوف قبل التجميع. HAVING بتصفّي المجموعات بعد التجميع. الفرق مهم:

SELECT c.full_name, SUM(o.total) AS total_spent
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.full_name
HAVING total_spent > 1000;

"العملاء اللي إجمالي مشترياتهم فوق 1000" — مينفعش بـWHERE لأن total_spent مش موجود إلا بعد التجميع. القاعدة: شرط على صف → WHERE. شرط على نتيجة دالة تجميعية → HAVING.

الترتيب الكامل لأمر SELECT

احفظ الترتيب ده — هو اللي بيحدد ترتيب كتابة الأجزاء دائمًا: SELECT ← FROM ← JOIN ← WHERE ← GROUP BY ← HAVING ← ORDER BY ← LIMIT. مش كلهم إجباريين، لكن ترتيبهم ثابت لا يتغير.

تقرير شهري متكامل: كل اللي اتعلمته في استعلام واحد

خلينا نجمع كل المفاهيم في سؤال واحد حقيقي: "إيراد كل شهر من الشهور اللي فيها مبيعات فوق 500، مرتبة من الأحدث للأقدم":

SELECT DATE_FORMAT(order_date, '%Y-%m') AS month,
       COUNT(*) AS orders_count,
       SUM(total) AS revenue
FROM orders
GROUP BY month
HAVING revenue > 500
ORDER BY month DESC;

شوف إزاي كل جزء بيشتغل: DATE_FORMAT بتحوّل التاريخ لصيغة "سنة-شهر" عشان نجمع عليها، GROUP BY بيجمع طلبات كل شهر، HAVING بيشيل الشهور الضعيفة، وORDER BY DESC بيرتب من الأحدث. الاستعلام ده لوحده بيستخدم 5 مفاهيم من اللي اتعلمتها — وده بالظبط شكل التقارير اللي بتتبعت للإدارة كل أول شهر. لما تقدر تكتب استعلام زي ده من دماغك، اعرف إنك عديت مرحلة المبتدئ فعلًا.

مشروع عملي: نظام متجر كامل

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

الخطوة 1: التصميم على ورقة قبل الكود

قبل أي CREATE TABLE، جاوب على 3 أسئلة: إيه الكيانات؟ (عملاء، منتجات، طلبات، أصناف الطلب) — إيه العلاقات؟ (عميل له طلبات كتير، الطلب فيه منتجات كتير) — إيه البيانات المطلوبة لكل كيان؟ (الاسم، السعر، الكمية…). التصميم ده عملناه فعلًا في قسم المفاتيح — ودي الجداول الأربعة بتاعتنا.

الخطوة 2: أسئلة العمل الحقيقية وإجاباتها

النظام جاهز والبيانات موجودة. دلوقتي "المدير" بيسأل — وانت تجاوب باستعلامات:

1. تقرير المبيعات اليومي: عدد الطلبات وإجمالي الإيراد ومتوسط قيمة الطلب:

SELECT COUNT(*) AS orders_today,
       SUM(total) AS revenue,
       AVG(total) AS avg_order_value
FROM orders
WHERE DATE(order_date) = CURDATE();

2. المنتجات اللي هتخلص: المخزون أقل من 10 — عشان تطلب بضاعة قبل ما تخلص:

SELECT name, stock FROM products
WHERE stock < 10
ORDER BY stock ASC;

3. أفضل 5 منتجات مبيعًا: بالكمية والإيراد:

SELECT p.name,
       SUM(oi.quantity) AS units_sold,
       SUM(oi.quantity * p.price) AS revenue
FROM products p
INNER JOIN order_items oi ON p.id = oi.product_id
GROUP BY p.id, p.name
ORDER BY units_sold DESC
LIMIT 5;

4. العملاء الخاملون: مسجلين ومطلبوش ولا مرة — مرشحين لحملة خصومات:

SELECT c.full_name, c.email
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.id IS NULL;

5. سجل عميل كامل: كل طلبات عميل معين والأصناف اللي فيها:

SELECT o.id AS order_id, o.order_date,
       p.name AS product, oi.quantity,
       (p.price * oi.quantity) AS line_total
FROM orders o
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.customer_id = 1
ORDER BY o.order_date DESC;
ليه المشروع ده مهم؟

الـ5 استعلامات دول مش أمثلة مدرسية — دي تقارير حقيقية أي متجر بيطلبها يوميًا. لو كتبتهم بنفسك وفهمت كل سطر، انت مش "مبتدئ بيعرف أوامر" — انت حد يقدر يبني قاعدة بيانات شغالة لنظام حقيقي. الفرق كبير.

الخطوة 3: وسّع المشروع بنفسك

عشان تثبت المعلومة، ضيف بنفسك: جدول categories (فئات المنتجات) واربطه بجدول المنتجات، وعمود discount في جدول الطلبات، واستعلام "إيراد كل تصنيف". التوسع الذاتي هو اللي بيحوّل المتعلم لممارس.

إعلان

7 أخطاء بتوقف المبتدئين

الأخطاء دي مش نظرية — دي اللي بشوفها بتتكرر مع كل حد بيبدأ. اعرفها من دلوقتي عشان متدفعش تمنها:

1. استخدام SELECT * في كل حاجة

في التجربة ماشي، لكن في الشغل الحقيقي حدد الأعمدة. الـ* بيجيب بيانات زيادة تبطّئ الاستعلام، وبيكسر الكود لو حد ضاف عمود جديد للجدول. عادة واحدة صح من أول يوم بتفرق.

2. نسيان WHERE في UPDATE وDELETE

اتكلمنا عنها — أخطر غلطة. الحل العملي: اكتب الـWHERE الأول وجرّبه بـSELECT، وبعدين حوّله لتعديل أو حذف. ولو بتجرب على بيانات مهمة، خد نسخة احتياطية الأول.

3. تخزين الفلوس في FLOAT

الأرقام العشرية التقريبية بتاكل كسور من الفلوس. الأسعار والمبالغ دائمًا DECIMAL. مفيش استثناء.

4. تخزين التليفونات والأكواد كأرقام

رقم التليفون اللي بيبدأ بصفر لو اتخزن INT الصفر هيضيع. وأي "رقم" مش هتعمل عليه حسابات (تليفون، كود بريدي، رقم بطاقة) يتخزن VARCHAR.

5. تكرار البيانات بدل العلاقات

كتابة اسم العميل مع كل طلب بدل ما تربط برقم العميل. أول ما تحتاج تعديل، هتكتشف الكارثة. صمم علاقات صح من الأول.

6. تجاهل الـNULL

مقارنة NULL بـ= دائمًا غلط — لازم IS NULL. ولو عمود ممكن يبقى فاضي، فكّر من الأول: هل القيمة الفارغة مسموحة؟ ولا لازم NOT NULL؟ القرار ده جزء من التصميم مش تفصيلة.

7. التعلم من غير تطبيق

تتفرج على 20 ساعة شرح ومتكتبش سطر واحد — ده مش تعلم، ده تسلية. القاعدة: كل مفهوم جديد = 5 استعلامات تكتبه بنفسك. اقفل المقال وطبق، وبعدين كمّل.

الغلطة الصامتة: عدم أخذ نسخ احتياطية

قبل أي عملية حذف أو تعديل كبيرة على بيانات حقيقية: mysqldump -u root -p my_store > backup.sql — سطر واحد بيحفظ قاعدة البيانات كلها في ملف. اللي معندوش نسخة احتياطية، معندوش بيانات — عنده أمنية.

خطة 30 يوم من الصفر للاحتراف

مش محتاج كورس 6 شهور عشان تبقى عملي في MySQL. محتاج 30 يومًا مركزة — ساعة يوميًا — بالترتيب ده:

الأسبوع 1: الأساسياتثبّت البيئة. CREATE/DROP DATABASE. أنواع البيانات. أنشئ جداول بقيود. INSERT وSELECT البسيط. الهدف: جدول شغال فيه بيانات حقيقية.
الأسبوع 2: الاستعلاماتWHERE بكل عواملها. ORDER BY وLIMIT وDISTINCT وLIKE. UPDATE وDELETE الآمن. الهدف: تجاوب على أي سؤال عن جدول واحد.
الأسبوع 3: العلاقاتالمفاتيح الأساسية والأجنبية. تصميم 3-4 جداول مربوطة. كل أنواع JOIN. الهدف: استعلام واحد يجمع 3 جداول.
الأسبوع 4: التقارير والمشروعالدوال التجميعية وGROUP BY وHAVING. الاستعلامات الفرعية. ابنِ نظام المتجر كاملًا من الصفر. الهدف: 5 تقارير شغالة.

وبعد الـ30 يوم؟ الطريق الطبيعي: اربط MySQL بلغة برمجة (PHP أو Python) عشان تبني تطبيقات حقيقية بتخزن وتقرأ من القاعدة — وهنا البيانات بتتحول لمنتج. ولو شغال ووردبريس، هتكتشف إنك بقيت فاهم إيه اللي بيحصل "تحت الغطاء" لما بتنشر مقال أو بتسجل عميل.

قاعدة الاستمرارية

ساعة يوميًا لمدة 30 يومًا تتفوق على 10 ساعات في يوم واحد. قواعد البيانات مهارة "تراكمية": كل يوم بتبني على اللي قبله. واليوم اللي هتوقفه، ارجع للي بعده من غير جلد ذات — المهم متوقفش أسبوع.

إعلان

إعلان

المصادر الموثقة بالروابط المباشرة

كل مصدر تحت اتفتح واتأكد منه فعليًا قبل ما يتحط هنا: الرابط مباشر للمصدر نفسه مش للصفحة الرئيسية، والشارة بتعكس الواقع — المجاني مجاني فعلًا، والمدفوع موسوم بوضوح من غير أسعار.

الرابط ده مهم لسبب: ووردبريس شغال على MySQL، فكل اللي اتعلمته هنا هو "العقل المدبر" ورا أي موقع ووردبريس — المقال ده يكمل الصورة من ناحية بناء المواقع نفسها.

التوثيق الرسمي لـMySQL

المرجع الأساسي من الشركة المطورة نفسها: شرح كل أمر وكل دالة بالتفصيل والأمثلة. بالإنجليزية، ومكانه الطبيعي كمصدر ترجع له لما تحتاج التفاصيل الدقيقة.

مجانيرسمي

MySQL Tutorial

كورس مكتوب متكامل من الصفر للاحتراف: دروس قصيرة مركزة كل واحد فيه أمثلة قابلة للتجربة. من أنضف المصادر المكتوبة للمبتدئين.

مجاني

W3Schools — SQL Tutorial

شرح مبسط جدًا مع محرر تجريبي داخل الصفحة: تقرأ المثال وتدوس "جرّب بنفسك" وتشوف النتيجة فورًا. ممتاز لأول أسبوع.

مجاني

SQLBolt

دروس تفاعلية قصيرة: كل درس شرح بسيط ثم تمرين تحله داخل المتصفح. بيغطي الأساسيات كلها في جلسات صغيرة مركزة.

100% Free

Mode SQL Tutorial

شرح عملي موجه لتحليل البيانات: من الاستعلامات البسيطة لحد الـJOIN والدوال التجميعية، بأمثلة من بيانات حقيقية.

مجاني

SQLZoo

تمارين تفاعلية متدرجة الصعوبة على بيانات حقيقية (دول، مدن، أفلام). تحل التمرين وتشوف النتيجة لحظيًا — أفضل طريقة لتثبيت الـSELECT والـJOIN.

مجاني

DB Fiddle

بيئة MySQL حقيقية داخل المتصفح: اكتب الأوامر وشوف النتيجة من غير تثبيت أي حاجة. مفيد للتجربة السريعة ومشاركة الأكواد.

مجاني

XAMPP

الحزمة المجانية اللي بتثبت MySQL مع phpMyAdmin في خطوات بسيطة — الطريقة الأسرع اللي شرحناها في قسم تجهيز البيئة.

مجاني

phpMyAdmin

أشهر أداة ويب لإدارة MySQL: إنشاء الجداول، تنفيذ الاستعلامات، والنسخ الاحتياطي من واجهة رسومية. مفتوحة المصدر ومجانية.

مجاني

كورس MySQL بالعربي — أكاديمية الزيرو

شرح عربي مفصل من الصفر: أنواع البيانات، القيود، العلاقات، والربط — بأسلوب عملي وأمثلة كتير. القائمة الكاملة متاحة مجانًا على يوتيوب.

مجانيعربي

SQL Full Course — freeCodeCamp

كورس فيديو إنجليزي شامل من الصفر: شرح هادئ وأمثلة عملية على قاعدة بيانات حقيقية. مناسب للي مرتاح مع الإنجليزية.

مجاني

The Ultimate MySQL Bootcamp

كورس مدفوع مشهور على يوديمي: من الأساسيات لمواضيع متقدمة زي الـWindow Functions والـViews، مع تمارين ومشاريع عملية كتير.

مدفوع

نصيحة أخيرة عن المصادر: مصدر واحد تخلصه أحسن من عشرة تبدأهم. اختار مصدر عربي (الزيرو) ومصدر تفاعلي (SQLBolt أو SQLZoo) وامشي عليهم بالتوازي مع المقال ده — كفاية جدًا للوصول لمستوى عملي.

تحدي الـ48 ساعة

قبل ما تقفل الصفحة: ثبّت XAMPP أو افتح DB Fiddle، وأنشئ قاعدة بيانات وجدول عملاء ودخل 5 عملاء بنفسك. أول 5 صفوف تدخلهم بإيدك أهم من 5 ساعات قراءة. ابدأ دلوقتي.

إعلان

الأسئلة الشائعة

إيه الفرق بين SQL وMySQL؟

SQL هي لغة الاستعلام — مجموعة الأوامر اللي بتكتبها زي SELECT وINSERT. وMySQL هو البرنامج (نظام إدارة قواعد البيانات) اللي بيفهم اللغة دي وينفذها ويرجعلك النتيجة. بتتعلم الاتنين مع بعض: اللغة مرة واحدة، والأداة بالتطبيق.

هل MySQL مجاني فعلًا؟

أيوه — نسخة المجتمع (Community Edition) مجانية ومفتوحة المصدر وتقدر تستخدمها حتى في مشاريع تجارية من غير أي ترخيص. فيه نسخ مدفوعة للشركات الكبيرة بمميزات دعم إضافية، لكن المبتدئ والمطور العادي مش محتاجها خالص.

محتاج أتعلم برمجة قبل MySQL؟

لا. SQL لغة مستقلة بذاتها وأوامرها شبه الإنجليزية العادية، وممكن تتعلمها من الصفر من غير أي خلفية برمجية. لكن لو ناوي تبني تطبيقات كاملة بعدين، هتحتاج لغة برمجة (زي PHP أو Python) تتواصل مع قاعدة البيانات — وده خطوة تانية مش شرط للبداية.

أختار XAMPP ولا التثبيت الرسمي؟

كمبتدئ تمامًا: XAMPP — أسرع وأسهل وبييجي معاه phpMyAdmin. لما تبقى مرتاح مع الأوامر وعاوز بيئة أنضف وأقرب للاحترافية: التثبيت الرسمي مع MySQL Workbench. وممكن تجرب أونلاين من غير تثبيت عبر DB Fiddle لأول تجربة.

إيه الفرق بين MySQL وMariaDB؟

MariaDB اتفرعت من MySQL ومتوافقة معاها بنسبة كبيرة جدًا — نفس الأوامر ونفس طريقة الشغل في الأساسيات. XAMPP بييجي بـMariaDB افتراضيًا. كمبتدئ مش هتحس بأي فرق: كل اللي في المقال ده شغال على الاتنين.

ليه الأسعار بتتخزن DECIMAL مش FLOAT؟

لأن FLOAT بيخزن الأرقام العشرية بشكل تقريبي — فممكن 19.99 تتحفظ 19.9899999 وتعمل فروقات في الحسابات المالية. DECIMAL بيحفظ الرقم بالظبط زي ما هو. القاعدة: أي مبلغ مالي = DECIMAL دائمًا ومن غير استثناء.

إمتى أستخدم DELETE وإمتى أستخدم DROP؟

DELETE بيمسح صفوف من جوه جدول (الجدول نفسه بيفضل موجود). DROP بيمسح الجدول كله أو قاعدة البيانات كلها من الوجود. يعني: عاوز تفضي جدول من بياناته لكن تفضل هيكله؟ DELETE. عاوز تشيل الجدول نفسه؟ DROP TABLE. والاتنين خطرين من غير نسخة احتياطية.

الاستعلام بتاعي بطيء — أعمل إيه كمبتدئ؟

أول خطوتين بيحلوا أغلب المشاكل: حدد الأعمدة اللي محتاجها بس بدل SELECT *، وضيف LIMIT للتجربة بدل ما تجيب مليون صف. على المدى الأطول، الفهارس (Indexes) على الأعمدة اللي بتبحث بيها كتير بتسرّع الاستعلامات بشكل ضخم — وده موضوع المرحلة المتقدمة.

هل اللي اتعلمته ينفع مع PostgreSQL أو SQLite؟

بنسبة كبيرة أيوه. لغة SQL الأساسية (SELECT وWHERE وJOIN والدوال التجميعية) واحدة تقريبًا في كل الأنظمة. الفروقات في التفاصيل المتقدمة وأنواع البيانات الخاصة. اللي بيتقن الأساسيات في MySQL بيقدر ينتقل لأي نظام تاني في أيام.

إزاي أخد نسخة احتياطية من قاعدة البيانات؟

من سطر الأوامر: mysqldump -u root -p my_store > backup.sql — بيحفظ القاعدة كلها (الهيكل والبيانات) في ملف واحد. والاسترجاع بعكس الأمر. ومن phpMyAdmin فيه زرار تصدير (Export) بيعمل نفس الحاجة من الواجهة الرسومية. اعملها قبل أي عملية حذف أو تعديل كبيرة.

أتعلم MySQL ولا لغة برمجة الأول؟

لو هدفك بناء مواقع وتطبيقات: ابدأ بلغة البرمجة (الأساسيات) وبعدين MySQL — عشان تفهم إزاي التطبيق بيكلم القاعدة. لو هدفك تحليل بيانات: ابدأ بـMySQL على طول — هو الأداة الأساسية. وفي الحالتين الاتنين بيكملوا بعض ومش هتستغنى عن التاني.

بعد ما أخلص الأساسيات — إيه الخطوة الجاية؟

ثلاث اتجاهات حسب هدفك: تربط MySQL بلغة برمجة وتبني تطبيقًا حقيقيًا (PHP أو Python)، أو تتعمق في مواضيع متقدمة زي الفهارس والـViews والإجراءات المخزنة، أو تدخل تحليل البيانات بأدوات زي Excel وPython مع SQL. المشترك بينهم: مشروع حقيقي تطبق فيه — مش كورس تاني.

إعلان

إعلان

إعلان