АРХИТЕКТУРА ИНФОРМАЦИОННЫХ СИСТЕМ ЛЕКЦИЯ 8. РЕЛЯЦИОННЫЕ БАЗЫ ДАННЫХ РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА • Б. Я. Советов, А. И. Водяхо, В. А. Дубенецкий, В. В. Цехановский. Архитектура информационных систем: учебник для студ. учреждений высш. проф. образования. М. : Издательский центр «Академия», 2012. • А.В. Данилин, А.И. Слюсаренко. Архитектура предприятия. М: ИНТУИТ, 2007 http://www.intuit.ru/department/itmngt/entarc/ РЕЛЯЦИОННЫЕ БАЗЫ ДАННЫХ (ТЕОРИЯ) Типы данных • Числовые типы: целые и вещественные • Строковые типы • Дата, время Домены – множества, состоящие из элементов одного типа данных и определяющие область значений для свойства некоторого объекта предметной области • Множество всех названий улиц города • Множество всех телефонных номеров организации РЕЛЯЦИОННЫЕ БАЗЫ ДАННЫХ (ТЕОРИЯ) Атрибуты – свойства объектов предметной области, представленных в реляционной БД и имеющих заданное имя • Атрибут «Фамилия» определяет свойство работника предприятия • Атрибут «Фамилия» имеет строковый тип данных • Домен фамилий ограничивает значение этого атрибута ПОНЯТИЯ РЕЛЯЦИОННЫХ БАЗ ДАННЫХ Кортеж – элемент отношения (запись или строка таблицы) Отношение – описание таблицы с помощью столбцов (атрибутов) и строк (кортежей ) Степень отношения – количество столбцов таблицы Кардинальное число – количество кортежей отношения Схема отношения – перечень имен столбцов таблицы (атрибутов отношения) ТРЕБОВАНИЯ К РЕЛЯЦИОННЫМ БАЗАМ ДАННЫХ Имя столбца уникально в границах таблицы На пересечении строки и столбца находится только одно значение (многозначные атрибуты не допускаются) В отношении не может быть повторяющихся строк Первичный ключ – столбец или группа столбцов, однозначно определяющих каждую строку ТИПЫ ТАБЛИЦ Базовые таблицы – таблицы, постоянно хранимые в БД (должны иметь первичный ключ) Динамические таблицы используются при промежуточных вычислениях и имеют ограниченный срок жизни Представления (views) предназначены для сокрытия содержимого базовых таблиц от пользователя РЕЛЯЦИОННАЯ АЛГЕБРА УНАРНЫЕ ОПЕРАЦИИ • Выборка R2 = σp(R1) ID Фамилия Имя Отчество Пол Оклад 1 Иванов Петр Сергеевич М 35800 2 Петрова Лидия Ивановна Ж 33670 3 Сергеев Иван Петрович М 36200 4 Семенова Елена Борисовна Ж 35700 5 Трофимов Дмитрий Андреевич М 33100 • Оклады2 = σОклад > 35000(Оклады1) ID Фамилия Имя Отчество Пол Оклад 1 Иванов Петр Сергеевич М 35800 3 Сергеев Иван Петрович М 36200 4 Семенова Елена Борисовна Ж 35700 РЕЛЯЦИОННАЯ АЛГЕБРА УНАРНЫЕ ОПЕРАЦИИ • Проекция R2 = Πf1, f2, ..., fn(R1) ID Фамилия Имя Отчество Пол Оклад 1 Иванов Петр Сергеевич М 35800 2 Петрова Лидия Ивановна Ж 33670 3 Сергеев Иван Петрович М 36200 4 Семенова Елена Борисовна Ж 35700 5 Трофимов Дмитрий Андреевич М 33100 • Оклады2 = ΠФамилия, Имя, Отчество, Оклад (Оклады1) Фамилия Имя Отчество Оклад Иванов Петр Сергеевич 35800 Петрова Лидия Ивановна 33670 Сергеев Иван Петрович 36200 Семенова Елена Борисовна 35700 Трофимов Дмитрий Андреевич 33100 РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Объединение R = R1 R2 ID Фамилия Имя Отчество Пол Оклад 1 Иванов Петр Сергеевич М 35800 2 Петрова Лидия Ивановна Ж 33670 3 Сергеев Иван Петрович М 36200 4 Семенова Елена Борисовна Ж 35700 5 Трофимов Дмитрий Андреевич М 33100 ID Фамилия Имя Отчество Пол Оклад 1 Сидоров Иван Михайлович М 32100 2 Скворцов Никита Андреевич М 33400 3 Семенова Елена Борисовна Ж 35700 РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Фамилия = ΠФамилия(Сотрудники 1) ΠФамилия(Сотрудники2 ) Фамилия Иванов Петрова Сергеев Семенова Трофимов Сидоров Скворцов РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Разность R = R1 – R2 • Фамилия = ΠФамилия(Сотрудники 1) – ΠФамилия(Сотрудники2 ) Фамилия Иванов Петрова Сергеев Трофимов РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Пересечение R = R1 R2 = R1 – (R1 – R2) • Фамилия = ΠФамилия(Сотрудники 1) ΠФамилия(Сотрудники2 ) Фамилия Семенова РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Декартово произведение R = R1 R2 Таб № Фамилия Имя Отчество 203 Иванов Петр Сергеевич 204 Петрова Лидия Ивановна 212 Сергеев Иван Петрович Таб № Оклад Дата 203 35800 29.03.13 204 33670 29.03.13 212 36200 29.03.13 РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Зарплата сотрудников = Сотрудники Зарплата Таб № Фамилия Имя Отчество Таб № Оклад Дата 203 Иванов Петр Сергеевич 203 35800 29.03.13 203 Иванов Петр Сергеевич 204 33670 29.03.13 203 Иванов Петр Сергеевич 212 36200 29.03.13 204 Петрова Лидия Ивановна 203 35800 29.03.13 204 Петрова Лидия Ивановна 204 33670 29.03.13 204 Петрова Лидия Ивановна 212 36200 29.03.13 212 Сергеев Иван Петрович 203 35800 29.03.13 212 Сергеев Иван Петрович 204 33670 29.03.13 212 Сергеев Иван Петрович 212 36200 29.03.13 РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Зарплата сотрудников = σТабномер1 = Табномер2(Сотрудники Зарплата) Таб № Фамилия Имя Отчество Таб № Оклад Дата 203 Иванов Петр Сергеевич 203 35800 29.03.13 204 Петрова Лидия Ивановна 204 33670 29.03.13 212 Сергеев Иван Петрович 212 36200 29.03.13 РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Тета-соединение R1.ai θ R2.bi • где операция – θ = {<, >, =, ≠, ≤, ≥} • Зарплата сотрудников = σТабномер1 = Табномер2(Сотрудники Зарплата) • Сотрудники.Табномер1 = Зарплата. Табномер2 • Зарплата сотрудников = • Сотрудники (Сотрудники.Табномер1 = Зарплата. Табномер2) Зарплата • http://citforum.ru/database/advanced_intro/62.shtml • левое внешнее соединение • правое внешнее соединение РЕЛЯЦИОННАЯ АЛГЕБРА БИНАРНЫЕ ОПЕРАЦИИ • Деление R = R1 R2 Абонент1 Абонент2 Номер телефона 4450912 3435607 3435607 3561408 2230801 5443408 1571609 5443408 Абонент1 4450912 1571609 ЯЗЫК SQL • SEQUEL (Structured English Query Language, структурированный английский язык для запросов) • SQL (Structured Query Language, структурированный язык запросов) СТАНДАРТЫ ЯЗЫКА SQL 1986 • SQL-86 Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году. 1989 • SQL-89 Немного доработанный вариант предыдущего стандарта. 1992 • SQL-92 Значительные изменения. 1999 • SQL:1999 Добавлена поддержка регулярных выражений, рекурсивных запросов, поддержка триггеров, базовые процедурные расширения, нескалярные типы данных и некоторые объектно-ориентированные возможности. 2003 • SQL:2003 Введены расширения для работы с XML-данными, оконные функции (применяемые для работы с OLAP-базами данных), генераторы последовательностей и основанные на них типы данных. 2006 • SQL:2006 Функциональность работы с XML-данными значительно расширена. Появилась возможность совместно использовать в запросах SQL и XQuery. 2008 • SQL:2008 Улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003. ДИАЛЕКТЫ SQL SQLpl (DB2) PL/SQL (Oracle) PL/pgSQL (PostgreSQL) Transact-SQL (MS SQL Server, Sybase) … СИНТАКСИЧЕСКИЕ КОНСТРУКЦИИ SQL предложения идентификаторы (имена) константы операторы зарезервированные и ключевые слова ИДЕНТИФИКАТОРЫ Идентификаторы — это пользовательские или системные имена объектов баз данных Присваиваются базам данных, таблицам, ограничениям и правилам в таблице, столбцам таблицы, представлениям, процедурам и т. п. Идентификатор объекта создается при определении объекта ИДЕНТИФИКАТОРЫ Обычные идентификаторы • от 1 до 128 символов • Содержит буквы, цифры, @, $, #, _ • Начинается с буквы, @, #, _ • Примеры: TableX, KeyCol Идентификаторы с разделителем • от 1 до 128 символов • Заключаются в двойные кавычки или квадратные скобки • Примеры: [My Table], [order] КОНСТАНТЫ Типы констант Пример Символьные строки 'The level for job_id: %d should be between %d and %d.' Строки в Юникоде ‘Строка’ Константы двоичных строк 0x69048AEFDD010E Константы bit 0 или 1 Константы datetime 'April 15, 2013‘, '04/15/13‘, '14:30:24‘ Константы integer 3014 Константы decimal 3.1415 Константы float и real 10.5E4 Константы money $1024.34 ЗНАЧЕНИЕ NULL • Значение NULL указывает на то, что значение неизвестно. Оно отличается от пустого или нулевого значения. • Сравнения между двумя значениями NULL или между значением NULL и каким-либо иным значением возвращают неизвестную величину, так как значение каждого из значений NULL неизвестно AND TRUE NULL FALSE TRUE TRUE UNKNOWN FALSE NULL UNKNOWN UNKNOWN FALSE FALSE FALSE FALSE FALSE OR TRUE NULL FALSE TRUE TRUE TRUE TRUE NULL TRUE UNKNOWN UNKNOWN FALSE TRUE UNKNOWN FALSE ОПЕРАТОРЫ Арифметические операторы (+, -, *, /, %) Логические операторы (ALL, AND, ANY, BETWEEN, EXISTS, IN, LIKE, NOT, OR, SOME) Оператор присваивания (=) Оператор разрешения области (::) Битовые операторы (&, |, ^) Оператор объединения строк (+) Операторы сравнения (=, >, <, >=, <=, <>, !=, !<, !>) Унарные операторы (+, -, ~) ПРИОРИТЕТ ОПЕРАТОРОВ Уровень •Операторы 1 •~ (побитовое НЕ) 2 •* (умножение), / (деление), % (остаток от деления) 3 •+(положительное), -(отрицательное), +(сложение), (+ объединение), (вычитание), & (побитовое И), ^ (побитовое исключающее ИЛИ), |(побитовое ИЛИ) 4 •=, >, <, >=, <=, <>, !=, !>, !< (операторы сравнения) 5 •NOT 6 •AND 7 •ALL, ANY, BETWEEN, IN, LIKE, OR, SOME 8 •= (присваивание) ТИПЫ ДАННЫХ Целые числа (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint) Действительные числа (float, real) Дата и время (datetime, smalldatetime, date, time) Символьные строки (char, varchar, text) Символьные строки в Юникоде (nchar, ntext, nvarchar) Двоичные данные (binary, varbinary, image) Прочие типы данных (xml) ФУНКЦИИ Статистические функции AVG(), COUNT(), MAX(), MIN(), SUM() Ранжирующие функции RANK(), ROW_NUMBER() Скалярные функции SYSDATETIME(), DAY(), MONTH(), YEAR(), ISDATE() ABS(), LOG(), LOG10(), POWER(), SQRT(), ROUND() LOWER(), UPPER(), SUBSTRING() ПРЕДЛОЖЕНИЯ Предложения манипуляции данными (Data Manipulation Language, DML) Предложения определения данных (Data Definition Language, DDL) Предложения определения доступа к данным (Data Control Language, DCL) ОПЕРАТОР SELECT • SELECT [ ALL | DISTINCT ] [TOP ( expression ) [PERCENT]] • { * | { table_name | view_name }. * | { [ { table_name | view_name}. ] { column_name } | expression [ [ AS ] column_alias ] } } [,...n] • [ INTO new_table ] • [ FROM { <table_source> } [ ,...n ] ] • [ WHERE <search_condition> ] • [ <GROUP BY> ] • [ HAVING < search_condition > ] • [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [ ,...n ] ] • [COMPUTE{{AVG | COUNT | MAX | MIN | SUM}(expression )} [,...n][BY expression [,...n]]] ПРИМЕРЫ СИНТАКСИСА SELECT SELECT * FROM Product ORDER BY Name ASC; SELECT p.* FROM Product AS p ORDER BY Name ASC; SELECT Name, ProductNumber, ListPrice AS Price FROM Product ORDER BY Name ASC; SELECT Name, ProductNumber, ListPrice AS Price FROM Product WHERE ProductLine = 'R' AND DaysToManufacture < 4 ORDER BY Name ASC; ХРАНИМЫЕ ПРОЦЕДУРЫ Хранимая процедура – SQL-запрос, выполняемый на стороне сервера и имеющий параметры (аргументы) • Хранимые процедуры не возвращают значения результата • Обеспечивают удобный и эффективный механизм безопасности • Откомпилированные хранимые процедуры и их исходные тексты содержатся в базе данных ОПИСАНИЯ ХРАНИМОЙ ПРОЦЕДУРЫ • CREATE { PROC | PROCEDURE } procedure_name [; number] • • • • • • • [ { @parameter data_type } [ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,...n ] [ WITH [ RECOMPILE ] [ ,...n ] ] [ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] } [;] • <sql_statement> ::= • { [ BEGIN ] statements [ END ] } ВЫВОД ИНФОРМАЦИИ О ХРАНИМОЙ ПРОЦЕДУРЕ • EXEC SP_HELPTEXT <Имя процедуры> ИСПОЛНЕНИЕ ХРАНИМОЙ ПРОЦЕДУРЫ • EXEC <Имя процедуры> [<Параметр1>, <Параметр2>,…] ПРИМЕР • CREATE PROCEDURE СрБАЛЛ • • • • • • @X Real AS SELECT * FROM Студенты WHERE (Оценка1 + Оценка2 + Оценка3)/3>@X • EXEC СрБАЛЛ 4 ФУНКЦИИ Пользовательские функции похожи на хранимые процедуры, отличие – возвращают значение Скалярные функции – функции, которые возвращают число или текст, то есть одно или несколько значений Табличные функции – функции, которые возвращают результат в виде таблицы СОЗДАНИЕ ОПИСАНИЯ СКАЛЯРНОЙ ФУНКЦИИ • • • • • • CREATE FUNCTION function_name ( [ { @parameter_name [ AS ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ]) RETURNS return_data_type [ AS ] • BEGIN • function_body • RETURN scalar_expression • END [ ; ] СОЗДАНИЕ ОПИСАНИЯ ТАБЛИЧНОЙ ФУНКЦИИ • CREATE FUNCTION function_name • ( [ { @parameter_name [ AS ] parameter_data_type [ =default ] [ READONLY ] } [ ,...n ] • ]) • RETURNS TABLE • [ AS ] • RETURN [ ( ] select_stmt [ ) ] [ ; ] • @return_variable TABLE <table_type_definition> • [ AS ] • BEGIN • function_body • RETURN • END [ ; ] ПРИМЕР (СКАЛЯРНАЯ ФУНКЦИЯ) • • • • • CREATE FUNCTION Среднее (@X1 Int,@X2 Int,@X3 Int) RETURNS Real AS BEGIN • DECLARE @Res Real • @Res =(@X1+@Х2+@Х3)/3 • RETURN @Res • END ПРИМЕР (ТАБЛИЧНАЯ ФУНКЦИЯ) • CREATE FUNCTION Возраст (@CurDate Date) • • • • • RETURNS TABLE AS RETURN (SELECT ФИО, [Дата рождения], Возраст = DATEDIFF(yy, [Дата рождения], @CurDate) FROM Студенты) • SELECT Возраст (‘12/17/2007’)