الاستعلام المتقدم في MySQL يتيح لك استرجاع البيانات بشكل أكثر تحديدًا وتحليلًا باستخدام مجموعة متنوعة من الأوامر والتقنيات. سوف اعرض عليك في هذة المقالة بعض الاستعلامات المتقدمة التي يمكنك استخدامها في MySQL
الاستعلام المتقدم في MYSQL جدول المحتويات
قاعدة البيانات
في البداية نحتاج ان نقوم بانشاء قاعدة بيانات باسم mydatabase او الرجوع الي درس اول مشروع MYSQL لمعرفة المزيد عن انشاء قاعدة البيانات
CREATE DATABASE mydatabase;
و تحتوي قاعدة البيانات علي جدول عملاء وجدول طلبات علي اعتبار اننا نقدم طلبيات مطعم
جدول العملاء و جدول الطلبات
يمكنك استخدام الأمر CREATE TABLE
لإنشاء جداول في قاعدة البيانات. على سبيل المثال، دعونا نفترض أننا نريد إنشاء جدول لتخزين بيانات الطلبات (“orders”) وجدول لتخزين بيانات العملاء (“customers”). قد يكون الجدول “orders” يحتوي على حقول مثل order_id وcustomer_id وorder_date والمزيد، في حين أن الجدول “customers” يحتوي على حقول مثل customer_id وcustomer_name والمزيد.
ويكتب الكود بالنحو التالي
CREATE TABLE customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(255),
email VARCHAR(255),
phone VARCHAR(20)
);
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10, 2),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
ادخال بيانات جدول العملاء
بعد ان قمنا بانشاء جدول العملاء داخل قاعدة البيانات بعد ذلك نقوم بادخال بيانات العملاء باستخدام الامر insert
INSERT INTO customers (customer_name, email, phone)
VALUES
('John Doe', 'john@example.com', '123456789'),
('Jane Smith', 'jane@example.com', '987654321'),
('David Johnson', 'david@example.com', '456789123'),
('Emily Davis', 'emily@example.com', '789123456'),
('Michael Wilson', 'michael@example.com', '321654987'),
('Jennifer Martinez', 'jennifer@example.com', '654987321'),
('Chris Brown', 'chris@example.com', '159753468'),
('Jessica Taylor', 'jessica@example.com', '852963147'),
('Kevin Thomas', 'kevin@example.com', '369258147'),
('Sarah Garcia', 'sarah@example.com', '147258369');
ادخال بيانات جدول الطلبات
بعد ان قمنا بانشاء جدول الطلبات داخل قاعدة البيانات ثم نقوم بادخال بيانات الخاصة بطلبات العملاء داخل جدول الطلبات باستخدام الامر insert
INSERT INTO orders (customer_id, order_date, total_amount)
VALUES
(1, '2024-03-10', 100.00),
(2, '2024-03-11', 150.00),
(3, '2024-03-12', 200.00),
(4, '2024-03-13', 75.00),
(5, '2024-03-14', 120.00),
(6, '2024-03-15', 90.00),
(7, '2024-03-16', 180.00),
(8, '2024-03-17', 210.00),
(9, '2024-03-18', 95.00),
(10, '2024-03-19', 130.00);
هنا قمنا بادخال 10 طلبات ل 10 عملاء ليصبح الجدول بهذا الشكل
الاستعلام
الاستعلام باستخدام الانضمام (Joins)
عمليات الانضمام (Joins) في MySQL تسمح لك بجمع البيانات من جداول متعددة بناءً على شروط محددة. يتم استخدام الانضمامات لربط الصفوف في جداول مختلفة بناءً على قيم مشتركة بينها. هناك أنواع مختلفة من عمليات الانضمام في MySQL، من بينها:
INNER JOIN
تعيد الصفوف التي تطابق الشروط في كلتا الجداول.
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
LEFT JOIN
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;
تعيد جميع الصفوف من الجدول الأيسر (الجدول الأول في العملية) والصفوف المطابقة من الجدول الأيمن (الجدول الثاني في العملية). إذا لم تكن هناك صفوف مطابقة في الجدول الأيمن، فإن القيم المعادة من الجدول الأيمن ستكون NULL.
بالتالي سوف تعطينا نفس النتيجة الاولي
RIGHT JOIN
تعيد جميع الصفوف من الجدول الأيمن (الجدول الثاني في العملية) والصفوف المطابقة من الجدول الأيسر (الجدول الأول في العملية). إذا لم تكن هناك صفوف مطابقة في الجدول الأيسر، فسيتم تعيين القيم NULL للأعمدة المنشئة من الجدول الأيسر.
بالتالي سوف تعطينا نفس النتيجة الاولي
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
استعلامات التحليل النافذ (Window Functions)
التحليل النافذ (Window Functions) في MySQL يسمح لك بتطبيق دوال تحليلية على مجموعات محددة من الصفوف داخل نطاق محدد من البيانات. يتيح لك ذلك إجراء عمليات مثل الترتيب (Ranking)، والتجميع (Aggregation)، وحساب النسب المئوية (Percentiles)، والمزيد.
الأمثلة الشائعة لاستخدام التحليل النافذ تشمل استخراج الترتيب النسبي للصفوف، أو حساب المتوسطات المتحركة لفترات زمنية معينة، أو تجميع البيانات في مجموعات فرعية.
ولنفترض أنك ترغب في حساب الترتيب النسبي لكل طلب حسب المبلغ الإجمالي (total_amount)، يمكنك استخدام التحليل النافذ كما يلي:
SELECT
order_id,
customer_id,
order_date,
total_amount,
RANK() OVER (ORDER BY total_amount DESC) AS rank
FROM
orders;
هذا الاستعلام سيقوم بحساب الترتيب النسبي لكل طلب حسب المبلغ الإجمالي (total_amount)، حيث سيتم ترتيب الصفوف بترتيب تنازلي. النتيجة ستتضمن عمودًا جديدًا يُعرف باسم “rank” يحتوي على الترتيب النسبي لكل طلب.
تذكر أن دعم التحليل النافذ قد يكون متاحًا في إصدارات معينة من MySQL، لذلك تأكد من استخدام إصدار يدعم هذه الوظيفة وستكون النتيجة بهذا الشكل
اضافة اسم العميل للاستعلام
بعد ان انتهينا من الاستعلام سنقوم باستبدال اسم العميل بدلا من رقمة وذلك ايضاحا اكثر لعملية الاستعلام باستخدام الكود التالي
SELECT
order_id,
customer_name,
order_date,
total_amount,
RANK() OVER (ORDER BY total_amount DESC) AS rank
FROM
orders
INNER JOIN
customers ON orders.customer_id = customers.customer_id;
بعد استبدال اسم customers_name بدل من customers_id واضافة INNER JOIN يوضح ان رقم العميل في جدول الطلبات = رقم العميل في جدول العملاء . لتكون النتيجة بالشكل التالي
الاستعلامات المشتقة (Subqueries)
الاستعلامات المشتقة أو الاستعلامات الفرعية (Subqueries) هي استعلامات SQL يتم تضمينها داخل استعلام آخر. تُستخدم الاستعلامات المشتقة لإجراء استعلامات معقدة تستند إلى نتائج استعلامات داخلية أو للحصول على بيانات محددة من قاعدة البيانات بناءً على معايير محددة.
تتكون الاستعلامات المشتقة من عبارة SELECT داخل عبارة SELECT أو في عبارة WHERE أو HAVING أو FROM الخاصة بالاستعلام الرئيسي. ويمكن استخدامها لأغراض مختلفة مثل البحث عن البيانات المتعلقة أو تجميع البيانات أو التحقق من وجود السجلات في الجداول.
مثال بسيط
SELECT customer_name
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE order_date = '2024-03-15'
);
في هذا المثال، يتم استخدام الاستعلام المشتق لاسترجاع أسماء العملاء الذين قد قاموا بطلبات في تاريخ محدد (15 مارس 2024).
تتيح الاستعلامات المشتقة للمستخدمين إمكانية تنفيذ استعلامات معقدة بكفاءة وفعالية دون الحاجة إلى إنشاء عدة استعلامات منفصلة. ومع ذلك، يجب استخدامها بحذر لتجنب تأثيرات الأداء السلبية في الاستعلامات الكبيرة
مثال اكثر تعقيدا
مثال آخر أكثر تعقيدًا لاستخدام الاستعلام المشتق في MYSQL:
لنفترض أن لدينا جدولان: جدول “الطلاب” يحتوي على معلومات الطلاب مثل الاسم والعمر والمدينة، وجدول “الدرجات” يحتوي على معلومات الدرجات التي حصل عليها الطلاب في المواد المختلفة.
-- إنشاء جدول الطلاب
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(50),
age INT,
city VARCHAR(50)
);
-- إدراج بيانات الطلاب
INSERT INTO students (student_id, student_name, age, city)
VALUES
(1, 'أحمد', 20, 'القاهرة'),
(2, 'سارة', 22, 'الإسكندرية'),
(3, 'محمد', 21, 'الجيزة');
-- إنشاء جدول الدرجات
CREATE TABLE grades (
grade_id INT PRIMARY KEY,
student_id INT,
subject VARCHAR(50),
grade INT,
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
-- إدراج بيانات الدرجات
INSERT INTO grades (grade_id, student_id, subject, grade)
VALUES
(1, 1, 'الرياضيات', 90),
(2, 1, 'العلوم', 85),
(3, 2, 'الرياضيات', 95),
(4, 2, 'العلوم', 88),
(5, 3, 'الرياضيات', 87),
(6, 3, 'العلوم', 92);
الآن، لنفترض أننا نريد استرجاع أسماء الطلاب الذين حصلوا على أعلى درجة في كل مادة. يمكننا استخدام الاستعلام المشتق بهذا الشكل:
SELECT s.student_name, s.city, g.subject, g.grade
FROM students s
JOIN grades g ON s.student_id = g.student_id
JOIN (
SELECT subject, MAX(grade) AS max_grade
FROM grades
GROUP BY subject
) AS max_grades
ON g.subject = max_grades.subject AND g.grade = max_grades.max_grade;
هذا الاستعلام يعمل كالتالي:
- يقوم بالانضمام بين جدول الطلاب وجدول الدرجات باستخدام عملية الانضمام الداخلي.
- يقوم بإنشاء الاستعلام المشتق الذي يستخدم دالة MAX() للعثور على أعلى درجة لكل مادة.
- ينضم الاستعلام الرئيسي إلى النتائج التي تم العثور عليها من الاستعلام المشتق بناءً على المادة والدرجة لاسترجاع بيانات الطلاب الذين حصلوا على أعلى درجة في كل مادة.
هذا الاستعلام سيسترجع أسماء الطلاب ومدينتهم بالإضافة إلى المادة التي حصلوا عليها فيها أعلى درجة وقيمة الدرجة ذاتها.
students s : تعني اختصار جدول الطلاب بحرف s وهكذا باقي الاختصارات
التحليل الشرطي (Conditional Aggregates)
التحليل الشرطي (Conditional Aggregates) هو نوع من عمليات التحليل في قواعد البيانات حيث يتم تطبيق دوال تجميع (مثل العدد الإجمالي أو المتوسط) على مجموعة معينة من البيانات بناءً على شرط محدد. بمعنى آخر، يتم تجميع البيانات فقط إذا تم تحقيق شرط معين
على سبيل المثال، الشرط يمكن أن يكون عبارة عن قيمة معينة في السجلات أو نتيجة لتطبيق وظيفة منطقية مثل الإجابة على سؤال منطقي (مثل “هل القيمة أكبر من خمسة؟”).
مثال بسيط
من جدول الطلبات نريد حساب مجموع الكميات المباعة فقط للمنتجات التي تزيد أسعارها عن قيمة معينة، فإليك كيفية القيام بذلك باستخدام التحليل الشرطي:
SELECT SUM(total_amount) AS total_quantity
FROM orders
WHERE total_amount > 100;
في هذا المثال، سيتم حساب إجمالي الكميات المباعة (total_amount) فقط للسجلات التي يكون فيها سعر الوحدة (total_amount) أكبر من 100.
هذا مثال بسيط على كيفية استخدام التحليل الشرطي لتطبيق دالة SUM مع شرط محدد في قاعدة البيانات.
هناك العديد من المصادر المفيدة والدروس التي يمكنك استخدامها لتعلم قواعد بيانات MySQL بشكل فعال.اهمها موقع MySQL الرسمي https://dev.mysql.com/doc/: