Пример 3. Рассмотрим следующие таблицы: tblab COLA colb TBLXY COLX coly

Пример 2.

Пример 1.

Примеры

Рассмотрим следующие таблицы:

TBLAB COLA COLB   TBLXY COLX COLY
             
             
             
             
  - -        

Рассмотрим предикат COLA = ANY (SELECT COLX FROM TBLXY)

Запрос, записанный в предикате, возвращает в качестве результата значения 2 и 3.

Предикат возвращает следующие результаты:

• «истина» для второй и третьей строк таблицы TABLAB, в которых значение колонки COLA совпадает, по крайней мере, с одним значением из запроса;

• «ложь» для первой и четвертой строк таблицы, в которых значение колонки COLA не совпадает ни с одним значением из запроса;

• «не определено» для последней строки таблицы TABLAB, поскольку в ней присутствует NULL значение (-) колонки COLA.

Рассмотрим предикат COLA > ALL (SELET COLX FROM TBLXY)

Запрос, использованный в предикате, возвращает в качестве результата значения 2 и 3.

Предикат возвращает следующие результаты:

• «истина» для четвертой строки таблицы TABLAB, в которой значение колонки COLA превышает все значения из запроса;

• «ложь» для первой, второй и третьей строк таблицы, в которых значения колонки COLA меньше или равно, по крайней мере, одному значению из запроса;

• «не определено» для последней строки таблицы TABLAB, поскольку в ней присутствует NULL значение (-) колонки COLA.

Рассмотрим предикат COLA > ALL (SELECT COLX FROM TBLXY WHERE COLX < 0)

Запрос, использованный в предикате, ничего не возвращает, поэтому предикат вернет в качестве результата значение «истина» для всех строк таблицы TABLAB.

Предикат EXISTS

Предикат EXISTS имеет следующий вид:

EXISTS (запрос)

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

Запрос может вернуть любое количество любых строк, и

• результат предиката – истина, если запрос вернет, по крайней мере, одну строку;

• результат предиката – ложь, если запрос не возвращает ни одной строки;

• результат предиката не может быть не определен.

Предикат IN

Помимо рассмотренных ранее форм предиката IN, существуют еще две:

выражение1 [ NOT ] IN (запрос1)

(выражение2, …) [ NOT ] IN (запрос2)

Запрос, записанный в предикате, должен возвращать столько колонок в результате, сколько выражений указано слева от ключевого слова IN. Так, запрос1 должен возвращать одну колонку, а запрос2 – несколько.

Выражение1 и колонка в запросе1 должны быть сопоставимыми. Каждое выражение2 и соответствующая ему колонка в запросе2 должны быть сопоставимыми.

Предикат IN эквивалентен предикатам с кванторами. Эквивалентность предикатов представлена в таблице 4.12.

Таблица 4.12. Эквивалентность предикатов

Предикат IN Эквивалентный предикат с квантором
выражение IN (запрос) выражение = ANY(запрос)
выражение NOT IN (запрос) выражение <> ALL(запрос)
(выражение 1, выражение 2, …) IN (запрос) (выражение 1, выражение 2, …) = ANY(запрос)

Предикат NULL

Предикат NULL имеет следующий вид:

выражение IS [ NOT ] NULL

Предикат проверяет наличие неопределенного значения.

Следует отметить, что предикат IS NULL не может быть заменен основным предикатом выражение = NULL. Если в операции сравнения хотя бы один операнд имеет значение NULL, результат операции – не определен, независимо от значения второго операнда. Поэтому приведенный здесь основной предикат вернет результат «не определено» независимо от результата вычисления выражения, тогда как предикат IS NULL возвращает результат – «истина» или «ложь».

Результат предиката NULL не может быть неопределенным. Если значение выражения – NULL, результат – истина; если значение – не NULL, результат – ложь.

Предложения языка манипулирования данными

ПредложениеINSERT

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

В общем случае предложение INSERT имеет следующий вид:

