Материал: Реляционная алгебра. Основы SQL

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

·        Значения NULL можно найти и идентифицировать предложением IS NULL.

·        Значения NULL не равны друг другу. Поэтому нельзя определить, соответствует ли какое-нибудь значение NULL другому значению в базе данных. Тем не менее, предложение DISTINCT воспринимает все NULL одинаково для удаления повторяющихся строк.

·        При сортировке значения NULL будут либо больше, либо меньше любых значений, в зависимости от СУБД.

·        Значения NULL размножаются в процессе вычислений.

·        Итоговые функции игнорируют NULL в процессе вычислений.

·        При группировке предложением GROUP BY все значения NULL будут помещены в одну группу.

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

1.      Операторы определения данных - определяют содержимое реляционной базы данных в виде таблиц и представлений;

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

.        Операторы управления данными - ограничивают доступ к данным.

2.2 Создание и обслуживание таблиц

Базовые отношения создаются оператором CREATE TABLE. Следует указать: название таблицы, название столбцов, тип данных для столбцов. Рекомендуется описание каждого столбца начинать с новой строки (не обязательно). Ограничения на элементы столбца:

·        NOT NULL - не разрешает присваивать значения NULL;

·        DEFAULT - задает значения по умолчанию;

·        PRIMARY KEY - задает первичный ключ для таблицы;

·        FOREIGN KEY - задает внешний ключ;

·        UNIQUE - не позволяет вводить в столбец повторяющиеся значения;

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

Пример:

CREATE TABLE Проекты

(Пр№ CHAR(3)  NOT NULL PRIMARY KEY,

Имя_Пр CHAR(15)     UNUQUE,

Гор CHAR(20));

Внешний ключ создается ключевыми словами FOREIGN KEY или REFERENCES в строке описания столбца в команде CREATE TABLE:

CREATE TABLE Поставки

(П№ CHAR(3)    NOT NULL REFERENCE Поставщики,

Пр№ CHAR(5)   NOT NULL REFERENCE Проекты,

Д№ CHAR(3)               NOT NULL REFERENCE Детали,

Кол INTEGER DEFAULT ′???′,KEY (П№ , Пр№, Д№));

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

реляционный запрос sql данные

[CONSTRAINT имя_ограничения] REFERENCES имя_табл (имя_столбца).

Сохранение целостности данных по ссылкам организуется при помощи операторов RESTRICT, CASCADE и SET NULL:

CREATE TABLE Поставки

(П№ CHAR(3)    REFERENCE Поставщики ON UPDATE CASCADE

ON DELETE SET NULL,

Пр№ CHAR(5)   NOT NULL REFERENCE Проекты RESTRICT,

Д№ CHAR(3)               NOT NULL REFERENCE Детали,

Кол INTEGER DEFAULT ′???′,KEY (П№ , Пр№, Д№));

Сейчас при изменении П№ в таблице Поставщики будет изменен и П№ в таблице Поставки, а при его удалении в таблицу Поставки будет внесено значение NULL. Оператор RESTRICT устанавливает, что в таблице Проекты, на которую ссылается внешний ключ, нельзя изменять значение первичного ключа, если в ссылающейся таблице Поставки существует строка с этим значением.

Для обеспечения целостности атрибута предназначен оператор CHECK:

CREATE TABLE Детали

         (Д№ CHAR(3)     NOT NULL PRIMARY KEY,

         Имя_Д CHAR(15)        UNUQUE,

         Цвет CHAR(10) CHECK (Цвет='Черный' OR Цвет ='Красный'           OR Цвет                             ='Желтый' OR Цвет ='???'),

         Вес INTEGER,

         Гор CHAR(20));

Ограничения на данные можно организовать и созданием доменов:

CREATE DOMAIN Color CHAR(10) CHECK (Color='Черный' OR Color='Красный'                    OR Color='Желтый' OR Color='???');

Тогда ограничение на поле «Цвет» вводится следующим образом:

CREATE TABLE Детали

         (Д№ CHAR(3)...,

         Цвет Сolor,

         …);

Внести изменение в структуру таблицы можно оператором ALTER с указанием характера изменения - ADD, MODIFY или DELETE:

ALTER TABLE Детали ADD [Дата изготовления] DATE;

Для удаления объектов базы данных используется оператор DROP:

DROP TABLE Детали;

Доступ к данным в многопользовательской системе регулируется с помощью операторов GRANT и REVOKE. Указываются вид полномочий (SELECT, UPDATE, ALL), таблица или представление, по отношению к которым создается полномочие, и имя пользователя:

GRANT UPDATE ON Поставки TO USER1;

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

GRANT SELECT ON Поставки TO PUBLIC;

Для повышения безопасности полезно открывать доступ к представлениям, а не базовым отношениям.

Оператор REVOKE аннулирует полномочия:

REVOKE UPDATE ON Поставки FROM USER1;

Если аннулировать полномочия через ...FROM PUBLIC, то полномочий лишаются все пользователи.

2.3 Запрос на выборку

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

SELECT [ALL/DISTINCT] [TOP n [PERCENT]] список полейимена таблиц

[WHERE условие отбора]

[ORDER BY столбцы сортировки [ASC/DESC]];

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

·        ALL - включает все строки, соответствующие указанным далее условиям отбора;

·        DISTINCT (ключевое слово из ANSI SQL-92) - исключает строки с повторяющимися данными на основе только данных результирующего набора записей;

Необязательный параметр TOP n [PERCENT] ограничивает количество записей в результирующей таблице первыми n или n% набора.

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

