Мета розділу – ознайомлення з оператором SELECТ, який є одним з найбільш важливих та затребуваних операторів SQL, з його форматом та властивостями.
Наявність визначника NULL у рядках таблиці перевіряється за допомогою такої конструкції:
<значення> IS [NOT] NULL
ПРИКЛАД 6.17
Виберіть коди й назви книжок, які не мають УДК (табл. 6.15).
SELECT Code, Name
FROM Books
WHERE UDK IS NULL;
Таблиця 6.15
Code | Name |
---|---|
1 | Автоматизація виробничих процесів на збагачувальній фабриці |
2 | Розв'язок завдань по автоматизації процесів збагачення й металургії |
3 | Асимптотичні методи оптимального керування |
4 | Синтез оптимальних автоматичних систем |
5 | Методи оптимізації стохастичних систем |
6 | Автоматизовані системи керування технологічним процесом збагачення руди |
7 | C/C++ Програмування мовою високого рівня |
8 | Комп'ютерні мережі. Принципи, технології, протоколи |
9 | Довідник з диференційних рівнянь з частками похідними першого порядку |
10 | Теорія ймовірностей й математична статистика |
11 | C#. Програмування мовою високого рівня |
12 | Теорія ймовірностей й математична статистика |
13 | Теорія ймовірностей й математична статистика |
14 | Дискретно - групові методи інтегрування звичайних диференційних рівнянь |
Розрахунок підсумкових значень в операторі SELECT здійснюється за допомогою агрегатних або статистичних функцій: COUNT(), SUM(), AVG(), МАХ(), МIN().
Функція COUNT(<вираз>) підраховує число входжень значень виразу в усі записи результуючого набору даних. Вона працює з данними будь-якого типу: числові, символьні або типу «дата/час».
ПРИКЛАД 6.18
Визначить, вартість скількох книжок перевищує 25 грн. (табл. 6.16).
SELECT COUNT(*) AS cCount
FROM BookInventoryNumbers
WHERE Cost > 25;
Таблиця 6.16
cCount |
---|
10 |
Якщо із групи однакових записів при підрахунку необхідно враховувати тільки одну, то перед виразом у дужках вставляють пропозицію DISTINCT. Найчастіше як вираз виступають імена стовпців. Вираз може розраховуватися і за значеннями декількох таблиць:
COUNT (DISTINCT <вираз>)
ПРИКЛАД 6.19
Визначіть, скільки різних бібліотекарів видавали книги (табл. 6.17).
SELECT COUNT(DISTINCT OutLibrarianCode) AS cCount
FROM BookInventoryNumbers
Таблиця 6.17
cCount |
---|
6 |
Загальну кількість записів, що відповідають зазначеній умові, можна визначити за допомогою функції COUNT без фрази DISTINCT. Однак один і той самий бібліотекар може видати кілька книжок різним читачам. Пропозиція DISTINCT дозволяє виключити з розрахунку значення, що дублюються.
Функція SUM(<вираз>) розраховує суму всіх значень стовпця або виразу. При цьому стовпець має складатися з числових даних (містити цілі числа, числа із плаваючою комою або грошові величини). Результат, що повертається цієї функцією, має той же тип даних, що й стовпець або вираз, однак точність (розрядність) результату може бути вищою. Наприклад, якщо застосувати функцію SUM() до стовпця, що містить 16-розрядні цілі числа, то вона може повернути 32-розрядне ціле число.
ПРИКЛАД 6.20
Визначіть загальну вартість книжок бібліотечного фонду (табл. 6.18).
SELECT SUM(Cost) AS cSum
FROM BookInventoryNumbers
Таблиця 6.18
cCount |
---|
6 |
Функції MIN(<вираз>), MAX(<вираз>) і AVG(<вираз>) дозволяють розрахувати відповідно найменше, найбільше й середнє значення в стовпці або виразі. Функції MIN(), MAX() працюють із числовими, рядковими й даними типу «дата/час». AVG() працює тільки з числовими даними. Результат, що повертається цими функціями, має такий самий тип даних, як і вираз.
ПРИКЛАД 6.21
Визначіть мінімальну, максимальну й середню вартість книжок (табл. 6.19).
SELECT MIN(Cost) AS Mini, MAX(Cost) AS Maxi, AVG (Cost) AS Avgi
FROM BookInventoryNumbers
Таблиця 6.19
Mini | Maxi | Avgi |
---|---|---|
10.10 | 74.2 | 38.27 |
Угруповання записів використовується тоді, коли треба отримати агреговані значення не для всього відношення, а окремо по кожній групі кортежів, які характеризуються загальною ознакою. Найчастіше це однакові значення в якому-небудь атрибуті або групі атрибутів. Тоді в операторі SELECT використовують пропозицію
GROUP BY стовпець[, стовпець ...]
При цьому необхідно, щоб один зі стовпців результуючого набору даних оброблявся агрегатною функцією.
ПРИКЛАД 6.22
Визначіть кількість книжок, що зберігаються в різних бібліотечних фондах, а також їх сумарну вартість (табл. 6.20).
SELECT FundCode, COUNT(BookCode) AS cCount, SUM(Cost) AS cSum
FROM BookInventoryNumbers
GROUP BY FundCode
ORDER BY FundCode
Нема сенсу включати імена стовпців BookCode і Cost у список фрази GROUP BY, оскільки у списку пропозиції SELECT вони використовуються тільки в узагальнюючих функціях. Однак, стовпець FundCode у списку пропозиції SELECT не зв'язаний із жодною узагальнюючою функцією, а тому обов'язково має бути зазначений у фразі GROUP BY.
Таблиця 6.20
FundCode | cCount | cSum |
---|---|---|
1 | 9 | 307.95 |
2 | 6 | 266.05 |
При обробці цього запиту логіка виконання операцій така.
Таблиця 6.21
FundCode | BookCode | Cost | СOUNT(BookCode) | SUM(Cost) | |
---|---|---|---|---|---|
1 | 1 | 15.56 | 9 | 307.95 | |
1 | 2 | 22.33 | |||
1 | 3 | 34.01 | |||
1 | 4 | 12.99 | |||
1 | 9 | 36.05 | |||
1 | 10 | 74.2 | |||
1 | 12 | 36.69 | |||
1 | 13 | 48.13 | |||
1 | 14 | 27.99 | |||
2 | 5 | 56.78 | 6 | 266.05 | |
2 | 6 | 10.10 | |||
2 | 7 | 73.50 | |||
2 | 7 | 45.10 | |||
2 | 8 | 59.25 | |||
2 | 11 | 21.32 |
Рядки таблиці BookInventoryNumbers поділяються на групи згідно зі значеннями коду фонду (FundCode). У нашому прикладі буде створено дві групи, за кількістю унікальних значень у стовпці FundCode. Для кожної із груп розраховується загальне число рядків, яке дорівнює кількості кодів книжок, а також сума їх вартості (стовбець Cost), що нас цікавить. Потім генерується єдиний зведений рядок для всієї групи вихідних рядків. Нарешті, отримані рядки результуючої таблиці перегруповуються у порядку зростання номера коду фонду, який зазначений у стовпці FundCode.
Умова відбору згрупованих записів наводиться в пропозиції
HAVING <умови пошуку>
Тут умови пошуку задають згідно з тими самими правилам, що й у пропозиції WHERE. HAVING та WHERE можна сумісно використовувати у запиті. Спочатку пропозиція WHERE виключає з розрахунку рядки, які не відповідають її умовам пошуку. Далі працюють умови пошуку пропозиції HAVING. Вони відфільтровують з результуючого набору даних групи рядків, де підсумкові значення не відповідають їм.
Стандарт ISO вимагає, щоб імена стовпців, які використовуються у пропозиції HAVING, обов'язково були в списку GROUP BY або оброблялися агрегатними функціями. На практиці умови пошуку у пропозиції HAVING завжди включають, щонайменше, одну агрегатну функцію. Умови пошуку, що не містять агрегатних функцій, мають входити до пропозиції WHERE і застосовуватися для відбору окремих рядків. В умовах пошуку пропозиції WHERE застосовувати агрегатні функції заборонено.
ПРИКЛАД 6.23
Для кожного бібліотечного фонду, де зберігається більше шести книжок, визначіть їх кількість та сумарну вартість (табл. 6.22).
SELECT FundCode, COUNT(BookCode) AS cCount, SUM(Cost) AS cSum
FROM BookInventoryNumbers
GROUP BY FundCode
HAVING COUNT(BookCode) > 6
ORDER BY FundCode
Цей приклад аналогічний попередньому, але тут використовуються додаткові обмеження, що вказують на те, що нас цікавлять відомості тільки про ті фонди, у яких зберігається більше шести книжок. Подібна вимога накладається на групи, тому в запиті слід використовувати фразу HAVING.
Таблиця 6.22
FundCode | cCount | cSum |
---|---|---|
1 | 9 | 307.95 |
Підзапит – це інструмент створення тимчасової таблиці, вміст якої обробляється зовнішнім оператором. Внутрішні запити можуть бути використані для обчислення значень після пропозиції SELECT та в умовах пошуку після операторів порівняння (=, <,>, >=, <=, <<) або IN у пропозиціях WHERE і HAVING зовнішнього оператора SELECT. Крім того, підзапити можуть застосовуватися в операторах INSERT, UPDATE і DELETE. Текст підзапита береться у дужки.
Існує три види підзапитів:
До підзапитів установлюються такі правила й обмеження:
Коли неможливо обійтися одним підзапитом, тоді в ньому використовують вкладений підзапит і т.д.
Скалярні підзапити повертають таблицю, що складається з одного стовпця й одного рядка. Таку таблицю можна одержати, якщо після пропозиції SELECT вказати один стовпець, а в пропозиції WHERE умову пошуку створити за допомогою потенційного ключа.
ПРИКЛАД 6.24
Виведіть на екран усі дати повернення книжок читачем з номером читацького квитка 28 (табл. 6.23).
SELECT ReturnDate, FactreturnDate
FROM BookGiveOutRecord
WHERE ReaderCode = (SELECT Code
FROM Readers
WHERE ReaderCardNumber = 28)
Внутрішній оператор
SELECT Code
FROM Readers
WHERE ReaderCardNumber = 28)
призначений для визначення коду читача з номером квитка 28. Після цього працює зовнішній запит. Інакше кажучи, внутрішній оператор SELECT повертає таблицю, що має єдине значення – Code = 2. У результаті зовнішній оператор SELECT набуває такого вигляду:
SELECT ReturnDate, FactreturnDate
FROM BookGiveOutRecord
WHERE ReaderCode = 2
Таблиця 6.23
ReturnDate | FactreturnDate |
---|---|
25-SEP-04 | 24-SEP-04 |
Таблицю з одним стовпцем і одним рядком можна одержати, якщо після SELECT вказати одну агрегатну функцію без використання угруповання записів у пропозиції GROUP BY. У цьому разі умови відбору які наведені в WHERE і HAVING, не відіграють неякої ролі.
ПРИКЛАД 6.25
Складіть список інвентарних номерів книжок, вартість яких вище від середньої. Вкажіть, наскільки їхня вартість вище від середньої вартості всіх книжок бібліотеки (табл. 6.24).
SELECT InventoryNumber,
Cost – (SELECT AVG(Cost)
FROM BookInventoryNumbers) AS Cost_diff
FROM BookInventoryNumbers
WHERE Cost > (SELECT AVG(Cost)
FROM BookInventoryNumbers)
Таблиця 6.24
InventoryNumber | Cost_diff |
---|---|
4678532 | 18.51 |
7569832 | 35.23 |
5478956 | 6.83 |
2145876 | 20.98 |
5268933 | 35.93 |
7812639 | 9.86 |
Слід зазначити, що не можна вживати «WHERE Cost > AVG(Cost)», оскільки використовувати агрегатні функції в пропозиції WHERE заборонено. Для досягнення бажаного результату слід створити підзапит, в якому розраховують середню вартість книжок, а потім застосувати його у зовнішньому операторі SELECT, який призначений для вибірки відомостей про ті книжки, вартість яких перевищує середню. Інакше кажучи, підзапит повертає середню вартість книжок бібліотеки: 38,27 грн. Результат виконання цього скалярного підзапиту використовується в зовнішньому операторі SELECT як для розрахунку відхилення вартості від середньої, так і для відбору відомостей про книжки. Тому зовнішній оператор SELECT має такий вигляд:
SELECT InventoryNumber, Cost – 38.27 AS Cost_diff
FROM BookInventoryNumbers
WHERE Cost > 38.27
Підзапити, що повертають множину значень, використовуються як операнд предиката IN. Наприклад, табличний підзапит можна використати замість внутрішнього з'єднання таблиць. Для ілюстрації цього повернемося до ПРИКЛАДУ 6.7: «Створіть список усіх читачів, які коли-небудь брали книжки в бібліотеці». З табличним підзапитом й псевдонімами таблиць оператор SELECT буде мати такий вигляд:
SELECT ReaderCode, FamilyName, Name, B.Code, InventoryCode
FROM Readers R
WHERE R.Code IN (SELECT ReaderCode
FROM BookGiveOutRecord B)
Усі читачі, які коли-небудь брали книжки в бібліотеці, зареєстровані в таблиці BookGiveOutRecord. Отже, нам необхідно вивести з таблиці Readers прізвища тільки тих читачів, коди яких містяться в множині значень, що повертаються підзапитом.
SELECT ReaderCode
FROM BookGiveOutRecord B)
Оператор EXISTS застосовується тоді, коли в умовах пошуку необхідно вказати, що з таблиці потрібно вибрати тільки ті записи, для яких підзапит повертає одне або більше значень:
[NOT] EXISTS(<підзапит>)
Отже, оператор EXISTS застосовується тільки з підзапитами. Він повертає TRUE, якщо в результуючому наборі даних підзапита є один або більше записів. В іншому разі він повертає FALSE. Для NOT EXISTS правила зворотні.
ПРИКЛАД 6.26
Виберіть коди і назви тих книжок студентського фонду бібліотеки, які коли-небудь видавалися читачам (табл. 6.25).
SELECT Code, Name
FROM Books
WHERE Code IN (SELECT BookCode
FROM BookInventoryNumbers
WHERE FundCode = (SELECT Code
FROM BookFunds
WHERE Name ='Студентський') AND
EXISTS (SELECT Code
FROM BookGiveOutRecord
WHERE InventoryCode = BookInventoryNumbers.Code))
Таблиця 6.25
Code | Name |
---|---|
6 | Автоматизовані системи керування технологічним процесом збагачення руди |
7 | C/C++ Програмування мовою високого рівня |
11 | C#. Програмування мовою високого рівня |
Оператор SINGULAR застосовується тоді, коли в умовах пошуку необхідно вказати, що з таблиці потрібно вибрати лише ті записи, для яких підзапит повертає тільки одне значення.
[NOT] SINGULAR(<підзапит>)
ПРИКЛАД 6.27
Виберіть коди і назви тих книжок, які видавалися читачам тільки один раз (табл. 6.26).
SELECT B.Code, B.Name
FROM Books B
WHERE B.Code IN (SELECT BIN.BookCode
FROM BookInventoryNumbers BIN
WHERE SINGULAR (SELECT BG.InventoryCode
FROM BookGiveOutRecord BG
WHERE BIN.Code = BG.InventoryCode))
Таблиця 6.26
Code | Name |
---|---|
3 | Асимптотичні методи оптимального керування |
4 | Синтез оптимальних автоматичних систем |
7 | C/C++ Програмування мовою високого рівня |
9 | Довідник з диференційних рівнянь з частками похідними першого порядку |
14 | Дискретно-групові методи інтегрування звичайних диференційних рівнянь |
Оператори ALL, SOME, ANY використовуються тоді, коли в умовах пошуку необхідно вказати, що значення (значення стовпця, результат обчислення виразу), яке порівнюється, має перебувати в певних відношеннях з усіма значеннями множини, яка повертається підзапитом.
<значення> [NOT] <оператор порівняння> {ALL | SOME | ANY} (<підзапит>)
Тут підзапит може повертати більше одного значення. Оператор виконує операцію порівняння (>, >=, < і т.д.). Відношення між порівнюваним значенням та значеннями, що повертаються підзапитом, визначаються за допомогою операторів ALL та SOME (ANY). Отже,
WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)
поверне TRUE, якщо поточне значення атрибута «STOLBEZ» буде більше всіх значень в атрибуті «POLE» відношення «TABLIZA»;
WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)
поверне TRUE, якщо поточне значення атрибута «STOLBEZ» буде більше хоча б одного значення в атрибуті «POLE» відношення «TABLIZA».
ПРИКЛАД 6.28
Знайдіть інвентарні номери всіх книжок, вартість яких вище принаймні від вартості однієї книжки фонду під номером «1» (табл. 6.27).
SELECT BookCode, InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE Cost > SOME (SELECT Cost
FROM BookInventoryNumbers
WHERE FundCode = '1'
У цьому випадку внутрішній підзапит поверне такі значення: {15.56, 22.33, 34.01, 12.99, 36.05, 74.20, 36.69, 48.13, 27.99}, а зовнішній – вибере відомості про ті книжки, вартість яких перевищує принаймні одне зі значень у цьому списку (фактично, більше мінімального значення – 12.99).
Таблиця 6.27
BookCode | InventoryNumber | Cost |
---|---|---|
1 | 4567890 | 15,56 |
2 | 4510000 | 22,33 |
3 | 4532477 | 34,01 |
5 | 4678532 | 56,78 |
7 | 7569832 | 73,50 |
7 | 5478956 | 45,10 |
8 | 2145876 | 59,25 |
9 | 5214786 | 36,05 |
10 | 5268933 | 74,20 |
11 | 7865890 | 21,32 |
12 | 6589321 | 36,69 |
13 | 7812639 | 48,13 |
14 | 7523690 | 27,99 |
ПРИКЛАД 6.29
Знайдіть інвентарні номери книжок, вартість яких вище від вартості будь-якої книжки книжкового фонду під номером «1» (табл. 6.28).
SELECT BookCode, InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE Cost > ALL (SELECT Cost
FROM BookInventoryNumbers
WHERE FundCode = '1'
Тут зовнішній запит вибирає відомості про книжки, вартість яких більша за максимальне значення множини {15.56, 22.33, 34.01, 12.99, 36.05, 74.20, 36.69, 48.13, 27.99}.
Таблиця 6.28
BookCode | InventoryNumber | Cost |
---|---|---|
10 | 5268933 | 74,20 |
Пропозиція HAVING використовується тоді, коли в умовах пошуку для вкладеного підзапиту необхідно вказати агрегатну функцію.
ПРИКЛАД 6.30
До бібліотеки примірники той самої книжки можуть надходити у різний час і мати різну вартість. Визначіть код та середню вартість примірників книжок, у яких мають середня вартість одного примірника вища від середньої вартості примірників інших книжок (табл. 6.29).
SELECT BIN1.Bookcode, InventoryNumber, AVG(BIN1.Cost) AS AvgCost
FROM BookInventoryNumbers BIN1
GROUP BY BIN1.Bookcode
HAVING AVG(Cost) >= ALL (SELECT AVG(BIN2.Cost)
FROM BookInventoryNumbers BIN2
GROUP BY BIN2.Bookcode)
Спочатку з таблиці BookInventoryNumbers вибираємо значення середньої вартості примірників усіх книжок (вкладений підзапит). Потім із цієї ж таблиці вибираємо код і середню вартість примірника тієї книжки, яка буде найбільшою.
Таблиця 6.29
BookCode | InventoryNumber | Cost |
---|---|---|
10 | 5268933 | 74,20 |
Зверніть увагу на те, що в цьому випадку псевдоніми таблиць використовуються не стільки для скорочення записів, скільки для визначення атрибутів, які необхідні для роботи зовнішнього й внутрішнього операторів SELECT.
Зовнішнє з'єднання визначається в пропозиції FROM оператора SELECT. Воно записується в такому форматі:
SELECT {* | <значення> [, <значення> ...]}
FROM <таблиця> <вид з'єднання> JOIN <таблиця> ON <умова пошуку>
У результуючий набір даних включаються усі записи базової таблиці. Яка з таблиць буде провідною, визначає вид з'єднання:
LEFT – (ліве зовнішнє з'єднання), коли базовою є таблиця, яка розташована ліворуч від назви типу з'єднання;
RIGHT – (праве зовнішнє з'єднання), коли базовою є таблиця, яка розташована праворуч від назви типу з'єднання;
FULL – у результуючий набір даних входять усі рядки таблиці, яка розташована ліворуч від типу з'єднання, та таблиці, що розташована праворуч від назви типу з'єднання, навіть якщо умови пошуку для них не виконуються.
ПРИКЛАД 6.31
Виконайте зовнішнє ліве й праве з'єднання таблиць 6.30 і 6.31 за атрибутами Р2 і Р1 відповідно.
Таблиця 6.30
Стовпець Р1 | Стовпець Р2 | Стовпець Р3 |
---|---|---|
A | x | 400 |
B | x | 200 |
C | y | 500 |
D | NULL | NULL |
Таблиця 6.31
Стовпець Р1 | Стовпець Р2 |
---|---|
X | 1 |
Y | 2 |
Z | 2 |
Запишемо оператор SELECT для лівого з'єднання, позначивши таблиці 6.30 і 6.31 як А и В відповідно.
SELECT A.P1, A.P2, B.P2
FROM A LEFT JOIN B ON A.P2 = B.P1
Сірим кольором зображені стовпці базової таблиці А. Як бачимо, для рядка таблиці А, де стовпець А.Р1 має значення «D», немає парних записів у таблиці В, які задовольняли би умову пошуку А.Р2 = В.Р1. Тому даний запис таблиці А з'єднаний з порожнім записом (табл. 6.32).
Таблиця 6.32
Стовпець A.Р1 | Стовпець A.Р2 | Стовпець B.Р2 |
---|---|---|
A | x | 1 |
B | x | 1 |
C | y | 2 |
D | NULL | NULL |
Запишемо оператор SELECT для правого з'єднання:
SELECT A.P1, A.P2, B.P2
FROM A RIGHT JOIN B ON A.P2 = B.P1
Сірим кольором зображений стовпець базової таблиці В. Як бачимо, для рядка таблиці В, де стовпець В.Р1 має значення «z», а стовпець В.Р2 має значення «2», немає парних записів у таблиці А, для яких виконувалась би умова пошуку А.Р2 = В.Р1. Тому даний рядок таблиці В з'єднаний з порожнім записом (табл. 6.33).
Таблиця 6.33
Стовпець A.Р1 | Стовпець A.Р2 | Стовпець B.Р2 |
---|---|---|
A | x | 1 |
B | x | 1 |
C | y | 2 |
NULL | NULL | 2 |
Іноді виникає необхідність в об'єднанні двох або більше результуючих наборів даних, які повертають окремі оператори SELECT. Для цього результуючі набори даних повинні мати однакову структуру, тобто однакову кількість і однаковий тип стовпців, що повертаються. Такі набори даних називають сумісними за об'єднанням. Записи, що дублюються, з об'єднаного набору даних виключаються.
ПРИКЛАД 6.32
Об'єднати результати виконання трьох запитів:
1. Паспорти із серією «АА» (табл. 6.34).
SELECT *
FROM PasportData
WHERE Series = 'АА'
Таблиця 6.34
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Росія, м. Опочка | Жін. | Дніпропетровськ | 12.01.1995 | NULL |
2 | АА | 15700 | 23.02.1930 | Росія. м. Володимир | Жін. | м. Житомир | 16.03.2000 | NULL |
2. Паспорти, які видані у 2000 році (табл. 6.35).
SELECT *
FROM PasportData
WHERE IssueDate BETWEEN ‘01/01/2000’ AND ‘12/31/2000’
Таблиця 6.35
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
2 | АА | 15700 | 23.02.1930 | Росія. м. Володимир | Жін. | м. Житомир | 16.03.2000 | NULL |
8 | АК | 23490 | 05.01.1961 | Росія, місто Самара | Жін. | Дніпропетровськ | 13.09.2000 | NULL |
20 | АК | 12578 | 11.11.1987 | Донецьк, Краматорськ | Жін. | Київ | 26.01.2000 | NULL |
3. Паспорти, номери яких починаються на 4 (табл. 6.36).
SELECT *
FROM PasportData
WHERE Number LIKE '4%'
Таблиця 6.36
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Росія, м. Опочка | Жін. | Дніпропетровськ | 12.01.1995 | NULL |
7 | АЗ | 43188 | 13.11.1970 | Дніпропетровська область, м. Дніпродзержинськ | Жін. | Дніпропетровська область, м. Дніпродзержинськ | 15.05.1998 | NULL |
12 | ІК | 45190 | 18.07.1983 | Дніпропетровська область, село Петропавліка | Жін. | Дніпропетровська область, село Петропавліка | 20.09.1999 | NULL |
18 | АЖ | 45879 | 04.02.1961 | Дніпропетровськ | Жін. | Дніпродзержинськ | 14.03.1980 | NULL |
22 | АЯ | 45789 | 07.08.1972 | Угорщина | Жін. | Івано-Франківськ | 03.10.1988 | NULL |
Об'єднаємо три набори даних (табл. 6.37).
SELECT *
FROM PasportData
WHERE Series = 'AA'
UNION
SELECT *
FROM PasportData
WHERE IssueDate BETWEEN ‘01/01/2000’ AND ‘12/31/2000’
UNION
SELECT *
FROM PasportData
WHERE Number LIKE '4%'
Таблиця 6.37
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Росія, м. Опочка | Жін. | Дніпропетровськ | 12.01.1995 | NULL |
2 | АА | 15700 | 23.02.1930 | Росія. м. Володимир | Жін. | м. Житомир | 16.03.2000 | NULL |
7 | АЗ | 43188 | 13.11.1970 | Дніпропетровська область, м. Дніпродзержинськ | Жін. | Дніпропетровська область, м. Дніпродзержинськ | 15.05.1998 | NULL |
8 | АК | 23490 | 05.01.1961 | Росія, місто Самара | Жін. | Дніпропетровськ | 13.09.2000 | NULL |
12 | ІК | 45190 | 18.07.1983 | Дніпропетровська область, село Петропавліка | Жін. | Дніпропетровська область, село Петропавліка | 20.09.1999 | NULL |
18 | АЖ | 45879 | 04.02.1961 | Дніпропетровськ | Жін. | Дніпродзержинськ | 14.03.1980 | NULL |
20 | АК | 12578 | 11.11.1987 | Донецьк, Краматорськ | Жін. | Київ | 26.01.2000 | NULL |
22 | АЯ | 45789 | 07.08.1972 | Угорщина | Жін. | Івано-Франківськ | 03.10.1988 | NULL |
Операція || з'єднує два рядкових значення, які можуть бути представлені виразами: <рядковий вираз1> || <рядковий вираз2>.
Операцію || можна використовувати як після пропозиції SELECT для вказівки значень, що повертаються, так і в пропозиції WHERE.
ПРИКЛАД 6.33
Помістить прізвище, ім'я, по батькові та місце роботи читачів в одну колонку, причому місце роботи взяти в круглі дужки (табл. 6.38).
SELECT FamilyName ||’ ‘ Name || Patronymic || ‘(‘ || Job || ‘)’
FROM Readers
Таблиця 6.38
COLUMN1 |
---|
Іванов Петро Іванович (ДГУ, каф. ЕВТ) |
Федорец Ірина Олегівна (ДГУ, АХЧ) |
Ільїн Іван Петрович (ДГУ, каф. фізики) |
Суренко Дмитро Павлович (ДГУ, каф. геофізики) |
Коршунова Наталя Юріївна (ДГУ, каф. геоінформатики) |
Носенко Олег Володимирович (ДГУ, ІКК) |
Брусов Володимир Михайлович (НГУ, каф. геодезії) |
Козирєв Олексій Сергійович (НГУ, каф. кримінології) |
Левченко Юлія Павлівна (НГУ, каф. політичної теорії) |
Світла Тетяна Іванівна (НГУ, каф. перекладу) |
Щиглів Петро Євгенович (НГУ, каф. електропостачання) |
Кириленко Віктор Олександрович (НГУ, каф. електропривода) |
В одному запиті можна використовувати таблиці з різних БД. У цьому випадку в СКБД Interbase ім'я таблиці подається у форматі
:Псевдонім БД :Ім’я таблиці
Під псевдонімом БД розуміють псевдонім, такий який визначений в утиліті BDE Administrator. Нижче наведений приклад звернення в одному запиті до таблиць БД InterВase (псевдонім «MONITOR») і Oracle (псевдонім «DWH»).
SELECT U.*
FROM ":MONITOR:NLS" N, ":DWH:OLAP_UPE" U
WHERE U.SC_CODE = N.COD_SCENARIO
ORDER BY U.SC_CODE;
Формат оператора SELECT необхідно уточнювати у відповідній документації, яка надається до вибраної Вами СКБД.
Завдяки можливості розрахунків арифметичних виразів, використанню агрегатних функцій, простих та складних умов пошуку, вкладених підзапитів оператор SELECT забезпечує майже усі потреби подання інформації у вигляді, який необхідний користувачам. А коли це неможливо виконати за допомогою одного оператора, то послідовно використовують декілька операторів, з урахуванням того, що результатом роботи будь-якого оператора SELECT є двовимірна таблиця, яка може бути початковою для наступного оператора.
© Куваєв Я.Г., 2005—2023.
Всі права захищені.
Вся інформація, яка розміщена на цьому веб-сайті, призначена тільки для персонального використання і не підлягає подальшому відтворенню і/або поширенню в будь-якій формі, інакше як за письмовим дозволом Автора.