Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Связанные подзапросы

Вложение запросов (подзапросы).

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

Допустим, нам нужны все заказы продавца с именем Hoffman. Его номера мы не знаем.

SELECT *

FROM Orders

WHERE Snum = (SELECT Snum FROM Sales people

WHERE sname = ‘Hoffman’);

Если бы мы знали номер (допустим 1004), то мы бы прямо написали:

WHERE snum = 1004;

но 1004- это результат подзапроса.

Здесь есть тонкость. Вы должны быть уверены, что это значение единственное (результат подзапроса), иначе будет ошибка.

Если получится NULL, то ошибки не будет. Предикат сработает по UN Known так же как по FALSE и не выдаст ни одной строки в результате.

Для гарантии единственности результата в подзапросе после слова SELECT нужно поставить DISTINCT.

Еще одно ограничение стандарта ANSI- нельзя подзапрос поставить слева (перед запросом).

 

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

 

Пример. Отыскать всех покупателей, сделавших заказы 3 октября 2006 г.

алиас дата начала работы
SELECT *

FROM Customers outer

WHERE 10/03/06 IN

(SELECT odate

FROM Orders inner

Сюда подставляется строка- кандидат из таблицы внешнего запроса
WHERE outer. cnum = inner. cnum);

 

Существует специальный оператор, всегда использующий подзапрос в качестве аргумента- это оператор EXISTS.

Он используется, когда от подзапроса нужно лишь узнать дает он NULL или нет. Соответственно EXISTS возвращает «ложь» или «истину».

Например, нужно извлечь данные из таблицы Customers в том случае, если хотя бы один покупатель из нее из London’а:

SELECT cnum, cname, city

FROM Customers

WHERE EXISTS (SELECT *

FROM Customers

WHERE city = ‘London’);

В результате можно получить:

<== предыдущая лекция | следующая лекция ==>
Упорядочение выходных полей | Ввод, удаление и изменение значений полей
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 326; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.