حذف مقادیر تکراری در SQL Server: راهنمای جامع SELECT DISTINCT
دستور SELECT DISTINCT
در SQL Server برای بازیابی مقادیر منحصر به فرد (Unique) از یک یا چند ستون استفاده میشود. این دستور به شما کمک میکند تا ردیفهای تکراری را از نتیجه کوئری خود حذف کنید و فقط اولین وقوع هر ترکیب منحصر به فرد از ستونهای مشخص شده را نمایش دهید. اگر کلمه DISTINCT
را پس از SELECT
مشخص نکنید، تمام ردیفهای بازیابی شده (شامل موارد تکراری) نمایش داده میشوند.
برای شروع، یک جدول نمونه به نام ProductSales
ایجاد میکنیم و چند رکورد برای مثالها در آن درج میکنیم:
CREATE TABLE ProductSales (
ProductID INT,
ProductName VARCHAR(50),
SalesAmount DECIMAL(10, 2),
SalesDate DATE
);
INSERT INTO ProductSales (ProductID, ProductName, SalesAmount, SalesDate) VALUES
(1, 'Laptop', 1200.00, '2023-01-01'),
(2, 'Mouse', 25.00, '2023-01-01'),
(1, 'Laptop', 1200.00, '2023-01-02'),
(3, 'Keyboard', 75.00, '2023-01-02'),
(2, 'Mouse', 30.00, '2023-01-03'),
(4, 'Monitor', 300.00, '2023-01-03'),
(1, 'Laptop', 1250.00, '2023-01-04'),
(3, 'Keyboard', 75.00, '2023-01-04'),
(5, 'Webcam', 50.00, '2023-01-05'),
(4, 'Monitor', 320.00, '2023-01-05');
بازیابی مقادیر DISTINCT از یک ستون
برای مشاهده تمام مقادیر منحصر به فرد ProductName
از جدول ProductSales
، میتوانید از کوئری زیر استفاده کنید. این دستور فقط نام محصولات بدون تکرار را به شما نشان میدهد:
SELECT DISTINCT ProductName
FROM ProductSales;
اگر کلمه DISTINCT
را حذف کنید، تمام نام محصولات، از جمله موارد تکراری، نمایش داده میشوند:
SELECT ProductName
FROM ProductSales;
استفاده از SELECT DISTINCT با چندین ستون
هنگامی که DISTINCT
را با چندین ستون استفاده میکنید، ترکیب منحصر به فرد تمام ستونهای مشخص شده در نظر گرفته میشود. به عنوان مثال، برای مشاهده ترکیبهای منحصر به فرد ProductName
و SalesAmount
، از دستور زیر استفاده کنید:
SELECT DISTINCT ProductName, SalesAmount
FROM ProductSales;
در این حالت، اگر ProductName
یکسان باشد اما SalesAmount
متفاوت باشد، هر دو ردیف به عنوان منحصر به فرد در نظر گرفته میشوند. تنها در صورتی یک ردیف حذف میشود که ترکیب دقیقاً یکسانی از ProductName
و SalesAmount
وجود داشته باشد.
SELECT DISTINCT با توابع تجمعی (Aggregate Functions)
SELECT DISTINCT
را میتوان با توابع تجمعی مانند COUNT
برای شمارش مقادیر منحصر به فرد استفاده کرد. به عنوان مثال، برای شمارش تعداد محصولات منحصر به فرد:
SELECT COUNT(DISTINCT ProductName) AS UniqueProductsCount
FROM ProductSales;
در این کوئری، تابع COUNT
تنها مقادیر منحصر به فرد ستون ProductName
را شمارش میکند و نتیجه را در ستون UniqueProductsCount
نمایش میدهد.
همچنین میتوانید این کار را برای شمارش تعداد فروشهای منحصر به فرد (بر اساس SalesAmount
) انجام دهید:
SELECT COUNT(DISTINCT SalesAmount) AS UniqueSalesAmountsCount
FROM ProductSales;
تفاوت SELECT DISTINCT و GROUP BY
SELECT DISTINCT
و GROUP BY
هر دو میتوانند برای حذف ردیفهای تکراری استفاده شوند، اما اهداف متفاوتی دارند. DISTINCT
صرفاً برای بازیابی مقادیر منحصر به فرد طراحی شده است، در حالی که GROUP BY
برای گروهبندی ردیفها با مقادیر یکسان در یک یا چند ستون و سپس اعمال توابع تجمعی بر روی هر گروه استفاده میشود.
نتیجه کوئری زیر با DISTINCT
همانند GROUP BY
خواهد بود اگر فقط ستونها را انتخاب کنید:
SELECT ProductName
FROM ProductSales
GROUP BY ProductName;
با این حال، تفاوت اصلی زمانی مشخص میشود که شما نیاز به انجام محاسبات تجمعی بر روی گروهها داشته باشید. به عنوان مثال، برای نمایش ProductName
منحصر به فرد و مجموع SalesAmount
برای هر محصول، باید از GROUP BY
استفاده کنید، نه DISTINCT
:
SELECT ProductName, SUM(SalesAmount) AS TotalSales
FROM ProductSales
GROUP BY ProductName;
در این حالت، SELECT DISTINCT
نمیتواند مجموع فروش (SUM(SalesAmount)
) را برای هر گروه ارائه دهد.
SELECT DISTINCT با مقادیر NULL
هنگام استفاده از SELECT DISTINCT
، مقادیر NULL
نیز به عنوان مقادیر منحصر به فرد در نظر گرفته میشوند. اگر چندین NULL
در یک ستون وجود داشته باشد، DISTINCT
تنها یک ردیف NULL
را برمیگرداند. این رفتار در SQL استاندارد است.
یک رکورد با مقدار NULL
در ProductName
اضافه میکنیم تا این موضوع را نشان دهیم:
INSERT INTO ProductSales (ProductID, ProductName, SalesAmount, SalesDate) VALUES
(6, NULL, 10.00, '2023-01-06'),
(7, NULL, 15.00, '2023-01-07');
حالا، ProductName
های منحصر به فرد را بازیابی میکنیم:
SELECT DISTINCT ProductName
FROM ProductSales;
در نتیجه این کوئری، تنها یک NULL
در خروجی مشاهده خواهید کرد، در کنار سایر نامهای محصول منحصر به فرد.
استفاده از SELECT DISTINCT با ORDER BY
میتوانید از ORDER BY
برای مرتبسازی نتایج SELECT DISTINCT
استفاده کنید. برای مثال، برای مشاهده نام محصولات منحصر به فرد به ترتیب حروف الفبا:
SELECT DISTINCT ProductName
FROM ProductSales
ORDER BY ProductName;
اگر با چندین ستون DISTINCT
استفاده میکنید و میخواهید نتایج را بر اساس یکی از آن ستونها مرتب کنید، باید آن ستون در لیست SELECT DISTINCT
نیز باشد:
SELECT DISTINCT ProductName, SalesAmount
FROM ProductSales
ORDER BY ProductName ASC, SalesAmount DESC;