Псевдонимы таблиц и комментарии
В приведенных таблицах нет совпадающих имен полей за счет того, что каждое поле в любой таблице начинается с буквы, соответствующей начальной букве имени таблицы. А что делать, когда имена полей из двух и более таблиц совпадают? Если бы мы, например, пренебрегли нашим правилом и не ставили префиксы, появились бы два имени Name и следующий фрагмент привел бы к неоднозначности:
SELECT NaklID, Date, Name, Name, Sum, PayedSum
Чтобы исключить неоднозначность, в таких случаях имена полей дополняют именами их таблиц:
SELECT NaklID, Date, Firms.Name, TypeNakl.Name, Sum, PayedSum
Поскольку совпадающие имена таблиц могут встречаться и в других секциях запроса, для сокращения их именования в SQL разрешено вместо имени таблицы использовать ее псевдоним:
SELECT NaklID, Date, F.Name, T.Name, Sum, PayedSum
FROM Nakls, Firms F, TypeNakl T
Псевдоним указывается сразу за именем таблицы в секции FROM.
В любом месте запроса может стоять комментарий:
SELECT
/* Совпадающие имена полей дополняются псевдонимами таблиц */
NaklID, Date, F.Name, T.Name, Sum, PayedSum
/* Псевдонимы задаются символами сразу за именем таблицы */
FROM Nakls, Firms F, TypeNakl T
Агрегатные функции и группировка записей
Вместо и/или вместе с именами полей в секции SELECT можно использовать одну из следующих агрегатных функций:
AVG – возвращает среднее значение аргумента;
COUNT – подсчитывает количество вхождений аргумента во все записи НД;
МАХ – возвращает максимальное значение аргумента;
MIN – возвращает минимальное значение аргумента;
SUM – суммирует значения аргумента.
В качестве аргумента при обращении к агрегатной функции может стоять произвольное выражение, составленное из полей НД. Например, следующий запрос возвращает среднее значение долга покупателей:
SELECT AVG(NSum-NPayedSum-NRetSum)
FROM Nakls
WHERE NType in (1, 7)
Список всех поставщиков с указанием суммы стоимости всех поставленных ими книг дает такой запрос:
SELECT FName, SUM(NSum)
FROM Nakls, Firms
WHERE FirmID=NFirm AND NType in (0, 6)
GROUP BY FName
Интересно получить не только суммы поставок, но и имена партнеров. Поэтому в приведенном выше запросе в секции SELECT указана агрегатная функция и поле таблицы Firms. Для подобного рода запросов, в которых вместе с агрегатными функциями фигурируют и поля таблиц, SQL требует секции группировки GROUP BY, в которой в обязательном порядке перечисляются все поля, указанные в секции SELECT.
При использовании агрегатных функций иногда требуется исключить из списка повторяющиеся значения полей. Для этого служит зарезервированное слово DISTINCT.
Например, представленный ниже запрос вернет количество всех накладных, связанных с поставкой книг:
SELECT COUNT(NFirm) FROM Nakls
WHERE NType IN (0, 6)
Следующий запрос вернет количество поставщиков:
SELECT COUNT(DISTINCT NFirm) FROM Nakls
WHERE NType IN (0, 6)
Вставка, удаление и редактирование записей
В таблицу БД запись вставляется с помощью оператора
INSERT INTO Имя_таблицы (Список_полей) VALUES (Список_значений)
Например:
INSERT INTO TypeNakl (TName, TypeID) VALUES ("Брак", 8)
Каждому полю в списке полей должно соответствовать нужное значение в списке значений. Если заполняются все поля записи, список полей вместе с обрамляющими скобками можно опускать. В этом случае значения в списке значений перечисляются в строгом соответствии со следованием полей в структуре таблицы:
INSERT INTO TypeNakl VALUES (8, "Брак")
С помощью оператора INSERT можно вставить сразу группу записей. Пусть, например, таблица создана следующим оператором:
CREATE TABLE NewTable(MoveID INT, MNakl SMALLINT, MBook SMALLINT,
MQuan SMALLINT, MPrice FLOAT);
Тогда следующий оператор вставит в нее список книг для накладной с идентификатором 100:
INSERT INTO NewTable
SELECT * FROM MoveBook
WHERE MNakl=100
Примечание.
Таблица MoveBook
Имя поля |
Назначение |
MoveID |
Уникальный идентификатор (первичный ключ) |
MNakl |
Код накладной из поля NaklID таблицы Nakls (индексное поле) |
MBook |
Код книги из поля BookID таблицы Books (индексное поле) |
MQuan |
Количество экземпляров книги |
MPrice |
Цена одного экземпляра с учетом скидки/наценки |
Для удаления записей используется оператор
DELETE FROM Имя_таблицы WHERE Условие_выборки_записей
Например: DELETE FROM TypeNakl WHERE TypeID=8
Если опустить секцию WHERE, из таблицы будут удалены все записи.
Изменение отдельных полей таблицы реализуется оператором
UPDATE Имя_таблицы SET Имя_поля=Значение WHERE Условие_выборки
Например: UPDATE TypeNakl SET TName="Списание в брак" WHERE TypeID=8
За зарезервированным словом SET может стоять произвольное количество полей с указанием их значений; два соседних присваивания Имя_поля=Значение разделяются запятой. Если опустить секцию WHERE, будут изменены значения всех записей таблицы.
