Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД SQL.docx
Скачиваний:
4
Добавлен:
27.08.2019
Размер:
2.1 Mб
Скачать

Предложение having

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

Синтаксис

SELECT списокПолей FROM таблица WHERE условиеОтбора GROUP BY группируемыеПоля HAVING условиеГруппировки

Ниже перечислены аргументы инструкции SELECT, содержащей предложение HAVING:

Элемент

группируемыеПоля

Описание

Имена полей (до 10), которые используются для группи­ровки записей. Порядок имен полей в аргументе группи­руемыеПоля определяет уровень группировки для каждо­го из этих полей.

условиеГруппировки

Выражение, определяющее, какие сгруппированные запи­си следует отображать.

Предложение HAVING является необязательным.

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

SELECT КодТипа, Sum(НаСкладе)

FROM Товары

GROUP BY КодТипа

HAVING Sum(НаСкладе) > 100;

Предложение HAVING может содержать до 40 выражений, связанных логическими опе­раторами, такими как And и Ог.

Инструкция SELECT [предикат]

Предикат позволяют отобрать записи среди выбранных с помощью запроса на языке SQL.

Элемент

предикат

Описание

Один из следующих предикатов отбора:

ALL, DISTINCT, DISTINCTROW ТОР. Предикаты используют­ся для ограничения числа возвращаемых записей. Если они отсутст­вуют, по умолчанию используется предикат ALL.

Синтаксис

SELECT [ALL /DISTINCT /DISTINCTROW /[TOP n [PERCENT]]] имена полей {смотри

выше }

FROM таблица

Элемент Описание

ALL Если инструкция SQL не содержит ни одного предиката, то подразуме-

вается предикат ALL. Отбираются все записи, соответствующие усло­виям, заданным в инструкции SQL.

DISTINCT Исключает записи, которые содержат повторяющиеся значения в вы-

бранных полях. Чтобы запись была включена в результат выполнения запроса, значения в каждом поле, включенном в инструкцию SELECT, должны быть уникальными. Например, в таблице «Сотрудники» есть однофамильцы. Если две записи содержат значение «Иванов» в поле «Фамилия», то следующая инструкция SQL возвратит только одну из них:

SELECT DISTINCT Фамилия

FROM Сотрудники;

Если опустить предикат DISTINCT, этот запрос возвратит обе записи для фамилии Иванов. Если предложение SELECT содержит более одно­го поля, то для включения записи в результат выполнения запроса необ­ходимо, чтобы совокупность значений во всех этих полях была уни­кальной. Результат выполнения инструкции SQL, содержащей предикат DISTINCT, является необновляемым и не отражает последующие изме­нения, внесенные другими пользователями.

82

DISTINCTROW Опускает данные, основанные на целиком повторяющихся записях, а не отдельных повторяющихся полях. Например, создан запрос, объеди­няющий таблицы «Клиенты» и «Заказы» по полю «КодКлиента». Таб­лица «Клиенты» не имеет повторяющихся значений в поле «КодКлиен­та», а таблица «Заказы» содержит, поскольку каждый клиент может сделать несколько заказов. Следующая инструкция SQL показывает, как можно использовать предикат DISTINCTROW для получения списка клиентов, разместивших хотя бы один заказ, без включения сведений о самих заказах:

SELECT DISTINCTROW Название

FROM Клиенты INNER JOIN Заказы

ON Клиенты.КодКлиента = Заказы.КодКлиента ORDER BY Название;

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

Возвращает определенное число записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Следующая инструкция SQL позволяет получить список 25 лучших студентов выпуска 1994 года:

SELECT TOP 25 Имя, Фамилия

FROM Студенты

WHERE [Год Выпуска] = 1994

ORDER BY [Средний Балл] DESC;

Если предложение ORDER BY будет опущено, запрос возвратит произ­вольный набор 25 записей из таблицы «Студенты», удовлетворяющих предложению WHERE. Предикат ТОР не осуществляет выбор между равными значениями. Если в предыдущем примере средние баллы два­дцать пятого и двадцать шестого студентов будут равны, то запрос воз­вратит 26 записей.

Кроме того, можно использовать зарезервированное слово PERCENT для возврата определенного процента записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Предположим, что вместо 25 лучших студентов следует отобрать сту­дентов, попавших в последние 10%:

SELECT TOP 10 PERCENT Имя, Фамилия

FROM Студенты

WHERE [Год Выпуска] = 1994

ORDER BY [Средний Балл] ASC;

Предикат ASC обеспечивает возврат последних значений. Значение, следующее после предиката ТОР должно быть числовым значением ти­па Integer без знака. Предикат ТОР не влияет на возможность обновле­ния запроса.

83

Инструкция UPDATE

Создает запрос на обновление, который изменяет значения полей указанной таблицы на основе заданного условия отбора.

Синтаксис

UPDATE SET

WHERE

Элемент

таблица

условие Отбора

таблица

поле1 = новоеЗначение1, поле2 = новоеЗначение2,... условиеОтбора ;

Описание

Имя таблицы, данные в которой следует изменить.

поле1 = новоеЗначение1

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

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

Дополнительные сведения

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

UPDATE Заказы

SET

СуммаЗаказа = СуммаЗаказа * 1.1, СтоимостьДоставки = СтоимостьДоставки * 1.03

WHERE СтранаПолучателя = "Франция";

84

Инструкция INSERT INTO

Инструкция INSERT INTO предназначена для добавления одной или нескольких записей в конец таблицы.

Запрос на добавление одной записи Синтаксис:

INSERT INTO VALUES

таблица (поле1, поле2, ... полеN) значение1, значение2, значениеN;

Добавление осуществляется следующим образом: значение 1 в поле1 значение2 в поле2

з начениеN в поле N

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

Если заполняются все столбцы записи, то инструкции INSERT INTO имена полей можно опустить, но количество значений должно соответствовать количеству полей в заполняе­мой таблице.

INSERT INTO VALUES

таблица

значение!, значение2, значением;

Пример:

В таблице «Студенты» добавить запись нового студента, содержащую фамилию, имя. отчество и год рождения.

INSERT INTO VALUES

Студенты (Фамилия, Имя, Отчество, [Год рождения]) "Смирнов", "Игорь", "Петрович", 1985;

85

Запрос на добавление нескольких записей:

INSERT INTO таблицаНазначения (поле1, поле2, ... полеN) SELECT поле1, поле2, ... полеN FROM выражение

[WHERE...]

Элемент Описание

таблщаНазначения Имя таблицы, в которую добавляются записи.

выражение

Имена таблицы или таблиц, откуда вставляются данные. Это вы­ражение может быть именем отдельной таблицы или результатом операции INNER JOIN, LEFT JOIN или RIGHT JOIN, а также со­храненным запросом.

Дополнительные сведения

Инструкцию INSERT INTO можно также использовать для добавления набора записей из другой таблицы или запроса с помощью предложения SELECT ... FROM, как показано выше в запросе на добавление нескольких записей. В этом случае предложение SELECT определяет поля, добавляемые в указанную таблицу Назначение.

Инструкция INSERT INTO является необязательной, если же она присутствует, то долж­на находиться перед инструкцией SELECT.

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

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

Для создания новой таблицы используйте инструкцию SELECT... INTO вместо запроса на создание таблицы.

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

86