4. Вирази мови SQL
4.1. Introduction
У більшості команд SQL можна використовувати вираз. Візьмемо, наприклад, команду SELECT:
SELECT expr1, expr2, ... з table WHERE expression |
SELECT відбирає рядки, для яких expression є істинним, і для кожного з них відображає значення expri.
Приклади
У цьому розділі ми пропонуємо детально розглянути поняття виразу. Елементарний вираз має такий вигляд:
операнд1 opérateur операнд2
або
функція(параметри)
Приклад
У виразі GENRE = 'ROMAN'
- GENRE є операндом 1
- 'ROMAN' — це операнд 2
- = — це оператор
У виразі upper(genre)
- upper — це функція
- «genre» — це параметр цієї функції.
Спочатку ми розглянемо вирази з операторами, а потім ознайомимося з функціями, доступними у Firebird.
4.2. Вирази з операторами
Ми класифікуємо вирази з операторами за типом їх операндів:
- числові
- рядок
- дата
- булеві або логічні
4.2.1. Вирази з операндами числового типу
4.2.1.1. Список операторів
Нехай nombre1, nombre2, nombre3 — числа. Можна використовувати такі оператори:
Реляційні оператори
: число1 більше за число2 | |
: число1 більше або дорівнює числу2 | |
: число1 менше за число2 | |
: число1 менше або дорівнює числу2 | |
: число1 дорівнює числу2 | |
: число1 відрізняється від числа2 | |
: те саме | |
: число1 лежить у проміжку [nombre2,nombre3] | |
: число1 належить до списку чисел | |
: число1 не має значення | |
: число1 має значення |
Арифметичні оператори
: додавання | |
: віднімання | |
: множення | |
: ділення |
4.2.1.2. Реляційні оператори
Реляційний вираз виражає відношення, яке є істинним або хибним. Отже, результатом такого виразу є булеве значення або логічне значення.
Приклади:
![]()

![]()
4.2.1.3. Арифметичні оператори
Арифметичний вираз нам добре знайомий. Він виражає обчислення, яке потрібно виконати з числовими даними. Ми вже зустрічали такі вирази: припустимо, що ціна, записана у записах файлу BIBLIO, є ціною без податків. Ми хочемо відобразити кожну позицію разом із її ціною TTC при ставці TVA 18,6 %:
Якщо ціни мають зрости на 3%, команда буде такою:
У виразі можуть бути присутні кілька арифметичних операторів, а також функції та дужки. Ці елементи обробляються за різними пріоритетами:
1 | <---- має вищий пріоритет | |
2 | ||
3 | ||
4 | <---- нижчий пріоритет |
Коли у виразі присутні два оператори з однаковим пріоритетом, спочатку обчислюється той, що знаходиться найдалі ліворуч у виразі.
Приклади
Вираз PRIX*TAUX+TAXES буде обчислено як (PRIX*TAUX)+TAXES. Адже саме оператор множення буде використано першим. Вираз PRIX*TAUX/100 обчислюватиметься як (PRIX*TAUX)/100.
4.2.2. Вирази з операндами типу «символ»
4.2.2.1. Список операторів
Можна використовувати такі оператори:
Нехай chaine1, chaine2, chaine3 — це зразки рядків
: рядок1 довший за рядок2 | |
: рядок1 довший або дорівнює рядку2 | |
: рядок1 менший за рядок2 | |
: рядок1 менший або дорівнює рядку2 | |
: рядок1 дорівнює рядку2 | |
: рядок1 відрізняється від рядка2 | |
: те саме | |
: рядок1 знаходиться в діапазоні [chaine2,chaine3] | |
: ланцюг1 належить до списку ланцюгів | |
: рядок1 не має значення | |
: рядок1 має значення | |
: рядок1 відповідає шаблону |
Оператор конкатенації
рядок1 || рядок2 : chaine2 об'єднано з chaine1
4.2.2.2. Оператори порівняння
Що означає порівняння рядків за допомогою таких операторів, як <, <= тощо?
Кожен символ кодується цілим числом. Під час порівняння двох символів порівнюються саме їхні цілочисельні коди. Використовувана кодування відповідає природному порядку словника:
Цифри йдуть перед літерами, а великі літери — перед малими.
4.2.2.3. Порівняння двох рядків
Розглянемо відношення «CHAT» < «CHIEN». Чи є воно істинним чи хибним? Щоб здійснити це порівняння, SGBD порівнює обидва рядки символ за символом на основі їхніх цілочисельних кодів. Як тільки виявляється, що два символи відрізняються, рядок, якому належить менший із них, вважається меншим за інший рядок. У нашому прикладі «CHAT» порівнюється з «CHIEN». Отримуємо такі послідовні результати:
Після цього останнього порівняння рядок «CHAT» визнано меншим за рядок «CHIEN». Отже, співвідношення «CHAT» < «CHIEN» є істинним.
Тепер порівняємо «CHAT» та «chat».
Після цього порівняння відношення «CHAT» < «chat» визнається істинним.
Приклади


4.2.2.4. Оператор LIKE
Оператор LIKE використовується наступним чином: chaîne LIKE modèle
Взаємозв’язок є істинним, якщо chaîne відповідає modèle. Останній є символьним рядком, який може містити два символи-замінники:
що позначає будь-яку послідовність символів | |
що позначає 1 довільний символ |
Приклади

