آموزش

نوشتن کوئری های بهینه در SQL

نوشتن کوئری های بهینه در SQL

نوشتن کوئری های بهینه در SQL می تواند به شما کمک کند تا داده های مورد نیاز خود را سریعتر و کارآمدتر بازیابی کنید. در اینجا چند نکته برای نوشتن کوئری های بهینه آورده شده است:

1. از SELECT فقط ستون های مورد نیاز خود استفاده کنید:

هنگامی که از SELECT استفاده می کنید، فقط ستون هایی را که به آنها نیاز دارید مشخص کنید. این کار به پایگاه داده شما کمک می کند تا داده های کمتری را بازیابی کند و سرعت کوئری شما را افزایش دهد.

2. از WHERE برای فیلتر کردن داده ها استفاده کنید:

از WHERE برای فیلتر کردن داده ها قبل از بازیابی آنها استفاده کنید. این کار به پایگاه داده شما کمک می کند تا داده های کمتری را پردازش کند و سرعت کوئری شما را افزایش دهد.

3. از JOIN برای ترکیب داده ها از چندین جدول استفاده کنید:

از JOIN برای ترکیب داده ها از چندین جدول در یک جدول واحد استفاده کنید. این کار می تواند به شما کمک کند تا از نوشتن چندین کوئری جداگانه جلوگیری کنید و کارایی را افزایش دهید.

4. از ORDER BY برای مرتب سازی داده ها استفاده کنید:

از ORDER BY برای مرتب سازی داده ها بر اساس ستون های خاص استفاده کنید. این کار می تواند به شما کمک کند تا داده ها را به ترتیب مورد نظر خود نمایش دهید.

5. از LIMIT برای محدود کردن تعداد رکوردهای بازیابی شده استفاده کنید:

از LIMIT برای محدود کردن تعداد رکوردهای بازیابی شده توسط کوئری خود استفاده کنید. این کار می تواند به شما کمک کند تا از بازیابی داده های غیرضروری جلوگیری کنید و سرعت کوئری خود را افزایش دهید.

6. از DISTINCT برای حذف رکوردهای تکراری استفاده کنید:

از DISTINCT برای حذف رکوردهای تکراری از نتایج کوئری خود استفاده کنید. این کار می تواند به شما کمک کند تا فقط داده های منحصر به فرد را نمایش دهید.

7. از GROUP BY برای گروه بندی داده ها استفاده کنید:

از GROUP BY برای گروه بندی داده ها بر اساس ستون های خاص استفاده کنید. این کار می تواند به شما کمک کند تا آمار و ارقام مربوط به گروه های مختلف داده ها را محاسبه کنید.

8. از HAVING برای فیلتر کردن گروه های داده استفاده کنید:

از HAVING برای فیلتر کردن گروه های داده بر اساس معیارهای خاص استفاده کنید. این کار می تواند به شما کمک کند تا فقط گروه های داده ای را که با شرایط شما مطابقت دارند نمایش دهید.

9. از زیرکوئری ها برای پیچیده تر کردن کوئری های خود استفاده کنید:

از زیرکوئری ها برای پیچیده تر کردن کوئری های خود و بازیابی داده ها از چندین جدول یا با استفاده از منطق پیچیده استفاده کنید.

10. از ابزارهای بهینه سازی کوئری استفاده کنید:

از ابزارهای بهینه سازی کوئری برای تجزیه و تحلیل کوئری های خود و یافتن راه هایی برای بهبود کارایی آنها استفاده کنید.

نکات کلی:

  • از نام های ستون و جدول واضح و مختصر استفاده کنید.
  • از alias برای نام های طولانی استفاده کنید.
  • از کامنت برای توضیح کوئری خود استفاده کنید.
  • کوئری های خود را به طور کامل تست کنید.

با به کارگیری این نکات، می توانید کوئری های SQL بهینه ای بنویسید که داده های مورد نیاز شما را سریعتر و کارآمدتر بازیابی می کنند.

مثال 1:

فرض کنید می خواهیم لیست تمام مشتریان ساکن تهران را به همراه تعداد سفارشات و میانگین قیمت سفارش برای هر مشتری از پایگاه داده فروشگاه آنلاین خود دریافت کنیم.

گام 1: مشخص کردن ستون های مورد نیاز:

  • نام مشتری (Name)
  • تعداد سفارشات (OrderCount)
  • میانگین قیمت سفارش (AveragePrice)

گام 2: نوشتن SELECT:

SQL
SELECT
  c.Name,
  COUNT(o.OrderID) AS OrderCount,
  AVG(o.Price) AS AveragePrice

گام 3: نوشتن FROM:

SQL
FROM Customers c
INNER JOIN Orders o ON o.CustomerID = c.CustomerID

گام 4: نوشتن WHERE:

SQL
WHERE c.City = 'Tehran'

گام 5: نوشتن GROUP BY:

SQL
GROUP BY c.CustomerID

کوئری نهایی:

SQL
SELECT
  c.Name,
  COUNT(o.OrderID) AS OrderCount,
  AVG(o.Price) AS AveragePrice
FROM Customers c
INNER JOIN Orders o ON o.CustomerID = c.CustomerID
WHERE c.City = 'Tehran'
GROUP BY c.CustomerID;

نکات بهینه سازی:

  • از alias برای نام های ستون های طولانی استفاده شده است.
  • از JOIN به جای SELECT جداگانه برای مشتریان و سفارشات استفاده شده است.
  • از WHERE برای فیلتر کردن داده ها قبل از بازیابی آنها استفاده شده است.
  • از GROUP BY برای گروه بندی داده ها بر اساس شناسه مشتری استفاده شده است.

نتیجه:

این کوئری لیست تمام مشتریان ساکن تهران را به همراه تعداد سفارشات و میانگین قیمت سفارش برای هر مشتری به طور کارآمد و سریع بازیابی می کند.

سوالات:

  • اگر می خواستیم لیست 10 مشتری برتر از نظر تعداد سفارشات را دریافت کنیم، چه تغییراتی در کوئری باید اعمال می شد؟
  • اگر می خواستیم لیست مشتریانی که در سال 1402 بیش از 10 سفارش ثبت کرده اند را دریافت کنیم، چه تغییراتی در کوئری باید اعمال می شد؟

پاسخ:

  • برای دریافت لیست 10 مشتری برتر از نظر تعداد سفارشات، می توان از ORDER BY و LIMIT به صورت زیر استفاده کرد:
SQL
ORDER BY OrderCount DESC
LIMIT 10;
  • برای دریافت لیست مشتریانی که در سال 1402 بیش از 10 سفارش ثبت کرده اند، می توان از WHERE و YEAR به صورت زیر استفاده کرد:
SQL
WHERE o.OrderDate BETWEEN '2023-03-21' AND '2024-03-20'
AND OrderCount > 10;

نکات:

  • می توانید از توابع مختلف SQL مانند SUM، MIN و MAX برای محاسبه مقادیر مختلف در کوئری های خود استفاده کنید.
  • می توانید از اپراتورهای مختلف SQL مانند =، !=، >، <، >= و <= برای مقایسه مقادیر در کوئری های خود استفاده کنید.
  • می توانید از دستورات مختلف SQL مانند INSERT، UPDATE و DELETE برای دستکاری داده ها در پایگاه داده خود استفاده کنید.

مثال 2:

فرض کنید می خواهیم لیست تمام مشتریان ساکن تهران را به همراه تعداد سفارشات و میانگین قیمت سفارش برای هر مشتری از پایگاه داده فروشگاه آنلاین خود دریافت کنیم.

گام اول: مشخص کردن ستون های مورد نیاز:

ما به ستون های زیر از جداول Customers و Orders نیاز داریم:

  • CustomerID
  • Name
  • City
  • OrderID
  • Price

گام دوم: نوشتن کوئری اولیه:

SQL
SELECT
  c.CustomerID,
  c.Name,
  c.City,
  COUNT(o.OrderID) AS OrderCount,
  AVG(o.Price) AS AveragePrice
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE c.City = 'Tehran'
GROUP BY c.CustomerID;

گام سوم: بهینه سازی کوئری:

  • استفاده از DISTINCT:

از آنجایی که CustomerID کلید اصلی است، نیازی به استفاده از DISTINCT نیست.

  • استفاده از INDEX:

می توان از INDEX برای ستون City برای جستجوی سریعتر رکوردهای مربوط به مشتریان ساکن تهران استفاده کرد.

  • استفاده از alias:

برای نام های طولانی مانند COUNT(o.OrderID) و AVG(o.Price) از alias استفاده می کنیم.

کوئری بهینه شده:

SQL
SELECT
  c.CustomerID,
  c.Name,
  c.City,
  COUNT(o.OrderID) AS OrderCount,
  AVG(o.Price) AS AveragePrice
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE c.City = 'Tehran'
GROUP BY c.CustomerID;

USE INDEX (IX_Customers_City);

SELECT
  c.CustomerID,
  c.Name,
  c.City,
  OrderCount,
  AveragePrice
FROM (
  SELECT
    c.CustomerID,
    c.Name,
    c.City,
    COUNT(o.OrderID) AS OrderCount,
    AVG(o.Price) AS AveragePrice
  FROM Customers c
  INNER JOIN Orders o ON c.CustomerID = o.CustomerID
  WHERE c.City = 'Tehran'
  GROUP BY c.CustomerID
) AS T;

توضیح کوئری بهینه شده:

  • در خط اول، از INDEX برای ستون City برای جستجوی سریعتر رکوردهای مربوط به مشتریان ساکن تهران استفاده شده است.
  • در خطوط 6 تا 14، از یک زیرکوئری برای محاسبه تعداد سفارشات و میانگین قیمت سفارش برای هر مشتری استفاده شده است.
  • در خطوط 16 تا 18، از alias برای نام های طولانی استفاده شده است.

نکات:

  • این فقط یک مثال است و ممکن است راه های دیگری برای بهینه سازی این کوئری وجود داشته باشد.
  • قبل از اعمال هر گونه تغییر در کوئری های خود، آنها را به طور کامل تست کنید.
نمایش بیشتر

نوشته‌های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا