Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МВ_ОБД-зф.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
962.05 Кб
Скачать

Іі. Організація самостійної роботи студента

2.1 Рекомендації студенту по роботі над курсом “Організація баз даних та знань”

Основною формою навчання студента є самостійна робота (СРС) над навчальним матеріалом. СРС повинна сприяти активізації творчого мислення студентів, формуванню високої культури розумової праці, підвищенню самостійності студентів та індивідуалізації процесу навчання. СРС складається з наступних елементів: вивчення матеріалу по підручниках, конспектах лекцій, виконання лабораторних і контрольних робіт. Студент може звертатися до викладача з питаннями для одержання письмової чи усної консультації. Однак студент повинен пам’ятати, що тільки при систематичній і завзятій самостійній роботі допомога викладача виявиться досить ефективною.

      1. Загальні поради

  • Зміст кожної теми курсу вивчається за допомогою наведеного у розділі І переліку навчальної та методичної літератури, в першу чергу використовується основна та методична література.

  • Після засвоєння змісту кожної теми курсу треба відповісти на «Запитання для самоперевірки», які наведені у цих методичних вказівках.

  • Завдання з контрольних робіт виконуються згідно наведених вимог (п.2.2)

  • Якщо виникли питання при вивченні теоретичного матеріалу або при виконанні контрольної роботи, можна звернутися до викладача, який читав установчі лекції, письмово на адресу університету звичайною або електронною поштою: kaf-infotech@ogmi.farlep.odessa.ua або dean-comp@ogmi.farlep.odessa.ua.

      1. Повчання по послідовному вивченню теоретичного матеріалу

Введення в бази даних

Цей розділ вивчається по конспекту лекцій [2], розділ 1.

Структура та функції СКБД

Цей розділ вивчається по конспекту лекцій [2], розділ 2.

Організація даних в базах даних

Цей розділ вивчається по конспекту лекцій [2], розділи 3,4.

Реляційні системи

Цей розділ вивчається по конспекту лекцій [2], розділи 5,6.

Проектування баз даних

Цей розділ вивчається по конспекту лекцій [2], розділи 7,8.

Реляційна СКБД FoxPro

Цей розділ вивчається по конспекту лекцій [2], розділ 10.

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

Реляційна СКБД FoxPro є досить вдалим прикладом локальної реляційної СКБД, що працює за архітектурою з файловим сервером. До широкого розповсюдження СКБД з клієнт/серверною архітектурою вона була досить популярною. В наш час локальні СКБД втрачають популярність, але завдяки зручності свого інтерфейсу СКБД Visual FoxPro може бути вдалим вибором для отримання перших навичок роботи з реляційними базами даних (більш професійні навички роботи з клієнт/серверною СКБД MS SQL Server 2000 студенти отримають на наступному курсі).

Робота з базою даних у СКБД Visual FoxPro починається зі створення проекту системи. Проект включає і саму базу даних (або декілька баз даних), і програмне забезпечення до баз даних. В принципі, СКБД Visual FoxPro є самодостатньою системою програмування, яка дозволяє проектувати и розробляти і самі бази даних, і додатки до них. Але можливості створення додатків до баз даних засобами Visual FoxPro не розглядаються в курсі “Організація баз даних та знань”, створенню додатків до баз даних присвячено декілька вибіркових дисциплін: “Розробка прикладних СБД”, “Застосування баз даних у інтернет-додатках”, та деякі дисципліни рівня підготовки спеціаліст та магістр. З програмного забезпечення бази даних в межах цієї дисципліни будуть розглядатися тільки запити на вибірку даних (наступний розділ). Тому в цьому розділі розглянемо створення проекту бази даних, власне бази даних, та маніпулювання даними у базі даних.

Для створення проекту треба виконати пункт меню File/New, або натиснути кнопку на панелі інструментів. Відкриється вікно “New” – вікно створення нових файлів різного типу, наведене на рис.1:

Рисунок 1 – Вікно “New” Visual FoxPro

Для створення нового проекту треба вибрати пункт “Project” і натиснути кнопку (New file) у вікні “New”. Відкриється вікно “Create” – стандартне вікно Windows для збереження файла (рис.2).

Рисунок 2 – Вікно “Create” для збереження файлу проекту

Якщо до цього для нового проекту не було створено нової папки, бажано створити її, натиснувши на кнопку (Создание новой папки) на панелі інструментів вікна “Create”, а потім перейти в цю папку, та зберегти проект. Після натискання кнопки “Сохранить” у вікні “Create” на робочій поверхні вікна програми Visual FoxPro з’являється вікно менеджера проекту – Project Manager (рис.3).

Рисунок 3 – Вікно менеджера проекту Visual FoxPro

Для створення в проекті бази даних можна клацнути на “+” біля рядка “Data” у вікні менеджеру проекту і перейти на рядок “Databases” (рис.4) і натиснути кнопку “New…”.

Рисунок 4 – Створення нової бази даних

Також можна перейти на вкладку “Data”, там перейти на рядок “Databases” (рис.5) і натиснути кнопку “New…”.

Рисунок 5 – Створення нової бази даних на вкладці “Data”

У обох випадках відкриється вікно “Create” для збереження файлу бази даних. Після створення нової бази даних з’являється порожня область нової бази даних (рис.6).

Рисунок 6 – Нова база даних

Для створення таблиць цієї бази даних потрібно клацнути правою кнопкою мишки по полю області бази даних, та в контекстному меню вибрати пункт “New Table…” (рис.7).

Рисунок 7 – Створення таблиці в базі даних

Знову відкриється вікно “Create” вже для збереження файлу таблиці; після збереження файлу таблиці відкривається вікно “Table Designer”, в якому для таблиці, що створюється, потрібно задати атрибути (поля), тобто визначити їх назви та типи даних (рис.8).

Рисунок 8 – Визначення структури таблиці

Відношення (таблиці) реляційної СКБД FoxPro записуються в DBF файли. За бажанням ці файли можна відкріпити від бази даних і зробити їх вільними таблицями (“Free Tables” рис.5,6). Також вільні таблиці можна прикріпити до бази даних. Але не потрібно робити ці дії, краще одразу кожну таблицю створювати в своїй базі даних.

В FoxPro для типів даних в таблицях можна використовувати 13 типів даних, але нам знадобляться лише наступні:

Character – символьні рядки;

Numeric – числовий тип, може бути як цілим числом, так і числом з дробової частиною;

Date – тип дата (8 байт);

Logical – логічний тип (1 байт).

Типи Date і Logical мають визначений розмір; для типів Character і Numeric потрібно задавати ширину поля (параметр Width у вікні Table Designer, рис.8). Для типу Character ширина поля – це максимальна кількість символів у символьному рядку. Для типу Numeric – кількість позицій, що відводиться для запису числа, враховуючи цифри цілої частини, знак “–” (для від’ємних чисел), а також десяткову точку і цифри дробової частини числа (параметр Decimal у вікні Table Designer, рис.8) для не цілих чисел. Наприклад, у форматі numeric(5,1) можна записати числа: 123.5, -45.4, 45, 0.5, 768.

Звичайно для кожної таблиці назначають первинний ключ. Якщо атрибут таблиці, що створюється, є первинним ключем таблиці, потрібно в колонці Index (рис.8) клацнути на стрілку, та вибрати, як значення ключа повинні упорядковуватись: за зростанням (Ascending) або за убуванням (Descending) (рис.9).

Рисунок 9 – Вибір упорядкування для індекса

Після встановлення порядку індекса потрібно перейти на вкладку «Indexes», на якій вже з’явиться ім’я індекса, і треба в колонці «Type» вибрати тип індекса «Primary» (рис.10). Тоді цей атрибут буде первинний ключем таблиці. Первинний ключ в будь-якій таблиці може бути лише один. Але в таблиці може бути декілька потенційних ключів, тобто атрибутів або сполучень атрибутів, які можуть однозначно ідентифікувати запис таблиці, тому що мають унікальні значення в таблиці. Для таких атрибутів бажано також зробити індекс, і для них вибрати тип індекса «Candidate» (рис.10).

Рисунок 10 – Вибір типу індекса

Для атрибутів, що є первинним (Primary) або потенційним (Candidate) ключами, СКБД FoxPro забороняє вводити не унікальні значення. Але перевірка виконується для нових значень, тобто тоді, коли в таблицю додається запис, або в існуючому записі змінюються значення атрибутів. Ті значення, що вже є в таблиці, не перевіряються. Тому потрібно встановлювати ключі одразу, до внесення записів в таблицю.

Для імені індекса, тобто і для імен ключів таблиць є обмеження в довжині: максимальна довжина імені складає 10 символів.

Після визначення всіх полів треба натиснути кнопку “OK” у вікні “Table Designer”, і Visual FoxPro запитає, чи буде користувач негайно вводити дані в створену таблицю (рис.11).

Рисунок 11 – Запитання Visual FoxPro про введення даних

Якщо відповісти “Так” (“Yes”), то з’явиться вікно з іменем таблиці для введення даних (рис.12).

Рисунок 12 – Введення даних в створену таблицю

Visual FoxPro слідкує за відповідністю даних, що вводяться, типу даних стовпця таблиці, але інколи повідомляє про помилку, і вимагає її усунення, а інколи намагається конвертувати дані у відповідний тип. Тому потрібно вводити дані уважно.

Для введення логічних (булєвих) значень використовуються літери:

  • для значення TRUE: T, t, Y, y;

  • для значення FALSE: F, f, N, n.

Але в програмному коді для привласнення в таблицях значень полям логічного типу використовують значення .T. (замість TRUE) та .F. (замість FALSE).

При введенні значень для атрибутів типу Date (дата) слід пам’ятати, що по умовчанню використовується американський формат дати без сторіччя, тобто mm/dd/yy. Для зміни форматів запису дати використовуються наступні команди (команди пишуться у командному вікні – вікні “Command”): SET CENTURE та SET DATE.

Команда SET CENTURE

Визначає, чи показує Visual FoxPro сторіччя в запису дати, чи тільки 2 останні цифри року.

Синтаксис

SET CENTURE { ON | OFF }

Параметри:

ON

Сторіччя при введенні і відображенні дати записується явно.

OFF

При введенні і відображенні дати використовуються останні 2 цифри року, а сторіччя мається на увазі; при цьому інтерпретація сторіччя може відрізнятися в залежності від версії Visual FoxPro. Наприклад, версії Visual FoxPro 7.0 інтерпретує рік yy як рік 20-го сторіччя, якщо yy<49, і як рік 21-го сторіччя в іншому випадку. Для впевненості у правильності завдання дати слід завжди використовувати формат дати зі сторіччям.

Команда SET DATE

Визначає формат дати: порядок запису цифр дня (dd), місяця (mm) і року (yy), та символи, що є обмежувачами поміж ними.

Синтаксис:

SET DATE [TO] AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITALIAN | JAPAN | USA

Формат дат:

AMERICAN mm/dd/yy

ANSI yy.mm.dd

BRITISH dd/mm/yy

FRENCH dd/mm/yy

GERMAN dd.mm.yy

ITALIAN dd-mm-yy

JAPAN yy/mm/dd

USA mm-dd- yy

При введенні дати під час заповнення даними таблиць потрібно тільки записувати цифри року, місяця і дня між обмежувачами, які надає Visual FoxPro, у порядку, визначеному командою SET DATE. Якщо потрібно в коді програми написати привласнення атрибуту типа Date деякого значення, то дату слід записувати у наступному вигляді: {^yyyy-mm-dd}, – наприклад, {^1998-12-25}, або використовувати функцію DATE з параметрами.

Після заповнення таблиці значеннями, її просто закривають, клацнувши значок в заголовку вікна з іменем таблиці. Ніяких дій для збереження даних виконувати не треба – Visual FoxPro автоматично зберігає всі зміни у вмісті таблиць. Створені таблиці з’являються у вікні бази даних у вигляді маленьких віконець (рис.13).

Рисунок 13 – База даних з таблицями Street, House, Flat

Для кожної таблиці в заголовку вказане ім’я таблиці, під ним наводиться перелік атрибутів (полів) таблиці.

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

Рисунок 14 – Зображення первинних та потенційних ключів таблиць

Щоб переглянути вже існуючу таблицю, потрібно подвійно клацнути мишкою по віконцю з іменем таблиці, або один раз клацнути лівою кнопкою по віконцю з іменем таблиці (виділити таблицю) і виконати пункт головного меню View/Browse, або клацнути правою кнопкою по віконцю з іменем таблиці, і вибрати з контекстного меню пункт “Browse”.

Будь-яким чином відкрита таблиця відкривається у режимі редагування записів, але не в режимі додавання. Якщо потрібно додати записи до вже існуючої таблиці, потрібно для відкритої таблиці виконати пункт головного меню View/Append Mode (для закритої таблиці цього пункта в головному меню немає – головне меню налаштовується в контексті активного об’єкта). Для відкритої таблиці можна змінювати вигляд представлення таблиці пунктами головного меню View/Edit (як при введенні даних на рис.12) та View/Browse (показує вміст таблиці у стандартному табличному вигляді, як видно з рис.15).

Рисунок 15 – Вікно перегляду таблиці (таблиця Post) у режимі “Browse”

Маніпулювання даними в таблицях Visual FoxPro

Для зміни значення окремого поля для окремого запису таблиці, її можна відкрити у режимі “Browse” (рис.15), знайти потрібний запис, та змінити значення потрібного атрибуту. Також в цьому вікні можна мишкою відмітити записи на видалення (усунення з таблиці), для цього потрібно клацнути у рядку запису, що усувається, ліворуч першого атрибута (рис.16).

Рисунок 16 – Відмітка записів на усунення

Visual FoxPro усуває записи з таблиць у два етапи: спочатку слід відмітити на усунення ті записи, що видаляються, а потім або в командному вікні написати команду PACK, або для активного вікна з відкритою таблицею виконати пункт головного меню Table/Remove Deleted Records – дії будуть аналогічні, тому що при виконанні цього пункту меню Visual FoxPro генерує команду PACK (це можна побачити у вікні “Command”). Після виконання команди PACK або пункту головного меню Table/Remove Deleted усунуті записи ніяк не можна поновити!

Шукати записи для редагування або усунення власноруч незручно для таблиць великого розміру. Краще доручити пошук потрібних записів самій програмі Visual FoxPro командними засобами.

Для відмітки записів на видалення існує команда delete. Формат запису команди:

DELETE [Scope] [FOR lExpression1] [WHILE lExpression2] [IN nWorkArea | cTableAlias] [NOOPTIMIZE]

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

Коли таблиця відкрита для перегляду, і є активною (виділеною), в головному меню присутній пункт Table (рис.17)

Рисунок 17 – Пункт меню Table для зміни властивостей та вмісту таблиці

Для відмітки записів в таблиці на видалення використовується пункт меню Table/Delete Records Після вибору цього пункту меню відкривається діалогове вікно Delete (рис.18).

Рисунок 18 – Вікно “Delete” для відмітки записів, що усуваються з таблиці

Як видно з рис.18, для команди delete можна задати три параметри: Scope, For, While. Параметр Scope використовується для визначення зони дії команди (рис.19).

Рисунок 19 – Вибір зони дії команди

При виборі для параметру Scope значення All команда delete буде застосовуватись до всіх записів таблиці – це значення і слід використовувати. Інші значення використовуються для по-записної обробки таблиць бази даних – ці можливості вважаються застарілими після прийняття для реляційних баз даних мови SQL в якості стандарту мов DDL (Data Definition Language – мова визначення даних) та DML (Data Manipulation Language – мова маніпулювання даними). Як відомо, мова SQL оперує відношенням (таблицею) бази даних як окремим об’єктом, і не передбачає по-записну навігацію по рядках таблиць (для чого призначені значення Next, Record та Rest опції Scope команди delete).

У віконцях біля слів For та While записуються предикати – умови пошуку записів таблиці, до яких буде застосовна команда. Для приближення команди delete до понять мови SQL слід задавати умови пошуку в опції For – опція While залежить від взаємного розташування записів в таблиці, що не відповідає теорії відношень (хоча і збільшує швидкість обробки даних).

Якщо умова пошуку записів в таблиці досить проста, можна одразу написати її у вікні Delete. Але більш зручно використовувати вікно Expression Builder (рис.20), яке з’явиться, якщо натиснути на кнопку у рядку For вікна Delete.

Рисунок 20 – Вікно Expression Builder

Це вікно викликається в декількох випадках при використанні візуальних засобів програми Visual FoxPro. Воно дозволяє “конструювати” вирази (в даному випадку – предикати), використовуючи поля активної таблиці (у віконці під словом Fields) та функції і операції різних типів: символьні (рядкові) функції і операції перелічені у списку під словом String, математичні – під словом Math, логічні – під словом Logical, типу дата – під словом Date.

Власне вираз пишеться (конструюється) у віконці під словом Expression. Після написання виразу можна перевірити його на відсутність синтаксичних помилок, натиснувши на кнопку у вікні Expression Builder (коли у вікні є вираз, ця кнопка стає доступною).

Команда, сконструйована у вікні Delete, з’являється у командному вікні. Інколи простіше відредагувати існуючу в командному вікні команду, ніж ще раз конструювати її у вікні Delete.

Як вже було сказано, після команди delete записи не усуваються фізично з диску, а лише відмічаються на усунення. З цих записів можна зняти відмітку на усунення: або ще раз клацнувши мишкою на відмітці про усунення запису, або за допомогою команди recall. Формат запису команди recall практично такий самий, як команди delete:

Команда RECALL

Синтаксис:

RECALL [Scope] [FOR lExpression1] [WHILE lExpression2]

[NOOPTIMIZE] [IN nWorkArea | cTableAlias]

Але як і команду delete, команду recall можна конструювати візуальними засобами Visual FoxPro, виконавши пункт головного меню Table/Recall Records(рис.17). Після вибору цього пункту меню з’являється вікно Recall, яке зовні і функціонально аналогічне вікну Delete (рис.21).

Рисунок 21 – Вікно Recall для відновлення записів, відмічених на усунення

Для зміни значень атрибуту таблиці одразу в декількох рядках використовується команда replace.

Команда REPLACE

Синтаксис:

REPLACE FieldName1 WITH eExpression1 [ADDITIVE]

[, FieldName2 WITH eExpression2 [ADDITIVE]] ... [Scope]

[FOR lExpression1] [WHILE lExpression2] [IN nWorkArea | cTableAlias]

[NOOPTIMIZE]

Як видно з формату запису команди, одною командою можна змінити значення для декількох атрибутів (FieldName1, FieldName2...) таблиці. Цю команду також можна конструювати візуальними засобами Visual FoxPro, але в цьому випадку за один раз можна конструювати команду зміни значень лише для одного атрибуту.

Для генерації команди replace використовується пункт головного меню Table/Replace Field(рис.17). Після його виконання з’являється вікно Replace Field (рис.22), нижня частина якого (Replacement criteria) зовні і функціонально аналогічна вікнам Delete та Recall.

Рисунок 22 – Вікно Replace Field для зміни значення атрибуту таблиці

У вікні Replace Field у рядку Field потрібно задати назву атрибуту, значення якого потрібно змінити. У списку, що випадає, біля слова Field перелічені всі атрибути таблиці (рис.23), з яких і треба вибрати необхідний атрибут.

Рисунок 23 – Вибір атрибута, значення якого змінюються командою replace

У віконці біля слова With (рис.22) потрібно записати нове значення атрибута – це може бути константа, функція, вираз. Якщо нове значення вираховується складним виразом, краще записати його у вікні Expression Builder (рис.20), яке викликається, якщо натиснути кнопку у рядку With (рис.22). Умови пошуку рядків таблиці, для яких буде задаватися нове значення, записується в опціях Replacement criteria.

Селекція в реляційних системах

Цей розділ вивчається по конспекту лекцій [2], розділ 11.

Для виконання практичного завдання контрольної роботи студенту можуть знадобиться додаткові відомості до розділу “Вибірка даних у СКБД Visual FoxPro”.

Для прикладів застосування команди SELECT-SQL використовується база даних City (місто), яка має 3 таблиці: Street (вулиця), House (будинок), Flat (квартира), – наступної структури:

Street (id_street, name_street)

House (id_street, number, count_flooor, count_flat)

Flat (id_street, number, number_flat, rooms, all_square)

Тут атрибути таблиць наступні:

id_street – цілочисельне поле, ідентифікатор вулиці, первинний ключ таблиці Street;

name_street – символьне (рядкове) поле, назва вулиці;

number – символьне поле, номер будинку на вулиці;

count_floor – цілочисельне поле, кількість поверхів у будинку;

count_flat – цілочисельне поле, кількість квартир у будинку;

number_flat – цілочисельне поле, номер квартири;

rooms – цілочисельне поле, кількість кімнат у квартирі;

all_square – числове поле з одним десятковим знаком, загальна площа квартири.

Таблиця Street зв’язана з таблицею House по ключу id_street. В таблиці House унікальність запису визначається двома атрибутами: id_street і number, – ідентифікатором вулиці та номером будинку на вулиці. По цих атрибутах таблиця Flat зв’язана з таблицею House.

Команда SELECT

Вибірка даних – найбільш розповсюджена операція під час роботи з базою даних. Вона здійснюється запитами до БД – командою select-sql. Команда select отримує записи з бази даних та дозволяє вибірку одного чи більше рядків або стовпців з однієї або декількох таблиць. Результатом дії будь-якої команди select є нова таблиця, тому можливі багаторівневі запити, в яких вкладені запити (запити нижнього рівня), повертають таблицю, що використовується у запиті вищого рівня.

Мова SQL є стандартом мови для реляційних баз даних, але існує багато «діалектів» мови SQL, тобто мова SQL конкретної СКБД має деякі, властиві саме їй, відмінності. Тому розглянемо головну команду мови SQL в контексті Visual FoxPro більш докладно.