![]()
![]()
4.2.2.5. Оператор конкатенації
![]()
4.2.3. Вирази з операндами типу «дата»
Нехай date1, date2, date3 — дати. Можна використовувати такі оператори:
Оператори порівняння
справджується, якщо date1 раніше за date2 | |
справджується, якщо date1 раніше або дорівнює date2 | |
справджується, якщо date1 пізніша за date2 | |
справджується, якщо date1 пізніша за date2 або дорівнює їй | |
справджується, якщо date1 і date2 збігаються | |
справджується, якщо date1 та date2 відрізняються. | |
те саме | |
справджується, якщо date1 знаходиться між date2 та date3 | |
справджується, якщо date1 міститься у списку дат | |
справджується, якщо date1 не має значення | |
справджується, якщо date1 має значення | |
є істинним, якщо date1 відповідає шаблону | |
Арифметичні оператори
: кількість днів між date1 та date2 | |
: дата2, для якої date1-date2=число | |
: дата2, для якої дата2 – дата1 = число |
Приклади

![]()
![]()
Який вік книг у бібліотеці?

4.2.4. Вирази з булевими операндами
Нагадаємо, що булеве значення або логічне значення може приймати два значення: істина або хиба. Логічний операнд часто є результатом відносного виразу.
Нехай booléen1 та booléen2 — два булеві значення. Існує три можливі оператори, які за порядком пріоритету є такими:
| є істинним, якщо booléen1 і booléen2 обидва істинні. |
| є істинним, якщо істинним є або booléen1, або booléen2. |
| має значення, протилежне значенню booléen1. |
Приклади

Шукаються книги в діапазоні цін:
![]()
Зворотний пошук:

Зверніть увагу на пріоритет операторів!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

Для контролю пріоритету операторів використовуються дужки:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. Вбудовані функції Firebird
Firebird має вбудовані функції. Вони не можуть бути відразу використані в командах SQL. Спочатку потрібно виконати скрипт SQL <firebird>\UDF\ib_udf.sql, де <firebird> позначає каталог інсталяції Firebird:

З IBExpert ми діємо наступним чином:
- використовуємо інструмент [Script Excecutive], отриманий за допомогою опції [Tools/ Script Executive]:

- після завантаження інструменту ми завантажуємо скрипт <firebird>\UDF\ib_udf.sql:

- потім виконуємо скрипт:

Після цього попередньо визначені функції Firebird стають доступними для тієї бази даних, до якої було встановлено з’єднання під час виконання скрипта. Щоб переконатися в цьому, достатньо перейти до оглядача баз даних і клацнути на вузлі [UDF] тієї бази, до якої було імпортовано функції:

Вище наведено функції, доступні для цієї бази даних. Щоб їх перевірити, зручно мати таблицю з одним рядком. Назвемо її TEST:

і визначимо її наступним чином (правий клік на Tables / New Table):
Додамо до цієї таблиці один рядок:


Тепер перейдемо до редактора SQL (F12) і видамо таку команду SQL:
яка використовує попередньо визначену функцію cos (косинус). Наведена вище команда обчислює cos(0) для кожного рядка таблиці TEST, тобто фактично для одного рядка. Отже, просто відображається значення cos(0):
![]()
Функції UDF (User Defined Function) — це функції, які може створювати користувач, і в Інтернеті можна знайти бібліотеки таких функцій UDF. Тут ми опишемо лише деякі з тих, що доступні у завантажуваній версії Firebird (2005). Ми класифікуємо їх за переважаючим типом параметрів або за їхньою роллю:
- функції з параметрами числового типу
- функції з параметрами типу «рядок символів»
4.3.1. Функції з параметрами числового типу
| абсолютне значення числа abs(-15)=15 |
| найменше ціле число, більше або рівне nombre ceil(15,7) = 16 |
| найбільше ціле число, менше або рівне nombre floor(14,3) = 14 |
| частка від цілочисельного ділення (частка є цілим числом) nombre1 на nombre2 div(7,3) = 2 |
| залишок цілочисельного ділення (частка є цілим числом) nombre1 на nombre2 mod(7,3)=1 |
| -1, якщо nombre < 0 0, якщо nombre = 0 +1, якщо nombre > 0 sign(-6) = -1 |
| корінь квадратний з nombre, якщо nombre ≥ 0 -1, якщо nombre < 0 sqrt(16)=4 |
4.3.2. Функції з параметрами типу «рядок символів»
ascii_char(число) | символ з кодом ASCII nombre ascii_char(65) = 'A' |
lower(рядок) | перетворює chaine на малі літери lower('INFO') = 'info' |
ltrim(рядок) | Left Trim — пробіли перед текстом chaine видаляються: ltrim(' кошеня')='кошеня' |
replace(рядок1,рядок2,рядок3) | замінює chaine2 на chaine3 у chaine1. replace('chat et chien','ch','**')='**at et **ien' |
rtrim(рядок1,рядок2) | Right Trim — те саме, що ltrim, але з правого боку rtrim('кіт ')='кіт' |
substr(рядок, p, q) | підрядок chaine, що починається з позиції p і закінчується на позиції q. substr('chaton', 3, 5) = 'ato' |
ascii_val(символ) | код ASCII для caractère ascii_val('A') = 65 |
strlen(рядок) | кількість символів у chaine strlen('кошеня') = 6 |