Структурована мова запитів SQL

DATE - дата у форматі, що визначається спеціальною командою (за замовчуванням mm/dd/yy); поля дати можуть містити лише реальні дати, що починаються за кілька тисячоліть до н. та обмежені п'ятим-десятим тисячоліттям н.е.;

TIME - час у форматі, що визначається спеціальною командою (за замовчуванням hh.mm.ss);

DATETIME - комбінація дати та часу;

MONEY - гроші у форматі, що визначає символ грошової одиниці ($, руб,

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

У деяких СУБД ще існує тип даних LOGICAL, DOUBLE та інших. Проте, з метою забезпечення переносимості баз даних між різними зокрема й обчислювальними платформами, доцільно використовувати обмежений набір про «канонічних» типів даних. У даному лабораторному курсі ми обмежуватимемо цей набір типами INTEGER, VARCHAR, DATE та FLOAT.

Орієнтований працювати з таблицями SQL немає достатніх коштів на створення складних прикладних програм. Тому в різних СУБД він або використовується разом із мовами програмування високого рівня (наприклад, такими як Сі або Паскаль), або включений до складу команд спеціально розробленої мови СУБД (мова систем dBASE, R:BASE тощо). Уніфікація повних мов сучасних професійних СУБД досягається з допомогою запровадження об'єктно-орієнтованої мови четвертого покоління 4GL. Останній дозволяє організовувати цикли, умовні пропозиції, меню, екранні форми, складні запити до баз даних з інтерфейсом, орієнтованим на алфавітно-цифрові термінали, і на віконний графічний інтерфейс (X-Windows, MS-Windows).

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

Пропозиція SELECT може використовуватись як:

 самостійна команда на отримання та виведення рядків таблиці, сформованої зі стовпців та рядків однієї або кількох таблиць (уявлень);

 елемент WHEREабо HAVING-умови (скорочений варіант пропозиції, званий "вкладений запит");

 фраза вибору в командах CREAT VIEW, DECLARE CURSOR чи INSERT;

 засіб присвоєння глобальним змінним значень із рядків сформованої таблиці (INTO-фраза).

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

 зірочка (*) для позначення "все" - вживається у звичайному для програмування сенсі, тобто "всі випадки, що задовольняють визначення";

 квадратні дужки ([]) – означають, що конструкції, укладені в ці дужки, є необов'язковими (тобто можуть бути опущені);

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

 багатокрапка (. ) – вказує на те, що безпосередньо попередня синтаксична одиниця факультативно може повторюватися один або більше разів;

 пряма риса () означає наявність вибору з двох або більше можливостей. Наприклад, позначення ASCDESC вказує, чи можна вибрати один з термінів ASC або DESC; коли ж один із елементів вибору укладений у квадратні дужки, то це означає, що він вибирається за умовчанням (так, [ASC]DESC означає, що відсутність усієї цієї конструкції сприйматиметься як вибір ASC);

 точка з комою (;) – завершальний елемент пропозицій SQL;

 кома (,) – використовується для поділу елементів списків;

 пробіли ( ) – можуть вводитися для підвищення наочності між будь-якими синтаксичними конструкціями пропозицій SQL;

 великі жирні латинські літери та символи – використовуються для написання конструкцій мови SQL і повинні (якщо це спеціально не обумовлено) записуватися точно так, як показано;

 малі літери – використовуються для написання конструкцій, які повинні замінюватися конкретними значеннями, обраними користувачем, причому для визначеності окремі слова цих конструкцій зв'язуються між собою символом підкреслення (_);

 терміни таблиця, стовпець, . - Замінюють (з метою скорочення тексту синтаксичних конструкцій) терміни ім'я_таблиці, ім'я_стовпця, . відповідно;

 термін таблиця – використовується для узагальнення таких видів таблиць, як

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

Пропозиція SELECT має такий формат:

SELECT [DISTINCT ALL]

[HAVING ] ] [ORDER BY ]

Розглянемо вищенаведений формат докладніше.

SELECT – ключове слово, що означає початок запиту мови SQL. Слідом за ключовим словом SELECT має бути наведений список стовпців

таблиці або таблиць, що беруть участь у запиті, які повинні бути присутніми в результуючій таблиці.

DISTINCT – ключове слово, що дозволяє виключити влучення у вибірку результатів-дублікатів.

* - ключовий елемент, що показує, що у вибірку потраплять усі стовпці таблиці або таблиць.

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

FROM – ключове слово, яке дозволяє визначити список таблиць, що беруть участь у запиті. Тут також можна використовувати псевдоніми за допомогою ключового AS.

WHERE – дозволяє накласти умову за якою буде проведена вибірка

необхідні дані. Умова являє собою предикат, що має значення true. Цей вираз може включати будь-яку кількість різних умов для цього необхідно використовувати ключові слова AND, OR, NOT та інші. GROUP BY – ключове слово після якого слідує вираз, на основі якого буде проводитися групування результатів виконання запиту. Використовується разом із агрегатними функціями.

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

ORDER BY – здійснює впорядкування результатів вибірки на основі наступного списку стовпців.

Наведемо низку простих запитів до навчальної бази даних.

Отримати всі записи таблиці students:

SELECT * FROM students

Отримати всі записи таблиці groups:

SELECT * FROM groups

Отримати список усіх прізвищстудентів:

SELECT lastname FROM students

Отримати список усіх студентів відсортований на прізвище:

SELECT lastname, firstname, secondname FROM students ORDER BY lastname ASC

Тут ключове слово ASC означає сортування за зростанням, якщо необхідний зворотний порядок сортування, використовуйте DESC.

Отримати список викладачів з ім'ям Олександр

SELECT * FROM prepods WHERE firstname='Олександр'

Результатом цієї вибірки буде таблиця, в яку потраплять лише ті викладачі кафедри, ім'я яких Олександр.

Отримати список студентів, прізвище яких починається на літеру «А»:

SELECT * FROM students WHERE lastname LIKE 'А%'

Тут ключове слово LIKE дозволяє здійснити вибірку підстроювання. Знак відсотка % показує, що тут можуть бути будь-які інші дані.

Для забезпечення зв'язку двох таблиць у результуючій вибірці можна скористатися умовою у розділі WHERE:

SELECT students.lastname, students.firstname, groups.number FROM students, groups WHERE students.group_id = groups.id

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

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

SELECT s.lastname AS 'Прізвище', s.firstname AS 'Ім'я' FROM students s WHERE s.firstname LIKE 'Про%'

Результатом даної вибірки буде таблиця з двома стовпцями: «Прізвище» та «Ім'я», рядками таблиці будуть студенти, ім'я яких починається з літери «О».

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

 COUNT - числозначень у стовпці,

 SUM - сума значень у стовпці,

 AVG - середнє значення в стовпці,

 MAX - найбільше значення в стовпці,

 MIN - щонайменше значення в стовпці.

Для функцій SUM і AVG стовпець, що розглядається, повинен містити числові значення.

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

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

Аргумент усіх функцій, крім COUNT(*), може передувати ключове слово DISTINCT (різний), що вказує, що надлишкові дублюючі значення повинні бути виключені перед тим, як буде застосовуватися функція. Спеціальна функція COUNT(*) служить для

підрахунку всіх без винятку рядків у таблиці (включаючи дублікати).

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

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

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

Фраза HAVING відіграє таку ж роль для груп, що і фраза WHERE для рядків: вона використовується для виключення груп, так само, як WHERE використовується для виключення рядків. Ця фраза включається в пропозицію лише за наявності фрази GROUP BY, а вираз у HAVING має набувати єдиного значення для групи.