Смекни!
smekni.com

Організація баз даних та знань (стр. 13 из 26)

Приклад. Одержати імена постачальників, що мають статус, більший 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;

2.8 Синтаксис оператора вибірки даних (SELECT). BNF-нотація

Опишемо синтаксис оператора вибірки даних (оператора SELECT) більш точно. При описі синтаксису операторів звичайно використовуються умовні позначки, відомі як стандартні форми Бекуса-Наура (BNF).

У BNF позначеннях використовуються такі елементи:

· Символ "::=" означає рівність по визначенню. Ліворуч від знака стоїть обумовлене поняття, праворуч - властиво визначенне поняття.

· Ключові слова записуються прописними буквами. Вони зарезервовані й становлять частину оператора.

· Заповнювачі конкретних значень елементів і змінних записуються курсивом.

· Необов'язкові елементи оператора укладені у квадратні дужки [].

· Вертикальна риса | вказує на те, що всі попередні їй елементи списку є необов'язковими й можуть бути замінені будь-яким іншим елементом списку після цієї риси.

· Фігурні дужки {} вказують на те, що все, що міститься усередині них, є єдиним цілим.

· Три крапки "..." означає, що попередня частина оператора може бути повторена будь-яка кількість разів.

· Багато крапок, усередині якого перебуває кома ".,.." вказує, що попередня частина оператора, яка складається з декількох елементів, розділених комами, може мати довільне число повторень. Кому не можна ставити після останнього елемента. Зауваження: дана угода не входить у стандарт BNF, але дозволяє більш точно описати синтаксис операторів SQL.

· Круглі дужки є елементом оператора.

Синтаксис оператора вибірки

У досить сильно спрощеному вигляді оператор вибірки даних має такий синтаксис (для деяких елементів ми дамо не BNF-визначення, а словесний опис):

Оператор вибірки ::=

Табличний вираз [ORDER BY

{{Ім'я стовпця-результату [ASC | DESC]} | {Позитивне ціле [ASC | DESC]}}.,..]; Табличне вираз ::=

Вираз-Select- вираз {UNION | INTERSECT | EXCEPT} [ALL]

{Вираз-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 або прості функції, що повертають скалярні значення.

Функція агрегування ::=

COUNT (*) | { {COUNT | MAX | MIN | SUM | AVG} ([ALL | DISTINCT] Скалярний

вираз) }

Конструктор значень таблиці ::= VALUES Конструктор значень рядка.,..

Конструктор значень рядка ::=

Елемент конструктора | (Елемент конструктора.,..) | Вираз-Select- вираз

Вираз-Select-вираз, який використовується у конструкторі значень рядка, зобов'язаний повертати рівно один рядок.

Елемент конструктора ::=

Вираз для обчислення значення | NULL | DEFAULT

Синтаксис з'єднаних таблиць

У розділі FROM оператора SELECT можна використовувати з'єднані таблиці. Нехай у результаті деяких операцій ми одержуємо таблиці A й B. Такими операціями можуть бути, наприклад, оператор SELECT або інша з'єднана таблиця. Тоді синтаксис з'єднаної таблиці має такий вигляд:

З'єднана таблиця ::=

Перехресне з'єднання | Природне з'єднання | З'єднання за допомогою предиката |

З'єднання за допомогою імен стовпців | З'єднання об'єднання

Тип з'єднання ::=

INNER | LEFT [OUTER] | RIGTH [OUTER] | FULL [OUTER]

Перехресне з'єднання ::=

Таблиця А 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

Умовний вираз, використовуваний в розділі WHERE оператора SELECT повинен обчислюватися для кожного рядка-кандидата, який відбирається оператором SELECT. Умовний вираз може повертати одне із трьох значень істинності: TRUE, FALSE або UNKNOUN. Рядок-кандидат відбирається до результуючої множини рядків тільки у тому випадку, якщо для неї умовний вираз повернуло значення TRUE.

Умовні вирази мають такий синтаксис (з метою спрощення викладки наведені не всі можливі предикати):

Умовний вираз ::=

[ ( ] [NOT] {Предикат порівняння | Предикат between | Предикат in | Предикат like | Предикат null | Предикат кількісного порівняння | Предикат exist | Предикат unique |

Предикат match | Предикат overlaps} [{AND | OR} Умовний вираз] [ ) ] [IS [NOT] {TRUE |

FALSE | UNKNOWN}]

Предикат порівняння ::=

Конструктор значень рядка {= | < | > | <= | >= | <>} Конструктор значень рядка Приклад. Порівняння поля таблиці й скалярного значення: POSTAV.VOLUME > 100