Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

07-08 Лекции - Язык SQL

.pdf
Скачиваний:
118
Добавлен:
13.04.2015
Размер:
870.61 Кб
Скачать

7. Язык SQL. Формирование запросов к базе данных

Оглавление

 

 

7. Язык SQL. Формирование запросов к базе данных .............................................

1

7.1. История развития SQL ............................................................................

1

7.2. Структура SQL.............................................................................................

3

7.3. Типы данных ...............................................................................................

5

7.4. Оператор выбора SELECT ......................................................................

8

7.5. Применение агрегатных функций и вложенных запросов 14

7.6. Вложенные запросы..............................................................................

19

7.7. Внешние объединения .........................................................................

21

7.8. Операторы манипулирования данными ......................................

26

7.1. История развития SQL

 

SQL (Structured Query Language) — Структурированный Язык Запросов

стандартный язык запросов по работе с реляционными БД. Язык SQL по-

явился после реляционной алгебры, и его прототип был разработан в конце 70-

х годов в компании IBM Research. Он был реализован в первом прототипе ре-

ляционной СУБД фирмы IBM System R. В дальнейшем этот язык применялся

во многих коммерческих СУБД и в силу своего широкого распространения по-

степенно стал стандартом "де-факто" для языков манипулирования данными в

реляционных СУБД.

 

 

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

лее мы будем называть его SQL/89 или SQL1). Иногда стандарт SQL1 также

называют стандартом ANSI/ISO, и подавляющее большинство доступных на

рынке СУБД поддерживают этот стандарт полностью. Однако развитие ин-

формационных технологий, связанных с базами данных, и необходимость ре-

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

и расширения первого стандарта SQL.

 

В конце 1992 г.

был принят новый международный

стан-

дарт языка SQL, который в дальнейшим будем называть SQL/92 или SQL2. И

он не лишен недостатков, но в то же время является существенно более точ-

ным и полным, чем SQL/89. В настоящий момент большинство производите-

лей СУБД внесли изменения в свои продукты так, чтобы они в большей сте-

пени удовлетворяли стандарту SQL2.

 

В 1999 году появился новый стандарт, названный SQL3. Если отличия

между стандартами SQL1 и SQL2 во многом были количественными, то стан-

дарт SQL3 соответствует

качественным серьезным преобразованиям.

В SQL3 введены новые типы данных, при этом предполагается возможность

задания сложных структурированных типов данных, которые в большей сте-

пени соответствуют объектной ориентации. Наконец, добавлен раздел, кото-

рый вводит стандарты на события и триггеры, которые ранее не затрагивались

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

дом выполнения программы. В рамках управления транзакциями произошел возврат к старой модели транзакций, допускающей точки сохранения (savepoints), и возможность указания в операторе отката ROLLBACK точек возврата позволит откатывать транзакцию не в начало, а в промежуточную ранее сохраненную точку. Такое решение повышает гибкость реализации сложных алгоритмов обработки информации.

А зачем вообще нужны эти стандарты? Зачем их изобретают и почему надо изучать их? Текст стандарта SQL2 занимает 600 станиц сухого формального текста, это очень много, и кажется, что это просто происки разработчиков стандартов, а не то, что необходимо рядовым разработчикам. Однако ни один серьезный разработчик, работающий с базами данных, не должен игнорировать стандарт, и для этого существуют весьма веские причины. Разработка любой информационной системы, ориентированной на технологию баз данных (а других информационных систем на настоящий момент и не бывает), является трудоемким процессом, занимающим несколько десятков и даже сотен человеко-месяцев. Следует отдавать себе отчет, что нельзя разработать сколько-нибудь серьезную систему за несколько дней. Кроме того, развитие вычислительной техники, систем телекоммуникаций и программного обеспечения столь стремительно, что проект может устареть еще до момента внедрения. Но развивается не только вычислительная техника, изменяются и реальные объекты, поведение которых моделируется использованием как самой БД, так и процедур обработки информации в ней, то есть конкретных приложений, которые составляют реальное наполнение разрабатываемой информационной системы. Именно поэтому проект информационной системы должен быть рассчитан на расширяемость и переносимость на другие платформы. Большинство поставщиков аппаратуры и программного обеспечения следуют стратегии поддержки стандартов, в противном случае пользователи просто не будут их покупать. Однако каждый поставщик стремится улучшить свой продукт введением дополнительных возможностей, не входящих в стандарт. Выбор разработчиков, следовательно, таков: ориентироваться только на экзотические особенности данного продукта либо стараться в основном придерживаться стандарта. Во втором случае весь интеллектуальный труд, вкладываемый в разработку, становится более защищенным, так как система приобретает свойства переносимости. И в случае появления более перспективной платформы проект, ориентированный в большей степени на стандарты, может быть легче перенесен на нее, чем тот, который в основном ориентировался на особенности конкретной платформы. Кроме того, стандарты — это верный ориентир для разработчиков, так как все поставщики СУБД в своих перспективных разработках обязательно следуют стандарту, и можно быть уверенным, что в

