Навігація
Головна
 
Головна arrow Інформатика arrow Бази даних
< Попередня   ЗМІСТ   Наступна >

Багатокористувацький режим

Дотепер подразумевался однокористувацький режим роботи БД. SQL дозволяє реалізувати і багатокористувацький режим, у тому числі розміщення запам'ятовуються даних, відновлення та збереження змін в базі даних, конфігурації вашої бази даних.

Команда або група команд SQL можуть бути виконані або повністю проігноровані за допомогою транзакцій. Транзакція починається всякий раз, коли починається сеанс з SQL. Усі команди, які введені, будуть частиною цієї транзакції, поки вони не завершаться введенням команди COMMIT WORK або команди ROLLBACK WORK. COMMIT може зробити всі зміни постійними за допомогою транзакції, a ROLLBACK може відкотити їх назад або скасувати. Нова транзакція починається після кожної команди COMMIT або ROLLBACK.

Синтаксис команд відповідно COMMIT WORK; або ROLLBACK WORK;

У більшості реалізацій можна встановити параметр, званий AUTOCOMMIT. Він автоматично запам'ятовує всі дії, які виконуються. Дії, які приведуть до помилки, завжди будуть автоматично "прокручені" назад. Для фіксації всіх дій можна використовувати команду:

SET AUTOCOMMIT ON;

Повернутися до звичайної діалогової обробці запитів можна за допомогою такої команди:

SET AUTOCOMMIT OFF;

Є можливість установки AUTOCOMMIT, яку система виконає автоматично при реєстрації.

Обробка одночасних транзакцій називається паралелізмом і може призводити до конфліктів.

SQL має засоби управління паралелізмом для точного зазначення місця отримання результату: жодна команда не повинна бути видана, поки попередня не буде завершено процес (включаючи команди COMMIT або ROLLBACK).

Механізм, використовуваний SQL для управління паралелізмом операцій, називається блокуванням. Блокування затримують певні операції в базі даних. Затримані операції шикуються в чергу і виконуються тільки після зняття блокування.

Існує кілька базових типів блокувань: розподілювані, спеціальні та загальні блокування.

Розподіляються (або S-блокування) можуть бути встановлені більш ніж одним користувачем в даний момент часу. Це дає можливість будь-якому числу користувачів звертатися до даних, але не змінювати їх.

Спеціальні блокування (або Х-блокування) не дозволяють нікому, крім власника цієї блокування, звертатися до даних. Спеціальні блокування використовуються для команд які змінюють зміст або структуру таблиці. Вони діють до кінця транзакції.

Загальні блокування використовуються для запитів. Наскільки вони тривалі - залежить фактично від рівня ізоляції (скільки таблиць буде блоковано).

Використання БД

Оновлення даних. До команд поновлення відносять INSERT, DELETE, розглянуті при заповненні БД даними, і UPDATE, изменяющей деякі або всі значення в існуючій рядку. У команді названо ім'я використовуваної таблиці і пропозиція SET, яке вказує на зміну, яку треба зробити для певного стовпця. Наприклад, щоб змінити оцінки всіх замовників на 200, можна ввести

UPDATE Замовники SET рейтинг = 200;

UPDATE, на зразок DELETE, може працювати з предикатами. Наприклад, можна виконати зміна, однакове для всіх замовників продавця Строкова (що має "Пном" = тисячі одна):

UPDATE Замовники

SET рейтинг = 200

WHERE Пном = 1 001;

Можна змінити і декілька стовпців. Припустимо, продавець Аврорін звільнився, і треба перепризначити його номер новому продавцеві:

UPDATE Продавці

SET лімя = 'Суворов', місто = 'Клин', комм = .10

WHERE Пном = 1 004;

Команда REFERENCES може змінювати значення у вже вставлених рядках.

Запит - команда, яка за допомогою програми бази даних виводить певну інформацію з таблиць в пам'ять. Ця інформація зазвичай надсилається безпосередньо на екран комп'ютера або термінал.

Запит формується командою SELECT (вираз (5.4)).

У найпростішій формі команда SELECT просто витягує інформацію з таблиці. Наприклад, висновок всієї таблиці "Продавці" (див. Табл. 5.3)

SELECT Пном, пімя, місто, комм

FROM Продавці; (5.6)

Крапка з комою (;) використовується у всіх інтерактивних командах SQL, щоб повідомляти базі даних, що команда закінчена і готова виконатися. Зірочка (*) в команді може застосовуватися для виведення повного списку стовпців і попередня процедура може виконуватися командою:

