Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

SQL сегодня

объем памяти. Объекты фиксированной длины можно использовать, например, для ра­ боты с цифровыми образами. Если все образы имеют одинаковый размер и разрешаю­ щую способность (что весьма вероятно), и никакого сжатия образов не применяется (что возможно), все они будут одного размера.

Преобразования типов данных. SQL является строго типизированным языком. Все типы данных представлены в СУБД в двоичном виде, но операции не могут сво­ бодно их смешивать и использовать как двоичные или числовые, что допустимо в

ряде языков программирования. Такой подход имеет свои достоинства и недостатки.

Иногда полезно преобразовывать данные одного типа в данные другого типа, но мо­ гут возникнуть проблемы, если этот процесс неуправляем. Стандарт 92 разрешает выполнять преобразования типов данных с помощью выражения CAST, что дает воз­

можность использовать инструкции СУБД для преобразования типа integer в тип

символьной строки (character string) или символьной строки в двоичные данные. Это актуально для соединений и объединений, где все столбцы должны иметь одинако­ вые типы данных. (Можно также выполнять преобразования наборов символов или представлений наборов символов, используя TRANSLATE или CONVERT, соответ­ ственно.)

Новые встроенные системные значения. SQL представляет системные значе­ ния в форме встроенных строковых переме~ных, значения которых автоматически устанавливаются системой и отражают применяемый идентификатор пользователя для идентификации конкретного пользователя и его привилегий, определенных на данный момент. Определены три типа: SESSION_USER, CURRENT_USER,

SYSTEM USER.

CURRENT_USER, известный как USER, ссылается на идентификатор пользовате­ ля, который применяется для определения действий, выполняемых в настоящий мо­ мент. Это может быть идентификатор либо непосредственно пользователя, либо модуля. Последнее происходит тогда, когда выполняется модуль, имеющий собствен­ ный идентификатор пользователя (см. "Привилегии приложения" в этом разделе). В противном случае CURRENT_USER определяет пользователя. При любых обстоя­ тельствах идентификатор пользователя связан с пользователем, который определен в переменной SESSION_USER. (Хотя SESSION_USER устанавливается автоматически, реальные SQL-системы позволяют изменять это значение с помощью предложения

SET SESSION AUTORIZATION).

SYSTEM_USER - конкретный пользователь, определенный операционной

системой. Наиболее часто это значение совпадает со значением SESSION_USER, однако соответствия между пользователями операционной системы и идентифика­ торам определяются конкретной реализацией - в двух различных СУБД они мо­ гут быть разными. Для уточнения деталей следует ознакомиться с системной

документацией.

Новые операции над строками. Стандарт SQL 92 учитывает операцию конка­ тенации и некоторые функции для работы с текстовыми строками. Во-первых, это операции, которые выполняют действия над строками и в результате формируют

371

Приложение F. SQL сегодня

строки: оператор конкатенации (CONCA TENA ТЕ) (записывается как 11 ),

SUBSTRING, UPPER, LOWER, TRIM, TRANSLATE, CONVERT. Во-вторых, это

операции, которые выполняют действия над строками, но в результате выдают чи­

словые значения: POSIТION, CHAR_LENGTH, OCTET_LENGTH, BIТ_LENGTH.

В первой группе только операция CONCATENATE является двуХJ11естиой (diadic), т.е. в каждой такой операции участвуют две строки. Она добавляет содержимое вто­

рой строки в конец первой. Например, в результате выполнения операции 'Jello ' 11

'Biafra' получаем 'Jello Biafra'. SUBSTRING выбирает из строки то количество симво­

лов, которое необходимо извлечь, начиная с заданной позиции в этой строке, и созда­

ет, в результате, новую строку. Например, SUBSTRING ('Astarte' FROM 2 FOR 4) дает

значение 'star'. UPPER и LOWER переводят все символы строки соответственно в

большое (заглавными буквами) и малое (строчными буквами) написание; каждая из этих операций называется подгонкой (fold). TRIM используется для того, чтобы ис­ ключить передние или хвостовые пробелы из строки. Можно задать режим удаления передних пробелов, хвостовых пробе.1ов, либо и тех, и других.

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

