Filtrarea datelor cu predicate

Finalizat

Cele mai simple instrucțiuni SELECT cu doar clauze SELECT și FROM vor evalua fiecare rând dintr-un tabel. Utilizând o clauză WHERE, definiți condițiile care determină rândurile care vor fi procesate și pot reduce setul de rezultate.

Structura clauzei WHERE

Clauza WHERE este alcătuită din una sau mai multe condiții de căutare, fiecare dintre acestea trebuie să se evalueze la TRUE, FALSE sau "necunoscut" pentru fiecare rând al tabelului. Rândurile vor fi returnate doar atunci când clauza WHERE se evaluează ca TRUE. Condițiile individuale acționează ca filtre ale datelor și sunt denumite "predicate". Fiecare predicat include o condiție testată, utilizând de obicei operatorii de comparație de bază:

  • = (este egal cu)
  • <> (nu este egal cu)
  • > (mai mare decât)
  • >= (mai mare sau egal cu)
  • < (mai mic decât)
  • <= (mai mic sau egal cu)

De exemplu, următoarea interogare returnează toate produsele cu valoarea ProductCategoryID 2:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;

În mod similar, următoarea interogare returnează toate produsele cu un Preț ListPrice mai mic decât 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;

ESTE NUL / NU ESTE NUL

De asemenea, puteți filtra cu ușurință pentru a permite sau a exclude valorile "necunoscute" sau NULL utilizând IS NULL sau IS NOT NULL.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;

Condiții multiple

Predicatele multiple pot fi combinate cu operatorii AND și OR și cu paranteze. Cu toate acestea, SQL Server va procesa doar două condiții simultan. Toate condițiile trebuie să fie TRUE atunci când conectați mai multe condiții cu operatorul AND. Atunci când utilizați operatorul OR pentru a conecta două condiții, una sau ambele pot fi TRUE pentru setul de rezultate.

De exemplu, următoarea interogare returnează produsul din categoria 2 care costă mai puțin de 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    AND ListPrice < 10.00;

OPERATORII AND sunt procesați înainte de operatorii OR, cu excepția cazului în care parantezele sunt utilizate. Pentru cele mai bune practici, utilizați paranteze atunci când utilizați mai mult de două predicate. Următoarea interogare returnează produse din categoria 2 OR 3 ȘI costă mai puțin de 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
    AND (ListPrice < 10.00);

Operatori de comparație

Transact-SQL include operatori de comparație care pot simplifica clauza WHERE.

IN

Operatorul IN este o comandă rapidă pentru mai multe condiții de egalitate pentru aceeași coloană conectată cu OR. Nu este nimic în neregulă cu utilizarea mai multor condiții OR într-o interogare, ca în exemplul următor:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    OR ProductCategoryID = 3
    OR ProductCategoryID = 4;

Totuși, utilizarea IN este clară și concisă, iar performanța interogării nu va fi afectată.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);

ÎNTRE

BETWEEN este o altă comandă rapidă care poate fi utilizată la filtrarea pentru o limită superioară și inferioară pentru valoare în loc să utilizați două condiții cu operatorul AND. Următoarele două interogări sunt echivalente:

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;

Operatorul BETWEEN utilizează valori de limite inclusiv. Produsele cu un preț de 1,00 sau 10,00 vor fi incluse în rezultate. BETWEEN este util și atunci când interogați câmpurile de date. De exemplu, următoarea interogare va include toate numele de produse modificate între 1 ianuarie 2012 și 31 decembrie 2012:

SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';

Nume produs

Data modificării

Șosete cu bicicleta montană, M

2012-01-01 00:00:00.000

Cadru munte HL - Argintiu, 42

2012-03-05 00:00:00.000

Cadru munte HL - Argintiu, 38

2012-08-29 00:00:00.000

Munte-100 Argintiu, 38

2012-12-31 00:00:00.000

Totuși, deoarece nu specificăm un interval de timp, nu se returnează niciun rezultat după 2012-12-31 00:00:00.000. Pentru a include corect data și ora, trebuie să includem ora în predicat:

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';

Operatorii de comparație de bază, cum ar fi Mai mare (>) și Egal (=) sunt, de asemenea, exacți atunci când filtrați doar după dată:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01' 
    AND ModifiedDate < '2013-01-01';

PLĂCEA

Operatorul de comparație final poate fi utilizat doar pentru datele caracterului și ne permite să utilizăm metacaractere și modele regulate de expresii. Caracterele wildcard ne permit să specificăm șiruri parțiale. De exemplu, puteți utiliza următoarea interogare pentru a returna toate produsele cu nume care conțin cuvântul "munte":

SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';

Metacaracterul % reprezintă orice șir de 0 sau mai multe caractere, astfel încât rezultatele includ produse cu cuvântul "munte" oriunde în numele lor, astfel:

Nume

Preț Listă

Șosete cu bicicleta montană, M

9.50

Șosete cu bicicleta montană, L

9.50

Cadru munte HL - Argintiu, 42

1364.0

Rama muntelui HL - Negru, 42

1349.60

Cadru munte HL - Argintiu, 38

1364.50

Munte-100 Argintiu, 38

3399.99

Puteți utiliza metacaracterul _ (caracter de subliniere) pentru a reprezenta un singur caracter, astfel:

SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';

Următoarele rezultate includ doar produse care încep cu "Șosete pentru biciclete montane" și un singur caracter după:

Nume produs

Preț Listă

Șosete cu bicicleta montană, M

9.50

Șosete cu bicicleta montană, L

9.50

De asemenea, puteți defini modele complexe pentru șiruri pe care doriți să le găsiți. De exemplu, următoarea interogare a căutat produse cu un nume care începe cu "Munte", apoi urmat de:

  • trei caractere între 0 și 9
  • un spațiu
  • orice șir
  • virgulă
  • un spațiu
  • două caractere între 0 și 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Rezultatele din această interogare pot arăta astfel:

Nume produs

Preț Listă

Munte-100 Argintiu, 38

3399.99

Munte-100 Argintiu, 42

3399.99

Munte-100 Negru, 38

3399.99

Munte-100 Negru, 42

3399.99

Munte-200 Silver, 38

2319.99

Munte-200 Argint, 42

2319.99

Munte-200 Negru, 38

2319.99

Munte-200 Negru, 42

2319.99