Одна з відмінностей команди select-sql у контексті Visual FoxPro складається в тому, що вся команда (як і будь-яка інша команда мови Visual FoxPro) повинна бути записана у одному рядку коду програми. Якщо команда завелика для одного рядка, її можна написати в декількох рядках, але наприкінці кожного рядка, крім останнього, слід поставити символ продовження команди – символ “;” (крапка з комою). В мові Visual FoxPro можна використовувати ідентифікатори з кирилицею, але в іншому формат запису ідентифікаторів дотримується стандартних вимог: ідентифікатор починається з літери або символу підкреслення “_”, далі йде послідовність літер, цифр та символів підкреслення. Цим правилам повинні вдовольняти і так звані псевдоніми таблиць та полів таблиць: навіть якщо вони записані в лапках, синтаксис їх запису повинен вдовольняти синтаксису запису ідентифікаторів.

Повний синтаксис команди select-sql досить складний, але можна перелічити основні розділи команди, а саме:

SELECT select_list FROM table_source [ INTO destination ] [ WHERE search_condition ] [ GROUP BY group_list ] [ HAVING search_condition ] [ ORDER BY order_list]

Розділ SELECT (обов’язковий): SELECT select_list – він вказує список стовпців таблиці (select_list), яка повертається запитом.

Розділ FROM (обов’язковий): FROM table_source – він вказує з яких таблиць (table_source): базових відношень, тимчасових таблиць, представлень, – отримуються дані.

Необов’язкові розділи:

INTO destination

Дозволяє результат запиту записати або у масив (ARRAY), або у тимчасову таблицю (CURSOR – курсор), або у таблицю на диску (TABLE); без цього розділу результат запиту є віртуальною таблицею.

WHERE search_condition

Містить умови пошуку рядків таблиць, які повинні брати участь у запиті.

GROUP BY group_list

Містить перелік стовпців таблиці, за якими буде проводитись групування вибраних даних для отримання характеристик цих груп: кількості записів в групі, середнього значення, суми, максимуму або мінімуму якогось поля (чи виразу з полів).

HAVING search_condition

Містить умови відбору рядків результуючої таблиць, коли в запиті використовується групування; в цьому розділі, на відміну від розділу WHERE, звичайно записуються умови для груп; в одному запиті (з групуванням) можуть бути умови в розділі WHERE (на записи в таблицях, наприклад, будинки з кількістю поверхів не менше 9), та умови на групи в розділі HAVING (наприклад, групування виконується по вулицям, та вибираються вулиці, на яких не менше 10 багатоповерхових будинків).

ORDER BY order_list

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

Розглянемо розділи команди SELECT.

Розділ SELECT

Вказує стовпці таблиці, яка повертається запитом.

Синтаксис команди:

SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] < select_list >

Параметри команди:

ALL

Вказує, що однакові (дублюючі) рядки повертають запитом. За замовчуванням (коли не вказано ALL або DISTINCT) використовується ALL. Однакові рядки можуть з’явитися в результату запиту з таблиць, в яких немає дублюючих записів. Наприклад, з бази даних підприємства обирається наступна інформація про працівників: прізвище, ім’я, посада. Зрозуміло, що на підприємстві можуть виявитись працівники з однаковими іменем та прізвищем на однаковій посаді. В них є характеристики, що відрізняють їх один від одного, принаймні такі, як ідентифікаційний номер та серія і номер паспорту. Тому в базових таблицях бази даних немає дублюючих записів, але в запиті вони з’являються за рахунок того, що вибирається часткова інформація про працівників.

DISTINCT

Вказує, що однакові (дублюючі) рядки не повертають запитом.

TOP nExpr [ PERCENT ]

Вказує, що повертаються тільки перші nExpr рядків з таблиці, що є результатом запиту. n є ціле число у діапазоні між 0 та 32767. Якщо є ключове слово PERCENT, то повертається n відсотків записів з результуючої таблиці. Наприклад, в результаті запиту без слова TOP повинна була повернутись таблиця з 40 рядків. Якщо додати до запиту: TOP 10 – повернеться таблиця з 10 рядків. Якщо додати до запиту: TOP 10 PERCENT – повернеться таблиця з 4 рядків. Параметр TOP звичайно застосовують в запитах з розділом ORDER BY, тобто тих, що повертають упорядковані дані. Наприклад, якщо запит повертає прізвище, ім’я та зарплатню працівників підприємства, і є упорядкування за убуванням зарплатні, то наявність в запиті опції: TOP 10 – дозволить вибрати 10 працівників з самою високою зарплатнею. В результат запиту включаються всі записи з однаковим значенням атрибуту упорядкування, якщо хоч один запис входить до кількості TOP n (або TOP n PERCENT). Наприклад, є 8 працівників з самою високою зарплатнею, і 4 працівника з однаковою зарплатнею дещо нижчою, але більшою за решту працівників. Тоді запит з параметром: TOP 10 – поверне 12 записів, тобто всіх 4 працівників з однаковою зарплатнею.

< select_list >

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

Опція < select_list > має наступний синтаксис:

< select_list > ::=

    {    *         | { table_name | view_name | cursor_name | table_alias }.*         |     { column_name | expression    [ [ AS ] column_alias ] }     }    [ ,...n ]

Параметри:

*

Вказує, що повертаються всі поля всіх таблиць, що є в розділі FROM. Тобто команда: SELECT * FROM table_name – поверне просто всю таблицю з іменем table_name, як вона є.

{table_name | view_name| cursor_name | table_alias }.*

