7.1. Основные понятия и компоненты

 

7.1.1. Инструкции и имена

 

SQL представлен множеством инструкций, каждая из которых предписывает СУБД выполнить определенное действие: создать таблицу, извлечь данные, добавить в таблицу новые данные и т. п. Инструкция SQL начинается с команды — ключевого слова, описывающего действие, выполняемое инструкцией. Типичными являются команды CREATE (создать), INSERT (добавить), SELECT (выбрать), DELETE (удалить). Следом за командой указывается одно или несколько предложений. Предложение описывает данные, с которыми должна работать инструкция, или уточняет действие, выполняемое инструкцией. Предложения в инструкции делятся на обязательные и необязательные. Каждое предложение начинается с ключевого слова, например — WHERE (где), FROM (откуда), INTO (куда). Многие предложения в качестве параметров содержат имена таблиц или столбцов; некоторые из них могут содержать дополнительные ключевые слова, константы и выражения.

У каждого объекта в базе данных есть уникальное имя. Имена используются в инструкциях SQL и указывают, над каким объектом базы данных инструкция должна выполнить действие. В соответствии со стандартом ANSI/ISO имена в SQL могут содержать от 1 до 18 символов, начинаться с буквы и не должны включать пробелов или специальных символов пунктуации. В стандарте SQL2 максимальное число символов в имени увеличено до 128. На практике в различных СУБД поддержка именования реализована по-разному: в DB2, например, имена пользователей не могут превышать восьми символов, а имена таблиц и столбцов могут быть более длинными. В различных СУБД также существуют и различные подходы к использованию в именах специальных символов.

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

<Имя пользователя>.<Имя таблицы>

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

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

 

<Имя пользователя>.<Имя таблицы>.<Имя столбца> или

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

 

В рамках одной таблицы не может быть определено двух столбцов с одинаковыми именами, но в разных таблицах это возможно. При этом в инструкциях SQL необходимо использовать полное именование столбцов.

 

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

 

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

Целые числа (INT, SMALLINT). В столбцах, имеющих такой тип данных, обычно хранятся данные о количестве и возрасте сотрудников, идентификаторы.

Десятичные числа (NUMERIC, РЕС1МА1.). В столбцах данного типа хранятся числа, имеющие дробную часть с фиксированным количеством знаков после запятой, например курсы валют и проценты.

Числа с плавающей запятой (REAL, FLOAT). Числа с плавающей запятой представляют больший диапазон действительных значений, чем десятичные числа.

Строки символов постоянной длины (CHAR). В столбцах, имеющих этот тип данных, хранятся имена и фамилии, географические названия, адреса и т. п.

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

Денежные величины (MONEY, SMALLMONEY). Наличие отдельного типа данных для хранения денежных величин позволяет, правильно форматировать их и снабжать признаком валюты перед . выводом на экран.

Дата и время (DATETIME, SMALLDATETIME). Поддержка особого типа данных для значений дата/время широко распространена в различных СУБД. Как правило, с этим типом данных связаны особые операции и процедуры обработки.

Булевы величины (BIT). Столбцы такого типа данных позволяют хранить логические значения True (1) и False (0).

Длинный текст (ТЕХТ). Многие СУБД поддерживают хранение в столбцах текстовых строк длиной до 32КБ или 64КБ символов, а в некоторых случаях и больше. Это позволяет хранить в базе данных целые документы.

Неструктурированные потоки байтов (BINARY, VARBINARY, IMAGE). Современные СУБД позволяют хранить и извлекать не структурированные потоки байтов переменной длины. Такой тип данных обычно используется для хранения графических и видеоизображений, исполняемых файлов и других неструктурированных данных.

 

7.1.3. Встроенные функции

 

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

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

математические функции;

строковые функции;

функции для работы с величинами типа дата-время;

функции конфигурирования;

системные функции;

функции системы безопасности;

функции управления метаданными;

статистические функции.

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

 

 

 

7.1.4. Значения HULL

 

При заполнении таблиц базы данных отдельные элементы в них могут отсутствовать. Например, при заполнении таблицы «Студенты» или «Кадровый состав» может быть не задан для некоторых строк номер телефона, тем не менее, строка должна быть введена в таблицу и должна участвовать в запросах на выдачу информации.

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

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

 

7.2. Ограничения целостности

 

7.2.1. Первичный ключ таблицы

 

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

значение или совокупность значений которых уникально идентифицируют каждую строку в таблице. Этот столбец (или столбцы) называется первичным ключом (Primary Кеу, PK) таблицы.

Если в первичный ключ входит более одного столбца, значения в пределах одного столбца могут дублироваться, но любая совокупность значений всех столбцов первичного ключа при этом должна быть уникальна. Например, в таблице «Дисциплины» один столбец (IР_ Дисциплина) определен как первичный ключ (рис. 7.1),  для таблицы «Сводная ведомость» задан составной первичный ключ — в него входят значения столбцов ID_ Студент и IP_Дисциплина.

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

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

 

 

это может быть реализовано только при наличии соответствующих внешних ключей(FOREIGN KEY) в других (дочерних) таблицах.

Если по столбцу строится первичный ключ, столбцу должен быть приписан атрибут PRIMARY KEY (ограничение целостности на уровне столбца), например, описание столбца ID_План для таблицы «Учебный_план» (см. рис. 7.1) может выглядеть так:

 

ID_Дисциплина INTEGER NOT NULL PRIMARY KEY

Первичный ключ может быть также построен с помощью отдельного предложения PRIMARY KEY (ограничение целостности на уровне таблицы) — путем включения имени (имен) ключевого столбца (столбцов) в качестве параметров. Например, первичный ключ для таблицы «Сводная_ведомость» (рис. 7.2) может быть задан следующим образом:

 

PRIMARY KEY (ID_ Дисциплина, ID_Студент)

 

 

7.2.2. Внешний ключ таблицы

 

Внешний ключ строится в дочерней (зависимой) таблице для соединения родительской (главной) и дочерних таблиц БД.

Это ограничение целостности предназначено для организации ссылочной целостности данных. Внешний ключ связывается с потенциальным первичным ключом в другой таблице. Внешний ключ при этом может ссылаться либо на столбец (или столбцы) с ограничением целостности PRIMARY KEY, либо на столбец (столбцы) с ограничением целостности UNIQUE.

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

Например, если строка наименования дисциплины удалена из таблицы «Дисциплины», а идентификатор этой дисциплины (ID_Дисциплина) используется в таблице «Учебный план», то относительная целостность между этими двумя таблицами будет нарушена — строки таблицы «Учебный план» с удаленным идентификатором останутся «осиротевшими». Ограничение FOREIGN KEY предотвращает возникновение подобных ситуаций — удаление строки первичного ключа не состоится.

Столбцы внешнего ключа (в отличие от столбцов первичного ключа) могут содержать значения типа NULL, однако при этом проверка на ограничение FOREIGN KEY будет пропускаться. Задать внешний ключ можно как при создании, так и при изменении таблиц.

Синтаксис определения внешнего ключа следующий:

                FOREIGN KEY (<список столбцов внешнего ключа>)

    REFERENCES <имя родительской таблицы>

    [[<список столбцов родительской таблицы>]

[ON DELETE {NO ACTION ‌‌‌‌‌‌‌‌‌  CASCADE   SET DEFAULT   SET NULL}]

[0N UPDATE {NO ACTION  CASCADE   SET DEFAULTS  SET NULL}]

 

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

Имя родительской таблицы определяет таблицу, в которой описан первичный ключ (или столбец с атрибутом UNIQUE). На этот ключ (столбец) должен ссылаться внешний ключ дочерней таблицы для обеспечения ссылочной целостности. Список столбцов родительской таблицы, определяющий ссылочную целостность, необязателен при ссылке на первичный ключ родительской таблицы. При ссылке в родительской таблице на столбец с атрибутом UNIQUE этот список лучше привести.

Параметры ON DELETE, ON UPDATE задают способы изменения подчиненных записей дочерней таблицы при удалении (ON DELETE) или изменении (ON UPDATE) поля связи в записи родительской таблицы. Перечислим эти способы:

NO ACTION — запрещает удаление изменение родительской записи при наличии подчиненных записей в дочерней таблице;

CASCADE — при удалении записи родительской таблицы (используется совместно с ON DELETE) происходит удаление всех подчиненных записей в дочерней таблице; при изменении поля связи в записи родительской таблицы (используется совместно с ON UPDATE) происходит изменение на то же значение поля внешнего ключа у всех подчиненных записей в дочерней таблице;

SET DEFAULT — в поле внешнего ключа записей дочерней таблицы заносится значение этого поля по умолчанию, указанное при определении поля (параметр DEFAULT);

SET NULL — в поле внешнего ключа записей дочерней таблицы заносится значение NULL.

Установим связь между таблицами «Студенты», «Учебный_план» и «Сводная_ведомость».

 

ALTER 'ТАВОТЕ Сводная_ведомость

ADD FOREIGN KEY(ID_План)

REFERENCES Учебный_план

ALTER ТАВLЕ Сводная_ведомость

ADD FOREIGN KEY (ID_Студент)

REFERENCES Студенты

Хотя в рассмотренном примере имена столбцов первичного и внешнего ключей в обеих таблицах совпадают, это не является обязательным. Первичный ключ может быть определен для столбца с одним именем, в то время как столбец, на который наложено ограничение FOREIGN KEY, может иметь совершенно другое имя. Однако лучше давать таким столбцам идентичные названия, чтобы показать связь между ними (рис. 7.3).

 

 

 

 

7.2.3. Определение уникального столбца

 

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

Для ограничения целостности PRIMARY KEY автоматически гарантируется уникальность значений. Однако в каждой таблице можно определить всего один первичный ключ. Если же необходимо дополнительно обеспечить уникальность значений еще в одном или более столбцах помимо первичного ключа, то нужно использовать ограничение целостности UNIQUE.

Ограничение целостности UNIQUE, в отличие от PRIMARY KEY, допускает существование значения NULL. При этом к значению NULL также предъявляется требование уникальности, поэтому в столбце с ограничением целостности UNIQUE допускается существование лишь единственного значения NULL.

Таким образом, ограничение UNIQUE используется в том случае, когда столбец не входит в состав первичного ключа, но, тем не менее, его значение всегда должно быть уникальным. Например, для таблицы «Дисциплины» первичный ключ строится по номеру дисциплины ID_ Дucциплина, введенному для сокращения объема первичного ключа и времени поиска по нему (объем ключа по столбцу типа INTEGER много меньше объема ключа по символьному полю). Однако и название дисциплины (столбец Наименование) должно быть уникальным, для чего ему приписан атрибут UNIQUE:

           

CREATE TABLE Дисциплины

(ID_Дисциплина       INTEGER  NOT  NULL  PRIMARY  KEY,

Наименование          VARCHAR (20)   NOT   NULL   UNIQUE)

 

Уникальность может быть определена и на уровне таблицы:

           

CREATE TABLE Дисциплины

(ID_Дисциплина       INTEGER  НОТ  NULL,

Наименование           VARCHAR  (20)    NOT NULL,

PRIMARY KEY         (ID Дисциплина),

UNIQUE                     (Наименование))

 

7.2.4. Определение проверочных ограничений

 

Ограничение целостности CHECK задает диапазон возможных значений для столбца. Например, если в столбце хранится процентное значение, то необходимо гарантировать, что оно будет лежать в пределах от 0 до 100. Для этого можно использовать тип данных, допускающий хранение целых значений в диапазоне от 0 до 255, совместно с ограничением целостности СНЕСК, которое будет обеспечивать соответствующую проверку значений.

Преимуществом ограничения целостности СНЕСК является возможность определения для одного столбца множества правил контроля значений.

В основе ограничения целостности СНЕСК лежит проверка логического выражения, которое возвращает значение TRUE (истина) либо значение FALSE (ложь). Если возвращается значение TRUE, то ограничение целостности выполняется, и операция изменения или вставки данных разрешается. Когда же возвращается значение FALSE, то операция изменения или вставки данных отменяется.

Например, для обеспечения правильности задания значения для столбца Семестр в таблице «Учебный план» (оно должно находиться в диапазоне от 1 до 10) можно использовать следующее логическое выражение:

 

((Семестр >= 1) OR (Семестр <= 10) ) )

 

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

 

Семестр INTEGER   NOT   NULL   СНЕСК ((Семестр >= 1)  OR  (Семестр . <= 10)))

 

Или на уровне таблицы:

 

СНЕСК ((Семестр >= 1)   OR  (Семестр <= 10) ) )

 

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

 

7.2.5. Определение значения по умолчанию

 

При вводе записи (строки) в таблицу каждый столбец должен содержать какое-либо значение. Если значение для столбца не указано, то столбец заполняется значениями NULL (конечно, если для него разрешено хранение значений NULL). Однако это нежелательно. Наилучшим решением в подобных ситуациях может быть определение для столбца значений по умолчанию. Например, часто ноль определяется как значение по умолчанию для числовых столбцов, а «n/а» (не определено) — как значение по умолчанию для символьных столбцов. Таким образом, определение для столбца значения по умолчанию гарантирует автоматическую подстановку этого значения, если при вставке новых строк значение для столбца не указано.

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

 

7.3. Управление таблицами

 

7.3.1. Команда создания таблицы — CREATE TABLE

 

Создание таблицы выполняется при помощи команды CREATE TABLE. Обобщенный синтаксис команды следующий:

 

GREATE   TABLE  имя_ таблицы

({<определение_столбца> ‌/ <определение_ ограничения_ таблицы>}

[,..., {<определение_ столбца> / <определение_ ограничения_ таблицы > } ] )

 

То есть после задания имени таблицы через запятую в круглых скобках должны быть перечислены все предложения, определяющие отдельные элементы таблицы, — столбцы или ограничения целостности:

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

Определение_ столбца — задание имени, типа данных и параметров отдельного столбца таблицы. Названия столбцов должны соответствовать правилам для идентификаторов и быть уникальными в пределах таблицы;

Определение_ ограничения_ таблицы — задание некоторого ограничения целостности на уровне таблицы.

 

 Описание столбцов

 

Как видно из синтаксиса команды СREАТЕ TABLE, для каждого столбца указывается предложение <определение_ столбца>, с помощью которого и задаются свойства столбца. Предложение имеет следующий синтаксис:

 

<Имя столбца> <тип данных>

[<ограничение_ столбца> ] [,...,<ограничение_ столбца>]

 

Рассмотрим назначение и использование параметров.

Имя_ столбца — идентификатор, задающий имя столбца таблицы;

Тип_ данных — задает тип данных столбца. Если при определении столбца явно не указано ограничение на хранение значений NULL, то будут использованы свойства типа данных, т. е. если выбранный тип данных позволяет хранить значения NULL то и в столбце можно будет хранить значения NULL. Если же при определении столбца в команде CREATE TABLE явно будет разрешено или запрещено хранение значений NULL, то свойства типа данных будут перекрыты установленным на уровне столбца ограничением. Например, если тип данных позволяет хранить значения NULL, а на уровне столбца будет установлен запрет, то попытка вставки значения NULL в столбец закончится ошибкой;

Ограничение_ столбца — с помощью этого предложения указываются ограничения, которые будут определены для столбца. Синтаксис предложения следующий:

 

<ограничение_ столбца>::=[ CONSTRAINT <имя_ ограничения > ]

