Технологии бд теоретические основы организации бд. Реляционная модель данны



страница11/20
Дата23.04.2016
Размер2.56 Mb.
1   ...   7   8   9   10   11   12   13   14   ...   20

3.4.Средства манипулирования данными

3.4.1.Оператор SELECT


Позволяет производить выборки из таблиц БД и преобразовывать к нужному виду полученные результаты.

3.4.1.1.Общий формат оператора SELECT


SELECT [DISTINCT | ALL ] {* | <значение1> [,<значение2> …]}

FROM <таблица1> [ , <таблица2> … ]

[ WHERE <условия_поиска> ]

[ GROUP BY столбец [, столбец1 … ]

[ HAVING < условия_поиска> ]

[ UNION <оператор_select>]

[ PLAN <план_выполнения_запроса>]

[ ORDER BY <список_столбцов>]
Простейший формат:

SELECT { * | <значение1>, <значение1> [,<значение2> …]}

FROM <таблица1> [ , <таблица2 … ]
Например:

SELECT *

FROM RASHOD

Или так:

SELECT N_RASH, DAT_RASH, KOLVO, TOVAR, POKUP

FROM RASHOD

3.4.1.2.Использование предложения WHERE для задания условия отбора


Предложение WHERE используется для включения в НД лишь нужных записей.

В этом случае имеем следующий формат:


SELECT {* | <значение1> [,<значение2> …]}

FROM <таблица1> [ , <таблица2> … ]

[ WHERE <условия_поиска> ]
Сравнение значения столбца с константой При сравнении столбца с константой условие имеет вид:

<условия поиска > = <оператор> <константа>

Где <оператор> - одна из следующих операций отношения:

<оператор> = { = | < | > | <= | >= | != | !< | !> | <> }

Пример:

SELECT * FROM RASHOD WHERE KOLVO = 20

3.4.1.3.Использование предложения WHERE. Внутреннее соединение таблиц.


При сравнении значения одной таблицы с со значением столбца другой таблицы условие поиска имеет следующий вид:

<условия поиска > = <имя столбца 1> <оператор> <имя столбца 2>

Пример:

Чтобы выбрать все записи о расходе товара из таблицы RASHOD и для каждого товара указать его цену из таблицы TOVARY, можно использовать такой оператор:



SELECT RASHOD.*, TOVARY.ZENA

FROM RASHOD, TOVARY

WHERE RASHOD.TOVAR = TOVARY.TOVAR
Такой способ соединения называется внутренним соединением.

При внутреннем соединении двух таблиц A и B логический порядок формирования результирующего набора данных можно представить следующим образом.



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

  2. Из получившегося НД отбрасываются все записи , не удовлетворяющие условию в предложении WHERE.

Замечание:

Фактический порядок выполнения запроса для конкретного SQL-сервера может быть другим.



Пример:

Таблица A

Ст. P1

Ст. P2

Ст. P3

a

x

400

b

x

200

c

y

500

d








Таблица B

Ст. P1

Ст. P2

x

1

y

2

z

2


SELECT A.P1, A.P2, B.P2

FROM A, B

WHERE A.P2 = B.P1

Промежуточный набор

Ст. A.P1

Ст. A.P2

Ст. B.P1

Ст. B.P2

a

x

x

1

a

x

y

2

a

x

z

2

b

x

x

1

b

x

y

2

b

x

z

2

c

y

x

1

c

y

y

2

c

y

z

2

Окончательный набор

Ст. A.P1

Ст. A.P2

Ст. B.P2

a

x

1

b

x

2

c

у

2

3.4.1.4.Использование псевдонимов таблиц


SELECT …

FROM < таблица1 псевдоним1> [, таблица2 псевдоним 2 … ]

WHERE …

Пример:

SELECT R.*, P.ADRES

FROM RASHOD R, POKUPATELI P

WHERE P.POKUP = R.POKUP

3.4.1.5.Предложение ORDER BY – определение сортировки


Результирующий набор данных можно отсортировать с помощью предложения:

ORDER BY <список_столбцов>

Пример:

SELECT POKUP, DATRASH, TOVAR, KOLVO

FROM RASHOD

WHERE TOVAR = “Кока-кола”

ORDER BY POKUP, DATARASH

3.4.1.6.Устранение повторяющихся значений


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

DISTINCT

Пример:

SELECT DISTINCT TOVAR

FROM RASHOD

Замечание:

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


3.4.1.7.Расчет значений вычисляемых столбцов


Для расчета значений вычисляемых столбцов результирующего НД используются арифметические выражения. При этом в списке возвращаемых столбцов после SELECT вместо имени вычисляемого столбца указывается выражение:

SELECT [DISTINCT | ALL ]

{ * | <значение1> [,<значение2> …], <выражение1>[AS <имя_столбца>] …}

FROM <таблица1> [ , <таблица2> … ]
Пример:

SELECT R.*, T.ZENA, R.KOLVO*T.ZENA AS STOIM

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR

------------------------



AS STOIM – необязательное присвоение имени вычисляемому столбцу

3.4.1.8.Агрегатные функции


Агрегатные функции предназначены для вычисления итоговых значений операций над всеми записями НД. К агрегатным относятся следующие функции:

  • COUNT(<выражение>) – число вхождений выражения в результирующий НД;

  • SUM(<выражение>) – суммирует значение выражения;

  • AVG(<выражение>) – находит среднее значение;

  • MAX(<выражение>) – определяет максимальное значение;

  • MIN(<выражение>)- определяет минимальное значение.

Примеры:

SELECT COUNT(DISTINCT POKUP) AS COUNT_POKUP

FROM RASHOD;

-----------------------

SELECT SUM(R.KOLVO*T.ZENA) AS OBS_ZENA

FROM RASHOD R, TOVARY T

WHERE (R.TOVAR = T.TOVAR)

3.4.1.9.Группировка записей


Иногда требуется получить агрегированные значения не по всему результирующему НД, а по каждой из входящих в него групп записей, характеризующихся одинаковым значением какого-либо столбца. Для этого перед предложением WHERE вводится предложение:

GROUP BY столбец [ , столбец1 … ]

Примеры:

SELECT R.TOVAR, SUM(R.KOLVO*T.ZENA)

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR

GROUP BY R.TOVAR, R.DAT_RASH

---------------------------------------------------

SELECT DAT_RASH, COUNT(DISTINCT POKUP)

FROM RASHOD

GROUP BY DAT_RASH

3.4.1.10.Наложение ограничений на группировку записей


Если нужно в результирующем НД выдавать агрегацию не по всем группам, а только по группам, которые отвечают некоторому условию то после GROUP BY указывается предложение:

HAVING <агрегатная функция> <отношение> <значение>

Агрегатная функция – одна из функций MIN, MAX, AVG, SUM

Отношение – одна из операций отношения.

Значение – константа, результат вычисления выражения или единичное значение, возвращаемое вложенным оператором SELECT.

Пример:

SELECT POKUP, MIN(KOLVO)

FROM RASHOD

GROUP BY POKUP

HAVING MIN (KOLVO) >= 100
Отличие HAVING от WHERE:

  • HAVING – исключает из результирующего НД группы с результатами агрегированных значений;

  • WHERE – исключает из расчета агрегатных значений по группировкам записи, не удовлетворяющие условию;

  • В условии поиска WHERE нельзя указывать агрегатную функцию.



3.4.1.11.Оператор SELECT: задание сложных условий поиска.

Использование логических выражений

Сложные логические выражения строятся при помощи операторов AND, OR и NOT.

Замечание:

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



Пример:

SELECT R.*, T.ZENA

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR AND

(R.KOLVO <= 30 OR R.KOLVO >= 3000) AND

R.POKUP IS NOT NULL

ORDER BY R.KOLVO
Сравнение столбца с результатом вычисления выражения

<выражение> <оператор> <столбец>

или аналогичный способ



<столбец> <оператор> <выражение>

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



Пример:

SELECT R.DAT_RASH, R.TOVAR, T.ZENA

FROM RASHOD R, TOVAR T

WHERE R.TOVAR = T.TOVAR AND T.ZENA > (120 / R.KOLVO)

ORDER BY R.DAT_RASH
Использование BETWEEN

<значение> [ NOT ] BETWEEN <значение1> AND <значение2>

Указать значение, которое должно находиться в интервале между значением1 и значением2.



Пример:

SELECT *

FROM RASHOD

WHERE KOLVO BETWEEN 1000 AND 3000
Использование IN

Если нужно, чтобы значение какого-либо столбца (или результат вычисления некоторого выражения) совпадало с одним из дискретных значений, в условии поиска указывается предложение:

<значение> [ NOT ] IN ( <значение1> [, <значение2> … ] )

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



Пример:

SELECT *

FROM RASHOD

WHERE KOLVO IN (100, 1000, 3000 )

Замечание:

Существует вторая форма использования IN, в которой список возможных значений возвращается вложенным запросом SELECT.


Использование функции UPPER

Функция преобразует все буквы аргумента в заглавные.

UPPER (<значение>)
Обычно эта функция используется в условиях поиска, когда необходимо игнорировать возможную разницу в высоте букв. Может использоваться как в списке столбцов результирующего НД, так и в условии поиска в предложении WHERE.

Пример:

SELECT *

FROM POKUPATELI

WHERE UPPER(GOROD) = ‘МОСКВА’
Использование LIKE

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

<значение> [NOT] LIKE <шаблон> [ESCAPE <подшаблон>]

В шаблоне используются специальные символы - «%» и «_».

Символ «%» означает, что на его месте может быть строка любой длины.

Символ «_» используется для указания любого одиночного символа.

ESCAPE определяет символ, появление которого в шаблоне отменяет специальные функции следующего за ним символа.

Примеры:

LIKE “%USD”

LIKE “__94”

WHERE STOLBEZ LIKE “_!%” ESCAPE “!”

Использование функции CAST

Для того, чтобы трактовать значение одного типа как значение другого типа применяется функция CAST:

CAST (<значение> AS <тип_данных>)

Множество типов данных, в которые может быть преобразовано значение:



Пример:

SELECT *

FROM RASHOD

WHERE CAST(KOLVO AS CHAR(4)) LIKE “%09”

3.4.1.12.Вложение подзапросов


Часто невозможно решить поставленную задачу путем использования единственного запроса. Например, в тех случаях, когда при использовании условия поиска в предложении WHERE параметр <значение, с которым сравнивать> заранее не определен и должен вычисляться в момент выполнения оператора SELECT.

В этом случае оператор SELECT с подзапросом имеет следующий вид:



SELECT …

FROM …

WHERE <сравниваемое_значение> <оператор> (SELECT …)

Пример:

SELECT KOLVO, DAT_RASH

FROM RASHOD

WHERE KOLVO = (SELECT MAX(KOLVO) FROM RASHOD)

Замечание.

Ошибкой для данного вида запроса является использование вложенного оператора SELECT, возвращающего вместо единичного список значений.



Пример1 (ошибочный):

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, R.POKUP

FROM RASHOD R

WHERE R.POKUP = (SELECT POK.POKUP

FROM POKUPATELI POK

WHERE UPPER(POK.GOROD) = ‘МОСКВА’)
Пример 2 (исправленный):

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, R.POKUP

FROM RASHOD R

WHERE R.POKUP IN (SELECT POK.POKUP

FROM POKUPATELI POK

WHERE UPPER(POK.GOROD) = ‘МОСКВА’)

Пример 3

SELECT RRR.*

FROM RASHOD RRR

WHERE R.POKUP IN

(SELECT R.POKUP

FROM RASHOD R

WHERE KOLVO =

(SELECT MAX(RSH.KOLVO)

FROM RASHOD RSH) )
Логический порядок выполнения запроса:

  • Определяется самая крупная покупка – отыскивается максимальное значение в столбце KOLVO («самый вложенный» запрос).

  • Определяется покупатель, осуществивший эту покупку (средний запрос)

  • Основной запрос выбирает записи с заданным покупателем.
Предложение EXISTS.

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

EXISTS (<подзапрос>)

Пример.

Составить список покупателей, которые хотя бы один раз получали товар со склада:



SELECT P.POKUP

FROM POKUPATELI P

WHERE EXISTS (SELECT R.POKUP

FROM RASHOD R

WHERE R.POKUP = P.POKUP )
Предложение SINGULAR.

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

SINGULAR (<подзапрос>)

Пример.

Составить список покупателей, купивших только один товар:



SELECT P.*

FROM POKUPATELI P

WHERE SINGULAR (SELECT *

FROM RASHOD R

WHERE R.POKUP = P.POKUP )

Использование ALL, SOME (ANY).

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

<сравниваемое_значение> [NOT] <оператор> {ALL | SOME | ANY } (<подзапрос>)

ALL указывает, что условие поиска будет истинно только тогда, когда сравниваемое значение находится в нужном отношении со ВСЕМИ значениями, возвращаемыми подзапросом.



WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)

