Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_лекции_Саладаев.doc
Скачиваний:
55
Добавлен:
03.05.2015
Размер:
15.75 Mб
Скачать

Связанные подзапросы.

Возможность подзапросов порождает возможность ссылки в подзапросе на таблицу, имя которой указано в FORMвнешнего запроса. В этом случае подзапрос повторяется многократно по количеству строк таблицы основного запроса.

Пример. Отыскать всех покупателей, сделавших заказы 3 октября 2006 г.

S

алиас

дата начала работы

ELECT *

FROM Customers outer

WHERE 10/03/06 IN

(SELECT odate

FROM Orders inner

Сюда подставляется строка- кандидат из таблицы внешнего запроса

WHERE outer. cnum = inner. cnum);

Существует специальный оператор, всегда использующий подзапрос в качестве аргумента- это оператор EXISTS.

Он используется, когда от подзапроса нужно лишь узнать дает он NULLили нет. СоответственноEXISTSвозвращает «ложь» или «истину».

Например, нужно извлечь данные из таблицы Customersв том случае, если хотя бы один покупатель из нее изLondon’а:

SELECT cnum, cname, city

FROM Customers

WHERE EXISTS (SELECT *

FROM Customers

WHERE city = ‘London’);

В результате можно получить:

Объединение множества запросов в один Предложение union

Это еще один способ комбинирования данных запросов. С помощью предложения UNIONможно объединить выходные данные нескольких запросов в единое множество строк и столбцов.

Пример: Получить сведения обо всех продавцах (Salespeople) и покупателях (Customers) Лондона как данные одного запроса:

SELECT snum, sname

FROM Sales people

WHERE city = ‘London’

UNION

SELECT cnum, cname

FROM Customers

WHERE city = ‘London’;

Заметим, что ; ставится только в самом конце. Заголовки столбцов в результате отсутствуют, поскольку это объединения столбцовsnumсcnumиsnameсcname.

Очевидно, что реализовать UNIONможно только при соблюдении определенных условий:

  • Столбцы, входящие в состав выходных данных исходных запросов должны быть совместимы по объединению- unioncompatible. Это значит, что в каждом из запросов может быть указано одинаковое число столбцов в порядке: первый, второй, третий и т.д., причемn-й столбец одного запроса должен быть сравним сn-м столбцом другого запроса.

  • Если для n-го столбца одного запроса вUNIONNULL-значения запрещены, то они запрещены и для других запросов вUNION.

  • Об избыточности (замечание).UNIONавтоматически исключает из выходных данных дублирующие строки.

  • Если в UNIONприменяется сортировка-ORDERBY, то приходится указывать не имя столбца, а его номер.

Например: ORDERBY3- по возрастанию.

Ввод, удаление и изменение значений полей.

Эти команды образуют подраздел SQL, называемыйDML(DataManipulationLanguage):

INSERT(вставить),UPDATE(обновить),DELETE(удалить).

Еще их называют updatecommand- команды обновления.

Ввод значений:

INSERTINTO<имя таблицы>

VALUES(<значение 1 поля>, <значение 2 поля>, …)

INSERT INTO Sales people

VALUES (1001, ‘Hoffman’, ‘London’, .12)

Е

Комиссионные

сли бы требовалось ввести данные только в указанные столбцы в таблице, то нужно было бы написать

INSERT INTO Sales people (snum, sname, city, comm)

В остальные- значения по умолчанию (NULLи т.п.)

Вставка результатов запроса

INSERTINTOLondonstaff

SELECT *

FROM Sales people

WHERE city = ‘London’;

Перед выполнением этого Statement’а таблицаLondonstaffдолжна быть создана (с помощью командыCREATETABLE).

Таблица должна соответствовать результатам запроса.

Исключение (удаление) строк из таблицы.

Если написать DELETEFROMSalespeople, то таблица окажется пустой (совсем ее удалить можно командойDROPTABLE).

Обычно нужно удалить лишь некоторые записи с использованием предиката:

DELETE FROM Sales people

WHERE snum = 1003; или

… WHERE city = ‘London’;

Обновление

Пример:

UPDATE Customers имя обновляемого поля

SETrating= 200;

Обычно также включается условие:

Например:

WHEREcity= ‘London’;

SET- это команда, а не предикат.

Обзор команд создания, изменения и удаления таблиц.

Создание CREATETABLE<имя таблицы>

(<имя столбца><тип данных>[(<размер>)],

<имя столбца><тип данных>[(<размер>)], …);

Создание индексаCREATEINDEX<имя индекса>ON<имя таблицы>

(<имя столбца> [,<имя столбца>]…];

Удаление индексаDROPINDEX<имя индекса>

Изменение таблицы ALTERTABLE<имя таблицы>ADD<имя столбца>

(не стандартная, но <тип данных><размер>;

широко применяема)

Исключение таблицы DROPTABLE<имя таблицы>

Расширенный синтаксис:

CREATETABLE<имя таблицы>

(<имя столбца><тип данных><ограничение на столбец>,

<имя столбца><тип данных><ограничение на столбец>…

<ограничение на таблицу>[<имя столбца>

[,<имя столбца>…])…);

Пример ограничений: NOTNULL,

NOT NULL UNIQUE, NOT NULL PRIMARY KEY, CHECK (условие)

Пример ограничения на таблицу:

UNIQUE(snum,odate)

Представления (views).

Это виртуальная таблица получаемая путем запроса. До сих пор мы рассматривали только технику составления запросов. Когда необходимо сослаться на результат запроса в команде нужно представление.

Представления сравнивают с окном, через которое просматриваются данные в реальных (базовых) таблицах. Можно сравнить с кадрированием 1 фотографии.

Пример:

CREATE VIEW Loudonstaff

ASSELECT*

FROM Salespeople

WHERE city = ‘London’;

Затем можно ссылаться как на таблицу

SELECT*

FROMLondonstaff;

Представление обновляется автоматически при изменении базовых таблиц.

Дополнительная лекция по представлениям: