Додатові відомості про зв’язування таблиць
В результаті зв’язування двох таблиць можуть утворюватись динамічні набори даних.
В кожній із таблиць є ключове поле. Записи в таблицях упорядковуються за значеннями ключового поля. Хоча б одна із зв’язуваних таблиць має первинний ключ. Множину значень ключів позначимо К1 та К2 відповідно для кожної із таблиць, як схематично вказано на Рис 5.3.
Рис. 5.3. Схема зв’язування таблиць
Позначимо ці множини як
К1= {k11, k12 …,k1n}, К2= {k21, k22 …,k2m}
Не завжди К1=К2, тобто необов’язково множини значень ключів співпадають. Ця обставина впливає на спосіб утворення динамічних наборів.
При утворенні динамічних наборів зв’язаних таблиць поточні записи однієї таблиці доповнюються відповідними записами другої таблиці. Нехай поточний запис таблиці1 буде позначено Р. Відповідність записів встановлюється по співпаданню значень ключа (k1і= k2і). Позначимо відповідний запис у іншій таблиці як В.
Якщо К1=К2, то поточний записдинамічного набору утворюється як об’єднання Р U В, або схематично запис динамічного набору можна представити
як показано нижч
Така ситуація описується за допомогою SQL у реченні FROM наступним чином:
FROM таблица_1 INNER JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2,
Якщо К1¹К2, то говорять про зовнішнє об’єднання. При зовнішньому об’єднанні таблиць уточнюють наступне:
1. записи якої з таблиць поповнюються відповідними записами зв’язаної таблиці;
2. як діяти, якщо відсутній відповідний запис у зв’язаній таблиці.
Якщо при формуванні динамічного набору поповнюються записи однієї таблиці (умовимся називати її таблицяР) записами іншої таблиці, то у результуючу таблицю включаються усі записи таблиціР). Такою таблицеюР у різних ситуаціях може бути або таблиця 1 або таблиця 2. Якщо таблицеюР є таблиця 1, то говорять про створення лівого зовнішнього об’єднання, бо у наших позначеннях таблиця 1 розташована зліва і у реченні FROM в аргументах записується першою
FROM таблица_1 LEFT JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2,
Схематично запис, що утворюється при лівому зовнішньому об’єднанні можна вказати, використовуючи введені позначення, розглянувши дві ситуації:
2. Якщо відповідний запис у таблиці2 відсутній, то поточний запис формується як вказано на схемі, що подається нижче:
Якщо таблицеюР є таблиця 2 то говорять про створення правого зовнішнього об’єднання, бо у наших позначеннях таблиця 2 розташована праворуч, а у реченні FROM в аргументах записується другою
FROM таблица_1 RIGHT JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2,
Схематично запис, що утворюється при правому зовнішньому об’єднанні можна вказати, використовуючи введені позначення, розглянувши дві ситуації:
1. Якщо відповідний запис у зв’язаній таблиці існує, то поточний запис результуючої таблиці формується так, як схематично показано на схемі, наведеній нижче:
2. Якщо відповідний запис у зв’язаній таблиці - відсутній, то поточний запис результуючої формується так, як схематично показано на схемі, наведеній нижче без заповнення полів, що відповідають зв’язаній таблиці.
Вкажемо аргументи операцій з’єднання у реченні FROM.
Аргумент | Опиc |
таблица_1, таблица_2 | Імена таблиць, записи яких належить об’єднати. |
поле_1, поле_2 | Імена полів. Якщо ці поля не є числовими, то повинні мати однаковий тип даних і вміщувати дані одного типу, однак, поля можуть мати різні імена. |
Оператор | Любий оператор порівняння: "=," "<," ">," "<=," ">=," або "<>". |
Якщо потрібно включити у результат лише записи, що мають однакові значеннях у полях зв’язку, то використовують операцію INNER JOIN.
Операції LEFT JOIN, RIGHT JOIN можуть вкладатись у операцію INNER JOIN, але не навпаки.
Поля типу МЕМО не об’єднуються.
Поле зв’язку не буде включатись у результуючу таблицю, якщо воно не включено в речення SELECT.
Щоб зв’язати кілька речень ON в JOIN, використовують наступний синтаксис:
SELECT поля
FROM таблица_1 INNER JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_1 AND
ON таблица_1.поле_2 оператор таблица_2.поле_2) OR
ON таблица_1.поле_3 оператор таблица_2.поле_3)];
Висновки:
1. Таким чином, системи управління базами данних Access дозволяють розробити невичерпне число різноманітних запитів необхідних користувачеві.
2. Кожному запиту на мові QBE відповідає тотожній по результатам SQL-запит , але у зворотньому порядку це незавжди вірно.
3. SQL-запитизабезпечують:
¨ формування джерел даних для полів зі списком;
¨ визначення обчислювальних полів;
¨ фільтрацію даних.
6. Вибранні питання роботи з операторами SQL, що змінюють структуру бази даних
Існує особливий тип запитів, які створюються користувачами в Конструкторі запитів за допомогою інструкцій SQL та команди меню Запит, Запит SQL. До останніх відносять;
· Запит SQL, Объединение - забезпечує злиття даних кількох джерел (Таблиць/запитів), що мають однакову структуру даних;
· Запит SQL, К серверу – за допомогою такого запиту можнастворити запит до сервера ;
· Запит SQL, Управление – призначений для створення, модифікації структури таблиці програмним способом.
Створення таблиці
Розглянемо приклад: за допомогою SQL створити структуру таблиці “Контролер”, яка має у своєму складі два поля:
¨ Цілочислене поле Код контролера, являє собою первинний ключ;
¨ Текстове поле “Пр” для зберіганняпрізвища контролера.
Для створення структури вказаної таблиці потрібно виконати наступні дії:
1. Перейти на вкладку “Запити» у вікні бази даних, натиснути <Cоздать>, вибрати Конструктор, таблиці для конструктора запитів не відбирати.
2. Виконати команду меню Запрос, Запрос SQL, Управление.
3. У вікні Управлющий запрос набрати інструкцію:
CREATE TABLE [Контролер] ( [Код контролера] SINGLE, [Пр] CHAR (50));
Вказана інструкція відповідає синтаксису CREATE TABLE , див. також Розділ 3.1.
CREATE TABLE таблиця (поле_1 тип [(размер)]
[NOT NULL] [индекс_1] [, поле_2 тип [(размер)]
[NOT NULL] [индекс_2] [, ...]] [, CONSTRAINT составнойИндекс [, ...]])
Аргументи інструкції CREATE TABLE вказані в табл.3.2.
Інструкція CREATE TABLE вміщує дані про типи та розміри створюваних полів.
Виконання запиту (меню Запрос, Запуск), не супроводжується виведенням на монітор таблиці. Щоб пересвідчитись у тому, що створено нову порожню таблицю необхідно відкрити вкладку Таблицы, віднайтиновостворену таблицю та відкрити її у табличному режимі та Конструкторе Таблиц (щоб перевірити результат виконання управляючого запита). Зазначимо, що запит на створення та запит SQL на створення порожньої таблиці - абсолютно різні запити і мають різні іконки:
Структуру нової таблиці можна створювати програмно. У такому випадку необхідно задати (для кожного поля створюваної таблиці) типи даних.
В системі управління базами данних Access базовою мовою є VB, тому для практичного використання буде корисним співставлення наборів типів даних, представлених у вигляді наступної таблиці.
У першому стовпчику таблиці наведено типи даних, які доступні у режимі конструктора Таблиц або можуть бути вказані значення властивості Размер поля (FieldSize).
У другому стовпчику перераховані відповідні типи даних запитів, які доступні у режимі конструктора для запитів в діалоговому вікні Параметры запроса (Сервис, Параметры).
У третьому стовпчику перераховуються відповідні типи даних Visual Basic.
У четвертому - перераховуються типи даних об’єкта доступа до даних (DAO) Field, а у п’ятому відповідні типи даних SQL ядра бази Jet, а також допустимі синоними до них.
Зазначимо, що Таблиця заповнена на російській мові відповідно до русифікованої версіії системи управління базами данних Acces.
Типи даних
Поля Таблиць | Параметри запитів | Visual Basic | Константи властивості Type об’єкта Field | Мова SQL ядра бази |
Не підтримує | Двоичный | Не підтримує | Не підтримує | BINARY (синоним: VARBINARY) |
Логический | Логический | Boolean | dbBoolean | BOOLEAN(синоніми: BIT, LOGICAL, LOGICAL1, YESNO) |
Числовой (Размер поля = Байт) | Байт | Byte | dbByte | BYTE(синонім: INTEGER1) |
Счетчик (Размер поля = Длинное целое) | Длинное целое | Long | dbLong | COUNTER (синонім: AUTOINCREMENT) |
Денежный | Денежный | Currency | dbCurrency | CURRENCY(синонім: MONEY) |
Дата/время | Дата/время | Date | dbDate | (синоніми DATE, TIME, TIMESTAMP) |
Числовой (Размер поля = С плавающей точкой (8 байт)) | С плавающей точкой (8 байт) | Double | dbDouble | (синоніми: FLOAT, FLOAT8, IEEEDOUBLE, NUMBER, NUMERIC) |
Числовой або Счетчик (Размер поля = Код репликации) | Код репликации | Не підтримує | dbGUID | GUID |
Числовой (Размер поля = Длинное целое) | Длинное целое | Long | dbLong | LONG ((синоніми: INT, INTEGER, INTEGER4)) |
Поле об’єкта OLE | Поле об’єкта OLE | String | dbLongBinary | LONGBINARY(синоніми: GENERAL, OLEOBJECT) |
Поле МЕМО | Поле МЕМО | String | dbMemo | LONGTEXT (синоніми: LONGCHAR, MEMO, NOTE) |
Числовой (Размер поля = С плавающей точкой (4 байт)) | С плавающей точкой (4 байт) | Single | dbSingle | SINGLE(синоніми: FLOAT4, IEEESINGLE, REAL) |
Числовой (Размер поля = Целое) | Целое | Integer | dbInteger | SHORT |
Текстовый | Текстовый | String | dbText | TEXT(синонимы: ALPHANUMERIC, CHAR, CHARACTER, STRING, VARCHAR) |
Гиперссылка | Поле МЕМО | String | dbMemo | LONGTEXT |
Не підтримує | Значение | Variant | Не підтримує | VALUE |
Microsoft Access підтримує наступні управляючі інструкції.
Інструкції | Призначення інструкцій |
· CREATE TABLE | створює таблицю |
· ALTER TABLE | додає нове поле або індекс в існуючу таблицю · |
DROP | вилучає таблицю з бази даних або вилучає індекс, визначень для поля чи групи полів |
· CREATE INDEX | створює індекс для поля чи групи полів. |
Зауваження! При перетворенні управляючого запиту в запит іншого типу, напиклад, у запит на вибірку, введена інструкція SQL буде втрачена.
· Для створення або зміни об’єктів бази даних на сервері ODBC, наприклад, Microsoft SQL Server, слід використовувати запити до сервера, а не управляючі запити.
Для створення поля з підстановкою можна використати інструкцію:
SELECT DISTINCTROW Контролер.Пр, Контролер.[Код контролера]
FROM Контролер;
Приклад створення таблиці з індексацією
CREATE TABLE Нова
([Код_контролера] integer,
[Прізвище] text,
[Ім’я] text,
[ДатаКонтракту] date,
[Телефон] text,
[Примітка] memo,
CONSTRAINT [Индекс1] PRIMARY KEY ([Код_контролера] ));
Створення таблиці на основі запиту
Якщо потрібно створити нову таблицю, яка наповнюється даними бази даних на основі раніше розробленого запиту (див., наприклад,Табл. 5. 1.), то необхідко у відповідному запиті вказати ім’я створюваної таблиці. Вкажемо ім’я “Вартість тестувань ”:
SELECT Запит21.* INTO [Вартість тестувань]
FROM Запит21;
У даному прикладі була використана інструкція SELECT...INTO
Синтаксис, якої наведено нижче
SELECT поле_1[, поле_2[, ...]] INTO новаяТаблиця [IN внешняяБазаДаних]
FROM источник
Аргументы інструкції SELECT...INTO:
Аргумент | Опис |
поле_1; поле_2 | Імена полів, які слід скопіювати у нову таблицю. |
внешняяБазаДаних | Шлях до зовнішньої бази даних |
Источник | Ім’я існуючої таблиці, з якої вибираюь записи. Це може бути одна Таблиця кілька Таблиць або запит. |
Запит на створення таблиці можна використовувати для архівування, створення резервних копій таблиці, копій для експорта в іншу базу даних, а також у якості основи звітів, що відтворюють дані за конкретний період часу.
Зауваження:
· У новій таблиці можна визначити ключ. При створенні таблиці поля в новій таблиці наслідують типи даних і розміри базових полів; ніякі інші властивості Таблиц та полів не передаються.
· Для додавання даних в існуючу таблицю використовують інструкцію INSERT INTO замість запита на додавання записів.