Обмежує зону дії параметру * одною вказаною таблицею. Тут в якості імені таблиці може використовуватись або ім’я базового відношення бази даних (table_name), або ім’я представлення (view_name), або ім’я курсору (тимчасової таблиці cursor_name) або псевдонім базової таблиці, представлення (table_alias). Псевдоніми визначаються в розділі from (розглядається нижче). Наприклад, з бази даних City потрібно вибрати інформацію про всі будинки на всіх вулицях, але для кожного будинку вказати назву вулиці. В таблиці House є тільки ідентифікатор вулиці, але назва вулиці є в таблиці Street. Отже, необхідно вибрати всі поля таблиці House, і поле name_street з таблиці Street для отримання потрібної інформації. Це демонструє наступний запит:

SELECT name_street, House.* ;

FROM Street, House ;

WHERE Street.id_street=House.id_street

column_name

Ім’я стовпця в таблиці, що повертається запитом. Потрібно кваліфікувати ім’я стовпця (уточнювати іменем таблиці), якщо існують стовпці з дублюючими іменами в таблицях, що перелічені в розділі FROM. Наприклад, атрибут id_street є як в таблиці Street, так і в таблиці House. Якщо запит вибирає цей атрибут, і в розділі FROM є обидві таблиці, то запис імені стовпці просто id_street викликає помилку: Ambiguous column name 'id_street'. Щоб уникнути подібної помилки, треба написати Street.id_street (або House.id_street).

expression

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

column_alias

Альтернативне ім’я стовпця (псевдонім стовпця) в результуючій таблиці. Наприклад, можна написати:

SELECT name_stree AS "Назва_вулиці"

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

column_alias може використовуватись в розділі ORDER BY, якщо виконується упорядкування за вказаним стовпцем. Але в розділах WHERE, GROUP BY, HAVING заборонено використовувати псевдоніми стовпців. Ключове слово as перед псевдонімом стовпця можна пропускати.

[ ,...n ]

В розділі select можна через кому записати декілька стовпців результуючої таблиці за описаними вище правилами.

Розділ FROM

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

Синтаксис розділу команди:

FROM { < table_source > } [ ,...n ] < table_source > ::=     table_name [ [ AS ] table_alias ]     | view_name [ [ AS ] table_alias ]     | cursor_name [[ AS ] table_alias ]     | < joined_table >

< joined_table > ::=     < table_source > < join_type > < table_source > ON < search_condition >

< join_type > ::=     [ INNER | { { LEFT | RIGHT | FULL } [ OUTER] } ]     JOIN

Параметри команди:

table_name

Ім’я таблиці.

[ AS ] table_alias

Псевдонім таблиці, під яким вона буде фігурувати у інших розділах команди select. Псевдонім для таблиці не є обов’язковим, і звичайно використовується для зменшення розміру вихідного SQL-коду для таблиць з довгими іменами. Псевдонім для таблиці є необхідним лише у випадках, коли у запиті використовується кілька копій однієї таблиці. Наприклад, є БД спортивних змагань, в якій є таблиця Command (перелік команд з їх ідентифікаторами, назвами та іншими характеристиками) та таблиця TimeTable (розклад ігор команд в турнірі), в якій є атрибути: дата і час матчу, ідентифікатор першої команди, ідентифікатор другої команди, інші відомості про матч. Якщо буде потрібно вибрати інформацію про матчі з вказівкою назв команд, що грають в матчі, а не ідентифікаторів команд, то буде потрібно зв’язати один кортеж таблиці TimeTable з двома кортежами таблиці Command, що неможливо. Тому потрібно відкрити таблицю Command два рази з різними псевдонімами, наприклад, так:

SELECT c1.name_command, c2.name_command, ...

FROM Command c2, Command c2, TimeTable

...

Як видно з цього прикладу, хоча визначається псевдонім таблиці у розділі from, використовується він вже в розділі select.

Якщо для таблиці в розділі from заданий псевдонім, то для посилання на цю таблицю в інших розділах команди select-sql потрібно використовувати саме псевдонім, а не ім’я. Якщо спробувати використати в розділі select ім’я таблиці, для якій у розділі from заданий псевдонім, то Visual FoxPro видасть повідомлення про помилку. Але набагато гірше, що використання імені таблиці замість псевдоніму у розділі where приводить до логічної помилки, тобто вибірка відбувається, але вибирається не та інформація.

view_name

Ім’я представлення. Представлення є «віртуальною таблицею», звичайно створеною з атрибутів однієї або декількох таблиць командою create view. Ця команда, так би мовити, записує під заданим іменем структуру таблиці-вибірки, і має наступний синтаксис:

CREATE SQL VIEW view_name AS SQL_select_statement

Тут SQL_select_statement – звичайна команда select-sql, але як правило без розділу order by.

cursor_name

Це є ім’я тимчасової таблиці (курсора), отриманої командою select-sql з використанням розділу: INTO CURSOR cursor_name. Курсор існує, доки його не закрили.

< joined_table >

Результуючий набір, що є декартовим добутком двох або більше таблиць. Як відомо з розділу 6 «Реляційна алгебра й реляційне вирахування» конспекту лекцій [2], декартовий добуток таблиць R i S визначає нове відношення, що є результатом конкатенації (тобто зчеплення) кожного кортежу з відношення R з кожним кортежем з відношення S. Деякі види з’єднання таблиць R i S визначають відношення, що містять деяку підмножину декартового добутку таблиць R i S; але це не зовсім вірно щодо зовнішніх з’єднань. Розділ from дозволяє реалізувати різні види з’єднань таблиць.

< join_type >

Вказує тип операції з’єднання.

INNER

Вказує, що повертаються всі пари рядків, які відповідають умові з’єднання. Виключаються рядки обох таблиць, які на відповідають умові з’єднання. Цей тип зв’язку є типом зв’язку за замовчуванням, тобто конструкція:

table_name1 JOIN table_name2 ON search_condition

еквівалентна конструкції:

table_name1 INNER JOIN table_name2 ON search_condition

FULL [OUTER]

Вказує, що повертаються всі рядки обох таблиць. При цьому, ті рядки, що відповідають умові з’єднання таблиць, повертаються зв’язаними один з одним (як для зв’язку INNER JOIN). Але повертаються і додаткові рядки: всі рядки з обох таблиць повинні бути повернуті. Якщо для рядка з лівої таблиці (ліворуч від ключового слова FULL) немає відповідного рядка в правій таблиці, він повертається доповнений значеннями NULL для всіх атрибутів правої таблиці. Аналогічно, якщо для рядка з правої таблиці ( праворуч від ключового слова FULL) немає відповідного рядка в лівій таблиці, він повертається доповнений значеннями NULL для всіх атрибутів лівої таблиці.

LEFT [OUTER]

На відміну від FULL JOIN не повертаються рядки правої таблиці, які не мають пари в лівій таблиці. Тобто повертаються всі рядки лівої таблиці, або зв’язані з рядками правої таблиці (якщо вони відповідають умові з’єднання), або доповнені значеннями NULL для всіх атрибутів правої таблиці (якщо вони не відповідають умові з’єднання).

RIGHT [OUTER]

На відміну від FULL JOIN не повертаються рядки лівої таблиці, які не мають пари в правій таблиці. Тобто повертаються всі рядки правої таблиці, або зв’язані з рядками лівої таблиці (якщо вони відповідають умові з’єднання), або доповнені значеннями NULL для всіх атрибутів лівої таблиці (якщо вони не відповідають умові з’єднання).

JOIN

Вказує, що визначений оператор зв’язку використовується до заданих таблиць або представлень.

ON <search_condition>

Вказує умову зв’язку таблиць. Умова повинна бути предикатом, в якому використовуються атрибути таблиць та операції порівняння. Наприклад, якщо в запиті використовуються таблиці Street i House (БД City), то умова зв’язку буде виглядати так:

ON Street.id_street=House.id_Street

Якщо в запиті використовуються таблиці Flat i House (БД City), то умова зв’язку буде виглядати так:

ON Flat.id_street=House.id_Street AND Flat.id_house=House.id_house

Розділ WHERE

Вказує умову, якій повинні відповідати рядки, що повертаються запитом.

Синтаксис команди:

WHERE < search_condition >

Параметри:

<search_condition>

Умова, якій повинні відповідати рядки, що повертаються запитом. Умова є комбінацією одного чи більше предикатів з використанням логічних операторів AND, OR, NOT. В цьому розділу крім умови пошуку рядків (умови фільтру), можна також включати умови зв’язків між таблицями, тоді в розділі from таблиці лише перелічуються через кому.

Формат запису умови:

< search_condition > ::=     {    [ NOT ] < predicate > | ( < search_condition > )         [ { AND | OR } [ NOT ] { < predicate > | ( < search_condition > ) } ]     }    

< predicate > ::=     {    expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression         | string_expression [ NOT ] LIKE string_expression         | expression IS [ NOT ] NULL         | expression [ NOT ] IN ( subquery | expression [ ,...n ] )         | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < }             { ALL | SOME | ANY} ( subquery )         | EXISTS ( subquery )     }

Параметри:

NOT

Інвертує значення логічного виразу: NOT TRUE = FALSE, NOT FALSE = TRUE.

AND

Комбінує дві умови та обраховує TRUE, якщо результат обох умов є TRUE.

OR

Комбінує дві умови та обраховує TRUE, якщо результат хоча б одної з умов є TRUE.

< predicate >

Вираз, який повертає значення TRUE, FALSE, або UNKNOWN.

expression

Атрибут таблиці, константа, функція, скалярний підзапит (тобто той, що повертає одне значення), або будь-яка комбінація атрибутів, констант, функцій, зв’язаних операторами.

Оператори порівняння (= , < > , ! = , > , > = , ! > , < , < = , ! <) докладно тут не розглядаються, тому що вони вже використовувались в інших дисциплінах на молодших курсах.

string_expression

Рядок символів та шаблонів символів.

[ NOT ] LIKE

Вказує, що символьний рядок праворуч містить шаблон символів для порівняння.

IS [ NOT ] NULL

Вказує пошук порожніх значень (null), або не порожніх значень (при наявності слова NOT).

[ NOT ] IN ( subquery | expression [ ,...n ] )

Вказує на пошук рядків таблиць, для яких значення виразу ліворуч від ключового слова IN, приймає значення, яке є в множині значень, записаних у круглих дужках праворуч від ключового слова IN (або немає в множині значень, з словом NOT). Множина значень задається або переліком виразів (через кому), або вкладеним запитом, який повертає один стовпець значень.

ALL

Використовується з оператором порівняння та вкладеним запитом. Повертає TRUE для предикату, якщо всі значення, в множині значень, що повертаються вкладеним запитом, задовольняють оператору порівняння, або FALSE, якщо не всі значення з множини задовольняють оператору порівняння, або якщо вкладений запит не повертає жодного рядка. Вкладений запит повинен повертати таблицю з одного стовпця.

{ SOME | ANY }

Використовується з оператором порівняння та вкладеним запитом. Повертає FALSE для предикату, якщо всі значення, в множині значень, що повертаються вкладеним запитом, не задовольняють оператору порівняння, або якщо вкладений запит не повертає жодного рядка, та повертає TRUE, якщо деякі значення з множини задовольняють оператору порівняння, Вкладений запит повинен повертати таблицю з одного стовпця.

