Використання мови SQL при роботі з базами даних в Delphi

Автор работы: Пользователь скрыл имя, 12 Января 2011 в 22:05, лабораторная работа

Краткое описание

Мета: ознайомитися з особливостями використання структурованої мови запитів (SQL) при роботі з базами даних в середовищі Delphi.

Содержимое работы - 1 файл

Lab10.doc

— 165.00 Кб (Скачать файл)
 

    Сортування  записів

   Сортування  записів в порядку зростання  або зменшення значень полів  здійснюється за допомогою операнду ORDER BY. Після нього вказується список полів, за якими повинно виконуватися сортування. Записи будуть впорядковані в залежності від порядку зазначення полів. Спочатку виконується сортування за першим вказаним полем; далі для записів, що мають однакове значення першого поля, відбувається впорядкування за другим полем тощо.

   Сортування  може виконуватися як для індексованих, так і для неіндексованих полів. Поля в списку позначаються іменами або номерами, які відповідають порядку розташування полів в списку після ключового слова SELECT.

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

   Наприклад:

   SELECT Number, Address, Floor, Room, Square, Price

   FROM Flat

   ORDER BY Room, Price DESC, 5

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

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

  • COUNT (вираз) – підраховує число входжень заданого виразу у всі записи результуючого набору даних;
  • SUM (вираз) – визначає загальну суму значень, що визначаються параметром вираз;
  • AVG (вираз) – розраховує середнє значення;
  • MAX (вираз) – знаходить максимальне значення;
  • MIN (вираз) – знаходить мінімальне значення.

   Приклад:

   SELECT COUNT (DISTINCT Name)

   FROM Firm

   WHERE Dolgn = ‘Водій’

   В результаті виконання цього запиту виводиться кількість значень поля Name, які не повторюються, не є порожніми, і у яких значення поля Dolgn дорівнює «Водій» (іншими словами, кількість водіїв, що працюють на фірмі).

    Групування  записів

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

   SELECT Otdel, COUNT (Tab_nomer)

   FROM Firm

   GROUP BY Otdel

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

   SELECT Otdel, COUNT (Tab_nomer)

   FROM Firm

   GROUP BY Otdel

   HAVING COUNT (Tab_nomer) > 10

    Відбір  даних з декількох таблиць

   За  допомогою SQL-запиту можна легко сформувати вибірку на основі використання даних з декількох таблиць. У випадку, коли потрібно обрати поля з набору таблиць, для приналежності поля до певної таблиці використовується складене ім’я, що включає ім’я таблиці, розділову крапку та ім’я поля:

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

   Якщо  зв’язок між двома таблицями  не встановлено, то в результуючий набір  даних увійдуть всі можливі комбінації записів вказаних таблиць. На практиці рідко виникає необхідність формування подібних наборів даних. Набагато частіше між таблицями встановлюється зв’язок за певним полем або групою полів. Такий зв’язок можна встановити, використовуючи описувач INNER JOIN в секції FROM, або задаючи відповідну умову в секції WHERE.

   Наприклад, в БД є дві таблиці, в одній з яких містяться дані про всіх викладачів університету, а в іншій міститься розклад занять різних груп. Перша таблиця univer.db містить такі поля: Прізвище викладача (Fam), Посада (Posada), Кафедра (Kaf). Друга таблиця rozklad.db містить поля: Дисципліна (Discipl), Група (Grup), День тижня (Day), Час (Chas), Аудиторія (Audit), Викладач (Prep). З другої таблиці потрібно вибрати всі записи, що відносяться до пар, які проводять викладачі кафедри іноземних мов. Як видно з опису таблиць, в розкладі не вказано, на якій кафедрі працює той чи інший викладач. Тому для того, щоб вибрати необхідні відомості, потрібно використати інформацію з першої таблиці  Розв’язати поставлену задачу можна наступним чином. Між таблицями встановлюється зв’язок за прізвищем викладача і формується проміжний набір даних, що містить записи обох таблиць, у яких співпадають значення відповідних полів. Далі з цього набору виключаються всі записи, які не задовольняють заданій умові, тобто в результуючий набір даних увійдуть тільки записи таблиці rozklad, що містять інформацію про пари, які проводять викладачі кафедри іноземних мов. Реалізується це за допомогою наступного запиту:

   SELECT rozklad.*

   FROM univer INNER JOIN rozklad ON

   univer.Fam = rozklad. Prep

   WHERE (univer.Kaf = ‘Іноземних мов’)

   Але більш зручним способом є використання наступного запиту:

   SELECT rozklad.*

   FROM univer, rozklad

   WHERE (univer.Kaf = ‘Іноземних мов’) AND

   (univer.Fam = rozklad. Prep)

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

   Як  видно з наведених прикладів, перед іменами полів вказані імена відповідних таблиць. Якщо імена полів в різних таблицях не співпадають, вказувати імена цих таблиць не обов’язково, однак краще все ж таки задавати до якої саме таблиці відноситься дане поле (коли поля таблиць мають однакові імена, назва таблиці перед іменем поля повинна вказуватися обов’язково). Якщо таблиця має довге ім’я, то замість нього рекомендується вказувати псевдонім, що вказується для кожної таблиці в секції FROM. Наприклад:

   SELECT DISTINCT a.Fam, b.Grup

   FROM univer a, rozklad b

   WHERE (a.Fam = b. Prep)

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

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

   Яка з таблиць буде ведучою, визначає тип з’єднання:

  • LEFT – ліве зовнішнє з’єднання, при якому ведучою є таблиця, вказана в описі зліва від описувача виду з’єднання;
  • RIGHT – праве зовнішнє з’єднання, при якому ведучою є таблиця, вказана в описі справа від описувача виду з’єднання;
  • FULL – повне зовнішнє з’єднання, при якому ведучими є обидві таблиці.

    Вкладені  запити

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

   SELECT …

   FROM …

   WHERE поле,_що_порівнюється оператор

               (SELECT …)

   Синтаксис вкладеного запиту не відрізняється від формату основного запиту. Вкладений запит повинен міститися в круглих дужках.

    Поєднання запитів

   В деяких випадках потрібно поєднувати результати виконання декількох  операторів SELECT. Таке поєднання виконується за допомогою оператора UNION. При цьому результуючі набори даних повинні мати однаковий формат, тобто однаковий склад полів та повний збіг типів даних відповідних полів. Якщо в результуючих наборах даних, сформованих після виконання різних запитів, є один і той самий запис, то вона не дублюється у вільному наборі даних.

  1. Модифікація набору даних

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

   UPDATE Ім’я_таблиці

   SET Ім’я_поля = Вираз,

   

   Ім’я_поля = Вираз

   [WHERE Умова_відбору]

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

   Приклад змінення записів:

   UPDATE Firm

   SET Dolgn = ‘Лаборант’,

   Salary = 650

   WHERE Name = ‘Макаров В.Л.’

   Даний оператор змінює записи таблиці, у яких поле Name має значення «Макаров В.Л.». Полю Dolgn цих записів привласнюється значення «Лаборант», а полю Salary – значення 650.

   Додавання нових записів в таблицю виконується  за допомогою оператору INSERT, що має наступний формат

   INSERT INTO Ім’я_таблиці

   (Ім’я_поля, …, Ім’я_поля)

   VALUES (Значення, …, Значення)

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

   Наступний приклад демонструє запит, що дозволяє вставити новий запис в таблицю  cars. При цьому полю Number привласнюється значення «щ0001ФВ», полю Car – значення «ВАЗ-2109», полю Year - значення 1999, а поле Owner отримує значення «Іванов І.І.»

   INSERT INTO cars

   (Number, Car, Year, Owner)

   VALUES (‘щ0001ФВ’, ‘ВАЗ-2109’, 1999, ‘Іванов  І.І.’)

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

   INSERT INTO Ім’я_таблиці

   (Ім’я_поля, …, Ім’я_поля)

   SELECT …

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

   Оператор  DELETE дає змогу видалити записи та має наступний синтаксис:

   DELETE FROM Ім’я_таблиці

   [WHERE Умова_відбору]

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

   Наведений нижче оператор видаляє з таблиці work всі записи, для яких значення поля Vik менше 30, а значення поля Prof дорівнює «Менеджер»:

   DELETE FROM work

   WHERE Vik < 30 AND Prof = ‘Менеджер’

  1. Динамічні запити

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

Информация о работе Використання мови SQL при роботі з базами даних в Delphi