Автор работы: Пользователь скрыл имя, 05 Ноября 2009 в 13:11, Не определен
Лекции
Простой подзапрос
Пример:
Выбрать
фамилии поставщиков, которые поставляют
деталь P2.
SELECT familia FROM S
WHERE
nomer IN (SELECT nomer_s FROM SP WHERE nomer_p = 'P2')
Результат:
familia |
Смит |
Джонс |
Блейк |
Кларк |
При
обработке полного запроса
Поэтому
первоначальный запрос эквивалентен следующему
простому запросу:
SELECT
familia FROM S WHERE nomer_s IN ('S1', 'S2', 'S3', 'S4');
Задачу
из примера можно решить, применяя
соединение.
SELECT
familia FROM S, SP WHERE (S.nomer = SP.nomer_s) AND (nomer_p = 'P2');
Подзапрос с несколькими уровнями вложенности
Пример:
Выбрать
фамилии поставщиков, которые поставляют,
по крайней мере, одну красную деталь.
SELECT familia FROM S WHERE nomer_s IN
(SELECT nomer_s FROM SP WHERE nomer_p IN
(SELECT
nomer FROM P WHERE zvet = 'красный'))
Результат:
familia |
Смит |
Джонс |
Кларк |
Если
использовать соединение трех таблиц,
то результат следующий:
Результат:
familia |
Смит |
Джонс |
Кларк |
Смит |
Смит |
Подзапрос
с операцией отличной
от IN
Пример:
Выбрать
номера поставщиков, находящихся в
том же городе, что и поставщик
S1.
SELECT nomer FROM S WHERE gorod =
(SELECT
gorod FROM S WHERE nomer = 'S1');
Результат:
nomer |
S1 |
S4 |
Если
заранее известно, что подзапрос
возвратит в точности 1 значение, то вместо
IN можно употребить операцию сравнения
(=, <>, >, ...). Однако, если подзапрос
вернет более одного значения, то возникнет
ошибка.
Стандартные функции
На
вопросы типа "сколько строк
в таблице?" отвечают стандартные
функции языка SQL (агрегирующие функции):
COUNT - количество строк
SUM - сумма значений в столбце
AVG
- среднее арифметическое по
MAX - наибольшее значение в столбце
MIN
- наименьшее значение в столбце
SUM
и AVG применяются только к столбцам
числового типа.
После
имени функции, в скобках, нужно
записывать имя столбца, а перед
ним может присутствовать слово
DISTINCT. Оно указывает, что дубликаты
следует исключить перед тем
как будет применяться функция.
Специальный
вид функции COUNT(*) предназначен для
подсчета всех строк в таблице, без исключения
дубликатов.
Функция
в части SELECT
Пример:
Подсчитать
общее количество поставщиков.
SELECT
COUNT(*) FROM S
Результат:
COUNT |
5 |
Функция
в части SELECT с исключением
дубликатов
Пример:
Подсчитать
общее количество поставщиков, поставляющих
детали.
SELECT
COUNT(DISTINCT nomer_s) FROM SP;
Результат:
COUNT |
4 |
Функция
в части SELECT с условием в части
WHERE
Пример:
Подсчитать
общее количество поставляемых деталей
P2 (сколько деталей по всем поставкам?).
SELECT
SUM (kol) FROM SP WHERE nomer_p = 'P2';
Результат:
SUM |
1000 |
Группирование
записей
Пример:
Требуется
подсчитать общее количество поставляемых
деталей по каждому виду деталей.
То есть, по каждому виду выдать номер
детали и суммарный объем поставок.
SELECT
nomer_p, SUM(kol) FROM SP GROUP BY nomer_p;
Результат:
nomer_p | SUM |
P1 | 600 |
P2 | 1000 |
P3 | 400 |
P4 | 500 |
P5 | 500 |
P6 | 100 |
Как
исполняется такой оператор?
1) Часть GROUP BY перекомпоновывает таблицу, указанную в части FROM в группы, таким образом, чтобы в каждой группе все строки имели одно и то же значение в столбце, указанном в GROUP BY.
2)
К каждой группе
Каждое выражение в части SELECT должно принимать единственное значение для группы. То есть, оно может быть либо самим столбцом в части GROUP BY, либо арифметическим выражением, содержащим такой столбец, либо константой, либо функцией (например, SUM), которая сводит разные значения к одному.
Оператор
обновления (модификации) строк в
одной таблице имеет вид:
UPDATE <имя таблицы>
SET <имя столбца> = <выражение>{, <имя столбца> = <выражение>}
[
WHERE <условие> ];
Все
строки в таблице, которые удовлетворяют
<условию>, изменяются в соответствии
с присваиваниями в части SET.
Примеры:
Обновление
единственной строки
Изменить
цвет детали P2 на желтый и увеличить
ее вес на 5.
UPDATE
P SET zvet='желтый', ves=ves+5 WHERE nomer='P2';
Обновление
нескольких строк
UPDATE
S SET kapital=kapital*2 WHERE gorod='Лондон'
Обновление
нескольких таблиц
Изменить
номер поставщика с S2 на S9.
UPDATE
S SET nomer='S9' WHERE nomer='S2';
UPDATE
SP SET nomer='S9' WHERE nomer='S2';
В
одном операторе невозможно обновить
две таблицы!
После первого оператора БД стала противоречивой. Теперь в ней есть поставки у которой нет поставщика. В этом противоречивом состоянии БД будет находиться до завершения второго оператора. Изменения порядка операторов принципиально ничего не меняет. Поэтому, с точки зрения целостности БД важно обеспечить завершение обоих операторов, а не одного из них (см. дальше).
DELETE
FROM <имя таблицы>
[
WHERE <условие> ];
Этот оператор удаляет все строки из таблицы, которые удовлетворяют <условию>.
Две формы оператора INSERT
а)
INSERT
INTO <имя таблицы> [ ( <имя столбца>{, <имя столбца>} ) ]
VALUES ( <константа>{, <константа>} );
б)
INSERT
INTO <имя таблицы> [ ( <имя столбца>{, <имя столбца>} ) ]
<подзапрос>;
В форме (а) в таблицу вставляется строка из констант, перечисленных в части VALUES. Причем, i-ая константа соответствует i-му столбцу в части INTO.
В
форме (б) сначала вычисляется <подзапрос>
(результат которого - таблица) и
результат подзапроса вставляется
в таблицу <имя таблицы>.
Пример:
Добавить
в таблицу P деталь P7: город Москва,
вес 2, название и цвет пока не известны.
INSERT
INTO P (nomer, gorod, ves) VALUES ('P7', 'Москва', 2);
В
таблице P появляется новая строка.
Порядок столбцов в части INTO не обязательно
должен совпадать с порядком столбцов
при создании таблицы.
Вставка единственной
строки с опущенными
именами столбцов
Добавить
в таблицу P деталь P8: название "звездочка",
цвет розовый, вес 14, город Берлин.
INSERT
INTO P VALUES ('P8', 'звездочка', 'розовый', 14, 'Берлин');
Если
имена столбцов не заданы, то предполагается
перечисление всех столбцов таблицы
в порядке их перечисления в операторе
CREATE.
Вставка
множества строк
Для
каждой поставляемой детали получить
ее номер и объем ее поставки,
сохранить результат в отдельной таблице.
CREATE TABLE VREMEN
(nomer CHAR(6),
sum_postavki INTEGER)
INSERT INTO VREMEN SELECT nomer_p, SUM(kol) FROM SPGROUP BY nomer_p
Вернемся
к примеру в котором заменяется
номер поставщика S2 на S9. Обобщим этот
пример. Допустим, есть некий язык программирования,
внутри которого можно выполнять операторы
SQL. Напишем процедуру, которая будет менять
номер поставщика с SX на SY.
Trans: proc(SX, SY);
ON ERROR: begin ROLLBACK; RETURN end;
EXEC UPDATE S SET nomer=SY WHERE nomer=SX;