Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції для 3ОТ1.doc
Скачиваний:
10
Добавлен:
21.02.2016
Размер:
16.31 Mб
Скачать

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

  1. Навести характеристику SQL запитів

  2. Надати поняття принципам роботи оператора CREATE TABLE

  3. Надати поняття принципам роботи оператора DROP TABLE

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

Змістовий модуль 6: програмування з графами

Тема 6.7: навігація по набору даних. Мова sql. Створення довідкової системи

Самостійне заняття №44 – Організація відбору даних

План заняття

  1. Характеристика роботи оператора Select

  2. Характеристика формату команди Select

Отбор данных из таблиц БД осуществляется с помощью операто­ра SELECT. Результат такого отбора данных называется выборкой.

Оператор SELECT - наиболее часто используемый и самый важный оператор языка SQL. Он позволяет получать выборки данных из одной или нескольких таблиц БД и преобразовывать результаты к нужному виду. С помощью этого оператора можно реализовать довольно сложные условия выбора данных. В общем виде этот оператор имеет такой формат:

SELECT [DISTINCT] {*поле![,поле2...]} FROM таблиця,а1

[, таблица2 . . . ] [WHERE условия_отбора]

[GROUP BY список_группируемых_полей]

[HAVING условие_группироваяля]

[ORDER BY список_полей_для_сортировки]

[UNION onepaтop SELECT)

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

SELECT Tovar, Price FROM shop

В результате выполнения данного оператора будет сформиро­ван набор данных, содержащий значения полей Tovar и Price из таблицы shop.

Список полей приводится непосредственно после ключевого слова SELECT, при этом имена полей отделяются одно от другого запятыми. При указании дополнительного описателя DISTINCT после ключевого слова SELECT обеспечивается исключение из выборки одинаковых записей, для которых совпадают значения всех полей, указанных в операторе SELECT.

Если в набор данных необходимо включить все поля заданной таблицы (таблиц), то вместо перечисления имен полей можно указать символ «*». Допустим, таблица firm. db содержит поля: Tab_nom, Fio, Otdel, Dolgn и Salary. Тогда следующие два оператора абсолютно идентичны:

SELECT Tab_nom, Fio, Otdel, Dolgn, Salary FROM firm

или

SELECT * FROM firm

При отображении содержимого набора данных по результатам выполнения SQL-запроса в компоненте DBGrid по умолчанию в качестве заголовков столбцов будут использоваться соответст­вующие имена полей. Однако существует возможность переопре­делить эти заголовки, для чего используется описатель AS, кото­рый ставится после имени поля, а за ним указывается отображае­мый заголовок столбца. Это делается таким образом:

SELECT Nom_stud AS Номер, Fio AS Фамилия,

Grup AS Группа FROM students

Использование условий отбора записей. В секции WHERE оператора SELECT можно задать необходимое условие отбора, что позволит включать в выборку не все записи, а только те, которые соответствуют заданному условию. При использова­нии данного операнда в набор данных будут включаться только те записи, которые удовлетворяют установленным условиям поиска (отбора).

При сравнении значения столбца с константой условие поиска имеет такое общее описание:

WHERE ямя_поля операция константа

В качестве операции может выступать одна из операций отно­шения: = (равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), ! < (не меньше), ! > (не больше), <> (не равно), != (не равно). Кроме того, условие может быть состав­ным, для объединения частей которого применяются круглые скобки и логические функции NOT, AND, OR. Ниже показан при­мер оператора SELECT с использованием условия отбора.

SELECT Nom_r, Time_dep

FROM reys

WHERE Punkt_dep='Берлин' AND

Punkt_arr='Лондон'AND Time_dep>=l5:00

Результатом выполнения приведенного запроса будет набор дан­ных, в который будут включены два поля Nom_r и Time_dep, пока­зывающие, соответственно, номера рейсов и время отправления самолетов. При этом накладывается ряд ограничений. В частности, будут отобраны только те записи, для которых пункт отправления (Punkt_dep) - Берлин, пункт прибытия (Punkt_arr) - Лондон и время отправления (Time_dep) - в 15:00 или позже.

Существует еще несколько операций, которые могут быть ис­пользованы при формировании условия поиска:

  • BETWEEN - обеспечивает проверку вхождения значения поля в заданный диапазон;

  • IN - служит для проверки вхождения значения поля в заданный набор значений;

  • LIKE - позволяет производить сравнение по заданной маске. В маске могут быть использованы следующие специальные символы: '%' - для обозначения произвольной строки любой длины, '_' - для обозначения произвольного единичного

символа. Если данные символы должны использоваться в шаблоне как таковые, без учета их специального значения, то операция дополняется описателем ESCAPE символ, позво­ляющим задать символ, появление которого в шаблоне отме­няет специальные функции следующего за ним символа;

IS NULL - используется для проверки неопределенного значения поля.

Практические примеры использования перечисленных опера­ций при создании запросов приведены ниже.

SELECT Fam, Rost, Ves FROM grup

WHERE (Ves BETWEEN 45 AND 65)

AND (Rost in (160, 165, 170))

Результатом выполнения этого запроса будет набор данных, со­держащий поля: Фамилия (Fam), Рост (Rost) и Вес (Ves). Набор данных формируется на основе записей из таблицы grup, у которых значение поля Ves находится в диапазоне от 45 до 65 и значение поля Rost точно равно одному из трех чисел: 160,165 или 170.

SELECT Fam, Name

FROM spisok

WHERE Fam LIKE '_ва%'

В результате выполнения данного оператора выводятся значе­ния полей Fam и Name всех записей таблицы, у которых значение поля Fam начинается с любого символа, затем следуют буквы «ва», а после них может стоять любая строка, в том числе и пус­тая. Так, например, указанному условию удовлетворяют такие значения: «Ива», «Иванов», «Уваров», «4ва64про@&>56» и т.д.

SELECT *

FROM people

WHERE Name IS NOT NULL

Данный запрос позволяет вывести все записи таблицы people, для которых определено значение поля Name. Записи, у которых значение этого поля не определено, не включаются в ре­зультирующий набор данных.

Дополнительные функции SOL.

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

  • UPPER {строка) - преобразует все символы строки в символы верхнего регистра;

  • LOWER (строка) - преобразует все символы строки в нижний регистр;

■ TRIM (строка) - удаляет символы пробела в начале и в конце строки;

■ SUBSTRING (строка FROM nl ТО п2) - выделяет из строки подстроку, начиная с позиции nl и заканчивая позицией п2;

  • CAST (выражение AS тип_данных) - преобразует выражение к заданному типу данных;

  • Строка_1 | строка_2 - осуществляет конкатенацию (соединение) двух строк;

  • EXTRACT (элемент FROM выражение) -извлекает значение, соответствующее указанному элементу, из выражения, содержащего значение даты или времени. В качестве параметра элемент могут быть заданы такие значения: YEAR, MONTH, DAY, HOUR, MINUTE или SE­COND (год, месяц, день, час, минута и секунда соответст­венно).

Примеры использования описанных функций приводятся ниже.

SELECT UPPER(Fam)

FROM spisok

WHERE LOWER(Name)='Владимир'

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

SELECT *

FROM people

WHERE EXTRACT(MONTH FROM Birth)=10

Представленный запрос обеспечивает отбор из таблицы people всех записей, у которых значение месяца в поле Birth равно 10 (то есть октябрь).

Сортировка записей.

Сортировка или упорядочение записей по возрастанию или по убыванию значений полей осуществляется с помощью операнда ORDER BY. После него приводится список полей, по которым должна производиться сортировка. Записи бу­дут упорядочены в зависимости от порядка указания полей. Вна­чале осуществляется сортировка по первому указанному полю; затем для записей, имеющих одинаковое значение первого поля, происходит упорядочение по второму полю и т.д.

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

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

SELECT Number, Address, Floor, Room, Square,

Price FROM flat ORDER BY Room, Price DESC, 5

При выполнении данного запроса выводятся записи таблицы flat.db, в которой содержатся сведения о предлагаемых на продажу квартирах. Записи сортируются следующим образом. Вначале происходит сортировка в зависимости от количества комнат, то есть по возрастанию значений поля Room. Затем запи­си, у которых совпадает количество комнат, сортируются по убы­ванию стоимости квартиры (значения поля Price). И, наконец, записи, у которых одинакова комбинация значений полей Room и Price, упорядочиваются по возрастанию пятого поля из списка полей в разделе SELECT. Пятым полем в списке является поле Square, которое содержит данные о площади квартиры. Резуль­тат может выглядеть примерно так, как это показано на рис. 15.2.

Агрегатные функции. В SQL-запросах предусмотрено исполь­зование так называемых агрегатных функций, которые позволяют получать некоторую общую величину, которая рассчитывается на основе всех значений набора данных или определенной группы записей. В SQL существуют следующие агрегатные функции:

  • COUNT (выражение) - подсчитывает число вхождений заданного выражения во все записи результирующего на­бора данных;

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

  • AVG (выражение) -вычисляет среднее значение;

  • МАХ (выражение) - находит максимальное значение;

MIN (выражение) - определяет минимальное значе­ние

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

SELECT COUNT(DISTINCT Name)

FROM firm

WHERE Dolgn = 'Водитель'

В результате выполнения этого запроса выводится количество неповторяющихся и непустых значений поля Name для всех запи­сей таблицы firm, у которых значение поля Dolgn равно «Води­тель». Другими словами, подсчитывается количество водителей, работающих в данной фирме.

SELECT SUM(Price*Kolvo)

FROM shop

WHERE Date=ll.08.99

Результатом выполнения данного оператора является общая сумма денег, вырученная магазином за день. Она рассчитывается путем суммирования произведений значения поля Цена (Price) на значение поля Количество (Kolvo) для всех записей таблицы shop, у которых значение поля Date равно 11.08.99.

SELECT MAX(Salary) FROM firm

Вышеприведенный запрос выводит максимальное значение поля Salary среди всех записей таблицы firm (т.е. определяет­ся размер максимальной заработной платы среди всех сотрудни­ков фирмы).

Группирование записей. Группирование данных используется, главным образом, в ситуациях, когда необходимо получить агре­гированные значения (минимум, максимум, среднее, сумма, коли­чество) не по всему набору данных, а по каждой из входящих в него групп записей, характеризующихся одинаковым значением какого-либо поля. Например, следующий запрос позволяет полу­чить общее количество сотрудников по каждому отделу фирмы.

SELECT Otdel, COUNT(Tab_nom) FROM firm GROUP BY Otdel

В ряде случаев необходимо установить некоторые ограниче­ния на группируемые значения. Для этого применяется операнд HAVING. К примеру, если в предыдущем примере требуется вы­вести только те отделы, в которых количество сотрудников более 10, то это можно осуществить с помощью запроса такого вида:

SELECT Otdel, COUNT(Tab_nom)

FROM firm

GROUP BY Otdel

HAVING COUNT(Tab_nom)>10

Отбор данных из нескольких таблиц.

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

Имя_таблицы. нмя_поля

Если связь между двумя таблицами не установлена, то в ре­зультирующий набор данных войдут все возможные комбинации записей указанных таблиц, то есть каждой записи одной таблицы будет поставлена в соответствие каждая запись другой таблицы. На практике редко возникает необходимость формирования по­добного рода наборов данных. Гораздо чаще между таблицами устанавливается связь по определенному полю или группе полей. Такую связь можно установить, используя описатель INNER JOIN в секции FROM, либо задавая соответствующее условие в секции WHERE.

Например, в БД имеется две таблицы, в одной из которых хра­нятся данные обо всех преподавателях института, а в другой со­держится расписание занятий различных групп. Первая таблица inst.db имеет такие поля: Фамилия преподавателя (Fam), Должность (Dolgn), Кафедра (Kaf). Вторая таблица rasp.db содержит поля: Дисциплина (Discipl), Группа (Grup), День недели (Day), Время (Vrem), Аудитория (Audit), Преподаватель (Prep). Допустим, из второй таблицы необходимо выбрать все записи, относящиеся к парам, которые проводят преподаватели кафедры иностранного языка. Как видно из описания таблиц, в расписании не указано, на какой кафедре работает тот или иной преподаватель. Поэтому, чтобы выбрать необходимые сведения, нужно воспользоваться информацией из первой таблицы. Решить поставленную задачу можно следующим образом. Между табли­цами устанавливается связь по фамилии преподавателя и форми­руется промежуточный набор данных, содержащий записи обеих таблиц, у которых совпадают значения соответствующих полей. Затем из этого набора данных исключаются все записи, которые не удовлетворяют заданному условию, то есть в результирующий набор данных войдут только записи таблицы rasp, содержащие информацию о парах, которые проводят преподаватели кафедры иностранных языков. Реализуется это с помощью запроса сле­дующего вида:

SELECT rasp.*

FROM inst INNER JOIN rasp ON

inst.Fam=rasp.Prep WHERE (inst.Kaf='Иностранный язык')

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

SELECT rasp.* FROM inst, rasp

WHERE (inst.Kaf='Иностранный язык')

AND (inst.Fam=rasp.Prep)

Этот способ также обладает тем преимуществом, что он поз­воляет устанавливать связь сразу между несколькими таблицами, а не только между двумя. Следует также отметить, что в условии

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

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

SELECT DISTINCT a.Fam, b.Grup FROM inst a, rasp WHERE a.Fam=b.Prep

В результирующий набор данных войдут неповторяющиеся записи, отражающие информацию о том, в каких группах прово­дит занятия каждый преподаватель. В приведенном запросе вме­сто имен таблицы применены псевдонимы: а — для таблицы inst и b - для таблицы rasp.

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

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

Какая из таблиц будет ведущей, определяет вид соединения:

  • LEFT - левое внешнее соединение, при котором ведущей является таблица, расположенная в описании слева от описателя вида соединения;

  • RIGHT - правое внешнее соединение, при котором ведущей является таблица, расположенная в описании справа от описателя вида соединения;

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

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

SELECT a.Fam, a.Dolgn, b.Discipl, b.Grup

FROM inst a LEFT JOIN rasp b

ON a.Fam = b.Prep

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

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

Вложенные запросы.

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

SELECT ... FROM ...

WHERE сравниваемое_поле оператор (SELECT ...)

Синтаксис вложенного запроса ничем не отличается от форма­та основного запроса. Подзапрос должен быть заключен в круглые скобки.

Например, следующий запрос позволяет полностью вывести записи, у которых поле Price имеет минимальное значение:

SELECT *

FROM flat

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

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

SELECT b.Name, b.Address

FROM shop a, clients b

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 представлен пример выполнения вышеприведен­ного объединения запросов.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]