Приклад. Одержати імена постачальників, що мають статус, більший 3 й одночасно поставляють хоча б одну деталь номер 2 (перетинання двох підзапитів - ключове слово INTERSECT): SELECT P.PNAME
FROM P
WHERE P.STATUS > 3 INTERSECT
SELECT P.PNAME
FROM P, PD
WHERE P.PNUM = PD.PNUM AND PD.DNUM = 2;
Приклад. Одержати імена постачальників, що мають статус, більший 3, за винятком тих, хто поставляє хоча б одну деталь номер 2 (різниця двох підзапитів - ключове слово EXCEPT):
SELECT P.PNAME
FROM P
WHERE P.STATUS > 3 EXCEPT
SELECT P.PNAME
ROM P, PD
WHERE P.PNUM = PD.PNUM AND
PD.DNUM = 2;
Опишемо синтаксис оператора вибірки даних (оператора SELECT) більш точно. При описі синтаксису операторів звичайно використовуються умовні позначки, відомі як стандартні форми Бекуса-Наура (BNF).
У BNF позначеннях використовуються такі елементи:
· Символ "::=" означає рівність по визначенню. Ліворуч від знака стоїть обумовлене поняття, праворуч - властиво визначенне поняття.
· Ключові слова записуються прописними буквами. Вони зарезервовані й становлять частину оператора.
· Заповнювачі конкретних значень елементів і змінних записуються курсивом.
· Необов'язкові елементи оператора укладені у квадратні дужки [].
· Вертикальна риса | вказує на те, що всі попередні їй елементи списку є необов'язковими й можуть бути замінені будь-яким іншим елементом списку після цієї риси.
· Фігурні дужки {} вказують на те, що все, що міститься усередині них, є єдиним цілим.
· Три крапки "..." означає, що попередня частина оператора може бути повторена будь-яка кількість разів.
· Багато крапок, усередині якого перебуває кома ".,.." вказує, що попередня частина оператора, яка складається з декількох елементів, розділених комами, може мати довільне число повторень. Кому не можна ставити після останнього елемента. Зауваження: дана угода не входить у стандарт BNF, але дозволяє більш точно описати синтаксис операторів SQL.
· Круглі дужки є елементом оператора.
У досить сильно спрощеному вигляді оператор вибірки даних має такий синтаксис (для деяких елементів ми дамо не BNF-визначення, а словесний опис):
Оператор вибірки ::=
Табличний вираз [ORDER BY
{{Ім'я стовпця-результату [ASC | DESC]} | {Позитивне ціле [ASC | DESC]}}.,..]; Табличне вираз ::=
{Вираз-Select- вираз | TABLE Ім'я таблиці | Конструктор значень таблиці} ] Вираз-Select-вираз ::=
SELECT [ALL | DISTINCT] {{{Скалярний вираз | Функція агрегування | ВиразSelect-вираз} [AS Ім'я стовпця]}.,..}
| {{Ім'я таблиці | І’мя кореляції}.*}
| * FROM {
{Ім'я таблиці [AS] [Ім'я кореляції] [(Ім'я стовпця.,..)]}
| {Вираз-Select- вираз [AS] Ім'я кореляції [(Ім'я стовпця.,..)]} | З'єднана таблиця }.,..
[WHERE Умовний вираз]
[GROUP BY {[{Ім'я таблиці | І'мя кореляції}.] Ім'я стовпця}.,..]
[HAVING Умовний вираз]
Вираз-Select-вираз у розділі SELECT, який використовується як значення для стовпця, який відбирається, повинен повертати таблицю, що складається з одного рядка й одного стовпця, тобто скалярний вираз.
Умовний вираз у розділі WHERE повинен обчислюватися для кожного рядка, що є кандидатом у результуючу множину рядків. У цьому умовному виразі можна використовувати підзапити. Синтаксис умовних виразів, припустимих у розділі WHERE розглядається нижче.
Розділ HAVING містить умовний вираз, що обчислюється для кожної групи, обумовленої переліком угруповання в розділі GROUP BY. Цей умовний вираз може містити функції агрегування, що обчислюються для кожної групи. Умовний вираз, сформульований у розділі WHERE, може бути перенесений до розділу HAVING. Перенос умов з розділу HAVING у розділ WHERE неможливий, якщо умовний вираз містить агрегатні функції.
Якщо в розділі SELECT присутні агрегатні функції, то вони обчислюються по-різному залежно від наявності розділу GROUP BY. Якщо розділ GROUP BY відсутній, то результат запиту повертає не більше одного рядка. Агрегатні функції обчислюються по всіх рядках, які задовольняють умовному виразу в розділі WHERE. Якщо розділ GROUP BY є присутнім, то агрегатні функції обчислюються окремо для кожної групи, зазначеної у розділі GROUP BY.
Скалярний вираз - як скалярні вирази у розділі SELECT можуть виступати або імена стовпців таблиць, що входять у розділ FROM або прості функції, що повертають скалярні значення.
Функція агрегування ::=
вираз) }
Конструктор значень таблиці ::= VALUES Конструктор значень рядка.,..
Конструктор значень рядка ::=
Елемент конструктора | (Елемент конструктора.,..) | Вираз-Select- вираз
Вираз-Select-вираз, який використовується у конструкторі значень рядка, зобов'язаний повертати рівно один рядок.
Елемент конструктора ::=
Вираз для обчислення значення | NULL | DEFAULT
У розділі FROM оператора SELECT можна використовувати з'єднані таблиці. Нехай у результаті деяких операцій ми одержуємо таблиці A й B. Такими операціями можуть бути, наприклад, оператор SELECT або інша з'єднана таблиця. Тоді синтаксис з'єднаної таблиці має такий вигляд:
З'єднана таблиця ::=
Перехресне з'єднання | Природне з'єднання | З'єднання за допомогою предиката |
З'єднання за допомогою імен стовпців | З'єднання об'єднання
Тип з'єднання ::=
Перехресне з'єднання ::=
Таблиця А CROSS JOIN Таблиця В
Природне з'єднання ::=
Таблиця А [NATURAL] [Тип з'єднання] JOIN Таблиця В
З'єднання за допомогою предиката ::=
Таблиця А [Тип з'єднання] JOIN Таблиця В ON Предикат
З'єднання за допомогою імен стовпців ::=
Таблиця А [Тип з'єднання] JOIN Таблиця В USING (Ім'я стовпця.,..)
З'єднання об'єднання ::=
Таблиця А UNION JOIN Таблиця В Опишемо використані терміни.
CROSS JOIN - перехресне з'єднання повертає просто декартовий добуток таблиць. Таке з'єднання в розділі FROM може бути замінено списком таблиць через кому.
NATURAL JOIN - природне з'єднання відбувається по всіх стовпцях таблиць А і В, що мають однакові імена. У результуючу таблицю однакові стовпці уставляються тільки один раз.
JOIN ... ON - з'єднання за допомогою предиката з'єднує рядки таблиць А і В за допомогою зазначеного предиката.
JOIN ... USING - з'єднання за допомогою імен стовпців з'єднує відношення подібно природному з'єднанню по тим загальним стовпцям таблиць А і Б, які зазначені в списку USING.
OUTER - ключове слово OUTER (зовнішній) не є обов'язковими, воно не використовується ні в яких операціях з даними.
INNER - тип з'єднання "внутрішнє". Внутрішній тип з'єднання використовується за замовчуванням, коли тип явно не заданий. У таблицях А і В з'єднуються тільки ті рядки, для яких знайден збіг.
LEFT (OUTER) - тип з'єднання "ліве (зовнішнє)". Ліве з'єднання таблиць А і В містить у собі всі рядки з лівої таблиці А і ті рядки із правої таблиці В, для яких виявлений збіг. Для рядків з таблиці А, для яких не знайдено відповідності у таблиці В, у стовпці, що витягають із таблиці В, заносяться значення NULL.
RIGHT (OUTER) - тип з'єднання "праве (зовнішнє)". Праве з'єднання таблиць А і В містить у собі всі рядки із правої таблиці В і ті рядки з лівої таблиці А, для яких виявлений збіг. Для рядків з таблиці В, для яких не знайдено відповідності в таблиці А, у стовпці, що витягають із таблиці А, заносяться значення NULL.
FULL (OUTER) - тип з'єднання "повне (зовнішнє)". Це комбінація лівого й правого з'єднань. У повне з'єднання включаються всі рядки з обох таблиць. Для співпадаючих рядків поля заповнюються реальними значеннями, для незбіжних рядків поля заповнюються відповідно до правил лівого й правого з'єднань.
UNION JOIN - з'єднання об'єднання є зворотним стосовно внутрішнього з'єднання. Воно включає тільки ті рядки з таблиць А і В, для яких не знайдено збігів. У них використаються значення NULL для стовпців, отриманих з іншої таблиці. Якщо взяти повне зовнішнє з'єднання й видалити з нього рядки, отримані в результаті внутрішнього з'єднання, то вийде з'єднання об'єднання.
Використання з'єднаних таблиць часто полегшує сприйняття оператора SELECT, особливо, коли використовується природне з'єднання. Якщо не використовувати з'єднані таблиці, то при виборі даних з декількох таблиць необхідно явно вказувати умови з'єднання в розділі WHERE. Якщо при цьому користувач указує складні критерії відбору рядків, то в розділі WHERE змішуються семантично різні поняття - як умови зв'язку таблиць, так й умови відбору рядків.
Умовний вираз, використовуваний в розділі WHERE оператора SELECT повинен обчислюватися для кожного рядка-кандидата, який відбирається оператором SELECT. Умовний вираз може повертати одне із трьох значень істинності: TRUE, FALSE або UNKNOUN. Рядок-кандидат відбирається до результуючої множини рядків тільки у тому випадку, якщо для неї умовний вираз повернуло значення TRUE.
Умовні вирази мають такий синтаксис (з метою спрощення викладки наведені не всі можливі предикати):
Умовний вираз ::=
[ ( ] [NOT] {Предикат порівняння | Предикат between | Предикат in | Предикат like | Предикат null | Предикат кількісного порівняння | Предикат exist | Предикат unique |
Предикат match | Предикат overlaps} [{AND | OR} Умовний вираз] [ ) ] [IS [NOT] {TRUE |
Предикат порівняння ::=
Конструктор значень рядка {= | < | > | <= | >= | <>} Конструктор значень рядка Приклад. Порівняння поля таблиці й скалярного значення: POSTAV.VOLUME > 100