Резюме :в този урок ще научите как да използвате SQLite EXISTS
оператор за тестване за съществуването на редове, върнати от подзаявка.
Въведение в SQLite EXISTS
оператор
EXISTS
операторът е логически оператор, който проверява дали подзаявката връща някакъв ред.
Ето основния синтаксис на EXISTS
оператор:
EXISTS(subquery)
Code language: SQL (Structured Query Language) (sql)
В този синтаксис подзаявката е SELECT
оператор, който връща нула или повече реда.
Ако подзаявката върне един или повече редове, EXISTS
оператор връща вярно. В противен случай EXISTS
операторът връща false или NULL
.
Имайте предвид, че ако подзаявката върне един ред с NULL
, резултатът от EXISTS
операторът все още е вярно, тъй като резултатният набор съдържа един ред с NULL.
За да отричате EXISTS
оператор, използвате NOT EXISTS
оператор, както следва:
NOT EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
NOT EXISTS
операторът връща true, ако подзаявката не връща ред.
SQLite EXISTS
пример за оператор
Вижте следните Customers
и Invoices
таблици от примерната база данни:
Следното изявление намира клиенти, които имат фактури:
SELECT
CustomerId,
FirstName,
LastName,
Company
FROM
Customers c
WHERE
EXISTS (
SELECT
1
FROM
Invoices
WHERE
CustomerId = c.CustomerId
)
ORDER BY
FirstName,
LastName;
Code language: SQL (Structured Query Language) (sql)
Следната снимка показва частичния набор от резултати:
В този пример, за всеки клиент, EXISTS
операторът проверява дали клиентският идентификатор съществува в invoices
таблица.
- Ако да, подзаявката връща един ред със стойност 1, който причинява
EXISTS
оператор оценява на истина. Следователно заявката включва потребителя в набора от резултати. - В случай, че идентификационният номер на клиента не съществува в
Invoices
таблица, подзаявката не връща редове, което причиняваEXISTS
оператор за оценка на false, следователно заявката не включва клиента в набора от резултати.
Забележете, че можете да използвате IN
оператор вместо EXISTS
оператор в този случай, за да постигнете същия резултат:
SELECT
CustomerId,
FirstName,
LastName,
Company
FROM
Customers c
WHERE
CustomerId IN (
SELECT
CustomerId
FROM
Invoices
)
ORDER BY
FirstName,
LastName;
Code language: SQL (Structured Query Language) (sql)
След като подзаявката върне първия ред, EXISTS
операторът спира търсенето, защото може да определи резултата. От друга страна, IN
операторът трябва да сканира всички редове, върнати от подзаявката, за да определи резултата.
Най-общо казано, EXISTS
операторът е по-бърз от IN
оператор, ако резултатният набор, върнат от подзаявката, е голям. За разлика от това, IN
операторът е по-бърз от EXISTS
оператор, ако резултатният набор, върнат от подзаявката, е малък.
SQLite NOT EXISTS
пример за оператор
Вижте следната таблица с изпълнители и албуми от примерната база данни:
Тази заявка намира всички изпълнители, които нямат албум в таблицата с албуми:
SELECT
*
FROM
Artists a
WHERE
NOT EXISTS(
SELECT
1
FROM
Albums
WHERE
ArtistId = a.ArtistId
)
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Ето частичния изход:
В този урок научихте как да използвате SQLite EXISTS
оператор за тестване за съществуването на редове, върнати от подзаявка.