конце концов стандарт будет реализован практически во всех перспективных СУБД. Так произошло со стандартом SQL1, так происходит со стандартом SQL2 и так будет происходить со стандартом SQL3.

Для поставщиков СУБД стандарт — это путеводная звезда, которая гарантирует правильное направление работ. А вот эффективность реализации стандарта — это гарантия успеха.

SQL нельзя в полной мере отнести к традиционным языкам программирования, он не содержит традиционные операторы, управляющие ходом выполнения программы, операторы описания типов и многое другое, он содержит только набор стандартных операторов доступа к данным, хранящимся в базе данных. Операторы SQL встраиваются в базовый язык программирования, которым может быть любой стандартный язык типа C++, Java, Delphi и т. д. Кроме того, операторы SQL могут выполняться непосредственно в интерактивном режиме.

7.2.Структура SQL

Вотличие от реляционной алгебры, где были представлены только опе-

рации запросов к БД, SQL является полным языком, в нем присутствуют не только операции запросов, но и операторы, соответствующие Data Definition Language (DDL) — языку описания данных. Кроме того, язык содержит операторы, предназначенные для управления (администрирования) БД.

SQL содержит разделы, представленные в табл. 7.1:

Таблица 7.1. Операторы определения данных DDL

 

 

 

 

 

 

 

 

Оператор

 

Смысл

 

Действие

 

 

 

 

 

 

CREATE TABLE

 

Создать

 

Создает новую таблицу в БД

 

 

 

 

таблицу

 

 

 

 

 

 

 

 

 

 

DROP TABLE

 

Удалить

 

Удаляет таблицу из БД

 

 

 

 

таблицу

 

 

 

 

 

 

 

 

 

 

ALTER TABLE

 

Изменить

 

Изменяет структуру существующей таблицы или ограниче-

 

 

 

 

таблицу

 

ния целостности, задаваемые для данной таблицы

 

 

 

 

 

 

 

 

 

 

 

 

CREATE VIEW

 

Создать

 

Создает виртуальную таблицу, соответствующую некото-

 

 

 

 

представ-

 

рому SQL-запросу

 

 

 

 

ление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ALTER VIEW

 

Изменить

 

Изменяет ранее созданное представление

 

 

 

 

представ-

 

 

 

 

 

 

ление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DROP VIEW

 

Удалить

 

Удаляет ранее созданное представление

 

 

 

 

представ-

 

 

 

 

 

 

ление

 

 

 

 

 

 

 

 

 

 

CREATE INDEX

 

Создать

 

Создает индекс для некоторой таблицы для обеспечения

 

 

 

 

индекс

 

быстрого доступа по атрибутам, входящим в индекс

 

 

 

 

 

DROP INDEX

 

Удалить

 

Удаляет ранее созданный индекс

 

 

 

 

 

 

 

 

индекс

 

 

 

 

 

 

 

 

 

 

Таблица 7.2. Операторы манипулирования данными Data Manipulation Lanquaqe (DML)

 

 

 

 

 

 

 

 

Оператор

 

Смысл

 

