مفهوم دمج الأعمدة التي تم جلبها من قاعدة البيانات
عندما نقوم بإدخال المعلومات في قاعدة البيانات فإننا نفصلها عن بعضها بشكل منظم و بأبسط صورة ممكنة لتسهيل التعامل معها لاحقاً سواء عند البحث عنها, تعديها, أو حتى عرضها. فعلى سبيل المثال إذا أردنا تخزين إسم المستخدم الثلاثي نضع إسمه في حقل, و إسم عائلته في حقل, و إسم والده في حقل.
عندما ننظم المعلومات بهذا الشكل يصبح التعامل معها سهل و مرن للغاية لأنك تستطيع البحث و فلترة البحث بدون أي عناء بالإضافة إلى أنك تستطيع متى شئت أن تعيد دمج هذه المعلومات و عرضها كيفما شئت كما ستتعلم في هذا الدرس.
عند دمج أي نوع من المعلومات عليك الإنتباه جيداً لما تفعله لأنك قد تحصل على نتائج خاطئة لأنه يوجد طرق مختلفة لدمج البيانات و كل طريقة تناسب نوع محدد من البيانات فمثلاً طريقة دمج نصيّن في نص واحد تختلف عن طريقة دمج رقمين في رقم واحد.
بشكل عام, يستخدم هذا الأمر للحصول على نسخة من البيانات الموجودة في الجداول بهدف عرضها سواء في صفحات الويب, التطبيقات أو الإحتفاظ بنسخة منها.
الشكل العام لدمج قيم الأعمدة
إذا كنت تتعامل مع أرقام, يمكنك وضع رمز الجمع + أو رمز الطرح - أو رمز الضرب * أو رمز القسمة / بينهم و عندها ستحصل على ناتج العملية.
-- يمكنك تطبيق هذا الشكل
SELECT column1 + column2 + ...
-- أو يمكنك إضافة إسم للعامود الذي سينتج عن دمج الأعمدة
SELECT column1 + column2 + ... AS 'newly_column_name'
إذا كنت تتعامل مع نصوص أو قيم تريدها أن تعرض كما هي, يمكنك دمجمهم بواسطة الدالة CONCAT() كالتالي.
-- يمكنك تطبيق هذا الشكل
SELECT CONCAT(column1 + column2 + ...)
-- أو يمكنك إضافة إسم للعامود الذي سينتج عن دمج الأعمدة
SELECT CONCAT(column1 + column2 + ...) AS 'newly_column_name'
أمثلة بسيطة على دمج القيم الرقمية و النصية
جميع الأمثلة التالية تتنفذ بشكل مباشر, أي لا تحتاج أن تحدد أي قاعدة بيانات قبلها.
المثال الأول
في المثال التالي قمنا باستخدام الأمر SELECT بشكل يجلب لنا ناتج جمع ثلاث أرقام.
ملاحظة: النتيجة ستكون عبارة عن جدول لأن الأمر SELECT دائماً يرجع النتيجة كجدول.
الإستعلام
SELECT 5 + 2 + 7;
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| 5 + 2 + 7 |
|---|
| 14 |
المثال الثاني
في المثال التالي قمنا باستخدام الأمر SELECT بشكل يجلب لنا ناتج جمع ثلاث أرقام مع وضع إسم للعامود الذي ستظهر فيه النتيجة.
الإستعلام
SELECT 5 + 2 + 7 AS 'Total';
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| Total |
|---|
| 14 |
في المثال التالي حاولنا دمج كلمتين عند استخدام الأمر SELECT حتى يظهروا كنص واحد.
ملاحظة: هنا لن يظهر خطأ في الإستعلام و لكننا سنحصل على نتيجة خطائة, لأننا لم ندمج النصوص بواسطة الدالة CONCAT().
الإستعلام
SELECT 'Mhamad' + 'Harmush';
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه حاول جمعها كأنهما رقمين و بما أنه لم يستطع جمعهما و وضع صفر كناتج الجمع.
| 'Mhamad' + 'Harmush' |
|---|
| 0 |
المثال الرابع
في المثال التالي قمنا باستخدام الدالة CONCAT() لدمج كلمتين عند استخدام الأمر SELECT حتى يظهروا كنص واحد كما أننا قمنا بوضع إسم للجدول.
الإستعلام
SELECT CONCAT('Mhamad', 'Harmush') AS 'Full Name';
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه تم عرض الكلمتين كنص واحد و لكنهما يظهران بشكل متلاصق.
| Full Name |
|---|
| MhamadHarmush |
المثال الخامس
في المثال التالي أعدنا كتابة الإستعلام السابق مع وضع نص يتألف من مسافة فارغة بين الكلمتين اللتين سندمجهما في نص واحد لأننا نريد عرض الكلمة الأولى, ثم عرض مسافة فارغة, ثم عرض الكلمة الثانية.
الإستعلام
SELECT CONCAT('Mhamad', ' ' ,'Harmush') AS 'Full Name';
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه تم عرض الكلمتين كنص واحد و و تم وضع المسافة الفارغة التي أضفناها بينهما كما أردنا.
| Full Name |
|---|
| Mhamad Harmush |
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.
الإستعلام
-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
DROP DATABASE IF EXISTS harmash;
-- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
CREATE DATABASE harmash;
-- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
USE harmash;
-- يتألف من أربعة أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
-- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
CREATE TABLE employees (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50),
last_name VARCHAR(50),
salary DECIMAL(7,2)
);
-- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
-- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
-- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
-- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", 800);
INSERT INTO employees VALUES (null, "Rami", "Algharib", 750);
INSERT INTO employees VALUES (null, "Said", "Alnaja", 900);
INSERT INTO employees VALUES (null, "Noura", "Jamali", 845);
INSERT INTO employees VALUES (null, "Amani", "Sarrouf", 1000);
INSERT INTO employees VALUES (null, "Mhamad", "Harmush", 700);
INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", 850);
INSERT INTO employees VALUES (null, "Mostafa", "Shawki", 920);
INSERT INTO employees VALUES (null, "Jana", "Alkassem", 780);
INSERT INTO employees VALUES (null, "Houssam", "Zahrani", 880);
بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.
جلب البيانات من الجدول مع دمجها و عرضها بشكل أجمل
الإستعلام التالي يجلب إسم كل موظف و إسم عائلته و يدمجهم في عامود واحد إسمه Employee.
و يجلب راتب كل موظف ويدمجه مع الرمز $ في عامود واحد إسمه Salary.
الإستعلام
SELECT
CONCAT(first_name, ' ', last_name) AS 'Employee',
CONCAT(salary, "$") AS 'Salary'
FROM
employees;
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| Employee | Salary |
|---|---|
| Ahmad Alhazem | 800.00$ |
| Rami Algharib | 750.00$ |
| Said Alnaja | 900.00$ |
| Noura Jamali | 845.00$ |
| Amani Sarrouf | 1000.00$ |
| Mhamad Harmush | 700.00$ |
| Ahmad Asaadi | 850.00$ |
| Mostafa Shawki | 920.00$ |
| Jana Alkassem | 780.00$ |
| Houssam Zahrani | 880.00$ |
مقدمة
في هذا الدرس لن تتعلم أوامر جديدة في SQL بل ستتعلم أساليب جديدة للتعامل مع البيانات التي تسترجعها من قاعدة البيانات.
عند جلب البيانات من الجداول, يمكنك ذكر إسم العامود في نفس الإستعلام أكثر من مرة فترجع قيمته أكثر من مرة في الجدول الذي سينتج عن الإستعلام.
و بما أنك تستطيع التعديل على البيانات التي ترجع كما رأيت في الدرس السابق, يمكنك الإستفادة كثيراً إذا عرفت كيف تستخدم الأسلوبين مع بعض للتعامل البيانات.
سنضع لك عدة أمثلة توضح لك كيف تستطيع استرجاع البيانات و عرضها بالطريقة التي تشاء.
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى لإنشاء قاعدة بيانات جديدة إسمها harmash و إنشاء جدول فيها إسمه products يحتوي على بيانات 6 منتجات.
الإستعلام
-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
DROP DATABASE IF EXISTS harmash;
-- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
CREATE DATABASE harmash;
-- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
USE harmash;
-- يتألف من أربعة أعمدة products هنا قمنا بإنشاء جدول جديد إسمه
-- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
CREATE TABLE products (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
price DECIMAL(7,2)
);
-- هنا قمنا بإضافة 6 أسطر في الجدول, أي أضفنا معلومات 6 منتجات
-- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
-- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
-- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
INSERT INTO products VALUES (null, 'Keyboard', 15.00);
INSERT INTO products VALUES (null, 'Camera', 44.99);
INSERT INTO products VALUES (null, 'HDD 1TB', 70.00);
INSERT INTO products VALUES (null, 'SSD 1TB', 274.66);
INSERT INTO products VALUES (null, 'Mouse', 8.50);
INSERT INTO products VALUES (null, 'Table', 44.55);
بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول products بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.
مثال حول وضع إسم العامود أكثر من مرة في الإستعلام
الإستعلام التالي يجلب إسم المنتج, سعره, ضريبة قيمتها 10 بالمئة من أصل سعر المنتج, سعر المنتج النهائي بعد الضريبة.
لقراءة المعلومات التي سنعرضها بشكل مفهوم فعلنا التالي:
العامود الذي يعرض أسماء المنتجات قمنا بتسميته
Productالعامود الذي يعرض أسعار المنتجات قمنا بتسميته
Price ($)حتى تكون العملة التي نتعامل معها واضحة.العامود الذي يعرض نسية الضريبة على كل منتج قمنا بتسميته
Tax ($)العامود الذي يعرض أسعار المنتجات بعد الضريبة قمنا بتسميته
Final Price ($)
الإستعلام
SELECT
name AS 'Product', -- إسم المنتج عرضناه كما هو
price AS 'Price ($)', -- سعر المنتج عرضناه كما هو
price * 0.1 AS 'Tax ($)', -- نسبة الضريبة 10% تساوي سعر المنتج × 0.1
price + (price * 0.1) AS 'Final Price ($)' -- سعر المنتج بعد الضريبة = سعر المنتج + نسبة الضريبة
FROM
products
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| Product | Product Price ($) | Tax ($) | Final Price ($) |
|---|---|---|---|
| Keyboard | 15.00 | 1.500 | 16.500 |
| Camera | 44.99 | 4.499 | 49.489 |
| HDD 1TB | 70.00 | 7.000 | 77.000 |
| SSD 1TB | 274.66 | 27.466 | 302.126 |
| Mouse | 8.50 | 0.850 | 9.350 |
| Table | 44.55 | 4.455 | 49.005 |
إذاً من خلال سعر المنتج فقط, قمنا بتوليد عامودين إضافيين عرضنا فيهما نسبة الضريبة و سعر المنتج بعد الضريبة.
طبعاً بإمكانك التعديل و الإضافة على الإستعلام كيفما شئت, فمثلاً يمكنك وضع حسم على سعر المنتج بنسبة محددة بدل أن تضع ضريبة عليه.
الدالة FORMAT()
عند التعديل على القيم التي سيرجعها الإستعلام قد يتغير نوعها كما لاحظت في الأمثلة السابقة.
فمثلاً, عند عرض أسعار المنتجات كما هي كنا نلاحظ أنه يوجد رقمين فقط بعد الفاصلة و لكن عند إجراء أي عملية حسابية على هذا السعر لاحظنا أن الأسعار أصبح يظهر فيها أربع أرقام بعد الفاصلة لأن قاعدة البيانات قامت بتحويل نوع السعر من DECIMAL إلى FLOAT عند إجراء العمليات الحسابية.
إذا كنت تريد تحديد عدد الأرقام التي ستظهر بعد الفاصلة يمكنك استخدام الدالة FORMAT().
عند استدعاء هذه الدالة يجب أن تمرر لها رقمين. الأول هو الرقم الذي تريد تحويله, القاني يمثل عدد الأرقام التي تريد عرضها بعد الفاصلة.
المثال الأول
إذا قمت بتنفيذ الإستعلام التالي سيعرض لك الرقم الموضوع كما هو بالضبط.
الإستعلام
SELECT 10.55 AS 'Number without format'
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| Number without format |
|---|
| 10.55 |
المثال الثاني
إذا قمت بتنفيذ الإستعلام التالي سيعرض لك الرقم الموضوع بدون فاصلة و سيتم وضع أقرب رقم له.
الإستعلام
SELECT FORMAT(10.55) AS 'Number without format'
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| Number without format |
|---|
| 11 |
مثال حول تعديل القيم التي سيرجعها الإستعلام بواسطة الدالة FORMAT()
الإستعلام التالي يجلب إسم المنتج, سعره بالدولار, باليورو, بالليرة اللبنانية و بالريال السعودي.
لقراءة المعلومات التي سنعرضها بشكل مفهوم فعلنا التالي:
العامود الذي يعرض أسماء المنتجات قمنا بتسميته
Productالعامود الذي يعرض أسعار المنتجات بالدولار قمنا بتسميته
Price ($)و هو نفسه السعر الأصلي لأننا إفترضنا أن الأسعار تم إدخالها بالأساس بالدولار.العامود الذي يعرض أسعار المنتجات باليورو قمنا بتسميته
Price (€)العامود الذي يعرض أسعار المنتجات بالليرة قمنا بتسميته
Price (LL)العامود الذي يعرض أسعار المنتجات بالريال قمنا بتسميته
Price (SAR)
ملاحظة: السعر بالليرة و الريال لم نعرضها مع فواصل. السعر بالدولار عرضناه كما هو. السعر باليورو عرضناه برقمين بعد بالفاصلة.
الإستعلام
SELECT
name AS 'Product',
price AS 'Price ($)', -- السعر بالدولار عرضناه كما هو لأن السعر الأساسي بالدولار
FORMAT(price * 0.9, 2) AS 'Price (€)', -- 0.9 للتحويل من الدولار إلى اليورو ضربنا السعر بنسبة
FORMAT(price * 1500, 0) AS 'Price (LL)', -- 1500 للتحويل من الدولار إلى الليرة ضربنا السعر بنسبة
FORMAT(price * 3.75, 0) AS 'Price (SAR)' -- 3.75 للتحويل من الدولار إلى الريال ضربنا السعر بنسبة
FROM
products
سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
| Product | Price ($) | Price (€) | Price (LL) | Price (SAR) |
|---|---|---|---|---|
| Keyboard | 15.00 | 13.50 | 22,500 | 56 |
| Camera | 44.99 | 40.49 | 67,485 | 169 |
| HDD 1TB | 70.00 | 63.00 | 105,000 | 263 |
| SSD 1TB | 274.66 | 247.19 | 411,990 | 1,030 |
| Mouse | 8.50 | 7.65 | 12,750 | 32 |
| Table | 44.55 | 40.10 | 66,825 | 167 |