Автор работы: Пользователь скрыл имя, 12 Января 2011 в 22:05, лабораторная работа
Мета: ознайомитися з особливостями використання структурованої мови запитів (SQL) при роботі з базами даних в середовищі Delphi.
Сортування записів
Сортування записів в порядку зростання або зменшення значень полів здійснюється за допомогою операнду ORDER BY. Після нього вказується список полів, за якими повинно виконуватися сортування. Записи будуть впорядковані в залежності від порядку зазначення полів. Спочатку виконується сортування за першим вказаним полем; далі для записів, що мають однакове значення першого поля, відбувається впорядкування за другим полем тощо.
Сортування може виконуватися як для індексованих, так і для неіндексованих полів. Поля в списку позначаються іменами або номерами, які відповідають порядку розташування полів в списку після ключового слова SELECT.
За
умовчанням здійснюється сортування в
порядку зростання значень
Наприклад:
SELECT Number, Address, Floor, Room, Square, Price
FROM Flat
ORDER BY Room, Price DESC, 5
Агрегатні функції
В SQL-запитах передбачена можливість використання так званих агрегатних функцій, які дозволяють отримати деяку загальну величину, яка розраховується на основі всіх значень набору даних або певної групи записів. В SQL існують наступні агрегатні функції:
Приклад:
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 і характеризується тим, що одна з таблиць є ведучою, а інша – веденою, і в результуючий набір даних крім записів, що задовольняють умові зв’язку, включаються і всі інші записи ведучої таблиці, у відповідність яким ставляться порожні записи.
Яка з таблиць буде ведучою, визначає тип з’єднання:
Вкладені запити
В деяких випадках неможливо розв’язати задачу шляхом використання одного запиту (наприклад, в тих випадках, коли заздалегідь не визначена умова відбору даних). Тому іноді виникає необхідність використовувати вкладені запити. В загальному випадку вкладений запит виглядає наступним чином:
SELECT …
FROM …
WHERE поле,_що_порівнюється оператор
(SELECT …)
Синтаксис вкладеного запиту не відрізняється від формату основного запиту. Вкладений запит повинен міститися в круглих дужках.
Поєднання запитів
В деяких випадках потрібно поєднувати результати виконання декількох операторів SELECT. Таке поєднання виконується за допомогою оператора UNION. При цьому результуючі набори даних повинні мати однаковий формат, тобто однаковий склад полів та повний збіг типів даних відповідних полів. Якщо в результуючих наборах даних, сформованих після виконання різних запитів, є один і той самий запис, то вона не дублюється у вільному наборі даних.
SQL
дозволяє здійснювати
UPDATE Ім’я_таблиці
SET Ім’я_поля = Вираз,
…
Ім’я_поля = Вираз
[WHERE Умова_відбору]
Результатом виконання цього оператора буде змінення значень заданих полів для всіх записів, що задовольняють умовам відбору. Вираз визначає нове значення вказаного поля.
Приклад змінення записів:
UPDATE Firm
SET Dolgn = ‘Лаборант’,
Salary = 650
WHERE Name = ‘Макаров В.Л.’
Даний оператор змінює записи таблиці, у яких поле Name має значення «Макаров В.Л.». Полю Dolgn цих записів привласнюється значення «Лаборант», а полю Salary – значення 650.
Додавання
нових записів в таблицю
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 = ‘Менеджер’
SQL-запит,
що створюється при
Информация о работе Використання мови SQL при роботі з базами даних в Delphi