Мета розділу – ознайомлення з оператором SELECТ, який є одним з найбільш важливих та затребуваних операторів SQL, з його форматом та властивостями.
Оператор SELECT – один із найважливіших операторів SQL, що використовується найчастіше за інші [4, 6]. Він дозволяє вибирати необхідну інформацію з відношень БД і перетворювати її до того вигляду, який задовольняє користувачів. За його допомогою можна реалізувати досить складні й громіздкі умови вибору даних з різних взаємопов’язаних таблиць.
Оператор SELECT повністю абстрагований від питань подання даних [4, 6 – 8]. Уся увага при його застосуванні сконцентрована на проблемах доступу до даних. Він має такий формат:
SELECT [DISTINCT | ALL] {* | <значення>[, <вираз> ...]}
FROM <таблиця>[,<таблиця> ...]
[WHERE <умови пошуку>]
[ORDER BY <список стовпців>]
[GROUP BY стовпець [COLLATE collation]
[, стовпець] [COLLATE collation], ...]
[HAVING <умови пошуку>]
[UNION <оnepaтор SЕLECT>]
[PLAN <план виконання запиту>]
Цей формат з першого погляду здасться досить складним, але при поступовому вивченні можливостей оператора SELECT Ви побачите наскільки він простий.
У найпростішому випадку оператор SELECT має такий вигляд:
SELECT [DISTINCT | ALL] {* | <значення>[, <значення> ...]}
FROM <таблиця>[,<таблиця> ...]
Стосовно реляційної алгебри даний оператор виконує операцію проекції. Після пропозиції FROM наводиться список таблиць БД, з яких будемо вибирати інформацію, а після SELECT – список значень. У більшості випадків це імена стовпців таблиць, перелічених після пропозиції FROM. Зірочка вказує на те, що при виконанні запиту потрібно включити всі стовпці таблиць.
Выдать набор данных, содержащий все атрибуты и кортежи отношения Readers (табл. 6.1).
SELECT *
FROM Readers
Це еквівалентно
SELECT Code, FamilyName, Name, Patronymic, ReaderCardNumber, PasportCode, Job, Post, Note
FROM Readers
Таблиця 6.1
ReaderCode | FamilyName | Name | Patronymic | ReaderCardNumber | PasportCode | Job | Post | Note |
---|---|---|---|---|---|---|---|---|
1 | Іванов | Петро | Іванович | 317 | 4 | НГУ, каф. ЭВТ | Асистент | NULL |
2 | Федорец | Ірина | Олегівна | 28 | 1 | НГУ, АХЧ | Вахтер | NULL |
3 | Ільїн | Іван | Петрович | 1345 | 11 | НГУ, каф. фізики | Доцент | NULL |
4 | Суренко | Дмитро | Павлович | 543 | 6 | НГУ, каф. геофізики | Ст. викладач | NULL |
5 | Коршунова | Наталя | Юріївна | 128 | 8 | НГУ, каф. геоіформатики | Асистент | NULL |
6 | Носенко | Олег | Володимирович | 5672 | 5 | НГУ, ІКК | Інженер | NULL |
7 | Брусов | Володимир | Михайлович | 485 | 24 | НГУ, каф. геодезії | Лаборант | NULL |
8 | Козирєв | Олексій | Сергійович | 759 | 15 | НГУ, каф. кримінології | Професор | NULL |
9 | Левченко | Юлія | Павлівна | 146 | 18 | НГУ, каф. політичної теорії | Завідувач кафедри | NULL |
10 | Світла | Тетяна | Іванівна | 2021 | 22 | НГУ, каф. перекладу | Ст. викладач | NULL |
11 | Щиглів | Петро | Євгенович | 997 | 14 | НГУ, каф. електропостачання | Асистент | NULL |
12 | Кириленко | Віктор | Олександрович | 1010 | 17 | НГУ, каф. електроприводу | Заступник декана | NULL |
Оператор SELECT дозволяє формувати стовбці, які містять результати розрахунків. Для цього використовують арифметичні вирази, що побудовані за правилами, прийнятими у алгоритмічних мовах.
SELECT [DISTINCT | ALL] {* | <значення>[, <вираз> ...]}
FROM <таблиця>[, <таблиця> ...]
ПРИКЛАД 6.2
Для кожної книжки з таблиці BookInventoryNumbers визначіть величину добутоку її ціни на суму значень коду й фонду книжок.
SELECT Code, InventoryNumber, (BookCode + FundCode) * Cost
FROM BookInventoryNumbers
Необхідно розуміти, що цей приклад не має логічного навантаження. Він наведений тільки для демонстрації можливостей оператора SELECT. Результат, отриманий за допомогою обчислення виразу (BookCode + FundCode) × Cost для кожного запису таблиці BookInventoryNumbers, заноситься у стовпець, якому за замовчуванням СКБД привласнила ім'я Column3 (табл. 6.2).
Таблиця 6.2
Code | InventoryNumber | Column3 |
---|---|---|
1 | 4567890 | 31,12 |
2 | 4510000 | 66,99 |
3 | 4532477 | 136,04 |
4 | 4512890 | 64,95 |
5 | 4678532 | 397,46 |
6 | 4632112 | 80,80 |
7 | 7569832 | 661,5 |
8 | 5478956 | 405,9 |
9 | 2145876 | 592,5 |
10 | 5214786 | 360,5 |
11 | 5268933 | 816,2 |
12 | 7865890 | 277,16 |
13 | 6589321 | 476,97 |
14 | 7812639 | 673,82 |
15 | 7523690 | 419,85 |
Можливо перейменувати будь-який стовпець таблиці, що є результатом роботи оператора SELECT. Для цього потрібно після виразу або імені стовпця вихідної таблиці вказати пропозицію AS і далі нове ім’я:
SELECT [DISTINCT | ALL] {* | <значення>[, <вираз[AS <ім'я стовпця>]> ...]}
FROM <таблиця>[,<таблиця> ...]
ПРИКЛАД 6.3
Надайте ім'я «Example» стовпцю, що обчислюється за допомогою арифметичного виразу, розглянутого у попередньому прикладі.
SELECT Code, InventoryNumber, (BookCode + FundCode) * Cost AS Example
FROM BookInventoryNumbers
Записами (рядками), що повторюються, вважаються ті, які мають ідентичні значення у всіх стовпцях таблиці. Якщо результуюча таблиця повинна вміщувати лише унікальні записи, то після SELECT указують пропозицію DISTINCT. Якщо в результуючу таблицю необхідно включити усі записи, то вказують ALL. Ця пропозиція діє за замовчуванням:
SELECT [DISTINCT | ALL] [DISTINCT | ALL] {* | <значення>[, <вираз> ...]}
FROM <таблиця>[,<таблиця> ...]
ПРИКЛАД 6.4
Виведіть коди бібліотекарів, які видавали книжки (табл. 6.3).
SELECT OutLibrarianCode
FROM BookGiveOutRecord
Таблиця 6.3
OutLibrarianCode |
---|
4 |
4 |
4 |
3 |
10 |
7 |
8 |
9 |
8 |
9 |
10 |
Зверніть увагу на те, що результат виконання запиту містить рядки, які дублюються, оскільки, на відміну від операції проекції реляційної алгебри, оператор SELECT за замовчуванням їх не виключає. Для вилучення рядків, що дублюються, з результуючої таблиці використовується пропозиція DISTINCT (табл. 6.4):
SELECT DISTINCT OutLibrarianCode
FROM BookGiveOutRecord
Таблиця 6.4
OutLibrarianCode |
---|
4 |
3 |
10 |
7 |
8 |
9 |
У відношенні, що формує оператор SELECT, послідовність розміщення кортежів невизначена. Це зручно далеко не завжди. Установити, за якими атрибутами необхідно відсортувати кортежі, можна в пропозиції ORDER BY. Вона містить список імен стовпців, що поділені комами, за яким буде здійснюватися сортування. Перший стовпець у списку буде використаний для глобального сортування, другий – для сортування всередині групи, що визначена єдиним значенням першого стовпця, і т.д.
SELECT [DISTINCT | ALL] [DISTINCT | ALL] {* | <значення>[, <вираз> ...]}
FROM <таблиця>[, <таблиця> ...]
ORDER BY <список стовпців>
ПРИКЛАД 6.5
Створить список читачів бібліотеки за абеткою (табл. 6.5).
SELECT *
FROM Readers
ORDER BY FamilyNamе, Name, Patronymic
Таблиця 6.5
ReaderCode | FamilyName | Name | Patronymic | ReaderCardNumber | PasportCode | Job | Post | Note |
---|---|---|---|---|---|---|---|---|
7 | Брусов | Владимир | Михайлович | 485 | 24 | НГУ, каф. геодезії | Лаборант | NULL |
1 | Іванов | Петро | Іванович | 317 | 4 | НГУ, каф. ЭВТ | Асистент | NULL |
3 | Ільїн | Іван | Петрович | 1345 | 11 | НГУ, каф. фізики | Доцент | NULL |
12 | Кириленко | Віктор | Олександрович | 1010 | 17 | НГУ, каф. електроприводу | Заступник декана | NULL |
8 | Козирєв | Олексій | Patronymic | 759 | 15 | НГУ, каф. кримінології | Професор | NULL |
5 | Коршунова | Наталя | Юріївна | 128 | 8 | НГУ, каф. геоіформатики | Асистент | NULL |
9 | Левченко | Юлія | Павлівна | 146 | 18 | НГУ, каф. політичної теорії | Завідувач кафедри | NULL |
6 | Носенко | Олег | Володимирович | 5672 | 5 | НГУ, ІКК | Інженер | NULL |
10 | Світла | Тетяна | Іванівна | 2021 | 22 | НГУ, каф. перекладу | Ст. викладач | NULL |
4 | Суренко | Дмитро | Павлович | 543 | 6 | НГУ, каф. геофізики | Ст. викладач | NULL |
2 | Федорец | Ірина | Олегівна | 28 | 1 | НГУ, АХЧ | Вахтер | NULL |
11 | Щиглів | Петро | Євгенович | 997 | 14 | НГУ, каф. електропостачання | Асистент | NULL |
У набір даних, що повертає оператор SELECT, можна поміщати тільки ті записи, які відповідають деяким заданим умовам відбору або умовам пошуку, які вказують у пропозиції WHERE оператору SELECT:
SELECT [DISTINCT | ALL] [DISTINCT | ALL] {* | <значення>[, <вираз> ...]}
FROM <таблиця>[,<таблиця> ...]
ORDER BY <список стовпців>
WHERE <умови пошуку>
Умови пошуку за термінологію ISO поділяють на п'ять основних типів – п'ять предикатів: порівняння, влучення у діапазон, відповідність шаблону, приналежність до множини та наявність визначника NULL.
Порівняння дозволяє порівнювати результати обчислення одного виразу з результатами обчислення іншого. Як вирази застосовуються: константи, значення атрибутів, арифметичні вирази, скалярні оператори SELECT. Між виразами можуть бути задіяні такі оператори порівняння: = (дорівнює), < (менше), > (більше), <=(менше або дорівнює),>= (більше або дорівнює), !< (не менше, тобто більше або дорівнює), !> (не більше, тобто менше або дорівнює), <> (не дорівнює), != (не дорівнює).
Результати порівняння декількох виразів можуть бути об'єднані операторами OR і AND. Використання оператора NOT дозволяє одержати інверсію результату порівняння виразів. Належність значень до заданого діапазону можна перевірити, об'єднавши два результати порівняння за допомогою оператора AND. Також у мові SQL є спеціальна функція BETWEEN, яка дозволяє перевірити належність результатів обчислення виразу заданому діапазону. Для перевірки відповідності виразу деякому шаблону в мові SQL передбачені такі оператори: LIKE, CONTAINING, STARTING. Належність результатів обчислення виразу множині перевіряється за допомогою оператора IN. Перевірка наявності невизначеного значення в атрибуті відношення здійснюється оператором IS NULL.
Порівняння констант зі значеннями в атрибуті відношення – одна із простих умов пошуку, що задіяна у пропозиції WHERE оператора SELECT.
ПРИКЛАД 6.6
Складіть список бібліотекарів з табельним номером, який більше числа 80.
σClockNumber > 80 (Librarians)
SELECT *
FROM Librarians
WHERE ClockNumber > 80
Тут Librarians – є вихідним відношенням, а вираз ClockNumber > 80 – предикатом. Операція вибірки визначає нове відношення, що містить тільки ті кортежі вихідного відношення, у яких значення атрибута ClockNumber перевищує число 80 (табл. 5.1).
Порівняння значень атрибутів відношень у більшості випадків використовується для реалізації їх внутрішнього з'єднання.
ПРИКЛАД 6.7
Створіть список усіх читачів, які коли-небудь брали книжки у бібліотеці (табл. 5.4).
(ПCode, FamilyName, Name(Readers))►◄Readers.Code = ReaderCode(ПCode, ReaderCode, InventoryCode(BookGiveOutRecord))
У прикладі тета-з'єднання для складання цього списку використовувалось з'єднання за еквівалентністю. У ньому були присутні два атрибути Readers.Code і ReaderCode. Коли б вони мали однакове ім'я, наприклад ReaderCode, то для вилучення з результуючого відношення одного із них можна було б скористатися операцією натурального з'єднання:
(ПReaderCode, FamilyName, Name(Readers))►◄(ПCode, ReaderCode, InventoryCode(BookGiveOutRecord))
Оператор SELECT буде мати такий вигляд:
SELECT Readers.Code, FamilyName, Name, BookGiveOutRecord.Code, BookGiveOutRecord.ReaderCode, ReaderCode, InventoryCode
FROM BookGiveOutRecord, Readers
WHERE Readers.Code = BookGiveOutRecord.ReaderCode
При виконанні оператора SELECT для кожного кортежу відношення BookGiveOutRecord у таблиці Readers вибирається рядок, де значення атрибута ReaderCode збігається зі значенням атрибута Code поточного кортежу відношення Readers. При цьому не має значення, у який послідовності розташувати стовпці таблиць в умові пошуку: Readers.Code = BookGiveOutRecord.ReaderCode ідентично BookGiveOutRecord.ReaderCode = Readers.Code.
Для тета-з'єднання двох відношень R і S результуюче відношення формується у такій логічній послідовності:
ЗАУВАЖЕННЯ! Визначення «логічна послідовність» вжите не випадково. У проектуванні СКБД завжди розрізняють два рівні – логічний та фізичний. Логічний рівень – це найчастіше абстрактний рівень, оскільки нам так легше розуміти процеси. Фізичний рівень визначає процеси, які дійсно відбуваються, але у більшості випадків сховані від погляду. Фізичні процеси можуть і не збігатися з логічним уявленням про них.
SQL-сервер при виконанні запиту завжди прагне його оптимізувати, тобто виконати максимально швидко при мінімальних витратах ресурсів. Зокрема, оптимізація запитів в InterВase являє собою «чорну скриню», тобто не можна сказати, як саме буде виконуватися конкретний запит, оскільки при оптимізації не останню роль відіграє поточний стан БД. Процес оптимізації запитів буде розглянутий далі.
Порівняння значення стовпця з результатом обчислення виразу найчастіше застосовується при використанні механізму вкладених підзапитів (операторів SELECT, що вкладені один в один), мова про які піде пізніше. Спочатку розглянемо випадок, коли результат обчислення виразу порівнюється із вмістом атрибута відношення.
ПРИКЛАД 6.8
Для кожної книжки визначіть величину добутку її ціни на суму значень коду та фонду книги. Виберемо тільки ті рядки, у яких результат, отриманий при обчисленні даного виразу перевищує число 120 (табл.6.6).
SELECT Code, InventoryNumber, (BookCode + FundCode) * Cost AS Example
FROM BookInventoryNumbers
WHERE ((BookCode + FundCode) * Cost) > 120
Таблиця 6.6
Code | InventoryNumber | Example |
---|---|---|
3 | 4532477 | 136,04 |
5 | 4678532 | 397,46 |
7 | 7569832 | 661,5 |
8 | 5478956 | 405,9 |
9 | 2145876 | 592,5 |
10 | 5214786 | 360,5 |
11 | 5268933 | 816,2 |
12 | 7865890 | 277,16 |
13 | 6589321 | 476,97 |
14 | 7812639 | 673,82 |
15 | 7523690 | 419,85 |
Використання операторів AND, OR і NOT дозволяє будувати більш складні умови пошуку. Для усунення будь-якої можливої неоднозначності рекомендується використовувати дужки. Вирази обчислюються за наступними правилами:
вираз обчислюється зліва направо;
першими обчислюються підвирази у дужках;
оператори NOT виконуються раніше операторів AND і OR;
оператори AND виконуються попереду операторів OR;
ПРИКЛАД 6.9
Наведіть прізвища, імена та по батькові тих читачів, які займають посади доцентів або асистентів (табл. 6.7).
SELECT Code, FamilyName, Name, Patronymic, Job, Post
FROM Readers
WHERE Post = ‘Доцент’ OR Post = ’Асистент’;
У цьому прикладі для вибірки відомостей про читачів, які займають посади доцентів або асистентів, у пропозиції WHERE використовується логічний оператор OR: Post = ‘Доцент’ або Post = ’Асистент’.
Таблиця 6.7
Code | FamilyNamе | Name | Patronymic | Job | Post |
---|---|---|---|---|---|
1 | Іванов | Петро | Іванович | ДГУ, каф. ЕВТ | Асистент |
3 | Ільїн | Іван | Петрович | ДГУ, каф. фізики | Доцент |
5 | Коршунова | Наталя | Юріївна | ДГУ, каф. геоінформатики | Асистент |
11 | Щиглів | Петро | Євгенійович | НГУ, каф. електропостачання | Асистент |
У прикладі 6.7 у переліку стовпців після пропозиції SELECT і в умовах пошуку після WHERE перед іменем стовпця через крапку наведена назва таблиці. У ряді випадків наявність назви таблиці перед іменем стовпця обов'язкова, оскільки в різних таблицях можуть міститися однойменні стовпці (як у нашому прикладі), а SQL-сервер повинен знати, зі стовпцем якої таблиці він має справу.
Використовувати імена таблиць для ідентифікації стовпців незручно через їхню громіздкість. Псевдоніми, які наводяться через пробіл після імені таблиці у пропозиції FROM, роблять компактнішим запис оператора SELECT:
SELECT [DISTINCT | ALL] {* | <значення>[, <вираз> ...]}
FROM <таблиця псевдонім>[, <таблиця псевдонім> ...]
[WHERE <умови пошуку>]
[ORDER BY <список стовпців>]
Наприклад, запит, який розглянутий у прикладі 6.7, після визначення у ньому псевдонімів таблиць, є набагато компактнішим:
SELECT R.Code, FamilyName, Name, B.Code, ReaderCode, InventoryCode
FROM BookGiveOutRecord B, Readers R
WHERE R.Code = B.ReaderCode
Використання оператора порівняння BETWEEN дозволяє в умові пошуку вказати, що деяке значення має перебувати в інтервалі між двома іншими. Зарезервоване слово NOT інвертує умову
<значення> [NOT] BETWEEN <значення> AND <значення>
ПРИКЛАД 6.10
Перелічіть інвентарні номери книжок, ціна яких лежить у діапазоні від 20 до 60 гривень включно (табл. 6.8).
SELECT InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE BETWEEN 20 AND 60
Наведений вище запит можна переписати так:
SELECT InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE Cost >= 20 AND Cost <=60
Багато хто вважає, що перевірка приналежності даних діапазону за допомогою оператора BETWEEN є більш простим способом запису, ніж використання звичайної перевірки, що розглянута в останньому операторі SELECT.
Таблиця 6.8
InventoryNumber | Cost |
---|---|
4510000 | 22,33 |
4532477 | 34,01 |
4678532 | 56,78 |
5478956 | 45,10 |
2145876 | 59,25 |
5214786 | 36,05 |
7865890 | 21,32 |
6589321 | 36,69 |
7812639 | 48,13 |
7523690 | 27,99 |
Оператор LIKE задає шаблони порівняння рядкових значень. Він чутливий до регістру. Якщо необхідно перевірити задовольняє, чи ні значення стовпця або результат обчислення рядкового виразу шаблону (<значення> після пропозиції LIKE), то в умові пошуку необхідно вказати
<значення> [NOT] LIKE <значення> [ESCAPE <символ>]
У шаблоні використовуються спеціальні символи – «%» та «_». Символ «%» (відсоток) застосовується для вказівки рядка символів будь-якої довжини, а символ «_» (підкреслення) – для вказівки будь-якого одиничного символу. Наприклад:
IssuePlace LIKE 'М%' – цей шаблон означає, що першим символом рядкового значення обов'язково має бути велика літера «М», а всі інші символи є довільними й не перевіряються;
IssuePlace LIKE ‘М_’ – цей шаблон означає, що рядкове значення повинне мати довжину, яка дорівнює тільки двом символам, причому першим символом обов'язково має бути символ «М»;
IssuePlace LIKE '%е' – цей шаблон визначає будь-яке рядкове значення довжиною не менше одного символу, причому останнім символом обов'язково має бути символ «е»;
IssuePlace LIKE '%Дніпропетровська область%' – цей шаблон означає, що нас цікавить будь-яка послідовність символів, що має підрядок «Дніпропетровська область»;
IssuePlace LIKE 'М%' – цей шаблон вказує на те, що потрібні рядки, які не починаються із символу «М».
Якщо потрібно, щоб рядок включав службовий символ, який використовується як символ підстановки, то слід застосувати «escape»-символ, помістивши його перед символом підстановки. Наприклад, для перевірки значень на відповідність ‘15%’ можна скористатися такою умовою пошуку:
LIKE '15#%' ESCAPE '#'
ПРИКЛАД 6.11
Використовуючи механізм пошуку за шаблоном, виведіть код, серію та номер паспорта осіб, які проживають у Дніпропетровській області (табл. 6.9).
SELECT Code, Series, Number, IssuePlace
FROM PasportData
WHERE IssuePlace LIKE '%Дніпропетровська область%'
Таблиця 6.9
Code | Series | Number | IssuePlace |
---|---|---|---|
3 | АБ | 87134 | Дніпропетровська область, село Солоне |
7 | АЗ | 43188 | Дніпропетровська область, м. Дніпродзержинськ |
12 | ІК | 45190 | Дніпропетровська область, село Петропавлівка |
ЗАУВАЖЕННЯ! Строго кажучи останній SQL-запит вмістив у результуюче відношення інформацію лише про тих людей, у яких в атрибуті IssuePlace є послідовність символів, що співпадає з шаблоном в умовах пошуку (див. данні у відношенні PasportData). Наприклад, особа, для якої значення у атрибуті Code = 18, проживає у місті Дніпропетровськ, який розташован у межах Дніпропетровської області, але значення у атрибуті IssuePlace не відповідає заданому шаблону. Такий стан речей говорить про відсутність правил вводу інформації у атрибут IssuePlace.
Оператор STARTING чутливий до регістру. Він використовується тоді, коли в умові пошуку потрібно, щоб значення якого-небудь стовпця або виразу починалося з певної послідовності символів:
<значення> [NOT] STARTING [WITH] <значення>
ПРИКЛАД 6.12
Виберіть коди, прізвища, імена та по батькові читачів, у яких прізвища починаються з літери «І» (табл. 6.10).
SELECT Code, FamilyName, Name, Patronymic
FROM Readers
WHERE FamilyName STARTING WITH 'І'
Таблиця 6.10
Code | FamilyName | Name | Patronymic |
---|---|---|---|
1 | Іванов | Петро | Іванович |
3 | Ільїн | Іван | Петрович |
Оператор CONTAINING не чутливий до регістру. Він використовується тоді, коли необхідно, щоб значення якого-небудь стовпця або виразу складалося (неважливо з якої позиції) з заданої послідовності символів:
<значення> [NOT] CONTAINING <значення>
ПРИКЛАД 6.13
Виберіть коди, прізвища, імена та по батькові читачів, до прізвищ яких входить послідовність літер «ко» (табл. 6.11).
SELECT Code, FamilyName, Name, Patronymic
FROM Readers
WHERE FamilyName CONTAINING 'ко'
Таблиця 6.11
Code | FamilyName | Name | Patronymic |
---|---|---|---|
4 | Суренко | Дмитро | Павлович |
5 | Коршунова | Наталя | Юріївна |
6 | Носенко | Олег | Володимирович |
8 | Козирєв | Олексій | Сергійович |
9 | Левченко | Юлія | Павлівна |
12 | Кириленко | Віктор | Олександрович |
Функція UPPER(<значення>) використовується для перетворення літер рядкових значень (змісту стовпця, результату обчислення виразу) у великі літери. Функція UPPER може застосовуватися як у списку стовпців результуючого набору даних (після пропозиції SELECT), так і в умовах пошуку в пропозиції WHERE, коли необхідно ігнорувати регістр літер.
ПРИКЛАД 6.14
Виберіть коди, прізвища, імена та по батькові читачів у прізвищі яких міститься послідовність літер «ко» незалежно від того великі вони чи малі. Прізвище вивести великими літерами (табл. 6.12).
SELECT Code, UPPER(FamilyName), Name, Patronymic
FROM Readers
WHERE FamilyName CONTAINING 'ко'
Таблиця 6.12
Code | FamilyName | Name | Patronymic |
---|---|---|---|
4 | СУРЕНКО | Дмитро | Павлович |
5 | КОРШУНОВА | Наталя | Юріївна |
6 | НОСЕНКО | Олег | Володимирович |
8 | КОЗИРЄВ | Олексій | Сергійович |
9 | ЛЕВЧЕНКО | Юлія | Павлівна |
12 | КИРИЛЕНКО | Віктор | Олександрович |
Функція CAST використовується тоді, коли виникає потреба трактувати значення одного типу як значення іншого типу. Наприклад, використовувати числове значення як символьний рядок або навпаки. У цьому випадку застосовують функцію
CAST( <значення> AS <тип даних>)
Функція CAST копіює значення, перетворюючи їх до зазначеного типу даних. При цьому не слід забувати про перелік типів даних, у які може бути перетворене поточне значення:
Тип даних | Можна привести до типів |
---|---|
NUMERIC | CHARACTER, DATE |
CHARACTER | NUMERIC, DATE |
DATE | CHARACTER, NUMERIC |
ПРИКЛАД 6.15
Виберіть коди, серії та номера паспортів, у номерах яких зустрічається число «84» (табл. 6.13).
SELECT Code, Series, Number
FROM PasportData
WHERE CAST(Number AS CHAR(5)) LIKE '%84%'
Таблиця 6.13
Code | Series | Number |
---|---|---|
9 | АС | 90843 |
11 | ІК | 10842 |
Така перевірка здійснюється за допомогою оператора IN
<значення> [NOT] IN (<значення>[, <значення> ...])
Множину значень можна сформувати за допомогою оператора SELECT. Цей випадок буде розглянутий пізніше при вивченні вкладених підзапитів, що повертають множину значень.
ПРИКЛАД 6.16
Використовуючи таблицю PasportData, виведіть код, серію та номер паспорта осіб, які проживають у Донецьку або Києві (табл. 6.14).
SELECT Code, Series, Number, IssuePlace
FROM PasportData
WHERE IssuePlace IN ('Донецьк', 'Київ');
Як і при розгляді оператора BETWEEN, використання ключового слова IN дозволяє простіше записати умови пошуку, особливо, якщо список припустимих значень досить великий. Такий самий результат може бути отриманий за допомогою наступного запиту:
SELECT Code, Series, Number, IssuePlace
FROM PasportData
WHERE IssuePlace = 'Донецьк' OR IssuePlace = 'Київ';
Таблиця 6.14
Code | Series | Number | IssuePlace |
---|---|---|---|
4 | АЄ | 12300 | Донецьк |
6 | АЖ | 01568 | Київ |
15 | АК | 89125 | Київ |
16 | АК | 55706 | Донецьк |
20 | АК | 12578 | Київ |
Завдяки можливості розрахунків арифметичних виразів, використанню агрегатних функцій, простих та складних умов пошуку, вкладених підзапитів оператор SELECT забезпечує майже усі потреби подання інформації у вигляді, який необхідний користувачам. А коли це неможливо виконати за допомогою одного оператора, то послідовно використовують декілька операторів, з урахуванням того, що результатом роботи будь-якого оператора SELECT є двовимірна таблиця, яка може бути початковою для наступного оператора.
© Куваєв Я.Г., 2005—2023.
Всі права захищені.
Вся інформація, яка розміщена на цьому веб-сайті, призначена тільки для персонального використання і не підлягає подальшому відтворенню і/або поширенню в будь-якій формі, інакше як за письмовим дозволом Автора.