Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных small.doc
Скачиваний:
8
Добавлен:
02.09.2019
Размер:
159.23 Кб
Скачать

4. Связывание таблиц. Назначение, типы связей и средства установки связей

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

Связи бывают постоянные и временные. Постоянные связи устанавливаются до выполнения прикладной программы при создании логической модели данных (обычно визуальными средствами). Этими связями можно пользоваться в прикладной программе. Временные связи устанавливаются при выполнении прикладной программы (в FoxPro командой Set Relation) и удаляются после ее выполнения.

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

Индексом может быть поле или группа полей (составной индекс) или свертка индекса в виде хеш‑кода (шифрованное значение ключа).

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

Обычно выделяют четыре типа индексов:

  1. Первичный (Primary) который является уникальным, служит для связи с другими таблицами. У таблицы может быть только один первичный индекс. Индексные поля не могут иметь пустые значения.

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

  3. Уникальный (Unique) индекс хранит неповторяющиеся значения индекса, т.е. дублирующиеся значения игнорируются.

  4. Регулярный (Regular) индекс хранит значения индексов всех записей таблицы. Обычно такой индекс является внешним ключом.

5. Основные команды языка запросов sql с примерами

Запрос представляет собой требование, определяющее выборку нужных данных из одной или нескольких таблиц базы, удаление или изменение данных, создание новых таблиц. Существуют два типа языков описания запросов: язык запросов по образцу QBE (Query By Example) и структурированный язык запросов SQL (Structured Query Language).

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

Язык SQL (стандарт SQL‑92) предполагает использование командных средств. Хотя синтаксис команд языка SQL и достаточно унифицирован для различных СУБД, но есть некоторые отличия в деталях. Существуют статический SQL (команды SQL включаются в выполняемый модуль после компиляции) и динамический SQL (команды SQL формируются в процессе выполнения программы и выполняются в интерпретирующем режиме). В результате выполнения запроса на выборку формируется новая таблица, называемая представлением (View), к которой устанавливается соответствующий указатель, называемый курсором (Cursor). Курсор служит для ссылки на нужное представление в командах открытия, перемещения по записями и закрытия нужного представления.

Основные команды SQL

Select является мощным средством создания запросов на выборку информации. Приведем ее предварительный синтаксис:

Select <поля, выражения или *> From <исходные таблицы>

Where <условие отбора записей> Group By <поля для группировки>

Having <условие отбора группы> Order By <поля для сортировки>

Рассмотрим фразы команды (не все фразы обязательны).

Select [Distinct] <выражение> [[As] <псевдоним>] [, ...]

From <таблица> [<тип связи> Join <таблица> On <условие связи>]...

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

Псевдоним задает наименование колонки (пробелы запрещены).

Для связывания таблиц используется фраза Join. Тип связи задается словами: Left/Right (в запрос входят все записи из таблицы, стоящей в запросе слева/справа), Inner (входят только записи с совпадающими ключами связи).

Пример задания базового запроса по базе строек.

Select Stroiki.Ns, Stroiki.Ds, Stroiki.Ss, Stroiki.Fs, Stroiki.M, Stroiki.Em, Podrjdhiki.Np, Zakazhiki.Nz FROM “stroiki.DB“ Stroiki

Inner Join “zakazhiki.db“ Zakazhiki ON (Stroiki.Kz = Zakazhiki.Kz)

Inner Join “podrjdhiki.DB“ Podrjdhiki ON (Stroiki.Kp = Podrjdhiki.Kp)

В результате выполнения запроса получается совокупность колонок, в заголовках которых могут находиться имена полей. Если нас не устраивают имена, формируемые по умолчанию, то можно назначить свои (псевдонимы), указав их после слова As. В выражении могут использоваться собственные специальные арифметические функции, действующие “по вертикали”: среднее значение в группе (Avg), минимальное (Min), максимальное (Max), сумма (Sum), число записей в группе (Count). Функция может иметь в качестве аргумента звездочку (Count (*)), что означает подсчет всех записей, попавших в выборку.

Where <условие отбора> – условие отбора записей в запрос. В условиях допускается использование логических операторов And, Or, Not и круглых скобок. В условиях, кроме любых функций Pascal, могут содержаться следующие операторы SQL:

<выражение> Like <шаблон> позволяет построить условие сравнения по шаблону, набор символов: “_” (неопределенный символ), “%” (любые символы, например: Where Ns Like ‘Школа%’), [n‑k]% (любые символы из интервала от n до k, например: Like ‘[A‑D]%’);

<выражение> Between <нижнее значение> And <верхнее значение> проверяет, находится ли выражение в указанном диапазоне (Where [Ss] Between 0 And 1000000);

<выражение> In (<выражение>,<выражение>,...) проверяет, находится ли выражение, стоящее слева от слова IN, среди перечисленных справа от него (Where Kz In (1,2,6)).

Group By <колонка>[,<колонка>...] – задаются колонки, по которым производится группирование выходных данных. Все записи таблицы, для которых значения колонок совпадают, отображаются в выборке единственной строкой. Группирование удобно для получения некоторых сводных характеристик (суммы, число записей, среднее) группы.

Пример. Вывести число сотрудников, максимальную, среднюю, минимальную и итоговую зарплату по подразделениям (поле Podr) по таблице SOTRUDNIKI.

Select podr, Count(*),Min (zarpl), Avg (zarpl), Max(zarpl), Sum (zarpl) From Sotrudniki Group By podr Order By podr

Having <условие отбора группы> задает критерий отбора сформированных в процессе выборки групп.

Order By <колонка> [Asc/Desc] [,<колонка> [Asc/Desc]...] – опция, которая задает упорядочение по колонкам по возрастанию (Asc) или убыванию (Desc). Колонка задается номером или именем поля (Order By Kp, Kz).

Рассмотрим другие команды SQL.

Create Table <имя таблицы> (<поле> <тип поля> [Not Null], ...) – создание таблицы (Create Table Kadr (Tab Integer, Fam Char (30) Not Null Primary Key (Tab))). Обязательное присутствие значения в поле задается параметром Not Null. Основные типы полей в SQL в Delphi: SmallInt (Short), Integer (Long Integer), Numeric(x,y), Float (x,y), Char (n), Data, Boolean, Time, Money, Autoinc. Для других СУБД типы полей могут быть другими.

Create View <имя представления> [(<имя столбца>,...)] As <оператор Select> – создание представления с новыми именами столбцов (Create View NameStroek As Select Stroiki.Ns FROM Stroiki).

Alter Table <имя таблицы> {Add | Modify | Drop} <поле> [<тип поля>] [Not Null, ... – изменение структуры таблицы: включение (Add), изменение (Modify) и удаление (Drop, тип поля не указывается) полей таблицы (Alter Table Stroiki Add Gorod Integer Drop Kp).

Update <таблица> Set <имя поля>={<новое значение>|Null}, ... [Where <условие>] – изменение значений полей (Update Kadr Set Oklad=1.5*Oklad Where Cex=”Цех N2”).

Insert Into<имя таблицы>(<список полей>) {Values (<список значений>)| Select...} – включение новой записи или группы записей из другой таблицы.

Примеры

Insert Into Zakazhiki (Kz,Nz) Values (3,’ЗИЛ’); // включение одной записи

Insert Into Podrjdhiki (Kp,Np) Select KPodr, NPodr From SpravPodr

Where DSozd >01.01.80; //включение группы записей из таблицы SpravPodr

Create [Unique] Index <имя индекса> On <таблица> (<поле> [{Asc|esc}],...) – создание индекса (Create index indproba on stroiki (kz, kp)).

Drop Table/View <имя> – удаление таблицы/представления (Drop Table Stroiki).

Drop Index [“<имя таблицы>”.]<имя индекса> – удаление индекса.

Drop Index [“<имя таблицы>”.]Primary – удаление главного индекса.

Delete From <имя таблицы> [Where<условие>] – удаление записей.

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

Пример. Вывести крупные стройки со сметой выше средней по стройкам: Select * From Stroiki Where Ss > (Select Avg(Ss) From Stroiki).