ТОП 10:

Запросы с подзапросами в языке SQL, экзистенциальные запросы, подзапросы в операторах манипулирования данными.



Подзапрос - это оператор выбора, который содержится внутри другого оператора выбора, вставки, обновления или удаления, внутри условного оператора или внутри другого подзапроса. Подзапросы обычно содержатся в предложениях where или having SQL оператора или в списке выбора этого оператора. С помощью подзапросов можно проводить дальнейший отбор данных из результатов других запросов.

Общие правила написания и синтаксис подзапросов

Оператор выбора в подзапросе всегда должен быть заключен в круглые скобки. Синтаксис оператора выбора в подзапросе подчиняется общим правилам написания операторов выбора с некоторыми ограничениями, которые показаны на следующей схеме:

(select [distinct] список_выбора_подзапроса

[from [[database.]owner.]{название_таблицы | название_вьювера}

[({index название_индекса | prefetch size |[lru|mru]})]}

[where условия_отбора]

[group by выражение_без_агрегации [,

выражение_без_агрегации]... ]

[having условия_отбора])

Подзапросы могут быть вложенными в конструкциях (предложениях) where или having внешних операторов выбора (select), вставки (insert), обновления (update) или удаления (delete), а также вложенными в другие подзапросы или помещены в список выбора.

Ограничения на подзапросы

На подзапросы накладываются следующие ограничения:

· Подзапросы нельзя использовать в списках предложений order by, group by и compute by.

· Подзапрос не может содержать предложения for browse или union.

· Список выбора внутреннего подзапроса, которому предшествует операция сравнения, может содержать только одно выражение или название столбца, и подзапрос должен возвращать единственный результат. При этом тип данных столбца, указанного в конструкции where внешнего оператора, должен быть совместим c типом данных в столбце, указанным в списке выбора подзапроса (правила здесь такие же как и при соединении).

· В подзапросах не допускаются текстовые (text) и графические (image) данные.

· Подзапросы не могут обрабатывать свои результаты внутренним образом, т.е. подзапрос не может содержать конструкций order by, compute, или ключевого слова into.

· Коррелирующиеся (повторяющиеся) подзапросы не допускаются в конструкции select обновляемого курсора, определенного с помощью declare cursor (определить курсор).

· Количество вложенных уровней для подзапросов не должно превышать 16.

· Максимальное число подзапросов на каждой стороне объединения не больше 16.

Пример: Выбрать все гидро-станции, которые расположены в данной акватории, зная только название акватории, при условии, что таблица «станция» и «акватория» связаны между собой по “id”.

Select * from station where id_water_area in (select id from water_area where name=”Невская Губа”) go

 

Экзистенциальные запросы.

EXISTS - это оператор, который производит верное или неверное значение, другими словами, выражение bool.

Это означает что он может работать автономно в предикате или в комбинации с другими выражениями Бул использующими Булевые операторы AND, OR, и NOT. Он берет подзапрос как аргумент и оценивает его как верный если тот производит любой вывод или как неверный если тот не делает этого.

Например, мы можем решить, извлекать ли нам некоторые данные из таблицы Заказчиков если, и только если, один или более заказчиков в этой таблице находятся в San Jose

 

SELECT cnum, cname, city

FROM Customers

WHERE EXISTS

( SELECT *

FROM Customers

WHERE city = " San Jose' );

Внутренний запрос выбирает все данные для всех заказчиков в San Jose. Оператор EXISTS во внешнем предикате отмечает, что некоторый вывод был произведен подзапросом, и поскольку выражение EXISTS было полным предикатом, делает предикат верным. Подзапрос( не соотнесенный ) был выполнен только один раз для всего внешнего запроса, и следова-

 

 

=============== SQL Execution Log ============

| |

| SELECT snum, sname, city |

| FROM Customers |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers |

| WHERE city = 'San Jose'); |

| ============================================= |

| cnum cname city |

| ----- -------- ---- |

| 2001 Hoffman London |

| 2002 Giovanni Rome |

| 2003 Liu San Jose |

| 2004 Grass Berlin |

| 2006 Clemens London |

| 2008 Cisneros San Jose |

| 2007 Pereira Rome |

=============================================







Последнее изменение этой страницы: 2017-01-25; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.206.16.123 (0.009 с.)