Прикладной системный анализ Лабораторная работа №3

advertisement
Прикладной системный анализ
Лабораторная работа №3
Создание хранилища данных в реляционной СУБД
Создать и заполнить хранилище данных для своего варианта задания из
Лабораторной работы №1. Написать SQL-запросы для реализации функций
основных бизнес-пользователей.
Основные сведения
Язык SQL
Первый международный стандарт языка SQL был принят в 1989 г. (SQL/89). В конце 1992
г. Был принят новый международный стандарт SQL/92. “Родным” языком Microsoft SQL
Server является язык Transact-SQL (T-SQL), являющийся диалектом стандартного языка
SQL. T-SQL поддерживает большинство возможностей языков SQL/89 и SQL/92, а также
ряд расширений, увеличивающих возможность программирования и гибкость языка. В
частности, в язык T-SQL добавлены конструкции для задания последовательности
операций управления в программе (например, if и while), локальных переменных и других
конструкций, позволяющих писать более сложные запросы и строить программные
объекты, хранящиеся на сервере, в том числе процедуры и триггеры.
Язык SQL включает следующие языки:
o
o
язык определения данных (Data Definition Language или DDL), предназначенный
для добавления, модификации и удаления данных в таблицах;
язык модификации данных (Data Modification Language или DML),
предназначенный для добавления, модификации и удаления данных в таблицах.
В синтаксических конструкциях при описании языка будут использоваться следующие
соглашения. Нетерминальные элементы заключаются в угловые скобки <>.
Необязательная конструкция заключается в квадратные скобки []. Запись вида {A}…
означает повторение конструкции А произвольное число раз (включая нулевое).
Вертикальные разделители | читаются как “ИЛИ” и служат для выбора одной из
конструкций, заключенных в скобки.
Создание таблицы
Оператор создания таблицы имеет следующий синтаксис:
<оператор создания таблицы>::= CREATE TABLE <имя таблицы> (<элемент
таблицы>[{,<элемент таблицы>}...])
<элемент таблицы>::=<определение
целостности>
столбца>
|
<определение
ограничения
Каждая таблица БД имеет простое и квалифицированное (уточненное) имена. В качестве
квалификатора имени выступает “идентификатор полномочий”.
Квалифицированное имя таблицы имеет вид: <идентификатор полномочий>.<простое
имя>
Определение столбца
<определение столбца>::= <имя столбца><тип
[{<ограничение целостности столбца>}...]
данных>[<раздел
умолчания>]
<раздел умолчания>::= DEFAULT {<литерал> | USER | NULL}
<ограничение целостности столбца>::= NOT NULL[<спецификация уникальности>] |
<спецификация ссылок> | CHECK (<условие поиска>)
В разделе умолчания указывается значение, которое должно быть помещено в строку,
заносимую в данную таблицу, если значение данного столбца явно не указано. Значение
по умолчанию может быть: 1) литеральная константа, соответствующая типу столбца; 2)
символьная строка, содержащая имя текущего пользователя (USER); 3) неопределенное
значение (NULL).
Если значение столбца по умолчанию не специфицировано, и в разделе ограничений
целостности столбца указано NOT NULL (т.е. наличие неопределенных значений
запрещено), то попытка занести в таблицу строку с неспецифицированным значением
данного столбца приведет к ошибке.
Если ограничение NOT NULL не указано, и раздел умолчаний отсутствует, то неявно
порождается раздел умолчаний DEFAULT NULL.
Ограничения целостности столбца в принципе сходны с ограничениями целостности
таблицы и рассмотрены ниже.
Определение ограничений целостности таблицы
Синтаксис для определения ограничений целостности таблицы представлен следующими
правилами:
<определение ограничений целостности таблицы>::= <определение ограничения
уникальности> | <определение ограничения по ссылкам> | <определение проверочного
ограничения>
<определение ограничения уникальности>::=<спецификация уникальности>(<список
столбцов>)
<спецификация уникальности>::= UNIQUE | PRIMARY KEY
<список столбцов>::= <имя столбца>[{,<имя столбца>}..]
<определение ограничения по ссылкам>::=
столбцы>)<спецификация ссылок>
FOREIGN
KEY
(<ссылающиеся
<спецификация ссылок>::== REFERENCES <ссылаемая таблица и столбцы>
<ссылаемая таблица и столбцы>::=<имя таблицы>[(<список столбцов>)]
<определение проверочного ограничения>::= CHECK (<условие поиска>)
Действие ограничения уникальности состоит в том, что в таблице не допускается
появление двух или более строк, значения столбцов уникальности которых совпадают.
Среди ограничений уникальности таблицы не должно быть более одного определения
первичного ключа (ограничения уникальности с ключевым словом PRIMARY KEY).
Ограничения по ссылкам в данной работе не используются, и поэтому подробно не
рассматриваются.
Проверочное ограничение специфицирует условие, которому должен удовлетворять в
отдельности каждая строка таблицы. Это условие не должно содержать подзапросов,
спецификаций агрегатных функций, а также ссылок на внешние переменные или
параметров. В него могут входить только имена столбцов данной таблицы и литеральные
константы.
Примеры создания таблиц с ограничениями:
CREATE TABLE employee
(emp_id INTEGER CONSTRAINT p1 PRIMARY KEY,
fname CHAR(20) NOT NULL,
minitial CHAR(1) NULL,
lname VARCHAR(30) NOT NULL,
job_id SMALLINT NOT NULL DEFAULT 1
REFERENCES jobs(job_id)
CREATE TABLE inventory
(code CHAR(4) NOT NULL
CONSTRAINT c1 CHECK(code LIKE"[0-9][0-9][0-9][0-9]"),
high INT NOT NULL CHECK (high>0),
low INT NOT NULL CHECK (low>0),
CONSTRAINT c4 CHECK (hign>=low AND high-low<1000)
Изменение таблиц
Для изменения таблицы, а именно: для включения новых столбцов и ограничений, а также
удаления ограничений, используется оператор ALTER TABLE, имеющий следующий
синтаксис:
<оператор изменения таблицы>::= ALTER TABLE <имя таблицы> {ADD <элемент
таблицы>[{,<элемент таблицы>}...] | DROP CONSTRAINT <имя ограничения>[{,<имя
ограничения>}...]}
Пример включения нового столбца в таблицу:
ALTER TABLE names2 ADD middle_name VARCHAR(20) NULL, fax VARCHAR(15)
NULL
Создание представлений
Механизм представлений является мощным средством языка SQL, позволяющим скрыть
реальную структуру БД от некоторых пользователей за счет определения представления
БД. Представление реально является некоторым хранимым в БД запросом с
именованными столбцами, а для пользователя ничем не отличается от базовой таблицы
БД. Представляемая таблица является виртуальной. Обычно вычисление представляемой
таблицы производится каждый раз при использовании представления.
Оператор определения представления имеет следующий синтаксис:
<оператор создания представления>::= CREATE VIEW <имя таблицы>[(список
столбцов)] AS <спецификация запроса> [WITH CHECK OPTION]
<спецификация запроса>::= SELECT [ALL | DISTINCT] <список выборки><табличное
выражение>
<список столбцов>::=<имя столбца>[{,<имя столбца>}...]
Требование WITH CHECK OPTION имеет смысл только в случае определения
изменяемой представляемой таблицы, которая определяется спецификацией запроса,
содержащей раздел WHERE. При наличии этого требования не допускаются изменения
представляемой таблицы, приводящие к появлению в базовых таблицах строк, не
видимых в представляемой таблице.
Примеры создания представлений:
CREATE VIEW ta_limited AS
SELECT au_id, title_id, au_ord FROM titleauthor
CREATE VIEW cal_publishers AS
SELECT * FROM publishers WHERE state="CA"
Одиночные операторы манипулирования данными
Каждый из операторов этой группы является абсолютно независимым от другого
оператора.
<оператор выборки>::= SELECT [ALL | DISTINCT] <список выборки> [INTO <список
спецификаций целей>]<табличное выражение>
Результатом выполнения оператора выборки является таблица, состоящая не более чем из
одной строки. После выполнения оператора цели содержат соответствующие поля
результирующей строки.
<оператор поискового удаления>::= DELETE FROM <имя таблицы> [WHERE <условие
поиска>]
При выполнении оператора последовательно просматриваются все строки таблицы, и те
строки, для которых результатом вычисления условия поиска является “истина”,
удаляются из таблицы. При отсутствии раздела WHERE удаляются все строки таблицы.
Примеры:
DELETE FROM authors
DELETE FROM titles WHERE type= "business"
<оператор поисковой модификации>::= UPDATE <имя таблицы> SET <предложение
установки >[{,<предложение установки>}…] [WHERE <условие поиска>]
При выполнении оператора просматриваются все строки таблицы, и каждая строка, для
которой результатом вычисления условия поиска является “истина”, изменяется в
соответствии с разделом SET.
Пример:
UPDATE publishers SET pub_name= "Joe’s Press" WHERE pub_id= "1234"
<оператор включения>::= INSERT INTO <имя таблицы>[(<список столбцов>)]
{VALUES (<список значений >) | <подзапрос>}
Оператор включения добавляет строку в таблицу. При это строка формируется или из
списка значений раздела VALUES, или вычисляется с помощью подзапроса. Список
столбцов определяет те столбцы, для которых явно будет указано их значение. Причем i-
му столбцу в списке столбцов соответствует i-ое значение из списка значений или i-я
строка результата подзапроса. Если список столбцов опущен, то для каждого столбца
таблицы должно быть точно указаны (или вычислены) значения, в порядке, в котором они
были определены.
При вставке символьных данных или поиске значения в конструкции WHERE значение
необходимо передавать в одиночных или двойных кавычках. Для вставки в столбец
двоичных данных их нужно указывать без кавычек, начиная с 0х и задавая два
шестнадцатеричных символа для каждого байта данных.
Примеры:
INSERT INTO publishers (pub_id, pub_name, cite, state) VALUES (‘1234’, ‘Stendahl
Publishing’, ‘Paris’, ‘France’)
INSERT INTO binary_example(id, bin_column) VALUES(19, 0xa134e2ff)
Оператор SELECT
Оператор SELECT используется для запросов к базе данных и выборки результатов.
Синтаксис оператора SELECT следующий:
<оператор SELECT>::=
SELECT [ALL | DISTINCT] <список выборки>
<табличное выражение>
ORDER BY <спецификация сортировки>]
<табличное выражение>::=
FROM <имя таблицы>[{,<имя таблицы>}…]
[WHERE <условие поиска>]
[GROUP BY <имя столбца> [{,<имя столбца>}…]
[HAVING <условие поиска>]
Если задано ключевое слово DISTINCT, то из результирующей таблицы удаляются
повторяющиеся строки. Список выборки определяет, какие столбцы должны быть
возвращены в результирующую таблицу. Данный список представляет список
арифметических выражений над значениями столбцов таблиц из раздела FROM и
констант. В простейшем случае он может быть, например, списком имен некоторых
столбцов таблиц из раздела FROM. В случае, если вместо списка выборки стоит звездочка
(*), то выбираются все столбцы таблиц из раздела FROM.
В разделе FROM определяются таблицы, из которых будут извлекаться данные. Следует
отметить, что рядом с именем таблицы можно указывать еще одно имя - синоним имени
таблицы, который можно использовать в других разделах табличного выражения.
Раздел WHERE служит своего рода фильтром при отборе данных.
Выполнение раздела GROUP BY оператора выборки сводится к разбиению
результирующей таблицы на множество групп строк, которое состоит из минимального
числа таких групп, в которых для каждого столбца из списка столбцов раздела GROUP BY
во всех строках каждой группы, включающей более одной строки, значения этого столбца
совпадают.
Результатом выполнения раздела HAVING является сгруппированная таблица,
содержащая только те группы строк, для которых результат вычисления условия поиска
является истинным. Условие поиска раздела HAVING задает условие на целую группу, а
не на индивидуальные строки, поэтому в данном случае прямо можно использовать
только столбцы, указанные в качестве столбцов группирования в разделе GROUP BY.
Раздел ORDER BY позволяет установить желаемый порядок просмотра результирующей
таблицы. Спецификация сортировки имеет следующий синтаксис:
<спецификация сортировки>::= {<целое без знака> | <имя столбца>} [ASC | DESC]
Как видно, фактически задается список столбцов, и для каждого столбца указывается
порядок просмотра строк результирующей таблицы в зависимости от значений этого
столбца (ASC - по возрастанию (умолчание), DESC - по убыванию). Указывать
сортируемый столбец можно по имени или по порядковому номеру в результирующей
таблице.
Предикаты условия поиска
В условии поиска могут использоваться следующие предикаты: предикат сравнения,
предикат BETWEEN , предикат IN, предикат LIKE, предикат NULL, предикат с квантором
и предикат EXISTS.
Предикат IN определяется следующим образом:
<предикат IN>::= <выражение> [NOT] IN (<значение> [,<значение>...] | .<подзапрос>)
Значение предиката является истинным, когда значение левого операнда совпадает хотя
бы с одним значением списка правого операнда. Использование ключевого слова NOT
осуществляет отрицание результата.
Подзапрос- это запрос, используемый в предикате условия поиска. Результатом
выполнения подзапроса является единственный столбец.
Предикат BETWEEN определяется следующим образом:
<предикат BETWEEN>::= <выражение> [NOT] BETWEEN <выражение> AND
<выражение>
По определению результат x BETWEEN y AND z тот же самый, что результат логического
выражения x>=y AND x<=z.
Предикат LIKE имеет следующий синтаксис:
<предикат LIKE>::= <имя столбца> [NOT] LIKE <шаблон>[ESCAPE <escape-символ>]
Значение предиката LIKE является истинным, если шаблон является подстрокой
заданного столбца. При этом, если раздел ESCAPE отсутствует, то при составлении
шаблона со строкой производится специальная интерпретация символов-заместителей
шаблона: символ подчеркивания ("_") обозначает любой одиночный символ, символ
процента ("%") обозначает последовательность произвольных символов произвольной
длины (может быть нулевой), парные квадратные скобки представляют любой символ,
записанный в скобках. Если же раздел ESCAPE присутствует и специфицирует некоторый
одиночный символ x, то пары символов "x_" и "x%" представляют одиночные символы
"_" и "%" соответственно.
Предикат NULL описывается синтаксическим правилом:
<предикат NULL>::= <имя столбца> IS [NOT] NULL
Значение "x IS NULL" является истинным, когда значение x неопределено.
Предикат EXISTS имеет следующий синтаксис:
<предикат EXISTS>::= EXISTS <подзапрос>
Значение предиката является истинным, когда результат вычисления подзапроса не пуст.
Агрегатные функции
Агрегатные функции (функции множества) в запросе предназначены для вычисления
некоторого значения для заданного множества строк. Таким множеством строк может
быть группа строк, если агрегатная функция применяется к сгруппированной таблице, или
вся таблица. В языке SQL определены следующие агрегатные функции:
o
AVG - функция определения среднего значения;
o
o
o
o
MAX - функция определения максимального значения;
MIN - функция определения минимального значения;
SUM - функция суммирования значений;
COUNT - функция для подсчета числа строк или значений.
Грамматика агрегатных функций следующая:
<агрегатная функция>::= COUNT(*) | <distinct-функция> | <all-функция>
<distinct-функция>::= {AVG | COUNT | MAX | MIN | SUM} (DISTINCT <имя столбца>)
<all-функция>::= {AVG | MAX | MIN | SUM} ([ALL]<выражение>)
Вычисление функции COUNT(*) производится путем подсчета числа строк в заданном
множестве. Функция типа distinct выполняет вычисления только над одним столбцом, а в
вычислениях используются только уникальные значения столбца. При использовании
функции типа all список значений формируется из значений арифметического выражения,
вычисляемого для каждой строки заданного множества.
Операции реляционной алгебры
Большинство SQL-запросов требует одновременного обращения к нескольким таблицам.
Часто такого рода запросы основываются на операциях реляционной алгебры, в
частности, соединения, декартова произведения, объединения, пересечения и разности.
При соединении двух таблиц по некоторому условию образуется результирующая
таблица, строки которой являются конкатенацией (сцеплением) строк первой и второй
таблиц и удовлетворяют этому условию. Операцию соединения можно реализовать с
использованием обычного SQL-запроса типа SELECT-FROM-WHERE. По стандарту
ANSI операция соединения таблиц может указываться явно в разделе FROM. Синтаксис
раздела FROM в этом случае следующий:
<раздел FROM>::= FROM <имя таблицы> [JOIN <имя таблицы> ON <условие
соединения> ...]
При выполнении декартова произведения двух таблиц производится таблица, строки
которой являются конкатенацией строк первой и второй таблиц. Операцию декартова
произведения можно реализовать с использованием SQL-запроса типа SELECT-FROM. По
стандарту ANSI операция декартова произведения может указываться явно в разделе
FROM с использованием ключевой фразы CROSS JOIN.
При выполнении операции объединения двух таблиц производится таблица, включающая
все строки, входящие хотя бы в одну из таблиц-операндов. При этом число столбцов и
типы данных этих столбцов должны быть одинаковыми для всех операндов. Для
объединения результирующих таблиц операторов SELECT используется ключевое слово
UNION.
Операция пересечения двух таблиц производит таблицу, включающую все строки,
входящие в обе исходные таблицы.
Таблица, являющаяся разностью двух таблиц, включает все строки, входящие в таблицу первый операнд, такие, что ни одна из них не входит в таблицу, являющуюся вторым
операндом.
Download