Резюме :в този урок ще научите как да използвате 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 оператор за тестване за съществуването на редове, върнати от подзаявка.