کاوش جامع دستور SELECT در SQL Server: از مبانی تا پیشرفته
دستور SELECT
یکی از بنیادیترین و پرکاربردترین دستورات در SQL است که برای بازیابی دادهها از یک یا چند جدول در پایگاه داده مورد استفاده قرار میگیرد. با استفاده از این دستور قدرتمند، میتوانید ستونهای خاصی را انتخاب کنید، نتایج را فیلتر کنید، دادهها را مرتب کنید و حتی اطلاعات را از چندین جدول با هم ترکیب کنید. در ادامه، نمونههایی از کاربردهای مختلف دستور SELECT
را در SQL Server برای شما ارائه میدهیم که به شما کمک میکند دادههای مورد نیاز خود را به بهترین شکل استخراج کنید.
سادهترین کاربرد دستور SELECT
، بازیابی تمام ستونها و تمام ردیفها از یک جدول است. در این حالت، از علامت ستاره (*
) برای مشخص کردن تمام ستونها استفاده میکنیم.
SELECT *
FROM Production.Product;
اگر بخواهید فقط ستونهای خاصی را از یک جدول بازیابی کنید، کافی است نام آن ستونها را به جای علامت ستاره (*
) در دستور SELECT
مشخص کنید. این کار به افزایش کارایی و کاهش حجم دادههای بازیابی شده کمک میکند.
SELECT ProductID, Name, ProductNumber
FROM Production.Product;
گاهی اوقات ممکن است در دادههای شما ردیفهای تکراری وجود داشته باشد و شما فقط بخواهید مقادیر منحصر به فرد را مشاهده کنید. در این حالت، عبارت DISTINCT
را پس از SELECT
و قبل از نام ستونها اضافه میکنید تا نتایج تکراری حذف شوند.
SELECT DISTINCT Color
FROM Production.Product;
برای فیلتر کردن ردیفها بر اساس یک شرط خاص، از عبارت WHERE
استفاده میکنیم. این عبارت به شما امکان میدهد تا تنها ردیفهایی را که با شرط مشخص شده مطابقت دارند، بازیابی کنید. این یک بخش حیاتی در هر کوئری SQL برای استخراج دادههای دقیق است.
SELECT ProductID, Name, ProductNumber, Color
FROM Production.Product
WHERE Color = 'Red';
برای مرتبسازی نتایج بازیابی شده، از عبارت ORDER BY
استفاده میشود. شما میتوانید نتایج را بر اساس یک یا چند ستون به صورت صعودی (ASC
) یا نزولی (DESC
) مرتب کنید. این دستور برای نمایش منظم و قابل فهم دادهها بسیار مهم است.
SELECT ProductID, Name, ProductNumber, Color
FROM Production.Product
WHERE Color = 'Red'
ORDER BY Name DESC;
عبارت TOP
به شما اجازه میدهد تا تعداد مشخصی از ردیفها را از بالای مجموعه نتایج بازیابی کنید. این دستور زمانی مفید است که شما فقط به چند رکورد اول نیاز دارید. همچنین میتوان آن را با PERCENT
(برای بازگرداندن درصدی از ردیفها) و WITH TIES
(برای بازگرداندن ردیفهای اضافی با مقادیر مطابق) استفاده کرد.
SELECT TOP 5 ProductID, Name, ProductNumber, Color
FROM Production.Product
WHERE Color = 'Red'
ORDER BY ProductID;
برای صفحه بندی (Paging) نتایج، میتوانید از عبارتهای OFFSET
و FETCH NEXT
استفاده کنید. OFFSET
تعداد ردیفهایی را که باید نادیده گرفته شوند، مشخص میکند و FETCH NEXT
تعداد ردیفهایی را که باید پس از آن نادیده گرفتن بازگردانده شوند، تعیین میکند. این دستور اغلب برای نمایش نتایج در صفحات وب استفاده میشود. لازم به ذکر است که این عبارت همیشه باید همراه با ORDER BY
استفاده شود.
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
ORDER BY SalesOrderID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
عبارت GROUP BY
برای گروهبندی ردیفها با مقادیر یکسان در یک یا چند ستون به یک ردیف خلاصه استفاده میشود. این عبارت معمولاً همراه با توابع تجمیعی (مانند COUNT
، SUM
، AVG
، MIN
، MAX
) به کار میرود تا محاسبات را روی هر گروه انجام دهد.
SELECT Color, COUNT(ProductID) AS NumberOfProducts
FROM Production.Product
GROUP BY Color;
در حالی که WHERE
برای فیلتر کردن ردیفها قبل از گروهبندی استفاده میشود، عبارت HAVING
برای فیلتر کردن گروهها پس از اعمال GROUP BY
به کار میرود. این دستور به شما امکان میدهد تا فقط گروههایی را که معیارهای خاصی را برآورده میکنند، در نتایج نهایی خود قرار دهید.
SELECT Color, COUNT(ProductID) AS NumberOfProducts
FROM Production.Product
GROUP BY Color
HAVING COUNT(ProductID) > 100;
عبارت JOIN
برای ترکیب ردیفها از دو یا چند جدول بر اساس یک ستون مرتبط بین آنها استفاده میشود. این دستور به شما امکان میدهد تا دادههای مرتبطی را که در جداول مختلف ذخیره شدهاند، به هم متصل کرده و به صورت یکپارچه بازیابی کنید. انواع مختلفی از JOIN
وجود دارد، از جمله INNER JOIN
، LEFT JOIN
، RIGHT JOIN
و FULL JOIN
که هر کدام کاربرد خاص خود را دارند.
INNER JOIN
تنها ردیفهایی را برمیگرداند که در هر دو جدول، مقدار ستون مشترک (کلید) یکسان باشد. به عبارت دیگر، این نوع JOIN
تقاطع دو جدول را نمایش میدهد و ردیفهایی که در یکی از دو جدول ستون مرتبطشان وجود ندارد را حذف میکند.
SELECT
P.Name AS ProductName,
SOH.SalesOrderID,
SOH.OrderDate
FROM Production.Product AS P
INNER JOIN Sales.SalesOrderDetail AS SOD
ON P.ProductID = SOD.ProductID
INNER JOIN Sales.SalesOrderHeader AS SOH
ON SOD.SalesOrderID = SOH.SalesOrderID
WHERE P.Name = 'Mountain Bike';
LEFT JOIN
(یا LEFT OUTER JOIN
) تمام ردیفهای جدول سمت چپ را برمیگرداند و ردیفهای مطابق از جدول سمت راست را نیز در صورت وجود اضافه میکند. اگر در جدول سمت راست ردیف مطابق وجود نداشته باشد، مقادیر NULL
برای ستونهای جدول سمت راست نمایش داده میشود. این برای اطمینان از اینکه همه دادههای جدول اصلی شما در نتیجه حضور دارند، مفید است.
SELECT
C.CustomerID,
SOH.SalesOrderID
FROM Sales.Customer AS C
LEFT JOIN Sales.SalesOrderHeader AS SOH
ON C.CustomerID = SOH.CustomerID
WHERE SOH.SalesOrderID IS NULL; -- یافتن مشتریانی که سفارشی ثبت نکردهاند
RIGHT JOIN
(یا RIGHT OUTER JOIN
) شبیه LEFT JOIN
است، با این تفاوت که تمام ردیفهای جدول سمت راست را برمیگرداند و ردیفهای مطابق از جدول سمت چپ را اضافه میکند. اگر در جدول سمت چپ ردیف مطابق وجود نداشته باشد، مقادیر NULL
برای ستونهای جدول سمت چپ نمایش داده میشود.
SELECT
E.BusinessEntityID,
P.FirstName,
P.LastName
FROM HumanResources.Employee AS E
RIGHT JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
WHERE E.BusinessEntityID IS NULL; -- یافتن افرادی که کارمند نیستند
FULL JOIN
(یا FULL OUTER JOIN
) تمام ردیفها را از هر دو جدول برمیگرداند. اگر ردیفی در یک جدول ستون مطابق در جدول دیگر نداشته باشد، مقادیر NULL
برای ستونهای آن جدول نمایش داده میشود. این نوع JOIN
برای زمانی که میخواهید تمام دادهها از هر دو جدول را ببینید، صرف نظر از اینکه ردیفهای مطابق داشته باشند یا خیر، استفاده میشود.
SELECT
A.City AS CityA,
B.City AS CityB,
A.PostalCode,
B.StateProvinceID
FROM Person.Address AS A
FULL JOIN Person.StateProvince AS B
ON A.StateProvinceID = B.StateProvinceID;