Действие

 

 

 

 

 

 

 

 

 

 

 

 

DELETE

INSERT

UPDATE

Удалить

строки

Вставить

строку

Обновить

строку

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

Вставляет одну строку в базовую таблицу. Допустимы модификации оператора, при которых сразу несколько строк могут быть перенесены из одной таблицы или запроса в базовую таблицу

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

Таблица 7.3. Язык запросов Data Query Lanquaqe (DQL)

 

 

 

 

 

 

 

 

Оператор

 

Смысл

 

Действие

 

 

 

 

 

 

SELECT

 

Выбрать строки

 

Оператор, заменяющий все операторы реляционной

 

 

 

 

 

 

алгебры и позволяющий сформировать результиру-

 

 

 

 

 

 

ющее отношение, соответствующее запросу

 

 

 

 

Таблица 7.4. Средства управления транзакциями

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Оператор

 

Смысл

 

Действие

 

 

COMMIT

 

Завершить транзакцию

 

Завершить комплексную взаимосвязанную обра-

 

 

 

 

 

 

ботку информации, объединенную в транзакцию

 

 

 

 

 

 

 

 

ROLLBACK

 

Откатить транзакцию

 

Отменить изменения, проведенные в ходе выполне-

 

 

 

 

 

 

 

 

 

 

ния транзакции

 

 

 

 

 

 

 

 

 

 

 

Сохранить промежуточное состояние БД, пометить

 

 

SAVEPOINT

 

Сохранить промежу-

 

 

 

 

 

точную точку выпол-

 

его для того, чтобы можно было в дальнейшем к

 

 

 

 

нения транзакции

 

нему вернуться

 

 

 

 

 

 

 

 

Таблица 7.7. Средства администрирования данных

Оператор

ALTER DATABASE

Смысл

Изменить БД

Действие

Изменить набор основных объектов в базе данных, ограничений, касающихся всей базы данных

 

 

 

 

 

 

 

 

ALTER DBAREA

 

Изменить область хране-

 

Изменить ранее созданную область хра-

 

 

 

 

 

 

 

 

ния БД

 

нения

 

 

 

 

 

 

 

 

 

 

 

 

ALTER PASSWORD

 

Изменить пароль

 

Изменить пароль для всей базы данных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CREATE DATABASE

 

Создать БД

 

Создать новую базу данных, определив

 

 

 

 

 

 

основные параметры для нее

 

 

 

 

 

 

 

 

 

 

 

 

CREATE DBAREA

 

Создать область хранения

 

Создать новую область хранения и сде-

 

 

 

 

 

 

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

 

 

 

 

 

 

ных

 

 

 

 

 

 

 

 

 

 

 

 

DROP DATABASE

 

Удалить БД

 

Удалить существующую базу данных

 

 

 

 

 

 

(только в том случае, когда вы имеете

 

 

 

 

 

 

право выполнить это действие)

 

 

 

 

 

 

 

 

 

 

 

 

DROP DBAREA

 

Удалить область хранения

 

Удалить существующую область хране-

 

 

 

 

БД

 

ния (если в ней на настоящий момент не

 

 

 

 

 

 

располагаются активные данные)

 

 

 

 

 

 

 

 

 

GRANT

 

Предоставить права

 

Предоставить права доступа на ряд дей-

 

 

 

 

 

 

 

 

 

 

ствий над некоторым объектом БД

 

 

 

 

 

 

 

 

 

 

 

 

 

REVOKE

 

Лишить прав

 

Лишить прав доступа к некоторому объ-

 

 

 

 

 

 

екту или некоторым действиям над объ-

 

 

 

 

 

 

ектом

 

 

 

 

Таблица 7.6. Программный SQL

 

 

 

 

 

 

 

 

 

 

 

 

 

Оператор

 

Смысл

 

Действие

 

 

DECLARE

 

Определяет курсор для за-

 

Задает некоторое имя и определяет свя-

 

 

 

 

проса

 

занный с ним запрос к БД, который соот-

 

 

 

 

 

 

ветствует виртуальному набору данных

 

 

 

 

 

 

 

 

