Студопедия

КАТЕГОРИИ:


Архитектура-(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)

FROM shop a, clients b




SELECT b.Name, b.Address

FROM flat

WHERE Price = (SELECT MIN(Price) FROM flat)

Такие запросы могут формироваться и на основе данных из нескольких таблиц. Например, приведенный ниже запрос выводит список имен и адресов всех покупателей, которые купили в мага­зине самый дорогой товар.

WHERE (a.Tovar = b.Tovar) AND

Price = (SELECT MAX(Price) FROM shop)

Информация о товарах хранится в таблице БД shop.db, a сведения о покупателях - в таблице client.db. С помощью подзапроса из таблицы shop. db выбирается запись, содержащая максимальное значение в поле Price (Цена товара). Затем в таб лице client.db отбираются все записи, для которых значение поля Tovar совпадает с названием выбранного с помощью под­запроса товара, и из этих записей выделяется требуемая информа­ция о покупателях.

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

SELECT *

FROM flat

WHERE Number = (SELECT Number

FROM flat

WHERE Room = 3)

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

SELECT *

FROM flat

WHERE Number IN (SELECT Number

FROM flat

WHERE Room = 3)

Любой подзапрос может также иметь вложенный запрос, кото­рый, в свою очередь, может содержать подзапрос, и т.д. Данная возможность достаточно широко используется на практике.

Предположим, что имеется таблица dom. bd, содержащая спи­сок всех жильцов дома. Следующий запрос позволяет вывести список жителей квартиры, в которой живет самый старый жилец дома.

SELECT a.* FROM dom a WHERE a.Nom_kv IN

(SELECT b.Nom_kv FROM dom b WHERE b.Vozrast =

(SELECT MAX(c.Vozrast) FROM dom c))

Поясним логику формирования данного запроса. Вначале, в подзапросе с самой большой глубиной вложения, выбирается максимальное значение в поле Vozrast (Возраст жильца). Затем в подзапросе, расположенном на уровень выше предыдущего, оп­ределяется номер квартиры (поле Nom_kv), где проживает жилец, возраст которого равен отобранному максимальному значению. И, наконец, основной запрос отбирает все записи, относящиеся к жильцам данной квартиры, то есть записи, у которых значение поля Nom_kv совпадает с отобранным значением. Если существу­ет несколько старейших жильцов, у которых возраст одинаков, то также будет выведен список проживающих с ними в одних квар­тирах.

Следует обратить внимание на использование псевдонимов в данном запросе. Как видно из текста запроса, одна и та же табли­ца используется и в основном, и во вложенном запросе. В подоб-. ной ситуации обязательно применяются псевдонимы, поскольку в противном случае при сравнении полей будет неясно, когда про­исходит обращение к полю, относящемуся к основному запросу, а когда - к вложенному. Использование имен таблиц в данном слу­чае также не поможет, так как данные берутся из одной и той же таблицы, а поэтому во избежание ошибки следует указать соот­ветствующие псевдонимы.

Бывают случаи, когда возникает необходимость отбирать запи­си, для которых вложенный запрос возвращает одно или несколько значений, но при этом решающим является факт существования некоторого значения, а не само это значение (например, имеет зна­чение только сам факт покупки, независимо от того, что именно было куплено, на какую сумму и т.п.). В таком случае может быть использован оператор EXISTS.

SELECT DISTINCT a.Name, a.Address

FROM clients a

WHERE EXISTS (SELECT b.Customer

FROM shop b

WHERE a.Name = b.Customer)

Вышеприведенный запрос позволяет получить список имен и адресов всех покупателей, которые сделали хотя бы одну покупку в данной фирме.

При использовании подзапросов, возвращающих множество значений, могут применяться специальные операторы ALL, SOME или ANY.

Оператор ALL указывает на то, что условие поиска будет ис­тинным, если сравниваемое значение находится в определенном отношении со всеми значениями, возвращаемыми подзапросом. Поясним сказанное на небольшом примере.

Допустим, имеется таблица liga. db, в которой хранится ин­формация обо всех игроках футбольной лиги. Запрос, представ­ленный ниже, позволяет вывести сведения об игроках, возраст которых меньше любого из значений среднего возраста игроков, определяемого для каждой команды в отдельности.

SELECT *

FROM liga a

WHERE a.Vozrast < ALL

(SELECT AVG(b.Vozrast) FROM liga b GROUP BY b.Komanda)

Действия операторов SOME и ANY абсолютно одинаковы. Они показывают, что условие истинно, когда сравниваемое значение находится в нужном отношении хотя бы с одним значением, воз­вращаемым подзапросом.

Если немного изменить предьщущий запрос, подставив опе­ранд ANY вместо операнда ALL, то запрос принимает следующий вид:

SELECT *

FROM liga a

WHERE a.Vozrast < ANY

(SELECT AVG(b.Vozrast) FROM liga b GROUP BY b.Komanda)

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

Рассмотрим простейшую ситуацию, когда в таблице содержат­ся данные об игроках только двух команд, и средний возраст иг­роков первой команды - 23 года, а второй команды - 25 лет. В случае использования первого из приведенных запросов (с опе­рандом ALL) в результирующий список попадут только игроки, имеющие возраст меньше 23 лет (меньше любого из средних зна­чений - как первого, так и второго). В случае же применения вто­рого запроса (с операндом ANY) в результирующем списке окажутся все игроки, имеющие возраст менее 25 лет (меньше хотя бы одного из средних значений).

Объединение запросов.

В некоторых случаях требуется объ­единить результаты выполнения нескольких операторов SELECT. Такое объединение производится с помощью оператора UNION. При этом результирующие наборы данных должны иметь одина­ковый формат, то есть одинаковый состав возвращаемых полей и полное совпадение типов данных соответствующих полей. Если в результирующих наборах данных, сформированных после выпол­нения различных запросов, имеется одна и та же запись, то она не дублируется в сводном наборе данных.'

Ниже показано, как можно объединить результаты выполнения трех запросов. В рассматриваемом примере осуществляется отбор данных из таблицы anim. db, содержащей информацию о различ­ных животных. Таблица включает такие поля: название животного (Animal), длина тела животного (Dlina), вес животного (Ves).

 

Первый запрос выводит записи, у которых поле Animal имеет значение «Бурозубка». Второй запрос выбирает из таблицы записи, для которых значение поля Dlina равно 12. Третий запрос отбирает записи, значение поля Ves которых превосходит 300.

SELECT *

FROM anim

WHERE Animal = ЛБурозубка'

UNION

SELECT *

FROM anim

WHERE Dlina = 12 UNION SELECT * FROM anim WHERE Ves > 300

На рис. 15.4 представлен пример выполнения вышеприведен­ного объединения запросов.

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

 

Контрольні питання

1. Розглянути роботу оператора Select

2. Описати роботу формату команди Select

 


САМОСТІЙНА РОБОТА СТУДЕНТА

ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ

ТЕМА 6.7: НАВІГАЦІЯ ПО НАБОРУ ДАНИХ. МОВА SQL. СТВОРЕННЯ ДОВІДКОВОЇ СИСТЕМИ

 

Самостійне заняття №45 – Модифікація набору даних




Поделиться с друзьями:


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


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



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




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