SELECT *

FROM Продавці;

Є велика кількість варіантів команди SELECT [26], з яких, в силу обмеженого обсягу даної роботи, розглянемо основні.

У виразі (5.6) можна задати не всі поля або переупорядкувати поля.

Пропозиція WHERE команди SELECT дозволяє встановлювати предикати, умова яких може бути або вірним або невірним для будь-якого рядка таблиці. Команда витягує тільки ті рядки з таблиці, для яких таке твердження вірне:

SELECT пімя, місто

FROM Продавці

WHERE місто = 'Москва';

У пропозиції WHERE використовуються не тільки порівняння виду <,>, О, =, ≤, ≥, а й області (безлічі), що визначаються виразами IN, BETWEEN, LIKE, IS (NOT) NULL.

До агрегатним функцій відносять COUNT (кількість рядків у таблиці), SUM (арифметичну суму всіх вибраних значень даного поля), AVG (середнє всіх вибраних значень даного поля), МАХ або MIN (найбільше або найменше з усіх вибраних значень даного поля).

Висновок агрегатних функцій (обчислюваних полів) має такий вигляд:

SELECT SUM (сумпр)

FROM Замовлення;

Він визначає в даному випадку суму всіх покупок в таблиці "Замовлення". Аналогічна команда для інших функцій.

Пропозиція GROUP BY команди SELECT дозволяє визначати підмножина значень в особливому полі в термінах іншого поля, і застосовувати функцію агрегату до підмножини. Це дає можливість об'єднувати поля і агрегатні функції в єдиній пропозиції SELECT. Наприклад, знайти найбільшу суму придбань, отриману кожним продавцем:

SELECT Пном, МАХ (сумпр)

FROM Замовлення

GROUP BY Пном;

Отримаємо

Пном

1 001 767.19

Тисячі дві 1713.23

1 003 75.75

+1014 1309.95

1 007 1098.16

GROUP BY застосовує агрегатні функції незалежно від серій груп, які визначаються за допомогою значення поля в цілому.

Пропозиція HAVING визначає критерії, необхідні для видалення певних груп з виведення. Тоді команда має вигляд

SELECT Пном, датпр, МАХ ((сумпр))

FROM Замовлення

GROUP BY Пном, датпр

HAVING МАХ ((сумпр))> 3000.00;

Аргументи в пропозиції HAVING йдуть тим же самим правилам, що і в пропозиції SELECT, що складається з команд, що використовуються в GROUP BY. Вони повинні мати одне значення на групу виводу. У суворої інтерпретації ANSI SQL не можна використовувати агрегат агрегату.

Якщо треба виконати прості числові обчислення даних (обчислювані вирази) і потім помістити їх у форму, більш відповідну потребам, то SQL дозволяє це зробити. Наприклад, якщо ввести команду

SELECT Пном, пімя, місто, комм * 100

FROM Продавці;

то в полі "комм" з'являться значення у відсотках.

Можливо впорядкування виведення по одному або декількох полях, наприклад, за зменьшенням:

SELECT *

FROM ЗАМОВЛЕННЯ

ORDER BY ЗНОМ DESC, сумпр DESC;

Замість імен стовпця можна використовувати їх порядкові номери для вказівки поля, використовуваного в упорядкуванні виводу. Ці номери можуть посилатися не на порядок стовпців в таблиці, а на їх порядок у виведенні: поле, згадане в пропозиції SELECT першим, для ORDER BY не залежить від того, яким по порядку воно коштує в таблиці. Наприклад, команда впорядкування за спаданням значення комісійних така:

SELECT пімя, комм FROM Продавці

GROUP BY 2 DESC;

Пном комм

Строков 0.17

Кирюшин 0.13

Удалов 0.15

До цих пір мова йшла про роботу з однією таблицею, однак можлива робота і з кількома таблицями. Формат команд змінюється мало, при цьому можна використовувати практично все, що застосовувалося для одиночних таблиць.

Створення об'єднання найчастіше здійснюється командою виду

SELECT Заказчікі.зімя, Продавци.пімя,

Продавци.город

FROM Продавці, Замовники

WHERE Продавци.город = Заказчікі.город;

Тут після SELECT вказуються через точку ім'я таблиці і файлу:

зімя

пімя

місто

Іванов

Строков

Москва

Іванов

Строков

Москва

Килимів

Кирюшин

Перм

Конкін

Кирюшин

Перм

Іванов

Аврорін

Москва

Крабів

Аврорін

Москва

У вказівці полів можуть використовуватися й інші умови, наприклад,

SELECT пімя, зімя

FROM Продавці, Замовники

WHERE пімя <зімя

AND рейтинг <200;

пімя зімя

Строков Красін

Аврорін Красін

Козлов Іванов

Козлов Крабів

Козлов Красін

Аналогічно виглядає і команда з'єднання трьох і більше таблиць.

Зауважимо, що можливе з'єднання таблиці самій з собою. Ця схема може використовуватися для перевірки правильності заповнення таблиці. Для цього використовуються синоніми таблиць (аліаси). Наприклад, знайти всі пари замовників, що мають однаковий рейтинг:

SELECT перв.зімя, втор.зімя, перв.рейтінг

FROM Замовники перв, Замовники втор

WHERE перв.рейтінг = перв.рейтінг;

Петров Петров 200

Петров Ковров 200

Килимів Петров 200

Килимів килимів 200

Квакін Квакін 300

Квакін Конкін 300

Крабів Іванов 100

Крабів крабів 100

Крабів Красін 100

Конкін Квакін 300

Конкін Конкін 300

Красін Іванов 100

Красін Крабів 100

Красін Красін 100

У вищезгаданій команді SQL веде себе так, як якби він з'єднував дві таблиці, звані "перша" і "друга". Обидві вони - фактично таблиці "Замовники", але псевдоніми дозволяють їм бути обробленими незалежно. Псевдоніми "першого" і "другий" були встановлені в реченні FROM запиту, відразу після імені копії таблиці. Псевдоніми можуть використовуватися в пропозиції SELECT, навіть якщо вони не визначені в пропозиції FROM.

Наступна команда буде визначати будь-які помилки в заповненні:

SELECT перв.прном, втор.зном, перв.пном,

втор.прном, втор.зном, втор.пном

FROM Замовники перв, Замовники втор

WHERE перв.зном = втор.зном

AND перв.пном <> втор.пном;

Якщо заповнення таблиці проведено вірно, то висновок буде порожнім.

При роботі з декількома таблицями запит може бути складовим, що використовують або не використовують операції оновлення. Внутрішні запити називають підзапитах.

Нехай відомо ім'я продавця (Аврорін), але значення його поля "Пном" невідомо і треба витягти всі замовлення з таблиці "Замовлення". Тоді:

SELECT *

FROM Замовлення

WHERE Пном =

(SELECT Пном

FROM Продавці

WHERE пімя = 'Москва');

Щоб оцінити зовнішній (основний) запит, SQL спочатку повинен оточити внутрішній запит (підзапит) пропозиції WHERE. Відповідь: "Пном" = 1004. Однак SQL, не просто видає це значення, а завадить його в предикат основного запиту замість самого підзапиту, так щоб предикат прочитав

WHERE Пном = 1 004.

Для роботи з декількома таблицями може використовуватися і операція об'єднання (UNION). Наприклад, для отримання всіх продавців і замовників, розмішені в Москві можна використовувати команду:

SELECT Пном, пімя

FROM Продавці

WHERE місто = 'Москва'

UNION

SELECT ЗНОМ, зімя

FROM Замовники

WHERE місто = 'Москва';

Як можна бачити, стовпці, обрані двома командами, виведені так, як якщо вона була одна. Заголовки стовпця виключені, тому що жоден із стовпців, виведених об'єднанням, що не був витягнутий безпосередньо тільки з однієї таблиці. Тільки останній запит закінчується крапкою з комою. Відсутність крапки з комою дає зрозуміти SQL, що є ще один або більше запитів.

Можливі й запити з командами оновлення, розглянутими раніше.

Можна виконати і так званий перехресний запит, результатом якого є таблиця, аналогічна таблиці в додатку Excel. Команда TRANSFORM служить для виконання такого запиту.

До цих пір мова йшла про статичному мові SQL. Дамо характеристику динамічному мови SQL. Першу частину попереднього складного оператора можна записати

SELECT Пном, пімя

FROM Продавці

WHERE місто =: місто;

Тут двокрапка перед словом "місто" означає, що заданий параметр. Його значення або вводить користувач у процесі роботи, або воно запозичується з інших таблиць в процесі виконання програми. Параметри можуть бути задані у всіх командах вибірки та оновлення.

♦ ВБУДОВАНИЙ МОВУ SQL

Дотепер розглядався інтерактивний SQL. Тепер коротко зупинимося на вбудованій мові SQL, використовуваному для розширення програм, написаних на інших мовах. Хоча непроцедур- ність інтерактивного мови SQL робить нею дуже потужним, в той же час вона накладає на мову велике число обмежень.

Щоб подолати ці обмеження, можна включати SQL в програми, написані на якому-небудь процедурному мовою. В якості такого процедурного мови приймемо Паскаль, оскільки він простий у розумінні і має напівофіційний стандарт ANSI.

Відзначимо деякі обмеження SQL.

Логічні конструкції типу if ... then (якщо ... то), for ... do (для ... виконати) і while ... repeat (поки ... повторювати), використовувані для структур більшості комп'ютерних програм, тут відсутні.

Інтерактивний SQL не може робити багато операцій зі значеннями, розміщенням або розподілом їх, виведенням їх на якийсь пристрій. Мета вбудованого SQL полягає в поєднанні можливостей декларативного і процедурного мов.

Строго кажучи, слід виділити вкладений і вбудовану мову SQL.

У першому випадку головним є мова SQL, в який вводяться оператори циклів і умовних переходів. Тут немає різкого поділу на інтерфейсний і вкладений мови. Зазвичай оператори вибірки (SELECT), оновлення (DELETE, UPDATE, INSERT), перехресного запиту (TRANSFORM) відносять до інтерактивного мови SQL. У той же час оператори CREATE, ALTER, DROP,

GRANT, REVOKE вважаються належними до вкладеного мови SQL. В якості об'єктів виступають таблиці, поля, обмеження, індекси, домени, види, генератори, тригери, збережені процедури. Присутність "алгоритмічних складових" мови найкраще видно в СУБД InterBase в тригерах і збережених процедурах.

У другому випадку оператори мови SQL "вбудовуються" в алгоритмічні мови. Часто їм є мова Pascal. Для цього команди SQL поміщаються у вихідний текст головної програми, якій передує фраза EXEC SQL (EXECute SQL). Далі обговорюються деякі команди, які є спеціальними для вкладеної форми SQL.

Коли вставляються команди SQL в текст програми, написаної на іншій мові, треба виконати прекомпіляціі перш, ніж остаточно її скомпілювати. Програма, звана прекомпілятором (або препроцесором), буде переглядати текст програми і перетворювати команди SQL у форму, зручну для використання базовою мовою. Потім використовується звичайний транслятор, щоб перетворювати програму з вихідного тексту в виконуваний код.

Іншими словами, основна програма викликає процедури SQL, які вибирають параметри з головної програми і повертають вже оброблені значення в основну програму. Модуль може містити будь-яке число процедур, кожна з яких складається з одиночної команди SQL. Ідея в тому, щоб процедури могли працювати тим же самим способом, що і процедури на мові, в який вони були вкладені.

Кожна з програм, що використовують вбудований SQL, пов'язана з ідентифікатором (ID) доступу під час її виконання. Ідентифікатор доступу, пов'язаний з програмою, повинен мати всі привілеї, щоб виконувати операції SQL, виконувані в програмі.

SQL і частини базового мови програм будуть зв'язуватися один з одним за допомогою значень змінних. Різні мови розпізнають різні типи даних для змінних і ANSI визначає еквіваленти SQL базової мови Паскаль.

Можна використовувати змінні з головної програми у вкладених операторах SQL скрізь, де будуть використовуватися вираження значень.

Головні змінні повинні:

  • • бути оголошеними в SQL DECLARE SESSION (розділ оголошень);
  • • мати сумісний тип даних з їх функціями в команді SQL;
  • • бути призначеними значенням під час їх використання в команді SQL, якщо команда SQL самостійно не може зробити призначення;
  • • передувати двокрапки (:), коли вони згадуються в команді SQL.

Нехай в програмі є чотири змінних з іменами idnum, salesperson, 1оС і comm. Вони містять значення, які потрібно вставити в таблицю "Продавці". Можна вкласти наступну команду SQL в програму

EXEC SQL INSERT INTO Продавці

VALUES (: id_num, salesperson,: loc, tcomm)

Зверніть увагу, що крапка з комою в кінці команди відсутня. Це тому, що відповідне завершення для вбудованої команди SQL залежить від мови, для якого робиться вкладення.

Команду можна включити в цикл:

while not end-of-file (input) do

begin

readln (id_num, salesperson, loc, comm);

EXEC SOL INSERT INTO Salespeople

VALUES (: id_num, salesperson,: loc,: comm);

end;

Фрагмент програми на мові Паскаль визначає цикл, який буде зчитувати значення з файлу, зберігати їх у чотирьох пойменованих змінних, зберігати значення цих змінних в таблиці "Продавці" і потім зчитувати наступні чотири значення.

Всі змінні, на які є посилання в пропозиціях SQL, повинні спочатку бути оголошені в SQL DECLARE SECTION (розділ оголошень), использующем звичайний синтаксис головного мови. Розділ оголошень повинен починатися і закінчуватися вбудованими командами SQL - BEGIN DECLARE SECTION (початок розділу оголошень) і END DECLARE SECTION (кінець розділу оголошень), яким передує, як зазвичай EXEC SQL (виконати).

Щоб оголосити змінні попереднього прикладу, можна ввести:

EXEC SQL BEGIN DECLARE SECTION;

Var

id-num: integer;

Salesperson: packed array (1 .. 10) of char;

loc: packed array (1 .. 10) of char;

comm: real;

EXEC SQL END DECLARE SECTION;

де Var - заголовок, який передує ряду оголошуються змінних і упакованим (або розпакованим) масивам.

Перемістимо рядок Строков з таблиці "Продавці" в змінні головного мови:

EXEC SQL SELECT snum, sname, city, comm INTO: id_num, salesperson,: loc,: comm

FROM Salespeople

WHERE snum = +1001;

Можливо використовувати запити, що виводять численні рядки, застосовуючи курсор. Курсор - це вид змінної, яка пов'язана із запитом. Значенням цієї змінної може бути кожен рядок, яка виводиться при запиті.

Зауважимо, що мова SQL може використовуватися як для побудови, так і для запитів, в той час як мова QBE застосовується тільки для оновлення і, в основному, для запитів.

Іншим варіантом вбудованої мови програмування SQL служить мову, використовуваний, наприклад, при застосуванні СУБД InterBase в середовищі Delphi: так званий формований запит, в якому SQL-оператори вбудовуються в мову Object Pascal за допомогою команди Queryl.SQL.Add ('...' ), де в дужках вказується SQL-оператор.

Мова QBE

Робота на мові SQL проста, але вимагає знання мови. Для користувачів, абсолютно не знайомих з програмуванням, запит може здійснюватися одним з таких способів:

  • 1) через меню і екранні форми;
  • 2) за допомогою мови Query By Example - QBE (запит за прикладом). Перший спосіб залежить від варіанту розробки СУБД, другий спосіб, запропонований М.М. Злудом і базований на численні доменів, є універсальним і не вимагає знання програмування. У зв'язку з цим розглянемо докладніше ідею побудови мови.

За допомогою цього способу на екран викликається одна або декілька таблиць. У першому стовпці кожної з них вказується ім'я таблиці (файлу). У стовпцях, під іменами полів, можуть бути вказані умови запиту. Перехід від однієї таблиці до іншої здійснюється за допомогою вказівки у відповідних полях однакових підкреслених змінних, написаних великими літерами. Виведені на друк поля вказуються символом Р (print), точкою і підкресленою змінної (наприклад, Р.А) •

Наведемо два приклади запитів, що базуються на прикладі 4.1.

Приклад 5.2. Отримати прізвища студентів 4 курсу кафедри ІіУС, що мають бал не менше 4 (рис. 5.3).

Запит прізвища по одній таблиці

Рис. 5.3. Запит прізвища по одній таблиці

Приклад 5.3. Отримати прізвища студентів, керівником яких є професор кафедри ІіУС (рис. 5.4).

Запит прізвища по декількох таблицях

Рис. 5.4. Запит прізвища по декількох таблицях

Можуть бути використані (в першому стовпці запиту) агрегатні функції (SUM, AVG, MAX, MIN, CNT-лічильник). Можливо створювати види (View).

QBE підтримує довідник таблиць [4], процедури оновлення.

Реалізація мови програмування QBE може мати кілька варіантів. Один з них для СУБД Access розглянуто в гол. 5.

 
Якщо Ви помітили помилку в тексті позначте слово та натисніть Shift + Enter
< Попередня   ЗМІСТ   Наступна >
 
Дисципліни
Агропромисловість
Аудит та Бухоблік
Банківська справа
БЖД
Географія
Документознавство
Екологія
Економіка
Етика та Естетика
Журналістика
Інвестування
Інформатика
Історія
Культурологія
Література
Логіка
Логістика
Маркетинг
Медицина
Нерухомість
Менеджмент
Педагогіка
Політологія
Політекономія
Право
Природознавство
Психологія
Релігієзнавство
Риторика
Соціологія
Статистика
Техніка
Страхова справа
Товарознавство
Туризм
Філософія
Фінанси
Пошук