Оператор вибору SELECT
Мова запитів (Data Query Language) SQL складається з єдиного оператора SELECT. Цей єдиний оператор пошуку реалізує всі операції реляційної алгебри. Як просто, лише один оператор. Проте писати запити мовою SQL (грамотні запити) спочатку непросто. Треба вчитися, як і треба вчитися вирішувати математичні завдання чи складати алгоритми на вирішення складних комбінаторних завдань. Один і той же запит може бути реалізований декількома способами, і, будучи все правильними, вони можуть істотно відрізнятися за часом виконання, і це особливо важливо для великих баз даних.
Синтаксис оператора SELECT має такий вигляд:
SELECT [ALL DISTINCT] «писок полів» *1
Тут ключове слово ALL означає, що до результуючого набору рядків включаються всі рядки, які відповідають умовам запиту. Значить, до результуючого набору можуть потрапити однакові рядки. І це порушення принципів теорії відносин (на відміну від реляційної алгебри, де за умовчанням передбачається відсутність дублікатів у кожному результуючому відношенні). Ключове слово DISTINCT означає, що до результуючого набору включаються лише різні рядки, тобто дублікати рядків результату не включаються до набору.
Символ *. (зірочка) означає, що до результуючого набору включаються всі стовпці з вихідних таблиць запиту.
У розділі FROM визначається перелік вихідних відносин (таблиць) запиту.
У розділі WHERE задаються умови відбору рядків результату або умови з'єднання кортежів вихідних таблиць, подібно до операції умовного з'єднання в реляційній алгебрі.
У розділі GROUP BY задається список полів угруповання.
У розділі HAVING задаються предикати-умови, що накладаються на кожнугрупу.
У частині ORDER BY задається список полів упорядкування результату, тобто список полів, який визначає порядок сортування в результуючому відношенні. Наприклад, якщо першим полем списку буде вказано прізвище, а другим номер групи, то в результуючому відношенні спочатку будуть зібрані в алфавтному порядку студенти, і якщо знайдуться однофамільці, то вони будуть розташовані в порядку зростання номерів груп.
У виразі умов розділу WHERE можуть бути використані такі предикати:
-
Предикати порівняння < =, <>, >, =, IS NULL та IS NOT NULL.
Якщо в даному кортежі (в даному рядку) зазначений атрибут має невизначене значення, то предикат IS NULL набуває значення "Істина" (TRUE), а предикат IS NOT NULL - "Брехня" (FALSE), інакше предикат IS NULL набуває значення " Брехня», а предикат IS NOT NULL набуває значення «Істина».
Введення Null-значень викликало необхідність модифікації класичної двозначної логіки та перетворення її на тризначну. Усі логічні операції, які проводяться з невизначеними значеннями, підпорядковуються цій логіці відповідно до заданої таблиці істинності:
A B
У разі пошуку можуть бути використані всі розглянуті раніше предикати.
Відклавши на якийсь час знайомство з угрупованням, розглянемо детально перші три рядки оператора SELECT:
- SELECT – ключове слово, яке повідомляє СУБД, що ця команда – запит. Всі запити починаються цим словом із наступним пробілом. За ним може йти спосіб вибірки - з видаленням дублікатів (DISTINCT) або без видалення (ALL, мається на увазі за умовчанням). Потім слідує список перерахованих через кому стовпців, які вибираються запитом з таблиць, абосимвол '*' (зірочка) для вибору всього рядка. Будь-які стовпці, які не перераховані тут, не будуть включені в результуюче ставлення, що відповідає виконанню команди. Це, звичайно, не означає, що їх буде видалено або їх інформація буде стерта з таблиць, тому що запит не впливає на інформацію в таблицях — він лише показує дані.
- FROM - ключове слово, подібно до SELECT, яке має бути представлене в кожному запиті. Воно супроводжується пробілом і потім іменами таблиць, що використовуються як джерело інформації. Якщо зазначено більше одного імені таблиці, неявно мається на увазі, що над перерахованими таблицями здійснюється операція декартового твору. Таблицям можна надати імена-псевдоніми, що буває корисно для здійснення операції з'єднання таблиці з самою собою або для доступу з вкладеного підзапиту до поточного запису зовнішнього запиту (вкладені підзапити тут не розглядаються).
Усі наступні розділи оператора SELECT є необов'язковими.
Найпростіший запит SELECT без необов'язкових частин відповідає просто декартові твору. Наприклад, вираз
відповідає декартову добутку таблиць R1 та R2. Вираз
відповідає проекції декартового добутку двох таблиць на два стовпці А з таблиці R1 і В з таблиці R2, при цьому дублікати всіх рядків збережені, на відміну від операції проектування в реляційній алгебрі, де при проектуванні за замовчуванням усі дублікати кортежів знищуються.
- WHERE - ключове слово, за яким слідує предикат - умова, що накладається на запис у таблиці, якій вона повинна задовольняти, щоб потрапити у вибірку, аналогічно операції селекції в реляційній алгебрі.
Розглянемо базуданих, що моделює здачу сесії у деякому навчальному закладі. Нехай вона складається із трьох відносин R1, R2, R3. Будемо вважати, що вони представлені таблицями Rl, R2 та R3 відповідно.