INSERT INTO имя_таблицы [(имя_колонки, …)] VALUES (значение, …), (…), …

имя_таблицы – должно указывать существующую таблицу базы данных, в которую вставляются новые значения (строки).

(имя_колонки, …) – указывает имена колонок, для которых в данном предложении представляются значения. Каждое имя называет имя колонки в данной таблице; одно и то же имя колонки не должно указываться дважды. Если список имен колонок опущен, предполагается, что перечислены все имена колонок данной таблицы в том порядке, в каком эти колонки располагаются в таблице (порядок расположения колонок в таблице определяется порядком их перечисления в предложении CREATE TABLE). Если в списке имен колонок указаны не все колонки таблицы, для тех колонок, которые не указаны, при создании таблицы должны быть определены либо атрибут NULL, либо атрибут генерируемого значения (WITH DEFAULT или GENERATED …).

(значение, …), (…), … – определяет вставляемые значения, т.е. значения одной или нескольких новых строк, вставляемых в таблицу. Значения, соответствующие одной строке таблицы, указываются внутри парных круглых скобок. Если необходимо вставить несколько строк, группа значений для каждой строки заключается в парные круглые скобки, и группы перечисляются через запятую.

Количество значений, указанных в каждой строке, должно соответствовать явному или неявному списку имен колонок. Первое значение вставляется в первую колонку списка, второе – во вторую, и т.д. Тип вставляемых значений должен соответствовать типу соответствующих им колонок.

Каждое значение, указанное в списке, должно быть представлено некоторым выражением или ключевыми словами NULL или DEFAULT.

В качестве выражения может быть использована любая конструкция, описанная в разделе «Выражения».

NULL – определяетпустое значение; слово может быть указано только для колонки, для которой разрешены неопределенные значения.

DEFAULT – указывает, что должно быть использовано значение по умолчанию. Результат зависит от того, как была определена колонка при создании таблицы:

• если колонка была определена как генерируемая на основе выражения, значение колонки генерируется системой на основе заданного выражения;

• если для колонки была использована спецификация IDENTITY, значение генерируется менеджером базы данных;

• если для колонки была использована спецификация WITH DEFAULT, вставляется то значение, которое было определено для колонки в предложении CREATE TABLE.

Если в таблице какая-либо колонка определена с атрибутом GENERATED ALWAYS, при вставке данных в такую таблицу либо явно задается список имен колонок, не содержащий указанную колонку, либо для этой колонки в качестве значения по умолчанию должно быть указано слово DEFAULT. Если GENERATED ALWAYS колонка указана в списке колонок предложения INSERT со значением не DEFAULT в конструкции VALUES, возникает ошибка.

Например, пусть таблица TABID была создана следующим образом:

CREATE TABLE TABID (

ID_T INT NOT NULL GENERATED ALWAYS AS IDENTITY

)

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

INSERT INTO TABID

VALUES (DEFAULT)

Если в таблицу нужно вставить несколько строк, предложение INSERT будет иметь следующий вид:

INSERT INTO TABID

VALUES (DEFAULT), (DEFAULT), (DEFAULT), (DEFAULT)

Когда генерируется очередное значение для колонки с атрибутом identity, такое сгенерированное значение считается использованным; в следующий раз, когда потребуется значение, будет сгенерировано новое значение. Это выполняется даже в тех случаях, когда предложение INSERT, включающее колонку identity, завершается с ошибкой или откатывается.

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

INSERT INTO имя_таблицы [(имя_колонки, …)] запрос

В этом случае совокупность новых строк, которые должны быть вставлены, определяется в виде результата выполнения запроса. Может быть вставлена одна строка, много строк или ни одной строки. Количество колонок в результате выполнения запроса должно совпадать с количеством колонок, указанным (явно или неявно) в списке. Значение первой колонки результата вставляется в первую колонку списка, второй колонки результата – во вторую колонку списка, и т.д.

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: