- •Тема 5. Запити на мові sql
- •Діалекти sql
- •Типи даних в sql
- •Прості запити на мові sql
- •Проекція в sql
- •Порівняння рядків
- •Значення дати і часу в sql
- •Значення null і операції з ним
- •Значення unknown і операції з ним
- •Запити до декількох відношень Декартів добуток і з’єднання відношень у sql
- •Розрізнення одноіменних атрибутів кількох відношень
- •Змінні кортежів та псевдоніми відношень
- •Об’єднання запитів
- •Мова sql. Підзапити та вирази з’єднання Підзапити
- •Підзапити для обчислення скалярних значень
- •Умови рівня відношення
- •Умови рівня кортежу
- •Корельовані підзапити
- •Підзапити в реченнях from
- •Вирази з’єднання в sql
- •Перехресне з’єднання
- •Тета-з’єднання
- •Натуральне з’єднання
- •Зовнішнє тета-з’єднання
- •З’єднання у діалектах Jet sql та Transact sql
- •Приклад правого зовнішнього з’єднання для Oracle:
Прості запити на мові sql
На цій стадії виходимо з того, що відношення створені. Розглянемо запит до відношення
що передбачає вибір даних про всі фільми, зняті на студії „Disney” в 1990 році. На мові SQL запит виглядає так:
Ця структура відповідає операції вибору реляційної алгебри
.
Відношення R |
Речення FROM |
Умова C |
Речення WHERE |
Порада. Вивчати і писати запити краще в порядку речень:
FROM,
WHERE,
SELECT.
Проекція в sql
При необхідності ми можемо видалити з запиту деякі атрибути, замість „*”перелічивши явно ті атрибути, що залишаються.
Таким чином, виразу реляційної алгебри:
відповідає простий запит
SELECT L FROM R WHERE C,
де L – список виразів, R – відношення, С – умова.
Перейменування атрибутів
Інколи треба отримати відношення, в якому назви атрибутів відрізняються від назв атрибутів відношення, названого у реченні FROM. Тоді супроводжуємо ім’я атрибуту службовим словом AS та псевдонімом (alias), який стане заголовком відповідного стовпчика результуючої таблиці. Службове слово AS не є обов’язковим; можна лише розділити ім’я та псевдонім пробілом.
Нехай треба видати фільми студії Disney, випущені в 1990 році, змінивши назви стовпчиків з title i lenth на name i duration.
Результат:
Обчислювані вирази
На місці імен атрибутів можуть стояти обчислювані вирази. Тобто простий запит може виконувати операцію розширеної проекції.
Приклад 5.1. Нехай треба отримати результат як у попередньому прикладі, але тривалість фільму треба виразити не в хвилинах, а в годинах.
Результат:
Виведемо ще одиницю виміру:
Результат:
Вибір в SQL
Як бачимо, умовні вирази в SQL створюються на основі шести загальноприйнятних операторів порівняння:
= дорівнює
<> не дорівнює
< менше
> більше
<= менше або дорівнює
>= більше або дорівнює
Чутливість до регістру. Компілятор SQL розрізняє букви верхнього і нижнього регістрів лише якщо вони набрані у складі рядка, поміщеного в лапки. У SQL-виразі можна писати From у будь-якому регістрі, але в символьній константі ‘From’ <> ‘FROM’.
Приклад 5.2. Наступний запит видає всі чорно-білі фільми, випущені після 1970 року.
Пряме звертання до InColor можливе, якщо цей атрибут логічного (булевого) типу.
Наступний запит видає назви фільмів, знятих студією MGM та або випущені після 1970 року, або мають тривалість менше 90 хвилин.
Пріорітет операцій, як в інших мовах програмування:
NOT,
AND,
OR.
Тому дужки суттєві, оскільки без них вираз виконувався би інакше.
Порівняння рядків
Два рядки вважаються рівними, якщо вони складаються з однакових символів, які слідують в одному порядку. Рядок з кількох символів може зберігатись у різних типах даних (як-от CHAR і VARCHAR), але однакові по змісту рядки будуть рівні між собою.
Операторами
порівняння >, <, >=, <= рядки
порівнюються в лексикографічному
(алфавітному) порядку. Алгоритм порівняння
рядків
та
зрозумілий:
Якщо ”менше” , то
або
,
або
та
,або та
,
та
,і т.д.
Умова
<
виконується також якщо n<m
та
=
,
тобто перший рядок є префіксом другого.
Наприклад,
‘fodder’<’foo’
‘bar’<’bargain’
‘aaa’<’AAA’ ??? У Jet SQL певного порядку не спостерігається.
Asc("A")=97, Asc("a")=65
Asc("F")=70, Asc("f")=102
На сервері Ms SQL Server при сортуванні порядок українського алфавіту підтримується вірно. У MySQL, наприклад, українські букви і, є йдуть до а.
Порівняння рядків зі зразком
Вираз порівняння виглядає так:
s LIKE p ,
Де s – рядок, що тестується, а p – зразок, тобто рядок, який може містити необов’язкові символи-шаблони:
Таблиця 5.12. Символи-шаблони в SQL
Символи шаблону ANSI* |
Символи шаблону Jet SQL |
Символи шаблону Transact SQL |
Символи в рядку, що тестується |
% |
% та * |
% |
Нульова або більша кількість будь-яких символів |
_ |
_ та ? |
_ |
Один довільний символ |
|
# |
|
Будь-яка одиночна цифра (0-9) |
|
[список_символів] |
[список_символів] |
Одиночний символ, який входить у список |
|
[!список_символів] |
[^список_символів] |
Одиночний символ, який не входить у список |
|
[символ1-символ2] |
[символ1-символ2] |
Одиночний символ, який належить до вказаного діапазону** |
* Символи шаблону ANSI доступні для використання лише при використанні ядра Microsoft® Jet версии 15.X і програми Microsoft OLE DB Provider для Jet. В іншому разі вони сприймаються як звичайні символи.
**Наприклад: [А-Я] – одна з заглавних букв; [a-яA-Я0-9] – будь-яка буква або цифра.
Приклад 5.3. Нехай ми намагаємося пригадати назву фільму, у якого назва починається зі слова „Star” та наступне слово має 4 букви. Для видачі усіх таких назв напишемо запит:
У запит будуть уключені фільми, такі, як Star Wars та Star Trek.
Приклад 5.4. Нехай треба відібрати всі англомовні назви, які містять частку ‘s присвійного відмінку. Слід виконати запит:
Оскільки символ „’” обмежує рядки, він не може представляти себе безпосередньо. Але існує умова: два апострофа підряд трактуються як апостроф як такий, а не як символ обмеження рядка. Тому підрядок ‘’s представляє шуканий рядок ‘s. Будуть знайдені такі назви, як „Logan’s Run” або “Alice’s Restaurant”.
