فیلتر کردن داده ها در sql server
معمولا یک برنامه یا اپلیکیشن، تنها به بخشی از ردیف های یک جدول نیاز دارد.
بعنوان مثال یک نرم افزار ثبت سفارش را در نظر بگیرید. انتظار ما از این برنامه این است که در یک زمان خاص، تنها اطلاعات یک مشتری را نشان دهد.
ممکن است میلیون ها سفارش در دیتابیس این برنامه وجود داشته باشند، اما ما تنها به تعداد انگشت شماری از ردیف های این جدول نیاز داریم، نه کل جدول.
فیلتر کردن داده ها، یک بخش بسیار مهم در زبان T-SQL می باشد.
اضافه کردن دستور WHERE به کوئری
برای اینکه بتوانید ردیف های برگردانده شده توسط یک کوئری را فیلتر کنید، باید از دستور WHERE در داخل دستور SELECT استفاده نمایید. انجین دیتابیس دستور WHERE را درست پس از دستور FROM و بعنوان دومین دستور، پردازش می کند. دستور WHERE شامل یک سری عبارت است که به آنها predicates گفته می شود که تنها می توانند به صورت TRUE و FALSE و یا UNKNOWN ارزیابی شوند.
نحوه ی نوشتن(سینتکس) دستور WHERE به صورت زیر است:
سینتکس:
SELECT <column1>,<column2>
FROM <schema>.<table>
WHERE <column> = <value>;
در لیست 3.5 چند مثال به همراه سینتکس آورده شده است که به ما نشان می دهد که چگونه می توانیم یک ستون را با یک مقدار لیترال مورد مقایسه قرار دهیم.
این مثال ها، به دیتابیس AdventureWorks تعلق دارند.
یکی یکی کوئری ها را در داخل پنجره ی کوئری بنویسید و سپس آن را اجرا کنید تا نتیجه را مشاهده کنید.
سعی کنید هر یک از این کوئری ها را که اجرا می کنید، مورد بررسی قرار دهید و ببینید که دستور WHERE چگونه بر روی مقادیر برگردانده شده تاثیر می گذارد.
همان طور که در این دستورات مشاهده می کنید، رشته ها و تاریخ های لیترال، در داخل تک-کوتیشن ها قرار گرفته اند.
لیست 3.5
--1
SELECT CustomerID, SalesOrderID
FROM Sales.SalesOrderHeader
WHERE CustomerID = 11000;
--2
SELECT CustomerID, SalesOrderID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID = 43793;
--3
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate = '2005-07-02';
--4
SELECT BusinessEntityID, LoginID, JobTitle
FROM HumanResources.Employee
WHERE JobTitle = 'Chief Executive Officer';
هریک از کوئری های درون لیست 3.5 ردیف های فیلتر شده توسط عبارت جلوی دستور WHERE را برمی گرداند.
اطمینان حاصل کنید که نتایج به دست آمده توسط هر یک از این کوئری ها مشابه با تصویر 3.5 باشد.
هر یک از این کوئری ها، تنها اطلاعات مشخص شده در جلوی دستور WHERE خود را برمی گرداند.
نکته: در این کتاب، از کامنت ها در داخل کدها بسیار زیاد استفاده می شود.
کامنت ها عباراتی هستند که توسط SQL SERVER پردازش نمی شوند و تنها باعث می شوند که خوانایی کدها افزایش یابد.
برای ایجاد یک کامنت یک خطی، کافیست از دو خط فاصله(--) استفاده کنید.
برای اینکه یک کامنت چند خطی ایجاد کنید، در ابتدا از یک علامت اسلش+ ستاره (*/) استفاده کنید و در انتها از یک علامت ستاره + علامت اسلش (/*) استفاده کنید.
استفاده از عملگرهای مقایسه ای در دستور WHERE
در داخل عباراتی که از دستور WHERE استفاده می کنند،می توانید از عملگرهای مقایسه ای زیادی استفاده کنید و مجبور نیستید که تنها از علامت مساوی استفاده کنید. این عملگرها عبارتند از:
عملگرهای مقایسه ای:
> (greater than)
< (less than)
= (equals)
<= (less than or equal to)
>= (greater than or equal to)
!= (not equal to)
<> (not equal to)
!< (not less than)
!> (not greater than)
بعنوان تمرین، کوئری های درون لیست 3.6 را در SQL server تایپ کنید و آنها را اجرا کنید:
لیست 3.6
--Using a DateTime column
--1
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate > '2005-07-05';
--2
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate < '2005-07-05';
--3
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate >= '2005-07-05';
--4
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate <> '2005-07-05';
--5
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate != '2005-07-05';
--Using a number column
--6
SELECT SalesOrderID, SalesOrderDetailID, OrderQty
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10;
--7
SELECT SalesOrderID, SalesOrderDetailID, OrderQty
FROM Sales.SalesOrderDetail
WHERE OrderQty <= 10;
--8
SELECT SalesOrderID, SalesOrderDetailID, OrderQty
FROM Sales.SalesOrderDetail
WHERE OrderQty <> 10;
--9
SELECT SalesOrderID, SalesOrderDetailID, OrderQty
FROM Sales.SalesOrderDetail
WHERE OrderQty != 10;
--Using a string column
--10
SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE FirstName <> 'Catherine';
--11
SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE FirstName != 'Catherine';
--12
SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE FirstName > 'M';
--13
SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE FirstName !> 'M';
به نتیجه ی هر یک از کوئری ها دقت کنید، تا معنی آنها را بفهمید و اینکه بفهمید چرا آنها را مورد استفاده قرار می دهید.
به یاد بیاورید که عملگرهای =! و <> به معنی "برابر نیست با" می باشند و می توانید از هردوی آنها استفاده کنید. هر یک از این عملگرها نتیجه ی یکسانی ایجاد می کنند.
ممکن است نتیجه ی کوئری شماره 12 برای شماجالب باشد. در نگاه اول، ممکن است فکر کنید که تنها ردیف هایی که first name آنها با حرف N یا دیگر حرف های بزرگتر از آن در حروف الفبا، شروع می شوند، بعنوان نتیجه برگردانده می شوند.
اما می گوییم که اگر حرف اول یک مقدار در ستون FirstName برابر با M باشد و پس از آن حداقل یک کاراکتر دیگر قرار گرفته باشد، این مقدار از M بزرگتر خواهد بود. و بنابراین برگردانده می شود. بعنوان مثال Ma بزرگتر از M محسوب می شود.
کوئری شماره 13 هم یک مثال جالب است که ممکن است تا حالا با آن رو به رو نشده باشید. این کوئری یعنی FirstName هایی را به ما بده که از حرف M بزرگتر نیستند. این یعنی خود M و هر حرفی از الفبا که قبل از M قرار می گیرد را به ما بده.
استفاده از عملگر BETWEEN
عملگر BETWEEN یک عملگر کاربردی دیگر است که می توانید آن را به همراه دستور WHERE به کار ببرید تا یک محدوده از مقادیر را مشخص کنید. از این عملگر به طور فراوان بر روی تاریخ ها استفاده می شود. اما می توان آن را به خوبی بر روی رشته ها و داده های عددی استفاده نمود. سینتکس عملگر BETWEEN به صورت زیر است:
سینتکس:
SELECT <column1>,<column2>
FROM <schema>.<table>
WHERE <column> BETWEEN <value1> AND <value2>;
کدهای لیست 3.7 را تایپ و اجرا کنید تا با کاربرد عملگر BETWEEN آشنا شوید.
لیست 3.7
--1
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate BETWEEN '2005-07-02' AND '2005-07-04';
--2
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE CustomerID BETWEEN 25000 AND 25005;
--3
SELECT BusinessEntityID, JobTitle
FROM HumanResources.Employee
WHERE JobTitle BETWEEN 'C' and 'E';
--4 An illogical BETWEEN expression
SELECT CustomerID, SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
WHERE CustomerID BETWEEN 25005 AND 25000;
به نتیجه ی کوئری های لیست 3.7 که در تصویر زیر(تصویر 3.6) نشان داده شده است، دقت کنید. کوئری شماره ی 1 باعث می شود که تمام سفارشات(orders) در دو تاریخ مشخص شده و بین آنها، برگردانده شود.
همین رفتار نیز در کوئری شماره 2 مشاهده می شود. در این کوئری، تمام سفارشات(orders)ی که ID آنها بین یک محدوده قرار دارند را برمی گرداند.
در کوئری شماره 3 تمام JobTitle ها که با حرف C یا D شروع می شوند، برگردانده خواهند شد.اما JobTitle هایی که با حرف E شروع می شوند برگردانده نخواهند شد. اما اگر یک JobTitle تنها از یک حرف E تشکیل شده باشد برگردانده خواهد شد. هر JobTitle ای که با یک حرف E و حداقل یک حرف دیگر شروع شده باشد، از حرف E بزرگتر است بنابراین در داخل این محدوده قرار نمی گیرد.
بعنوان مثال، حرف Ex در کلمه ی Executive بزرگتر از حرف E به تنهایی است. بنابراین هر JobTitle ای که با Executive شروع شود، حذف خواهد شد:
(عکس 3.6)
کوئری 4، اصلا هیچ نتیجه ای را بر نمی گرداند.زیرا مقادیر قرار گرفته در بین عملگر BETWEEN جابه جا نوشته شده اند. همواره به هنگام استفاده از عملگر BETWEEN ، اطمینان حاصل کنید که، مقدار کمتر را اول بنویسید و مقدار بیشتر را دوم بنویسید.
یک نکته ی قابل توجه دیگر این است که در نتایج کوئری که در بالا نوشته شده اند، برای تاریخ ها هیچ زمانی برگردانده نشده است(یعنی 0 هستند). دلیل این امر این است که هیچ مقداری برای زمان رکوردها تنظیم نشده است. اما هنگامی که مقادیر زمان را ثبت کنیم، دستور WHERE آنها را به ما نشان خواهد داد.
- نوشته شده توسط احسان عباسی
- بازدید: 7231