Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры бд.docx
Скачиваний:
111
Добавлен:
17.06.2021
Размер:
4.93 Mб
Скачать
  1. Язык sql: использование подзапросов.

Подзапрос - очень мощное средство языка SQL. Он позволяет строить сложные иерархии запросов, многократно выполняемые в процессе построения результирующего набора или выполнения одного из операторов изменения данных ( DELETE , INSERT , UPDATE ).

Подзапрос это обычный aql запрос который мы можем использовать в другом нашем основном запросе и их еще часто называют вложенными запросами. С помощью sql можно вкладывать запросы друг в друга.

Условно подзапросы иногда подразделяют на три типа, каждый из которых является сужением предыдущего:

- табличный подзапрос, возвращающий набор строк и столбцов;

- подзапрос строки, возвращающий только одну строку, но, возможно, несколько столбцов (такие подзапросы часто используются во встроенном SQL);

- скалярный подзапрос, возвращающий значение одного столбца в одной строке.

Подзапрос позволяет решать следующие задачи:

- определять набор строк, добавляемый в таблицу на одно выполнение оператора INSERT ;

- определять данные, включаемые в представление, создаваемое оператором CREATE VIEW ;

- определять значения, модифицируемые оператором UPDATE ;

- указывать одно или несколько значений во фразах WHERE и HAVING оператора SELECT ;

- определять во фразе FROM таблицу как результат выполнения подзапроса ;

- применять коррелированные подзапросы. Подзапрос называется коррелированным, если запрос, - содержащийся в предикате, имеет ссылку на значение из таблицы (внешней к данному запросу), которая проверяется посредством данного предиката.

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

SELECT * from tbl1

WHERE f2=(SELECT f2 FROM tbl2

WHERE f1=1);

В данном операторе подзапрос всегда должен возвращать единственное значение, которое будет проверяться в предикате. Если подзапрос вернет более одного значения, то СУБД выдаст сообщение об ошибке выполнения SQL-оператора.В случае если подзапрос не выберет ни одной строки, то предикат будет равен UNKNOWN, что большинством СУБД интерпретируется как FALSE.

Подзапрос может быть указан как в предикате, определяемом фразой WHERE, так и в предикате по группам, определяемом фразой HAVING.

Например:

SELECT avg_f1, COUNT (f2) from tbl1

GROUP BY avg_f1

HAVING avg_f1 >(SELECT f1 FROM tbl1

WHERE f3='a1');

  1. Язык sql: операторы exists, any, all в командах с подзапросом.

.

В случае, если подзапрос возвращает множество результатов, для подобных запросов необходимо использовать соответствующие операторы сравнения:

  • IN    – эквивалетно значению любого элемента из подзапроса

  • ANY – сравнивает значение со всеми значениями из подзапроса, возвращая true если сравнение верно для любого ОДНОГО значения из списка

  • ALL  – сравнивает значение со всеми значениями из подзапроса, возвращая true если сравнение верно для ВСЕХ значений из списка

 

Разберем свойства и методы применения каждого из операторов по отдельности. 

SELECT   *

FROM emp

WHERE job in (SELECT job

FROM emp

WHERE sal > 1000)

 

Оператор IN – опеспечивает сравнения столбца job со всеми значениями из подзапроса. В результате данного примера выйдет столько строк, сколько будет совпадений столбца со значениями подзапроса.

Оператор ANY, как уже отмечалось ANY сравнивает значение со всеми значениями из подзапроса. При этом зависимости от знака равенства смысл оператора изменяется. Таким образом, если использовать знак равенства вместе с ANY у нас получиться эквивалент оператору IN. При этом если будет применяться знак < и ANY то будет иметь смысл меньше минимального значения из списка. Если же > и ANY то будет иметь смысл больше максимального значения из списка. 

Оператор ALL, как уже отмечалось ALL сравнивает значение со всеми значениями из подзапроса. При этом зависимости от знака равенства смысл оператора изменяется. При этом если будет применяться знак < и ALL то будет иметь смысл меньше минимального значения из списка. Если же > и ALL то будет иметь смысл больше максимального значения из списка.

 

EXISTS

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

Читателю может показаться что это функция редко используемая - но такое мнение может сложится только при небольшом опыте общения с коллегами из департамента маркетинга. Иногда маркетологи придумывают ужасные условия и хотят тут же получить результат. EXIST поможет вам справиться как и с ужасными условиями так и с быстротой получение результата. Так как использование оператора EXIST увеличивает производительность выполнения отчета.