{[ DEFAULT <выражение>]

[ NULL  NOT NULL ]

[ PRIMARY KEY   UNIQUE ]

[FOREIGN KEY

REFERENCES <имя_ главной_ таблицы>[(<имя_ столбца> [,...,n] )]

[ ON DELETE { CASCADE   NO  ACTION } ]

[ ON UPDATE { CASCADE   NO  ACTION ) ]

]

[СНЕСК (<логическое_ выражение>)]

{

 

Рассмотрим назначение параметров.

CONSTRAINT — необязательное ключевое слово, после которого указывается название ограничения на значения столбца (имя ограничения). Имена ограничений должны быть уникальны в пределах базы данных.

DEFAULT — задает значение по умолчанию для столбца. Это значение будет использовано при вставке строки, если для столбца явно не указано никакое значение.

NULL‌‌│NOT NULL — ключевые слова, разрешающие (NULL) или запрещающие (NOT NULL) хранение в столбце значений NULL. Если для столбца не задано значение по умолчанию, то при вставке строки с неизвестным значением для столбца будет предприниматься попытка вставки в столбец значения NULL. Если при этом для столбца указано ограничение NOT NULL, то попытка вставки строки будет отклонена, и пользователь получит соответствующее сообщение об ошибке.

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

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

FOREIGN KEY ... REFERENCES —указание на то, что столбец будет служить внешним ключом для таблицы, имя которой задается с помощью параметра <имя_ главной_ таблицы>.

(имя_ столбца [,...,n]) — столбец или список перечисленных через запятую столбцов главной таблицы, входящих в ограничение FOREIGN KEY. При этом столбцы, входящие во внешний ключ, могут ссылаться только на столбцы первичного ключа или столбцы с ограничением UNIQUE таблицы.

ON DELETE {CASCADE I NO ACTION} — эти ключевые слова определяют действия, предпринимаемые при удалении строки из главной таблицы. Если указано ключевое слово CASCADE, то при удалении строки из главной (родительской) таблицы строка в зависимой таблице также будет удалена. При указании ключевого слова NO ACTION в подобном случае будет выдана ошибка. Значением по умолчанию является вариант NO ACTION.

ON UPDATE {CASCADE│NO ACTION} — эти ключевые слова определяют действия, предпринимаемые при модификации строки главной таблицы. Если указано ключевое слово CASCADE, то при модификации строки из главной (родительской) таблицы строка в зависимой таблице также будет модифицирована. При использовании ключевого слова NO ACTION в подобном случае будет выдана ошибка. Значением по умолчанию является вариант NO ACTION.

СНЕСК — ограничение целостности, инициирующее контроль вводимых в столбец (или столбцы) значений;

Логическое_ выражение — логическое выражение, используемое для ограничения СНЕСК.

 

Ограничения на уровне таблицы

 

Синтаксис команды CREATE TABLE предусматривает использование предложения <ограничение_ таблицы>, с помощью которого определяются ограничения целостности на уровне таблицы. Синтаксис предложения следующий:

 

<ограничение_ таблицы>::= [ CONSTRAINT <имя_ ограничения>]

{ [ { PRIMARY KEY I UNIQUE }

{(<имя_ колонки> [ASC   DESC] [,...,,n]  )}]

FOREIGN KEY

[ ( <имя_колонки>[,..., n ] ) ]

REFERENCES <внешняя_ таблица> [(<имя_ колонки_ внешней_ таблицы>[,...,n])]

[ ON DELETE { CASCADE   NO ACTION } ]

[ ON UPDATE { CASCADE  NO  ACTION } ]

CHECK (<логическое_ выражение> )

}

 

Назначение параметров совпадает с назначением аналогичных параметров предложения <ограничение_ столбца>. Тем не менее, в предложении <ограничение_ таблицы> имеются некоторые новые параметры:

Имя_ колонки — столбец (или список столбцов), на которые необходимо наложить какие-либо ограничения целостности;

[ASC│DESC] — метод упорядочивания данных в индексе. Индекс создается при указании ключевых слов PRIMARY KEY, UNIQUE. При указании значения ASC данные в индексе будут упорядочены по возрастанию, при указании значения DESC — по убыванию. По умолчанию используется значение ASC.

 

Примеры создания таблиц

 

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

Таблица «Студенты» состоит из следующих столбцов:

 

ID_ Студент — тип данных INTEGER, уникальный ключ;

Фамилия — тип данных CHAR, длина 30;

Имя — тип данных CHAR, длина 15;

Отчество — тип данных CHAR, длина 20;

Номер группы — тип данных CHAR, длина 6;

Адрес — тип данных CHAR, длина 30;

Телефон — тип данных CHAR, длина 8.

 

Создание таблицы выполнялось с помощью следующей команды:

 

CREATE TABLE   Студенты

(ID_ Студент          INTEGER.   NOT     NULL,

Фамилия.               СНАН  (3())  NOT    NULL,

имя .                       CHAR  (15)   NOT.   NULL,

Отчество,               CHAR  (20)   NOT    NULL,

Номер_ группы    INTEGER     NOT     NULL,

Адрес                     CHAR (30),

Телефон                 СНАХ (8),

РRIMARY KEY    (ID_ Студент))

 

На все столбцы таблицы, кроме столбцов Адрес и Телефон, наложены ограничения NOT NULL, запрещающие ввод строки при неопределенном значении столбца.

Для создания таблицы «Дисциплины» была использована команда:

 

CREATE  TABLE Дисциплины

(ID _ Диcциплина     INTEGER   NOT NULL

Наименование          VARCHAR (40)  NOT  NULL,

PRIMARY KEY       (ID_ Дисциплина),

UNIQUE                   (Наименование)) 

 

Таблица содержит два столбца (ID_ Дисциплина, Наименование). На столбцы ID_ Дисциплина, Наименование наложены ограничения NOT NULL, запрещающие ввод строки при неопределенном значении столбца.

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

Таблица «Учебный_ план» включает в себя следующие столбцы:

ID_План — тип данных INTEGER, столбец уникального ключа;

ID_ Дисциплина — тип данных INTEGER;

Семестр — тип данных INTEGER;

Количество_ часов — тип данных INTEGER;

ID_ Преподаватель — тип данных INTEGER.

 

Создание таблицы выполнялось с помощью следующей командьг.

CREATE TABLE Учебный_ план

(ID_ План                            INTEGER   NOT   NULL,

ID_ Дисциплина                 INTEGER    NOT   NULL

Семестр                               INTEGER     NOT   NULL,

Количество_ часов            INTEGER,

ID_ Преподаватель            INTEGER

PRIMARY KEY                 (ID_ План ),

СНЕСК                              ((Семестр >= 1)  OR  (Семестр <= 10)))

 

Для значений столбца Семестр сформулировано логическое выражение, разрешающее вводить только значения от 1 до 10.

Таблица «Сводная ведомость» состоит из следующих столбцов:

 

ID_Студент — тип данных INTEGER, столбец уникального ключа;

ID_ План — тип данных INTEGER, столбец уникального ключа;

Оценка — тип данных INTEGER;

Дата сдачи — тип данных DATETIME;

ID_ Преподаватель — тип данных INTEGER.

 

Создание таблицы выполнялось с помощью следующей команды

 

CREATE TABLE Сводная_ ведомость

(ID_ Студент          INTEGER    NOT   NULL,

ID_ План                 INTEGER    NOT   NULL,

Оценка                    INTEGER     NOT   NULL,

Дата_. сдачи           DATETIME  NOT   NULL,

PRIMARY  KEY    (ID_ Студент,  ID_ Дисциплина),

СНЕЕК                   ((Оценка >= О) OR (Оценка <= 5)))

 

На все столбцы таблицы наложены ограничения NOT NULL, запрещающие ввод строки при неопределенном значении столбца.

Для значений столбца Оценка сформулировано логическое выражение, разрешающее вводить только значения от 0 до 5: 0 — незачет, 1 — зачет, 2 — неудовлетворительно, 3 — удовлетворительно, 4 — хорошо, 5 — отлично.

И, наконец, перечислим столбцы таблицы «Кадровый состав»:

 

ID_ Преподаватель — тип данных INTEGER, уникальный ключ;

Фамилия — тип данных CHAR, длина 30;

Имя — тип данных CHAR, длина 15;

Отчество — тип данных CHAR, длина 20;

Должность — тип данных CHAR, длина 20;

Кафедра — тип данных CHAR, длина 3;

Адрес — тип данных CHAR, длина 30;

Телефон — тип данных CHAR, длина 8.

 

 

Создание таблицы выполнялось с помощью следующей команды:

 

CREATE TABLE Кадровый_ состав

(ID_Преподаватель                  INTEGER NOT  NULL,

Фамилия                                   CHAR  (30) NOT  NULL,

Имя                                           CHAR (15)  NOT NULL,

Отчество                                   CHAR   (20) NOT  NULL,

Должность                                CHAR   (20) NOT  NULL,

Кафедра                                    СНAR   (3)  NОТ  NULL,

Адрес                                        CHAR  (30),

Телефон                                    CHAR   (8),

PRIMARY KEY                        (ID_ Преподаватель))

На все столбцы таблицы, кроме столбцов Адрес и Телефон, наложены ограничения NOT NULL, запрещающие ввод строки при неопределенном значении столбца.

Для таблиц «Учебный_ план» и «Сводная_ ведомость» должны быть построены внешние ключи, связывающие таблицы базы данных «Сессия»:

FК_Дисциплина — внешний ключ, связывающий таблицы «Учебный_ план» и «Дисциплины» по столбцу  ID_ Дисциплина;

FK_ Кадровый_ состав — внешний ключ, связывающий таблицы «Учебный_ план» и «Кадровый_ составе по столбцу ID_ Пpeподаватель;

FК_Студент — внешний ключ, связывающий таблицы «Сводная_ ведомость» и «Студенты» по столбцу ID_ Студент;

FК_План — внешний ключ, связывающий таблицы «Сводная_ ведомость» и «Учебный_план» по столбцу ID_ План.

Добавление внешних ключей в таблицы будет описано при рассмотрении возможностей команды ALTER TABLE.

 

7.3.2. Изменение структуры таблицы — команда ALTER TABLE

 

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

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

 

добавить в таблицу определение нового столбца;

удалить столбец из таблицы;

изменить значение по умолчанию для какого-либо столбца;

добавить или удалить первичный ключ таблицы;

добавить или удалить внешний ключ таблицы;

добавить или удалить условие уникальности;

добавить или удалить условие на значение.

 

Рассмотрим обобщенный синтаксис команды ALTER TABLE:

ALTER TABLE <имя_ таблицы>

[ALTER COLUMN <имя_ столбца> [SET DEFAULT <выражение>]│

[DROP DEFAULT]]

│[ADD <определение_ столбца>]

│[DROP COLUMN <имя столбца> [CASCADE]│[RESTRICT]]

│[ADD [<определение_ первичного_ ключа>]│[<определение_ внешнего_ ключа>]│[<условие _уникальности>]│[<условие_ на_ значение>]]

│[DROP CONSTRAINT <имя_ ограничения> [CASCADE]│[RESTRICT]]

 

Команда ALTER TABLE берет на себя все действия по копированию данных во временную таблицу, удалению старой таблицы, созданию вместо нее новой таблицы с нужной структурой и последующим переписыванием в нее данных.

Назначение многих параметров и ключевых слов команды ALTER TABLE аналогично назначению соответствующих параметров и ключевых слов команды CREATE TABLE (например, синтаксис конструкции <определение_ столбца> совпадает с синтаксисом аналогичной конструкции команды CREATE TABLE).

Основные режимы использования команды ALTER TABLE следующие:

добавление столбца;

удаление столбца;

модификация столбца;

изменение, добавление и удаление. ограничений (первичных и внешних ключей, значений по умолчанию).

 

Добавление столбца

 

Для добавления нового столбца следует использовать ключевое слово ADD, после которого должно стоять определение столбца.

Добавим, например, в таблицу «Студенты» столбец Год поступления следующим образом:

 

ALTER TABLE Студенты

ADD Год_ поступления  INTEGER  NOT  NULL   DEFAULT  YEAR (GETDATE( ))

После выполнения этой команды в структуру таблицы «Студент» будет добавлен еще один столбец со значением по умолчанию, равным текущему году (значение по умолчанию вычисляется с помощью двух встроенных функций — YEAR() и GETDATE()).

 

Модификация столбца

 

Для модификации существующего столбца таблицы служит ключевое слово ALTER COLUMN. Изменение свойств столбца невозможно, если:

столбец участвует в ограничениях PRIМАRY KEY или FOREIGN KEY;

на столбец наложены ограничения целостности СНЕСК или UNIQUE (исключение составляют столбцы, имеющие тип данных переменной длины, т. е. типы данных, начинающиеся на var);

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

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

Пример модификации столбца «Номер группы» таблицы «Студенты» (тип данных INTEGER заменяется на CHAR):

 

ALTER   ТАВLE       Студенты

ALTER   COLUMN   Номер_ группы СНАR (6)  NОТ   NULL

 

Удаление столбца

 

Для удаления столбца из таблицы используется предложение DROP COLUMN <имя_ столбца>. При удалении столбцов следует учитывать, что нельзя удалять столбцы с ограничениями целостности СНЕСК, FOREIGN KEY, UNIQUE или PRIMARY KEY, а также столбцы, для которых определены значения по умолчанию (в виде ограничения целостности на уровне столбца или на уровне таблицы).

Рассмотрим, например, команду удаления из таблицы «Студенты» столбца «Год_ поступления».

 

ALTER TABLE     Студенты

DROP COLUMN   год_ поступления

 

Эта команда выполнена не будет, так как при добавлении: столбца было определено значение по умолчанию.

 

Добавление ограничений на уровне таблицы

 

Для добавления ограничений на уровне таблицы используется предложение ADD CONSTRAINT <имя_ ограничения>.

В качестве примера рассмотрим команды добавления внешних ключей в таблицы базы данных «Сессия».

Добавление внешних ключей в таблицу «Учебный_план» (создание связи с именем FК_ Дисциплина и связи с именем FK_Кадровый_состав):

ALTER TABLE Учебный_план

ADD  CONSTRAINT  FK_Дисциплина

FOREIGN KEY (ID_ Дисциплина)

REFERENCES   Дисциплины

ALTER TABLE  Учебный_план

ADD CONSTRAINT   FK_ кадровый_состав

FOREIGN KEY (ID_Преподаватель)

REFERENCES Кадровый_состав

 

Добавление внешних ключей в таблицу «Сводная_ведомость» (создание связи с именем FK_Студент и связи с именем FK_План):

 

ALTER TABLE Сводная_ведомость

ADD  CONSTRAINT   FK _Студент

FOREIGN KEY (ID_Студент)

REFERENCES  Студенты 

 

ALTER TABLE  Сводная_ ведомость

ADD CONSTRAINT FK_ план

FOREIGN KEY (ID_ План)

REFERENCES Учебный_ план

 

С помощью конструкции ADD CONSTRAINT создается поименованное ограничение. Необходимо отметить, что удаление любого ограничения на уровне таблицы происходит только по его имени, поэтому ограничение должно быть поименовано (чтобы его можно было удалить).

 

Рассмотрим еще один пример — добавление значения по умолчанию для столбца Номер_ группы:,

 

ALTER TABLE  Студент

ADD CONSTRAINT  DEF_Номер_группы DEFAULT 1 FOR Номер_ группы

 

В результате выполнения этой команды на уровне таблицы будет создано ограничение целостности с именем DEF_Номер_группы.

 

Удаление ограничений

 

Для удаления из таблицы ограничения целостности используется предложение DROP CONSTRAINT <имя_ограничения>.

Удаление ограничения целостности возможно только в том случае, когда оно поименовано (т. е. предложение <определение_огpaничения> содержит именование ограничения CONSTRAINT).

Команда удаления построенного внешнего ключа РК Дисциплина из таблицы «Учебный_план» выглядит следующим образом:

 

ALTER  TABLE учебный_ план

DROP  CONSTRAINT  FK_ Дисциплина

Удалить же построенное ограничение DEF_Номep_группы можно с помощью следующей команды:

 

ALTER TABLE Студент

DROP СОNSTRAINT  DEF_Номер_ группы

 

7.3.3. Удаление таблиц — команда DROP TABLE

 

Удаление таблицы выполняется при помощи команды DROP TABLE:

 

DROP TABLE <имя_ таблицы>

 

Единственный аргумент команды задает имя таблицы, которую необходимо удалить. Операция удаления таблицы в некоторых случаях требует определенного внимания. Невозможно удалить таблицу, если на нее с помощью ограничения целостности FOREIGN KEY ссылается другая таблица: попытка удаления таблицы «Дисциплины» вызовет сообщение об ошибке, так как на таблицу «Дисциплины» ссылается таблица «Учебный_ план». Например, в ответ на использование команды:

 

DROP TABLE Дисциплины

 

будет выдано сообщение об ошибке, гласящее, что невозможно удалить таблицу, поскольку есть ограничение целостности FOREIGN КЕY, ссылающееся на таблицу «Дисциплины».

 

7.4. Управление данными

 

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

 

7.4.1. Извлечение данных — команда SELECT

 

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

Чаще всего используется упрощенный вариант команды SELECT, имеющий следующий синтаксис:

 

SELECT <Список_ выбора>

[ INTO <Новая_ таблица> ]

FROM <Исходная_ таблица>

[ WHERE <Условие_ отбора> ]

[ GROUP BY <Ключи_ группировки> ] [ HAVING <Условие_ отбора> ]

[ ORDER BY <Ключи_ сортировки> [ ASC / DESC ] ]

 

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

 

SELECT                          UNION

INTO                               ORDER BY              

FROM                             COMPUTE  

WHERE                           FOR

GROUP BY                     OPTION

 

7.4.1.1. Раздел SELECT

 

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

При необходимости пользователь может указать для столбца, возвращаемого после выполнения запроса, произвольное имя. Такое имя называется псевдонимом (alias). В обычной ситуации назначение псевдонима необязательно, но в некоторых случаях требуется явное его указание. Наиболее часто это требуется при работе с разделом INTO, в котором каждый из возвращаемых столбцов должен иметь имя, и это имя должно быть уникально.

Помимо сказанного, с помощью раздела SELECT можно ограничить количество строк, которое будет включено в результат выборки. Синтаксис раздела SELECT следующий:

 

SELECT  / ALL  / DISTINCT ]

[ TOP n [ PERCENT ] [ WITH TIES ] ]

<Список_ выбора>

 

Рассмотрим назначение параметров.

 

Ключевые слова ALL / D STINCT

 

При указании ключевого слова ALL в результат запроса выводятся все строки, удовлетворяющие сформулированным условиям, тем самым разрешается включение в результат одинаковых строк (одинаковость строк определяется на уровне результата отбора, а не на уровне исходных данных). Параметр АLL используется по умолчанию.

Если в запросе SELECT указывается ключевое слово DISTINCT, то в результат выборки не будет включаться более одной повторяющейся строки. Таким образом, каждая возвращенная строка будет уникальной. Уникальность строки при этом определяется на уровне строк результата выборки, а не на уровне исходных данных. Если в результат выборки включаются два столбца, уникальность будет определяться по значениям обоих этих столбцов. В отдельности значения в первом и втором столбцах могут повторяться, но комбинация значений в обоих столбцах должна быть уникальна. Аналогичные правила действуют и в отношении большего количества столбцов.

Рассмотрим результат использования ключевых слов ALL и DISTINCT на примере выборки столбцов Семестр и Отчетность из таблицы «Учебный план» базы данных «Сессия» (рис. 7.4). Сначала выполним запрос с указанием ключевого слова ALL:

SELECT ALL Семестр, Отчетность FROM  Учебный_ план

 

 

 

Фрагмент результата представлен на рис. 7.4, а.

Теперь заменим ключевое слово ALL на DISTINCT:

 

SELECT  DISTINCT ALL Семестр, Отчетность

FROM  учебный_ план

 

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

 

Ключевое слово ТОР и [PERCENT]  [WITH TIES]

 

Использование ключевого слова TOP n, где n — числовое значение, позволяет отобрать в результат не все строки, а только n первых. При этом выбираются первые строки результата выборки, а не исходных данных. Поэтому набор строк в результате выборки при указании ключевого слова TOP может меняться в зависимости от порядка сортировки. Если в запросе используется раздел WHERE, то ключевое слово TOP работает с набором строк, возвращенных после применения логического условия, определенного в разделе WHERE.

Продемонстрируем использование ключевого слова TOP:

 

SELECT TOP 5 * FORM Студенты

 

В этом примере из таблицы «Студенты» базы данных «Сессия» было выбрано 5 первых строк (рис. 7.5):

 

 

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

SELECT TOP 10 PERCENT * FROM Студенты

Всего в таблице было 115 строк, следовательно, 10 % будет составлять 11,5 строк. В результате будут выданы 12 строк (рис. 7.6):

 

 

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

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

 

SELECT TOP 10 PERCENT * FROM Студенты ORDER BY Номер_ Группы

 

В результате выполнения такого запроса будут выданы следующие 12 строк (рис. 7.7).

При указании вместе с предложением ORDER BY ключевого слова WITH TIES в результат будут включены еще и строки, совпадающие  

 

 

по значению колонки сортировки с последними выведенными строками запроса SELECT TOP n [PERCENT].

Использование ключевого слова WITH TIES в предыдущем примере позволит обеспечить выдачу в ответ на запрос информации обо всех студентах первой по порядку группы:

 

SELECT TOP  10 PERCENT WITH TIES *

FROM  Студенты

ORDER BY Номер_ группы

 

После выполнения запроса получаем следующий результат (рис. 7.8).

 

Предложение < Список _выбора >

 

Синтаксис предложения <Список_ выбора> следующий:

<Список выбора>::=

{ <Имя таблицы> / <Псевдоним таблицы> }.*

{ <Имя столбца> / <Выражение> }

[ [ AS ] <Псевдоним столбца>]

<Псевдоним столбца> = <Выражение> }

[,...,n]

 

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

Если в результат не нужно включать все столбцы всех таблиц, то можно явно указать имя объекта, из которого необходимо выбрать все столбцы (<Имя_ таблицы>.* или <Псевдоним_ таблицы>.*).

Отдельный столбец таблицы в результат выборки включается явным указанием имени столбца (параметр <Имя_ столбца>). Столбец должен принадлежать одной из таблиц, указанных в разделе FROM. Если столбец с указанным именем имеется более чем в одном источнике данных, перечисленных в разделе FROM, то необходимо явно указать имя источника данных, к которому принадлежит столбец в формате <Имя_ таблицы>.<Имя_ столбца>. В противном случае будет выдано сообщение об ошибке.

Например, попробуем выбрать данные из столбца ID_ Дисциплина, который имеется в таблицах «Дисциплина» и «Учебный_ план»:

 

SELECT ID_Дисциплина, Наименование, Семестр.

FROM  Дисциплина, Учебный_ план

 

В ответ будет выдано сообщение об ошибке, указывающее на некорректное использование имени ID_Дисциплина.

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

 

SELECT Дисциплина. ID_Дисциплина, Наименование, Семестр

FROM Дисциплина, Учебный_ план

 

Столбцам, возвращаемым как результат выполнения запроса, могут быть присвоены псевдонимы. Псевдонимы позволяют изменить имя исходного столбца или поименовать столбец, содержимое которого получено как результат вычисления выражения. Имя псевдонима указывается с помощью параметра [AS] <Псевдоним столбца>. Ключевое слово AS необязательно при задании псевдонима.

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

Столбцы в результате выборки могут быть не только копией столбца одной из исходных таблиц, но и формироваться на основе вычисления выражения. Такой столбец в списке выбора задается с помощью конструкции <Выражение> [[AS] <Псевдоним_ столбца>]. Выражение при этом может содержать константы, имена столбцов, функции, а также их комбинации. Дополнительно столбцу, формируемому на основе вычисления выражения, можно присвоить псевдоним, указав его с помощью параметра [AS] <Псевдоним_ столбца>. По умолчанию вычисляемый столбец не имеет имени.

Другой способ формирования вычисляемого столбца состоит в использовании конструкции со знаком равенства: <Псевдоним_ столбца> = <Выражение>. Единственным отличием этого способа от предыдущего является необходимость обязательного задания псевдонима. В простейшем случае выражение является именем столбца, константой, переменной или функцией. Если в качестве выражения выступает имя столбца, то получаем еще один способ задания псевдонима для столбца.

Рассмотрим следующий пример. Пусть для таблицы «Студенты» необходимо построить запрос, представляющий фамилию, имя и отчество в одной колонке. Используя операцию конкатенации (сложения) символьных строк и значение ФИО в качестве псевдонима столбца, построим запрос:

 

SELECT ТОР 10 Фамилия + ' ' + имя + ' ' + Отчество as Фио, Номер_ Группы

FROM Студенты

 

Результат запроса показан на рис. 7.9.

 

 

7.4.1.2. Раздел FROM

 

С помощью раздела FROM определяются источники данных, с которыми будет работать запрос.

Синтаксис раздела FROM следующий:

 

FROM { <Источник_ данных> } [,...,n]

 

На первый взгляд конструкция раздела выглядит простой. Однако при ближайшем рассмотрении он оказывается довольно сложным. В основном работа с разделом FROM — это перечисление через запятую источников данных, с которыми должен работать запрос. Собственно источник данных указывается с помощью предложения <Источник данных>, синтаксис которого следующий:

<Источник_ данных>::= <имя_ таблицы> [ [AS) <псевдоним_ таблицы>] <связка_ таблиц>

С помощью параметра <имя_ таблицы> указывается имя обычной таблицы. Параметр <псевдоним_ таблицы> используется для присвоения таблице псевдонима, под которым на нее нужно будет ссылаться в запросе. Часто псевдонимы таблиц применяют, чтобы ссылку на нужную таблицу сделать более удобной и короткой. Например, если в запросе часто упоминается имя таблицы «Учебный_ план», то можно воспользоваться псевдонимом, например, tpl. Указание ключевого слова AS не является при этом обязательным.

Конструкция <связка_ таблиц> реализует один из наиболее сложных методов задания источника данных. С помощью нее можно связать данные двух и более таблиц в единый набор данных, указав критерии связывания. Синтаксис конструкции <связка_ таблиц> следующий:

<связка_ таблиц>::= <левая_ таблица> <тип_ связывания> <правая_ таблица>

ON <условие_ связывания>

Конструкция <тип_ связывания> описывает тип связывания двух таблиц. Исходная таблица указывается слева от конструкции <тип_ связывания> (<левая_ таблица>), а справа указывается зависимая таблица (<правая_ таблица>).

Общий синтаксис конструкции <тип_ связывания> следующий:

 