POSIТION находит начальное положение одной строки внутри другой, например, результат выполнения POSIТION ('star' IN 'Astarte') дает значение 2. Если вхождения не обнаружено, то результат выполнения операции О. Оставшиеся три функции сооб­ щают длину строки, во множестве символов, октетов (8-битовая последовательность, обычно называется байтом) или битов. В обычных в~риантах кодирования ASCII и EBCDIC количество символов совпадает с количеством октетов, но так как SQL пред­ назначен для использования различных наборов символов, может потребоваться более (и.1и менее) одного октета на символ.

Конструкторы значений строк. Предикаты в SQL сравнивают значения в тер­ минах операторов "=" или в терминах собственных операторов SQL и возвращают значение "истина", "ложь" либо (в случае присутствия NULL-значений) "неизвестно", в зависимости от результатов сравнения. Раньше SQL-предикаты могли сравнивать одно значение с другим, а иногда и одно значение - со значениями из столбца, полу­ ченного в результате выполнения подзапроса (запрос может получать значения для использования их в другом запросе). Согласно же новому стандарту, SQL имеет дело с множествами значений, соответствующих строкам. Например, раньше можно было

записать предикат:

WHERE с1 = З

или

WHERE с1 = З AND с2 = 5

Согласно SQL 92, последнее выражение можно записать таким образом:

372

SQL сегодня

WHERE (с1,с2) = {3,5)

Это принципиально новая возможность, поскольку заключенные в круглые скобки списки значений, называющиеся конструкторами значений строк (row vа/ие constrиctions), могут включать в себя подзапросы. Появился эффективный способ сравнения целых таблиц (т.е. любой комбинации строк и столбцов). Если вместо ра­

венства используется неравенство, выражение является отсортированным, причем

первое значение имеет наивысший приоритет, а все последующие выстроены в поряд­ ке его уменьшения. Например:

(1, 7, 8) < (2, О, 1)

имеет значение "истина", поскольь.')' l < 2 (сравнение начинается с элементов с выс­

шим приоритетом, после нахождения пары с неравными значениями оставшиеся эле­

менты игнорируются).

Уточнение ссылочной целостности. В SQL 89 внешние ключи состоят из одного или более столбцов таблицы (таблица А), которые ссылаются на один или более столбцов другой таблицы (таблица В). Отсюда следует, что любой строке таблицы А, не имеющей NULL-значений среди значений внешнего ключа, должна соответство­

вать строка таблицы В с теми же значениями в столбцах, на которые осуществляется

ссылка. Они являются родительским ключом (parent key). Родительский ключ табли­

цы В должен иметь ограничение UNIQUE либо ограничение PRIMARY КЕУ, что га­

рантирует наличие уникальных значений.

В SQL 92 все гораздо сложнее. Во-первых, совпадение внешнего ключа с роди­ тельским может быть либо частичным, либо полным. Различия проявляются при ис­ пользовании составного ключа (определенного на множестве столбцов), который может содержать NULL-значения. Частичное совпадение предполагает совпадение значений, отличных от NULL-значений во внешнем ключе; по.1ное совпадение пред­ полагает совпадение всех значений. В ограничении внешнего ключа указывается тип

применяемого совпадения.

Новый стандарт предусматривает действия, переключае.мые 110 ссылке (referential trigged actions), которые в некоторых существующих программных продуктов называ­

ются эффектами обновления и удаления. Они определяют, что произойдет при измене­

нии значения родительского ключа, на который ссылается одно (или более) значение внешнего ключа. Можно определить этот эффект независимо для ON UPDATE и для ON DELETE. В каждом случае имеется четыре возможности:

• SET NULL. Устанавливает в NULL все значения внешнего ключа, который ссы­ лается на удаленный или обновленный родительский ключ.

• SET DEFAULT. Устанавливает все столбцы по ссылке внешнего ключа в значе­

ние, определенное как значение по умолчанию в соответствующем предложе­

нии. Если значение по умолчанию явно не определено, используется NULL-

значение.

• CASCADE. Означает автоматическое изменение значения внешнего ключа при

изменении значения родительского.

373

Команда SELECT

SELECT

* 1 { [DISTINCT

1 ALL] <список полей>., ..

 

FROM {<имя таблицы>

[<алиас>] }., ..

 

 

[

WHERE <предикат> ]

 

 

 

 

[

GROUP ВУ { <имя

столбца>

1

<целое>

}. , ..

]

[

HAVING <предикат> ]

 

 

 

 

 

ORDER ВУ { <имя

столбца>

1

<целое>

}. , ..

]

{ UNION [ALL]

 

 

 

 

 

SELECT *

1 { [DISТINCT

ALL] <список полей>., ..

 

FROM {<имя таблицы> [<алиас>] }., ..

 

 

 

WHERE <предикат> ]

 

 

 

 

 

GROUP ВУ { <имя

столбца>

 

<целое>}., ..

]

 

HAVING <предикат> ]

 

 

 

 

 

ORDER ВУ {<имя

столбца>

1

<целое>}., ..

]

} ]".;

Элементы, используемые в команде SELECT

 

 

 

Элемент

Определение

<список полей>

Выражение, производящее значение. Оно может включать имена столб-

 

ЦОВ ИЛИ СОСТОЯТЬ ИЗ НИХ.

<11.11я таблицы>

Имя или синоним для таблицы или представления.

<алиас>

Временный синоним имени таблицы, определенный здесь и используе-

 

мый только в этой команде.

<предикат>

Условие, которое может быть истинным или ложным для каждого

 

столбца или комбинации столбцов из таблицы (таблиц), определенных

 

предложением FROM.

<имя столбца>

Имя столбца таблицы.

<целое>

Число без десятичной точки. В этом случае оно определяет значение

 

из списка выбираемых полей в предложении SELECT, указывая ero

 

 

 

1 расположение в этом предложении.

Команды обновления

UPDATE

 

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

столбца> = <список полей>

 

 

 

SЕТ {

1

} • , •• <имя

 

 

[

WHERE <предикат>

 

 

 

 

1

WHERE

CURRENT OF

<имя курсора>

 

 

 

 

 

(•

 

только вложенный •)];

 

 

 

INSERT

 

 

 

 

 

 

 

 

 

 

INSERT

INTO <имя

таблицы> [(<имя столбца>., .. )]

 

 

 

{ VALUES (<список

полей>)., .. )}

 

 

 

1 <запрос>;

 

 

 

 

 

 

 

 

 

DELETE

 

 

 

 

 

 

 

 

 

 

DELETE FROM <имя таблицы>

 

 

 

[ WHERE <предикат>

 

 

 

 

 

1 WHERE CURRENT OF <имя курсора>

 

 

 

(•

только вложенный •)];

 

 

 

Элементы, используемые в командах обновления

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЭJ1емент

 

 

 

Опnепе.1е1ше

 

 

 

<и.мя .:урсора>

 

 

Имя курсора, используемого в этой программе.

 

 

 

<зштос>

 

 

 

Попvстимая команла SELECT.

 

 

 

 

 

 

 

 

 

Остальны~ элементы определены в команде SELECT.

 

 

 

Символы, используемые при описании синтаксиса

 

 

 

 

 

 

 

 

 

 

Элемент

 

Опnелеление

 

 

 

 

 

1

 

Все то,

что предшествует данному символу, можоно заменить тем, что

 

 

 

 

 

 

 

 

 

 

 

 

 

 

следует за ним. Этот символ используется там, где мы хотим

сказать нили''.

 

 

{ }

 

Все то, что включено в фигурные скобки, рассматривается как единое целое

 

 

 

 

для применения символа 1 , . , .. или других.

 

 

 

[]

 

Все то, что заключено в квадратные скобки, является необязательным.

 

 

 

 

Все то,

что предшествует этим символам, может повторяться

произвольное

 

 

 

 

число раз.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Все то, что предшествует этим символам, может повторяться произвольное

 

 

....

 

 

 

 

 

число nаз· каждое отдельное вхождение отделяется запятой.

 

 

 

 

 

 

 

 

 

 

 

 

 

Источник: https://studfile.net/preview/16418473/