
- •Язык sql: манипулирование данными в этой лекции...
- •Введение в язык sql
- •Назначение языка sql
- •История языка sql
- •Особая роль языка sql
- •Используемая терминология
- •Запись операторов sql
- •Манипулирование данными
- •Литералы
- •Простые запросы
- •Выборка строк, конструкция where
- •Сортировка результатов, конструкция order by
- •5.3.3. Использование агрегирующих функций языка sql
- •Глава 5. Язык sql: манипулирование данными 183
- •5.3.5. Подзапросы
- •Глава 5. Язык sql: манипулирование данными 189
- •5.3.6. Ключевые слова any и all
- •5.3.8. Ключевые слова exists и not exist
- •Глава 5. Язык sql: манипулирование данными 203
Глава 5. Язык sql: манипулирование данными 203
Поскольку данные вставляются только в определенные столбцы таблицы, необходимо указать имена столбцов, в которые эти данные будут помещаться. Порядок следования имен столбцов несуществен, однако более естественно указать их в том порядке, в каком они следуют в таблице. Кроме того, оператор INSERT можно было бы записать и таким образом:
INSERT INTO Staff
VALUES ('SG441 , 'Anne1 , 'Jones1 , 'Assistant1 , NULL, NULL, 8100,
NULL, 'BG03.') ;
В этом случае мы явно указали, что в столбцы sex и DOB должны быть помещены значения NULL.
-т-цошт.. -". J
Вторая форма оператора INSERT позволяет скопировать множество строк одной таблицы в другую. Этот оператор имеет следующий формат:
rINSERT INTO . TableWame
-•'.-SELECT .-•-.-•:
ЖИННшШшЯВнШНШВННШ^ЖкЖ^ШН^^ШШНпНяПаВПЯЯВВкШшя
Здесь параметры TableWame и columnList имеют тот же формат и смысл, что и при вставке в таблицу одной строки. Конструкция SELECT может представлять собой любой допустимый оператор SELECT. Строки, вставляемые в указанную таблицу, в точности соответствуют строкам результирующей таблицы, созданной при выполнении вложенного запроса. Все ограничения, указанные выше для первой формы оператора INSERT, применимы и в этом случае.
Пример 5. 37. Использование конструкции INSERT ... SELECT
Предположим, что существует таблица Staff PropCount, содержащая имена работников компании и учетные номера сдаваемых в аренду объектов, за которые они отвечают:
Staff PropCount (staff No, fNarie, IName, propCount)
Заполните таблицу staff PropCount данными, используя информацию из таблиц staff и
PropertyForRent.
INSERT INTO StaffPropCount
{SELECT s.staffNo, fName, IName, COUNT(*)
FROM Staff s. Proper t у ForRent p
WHERE s.staffNo » p. staff No
GROUP BY s.staffNo, fName, IName}
UNION
(SELECT staffNo, fName, INa-ne, 0
FROM Staff
WHERE staffNo NOT IN (SELECT DISTINCT staffNo
FROM PropertyForRent) ) ;
Этот пример достаточно сложен, поскольку нам требуется подсчитать количество сдаваемых в аренду объектов собственности, за которые отвечают работники компании. Если опустить вторую часть операции UNION, то будет создан список только тех работников компании, которые в настоящее время отвечают хотя бы за один объект. Иначе говоря, из результатов будут исключены все работники, которые в данный момент не отвечают ни на один сдаваемый в аренду объект. По этой причине для составления полного списка работников компании необходимо использовать оператор UNION, в котором второй оператор SELECT предназначен для выборки сведений именно о таких работниках, причем в столбец count соответствующих строк помещается значение 0. В табл. 5.41 представлено содержимое таблицы StaffPropCount после выполнения приведенного выше оператора.
Таблица 5.41. Результат выполнения оператора SQL из примера 5.37
Отметим, что в некоторых диалектах языка SQL не допускается использовать оператор UNION в подзапросах оператора INSERT.
Модификация данных в базе (оператор UPDATE)
Оператор UPDATE позволяет изменять содержимое уже существующих строк указанной таблицы. Этот оператор имеет следующий формат:
^UPDATE. ТаЫеПате
SET calumnNamel = dataValuel
[WHERE searchCondition]
columnNameS '*= dataValueS
Здесь параметр TableN&me представляет либо имя таблицы базы данных, либо имя обновляемого представления (см. раздел 6.4). В конструкции SET указываются имена одного или более столбцов, данные в которых необходимо изме-
нить. Конструкция WHERE является необязательной. Если она опущена, значения указанных столбцов будут изменены во всех строках таблицы. Если конструкция WHERE присутствует, то обновлены будут только те строки, которые удовлетворяют условию поиска, заданному в параметре searchCondition. Параметры dataValuel, dataValue2t... представляют новые значения соответствующих столбцов и должны быть совместимы с ними по типу данных.
Пример 5.38. Обновление всех строк таблицы с помощью оператора
UPDATE
Всему персоналу повысить заработную плату на 3%.
UPDATE Staff
SET salary = salary*!.03;
Поскольку изменения касаются всех строк таблицы Staff, конструкцию WHERE
указывать не требуется.
"лава 5. Язык SQL: манипулирование данными 205
Пример 5.39. Обновление некоторых строк таблицы с помощью
оператора UPDATE
Всем менеджерам компании повысить заработную плату на 5%.
UPDATE Staff
SET salary = salary*!.05
WHERE position = 'Manager1 ;
Здесь конструкция WHERE применяется для обновления только тех строк таблицы, которые содержат сведения о менеджерах компании. Именно в этих строках в столбец salary будет помещено новое значение, вычисляемое как salary =
salary*!.05.
Пример 5.40. Обновление нескольких столбцов с помощью оператора
UPDATE
Перевести Дэвида Форда (Btaf.No='SGl4 ') на должность менеджера и повысить ему
зарплату до 18 000 фунтов стерлингов в год.
UPDATE Staff
SET position = 'Manager', salary = 18000
WHERE staffNo = 'SG14';
Удаление данных из базы (оператор DELETE)
Оператор DELETE позволяет удалять строки данных из указанной таблицы.
Этот оператор имеет следующий формат:
'''DELETE FROM TableName
:[WHERE searchConditionJ
Как и в случае операторов INSERT и UPDATE, параметр TableName может представлять собой либо имя таблицы базы данных, либо имя обновляемого представления (см. раздел 6.4). Параметр searchCondition является необязательным — если он опущен, из таблицы будут удалены все существующие в ней строки. Однако сама по себе таблица удалена не будет. Если необходимо удалить не только содержимое таблицы, но и ее определение, следует использовать оператор DROP TABLE (см. раздел 6.3.3). Если конструкция WHSRE присутствует, из таблицы будут удалены только те строки, которые удовлетворяют условию отбора, заданному параметром searchCondition,
Пример 5.41. Удаление определенных строк таблицы (оператор DELETE)
Удалить все записи об осмотрах сдаваемого в аренду объекта с учетным номером PG4.
DELETE FROM Viewing
WHERE propertyNo = 'PG4';
Конструкция WHERE позволяет найти как предназначенные для удаления только те строки таблицы,, которые относятся к сдаваемому в аренду объекту с номером ' PG4 ', и применить к ним операцию удаления.
Пример 5.42. Удаление всех строк таблицы (оператор DELETE) Удалить все строки из таблицы viewing.
DELETE FROM Viewing/
Поскольку в данном операторе конструкция WHERE не указана, будут удалены все строки таблицы. В результате в базе данных сохранится лишь описание таблицы Viewing, что в дальнейшем позволит ввести в нее новую информацию.
• SQL является непроцедурным языком, построенным на использовании обычных английских слов (таких как SELECT, INSERT, DELETE). Он может применяться как профессионалами, так и рядовыми пользователями. Этот язык формально и фактически стал стандартным языком определения и манипулирования реляционными базами данных.
• Оператор SELECT используется для создания запроса и является самым важным из всех существующих операторов SQL. Он объединяет в себе три основные операции реляционной алгебры: выборку, проекцию и соединение. При выполнении любого оператора SELECT создается результирующая таблица, содержащая один или несколько столбцов и нуль или больше строк.
• В списке выборки SELECT указываются столбцы и/или вычисляемые поля, которые должны присутствовать в результирующей таблице. В конструкции FROM должны быть перечислены все таблицы и представления, доступ к которым необходим для извлечения данных из столбцов, имена которых присутствуют в списке выборки SELECT.
• Конструкция WHERE используется для отбора строк данных, которые должны быть помещены в результирующую таблицу запроса. Отбор осуществляется посредством проверки заданных условий поиска для каждой из строк указанных таблиц. Конструкция ORDER BY позволяет упорядочить строки результирующей таблицы по значению одного или нескольких столбцов. Для каждого столбца может использоваться сортировка в порядке возрастания или убывания значений. Если конструкция ORDER BY присутствует в операторе SELECT, то она должна быть в нем последней.
• В языке SQL определено пять агрегирующих функций (COUNT, SUM, AVG, MIN и MAX), каждая из которых как параметр использует значения всех элементов указанного столбца и возвращает в качестве результата единственное значение. В одной конструкции SELECT не допускается смешивать и агрегирующие функции, и имена столбцов, за исключением случая использования конструкции GROUP BY.
• Конструкция GROUP BY позволяет включать в результирующую таблицу запроса итоговую информацию. Строки, которые имеют одно и то же значение в одном или нескольких столбцах, могут объединяться и рассматриваться как исходная информация для агрегирующих функций. В этом случае агрегирующая функция воспринимает каждую из групп как параметр и вычисляет единственное значение для каждой группы, возвращаемое как результат.
Применительно к группам конструкция HAVING выполняет те же функции, что и конструкция WHERE по отношению к строкам. С ее помощью можно выполнить отбор групп, которые будут помещены в результирующую таблицу запроса. Однако, в отличие от конструкции WHERE, в конструкции HAVING могут использоваться агрегирующие функции.
Подзапрос представляет собой завершенный оператор SELECT, встроенный в тело другого запроса. Вложенный запрос может помещаться в конструкцию WHERE или HAVING внешнего оператора SELECT, в таком случае он называется подзапросом. Концептуально в результате выполнения подзапроса создается временная таблица, содержимое которой становится доступным внешнему запросу. В подзапрос может быть, внедрен другой подзапрос.
Предусмотрены три типа подзапросов: скалярный, строковый и табличный.
Скалярный подзапрос возвращает значение из одного столбца и одной строки; по сути, это — единственное значение. В принципе скалярный подзапрос может применяться во всех случаях, когда требуется единственное значение.
Строковый подзапрос возвращает данные из нескольких столбцов, но опять таки в виде одной строки. Строковый подзапрос может использоваться во всех случаях, когда требуется получить одну строку, чаще всего в предикатах. Табличный подзапрос возвращает один или несколько столбцов и несколько строк. Табличный подзапрос может использоваться везде, где требуется таблица, например в качестве операнда для предиката IN.
Если столбцы результирующей таблицы выбираются из нескольких исходных таблиц, для последних должт быть выполнена операция соединения. Имена соединяемых таблиц указываются в конструкции FROM, а столбцы, по которым осуществляется соединение, обычно определяются в конструкции WHERE. Стандарт ISO допускает использование внешних соединений. Кроме того, он позволяет применять операции над множествами (объединение, пересечение и разность), определяемые с помощью ключевых слов UNION, INTERSECT и EXCEPT.
Помимо оператора SELECT, язык SQL DML включает оператор INSERT, пред назначенный для вставки одной строки данных в указанную таблицу или для вставки в таблицу произвольного количества строк, извлеченных из других таблиц с помощью некоторого подзапроса. Оператор UPDATE предназначен для обновления одного или нескольких значений заданных столбцов указанной таблицы. Оператор DELETE позволяет удалить из заданной таблицы одну или несколько строк данных.
(ОПРОСЫ
5.1. Назовите два главных компонента языка SQL. Какие функции они выполняют?
5.2. Каковы достоинства и недостатки языка SQL?
5.3. Объясните назначение каждой из конструкций, которые могут присутствовать в операторе SELECT. Какие ограничения накладываются на эти конструкции?
5.4. Какие ограничения накладываются на использование агрегирующих функций в теле оператора SELECT? Как агрегирующими функциями обрабатываются значения NULL?
5.5. Объясните принципы работы конструкции GROUP BY. В чем состоит различие между конструкциями WHERE и HAVING?
5.6. Каковы различия между подзапросом и соединением? При каких обстоятельствах использование подзапросов становится невозможным?
В упражнениях 5.7-5.28 применяется схема Hotel, которая определена в упражнениях главы 3.
Простые запросы
5.7. Выберите из базы данных сведения обо всех отелях.
5.8. Выберите из базы данных сведения обо всех отелях, расположенных в Лондоне.
5.9. Составьте перечень имен и адресов всех постояльцев, зарегистрированных в отелях Лондона, упорядочив информацию по именам постояльцев в алфавитном порядке.
5.10. Составьте список всех двухкомнатных или семейных номеров отелей с ценой менее 40 фунтов стерлингов в сутки, упорядочив данные в порядке увеличения стоимости номера.
5.11. Выберите все записи регистрации постояльцев, в которых не было заполнено поле dateTo.
Агрегирующие функции
5.12. Сколько отелей принадлежит компании?
5.13. Какова средняя стоимость номера?
5.14. Чему равен общий суточный доход от всех двухкомнатных номеров?
5.15. Сколько всего постояльцев было зарегистрировано на протяжении августа?
Подзапросы и соединения
5.16. Составьте отчет с указанием цены и типа всех номеров отеля Grosvenor,
5.17. Перечислите всех постояльцев, в настоящее время снимающих номера в отеле Grosvenor.
5.18. Составьте отчет, содержащий полные сведения обо всех номерах отеля Grosvenor, с указанием имен постояльцев всех номеров.
5.19. Чему равен общий доход от постояльцев, зарегистрированных в отеле Grosvenor, за сегодняшний день?
5.20. Составьте список номеров отеля Grosvenor, которые в данный момент свободны.
5.21. Каковы общие убытки из-за наличия в отеле Grosvenor свободных номеров?
Группирование
5.22. Определите количество номеров в каждом из отелей.
5.23. Определите количество номеров в каждом из отелей, расположенных в Лондоне.
5.24. Каково среднее количество постояльцев, зарегистрированных в каждом из отелей в августе?
5.25. Какой тип номеров чаще всего снимается в каждом из отелей Лондона?
5.26. Какова сумма убытков из-за наличия свободных номеров в каждом из отелей за сегодняшний день?
Создание и заполнение таблиц
5.27. Введите в каждую из таблиц несколько записей.
5.28. Увеличьте стоимость каждого номера на 5%.
Общие вопросы
5.29. Ознакомьтесь с описанием диалекта языка SQL в той СУБД, с которой вы в данный момент работаете. Определите степень соответствия этого диалекта стандарту ISO. Проанализируйте функциональные возможности любых расширений языка, поддерживаемых этой СУБД. Имеются Ли предусмотренные стандартом функции., которые не поддерживаются данной СУБД?
5.30. Докажите, что запрос, построенный с использованием конструкции HAVING, всегда может быть переписан в эквивалентной формулировке без использования конструкции HAVING.
5.31. Докажите, что язык SQL является реляционно полным.