กรองข้อมูลด้วยเพรดิเคต
คําสั่ง SELECT ที่ง่ายที่สุดที่มีเฉพาะส่วนคําสั่ง SELECT และ FROM เท่านั้นที่จะประเมินทุกแถวในตาราง เมื่อใช้คําสั่งย่อย WHERE คุณสามารถกําหนดเงื่อนไขที่กําหนดแถวที่จะประมวลผลและอาจลดชุดผลลัพธ์
โครงสร้างของส่วนคําสั่ง WHERE
คําสั่งย่อย WHERE ประกอบด้วยเงื่อนไขการค้นหาอย่างน้อยหนึ่งเงื่อนไข ซึ่งแต่ละเงื่อนไขจะต้องประเมินเป็น TRUE, FALSE หรือ 'ไม่รู้จัก' สําหรับแต่ละแถวของตาราง แถวจะถูกส่งกลับเมื่อส่วนคําสั่ง WHERE ประเมินเป็น TRUE เท่านั้น เงื่อนไขแต่ละรายการทําหน้าที่เป็นตัวกรองบนข้อมูลและเรียกว่า 'เพรดิเคต' เพรดิเคตแต่ละเพรดิเคตประกอบด้วยเงื่อนไขที่กําลังทดสอบ โดยปกติแล้วจะใช้ตัวดําเนินการเปรียบเทียบพื้นฐาน:
- = (เท่ากับ)
- <> (ไม่เท่ากับ)
- > (มากกว่า)
- >= (มากกว่าหรือเท่ากับ)
- < (น้อยกว่า)
- <= (น้อยกว่าหรือเท่ากับ)
ตัวอย่างเช่น คิวรีต่อไปนี้จะแสดงผลิตภัณฑ์ทั้งหมดที่มีค่า ProductCategoryID เท่ากับ 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
ในทํานองเดียวกัน คิวรีต่อไปนี้จะแสดงผลิตภัณฑ์ทั้งหมดที่มี ListPrice น้อยกว่า 10.00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
เป็น NULL / ไม่ใช่ NULL
คุณยังสามารถกรองเพื่ออนุญาตหรือแยกค่า 'ไม่รู้จัก' หรือค่า NULL โดยใช้ IS NULL หรือ IS NOT NULL ได้อย่างง่ายดาย
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
หลายเงื่อนไข
เพรดิเคตหลายรายการสามารถรวมกับตัวดําเนินการ AND และ OR และด้วยวงเล็บได้ อย่างไรก็ตาม SQL Server จะประมวลผลเงื่อนไขสองเงื่อนไขเท่านั้นในแต่ละครั้ง เงื่อนไขทั้งหมดต้องเป็น TRUE เมื่อเชื่อมต่อหลายเงื่อนไขกับตัวดําเนินการ AND เมื่อใช้ตัวดําเนินการ OR เพื่อเชื่อมต่อเงื่อนไขสองเงื่อนไข หนึ่งหรือทั้งสองอาจจะเป็น TRUE สําหรับชุดผลลัพธ์
ตัวอย่างเช่น คิวรีต่อไปนี้จะส่งกลับผลิตภัณฑ์ในประเภท 2 ที่ต้นทุนน้อยกว่า 10.00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
ตัวดําเนินการ AND จะถูกประมวลผลก่อนตัวดําเนินการ OR เว้นแต่ว่าจะใช้วงเล็บ สําหรับแนวทางปฏิบัติที่ดีที่สุด ให้ใช้วงเล็บเมื่อใช้เพรดิเคตมากกว่าสองรายการ คิวรีต่อไปนี้จะส่งกลับผลิตภัณฑ์ในประเภท 2 หรือ 3 และ ค่าใช้จ่ายน้อยกว่า 10.00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
ตัวดําเนินการเปรียบเทียบ
Transact-SQL รวมถึงตัวดําเนินการเปรียบเทียบที่สามารถช่วยลดความซับซ้อนของส่วนคําสั่ง WHERE
IN
ตัวดําเนินการ IN เป็นทางลัดสําหรับเงื่อนไขความเท่ากันหลายเงื่อนไขสําหรับคอลัมน์เดียวกันที่เชื่อมต่อกับ OR ไม่มีสิ่งใดผิดปกติในการใช้เงื่อนไข OR หลายรายการในคิวรี ดังในตัวอย่างต่อไปนี้:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
อย่างไรก็ตาม การใช้ IN นั้นชัดเจนและรัดกุม และประสิทธิภาพของคิวรีจะไม่ได้รับผลกระทบ
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
ระหว่าง
BETWEEN เป็นทางลัดอื่นที่สามารถใช้ได้เมื่อกรองสําหรับขอบด้านบนและด้านล่างสําหรับค่าแทนที่จะใช้เงื่อนไขสองเงื่อนไขกับตัวดําเนินการ AND คิวรีสองรายการต่อไปนี้เทียบเท่ากัน:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
ตัวดําเนินการ BETWEEN ใช้ค่าขอบเขตแบบรวม ผลิตภัณฑ์ที่มีราคา 1.00 หรือ 10.00 จะรวมอยู่ในผลลัพธ์ BETWEEN จะมีประโยชน์เมื่อคิวรีเขตข้อมูลวันที่ ตัวอย่างเช่น คิวรีต่อไปนี้จะรวมชื่อผลิตภัณฑ์ทั้งหมดที่ปรับเปลี่ยนระหว่างวันที่ 1 มกราคม 2012 ถึงวันที่ 31 ธันวาคม 2012:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ชื่อผลิตภัณฑ์
วันที่ปรับเปลี่ยน
ถุงเท้าจักรยานเสือภูเขา, M
2012-01-01 00:00:00.000
กรอบภูเขา HL - เงิน, 42
2012-03-05 00:00:00.000
กรอบภูเขา HL - เงิน, 38
2012-08-29 00:00:00.000
Mountain-100 Silver, 38
2012-12-31 00:00:00.000
อย่างไรก็ตาม เนื่องจากเราไม่ได้ระบุช่วงเวลา ไม่มีผลลัพธ์ถูกส่งกลับหลังจาก 2012-12-31 00:00:00.000 เพื่อให้รวม วันที่และเวลา ให้ถูกต้อง เราจําเป็นต้องรวมเวลาไว้ในเพรดิเคต:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
ตัวดําเนินการเปรียบเทียบพื้นฐาน เช่น Greater Than (>) และ Equals (=) ยังถูกต้องเมื่อกรองตามวันที่เท่านั้น:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
ชอบ
ตัวดําเนินการเปรียบเทียบขั้นสุดท้ายสามารถใช้ได้เฉพาะสําหรับข้อมูลอักขระเท่านั้น และช่วยให้เราสามารถใช้อักขระตัวแทนและรูปแบบนิพจน์ปกติได้ สัญลักษณ์ตัวแทนช่วยให้เราสามารถระบุสตริงบางส่วนได้ ตัวอย่างเช่น คุณสามารถใช้คิวรีต่อไปนี้เพื่อส่งคืนผลิตภัณฑ์ทั้งหมดที่มีชื่อที่มีคําว่า "mountain":
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
อักขระ % ตัวแทนจะแสดงสตริงใด ๆ ของ 0 หรือมากกว่า ดังนั้นผลลัพธ์จะรวมผลิตภัณฑ์ที่มีคําว่า "mountain" ที่ใดก็ตามในชื่อ ดังเช่นนี้:
Name
ListPrice
ถุงเท้าจักรยานเสือภูเขา, M
9.50
ถุงเท้าจักรยานเสือภูเขา, L
9.50
กรอบภูเขา HL - เงิน, 42
1364.0
กรอบภูเขา HL - สีดํา, 42
1349.60
กรอบภูเขา HL - เงิน, 38
1364.50
Mountain-100 Silver, 38
3399.99
คุณสามารถใช้อักขระตัวแทน _ (ขีดล่าง) เพื่อแสดงอักขระเดี่ยวเช่นนี้:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
ผลลัพธ์ต่อไปนี้รวมเฉพาะผลิตภัณฑ์ที่ขึ้นต้นด้วย "Mountain Bike Socks, " และอักขระเดียวหลังจาก:
ชื่อผลิตภัณฑ์
ListPrice
ถุงเท้าจักรยานเสือภูเขา, M
9.50
ถุงเท้าจักรยานเสือภูเขา, L
9.50
คุณยังสามารถกําหนดรูปแบบที่ซับซ้อนสําหรับสตริงที่คุณต้องการค้นหาได้ ตัวอย่างเช่น คิวรีต่อไปนี้ค้นหาผลิตภัณฑ์ที่มีชื่อที่ขึ้นต้นด้วย "Mountain-" จากนั้นจึงตามด้วย:
- สามอักขระระหว่าง 0 ถึง 9
- ช่องว่าง
- สตริงใด ๆ
- เครื่องหมายจุลภาค
- ช่องว่าง
- สองอักขระระหว่าง 0 ถึง 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
ผลลัพธ์จากคิวรีนี้อาจมีลักษณะดังนี้:
ชื่อผลิตภัณฑ์
ListPrice
Mountain-100 Silver, 38
3399.99
Mountain-100 Silver, 42
3399.99
Mountain-100 สีดํา, 38
3399.99
Mountain-100 สีดํา, 42
3399.99
Mountain-200 Silver, 38
2319.99
Mountain-200 Silver, 42
2319.99
Mountain-200 สีดํา, 38
2319.99
Mountain-200 สีดํา, 42
2319.99