OPEN

 

Открыть курсор

 

Формирует виртуальный набор данных,

 

 

 

 

 

 

соответствующий описанию указанного

 

 

 

 

 

 

курсора и текущему состоянию БД

 

 

 

 

 

 

 

 

 

 

 

 

FETCH

 

Считать строку из множе-

 

Считывает очередную строку, заданную

 

 

 

 

ства строк, определенных

 

параметром команды из виртуального

 

 

 

 

курсором

 

набора данных, соответствующего от-

 

 

 

 

 

 

крытому курсору

 

 

 

 

 

 

 

 

 

 

 

 

CLOSE

 

Закрыть курсор

 

Прекращает доступ к виртуальному

 

 

 

 

 

 

набору данных, соответствующему ука-

 

 

 

 

 

 

занному курсору

 

 

 

 

 

 

 

 

 

PREPARE

 

Подготовить оператор

 

Сгенерировать план выполнения запроса,

 

 

 

 

 

 

 

 

SQL к динамическому вы-

 

соответствующего заданному оператору

 

 

 

 

полнению

 

SQL

 

 

 

 

 

 

 

 

EXECUTE

 

Выполнить оператор SQL,

 

Выполняет ранее подготовленный план

 

 

 

 

ранее подготовленный к

 

запроса

 

 

 

 

динамическому выполне-

 

 

 

 

 

 

нию

 

 

 

 

 

 

 

 

 

 

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

7.3.Типы данных

Вязыке SQL/89 поддерживаются следующие типы данных:

CHARACTER(n) или CHAR(n) — символьные строки постоянной длины в n сим-

волов. При задании данного типа под каждое значение всегда отводится n символов, и если реальное значение занимает менее, чем n символов, то СУБД автоматически дополняет недостающие символы пробелами.

NUMERIC[(n,m)] — точные числа, здесь n — общее количество цифр в

числе, m — количество цифр слева от десятичной точки.

DECIMAL[(n,m)] — точные числа, здесь n — общее количество цифр в

числе, m — количество цифр слева от десятичной точки.

DEC[(n,m)] — то же, что и DECIMAL[(n,m)].

INTEGER или INT — целые числа.

SMALLINT — целые числа меньшего диапазона.

Несмотря на то, что в стандарте SQL1 не определяется точно, что подразумевается под типом INT и SMALLINT (это отдано на откуп реализации),

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

FLOAT[(n)] — числа большой точности, хранимые в форме с плавающей точ-

кой. Здесь n — число байтов, резервируемое под хранение одного числа. Диапазон чисел определяется конкретной реализацией.

REAL — вещественный тип чисел, который соответствует числам с плаваю-

щей точкой, меньшей точности, чем FLOAT.

DOUBLE PRECISION специфицирует тип данных с определенной в реализации

точностью большей, чем определенная в реализации точность для REAL.

Встандарте SQL92 добавлены следующие типы данных:

VARCHAR(n) — строки символов переменной длины.

NCHAR(N) — строки локализованных символов постоянной длины.

NCHAR VARYING(n) — строки локализованных символов переменной длины.

BIT(n) — строка битов постоянной длины.

BIT VARYING(n) — строка битов переменной длины.

DATE — календарная дата.

TIMESTAMP(точность) — дата и время.

INTERVAL — временной интервал.

Большинство коммерческих СУБД поддерживают еще дополнительные типы данных, которые не специфицированы в стандарте. Так, например, практически все СУБД в том или ином виде поддерживают тип данных для представления неструктурированного текста большого объема. Этот тип аналогичен типу MEMO в настольных СУБД. Называются эти типы по-разному, например в ORACLE этот тип называется LONG, в DB2 LONG VARCHAR, в SYBASE

и MS SQL Server TEXT.

Однако следует отметить, что специфика реализации отдельных типов данных серьезным образом влияет на результаты запросов к БД. Особенно это касается реализации типов данных DATE и TIMESTAMP. Поэтому при переносе приложений будьте внимательны, на разных платформах они могут работать по-разному, и одной из причин может быть различие в интерпретации типов данных.

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

213.314 612.716

+ 551.702

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

2.9E-4 -134.235E7 0.54267E18

Строковые константы должны быть заключены в одинарные кавычки:

'Крылов Ю.Д.'

'Санкт-Петербург'

В некоторых реализациях, например, MS SQL Server и Informix, допустимы двойные кавычки в строковых константах:

"Москва" "New York"

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

Константы даты, времени и временного интервала в реляционных СУБД представляются в виде строковых констант. Форматы этих констант отличаются в различных СУБД. Кроме того, формат представления даты различен в разных странах. В большинстве СУБД реализованы способы настройки форматов представления дат или специальные функции преобразования форматов дат, как сделано, например, в CУБД ORACLE. Приведем примеры констант в MS SQL Server:

March 15, 1999 Mar 15 1999 3/15/1999 3-15-99 1999 MAR 15

В СУБД ORACLE та же константа запишется как

15-MAR-99

Кроме пользовательских констант в СУБД могут существовать и специальные системные константы. Стандарт SQL1 определяет только одну системную константу USER, которая соответствует имени пользователя, под которым вы подключились к БД.

В операторах SQL могут использоваться выражения, которые строятся по стандартным правилам применения знаков арифметических операций сложения (+), вычитания (-), умножения (*) и деления (/). Однако в ряде СУБД операция деления (/) интерпретируется как деление нацело, поэтому при построении сложных выражений вы можете получить результат, не соответствующий традиционной интерпретации выражения. В стандарт SQL2 включена возможность выполнения операций сложения и вычитания над датами. В большинстве СУБД также определена операция конкатенации над строковыми данными, обозначается она, к сожалению, по-разному. Так, например, для DB2 операция конкатенации обозначается двойной вертикальной чертой, в MS SQL Server — знаком сложения (+), поэтому два выражения, созданные в разных СУБД, эквивалентны:

'Mr./Mrs. ' || NAME || ' ' LAST_NAME 'Mr./Mrs. ' + NAME + ' ' LAST_NAME

В стандарте SQL1 не были определены встроенные функции, однако в большинстве коммерческих СУБД такие функции были реализованы, и в стандарт SQL2 уже введен ряд стандартных встроенных функций:

BITLENGTH(строка) — количество битов в строке;

CAST(значение AS тип данных) — значение, преобразованное в заданный

тип данных;

CHARLENGTH(строка) — длина строки символов;

CONVERT(строка USING функция) — строка, преобразованная в соответ-

ствии с указанной функцией;

CURRENTDATE — текущая дата;

CURRENTTIME(точность) — текущее время с указанной точностью;

CURRENTTIMESTAMP(точность) — текущие дата и время с указанной точно-

стью;

LOWER(строка) — строка, преобразованная к нижнему регистру;

OCTEDLENGTH(строка) — число байтов в строке символов;

POSITION( первая строка IN вторая строка) — позиция, с которой начи-

нается вхождение первой строки во вторую;

SUBSTRING(строка FROM n FOR длина) — часть строки, начинающаяся с n-

го символа и имеющая указанную длину;

TRANSLATE(строка USING функция) — строка, преобразованная с использо-

ванием указанной функции;

TRIM(BOTH символ FROM строка) — строка, у которой удалены все первые

и последние символы;

TRIM(LEADING символ FROM строка ) — строка, в которой удалены все

первые указанные символы;

TRIM(TRAILING символ FROM строка) — строка, в которой удалены послед-

ние указанные символы;

UPPER(строка) — строка, преобразованная к верхнему регистру.

7.4.Оператор выбора SELECT

Язык запросов (Data Query Language) в SQL состоит из единственного оператора SELECT. Этот единственный оператор поиска реализует все операции реляционной алгебры. Как просто, всего один оператор. Однако писать запросы на языке SQL (грамотные запросы) сначала совсем не просто. Надо учиться, так же как надо учиться решать математические задачки или составлять алгоритмы для решения непростых комбинаторных задач. Один и тот же запрос может быть реализован несколькими способами, и, будучи все правильными, они, тем не менее, могут существенно отличаться по времени исполнения, и это особенно важно для больших баз данных.

Синтаксис оператора SELECT имеет следующий вид:

SELECT[ALL|DISTINCT](<Список полей>|*)

FROM

<Список таблиц>

[WHERE

<Предикат-условие выборки или соединения>]

[GROUP BY

<Список полей результата>]

[HAVING

<Предикат-условие для группы>]

[ORDER BY

<Список полей, по которым упорядочить вывод>]

Здесь ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса. Значит, в результирующий набор могут попасть одинаковые строки. И это нарушение принципов теории отношений (в отличие от реляционной алгебры, где по умолчанию предполагается отсутствие дубликатов в каждом результирующем отношении). Ключевое слово DISTINCT означает, что в результирующий набор включаются только различные строки, то есть дубликаты строк результата не включаются в набор.

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

Вразделе FROM задается перечень исходных отношений (таблиц) за-

проса.

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

нения в реляционной алгебре.

Вразделе GROUP BY задается список полей группировки.

Вразделе HAVING задаются предикаты-условия, накладываемые на каждую группу.

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

Ввыражении условий раздела WHERE могут быть использованы следующие предикаты:

Предикаты сравнения { =, <>, >,<, >=,<= },которые имеют традиционный смысл.

Предикат Between A and B —принимает значения между A и B. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона. Одновременно в стандарте задан и противоположный предикат Not Between A and B,который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.

Предикат вхождения в множество IN (множество) истинен тогда, когда сравниваемое значение входит в множество заданных значений. При этом множество значений может быть задано простым перечислением или встроенным подзапросом. Одновременно существует противоположный предикат NOT IN (множество), который истинен тогда, когда сравниваемое значение не входит в заданное множество.

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

По стандарту в шаблон могут быть включены специальные символы:

символ подчеркивания ( _ ) — для обозначения любого одиночного символа;

символ процента ( % ) — для обозначения любой произвольной последовательности символов;

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

Предикат сравнения с неопределенным значением IS NULL. Понятие неопределенного значения было внесено в концепции баз данных позднее. Неопределенное значение интерпретируется в реляционной модели как значение, не-

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

<имя атрибута>IS NULL и <имя атрибута> IS NOT NULL.

Если в данном кортеже (в данной строке) указанный атрибут имеет неопределенное значение, то предикат IS NULL принимает значение "Истина" ( TRUE ), а предикат IS NOT NULL — "Ложь" ( FALSE ), в противном случае предикат IS NULL принимает значение "Ложь", а предикат IS NOT NULLпринимает значение "Истина".

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

A

B

Not A

TRUE TRUE FALSE TRUE

TRUE FALSE FALSE FALSE

TRUE Null FALSE Null

FALSE TRUE TRUE FALSE

FALSE FALSE TRUE FALSE

FALSE Null TRUE FALSE

Null TRUE Null Null

Null FALSE Null FALSE

Null Null Null Null

TRUE

TRUE

TRUE

TRUE

FALSE

Null

TRUE

Null

Null

Предикаты существования EXISTS и несуществования NOT EXISTS. Эти предикаты относятся к встроенным подзапросам, и подробнее мы рассмотрим их, когда коснемся вложенных подзапросов.

Вусловиях поиска могут быть использованы все рассмотренные ранее предикаты.

Отложив на время знакомство с группировкой, рассмотрим детально

первые три строки оператора SELECT:

SELECT — ключевое слово, которое сообщает СУБД, что эта команда — за-

прос. Все запросы начинаются этим словом с последующим пробелом. За ним может следовать способ выборки — с удалением дубликатов (DISTINCT) или без удаления (ALL, подразумевается по умолчанию). Затем следует список перечисленных через запятую столбцов, которые выбираются запросом из таблиц, или символ '*' (звездочка) для выбора всей строки. Любые столбцы, не перечисленные здесь, не будут включены в результирующее отношение, соответствующее выполнению команды. Это, конечно, не значит, что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в таблицах — он только показывает данные.