EXISTS

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

Приклади правильних предикатів:

rooms>3

YEAR(DATE())- YEAR(birthday)>=50

name_street LIKE '%басов%'

count_flat IS NOT NULL

number IN (SELECT number FROM House WHERE count_floor>5)

count_floor>ALL (SELECT count_floor

FROM House H INNER JOIN Street S

ON H.id_street=S.id_street

WHERE name_street='Дерібасовська')

count_flat>ANY (SELECT count_flat

FROM House H INNER JOIN Street S

ON H.id_street=S.id_street

WHERE name_street='Дерібасовська')

EXIST (SELECT H.* FROM HOUSE H,Street S

WHERE H.id_street=S.id_street AND name_street='Буніна')

Розділ GROUP BY

Групірує рядки запиту ґрунтуючись на значеннях в одному або декількох стовпцях. Вказує групи, для яких розраховуються значення за допомогою агрегатних функцій: суму, кількість записів, середнє значення, максимальне значення, мінімальне значення. Якщо є розділ group by, в розділі select крім виразів з агрегатними функціями можуть бути тільки стовпці, перелічені в розділі group by. Якщо в команді select є розділ group by і немає розділу order by, упорядкування рядків результуючого набору проводиться за пунктами групування.

Синтаксис команди:

GROUP BY group_column [ ,...n ]

Параметри:

group_column

Найчастіше group_column складається з імені стовпця, за яким проводиться групування, але це може бути псевдонім стовпця, або числовий вираз, що розраховує порядковий номер стовпця у таблиці-запиті (починаючі з 1).

[ ,...n ]

Групування, як і упорядкування, може бути багаторівневим.

Приклади використання розділу group by.

Вирахувати кількість будинків на кожній вулиці:

select name_street, COUNT(*) AS kol_vo

from street s, house h WHERE s.id_street=h.id_street

group by name_street

Вирахувати загальну кількість кімнат по всіх квартирах будинку, та середню площу квартири для кожного будинку на кожній вулиці:

SELECT name_street+' д.'+h.number AS house_N,

SUM(rooms) as kol_vo, AVG(all_square) as AVG_Square

FROM street s, house h,flat f

WHERE s.id_street=h.id_street AND h.id_street=f.id_street AND

f.number=h.number

GROUP BY house_N

Агрегатні функції

Крім пошуку інформації, яка зберігається в таблицях, за допомогою запитів також можна отримувати деяку статистичну інформацію: максимальне значення деякого атрибута (або вираза з використанням атрибута), мінімальне, середнє значення. Ці можливості надають агрегатні функції. До агрегатних функцій відносяться функції COUNT, SUM, AVG, MAX, MIN. Зазвичай агрегатні функції використовуються у запитах з групуванням і обчислюють кількість записів в групі, сумму деякого атрибута для групи, середнє, мінімальне або максимальне значення для групи деякого атрибута.

Розділ HAVING

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

Синтаксис команди:

HAVING < search_condition >

Параметр:

< search_condition >

Вказує умову пошуку для груп з використанням агрегатних функцій. Наприклад, якщо в останньому запиті потрібно вибрати тільки будинки з загальною кількістю кімнат не менше 20, то після розділу: group by … – буде розділ having:

HAVING COUNT(*)>=20

Приклад: вирахувати кількість будинків на кожній вулиці, при цьому включити в результат тільки ті вулиці, на яких більше 5 будинків:

select name_street, COUNT(*) AS kol_vo

from street s, house h WHERE s.id_street=h.id_street

group by name_street

HAVING COUNT(*)>=5

В одному запиті можуть бути як розділ where, так і розділ having. Звичайно в розділі where записуються умови пошуку даних в таблицях бази даних, а в розділі having – умови пошуку груп даних, отриманих в результату виконання запиту.

Розділ ORDER BY

Вказує сортування результуючого набору. Розділ order by є неприпустимим у представленнях та вкладених запитах; але може використовуватись в них, якщо в них вказаний параметр top.

Синтаксис команди:

ORDER BY { order_by_expression [ ASC | DESC ] }     [ ,...n]

Параметри:

order_by_expression

Вказує стовпець, по якому проводиться упорядкування. Стовпець сортування вказується по імені або псевдоніму. Також можна вказати вираз, який повертає ціле число (починаючи з 1), що відповідає позиції стовпця упорядкування, рахуючи зліва направо. Припускається багаторівневе упорядкування. Послідовність стовпців сортування у розділі ORDER BY визначає організацію сортування у результуючому набору. Можна сортувати за атрибутами таблиць, які не вказані в розділі SELECT – наприклад, запит вибирає список працівників (прізвище, імя, посада та інше) без визначення статі, але потрібно, щоб спочатку в списку йшли чоловіки, потім – жінки. Тоді, якщо стать записана в атрибуті sex, і цей атрибут може мати значення ‘ч’ або ‘ж’, то опція ORDER BY буде мати вигляд:

ORDER BY sex DESC

ASC

Вказує, що значення в зазначеному стовпці повинні упорядковуватись в зростаючому (ascending) порядку від найменшого значення до найбільшого. Цей порядок обирається за замовчуванням.

DESC

Вказує, що значення в зазначеному стовпці повинні упорядковуватись в порядку убування (descending) від найбільшого значення до найменшого.

Використання мови SQL для маніпулювання даними

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

Для видалення записів використовується команда DELETE мови SQL.

Команда DELETE - SQL

Синтаксис команди:

DELETE FROM [DatabaseName!]TableName

[WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]