
- •Новосибирская государственная академия экономики и управления
- •«Базы данных»
- •Новосибирск 2000
- •Введение
- •1. Простые запросы
- •2. Многотабличные запросы
- •3. Подзапросы
- •4. Операторы exists и not exists
- •5. Встроенные функции
- •6. Фразы group by и having
- •7. Встроенные функции и подзапросы
- •9. Операции изменения данных
7. Встроенные функции и подзапросы
Встроенные функции могут использоваться только во фразе SELECT или в команде HAVING. Однако фраза SELECT, содержащая встроенную функцию, может быть частью подзапроса. Рассмотрим пример такого подзапроса:
Запрос: У кого из работников почасовая ставка выше среднего?
SELECT WORKER_NAME
FROM WORKER
WHERE HRLY_RATE >
(SELECT AVG(HRLY_RATE)
FROM WORKER)
Результат:
NAME
К. Немо
П.Мэйсон
Х. Колумб
Обратите внимание, что подзапрос не коррелирует с главным запросом. Подзапрос выдает ровно одно значение - среднюю почасовую ставку. Главный запрос выбирает работника только в том случае, если его ставка больше вычисленной средней.
В коррелированных запросах также могут использоваться встроенные функции:
Запрос: У кого из работников почасовая ставка выше средней почасовой ставки среди подчиненных того же менеджера?
В этом случае вместо вычисления одной средней почасовой ставки для всех работников мы должны вычислить среднюю ставку каждой группы работников, подчиняющейся одному и тому же менеджеру. Более того, наше вычисление должно производиться заново для каждого работника, рассматриваемого главным запросом:
SELECT A. WORKER_NAME
FROM WORKER A
WHERE A.HRLY_RATE >
(SELECT AVG(B.HRLY_RATE)
FROM WORKER В
WHERE B.SUPV_ID = A.SUPV_ID)
Результат:
A.WORKER NAME
К.Немо
П.Мэйсон
X.Колумб
Фраза WHERE подзапроса содержит ключевое условие корреляции. Это условие гарантирует, что среднее будет вычисляться только по тем рабочим, которые подчиняются тому же менеджеру, что и работник, рассматриваемый главным запросом.
9. Операции изменения данных
В SQL есть операции изменения данных INSERT, UPDATE и DELETE, позволяющие, соответственно, добавлять строки, изменять значения в строках и удалять строки определенной таблицы в базе данных. Каждую из операций мы обсудим отдельно.
INSERT. Операция INSERT (вставить) позволяет вводить в таблицу как отдельные строки путем указания значений каждого столбца, так и множества строк путем формулировки запроса, определяющего вводимые строки.
INSERT INTO ASSIGNMENT (WORKER_ID, BLDG_ID, START DATE)
VALUES (1284, 485, 13.05)
Это выражение вводит в таблицу ASSIGNMENT одну строку. Имена столбцов, для которых задаются соответствующие значения, перечислены в скобках после имени обновляемой таблицы. Поскольку мы опустили NUM_DAYS, в этот столбец будет помещено пустое значение.
Предположим, что мы создали новую таблицу с именем BUILDING_2, состоящую из столбцов BLDG_ID, TYPE и QLTY_LEVEL (УРОВ_КАЧЕСТВА), и хотим заполнить эту таблицу строками из таблицы BUILDING, имеющими STATUS 2. Тогда мы воспользуемся второй формой команды INSERT:
INSERT INTO BUILDING_2
SELECT BLDG_ID, TYPE, QLTY_LEVEL
FROM BUILDING
WHERE STATUS = 2
INSERT. Операция, добавляющая строки к таблице.
UPDATE. Операция UPDATE (изменить) всегда применяется ко всем строкам, удовлетворяющим условию выражения WHERE. Если мы хотим повысить на 5 процентов ставку каждого подчиненного начальника 1520, то нам потребуется следующее выражение:
UPDATE WORKER
SET HRLY_RATE = 1.05 * HRLY_RATE
WHERE SUPV_ID = 1520 -
Если фраза WHERE отсутствует, то операция применяется к каждой строке таблицы. Например, если бы мы хотели повысить на 5 процентов ставку каждого работника, то мы должны были бы просто опустить команду WHERE в выражении UPDATE.
UPDATE. Операция, изменяющая значения столбцов в строке.
DELETE. Операция DELETE (удалить) также применяется ко всем строкам, удовлетворяющим условию WHERE. Если фраза WHERE отсутствует. то удаляются все строки таблицы. Допустим, что все рабочие, чей начальник имеет индекс 1520, были уволены, и мы хотим удалить соответствующие строки из базы данных. Это сделает следующее выражение:
DELETE FROM WORKER
WHERE SUPV ID = 1520
DELETE. Операция, удаляющая строки из таблицы.