<тип_ связывания>::= [INNER / {{ [LEFT / RIGHT / FULL }

 [OUTER] } ] JOIN

 

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

Конструкция ON <условие_ связывания> задает логическое условие связывания двух таблиц. Допустимы операторы сравнения (например, =, <, >, <=, >=,!-, <>). Чаще всего используется оператор равенства, например:

 

ON Учебный_план. ID_Дисциплина = Дисциплины. ID_ Дисциплина

 

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

 

Ключевое слово INNER

 

Этот тип связи используется по умолчанию. Указание сочетания INNER JOIN равносильно указанию только ключевого слова JOIN. В качестве кандидатов на включение в результат запроса рассматриваются пары строк, удовлетворяющие критерию связывания в обеих таблицах. Затем строки из левой таблицы, для которых не имеется пары в связанной таблице, в результат не включаются. Также не включаются в результат и строки правой таблицы, для которых нет соответствующей строки в левой таблице.

В приведенном ниже примере выполняется выборка данных из таблиц «Дисциплины» и «Учебный_ план» с помощью запроса SELECT. Таблицы связаны по ключевому полю ID_ Дисциплина, имеющемуся в каждой из них. Для каждой строки таблицы «Учебный_ план» ищется строка с совпадающим значением поля ID_ Дисциплина в таблице «Дисциплины». Все строки таблицы «Учебный_ план», для которых нет строк с соответствующим значением поля ID_ Дисциплина, игнорируются и не включаются в конечный результат. Аналогично не включаются в результат все строки таблицы «Дисциплины», для которых нет соответствующей строки в таблице «Учебный план» (что, однако, невозможно для данного примера, так как столбец ID_ Дисциплина таблицы «Учебный_ план» связан внешним ключом со столбцом ID_ Дисциплина таблицы «Дисциплины»).

 

SELECT Наименование, Семестр, Количество_ часов

FROM  Учебный_ план INNER JOIN Дисциплины ON

Учебный_ план. ID_ Дисциплина Дисциплины. ID_ Дисциплина

WHERE Количество_ часов > 60

 

В результате выполнения этой команды будет возвращен набор

строк, изображенный на рис. 7.10.

 

 

 

Ключевое слово LEEP [ОUTER]

 

При использовании ключевого слова LEFT в результат будут включены все строки левой таблицы, независимо от того, есть для них соответствующая строка в правой таблице или нет. В случае отсутствия строки в правой таблице для столбцов правой таблицы, включенных в результат выборки, устанавливается значение NULL. В приведенном ниже примере иллюстрируется использование ключевого слова LEFT [OUTER] для выборки данных.

SELECT Наименование, Семестр, Отчетность

FROM  Дисциплины LEFT OUTER JOIN Учебный_ план ON

Учебный_ план.ID_ Дисциплина = Дисциплины. ID_ Дисциплина

WHERE {Наименование LIKE % информатик %)

 

Будет возвращен набор строк, изображенный на рис. 7.11. Как видно, по сравнению с использованием ключевого слова INNER, в результат запроса добавлена строка из таблицы «Дисциплины», которая удовлетворяет сформулированному условию отбора, но для которой не существует соответствующей строки в таблице «Учебный_ план». В столбцах Семестр и Отчетность (относящихся к таблице «Учебный_ план») для этих строк установлено значение NULL.

 

 

Ключевое слово RIGHT [ОUTER]

 

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

 

SELECT Отчетность, Семестр, Наименование

FROM Учебный_ план RIC»HT OUTER JOIN Дисциплины ОN

Учебный_ план. ID_ Дисциплина Дисциплины. ID_ Дисциплина

WHERE (Наименование LIKE '% информатик %')

 

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

 

 

 

Ключевое слово FULL (OUTER]

 

При использовании ключевого слова FULL в результат будут включены все строки как правой, так и левой таблицы. Применение ключевого слова FULL [OUTER] можно рассматривать как одновременное применение ключевых слов LEFT [OUTER] и RIGHT [OUTER].

 

7.4.1.3. Раздел WHERE

 

Раздел WHERE предназначен для наложения вертикальных фильтров на данные, обрабатываемые запросом. Другими словами, с помощью раздела WHERE можно сузить набор строк, включаемых в результат выборки. Для этого указывается логическое условие, от которого зависит, будет ли строка включена в выборку по запросу, или нет. Строка включается в результат выборки, только если логическое выражение возвращает значение TRUE.

В общем случае логическое выражение содержит имена столбцов таблиц, с которыми работает запрос. Для каждой строки, возвращенной запросом, вычисляется логическое выражение путем подстановки вместо имен столбцов конкретных значений из соответствующей строки. Если при вычислении выражения возвращается значение TRUE, то есть выражение истинно, то строка будет включена в конечный результат. В противном случае строка в результат не включается. При необходимости можно указать более одного логического выражения, объединив их с помощью логических операторов OR и AND.

Рассмотрим синтаксис раздела WHERE.

 

WHERE <условие_ отбора>

<имя столбца> {= / *= / = *} <имя_ столбца>

 

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

 

SELECT * FROM Дисциплины WHERE 3=5

 

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

 

SELECT Фамилия, Имя, Отчество, Номер_ Группы, Год_ поступления

FROM студенты

WHERE  Год_ Поступления < 2000

 

В результате будет возвращен список всех студентов, поступивших на факультет ранее 2000 г. (рис. 7.13).

Помимо операций сравнения (=, >, <, >=, <=) и логических операторов OR, AND, NOT при формировании условия отбора могут быть использованы дополнительные логические операторы, расширяющие возможности управления данными. Рассмотрим некоторые из этих операторов.

 

Оператор BETWEEN

 

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

 

<выражение> [NOT] BETWEEN <начало_ диапазона>

ANР <конец_ диапазона>

 

<Выражение> задает проверяемую величину, а аргументы <начало_ диапазона> и <конец_ диапазона> определяют возможные границы ее изменения. Использование оператора NOT совместно с оператором BETWEEN позволяет задать диапазон, вне которого может изменяться проверяемая величина.

При выполнении оператор BETWEEN преобразуется в конструкцию из двух операций сравнения:

 

(<выражение» = <начало_ диапазона>)

AND (<выражение> «= конец_ диапазона>)

 

Рассмотрим пример использования оператора BETWEEN:

 

SELECT Наименование, Семестр, Количество часов 

FROM Учебный_ план INNER JOIN

Дисциплины ON

Учебный_ план. ID_ Дисциплина = Дисциплины. ID_ Дисциплин

WNERE Количество часов BETWEEN 50 AND 100

 

В результате выполнения инструкции получим список дисциплин учебного плана с количеством часов от 50 до 100 (рис. 7.14).

 

 

Оператор IN

 

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

 

<выражение> [NOT] IN (<выражение1>,...,,<выражением>)

 

<Выражение> указывает проверяемую величину, а аргументы <выражение1>,..., <выражениеN> задают перечислением через запятую набор значений, которые может принимать проверяемая величина. Ключевое слово N0T выполняет логическое отрицание.

Рассмотрим пример применения оператора IN.

 

SELECT Наименование, Семестр, Количество_ часов

FROM Учебный_ план INNER JOIN

Дисциплины ON

Учебный_ план. ID_ Дисциплина = Дисциплины, ID_ Дисциплина

WHERE Наименование IN {‘Английский язык’, ‘Физическая культура’}

 

В результате выполнения инструкции получим строки учебного плана для дисциплин «Английский язык» и «Физическая культура» (рис. 7.15).

 

 

Оператор LIKE

 

С помощью оператора LIKE можно выполнять сравнение выражения символьного типа с заданным шаблоном. Синтаксис оператора следующий:

 

<Символьное выражение> [NOT] LIKE <образец>

 

<Образец> задает символьный шаблон для сравнения и заключается в кавычки. Шаблон может содержать символы-разделители.

Допускается использование следующих символов-разделителей (табл. 7.2):

 

 

Рассмотрим пример использования оператора:

 

SELECT Фамилия, Имя, Отчество, должность

FROM Кадровый_ состав

WHERE Должность LIKE '% пр %'

 

Результат выполнения инструкции показан на рис. 7.16. ( Применение образца для значения столбца Должность в данном случае позволило отобрать строки со значениями «Ст. преп.» и «Проф».

 

 

 

Связывание таблиц

 

Раздел WHERE может быть использован для связывания таблиц. В этом случае условие связывания должно присоединяться к логическому выражению с помощью логической операции AND (логическое умножение).

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

           

SELECT  Наименование, Семестр, Количество _часов

FROM Учебный_ план, INNER 7011 Дисциплины ON

Учебный_ план. ID_ Дисциплина Дисциплины ID_ Дисциплина

WHERE (Количество_ часов > 60) AND (Семестр = 1)

 

Перенесём условие, связывания в. логическое выражение:

SELECT Наименование, Семестр, Количество_ часов

FROM Учебный_ план, Дисциплины

WHERE (Учебный_ план.ID_ Дисциплина

               Дисциплины, ID_ Дисциплина) AND

              (Количество_ часов > 60) AND (Семестр =1)

 

Результат выполнения обоих запросов одинаков (рис. 7.17).

 

 

Использование только условия связывания в разделе WHERE аналогично связыванию ключевым словом INNER в разделе FROM. Например, результаты следующих запросов одинаковы (рис. 7.18):

 

SELECT ТOP 10 Наименование, Семестр, Количество_ часов

FROM  Учебный_ план Дисциплины.

WHERE (Учебный_ план. ID_Дисциплина

                           Дисциплины. ID_ Дисциплина)

 

SELECT TОP 10 Наименование, Семестр, Количество_ часов

FROM Учебный_ план INNER JOIN Дисциплины ON

            Учебный_ план. ID_ Дисциплина Дисциплины. ID_ Дисциплина

 

Содержимое обеих таблиц можно посмотреть с помощью следующих запросов:

 

SELECT  TOP 10 *

FROM Учебный_ план

 

Результат примера — на рис. 7.19.

 

 

 

 

SELECT TOP 10 *

FROM  Дисциплины

 

Результат примера — на рис. 7.20.

 

 

 

Аналогом использования ключевых слов 1.EFT OUTER JOIN является указание в разделе WHERE условия с помощью символов *=. Приведенные примеры возвращают одинаковый набор данных:

 

SELECT Наименование, Семестр, Отчетность

FROM  Дисциплины LEFT OUTER JDXN Учебный_ план ON

Учебный план. ID_ Дисциплина Дисциплины. ID_ Дисциплина

WHERE (Наименование KXKE '%информатик %')

 

SELECT. Наименование, Семестр, Отчетность

FROM  Дисциплины, Учебный_ план

WHERE (Учебный план. ID_ Дисциплина *=

               Дисциплины. ID_ Дисциплина)

AND (Наименование. LIKE, '% информатик %')

 

Аналогом использования ключевых слов RIGHT OUTER JOIN является указание условия с помощью символов =*. Приведенные примеры возвращают одинаковый набор данных:

 

SELECT Отчетность, Семестр, Наименование

FROM Учебный_ план RIGHT OUTER  JOIN  Дисциплины  ON

             Учебный план. ID_ Дисциплина =  Дисциплины. ID_ Дисциплина

 

WHERE (Наименование LXKE '%информатик %').

SELECT Отчетность, Семестр, Наименование 

FROM Учебный_ план, Дисциплины

WHERE (Учебный план. ID_Дисциплина =*

                           Дисциплины. ID_ Дисциплина)

AND (Наименование LIKE '% информатик % )  

 

Следует отметить, что при использовании специальных ключевых ядов INNER / {LEFT / RIGHT / FULL } [OUTER ] данные представляются по-иному, чем при указании условия WHERE. Скорость выполнения запроса в первом случае оказывается выше, поскольку организуется связывание данных, тогда как при использовании конструкции WHERE происходит их фильтрация. При выполнении запросов на небольших наборах данных это не играет существенной роли, поэтому удобнее обращаться к конструкции WHERE из-за наглядности и простоты синтаксиса этого варианта, но при построении сложных запросов, выполняющих обработку тысяч строк, все же лучше использовать конструкцию связывания.

 

7.4.1.4. Раздел ORDER ВY

 

Раздел ORDER BY предназначен для упорядочения набора данных, возвращаемого после выполнения запроса. Рассмотрим пример упорядочения данных таблицы «Дисциплины» по столбцу Наименование в алфавитном порядке:

 

COLLECT TOP  10 *

FROM  Дисциплины

ORDER BY Наименование

 

Результат сортировки представлен на рис. 7.21.

 

 

Полный синтаксис раздела ORDER BY следующий:

ORDER BY {<условие_ сортировки> [ ASC ~ DESC ] } [,...,n]

 

Параметр <условие сортировки> требует задания выражения, вВ2 соответствии с которым будет осуществляться сортировка строк.

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

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

Раздел ORDER BY разрешает использование ключевых слов ASC и DESC с помощью которых можно явно указать, каким образом следует упорядочить строки. При указании ключевого слова ASC данные будут отсортированы по возрастанию. Если необходимо отсортировать данные по убыванию, указывается ключевое слово DESC. По умолчанию используется сортировка по возрастанию.

Данные можно отсортировать по нескольким столбцам. Для этого необходимо ввести имена столбцов через запятую по порядку сортировки. Сначала данные сортируются по столбцу, имя котороro было указано в разделе ORDER BY первым. Затем, если имеется множество строк с одинаковыми значениями в первом столбце, выполняется дополнительная сортировка этих строк по второму столбцу (внутри группы с одинаковым значением в первом столбце) и т. д.

Приведем пример сортировки по двум столбцам:

SELECT ТОР 20 Наименование, Семестр, Количество_ часов

FROM     Учебный_ план, Дисциплины

WHERE (Учебный план. ID_ Дисциплина =

                            Дисциплины. ID_ Дисциплина)

ORDER BY Семестр, Количество_ часов DESC

 

Возвращаемый набор строк показан на рис. 7.22.

 

Добавим в раздел SELECT столбец Отчетность и получим пример сортировки по трем столбцам:

 

SELECT TOP 20 Наименование, Семестр, Количество_ часов, Отчетность

FROM     Учебный_ план, Дисциплины

WHERE (Учебный план. ID_ Дисциплина =

                           Дисциплины. ID_ Дисциплина)

ORDER BY Семестр, Отчетность, Количество часов

 

Будет возвращен следующий набор строк, который показан на рис. 7.23.

 

 

 

7.4.1.5. Раздел GROUP BY

 

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

Синтаксис раздела GROUP BY следующий:

 

GROUP BY [ALL] <условие_ группировки> [,...,n]

При использовании группировки (раздела GROUP BY) на раздел SELECT накладываются дополнительные ограничения. В непосредственном виде разрешается указание только имен столбцов, перечисленных в разделе GROUP BY, то есть тех столбцов, по которым осуществляется группировка. Значения других столбцов не могут быть выведены в непосредственном виде, так как обычно каждая группа содержит множество строк, а в результате выборки для каждой группы должно быть указано единственное значение. Поэтому, чтобы вывести значения столбцов, не задающих критерии группировки, необходимо использовать функции агрегирования.

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

Функции агрегирования позволяют выполнять статистическую обработку данных, подсчитывая количество, сумму, среднее значение и другие величины для всего набора данных. Во многих функциях агрегирования допускается использование ключевых слов ALL и DISTINCT. Ключевое слово АLL выполняет агрегирование всех строк исходного набора данных. При указании ключевого слова DISTINCT будет выполняться агрегирование только уникальных строк. Все повторяющиеся строки будут проигнорированы. По умолчанию выполняется агрегирование всех строк, то есть используется ключевое слово ALL. Далее приведены описания некоторых функций агрегирования.

 

AVGO

 

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

 

AVG ([ALL / DISTINCT] <выражение>)

 

При выполнении группировки (GROUP BY) вычисляет среднее значение для каждой группы. Если группировка не используется, то вычисляет среднее по всему столбцу. Например;

 

SELECT AVG (Количество_ часов) FROM Учебный_план

 

Результат запроса:

 _ _ _ _ _ _ _ _ _ _

41

(1 row(s) affected)

 

Теперь рассмотрим пример использования функции AVG совместно с разделом GROUP BY при выполнении группировки по столбцу Семестр:

SELECT Семестр, AVG (количество_ часов)

FROM   Учебный_ план

GROUP BY Семестр

 

Результат:

Семестр 

_ _ _ _ _ _ _ _ _ _ _ _        _ _ _ _ _ _ _ _ _ _ _

 

 

1                            50

2                            54

3                            46

4                            39

5                            37

6                            27

7                            34

8                             44

9                             32

(9 row(s) affected)

COUNT()

Функция подсчитывает количество строк в группе (при выполнении группировки) или количество строк результата запроса. Синтаксис функции COUNT следующий:

 

COUNT({[ALL / DISTINCT] <выражение>] / *})

 

Параметр <выражение> в простейшем случае представляет собой имя столбца. Если обрабатываемая строка в соответствующем столбце содержит значение не NULL, то счетчик будет увеличен на единицу. Указание символа (*) предписывает считать общее количество строк независимо от того, содержат они значения NULI, или нет.

 

Пример использования функции COUNT

 

SELECT COUNT(*) AS 'Всего сотрудников',

СOUНТ(Телефон) AS 'С домашним телефоном'

FROM Кадровый_ состав

 

Этот запрос подсчитывает общее количество строк в таблицей также количество ненулевых значений в столбце Телефон.

 

Результат выполнения запроса:

 

Всего сотрудников С домашним телефоном

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

14

(l row (s) affected

Warning: Null value eliminated from aggregate

 

Пример использования функции COUNT() при выполнении группировки:

 

SELECT Должность, COUNT(*)

FROM Кадровый_ состав

GROUP BY Должность

 

Данный запрос возвращает количество строк в каждой группе столбца Должность:

 

Должность

 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _   _ _ _ _ _ _ _ _ _ _ _

 

Ассистент                                   3

Доцент                                        4           

Зав.каф.                                      2

Проф.                                          3

Ст.преп.                                      2

(5 row(s) affected)

МАХ ()

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

 

MAX ([ALL / DISTINCT] <выражение>)

 

Пример использования функции:

 

SELECT МАХ (Количество часов),

    МАХ (количество_ часов/2)

FROM  Учебный_ план  

 

Результат выполнения запроса:

_ _ _ _ _ _ _ _ _    _ _ _ _ _ _ _ _ _ _

            140                             70

(1 row(s) affected)

MIN ()

 

Функция возвращает минимальное значение в указанном диапазоне. Синтаксис функции следующий:

 

MIN([ALL I DISTINCT] <выражение>)

 

Пример использования функции:

 

SELECT МIN (Количество_ часов)

FROM Учебный_ план

 

Результат выполнения запроса:

_ _ _ _ _ _ _ _ _

 

12 (l row (s) affected

 

SUM ()

 

Функция выполняет обычное суммирование значений в указанном диапазоне. В качестве такого диапазона может рассматриваться группа или весь набор строк (без использования раздела GROUP BY).

Синтаксис функции следующий:

 

SUM([ALL / DISTINCT] <выражение>)

В качестве примера просто суммируем значения в столбце Количество_ часов:

 

SELECT   SUM (Количество_ часов), COUNT(*),

                 SUM (Количество_ часов) /COUNT (*), AVG (Количество_ часов)

FROM Учебный_ план

 

Результат выполнения запроса:

 _ _ _ _ _ _ _ _   _ _ _ _ _ _ _ _   _ _ _ _ _ _ _ _   _ _ _ _ _ _ _ _ 

             694                    89                      41                      41

 

(1 row(s) affected)

 

Теперь вновь обратимся к разделу SELECT и приведем пример группировки значений таблицы «Учебный план». Произведем группировку строк по семестрам (столбец Семестр) и подсчитаем общую нагрузку в часах за каждый семестр:

 

SELECT Семестр, SUM (количество_ часов) АЯ 'Нагрузка'

FROM (Учебный_ план]

GROUP BY Семестр

 

В результате выполнения запроса получен результат, показанный на рис. 7.24.

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

 

 

 

Рассмотрим теперь запрос, подсчитывающий количество экзаменов в каждом семестре:

 

 

SELECT Семестр, COUNT( *.) AS Экзамены

FROM [Учебный_ план]

WHERE  отчетность =  Э

GROUP BY Семестр

 

Результат выполнения запроса показан на рис. 7.25.

Предложение группировки может содержать ключевое слово ALL. Назначение этого слова следующее. Нередко при выполнении группировки используется раздел WHERE, то есть группировка должна выполняться не над всеми строками, а лишь над определений частью строк. Результатом такого подхода может явиться то, что одна или более групп не будет содержать ни одной строки. Если группа не содержит ни одной строки, то по умолчанию эта группа не включается в результат выборки. Однако в некоторых ситуациях все же требуется, чтобы были выведены все группы, в том числе и не содержащие ни одной строки. Для этого и необходимо указывать в разделе GROUP BY ключевое слово АLL . В этом случае будет выводиться список всех групп, но для групп, не содержащих строк, не будут выполняться функции агрегирования.

Рассмотрим это на примере. Для начала выполним группировку без использования ключевого слова ALL, но с вертикальной фильтрацией (с помощью раздела WHERE) — в таблице «Учебный_план» посчитаем для каждого семестра количество дисциплин с нагрузкой более 60 часов:

 

SELECT Семестр, COUNT(*) AS 'Количество часов > 60'

FROM  [Учебный_ план]

WHERE Количество_ часов > 60

GROUP BY Семестр

 

Результат запроса показан на рис. 7.26.

В полученной таблице отсутствуют данные для пятого, шестого и седьмого семестров. Это означает, что дисциплин, удовлетворяющих поставленному условию, в семестрах нет.

Добавим в раздел GROUP BY ключевое слово ALL:

 

SELECT Семестр, COUNT(*) AS 'Количество часов > 60'

FROM [Учебный_ план]

WHERE Количеств_ часов > 60

GROUP BY ALL Семестр

 

Будет получен результат, показанный на рис. 7.27.

 

 

 

 

7.4.1.6. Раздел СОМРUТЕ

 

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

Синтаксис раздела COMPUTE следующий:

COMPUTE <Функция_ агрегирования>(<столбец_ агрегирования>)][,..., n] [ BY <столбец_ группировки> [,...,n ] ]

Аргумент <столбец_ агрегирования> должен содержать имя. агрегируемого столбца. Этот столбец должен быть включен в результат выборки. Ключевое слово BY указывает, что результат вычисления следует сгруппировать. Следующий за этим ключевым словом аргумент <столбец_ группировки> содержит имя столбца, по которому будет производиться группировка. Результат необходимо предварительно отсортировать по этому столбцу, то есть столбец должен быть указан в разделе ORDER BY. Приведем простой пример применения раздела COMPUTE для вычисления количества дисциплин, читаемых в семестре, и общей суммы( часов:

 

SELECT Наименованием. Семестр Количество_ часов,

FROM Учебный_ план, Дисциплины

WHERE (Учебный_ план. ID_ Дисциплина =

                           Дисциплины. ID_ Дисциплина) AND (Семестр = 2)

COMPUTE SUM(Количество_ часов), COUNT(Семестр)

 

Будет получен следующий результат:

 

 

 

Рассмотрим пример группировки при использовании раздела COMPUTE (составление списков групп и вычисление количества студентов в группе):

 

SELECT Фамилия, Имя, Отчество; Номер_ Группы

FROM Студенты

ORDER BY Номер_ группы

COMPUTE COUNT (Номер_ Группы) BY Номер_ Группы

 

 

7.4.1.7. Раздел UNION

 

Раздел UNION служит для объединения результатов выборки, возвращаемых двумя и более запросами.

 

Рассмотрим синтаксис раздела UNION:

 

<Спецификация_ Запроса_1>

UNION [АLL]

<Спецификация_ Запроса_2>

 …

[UNION [АLL] ]

<Спецификация_ Запроса_n>

 

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

запросы должны возвращать одинаковый набор столбцов (причем необходимо гарантировать одинаковый порядок следования столбцов в каждом из запросов);

типы данных соответствующих столбцов второго и последующих запросов должны поддерживать неявное преобразование или совпадать с типом данных столбцов первого запроса;

ни один из результатов не может быть отсортирован с помощью раздела ORDER BY (однако общий результат может быть отсортирован, как будет показано ниже).

Указание ключевого слова ALL предписывает включать в результат повторяющиеся строки. По умолчанию повторяющиеся строки в результат не включаются.

Продемонстрируем применение раздела UNION. Рассмотрим таблицы «Кадровый Состав» и «Студенты» и попробуем построить, например, общий список и учащихся, и преподавателей, номер телефона которых начинается на 120.

 

Сначала построим запрос для таблицы «Кадровый Состав»:

 

SELECT Фамилия, Имя, Отчество, Должность, Телефон

FROM Кадровый_ состав

WHERE Телефон LIKE  '120%'

 

Результат действия запроса показан на рис. 7.28.

 

 

Затем построим запрос для таблицы «Студенты».

 

SELECT Фамилия, Имя, Отчество, Телефон

FROM Студенты

WHERE Телефон LIKE '120 %'

 

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

 

Теперь объединим два запроса, чтобы в результате получить единую таблицу. Заметим, что столбец Должность отсутствует в таблице «Студенты». Чтобы в общей таблице выделить студентов, введем в запрос для таблицы «Студенты» столбец, содержащий строку — константу «Студент» для всех записей, и объединим два запроса с помощью раздела UNION:

 

SELECT Фамилия, имя, Отчество, Должность, Телефон

FROM кадровый_ состав

WHERE Телефон LIKE '120 %'

UNION

SELECT, Фамилия, имя, Отчество, Новый_ столбец = 'Студент',

     Телефон

FROM Студенты

WHERE Телефон LIKE '120 %'

 

После выполнения запроса получим таблицу, показанную на рис. 7.30.

 

 

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

Упорядочим полученный список по алфавиту, добавив предложение ORDER BY:

 

SELECT Фамилия, имя, Отчество, должность, Телефон

FROM Кадровый_ состав

WHERE Телефон LIKE '120 %'

UNION

SELECT Фамилия, имя. Отчество, Новый_ столбец = Студент

                Телефон

FROM Студенты

WHERE Телефон LIKE '120%'

ORDER BY Фамилия

 

Результат показан на рис. 7.31.