WHERE определяет условие для отбора записей и реализует реляционную операцию выборки. Условие задается текстовым оператором типа LIKE для текстовых полей или числовыми операторами типа >, <, =, < >, >=, BETWEEN для числовых полей. Если WHERE не использован, то запрос возвратит все записи, удовлетворяющие критерию SELECT.

Модификатор ORDER BY определяет порядок сортировки записей в созданной таблице. Ключевыми словами ASC и DESC можно определить сортировку по возрастанию или убыванию соответственно.

Пример инструкции запроса на выборку:


Результатом выполнения запроса будет новая таблица, содержащая два столбца Имя_Д и Вес и множество строк, удовлетворяющих условию Вес>500, отсортированных по убыванию веса.

2.4 Статистические функции

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

SELECT статистическая функция (имя поля) AS заголовок поля [, список полей]

FROM имена таблиц

[WHERE условие отбора]

GROUP BY условие группировки

[HAVING условие для результата]

[ORDER BY столбцы сортировки];

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

Ключевое слово AS определяет заголовок столбца результирующего набора записей. GROUP BY определяет столбец, по значениям которого записи объединяются в группы, к которым применяется статистическая функция и возвращает одно значение. HAVING позволяет ввести одно или несколько условий, налагаемых на значение результирующего столбца, полученного в результате группировки и применения статистической функции.

Примеры команд SQL, применяющих статистические функции:

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

SUM(Поставки.Кол) FROM Поставки;

В предложении SELECT можно указывать несколько скалярных выражений:

SELECT MIN(Кол), MAX(Кол), SUM(Кол), AVG(Кол) FROM Поставки;

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

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

SELECT COUNT (*) AS Кол_кортежей FROM Поставки;

В результате получим таблицу из одной строки с заголовком “Кол_кортежей”.

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

SELECT Пк.ПN, SUM(Пк.Кол)Поставки AS ПкBY Пк.ПN;

(Здесь показан пример использования псевдонимов, которые вводятся в предложении FROM при помощи оператора AS (его можно и пропустить). Использование псевдонимов упрощает запись команд. Они также используются и для организации некоторых запросов.)

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

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

SELECT Пк.ПN, SUM (Пк.Кол)Поставки AS ПкBY Пк.ПNCOUNT(*)>2;

Предложение HAVING COUNT(*)>2 выделяет только те группы, в которых количество кортежей больше 2 (поставщики выполнили более 2 поставок).

2.5 Создание соединений

Реляционная операция произведения двух отношений TIMES реализуется в SQL, если указать имена этих отношений в предложении FROM:

* FROM Проекты, Поставки;

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

* Проекты, ПоставкиПроекты.ПрN=Поставки.ПрN;

Подобным образом можно соединить произвольное число отношений:

SELECT DISTINCT П.Имя_П, Д.Имя_Д, Пр.Имя_Пр, Пк.КолПоставщики П, Детали Д, Проекты Пр, Поставки Пк

WHERE Д.ДN=Пк.ДN

AND П.ПN=Пк.ПN

AND Пр.ПрN=Пк.ПрN

AND Пк.Кол>500;

Такое соединение выполняется с конца. Сначала из таблицы Поставки удаляются строки со значениями поля Кол менее или равным 500. Затем соединяются кортежи отношения Поставки с теми кортежами отношения Проекты, у которых совпадают значения атрибута ПрN. После этого кортежи созданного представления соединяются с кортежами отношения Поставщик, у которых совпадают значения атрибута ПN. Далее, полученные кортежи соединяются с кортежами отношения Детали, у которых совпадают значения атрибута ДN.

Для организации соединений между таблицами и их объединения может быть использован и оператор JOIN…ON, который указывает на подключаемую таблицу и связь между полями:

SELECT список полей

FROM имя таблицы {INNER/LEFT/RIGHT} JOIN связанная таблица

ON условие связи

[WHERE условие отбора]

[ORDER BY столбцы сортировки];

В приведенной инструкции показано, как оператор JOIN окружен именами двух связываемых таблиц, причем вместо правого имени может использоваться повторно конструкция JOIN … ON, называемая вложенной: [имя таблицы {INNER/LEFT/RIGHT} JOIN связанная таблица ON условие связи]. В этом случае первая таблица соединяется с соединением второй и третьей таблиц. Инструкция SQL может содержать набор нескольких вложенных конструкций JOIN … ON. Их число обычно равно общему количеству таблиц, включенных в запрос, минус один. Перед оператором JOIN должен быть указан тип соединения:

·        INNER - соединяет записи из двух таблиц, если связующие поля этих таблиц содержат одинаковые значения;

·        LEFT (RIGHT) - соединяет записи исходных таблиц, причем левое внешнее соединение включает все записи из первой (левой) таблицы и присоединяет к ним записи из второй таблицы, если связующие поля содержат одинаковые значения. Правое внешнее соединение включает все записи из второй (правой) таблицы и присоединяет к ним записи из первой таблицы, если связующие поля содержат одинаковые значения.

Конструкция ON условие связи позволяет описать два поля и связь между ними (одно поле в таблице связанная таблица, второе - в таблице имя таблицы). В выражении условие связи присутствует оператор сравнения значений полей, который возвращает значения True или False. Если значение выражения True, то объединенная запись включается в результирующий набор.

Пример инструкции на соединение отношений Проекты и Поставки базы данных Проекты-Поставщики-Детали по значениям полей ПрN, присутствующим в обоих отношениях:

Источник: https://www.bibliofond.ru/view.aspx?id=869454