PostgreSQL EXISTS with SELECT Operaтор (Пример)

⚡ Умное резюме

PostgreSQL EXISTS — это логический оператор, который проверяет, возвращает ли связанный подзапрос хоть одну строку, позволяя операторам SELECT, INSERT, UPDATE и DELETE эффективно фильтровать данные по наличию или отсутствию соответствующих записей.

  • 📋 Синтаксис: Функция WHERE EXISTS (подзапрос) возвращает true, если подзапрос выдает хотя бы одну строку.
  • 🔗 Коррелированный подзапрос: Функция EXISTS связывает внутренние и внешние запросы, сопоставляя строки по общему ключу.
  • Короткое замыкание: Оператор EXISTS останавливается на первой совпадающей строке, поэтому он хорошо масштабируется на больших таблицах.
  • 🔁 Четыре утверждения: Этот оператор работает внутри запросов SELECT, INSERT, UPDATE и DELETE.
  • 🛡️ НЕ СУЩЕСТВУЕТ: Безопасно исключает строки и избегает ошибки NULL, которая приводит к сбою функции NOT IN.
  • 🤖 Запросы к ИИ: Вспомогательные функции генерируют условия EXISTS и отмечают риски производительности, связанные с коррелированными подзапросами.

PostgreSQL СУЩЕСТВУЕТ с Select Operaтор

Что существует в PostgreSQL?

PostgreSQL СУЩЕСТВУЕТ Оператор EXISTS проверяет, существует ли строка (или строки) в подзапросе. Это означает, что оператор используется вместе с подзапросом. Считается, что оператор EXISTS выполнен, когда в подзапросе найдена хотя бы одна строка. Вы можете использовать эту операцию вместе с операторами SELECT, UPDATE, INSERT и DELETE.

PostgreSQL Синтаксис запроса EXISTS

Вот синтаксис для PostgreSQL СУЩЕСТВУЕТ заявление:

WHERE EXISTS (subquery);

Приведенный выше синтаксис показывает, что оператор EXISTS принимает аргумент, который является подзапросом. Подзапрос — это просто Оператор SELECT он должен начинаться с SELECT * вместо списка имен столбцов или выражений.

PostgreSQL EXISTS с оператором SELECT

Давайте посмотрим, как использовать оператор SELECT с оператором EXISTS. У нас есть следующие таблицы:

Книга:

PostgreSQL EXISTS с оператором SELECT

Цена:

PostgreSQL EXISTS с оператором SELECT

Выполните следующий оператор:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

Это возвращает следующее:

PostgreSQL EXISTS с результатом оператора SELECT

Приведенная выше команда должна вернуть все записи в таблице Book, идентификатор которых соответствует идентификатору любой записи подзапроса. Сопоставлен только один идентификатор. Следовательно, была возвращена только одна запись.

PostgreSQL EXISTS with INSERT Statement

Мы можем использовать оператор EXISTS в Инструкция INSERT. У нас есть следующие 3 таблицы:

Книга:

PostgreSQL EXISTS with INSERT Statement

Цена:

PostgreSQL EXISTS with INSERT Statement

Цена2:

PostgreSQL EXISTS with INSERT Statement

Затем мы можем запустить следующий оператор:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

Таблица цен теперь выглядит следующим образом:

PostgreSQL EXISTS с результатом оператора INSERT

Сопоставлена ​​строка с идентификатором 5 в таблице Price2. Затем эта запись была вставлена ​​в таблицу цен.

PostgreSQL EXISTS с оператором UPDATE

Мы можем использовать оператор EXISTS в инструкции UPDATE.

Выполните следующий запрос:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

PostgreSQL EXISTS с оператором UPDATE

Мы обновляем столбец цен таблицы цен. Наша цель — сделать так, чтобы цены на товары с одинаковым идентификатором были одинаковыми. Сопоставлена ​​только одна строка, то есть 5.

Однако, поскольку цены равны, то есть 205, никакого обновления не было. Если бы была разница, было бы сделано обновление.

PostgreSQL EXISTS с оператором DELETE

A PostgreSQL Оператор DELETE может использовать оператор EXISTS. Вот пример:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

Таблица цен теперь выглядит следующим образом:

PostgreSQL EXISTS с оператором DELETE

Строка с идентификатором 5 была удалена.

PostgreSQL Оператор EXISTS с использованием pgAdmin

Помимо SQL-оболочки, те же запросы EXISTS можно выполнить визуально через интерфейс pgAdmin. Теперь давайте посмотрим, как эти действия можно выполнить с помощью pgAdmin:

С помощью оператора SELECT

Ниже описаны шаги по использованию запроса EXISTS в PostgreSQL с помощью оператора SELECT, используя pgAdmin:

Шаг 1) Войдите в свою учетную запись pgAdmin. Откройте pgAdmin и войдите в свою учетную запись, используя свои учетные данные.

Шаг 2) Создайте демонстрационную базу данных.

  1. На панели навигации слева нажмите «Базы данных».
  2. Нажмите Демо.

PostgreSQL Оператор EXISTS с использованием pgAdmin

Шаг 3) Введите приведенный ниже запрос в редакторе запросов:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

Шаг 4) Нажмите кнопку «Выполнить».

PostgreSQL Оператор EXISTS с использованием pgAdmin

Он должен вернуть следующее:

PostgreSQL Оператор EXISTS с использованием pgAdmin

С заявлением INSERT

Чтобы сделать то же самое через pgAdmin, сделайте следующее:

Шаг 1) Войдите в свою учетную запись pgAdmin.

Шаг 2)

  1. На панели навигации слева нажмите «Базы данных».
  2. Нажмите Демо.

Заявление EXISTS в PostgreSQL используя pgAdmin

Шаг 3) Введите запрос в редакторе запросов:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

Шаг 4) Нажмите кнопку «Выполнить».

Заявление EXISTS в PostgreSQL используя pgAdmin

Таблица цен теперь должна выглядеть следующим образом:

Заявление EXISTS в PostgreSQL используя pgAdmin

С заявлением ОБНОВЛЕНИЯ

Чтобы сделать то же самое через pgAdmin, сделайте следующее:

Шаг 1) Войдите в свою учетную запись pgAdmin.

Шаг 2)

  1. На панели навигации слева нажмите «Базы данных».
  2. Нажмите Демо.

Заявление EXISTS в PostgreSQL используя pgAdmin

Шаг 3) Введите запрос в редакторе запросов:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

Шаг 4) Нажмите кнопку «Выполнить».

PostgreSQL Оператор EXISTS с использованием pgAdmin

Таблица цен теперь должна выглядеть следующим образом:

PostgreSQL Оператор EXISTS с использованием pgAdmin

С оператором DELETE

Чтобы сделать то же самое через pgAdmin, сделайте следующее:

Шаг 1) Войдите в свою учетную запись pgAdmin.

Шаг 2)

  1. На панели навигации слева нажмите «Базы данных».
  2. Нажмите Демо.

PostgreSQL Оператор EXISTS с использованием pgAdmin

Шаг 3) Введите запрос в редакторе запросов:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

Шаг 4) Нажмите кнопку «Выполнить».

PostgreSQL Оператор EXISTS с использованием pgAdmin

Таблица цен теперь должна выглядеть следующим образом:

PostgreSQL Оператор EXISTS с использованием pgAdmin

Загрузите базу данных, используемую в этом руководстве.

Часто задаваемые вопросы (FAQ)

Функция EXISTS проверяет, возвращает ли коррелированный подзапрос хоть одну строку, и останавливается на первом совпадении, поэтому она подходит для больших подзапросов. Функция IN сравнивает значение со списком и подгоняет небольшие, постоянные множества.

Оператор NOT IN может вернуть ноль строк, если подзапрос содержит NULL, поскольку сравнение становится неизвестным. Оператор NOT EXISTS игнорирует NULL и корректно оценивает каждую строку, что делает его надежным выбором для анти-соединений.

Коррелированный подзапрос ссылается на столбец из внешнего запроса, например, WHERE Book.id = Price.id. Функция EXISTS повторно проверяет его для каждой строки внешнего запроса и возвращает true, как только найдено совпадение.

Да. Функция EXISTS возвращает true, как только подзапрос выдает хотя бы одну строку, поэтому она не сканирует остальные. Такое поведение, исключающее необходимость повторного выполнения запроса, делает его эффективным при работе с большими коррелированными подзапросами.

Нет. EXISTS проверяет только, возвращает ли подзапрос строку, поэтому SELECT *, SELECT 1 или SELECT id ведут себя одинаково. Список столбцов внутри подзапроса не влияет на результат.

Проиндексируйте столбцы, объединенные в подзапросе, сохраните возможность использования условия корреляции и выполните команду EXPLAIN ANALYZE. PostgreSQL Часто переписывает оператор EXISTS в виде эффективного полусоединения, если индексы это поддерживают.

Искусственный интеллект-помощники преобразуют простые правила в операторы EXISTS, строят коррелированные подзапросы и предупреждают о ловушках NOT IN NULL. Они также предлагают индексы и подсказки EXPLAIN для оптимизации.

Да. Искусственный интеллект-помощник обнаруживает шаблоны подзапросов и переписывает IN как EXISTS или NOT IN как NOT EXISTS, повышая безопасность и производительность при работе с NULL-значениями в больших таблицах.

Подведем итог этой публикации следующим образом: