22. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
22 | Saba Creative Company
AND
دستور از توان می ها شرط ادغام و شرط یک از بیش اعمال برایAND.نمود استفاده
خواهیم می مثال عنوان به: فرمایید توجه زیر دستور به
SELECT *
FROM Production.Product
WHERE Color='Silver' AND ReorderPoint=750
LIKE
شرط با که دهد می نمایش را مقادیری و شود می استفاده جستجو های شرط بهبود برای دستور این
.باشد داشته مشابهت شده تعیین
به: نمایید مشاهده زیر های دستور در را آن مختلف های کاربرد مثال عنوان
رکوردهاییکهفیلدNAMEآنهاباحرفpشروعمیشودرانمایشمیدهد
SELECT *
FROM Production.Product
23. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
23 | Saba Creative Company
WHERE NAME LIKE 'P%'
رکوردهاییکهفیلدNAMEآنهاباحرفngمیابد خاتمهرانمایشمیدهد
SELECT *
FROM Production.Product
WHERE NAME LIKE '%ng'
رکوردهاییکهفیلدNAMEآنهاحر شاملوفwashباشد میرانمایشمیدهد
SELECT *
FROM Production.Product
WHERE NAME LIKE '%wash%'
24. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
24 | Saba Creative Company
رکوردهاییکهفیلدNAMEآنها13حرف با و باشد می حرفیFشود می شروعرانمایشمی
دهد
SELECT *
FROM Production.Product
WHERE NAME LIKE 'F____________'
: نکتهعالمت%بهمعنایهرچندکاراکتریاحرفدلخواهدرقالبارائهشدهوعالمت_نمایانگریک
کاراکتردلخواهاست.
JOIN
باهم جداول آن مرتبط های فیلد طریق از یکدیگر به جدول چند یا دو کردن متصل برای دستور این
چند یا دو در اطالعاتی که باشد می مفهوم این به یکدیگر به جداول کردن متصل .شود می استفاده
26. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
26 | Saba Creative Company
دستورات انواعJOIN
INNER JOINیاJOIN:دراینروشسطرهایینمایشدادهمیشوندکهدرهردوجدولیکه
باهمJoinشدهاندوجوددارندرابطه یک حداقل که باشد می سطرهایی دستور این خروجی واقع در و
باشد داشته جدول دو در.خروجی در ،باشد نشده پر سنجش واحد فیلد کاالیی برای اگر ها کاال مثال در
.شود نمی داده نمایش دستور این
تفاوتدستورJoinودستورInner Joinدرperformanceآنهانمیباشد.می این تفاوت تنها
دستور که باشدJoinدستور به نسبتInner Joinنگارش نحوه در طرفی از و باشد می تر قدیمی
Inner Join،است شده تر متداول آن از استفاده ،دارد ارتباطی های کلیدواژه سایر به شباهت چون
.ندارد وجود تفاوتی صورت این غیر در
(
The question is what is the difference between above two syntax.
Here is the answer – They are equal to each other. There is absolutely no difference between them.
They are equal in performance as well as implementation. JOIN is actually shorter version of INNER
JOIN.
Personally I prefer to write INNER JOIN because it is much cleaner to read and it avoids any confusion
if there is related to JOIN. For example if users had written INNER JOIN instead of JOIN there would
have been no confusion in mind and hence there was no need to have original question.
Reference: Pinal Dave (https://blog.sqlauthority.com)
)
OUTER JOIN:دراینروشسطرهاییازجدولاصلیکهسطرمتناظرشاندرجدولدیگروجودندارد
همدرخروجیمیآیند.بستهبهاینکهبخواهیمکدامیکازسطرهاییکهدرجدولدیگرمتناظرندارند
همدرخروجی،بیایندسهنوعOuter Joinبصورتزیرتعریفمیشود:
27. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
27 | Saba Creative Company
1)LEFT OUTER JOIN:تمامسطرهایجدولاولی(جدولیکهدرسمتچپJoinقرارگرفته
است)درخروجیظاهرمیشوند.ولیسطرهاییازجدولدومکهمتناظریدرجدولاولندارنددرخروجی
نمیآیند.بعنوانمثالدستورتمام اطالعات زیرکاال عنوان به آن کاالی حتی که را هایی فروش
: دهد می نمایش نیز را است نشده مشخص
SELECT sod.SalesOrderID,
sod.SalesOrderDetailID,
sod.ProductID,
sod.OrderQty,
p.Name,
p.ProductNumber
FROM [Sales].[SalesOrderDetail] sod
LEFT OUTER JOIN Production.Product p
ON p.ProductID = sod.ProductID
28. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
28 | Saba Creative Company
2)RIGHT OUTER JOIN:تمامسطرهایجدولدومی(جدولیکهدرسمتراستJoinقرار
گرفتهاست)درخروجیظاهرمیشوند.
3)FULL OUTER JOIN:تمامسطرهایهردوجدولدرخروجیمیآیندچهدرجدولدیگر
متناظرداشتهباشندچهنداشتهباشند.
SELECT sod.SalesOrderID,
sod.SalesOrderDetailID,
sod.ProductID,
sod.OrderQty,
p.Name,
p.ProductNumber
FROM [Sales].[SalesOrderDetail] sod
FULL OUTER JOIN Production.Product p
ON p.ProductID = sod.ProductID
29. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
29 | Saba Creative Company
CROSS JOIN:نتیجهاینJoinتمامترکیباتیاستکهازقرارگرفتنهرسطرازجدولاولیدر
کنارتمامسطرهایجدولدومیبدستمیآید(همانندحاصلضربدکارتی.)به نیاز دیگر حالت این در
.باشد نمی جداول ارتباط برای کلیدی معرفی
SELECT sod.SalesOrderID,
sod.SalesOrderDetailID,
sod.ProductID,
sod.OrderQty,
p.Name,
p.ProductNumber
FROM [Sales].[SalesOrderDetail] sod
CROSS JOIN Production.Product p
30. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
30 | Saba Creative Company
:فرمایید توجه زیر عکس به ها تفاوت بهتر تفهیم برای
34. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
34 | Saba Creative Company
GROUP BY
مقادیر توان می آن کمک با و شود می استفاده محاسباتی دستورات با همراه اغلب دستور این
.نمود محاسبه مختلفی های بندی دسته ازای به را محاسباتی
در را شده ثبت مقادیر ماکزیمم و میانگین ، مینیمم مقادیر خواهیم می زیر دستور در مثال برای
اقالمفروشهر ازای بهکاال: نماییم محاسبه
SELECT ProductID,
MIN(OrderQty) AS MinQty,
AVG(OrderQty) AS AVGAty,
MAX(OrderQty) AS MaxQty
FROM [Sales].[SalesOrderDetail]
GROUP BY
ProductID
SELECT ProductID,ModifiedDate,
MIN(OrderQty) AS MinQty,
AVG(OrderQty) AS AVGAty,
MAX(OrderQty) AS MaxQty
FROM [Sales].[SalesOrderDetail]
35. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
35 | Saba Creative Company
GROUP BY
ProductID,ModifiedDate
WITH ROLLUP
اصلی بندی گروه برای ،بندی گروه مالک هر برای محاسبه بر عالوه محاسباتی مقادیر که داریم نیاز گاهی
.شود محاسبه جداگانه نیززیر ساختار بندی گروه در موجود های فیلد ترتیب اساس بر دستور این در
. دهد می شکل را ای مجموعه
مثال عنوان به:فرمایید توجه زیر دستور به
SELECT T.[Group] AS N'Region',
T.CountryRegionCode AS N'Country',
S.Name AS N'Store',
H.SalesPersonID,
SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
36. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
36 | Saba Creative Company
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN (N'DE', N'FR')
AND H.SalesPersonID IN (287, 290, 288)
AND SUBSTRING(S.Name, 1, 4)IN (N'Vers', N'Spa ')
GROUP BY
T.[Group],
T.CountryRegionCode,
S.Name,
H.SalesPersonID
WITH ROLLUP
37. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
37 | Saba Creative Company
WITH CUBE
همانند دستور این خروجیWITH ROLLUPکه تفاوت این با باشد میاساس بر دستور این در
. دهد می شکل را ای مجموعه زیر ساختار بندی گروه در موجود های فیلد ترتیب
مثال عنوان به: فرمایید توجه زیر دستور به
SELECT T.[Group] AS N'Region',
T.CountryRegionCode AS N'Country',
S.Name AS N'Store',
H.SalesPersonID,
SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN (N'DE', N'FR')
AND H.SalesPersonID IN (287, 290, 288)
AND SUBSTRING(S.Name, 1, 4)IN (N'Vers', N'Spa ')
GROUP BY
T.[Group],
T.CountryRegionCode,
S.Name,
H.SalesPersonID
WITH CUBE
39. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
39 | Saba Creative Company
SalesQuota WITH ROLLUP
HAVING
که شود می استفاده دیگری های دستور در دادن قرار شرط برای دستور این ازساختار از متفاوت ساختاری
به .دارد عادی های رکوردعبارتدیگرHavingبرایاعمالشرطبهستونهااعمالمیشودوهمان
کاریرامیکندکهWhereدررکوردهاانجاممی.دهد
نکته:دستورHavingمعموالباGroup Byمیآید.
خواهیم می مثال عنوان بهسند اقالم در را شده ثبت مقادیر ماکزیمم و میانگین ، مینیمم مقادیر
سند نوع هر ازای بهمالی سال در3: نماییم محاسبه
SELECT ProductID,
SpecialOfferID,
MIN(OrderQty) AS MinQty,
AVG(OrderQty) AS AVGAty,
MAX(OrderQty) AS MaxQty
FROM [Sales].[SalesOrderDetail]
GROUP BY
ProductID,
SpecialOfferID
HAVING SpecialOfferID = 1
40. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
40 | Saba Creative Company
UNIONوUNION ALL
ازدستورUnionبرایترکیبوادغامدویاچندستونمختلفاز2یاچندجدولونشاندادنآنهادر
یکستونمشترکاستفادهمیشود.
درایندستور،نوعدادهایستونهایانتخابشدهبرایترکیببایدیکسانباشند.دستورUnion
درهنگامترکیبفیلدها،درصورتبرخوردبامقادیرتکراریآنهاراحذفکردهوازهرمقداریکنمونه
رانمایشمیدهد.برایمشاهدهتماممقادیر،حتیمقادیرتکراریبایدازدستورUnion ALL
استفادهکرد.
مثال عنوان به: فرمایید توجه زیر دستور به
IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
41. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
41 | Saba Creative Company
-- Create Gloves table.
SELECT ProductModelID,
NAME
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
-- Uses AdventureWorks
SELECT ProductModelID,
NAME
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID,
NAME
FROM dbo.Gloves
ORDER BY
NAME;
GO
42. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
42 | Saba Creative Company
می استفاده زیر دستور از شوند داده نمایش مقادیر تمام و نشوند حذف تکراری مقادیر که این برای
: کنیم
SELECT ProductModelID,
NAME
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION ALL
SELECT ProductModelID,
NAME
FROM dbo.Gloves
ORDER BY
NAME;
46. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
46 | Saba Creative Company
salary MONEY NOT NULL
CONSTRAINT PK_Employees PRIMARY KEY(empid)
);
GO
INSERT INTO Employees
VALUES
(
1,
NULL,
'Nancy',
$10000.00
);
INSERT INTO Employees
VALUES
(
2,
1,
'Andrew',
$5000.00
);
INSERT INTO Employees
VALUES
(
3,
1,
'Janet',
$5000.00
);
INSERT INTO Employees
VALUES
(
4,
1,
'Margaret',
$5000.00
);
INSERT INTO Employees
VALUES
(
47. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
47 | Saba Creative Company
5,
2,
'Steven',
$2500.00
);
INSERT INTO Employees
VALUES
(
6,
2,
'Michael',
$2500.00
);
INSERT INTO Employees
VALUES
(
7,
3,
'Robert',
$2500.00
);
INSERT INTO Employees
VALUES
(
8,
3,
'Laura',
$2500.00
);
INSERT INTO Employees
VALUES
(
9,
3,
'Ann',
$2500.00
);
INSERT INTO Employees
VALUES
48. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
48 | Saba Creative Company
(
10,
4,
'Ina',
$2500.00
);
INSERT INTO Employees
VALUES
(
11,
7,
'David',
$2000.00
);
INSERT INTO Employees
VALUES
(
12,
7,
'Ron',
$2000.00
);
INSERT INTO Employees
VALUES
(
13,
7,
'Dan',
$2000.00
);
INSERT INTO Employees
VALUES
(
14,
11,
'James',
$1500.00
);
GO
49. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
49 | Saba Creative Company
--Create Departments table and insert values.
CREATE TABLE Departments
(
deptid INT NOT NULL PRIMARY KEY,
deptname VARCHAR(25) NOT NULL,
deptmgrid INT NULL REFERENCES Employees
);
GO
INSERT INTO Departments
VALUES
(
1,
'HR',
2
);
INSERT INTO Departments
VALUES
(
2,
'Marketing',
7
);
INSERT INTO Departments
VALUES
(
3,
'Finance',
8
);
INSERT INTO Departments
VALUES
(
4,
'R&D',
9
);
INSERT INTO Departments
VALUES
(
50. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
50 | Saba Creative Company
5,
'Training',
4
);
INSERT INTO Departments
VALUES
(
6,
'Gardening',
NULL
);
GO
CREATE FUNCTION dbo.fn_getsubtree
(
@empid AS INT
)
RETURNS @TREE TABLE
(
empid INT NOT NULL,
empname VARCHAR(25) NOT NULL,
mgrid INT NULL,
lvl INT NOT NULL
)
AS
BEGIN
WITH Employees_Subtree(empid, empname, mgrid, lvl)
AS
(
-- Anchor Member (AM)
SELECT empid,
empname,
mgrid,
0
FROM Employees
WHERE empid = @empid
UNION ALL
51. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
51 | Saba Creative Company
-- Recursive Member (RM)
SELECT e.empid,
e.empname,
e.mgrid,
es.lvl + 1
FROM Employees AS e
JOIN Employees_Subtree AS es
ON e.mgrid = es.empid
)
INSERT INTO @TREE
SELECT *
FROM Employees_Subtree;
RETURN
END
GO
SELECT D.deptid,
D.deptname,
D.deptmgrid,
ST.empid,
ST.empname,
ST.mgrid
FROM Departments AS D
CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST
64. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
64 | Saba Creative Company
: یا و
SELECT CHARINDEX(
'bicycle',
'Reflectors are vital safety components of your
bicycle.'
)
.پردازیم می داخلی توابع برخی بررسی به ادامه در
65. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
65 | Saba Creative Company
دستوراتRank
توابعRankingباعثمیشودتابههریکازسطرهایجدولیکمقداربهعنوانامتیازاختصاص
دادهشود.اینمقدارممکناستمنحصربههرسطرباشدیااینکهچندسطرمیتوانددارایمقدار
مشابه،باشداینبستگیبهتابعمورداستفادهخواهدداشت.
توجهداشتهباشیدکهمقدارمربوطبهاینستوندرخروجیQueryهاممکناستدرهرباراجرا
متفاوتباشد(البتهدرصورتیکهاطالعاتپایگاهدادهشماتغییریابدیامحاسباتیبراساستاریخ
وزمانداشتهباشید) .
سادهترین،مثالافزودنشمارهردیفبهخروجیQueryمیباشدکهتوسطتابع
ROW_NUMBER()انجاممیشودوهرسطریکمقدارمنحصربهفردخواهدداشت.
ROW_NUMBER
اینتابعبرایهرردیفیکعددمنحصربفردرابرمیگرداند،عددانتسابدادهشدهبهصورتترتیبی
بههررکوردانتسابدادهمیشودکهازیکشروعشدهوبهتعدادرکوردهایبرگرداندهشدهافزایش
مییابد.
.باشد فیلدی چه اساس بر ها دادن شماره این ترتیب که شود بیان باید تابع این ادامه در
برای هایی ردیف شماره زیر دستور در مثال عنوان بهتخصیص دیتا در موجود های دیتا ناممی داده
: شود
SELECT ROW_NUMBER() OVER(ORDER BY NAME ASC) AS RowNumber,
NAME,
recovery_model_desc
FROM sys.databases
66. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
66 | Saba Creative Company
شرط از قبل تابع این دوم قسمت در توان می همچنینORDER BYدستور ازPARTITION BY
.نمود استفاده
از بعد های فیلد اساس بر ها داده تا شود می باعث تابع این در کلید اینPARTITION BYبندی گروه
مقدار از گروه هر ازای به و شوند1.نماید دادن شماره به شروع
اساس بر زیر دستور در مثال عنوان بهفیلدrecovery_model_descشماره و بندی گروه ها دیتا نام
: شود می گذاری
SELECT ROW_NUMBER() OVER(PARTITION BY recovery_model_desc
ORDER BY NAME ASC) AS
RowNumber,
NAME,
recovery_model_desc
FROM sys.databases
67. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
67 | Saba Creative Company
RANK
اینتابعامتیازیاز1تاالیآخربههرسطرازخروجیدستورSELECTمامیدهد.اگردوسطردارای
مقادیربرابرباشنددراینصورتمقدارتابعRankبرایهردوسطربرابرخواهدبود.بهمثالزیرتوجه
:فرمایید
SELECT i.ProductID,
p.Name,
i.LocationID,
i.Quantity,
RANK() OVER(PARTITION BY i.LocationID ORDER BY
i.Quantity DESC) AS RANK
FROM Production.ProductInventory AS i
INNER JOIN Production.Product AS p
ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY
i.LocationID
68. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
68 | Saba Creative Company
همانطورکهدرخروجیمشاهدهکرد خواهیدبراساسفیلدLocationIDمقداریبهعنوانRank
اختصاصدادهشدهاست.همچنینبرایمقادیریکسانRankهایبرابرتخصیصدادهشدهاست.
DENSE_RANK
عملکرداینتابعدقیقاهمانندتابعRANK()می،باشدبااینتفاوتکهمقادیرمربوطبهستون
DENSE_RANK()بهصورتمرتببهسطرهااختصاصدادهمیشود.بهمثالزیر: نمایید توجه
SELECT i.ProductID,
p.Name,
i.LocationID,
i.Quantity,
DENSE_RANK() OVER(PARTITION BY i.LocationID ORDER BY
i.Quantity DESC) AS
RANK
FROM Production.ProductInventory AS i
INNER JOIN Production.Product AS p
69. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
69 | Saba Creative Company
ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY
i.LocationID
NTILE
اینتابعبرایدستهبندیکردناطالعاتاستفادهمیشود.تعداددستههابهصورتیکپارامتربه
اینتابعدادهمیشود.به اطالعات زیر دستور در مثال عنوان بهچهارو شوند می بندی تقسیم دسته
: بینید می آن کنار در را دسته شماره
SELECT p.FirstName,
p.LastName,
NTILE(4) OVER(ORDER BY SalesYTD DESC) AS Quartile,
s.SalesYTD,
70. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
70 | Saba Creative Company
a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
دراینتقسیمبندیدستههایباتعدادسطربزرگتردرابتدایخروجینمایشدادهمیشود.
71. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
71 | Saba Creative Company
دستوراتPaging
OFFSET
درخیلیمواقعمالحظهمیشودکهبراینمایشتعدادیازرکوردهاییکجدولدرپایگاه،دادهکل
مقادیرموجوددرآنتوسطیکدستورselectبهدستمیآیدوصفحهبندی،خروجیبهکنترلهایموجود
سپردهمیشود.اگرپایگاهدادهمادارایتعدادزیادیرکورد،باشدآنموقعاستکهدچارمشکل
میشویم.فرضکنیدبهطورهمزمان5نفر(کهتعدادزیادینیستند)ازبرنامهماکهشامل100000
سطردادهمیباشداستفادهکنندودرهر،صفحه10رکوردنمایشدادهشودوصفحهبندیماازنوع
معقولینباشد.دراینصورتبهجایاینکهبا5×10رکورددادهرابارگزاری،کنیم5×100000رکورد
یعنی500000رکوردرابرایبهدستآوردن50رکوردبارگزاریمیکنیم.درزیرروشیشرحدادهمیشود
کهتوسط،آناینسرباراضافهازرویبرنامهوسرورهایمربوطهحذفشود.
از قبل تاSQL 2012:نمودیم می استفاده زیر همانند دستوراتی از باید بندی صفحه این انجام برای
DECLARE @PageSize INT,
@Page INT
SELECT @PageSize = 25,
@Page = 2;WITH PageNumbers AS(
SELECT c.FirstName,
c.LastName,
ROW_NUMBER()
OVER(ORDER BY FirstName)
ID
FROM
[Person].[Person] c
)
SELECT *
FROM PageNumbers
WHERE ID BETWEEN ((@Page - 1) * @PageSize + 1)
AND (@Page * @PageSize)
72. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
72 | Saba Creative Company
شامل را صفحه هر دستور این25می نمایش را دوم صفحه در موجود اطالعات و دهد می قرار رکورد
.دهد
دستور کمک با کار این اماOFFSETمشاهده را زیر دستور نکته این برای .است انجام قابل راحتی به
: نمایید
SELECT e.FirstName, [e].LastName
FROM [Person].[Person] AS [e]
ORDER BY
e.FirstName
OFFSET 0 ROWS
FETCH NEXT 25 ROWS ONLY;
73. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
73 | Saba Creative Company
،اول رکورد از دستور این25.دهد می نمایش و انتخاب را اول رکورد
SELECT e.FirstName,
[e].LastName
FROM [Person].[Person] AS [e]
ORDER BY
e.FirstName
OFFSET 25 ROWS
FETCH NEXT 25 ROWS ONLY;
75. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
75 | Saba Creative Company
[1],
[2],
[3],
[4]
FROM (
SELECT DaysToManufacture,
StandardCost
FROM Production.Product
) AS SourceTable
PIVOT(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3],
[4])
) AS PivotTable
بعدازنوشتنPivotوداخلپرانتزمقابلآنخواهیمداشت:
1.یکaggregation function.
76. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
76 | Saba Creative Company
2.نوشتنکلمهکلیدیForوتعییننامفیلدیکهقصدتبدیلآنبهچنیدستونراخواهیم
داشت.
همانطورکهدرsyntaxایندستورمالحضهمیکنید،دستورpivotحتمابایددارییک
aggregation functionباشد.
فیلدمقابلکلمهForباتوجهبهمقادیریکهبرمیگرداندهرکدامبهستونهاییمجزاتبدیلمی
شوند.مثالاگردرمقابلforاسمستونیراداریمکهمحتوایآنفیلددارایسهمقدارA,B,Cمی
باشد،درنتیجهخروجیدستورشاهدسهستونباعنوانهایA,B,Cخواهیمبود.
: فرمایید توجه زیر دستور به تر پیچیده مثالی عنوان به
SELECT VendorID,
[250] AS Emp1,
[251] AS Emp2,
[256] AS Emp3,
[257] AS Emp4,
[260] AS Emp5
FROM (
SELECT PurchaseOrderID,
EmployeeID,
VendorID
FROM Purchasing.PurchaseOrderHeader
) p
PIVOT(
COUNT(PurchaseOrderID)
FOR EmployeeID IN ([250], [251], [256], [257],
[260])
) AS pvt
ORDER BY
pvt.VendorID
78. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
78 | Saba Creative Company
Temp Table
تکنولوژیCTEازنسخهSQL Server 2005رسمیتیافتهاستوشاملیکresult setموقتی
استکهدارایناممشخصبودهومیتوانازآندردستوراتSELECT, INSERT, UPDATE,
DELETEاستفادهکرد.همچنینازCTEمیتواندردستورCREATE VIEWودستورSELECTمربوط
بهآناستفادهکرد.درنسخهSQL Server 2008نیزامکاناستفادهازCTEدردستورMERGEفراهم
شدهاست.
درSQL ServerازدونوعCTEبازگشتیوغیربازگشتیپشتیبانیمیشود.
انواعروشهایایجادجداولموقت
برایاستفادهازجداولموقتیدرسرورSQL،سهراهزیروجوددارد.
#TempTable
روشاول:استفادهازدستوریمانندزیراستکهسببایجادجدولموقتیدربانکسیستمی
tempdbمیشود.زمانیکهشماارتباطخودراباسرورSQLقطعمیکنیدبهصورتاتوماتیک
جداولموقتشماازبانکtempdbحذفمیشوند.اینروشدربرنامهنویسیپیشنهادنمیشود
وفقطدرکارهایموقتیوآزمایشیمناسباست.
SELECT * INTO #Temptable
FROM [Production].[Product]
UPDATE #Temptable
SET ListPrice = ListPrice + 100
SELECT *
FROM #Temptable
79. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
79 | Saba Creative Company
@TempTable
روشدوم:استفادهازمتغیرنوعTable،استکهنمونهآندرمثالزیردیدهمیشود.زمانیکهاز
محدودهجاریکدخودتانخارجشویدآنمتغیرنیزازحافظهپاکمیشود.ازاین،روشعمومادر
کدهایStored ProcedureهاوUserDefined Functionهااستفادهمیشود.
DECLARE @tempTable TABLE
(
[ProductID] [int] NOT NULL,
[ProductName] [nvarchar](40) NOT NULL,
[ListPrice] [money] NULL
)
INSERT INTO @tempTable
SELECT ProductID,
NAME,
ListPrice
FROM [Production].[Product]
UPDATE @temptable
SET [ListPrice] = [ListPrice] + 10
SELECT *
FROM @tempTable
80. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
80 | Saba Creative Company
CTE
روشسوم:استفادهازCTEاستکهمزیتهایینسبتبهدوروشقبلیداردودربخشبعدیبه
نحوهتعریفواستفادهازآنخواهیمپرداخت.
کارباCTE
سادهترینشکلتعریفیکCTEبهصورتزیراست:
WITH yourName [(Column1, Column2, ...)]
AS
(
your query
81. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
81 | Saba Creative Company
)
باکلمهWITHشروعشدهویکناماختیاریبهآندادهمیشود.سپسفهرستفیلدهایجدول
موقترادرونزوج،پرانتزمشخصمیکنید.تعریفاینفیلدهااختیاریاستواگرحذف،شود
فیلدهایجدول،موقتمانندفیلدهایکوئریمربوطهخواهدبود.
your queryشاملدستوریاستکهسببتولیدیکresult setمیشود.قواعدتعریفاینکوئری
مشابهقواعدتعریفکوئریاستکهدردستورCREATE VIEWکاربرددارد.
82. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
82 | Saba Creative Company
شکلکلیدستور
همانطورکهازاینتصویرمشخصاستمیتوانچندینبلوکازاینساختاررابهدنبالهمتعریف
نمودکهباکاماازهمجدامیشوند.درواقعیکیازکاربردهایCTEایجادقطعاتکوچکیاستکه
امکاناستفادهمجددرابهشمادادهومیتواندسببخواناترشدنکدهایپیچیدهشود.
یکیدیگرازکاربردهایCTEآنجاییاستکهشمانمیخواهیدیکشیViewیعمومیتعریفکنید
ودرعینحالمیخواهیدازمزایایViewهابهرمندشوید.
وهمچنینازکاربردهایدیگرCTEتعریفجدولموقتواستفادهازآنجدولبهصورتهمزماندر
یکدستوراست.
بعدازآنکهCTEیاCTEهایخودتانراتعریفکردیدآنگاهمیتوانیدمانندجداولمعمولیازآنها
استفادهکنید.استفادهازاینجداولتوسطدستوریخواهدبودکهدقیقابعدازتعریفCTEنوشته
میشود.
ایجادیکCTEغیربازگشتی
مثال،اولیکCTEغیربازگشتیسادهرانشانمیدهد.
WITH CTE_temp
AS
(
SELECT NAME,
ProductNumber,
ListPrice
FROM [Production].[Product]
)
SELECT *
FROM CTE_temp
ORDER BY
ListPrice DESC
83. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
83 | Saba Creative Company
مثالدومنمونهایدیگرازیکCTEغیربازگشتیاست.
WITH orderSales(OrderID, Total)
AS
(
SELECT SalesOrderID,
SUM(UnitPrice * OrderQty) AS Total
FROM [Sales].[SalesOrderDetail]
GROUP BY
SalesOrderID
)
SELECT O.SalesPersonID,
SUM(OS.Total) AS TotalSales
FROM [Sales].[SalesOrderHeader] AS O
INNER JOIN [orderSales] AS OS
84. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
84 | Saba Creative Company
ON O.SalesOrderID = OS.[OrderID]
GROUP BY
O.SalesPersonID
ORDER BY
TotalSales DESC
هدفاین،کوئریمحاسبهکلمیزانفروش،کاالهابهازایهرفروش پرسنلمیباشد.ابتداازجدول
SalesOrderDetailمجموعفروشهرسفارشمحاسبهشدهونتیجهآندریکCTEبهنام
orderSalesقرارمیگیردوازJOINاینجدولموقتباجدولSalesOrderHeaderمحاسبه
نهاییانجامشدهونتیجهایماننداینتصویرحاصلمیشود.
مثالسوماستفادهازدوCTEرابهصورتهمزماننشانمیدهد:
85. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
85 | Saba Creative Company
WITH CustomerList
AS
(
SELECT CustomerID,
AccountNumber
FROM [Sales].[Customer]
)
,OrderList
AS
(
SELECT CustomerID,
OrderDate
FROM [Sales].[SalesOrderHeader]
WHERE YEAR([OrderDate]) > 2000
)
SELECT cl.AccountNumber,
YEAR(ol.OrderDate) AS SalesYear
FROM customerList AS cl
JOIN orderList AS ol
ON cl.[CustomerID] = ol.[CustomerID]
86. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
86 | Saba Creative Company
مثالچهارماستفادهمجددازیکCTEرانشانمیدهد.فرضکنیدجدولیبهنامdigitsداریمکه
فقطیکفیلدdigitداردودارای10رکوردبامقادیر0تا9است.مانندتصویرزیر
87. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
87 | Saba Creative Company
حالمیخواهیمازطریقCROSS JOINاعداد1تا100رابااستفادهازمقادیراینجدولتولیدکنیم.
کدزیرآنرانشانمیدهد:
WITH digitList
AS
(
SELECT [digit]
FROM [digits]
)
SELECT a.[digit] * 10 + b.[digit] + 1 AS [Digit]
FROM [digitList] AS a
CROSS JOIN [digitList] AS b
دراینکدیکCTEتعریفشدهودوبارمورداستفادهقرارگرفتهاست.مثالاگربخواهیداعداد1تا
1000راتولیدکنیدمیتوانیدسهبارازآناستفادهکنید.حاصلایندستورresult setیمانندزیر
است.
88. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
88 | Saba Creative Company
حتیمیتوانازیکCTEدرکوئریCTEبعدیمانندکدزیراستفادهکرد.
WITH CTE_1 AS
(
....
),
CTE_2 AS
(
SELECT ... FROM CTE_1 JOIN ...
)
SELECT *
FROM FOO
LEFT JOIN CTE_1
LEFT JOIN CTE_2
ایجادیکCTEبازگشتی
ازCTEبازگشتیبرایپیمایشجداولیاستفادهمیشودکهرکوردهایآندارایرابطهسلسلهمراتبی
یادرختیاست.نمونهاین،جداولجدولکارمنداناستکهمدیرهرکارمندنیزمشخصشدهاست
یاجدولیکهساختارسازمانیرانشانمیدهدیاجدولیکهموضوعاتدرختیرادرخودذخیرهکرده
است.یکیازمزایایاستفادهازCTE،بازگشتیسرعتکارآندرمقایسهباروشهایپردازشیدیگر
است.
ساختارکلییکدستورCTEبازگشتیبهصورتزیراست.
WITH cteName AS
89. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
89 | Saba Creative Company
(
query1
UNION ALL
query2
)
دربدنهCTEحداقلدوعضو(کوئری)وجودداردکهبایستیبایکیازعبارتهایزیربههممتصل
شوند.
UNION
UNION ALL
INTERSECT
EXCEPT
query1شاملدستوریاستکهاولینسریازرکوردهایresult setنهاییراتولیدمیکند.اصطالحا
بهاینکوئریanchor memberمیگویند.
بعدازدستورquery1،حتمابایستیازUNION ALLوامثالآنهااستفادهشود.
سپسquery2ذکرمیشود.اصطالحابهاینکوئریrecursive memberگفتهمیشود.اینکوئری
شاملدستوریاستکهسطوحبعدیدرختراتولیدخواهدکرد.اینکوئریدارایشرایطزیراست.
حتمابایستیبهCTEکههمانcteNameاستاشارهکردهودرجاییازآناستفادهشدهباشد.به
عبارتدیگرازرکوردهایموجوددرجدولموقتاستفادهکندتابتواندرکوردهایبعدیراتشخیص
دهد.
حتمابایستیمطمئنشویدکهشرایطکافیبرایپایانحلقهپیمایشرکوردهاراداشتهباشددرغیر
اینصورتسببتولیدحلقهبیپایانخواهدشد.
بدنهCTEمیتواندحاویچندینanchor memberوچندینrecursive memberباشدولیفقط
recursive memberهاهستندکهبهCTEاشارهمیکنند.
برایآنکهنکاتفوقروشنشودبهمثالهایزیرتوجهکنید.
فرضکنیدجدولیازکارمندانومدیرانآنهاداریمکهبهصورتزیرتعریفومقداردهیاولیهشده
است.
IF OBJECT_ID('Employees', 'U') IS NOT NULL
DROP TABLE dbo.Employees
90. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
90 | Saba Creative Company
GO
CREATE TABLE dbo.Employees
(
EmployeeID INT NOT NULL PRIMARY KEY,
FirstName VARCHAR(50)NOT NULL,
LastName VARCHAR(50)NOT NULL,
ManagerID INT NULL
)
GO
INSERT INTO Employees
VALUES
(
101,
'Alireza',
'Nematollahi',
NULL
)
INSERT INTO Employees
VALUES
(
102,
'Ahmad',
'Mofarrahzadeh',
101
)
INSERT INTO Employees
VALUES
(
103,
'Mohammad',
'BozorgGhommi',
102
)
INSERT INTO Employees
VALUES
91. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
91 | Saba Creative Company
(
104,
'Masoud',
'Narimani',
103
)
INSERT INTO Employees
VALUES
(
105,
'Mohsen',
'Hashemi',
103
)
INSERT INTO Employees
VALUES
(
106,
'Aref',
'Partovi',
102
)
INSERT INTO Employees
VALUES
(
107,
'Hosain',
'Mahmoudi',
106
)
INSERT INTO Employees
VALUES
(
108,
'Naser',
'Pourali',
106
)
INSERT INTO Employees
92. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
92 | Saba Creative Company
VALUES
(
109,
'Reza',
'Bagheri',
102
)
INSERT INTO Employees
VALUES
(
110,
'Abbas',
'Najafian',
102
)
مثالاول:میخواهیمفهرستکارمندانرابههمراهناممدیرآنهاوشمارهسطحدرختنمایش
دهیم.کوئریزیرنمونهایازیککوئریبراساسCTEبازگشتیمیباشد.
WITH cteReports(EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID,
FirstName,
LastName,
ManagerID,
1
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID,
e.FirstName,
e.LastName,
e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.ManagerID = r.EmpID
93. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
93 | Saba Creative Company
)
SELECT FirstName + ' ' + LastName AS FullName,
EmpLevel,
(
SELECT FirstName + ' ' + LastName
FROM Employees
WHERE EmployeeID = cteReports.MgrID
) AS Manager
FROM cteReports
ORDERBY EmpLevel,
MgrID
کوئریاولدربدنهCTEرکوردمدیریرامیدهدکهریشهدرختبودهوباالسرینداردوشمارهسطح
اینرکوردرا1درنظرمیگیرد.
کوئریدومدربدنهCTEازیکJOINبینEmployeesوcteReportsاستفادهکردهوکارمندانزیر
دستهرکارمندقبلی(فرزندان)رابدستآوردهومقدارشمارهسطحآنرابهصورتLevel+1تنظیم
میکند.
درنهایتبااستفادهازCTEویکsubqueryجهتبدستآوردنناممدیرهر،کارمندنتیجهنهایی
تولیدمیشود.
مثالدوم:میخواهیمشناسهیککارمندرابدهیموناماووناممدیرانویرابهعنوانجوابدر
خروجیبگیریم.
WITH cteReports(EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID,
FirstName,
LastName,
ManagerID,
1
FROM Employees
WHERE EmployeeID = 110
UNION ALL
SELECT e.EmployeeID,
e.FirstName,
e.LastName,
94. کاربردی آموزش مرجعSQLکارشناسان برای Saba Creative Company
94 | Saba Creative Company
e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.EmployeeID = r.MgrID
)
SELECT FirstName + ' ' + LastName AS FullName,
EmpLevel
FROM cteReports
ORDERBY EmpLevel
اگردقتکنیداولینتفاوتدرخطاولمشاهدهمیشود.دراینجامشخصمیکندکهاولینسریاز
رکوردهاچگونهانتخابشود.مثالکارمندیرامیخواهیمکهشناسهآن110باشد.
دومینتفاوتاصلیاینکوئریبامثال،قبلیدرقسمتدومدیدهمیشود.شمامیخواهیدمدیر
(پدر)کارمندیکهدرآخرینپردازشدرجدولموقتقرارگرفتهاسترااستخراجکنید.