استخدام الدوال Functions في لغة SQL
يا هلا والله! اليوم بنتكلم عن الدوال (Functions) في SQL، وهي من أهم الأدوات اللي بتخلي شغلك أنظف وأسرع لما تتعامل مع البيانات. الدوال ببساطة هي أوامر جاهزة أو انت تسويها، تاخذ منك قيم وتنفذ عليها عمليات معينة وترجع لك نتيجة. بتوفر عليك كود كثير وتخلي استعلاماتك (queries) أقوى.
الدوال المضمنة (Built-in Functions) - دوال القيم المفردة (Scalar Functions)
هذي الدوال تجي جاهزة مع نظام قواعد البيانات حقك. تشتغل على قيمة واحدة (مثلاً قيمة في عمود واحد لصف معين) وترجع لك قيمة واحدة. مفيدة جداً لتعديل البيانات أو تهيئتها.
أمثلة على دوال النصوص (String Functions):
UPPER(): تحول النص لأحرف كبيرة.LOWER(): تحول النص لأحرف صغيرة.LENGTH()أوLEN(): ترجع طول النص.CONCAT()أو||: تجمع نصين أو أكثر.
شوف هالمثال:
SELECT
ProductName,
UPPER(ProductName) AS UpperCaseName,
LENGTH(ProductName) AS NameLength,
CONCAT('Item: ', ProductName) AS FullDescription
FROM Products;
أمثلة على دوال الأرقام (Numeric Functions):
ROUND(): تقرب الرقم لأقرب عدد صحيح أو لعدد معين من الخانات العشرية.ABS(): ترجع القيمة المطلقة للرقم.CEILING(): تقرب الرقم لأقرب عدد صحيح أكبر منه أو يساويه.FLOOR(): تقرب الرقم لأقرب عدد صحيح أصغر منه أو يساويه.
مثلاً كذا:
SELECT
Price,
ROUND(Price, 0) AS RoundedPrice,
ABS(-15.7) AS AbsoluteValue,
CEILING(Price) AS CeilPrice,
FLOOR(Price) AS FloorPrice
FROM Products;
أمثلة على دوال التاريخ والوقت (Date and Time Functions):
هذي تختلف شوي بين قواعد البيانات، لكن الفكرة وحدة:
GETDATE()(SQL Server) أوNOW()(MySQL/PostgreSQL): ترجع التاريخ والوقت الحالي.DATEPART()(SQL Server) أوEXTRACT()(PostgreSQL/MySQL): تستخرج جزء معين من التاريخ (سنة، شهر، يوم).DATEDIFF()(SQL Server) أوAGE()(PostgreSQL): تحسب الفرق بين تاريخين.
مثال:
-- SQL Server Example
SELECT
GETDATE() AS CurrentDateTime,
DATEPART(YEAR, GETDATE()) AS CurrentYear,
DATEPART(MONTH, GETDATE()) AS CurrentMonth;
-- PostgreSQL/MySQL Example
-- SELECT
-- NOW() AS CurrentDateTime,
-- EXTRACT(YEAR FROM NOW()) AS CurrentYear,
-- EXTRACT(MONTH FROM NOW()) AS CurrentMonth;
الدوال المضمنة (Built-in Functions) - دوال التجميع (Aggregate Functions)
هذي الدوال تشتغل على مجموعة من الصفوف (عادةً بعد ما تسوي لها GROUP BY) وترجع لك قيمة واحدة لكل مجموعة. رهيبة عشان تسوي إحصائيات وملخصات للبيانات.
COUNT(): تحسب عدد الصفوف أو القيم.SUM(): تجمع قيم عمود معين.AVG(): تحسب متوسط قيم عمود معين.MIN(): ترجع أقل قيمة في عمود معين.MAX(): ترجع أعلى قيمة في عمود معين.
شوف كيف تستخدمها:
SELECT
COUNT(*) AS TotalProducts,
SUM(Price) AS TotalPrice,
AVG(Price) AS AveragePrice,
MIN(Price) AS CheapestProductPrice,
MAX(Price) AS MostExpensiveProductPrice
FROM Products;
-- مع GROUP BY عشان تشوف التجميع لكل فئة
SELECT
CategoryID,
COUNT(*) AS ProductsCount,
AVG(Price) AS AveragePricePerCategory,
MAX(Price) AS MaxPricePerCategory
FROM Products
GROUP BY CategoryID;
الدوال المعرفة من قبل المستخدم (User-Defined Functions - UDFs)
لو الدوال الجاهزة ما كفتك، SQL تعطيك صلاحية تسوي دالتك الخاصة! هذي الدوال تقدر تسويها عشان تنفذ منطق عمل معين يتكرر عندك، أو عشان تبسط استعلامات معقدة.
فيه نوعين رئيسيين:
- **Scalar UDFs**: ترجع قيمة واحدة، مثل دوال القيم المفردة اللي شفناها فوق.
- **Table-Valued UDFs**: ترجع جدول كامل، وهذي قصة ثانية بس حلوة ومفيدة.
مثال بسيط لدالة ترجع قيمة واحدة (Scalar UDF) في SQL Server:
-- إنشاء دالة لحساب الضريبة
CREATE FUNCTION dbo.CalculateTax (@Price DECIMAL(10, 2), @TaxRate DECIMAL(5, 2))
RETURNS DECIMAL(10, 2)
AS
BEGIN
RETURN @Price * @TaxRate;
END;
-- استخدام الدالة في استعلام
SELECT
ProductName,
Price,
dbo.CalculateTax(Price, 0.15) AS PriceWithTax -- نفترض الضريبة 15%
FROM Products;
ملاحظة: كل نظام قواعد بيانات (مثل SQL Server, MySQL, PostgreSQL, Oracle) له شوية اختلافات في أسماء الدوال أو طريقة استخدامها أو حتى كيفية إنشاء الدوال المعرفة من قبل المستخدم. دائمًا ارجع للتوثيق الخاص بنظامك.
نصيحة: استخدم الدوال بحكمة! خصوصًا الدوال المعرفة من قبل المستخدم، لأنها ممكن تأثر على أداء الاستعلامات الكبيرة إذا ما انكتبت صح. لكن بشكل عام، الدوال أداة قوية جداً لتبسيط الكود وتحسين قراءته.
وبكذا نكون غطينا أساسيات الدوال في SQL. طبق الأمثلة هذي وجرب بنفسك عشان ترسخ المعلومة!