yandex rtb 1
ГоловнаЗворотній зв'язок
yande share
Главная->Різні конспекти лекцій->Содержание->2.8 Синтаксис оператора вибірки даних (SELECT). BNF-нотація

Організація баз даних і знань

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

Приклад. Порівняння двох сконструйованих рядків:

(PD.PNUM, PD.DNUM) = (1, 25)

Цей приклад еквівалентний умовному виразу

PD.PNUM = 1 AND PD.DNUM = 25

Предикат between ::=

 Конструктор значень рядка [NOT] BETWEEN Конструктор значень рядка AND Конструктор значень рядка

Приклад. PD.VOLUME BETWEEN 10 AND 100

Предикат in ::=

 Конструктор значень рядка [NOT] IN {(Select-вираз) | (Вираз для обчислення значення.,..)}

 

Приклад.

P.PNUM IN (SELECT PD.PNUM FROM PD WHERE PD.DNUM=2)

Приклад.

P.PNUM IN (1, 2, 3, 5)

Предикат like ::=

 Вираз для обчислення значення рядка-пошуку [NOT] LIKE

 Вираз для обчислення значення рядка-шаблона [ESCAPE Символ]

Предикат LIKE робить пошук рядка-пошуку в рядку-шаблоні. У рядку-шаблоні дозволяється використовувати два трафаретних символи:

·       Символ підкреслення "_" може використовуватися замість будь-якого одиничного символу в рядку-пошуку,

·       Символ відсотка "%" може заміняти набір будь-яких символів у рядку-пошуку (число символів у наборі може бути від 0 і більше).

Предикат null ::=

 Конструктор значень рядка IS [NOT] NULL

Зауваження. Предикат NULL застосовується спеціально для перевірки, чи не дорівнює вираз null-значенню.

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

 Конструктор значень рядка {= | < | > | <= | >= | <>} {ANY | SOME | ALL} (Select-вираз)

Квантори ANY й SOME є синонімами й повністю взаємозамінні. Якщо зазначено один із кванторів ANY й SOME, то предикат кількісного порівняння повертає TRUE, якщо порівнюване значення збігається хоча б з одним значенням, що повертається у підзапиті (select-виразі). Якщо зазначено квантор ALL, то предикат кількісного порівняння повертає TRUE, якщо порівнюване значення збігається з кожним значенням, що повертається у підзапиті (select-вираз).

Приклад.

P.PNUM = SOME (SELECT PD.PNUM FROM PD WHERE PD.DNUM=2)

Предикат exist ::=

 EXIST (Select-вираз)

Предикат EXIST повертає значення TRUE, якщо результат підзапиту (select-вираз) не порожній.

Предикат unique ::=

 UNIQUE (Select-вираз)

Предикат UNIQUE повертає TRUE, якщо в результаті підзапиту (select-вираз) немає співпадаючих рядків.

Предикат match ::=

 Конструктор значень рядка MATCH [UNIQUE] [PARTIAL | FULL] (Select-вираз)

Предикат MATCH перевіряє, чи буде значення, зазначене в конструкторі рядка збігатися зі значенням будь-якого рядка, отриманого у результаті підзапиту.

Предикат overlaps ::=

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

Предикат OVERLAPS, є спеціалізованим предикатом, що дозволяє визначити, чи буде зазначений період часу перекривати інший період часу.

 

25