SOME (или ANY) условие истинно, когда сравниваемое значение находится в нужном отношении ХОТЯ БЫ С ОДНИМ значением, возвращаемым подхвпросом.



WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)

Пример.

Определим все факты отгрузки товара со склада, в которых количество единиц отгружаемого товара превышает среднее значение.



SELECT * FROM RASHOD R1

WHERE R1.KOLVO > ALL

(SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

Определим все факты отгрузки товара со склада, в которых количество единиц отгружаемого товара превышает среднее значение отгрузки хотя бы одного товара.



SELECT * FROM RASHOD R1

WHERE R1.KOLVO > SOME

(SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

Использование HAVING и агрегатных функций для вложенных подзапросов

Если в условиях поиска для вложенного запроса нужно указать агрегатную функцию, используется предложение HAVING.

Пример.

Определим покупателя, у которого средняя покупка больше средней покупки других покупателей.



SELECT R1.POKUP, AVG(R1.KOLVO) FROM RASHOD R1

GROUP BY R1.POKUP

HAVING AVG(R1.KOLVO) >= ALL

(SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

3.4.1.13.Внешние соединения


Внешнее соединение таблиц определяется в предложении FROM согласно следующей спецификации:

SELECT { * | <значение1> [, <значение2> …]}

FROM <таблица1> <вид_соединения> JOIN <таблица2> ON <условие_поиска>

Внешнее соединение отличается от внутреннего тем, что в результирующий НД включаются также записи ведущей таблицы соединения, которые объединяются с пустым множеством записей другой таблицы. Какая из таблиц будет ведущей, определяет вид соединения:



LEFT – (левое внешнее соединение), когда ведущей являются таблица1 (расположена СЛЕВА от вида соединения).

RIGHT – (правое внешнее соединение), когда ведущей являются таблица2 (расположена СПРАВА от вида соединения).

FULL – (полное внешнее соединение), когда ведущими являются и таблица1, и таблица2.

Таблица A

Ст. P1

Ст.P2

Ст.P3

a

X

400

b

X

200

c

Y

500

d







Таблица B

Ст. P1

Ст.P2

x

1

y

2

z

3


SELECT A.P1, A.P2, B.P2

FROM A

LEFT JOIN B ON A.P2 = B.P1
Результирующий НД

Ст. A. P1

Ст. A.P2

Ст. B.P2

A

x

1

B

x

1

C

y

2

D








SELECT A.P1, A.P2, B.P2

FROM A

RIGHT JOIN B ON A.P2 = B.P1


Результирующий НД

Ст. A. P1

Ст. A.P2

Ст. B.P2

a

x

1

b

x

1

c

y

2







3


SELECT A.P1, A.P2, B.P2

FROM A

FULL JOIN B ON A.P2 = B.P1
Результирующий НД

Ст. A. P1

Ст. A.P2

Ст. B.P2

Ст. B.P2

A

x

x

1

B

x

x

1

C

y

y

2

D
















z

3


Пример 1. Несколько последовательных внешних соединений

SELECT R.DAT_RASH, R.TOVAR, T.ED_IZM, R.KOLVO, P.ADRES

FROM RASHOD R

LEFT JOIN POKUPATELI P ON R.POKUP = P.POKUP

LEFT JOIN TOVARY T ON R.TOVAR = T.TOVAR

Пример 2. Комбинирование внешних и внутренних соединений

SELECT P.POKUP, R.DAT_RASH, R.TOVAR, T.ED_IZM, R.KOLVO

FROM POKUPATELI P

P LEFT JOIN RASHOD R ON R.POKUP = P.POKUP

INNER JOIN TOVARY T ON R.TOVAR = T.TOVAR

3.4.1.14.Объединение запросов – UNION


Иногда бывает полезным объединить два или более результирующих наборов данных. Результирующие наборы должны иметь одинаковую структуру (состав столбцов). Если в результирующих наборах имеется одна и та же запись, в сводном наборе она не дублируется.

SELECT R.*

FROM RASHOD R

WHERE R.TOVAR CONTAINING ‘Сахар’

UNION

SELECT R.*

FROM RASHOD R

WHERE R.KOLVO >= 100

3.4.1.15.Использование IS NULL


Если требуется выдать записи, в которых некоторый столбец (или результат вычисления выражений) имеет значение NULL, то в условии достаточно указать предложение:

<значение> IS [NOT] NULL

Пример.

Показать все факты отгрузки товаров со склада, для которых не указан покупатель.



SELECT * FROM RASHOD

WHERE POKUP IS NULL

3.4.1.16.Использование операции сцепления строк


Операция || соединяет два строковых значения , которые могут быть представлены выражениями:

<строковое_выражение1> || <строковое_выражение2>

Операцию можно использовать как после слова SELECT, так и в предложении WHERE



Пример.

Показать в одном столбце имена покупателей и названия их городов:



SELECT POKUP || ‘ (‘ || GOROD || ‘)’

FROM POKUPATELI


COLUMN1

ООО «Альфа» (Москва)

ЗАО «Продторг» (Самара)

…..

…..



3.4.2.Оператор INSERT


Формат оператора добавления записей

INSERT INTO <Объект> [ (столбец1 [ , столбец2 …]) ]

{VALUES ( <значение1> [,<значение2> …]) | <оператор SELECT>}

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

Поставить в соответствие столбцам списки значений можно двумя способами


  • Явное указание значений после слова VALUES

  • Формирование значений при помощи оператора SELECT.

3.4.2.1.Явное указание списка значений


INSERT INTO <Объект> [ (столбец1 [ , столбец2 …]) ]

VALUES ( <значение1> [,<значение2> …])

Пример.

INSERT INTO RASHOD (N_RASH, DAT_RASH, KOLVO, TOVAR)

VALUES (45 ,”20.01.2005”, 100, “Сахар”, “Саяны”)

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



INSERT INTO RASHOD

VALUES (45 ,”20.01.2005”, 100, “Сахар”, “Саяны”)

3.4.2.2.Формирование значений при помощи оператора SELECT


INSERT INTO <Объект> [ (столбец1 [ , столбец2 …]) ] <оператор SELECT>

При этом значениями, которые присваиваются столбцам, являются значения, возвращаемые оператором SELECT. Порядок их назначения столбцам аналогичен предыдущей форме оператора INSERTЖ значение первого по порядку столбца результирующего набора данных оператора SELECT присваивается первому столбцу оператора INSERT, второй – второму и т.д. Следует обратить внимание на важную особенность: поскольку оператор SELECT в общем случае возвращает множество записей, то и оператор INSERT в данной форме приведет к добавлению в объект аналогичного количества новых записей.



Пример.

Пусть в БД определена таблица RASHOD_DATA, по составу и порядку следования полей аналогичная таблице RASHOD. Тогда ежедневная выгрузка записей из таблицы RASHOD в таблицу RASHOD_DATA за заданную дату может быть реализована следующим оператором:



INSERT INTO RASHOD_DATA

SELECT *

FROM RASHOD

WHERE DAT _RASH = “20.02.2006”

3.4.3.Оператор UPDATE


Формат оператора изменения записей

UPDATE <Объект>

SET столбец1 = <значение1> [ , столбец2 = <значение 2> …]

[WHERE <условие_поиска> ]

Пример.

UPDATE RASHOD

SET DAT_RASH = “24.01.2005”, KOLVO=KOLVO+2

WHERE DAT_RASH = “20.01.2005”

Замечание.

Если опустить условие WHERE то в таблице будут изменены все записи!!!


3.4.4.Оператор DELETE


Формат оператора удаления записей

DELETE FROM <Объект>

[WHERE <условие_поиска> ]

Пример.

DELETE FROM RASHOD

WHERE (DAT_RASH = “20.01.2005”) AND (TOVAR = “Сахар”)

Замечание.

Если опустить условие WHERE то в таблице будут удалены все записи!!!


3.4.5.Работа с просмотрами (VIEW)

3.4.5.1.Понятие просмотра как виртуальной таблицы


Формирование записей в просмотре определяется оператором SELECT. Для создания просмотра применяется оператор CREATE VIEW:

CREATE VIEW ИмяПросмотра [ (столбец_view [, столбец_view1 … ] ) ]

AS < оператор_select > [WITH CHECK OPTION]

Необязательный параметр WITH CHECK OPTION определяет, допускать ли для обновляемых просмотров ввод записей, не удовлетворяющих условию формирования просмотра.



Пример:

CREATE VIEW FULL_RASHOD AS

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, T.ZENA

WHERE R.TOVAR = T.TOVAR

После этого к нему можно обращаться как к обычной таблице БД:



SELECT * FULL_RASHOD

3.4.5.2.Способы формирования просмотра


Просмотр может создаваться как:

1) вертикальный срез таблицы, когда в просмотр включается подмножество столбцов таблицы, например:



CREATE VIEW RASH_VERT AS

SELECT DAT_RASH, TOVAR, KOLVO FROM RASHOD

2) горизонтальный срез таблицы, когда в просмотр включаются все столбце, но не все записи, например:



CREATE VIEW RASH_GORIZ AS

SELECT * FROM RASHOD WHERE TOVAR = “Сахар”

3) вертикально-горизонтальный срез таблицы:



CREATE VIEW RASH_VERT_GORIZ AS

SELECT DAT_RASH, TOVAR, KOLVO FROM RASHOD WHERE TOVAR = “Сахар”

4) подмножество строк и столбцов соединения разных таблиц:



CREATE VIEW FULL_RASHOD AS

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, T.ZENA

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR

3.4.5.3.Обновляемые и необновляемые просмотры


Чтобы просмотру можно было применять операторы UPDATE, DELETE необходимо одновременное выполнение двух условий:

  1. Просмотр должен формироваться из записей только одной таблицы;

  2. Оператор SELECT просмотра не должен использовать агрегатных функций, режима DISTINCT, предложения HAVING, соединения таблиц, хранимых процедур и функций, определённых пользователем.

Чтобы в просмотр можно было добавлять записи оператором INSERT необходимо одновременное выполнение трёх условий:

  1. В просмотр должен быть включен каждый столбец таблицы, имеющий атрибут NOT NULL ;

  2. Просмотр должен формироваться из записей только одной таблицы;

  3. Оператор SELECT просмотра не должен использовать агрегатных функций, режима DISTINCT, предложения HAVING, соединения таблиц, хранимых процедур и функций, определённых пользователем.

3.4.5.4.Дополнительные параметры просмотра


1) Указание имен столбцов просмотра. Имена столбцов просмотра должны указываться, когда в качестве столбца определяется выражение.

Пример.

CREATE VIEW STOIM_RASH (DAT_RASH, TOVAR, STOIM) AS

SELECT R.DAT, R.TOVAR, R.KOLVO*T.ZENA

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR

2) Использование CHECK OPTION. Если указан CHECK OPTION, то будут отвергаться все попытки добавления новых или изменения существующих записей таким образом, чтобы нарушалось условие WHERE оператора SELECТ.



Пример.

Нельзя добавить записи со значением поля KOLVO, меньшим 1000



CREATE VIEW RASH_1000_CHECK AS

SELECT * FROM RASHOD

WHERE KOLVO > 1000

WITH CHECK OPTRION

1   ...   7   8   9   10   11   12   13   14   ...   20


База данных защищена авторским правом ©bezogr.ru 2016
обратиться к администрации

    Главная страница