Продолжаем знакомится с операторами SQL упрощающих вывод данных из таблиц. Первое, с чем нам предстоит сегодня познакомится – оператор EXISTS . Это простая проверка на существование. Этот оператор относится к выражениям Буля.
Сразу рассмотрим пример:
SELECT cnum, cname, city
FROM User1
WHERE EXISTS
( SELECT *
FROM User2
WHERE OC = “Unix” );
Анекдот:
Психиатоp задаёт вопpос пациенту:
- Hу-ка ну-ка, по-подpобнее, pасскажите, Как давно у вас появилось удовольствие от уплаты налогов? И почему в графе иждивенцы Вы написали - Государство ?
Если ты читал предыдущую статью, то наверно заметил здесь подзапрос. Обломися бабка, мы на пароходе. Это не подзапрос, потому что он выполняется только один раз. Внутренний запрос выбирает все записи, где ОС равна “Unix”. Оператор EXISTS проверяет, если был какой-то результат, то генерирует True, а значит выполниться условие EXISTS. После этого выполнится внешний запрос:
SELECT cnum, cname, city
FROM User1
Так как EXISTS Булев оператор, его можно использовать с другими Булями. Вот тебе пример с NOT:
SELECT cnum, cname, city
FROM User1
WHERE EXISTS
( SELECT *
FROM User2
WHERE OC = “Unix” );
В этом случае внешний запрос выполниться только если внутренний не выведет ни одной строки.
Теперь нам предстоит познакомится с операторами ANY, SOME, и ALL. Первые два оператора абсолютно одинаковы. Оба они дают один и тот же результат, поэтому ты можешь использовать тот, который больше подходить под твои пальцы. Мне больше нравиться ANY, потому что это слово короче аж на одну букву :).
SELECT cnum, cname, city
FROM User1
WHERE ОC=ANY
( SELECT OC
FROM User2
);
Здесь сначала выполняется внутренний запрос, выбирая все OC из базы User2. Затем выполняется внешний запрос, который выберет все строки где встретилась любая (ANY) из ОС внутреннего запроса. То есть, результатом будут все строки из User1, в которых встречаются ОС такие же как и в User2.
Результат следующего запроса будет абсолютно таким же:
SELECT cnum, cname, city
FROM User1
WHERE ОC= SOME
( SELECT OC
FROM User2
);
Аналогично будет работать и следующий запрос:
SELECT cnum, cname, city
FROM User1
WHERE ОC=IN
( SELECT OC
FROM User2
);
Я везде использую знак «=», но ANY и SOME могут работать и с операторами < или >.
Теперь нам предстоит познакомится с ALL
SELECT cnum, cname, city
FROM User1
WHERE NumberLesens>ALL
( SELECT NumberLesens
FROM User2
);
Результатом этого запроса будут все строки, в которых количество лицензий (NumberLesens) больше чем у всех из таблицы User2.
На этом я закончу сегодняшнее занятие, потому что следующее, что нам предстоит изучить, будет добавление, изменение и удаление полей. Это очень большой материал, поэтому я не хочу начинать его сегодня.