ОБЧИСЛЮВАЛЬНІ МОЖЛИВОСТІ

Незважаючи на те, що раніше про це не згадувалося, в певному нами реляційному обчисленні вже є аналоги алгебраїчних операторів EXTEND і SUMMARIZE ПО перерахованими нижче причин

■ Однією з допустимих форм кортежу-прототипу є параметр &lt tuple se lector inv&gt  (Виклик селектора кортежу), компонентами якого можуть бути довільні вирази

■ У параметрі <'оо1 Ехр> порівнюваними елементами можуть бути довільні вирази

■ Як було показано в розділі 7, першим або єдиним параметром &ltagg op inv&gt (Виклик агрегує оператора) є реляционное вираз

&ltrelation exp&gt.

Ми вважаємо, що тут не треба наводити всі можливі синтаксичні та семантичні відомості достатньо лише розглянути кілька типових прикладів (самі ці приклади також кілька спрощені)

851 Визначити номери і вага в грамах всіх типів деталей, вага яких перевищує 10 000 г

{РХР #, РХWEIGHT * 454 AS GMWT}

WHERE PXWEIGHT * 454 &gt WEIGHT ( 100000 )

Зверніть увагу, що специфікація AS в кортежі-прототипі (як і в прикладі 832) дає імя відповідного атрибуту результату Тому таке імя недоступно для використання в конструкції WHERE і вираз РХ WEIGHT * 454 має бути вказано в двох місцях

852 Вибрати відомості про всіх постачальників і позначити кожного з них Літеральна значенням Supplier

{   SX,     Supplier  AS    TAG  }

853 Отримати повні відомості про кожній поставці, включаючи загальну вагу поставки

{ SPX, PXWEIGHT * SPXQTY AS SHIPWT } WHERE PXP# = SPXP#

854 Для кожної деталі отримати номер деталі і загальний обсяг поставки в штуках

{РХР #, SIM (SPX WHERE SPXP # = PXP #, QTY) AS TOTQTY}

855 Визначити загальну кількість поставляються деталей

SUM  (  SPX,   QTY  )  AS  GRANDTOTAL

856 Для кожного постачальника отримати номер постачальника і загальний обсяг поставки в штуках

{ SXS#, COUNT ( SPX WHERE SPXS# = SXS# ) AS #_OF_PARTS }

857 Вказати назви таких міст, в яких зберігаються деталі, що в них знаходиться більше пяти деталей червоного кольору

RANGEVAR PY RANGES OVER P

PXCITY WHERE COUNT ( PY WHERE PYCITY = PXCITY

AND PYCOLOR = COLOR (Red) ) &gt 5

86 ЗАСОБИ МОВИ SQL

Як вже говорилося в розділі 84, реляційний мова може бути заснований як на реляційній алгебрі, так і на реляційному численні Що ж лежить в основі мови SQL На жаль, відповіддю буде частково і те, і інше, а частково ні те, ні інше .. .

Коли мова SQL тільки розроблявся, передбачалося що він буде відрізнятися як від реляційної алгебри, так і від реляційного числення [48] Дійсно, саме цим мотивувалося введення в мову конструкції IN &ltsubquery&gt (Див приклад 8610, наведений нижче) Проте з часом зясувалося, що мова SQL потребує певних засобах як реляційної алгебри, так і обчислення, тому він був розширений для включення цих функцій4 На сьогоднішній день ситуація складається таким чином, що мова SQL в чомусь схожий на реляційну алгебру, в чомусь на реляційне числення, а в чимось відрізняється від них обох Таким становищем справ пояснюється, чому в главі 7 ми відклали обговорення засобів обробки даних мови SQL до цієї глави (Ми надаємо читачеві як вправа визначити, яка частина мови SQL заснована на алгебрі, яка на обчисленні, а яка ні на тому, ні на іншому)

Запити в мові SQL формулюються у вигляді табличних виразів &lt table  exp&gt, які в принципі можуть мати дуже високий ступінь складності Тут ми не будемо заглиблюватися в усі ці нюанси, а просто розглянемо декілька прикладів, що розкривають найбільш важливі моменти В якості основи для прикладів взяті визначення таблиць SQL для бази даних постачальників і деталей, представлені в розділі 4 (див рис 41)

861Указать кольору деталей і назви міст для деталей, які мають вагу понад

10 фунтів і зберігаються в містах, відмінних від Парижа

SELECT PXCOLOR, PXCITY FROM  P AS PX

WHERE PXCITY &lt&gt Paris

AND   PXWEIGHT &gt WEIGHT ( 100 )

Необхідно зазначити наступне

1 Як було зазначено в розділі 5, у мові SQL як оператора перевірки на нера венство використовується символ о. Оператори менше або одно і більше або дорівнює, відповідно, записуються як < = " і "> =.

2 Специфікація Р AS PX в конструкції FROM по суті являє собою визна ня (у стилі обчислення кортежів) змінної області значень з імям РХ, областю значень якої є поточне значення таблиці Р Саме імя (а не змінну) РХ прийнято називати імям кореляції, а областю його визначення ня, неформально кажучи, є табличне вираз, в якому зявляється його визначення, виключаючи будь-яке внутрішнє вираження, в якому визначена інша змінна області значень з тим же імям (див приклад 8612)

4 Внаслідок цього, як наголошується в анотації до [419], конструкцію IN можна повністю видалити з мови без втрати його функціональності У цьому є певна іронія, оскільки завдяки саме зазначеної конструкції в назві даного мови, в перекладі означає мова структурованих запитів (Structured Query Language), зявилося слово структурований (Structured) Насправді саме ця конструкція сприяла тому, що в першу чергу для роботи з базами даних був застосований мова SQL, і лише потім реляційна алгебра і реляційне числення

3 У мові SQL допускається також застосування неявно заданих змінних області значень, що дозволяє переписати наведений вище запит в наступному вигляді

SELECT PCOLOR, PCITY FROM  P

WHERE PCITY &lt&gt Paris

AND   PWEIGHT &gt WEIGHT { 100 )

Основна ідея полягає в тому, що має бути дозволено використовувати імя таблиці для позначення неявно заданої змінної області значень, яка приймає значення з розглянутої таблиці (Зрозуміло, за тієї умови, що результати не допускають неоднозначного тлумачення) Наприклад, конструкцію FROM P в даному прикладі можна розглядати як скорочений запис конструкція FROM P AS P Іншими словами, необхідно чітко розуміти, що уточнююче імя Р (наприклад) у вираженні PCOLOR в конструкціях WHERE і SELECT позначає не саму таблицю Р, а змінну області значень Р, яка приймає свої значення з однойменної таблиці

4 Як було зазначено в розділі 4, в цьому прикладі можна було б цілком обійтися і без уточнітелі, таким чином

SELECT COLOR, CITY FROM P

WHERE CITY &lt&gt Paris

AND WEIGHT &gt WEIGHT ( 100 )

Згідно із загальним правилом мови SQL, неутонченние імена допускаються у всіх випадках, коли це не викликає неоднозначності Проте в наших прикладах специфікатори будуть звичайно (але не завжди) Використовуватися і в тих випадках, коли формально вони зайві На жаль, в певних контекстах явно потрібно, щоб імена стовпців були НЕ уточнені Наприклад, це требуется5 в конструкції ORDER BY (див наступний приклад)

5 У інтерактивних запитах SQL може також використовуватися конструкція ORDER BY, вже згадувана в розділі 4 у звязку з оголошенням DECLARE CURSOR, як показано нижче

SELECT PCOLOR, PCITY FROM Р

WHERE PCITY &lt&gt Paris

AND   PWEIGHT &gt WEIGHT ( 100 )

ORDER BY CITY DESC / * Слід про

6 Нагадуємо, що допускається використання скорочення SELECT *, про який також згадувалося в розділі 4

SELECT * FROM   P

WHERE PCITY &lt&gt Paris

AND   PWEIGHT &gt WEIGHT ( 100 )

5 За винятком тих випадків, які вказані в розділі 46 глави 4

Символ * у вираженні SELECT * являє собою скорочене позначення розділеного комами списку імен всіх стовпців таблиці (або таблиць), зазначеної в конструкції FROM У цьому списку імена стовпців знаходяться в тому ж порядку, в якому вони розташовані у відповідній таблиці (або таблицях) Слід зазначити, що таку скорочену запис особливо зручно використовувати в інтерактивних запитах, оскільки при цьому зменшується кількість натискань клавіш Однак при використанні цієї конструкції під впроваджених операторах SQL (тобто в операторах мови SQL, впроваджених в програму на іншій мові) існує прихована небезпека, оскільки в подібних випадках символ * може придбати зовсім інше значення (наприклад, після додавання в таблицю стовпця або його видалення за допомогою оператора ALTER TABLE)

7&nbsp&nbsp&nbsp&nbsp {Більш важлива інформація в порівнянні з наведеною в попередніх пунктах) Зверніть увагу, що для використовуваного нами в прикладах набору даних цей запит буде повертати чотири рядка, а не дві, незважаючи на те, що три з них будуть абсолютно ідентичні У мові SQL не передбачено видалення зайвих дубльованих рядків з результату оператора SELECT, поки користувач явно не потребують цього за допомогою ключового слова DISTINCT, як показано нижче

SELECT DISTINCT PCOLOR, PCITY FROM  P

WHERE PCITY &lt&gt Paris

AND   PWEIGHT &gt WEIGHT ( 100 )

Даний варіант запиту буде повертати вже два рядки, а не чотири

З усього вищесказаного випливає (як уже було фактично зазначено в розділі 6), що фундаментальним обєктом даних у мові SQL є не ставлення, а швидше таблиця, і таблиці SQL містять (взагалі кажучи)не безлічі, a мультимножинирядків (в мультімножество допускаються повторення елементів) Таким чином, у мові SQL порушується інформаційний принцип Один з наслідків цього факту полягає в тому, що основні оператори SQL не є реляційними операторами в повному розумінні цього слова, а аналогами реляційних операторів, призначених для роботи з мультимножинами Іншим наслідком є ​​те, що теореми і їх побічні результати, які є справедливими в реляційної моделі (наприклад, про перетворення виразів, [66]), не обовязково виконуються в мові SQL

862 Для всіх деталей вказати номер деталі і вага в грамах (спрощена версія прикладу 851)

SELECT РР #, PWEIGHT * 454 AS GMWT FROM P

Специфікація AS GMWT вводить відповідне імя стовпця результату для обчисленого стовпчика. Таким чином, два стовпці результуючої таблиці будуть називатися р # і GMWT Якби специфікація AS GMWT була опущена, то відповідний стовпець залишився б фактично безіменним Відзначимо, що хоча в подібних випадках правила мови SQL насправді не вимагають від користувача зазначення імені результуючого стовпця, в наших прикладах будемо їх задавати завжди

863 Отримати всі комбінації даних про постачальників і деталях,

знаходяться в одному місті

У мові SQL існує кілька способів формулювання цього запиту Наведемо три найпростіших

1 SELECT S *, PP #, PPNAME, PCOLOR, PWEIGHT FROM S, Р

WHERE SCITY = PCITY

2&nbsp S JOIN P USING CITY

3&nbsp S NATURAL JOIN P

Результатом в кожному случае6 буде природне зєднання таблиць S і Р (по атрибуту міста CITY)

Перша формулювання заслуговує більш докладного обговорення Саме вона, єдина з трьох запропонованих варіантів, допустима в початковій версії мови SQL (явна операція JOIN була введена в стандарті SQL: 1992) Концептуально можна розглядати реалізацію цієї версії запиту наступним чином

■ По-перше, після виконання конструкція FROM МИ отримуємо декартовій твір S TIMES P (Строго кажучи, перед обчисленням твори слід було б подбати про перейменування стовпців Для простоти ми це питання не рас розглядаємо Нагадуємо також, що, як випливає зі сказаного в розділі 77, де картовь твором єдиної таблиці t є сама таблиця t)

■ По-друге, після виконання конструкція WHERE МИ отримуємо скорочення цього твору, в якому два значення атрибута CITY У кожному рядку рівні (інакше кажучи, виконано зєднання таблиць постачальників і деталей по еквівалентності атрибутів з позначенням міста)

■ По-третє, після виконання конструкція SELECT ми отримуємо проекцію вибір ки по стовпцях, зазначеним у конструкції SELECT Кінцевим результатом стає природне зєднання зазначених таблиць

Отже, неформально кажучи, в мові SQL конструкція FROM відповідає декартову твору, конструкція WHERE – операції скорочення, а конструкції SELECT-FROM-WHERE, разом узяті, – проекції скорочення твору (але, як було зазначено вище, розглянута проекція не обовязково усуває дублікати)

864 Знайти всі пари назв міст, таких що постачальник, який перебуває у першій місті, постачає деталь, що зберігається в другому місті

SELECT DISTINCT SCITY AS SCITY, PCITY AS PCITY FROM  S JOIN SP USING S# JOIN P USING P#

Зверніть увагу, що наведений нижче оператор єнеправильним

(Поясніть, чому)

6 У стандарті SQL: 2003, мабуть, буде передбачено вимогу, щоб друга і третя формулювання включали префікс SELECT * FROM.

SELECT DISTINCT SCITY AS SCITY, PCITY AS PCITY FROM   S NATURAL JOIN SP NATURAL JOIN P

Відповідь Оскільки в другому зєднанні він включає стовпець CITY як стовпець, по якому виконується зєднання

865Получіть всі пари номерів постачальників, таких що обидва постачальника в кожній парі знаходяться в одному місті (див приклад 832)

SELECT AS # AS SA, BS # AS SB FROM S AS A, S AS В WHERE ACITY = BCITY AND AS # < B.S #;

У цьому прикладі потрібно явно вказувати змінні області значень Також слід зазначити, що вводяться імена стовпців SA і SB відносяться до стовпців результуючої таблиці, і тому не можуть використовуватися в конструкції WНЕRЕ

866Определіть загальна кількість постачальників

SELECT COUNT(*) AS N FROM  S

Результатом буде таблиця з одним стовпцем, якому присвоєно імя N, і одним рядком, що містить значення 5 Мова SQL підтримує типовий набір агрегують функцій7: COUNT, SUM, AVG, MAX, MIN, EVERY і ANY Однак є ще кілька специфічних особливостей мови SQL, про які необхідно знати користувачеві

. ■ У загальному випадку фактичного параметру агрегує функції може передувати необовязкове ключове слово DISTINCT (наприклад, SUM (DISTINCT QTY)), яке вказує, що перед застосуванням цієї функції дублюються рядки повинні бути видалені Для функцій MAX, MIN, EVERY і ANY ключове слово DISTINCT є зайвим і не викликає ніякої дії

■ Спеціальна агрегує функції COUNT (*) не допускає використання ключового слова DISTINCT І призначена для підрахунку всіх рядків у таблиці без попереднього видалення дубльованих рядків

■ Будь-які невизначені значення в стовпці фактичного параметра (глава 19) видаляються перед застосуванням агрегує функції незалежно від того, указу але чи ключове слово DISTINCT, крім випадку використання агрегує функції COUNT (*), коли невизначені значення обробляються так само, як звичайні значення

■ Якщо після видалення невизначених значень повинно залишитися порожній безліч, то агрегує функції COUNT повертає нуль, а всі інші оператори повертають невизначене значення

7 EVERY це аналог конструкції ALL в мові SQL (в цій мові ключове слово ALL не підтримується) Замість ключового слова ANY можна застосувати SOME Крім того, було введено кілька додаткових агрегують операторів у звязку з створенням версії SQL / OLAP, що дозволяє використовувати мову SQL в області так званої оперативної аналітичної обробки (Див главу 22)

Примітка Цей результат є логічно правильним для COUNT, але не для інших операторів Наприклад, як було показано в розділі 82, оператор EVERY з точки зору логіки повинен повертати значення TRUE, якщо він застосовується до порожнього безлічі

867 Визначити максимальна і мінімальна кількість деталей з номером Р2

SELECT МАХ (SPQTY) AS MAXQ, MIN (SPQTY) AS MINQ FROM SP

WHERE SPP# = P# (P2)

Тут обидві конструкції, FROM і WHERE, фактично надають частину формальних параметрів для двох агрегуються функцій Отже, з точки зору логіки вони повинні були б записуватися в дужках, що укладають аргументи Проте, даний запит дійсно повинен записуватися саме так, як показано вище Цей неортодоксальний підхід до синтаксису робить істотний негативний вплив на структуру, зручність використання і ортогональность8 мови SQL Наприклад, один з наслідків полягає в тому, що агрегує функції не можуть бути вкладеними, в результаті чого такий запит, як Обчислити середнє значення підсумкових значень кількості деталей , не можна сформулювати без громіздких виразів Якщо бути точним, то

наступний запит є неправильним

SELECT AVG (SUM (SPQTY)) / * Застереження Це неправильний запит * / FROM SP

Замість цього даний запит слід було б сформулювати, наприклад, таким чином

SELECT AVG ( X )

FROM ( SELECT SUM ( SPQTY ) AS X

FROM  SP

GROUP BY SPS# ) AS POINTLESS

Призначення конструкції GROUP BY розяснюється в наступному прикладі, а використання вкладених підзапитів, подібних наведених тут в конструкції FROM, – трохи нижче

Примітка Специфікація AS POINTLESS безглузда, проте її наявності вимагають синтаксичні правила мови SQL (додаткова інформація наведена в [420])

868Для кожної поставляється деталі вказати номер деталі і загальний обсяг поставки в штуках (модифікована версія прикладу 854)

SELECT SPP#, SUM ( SPQTY ) AS TOTQTY FROM  SP

GROUP BY SPP#

8 Ортогональность означає незалежність Мова є ортогональним, якщо незалежні поняття зберігають в ньому свою незалежність і не змішуються між собою незрозумілим чином Ортогональность вельми бажана, оскільки чим менше ортогонален мову, тим він більш складний і, як це не парадоксально, менш потужний

Наведене вище вираз мовою SQL є аналогом наступного виразу реляційної алгебри

SUMMARIZE SP BY {Р #} ADD SUM (QTY) AS TOTQTY

Воно також є аналогом наступного виразу реляційного числення кортежів

( SPXP#, SUM ( SPY WHERE SPYP# = SPXP#, QTY ) AS TOTQTY )

Зокрема, слід зазначити, що якщо в запиті вказана конструкція GROUP BY, то вирази в конструкції SELECT повинні бути однозначними для заданої групи Нижче наведена альтернативна (а також певною мірою більш бажана) формулювання того ж запиту

SELECT PP#,                                         ( SELECT SUM ( SPQTY ) FROM    SP

WHERE SPP# = PP# ) AS TOTQTY

FROM P

Можливість використовувати подзапрос таким чином дозволяє нам отримати результат, який включає рядки з даними про деталі, що не входять ні в одну поставку Цього не можна було забезпечити за допомогою попередньої формулювання, в якій використовувалася конструкція GROUP BY (Але, на жаль, значення TOTQTY для таких деталей буде представлено у вигляді порожнього значення, а не нуля)

869 Визначити номери всіх деталей, що поставляються більше ніж одним постачальником

SELECT SPP# FROM   SP

GROUP BY SPP#

HAVING COUNT ( SPS# ) &gt 1

Конструкція HAVING стосовно до груп виконує такі ж функції, як і конструкція WHERE стосовно рядках Іншими словами, конструкція HAVING використовується для виключення груп аналогічно тому, як конструкція WHERE використовується для виключення окремих рядків Вираз в конструкції HAVING має бути однозначним для кожної групи

8610Определіть імена постачальників деталі з номером Р2 (див приклад 751)

SELECT DISTINCT SSNAME FROM S

WHERE SS# IN

( SELECT SPS#

FROM  SP    

WHERE  SPP# = P# (P2) )

Пояснення У цьому прикладі в конструкції WHERE використовується так званий подзапрос Неформально кажучи, подзапрос – це вираження з конструкцій SELECT-FROMWHERE-GROUP BY-HAVING, яке вкладено в інше таке ж вираження Підзапит найчастіше використовується для представлення безлічі значень, пошук яких

здійснюється за допомогою конструкція IN З умовою, що і представлено в даному у прикладі Система обчислює запит в цілому, попередньо обчисливши вказаний подзапрос (принаймні, концептуально) Підзапит в даному прикладі повертає безліч номерів постачальників деталі з номером Р2, а саме, {S1, S2, S3, S4} Таким чином, первісне вираження еквівалентно наступному, більш простому

SELECT   DISTINCT   SSNAME

FROM

S

WHE R E

S S                                          IN                                         (                                         S  #  (    S  1  )    ,

S  #  (    S  2  1   )  ,

S  #  (    S  3    )  ,

S  #  (    S  4    )

)                                           

Слід зазначити, що первинне завдання – Отримати імена постачальників деталі з номером Р2 – Можна настільки ж успішно висловити з допомогою операції зєднання, наприклад, таким чином

SELECT DISTINCT SSNAME FROM  S, SP

WHERE SS# = SPS#

AND   SPP# = P# (P2)

8611 Визначити імена постачальників принаймні однієї деталі червоного кольору (див приклад 834)

SELECT DISTINCT

SSNAME FROM  S WHERE SS# IN

( SELECT SPS# FROM   SP

WHERE SPP# IN  ( SELECT PP# FROM   P WHERE P COLOR = COLOR ( Red ) ) )

;

Підзапити можуть мати довільну глибину вкладення Вправа Наведіть еквівалентну формулювання цього запиту з використанням операції зєднання

8612 Визначити номери постачальників, що мають статус менше того, який в даний час є максимальним в таблиці S

SELECT SS# FROM   S

WHERE SSTATUS &lt

( SELECT MAX (

SSTATUS ) FROM  S )

;

У цьому прикладі використовуються дві окремі неявні змінні області значень,

позначені тим же імям S і приймаючі значення з тієї ж таблиці S

8613Определіть імена постачальників деталі з номером Р2

Примітка Цей приклад повторює приклад 8610 Нижче наведено інше рішення,

дозволяє представити ще один засіб мови SQL

SELECT DISTINCT SSNAME FROM   S WHERE  EXISTS

( SELECT * FROM   SP

WHERE     SPS#   =   S S #

AND                                        SPP#   =   P#     ( P 2 )     )

Пояснення Вираз EXISTS (SELECT .. FROM ..) мовою SQL приймає значення TRUE тоді і тільки тоді, коли результат обчислення виразу SELECT .. FROM .. буде непустою Іншими словами, в мові SQL функція EXISTS відповідає квантору існування реляційного числення (більшою чи меншою мірою див [196])

Примітка У специфікації SQL посилання на подзапрос, аналогічні показаним в даному прикладі, називаються посиланнями на корельований подзапрос (correlated subquery), оскільки в даному підзапиті міститься посилання на змінну області значень (а саме – на неявну змінну області значень S), яка визначена в зовнішньому

запиті Ще одним прикладом корельованого підзапиту може служити приклад 868

8614 Визначити імена постачальників, які не поставляють деталь з номером Р2 (приклад 837)

SELECT DISTINCT SSNAME FROM  S

WHERE NOT EXISTS

( SELECT * FROM   SP

WHERE SPS# = SS# AND

SPP# = P# (P2) )

Цей же запит можна також представити в альтернативній формулюванні

SELECT DISTINCT SSNAME FROM   S WHERE SS# NOT IN

( SELECT SPS#

FROM  SP                                        WHERE SPP#

= P# ( P2 ) )

8615Определіть імена постачальників, які постачають деталі всіх типів (див приклад 836)

SELECT DISTINCT SSNAME FROM   S

WHERE NOT EXISTS   ( SELECT * FROM  P WHERE  NOT EXISTS

( SELECT *   FROM  SP WHERE SPS# = SS#    AND SPP# = PP# ) )

Мова SQL не включає будь-якої безпосередньої підтримки квантора загальності FORALL отже, запити з кванторами FORALL зазвичай виражаються за допомогою квантора існування та подвійного заперечення, як і в цьому прикладі

Слід зазначити, що вирази, подібні показаному вище, хоча на перший погляд і здаються досить страхітливими, легко формуються користувачами, знайомими з реляційним обчисленням, як зазначається в [84] В іншому випадку, якщо подібні приклади все ще здаються занадто складними, існує декілька обхідних шляхів, що дозволяють уникнути використання заперечуваних кванторів В даному випадку, наприклад, можна записати запит таким чином

SELECT DISTINCT SSNAME FROM  S

WHERE ( SELECT COUNT ( SPP# ) FROM  SP

WHERE SPS# = SS# )

= ( SELECT COUNT ( PP#

)

FROM  P )

(Розшифровка: Отримати імена постачальників, для яких кількість поставляються деталей дорівнює кількості всіх деталей.) Однак слід зазначити, що в останній формулюванні (на відміну від формулювання з виразом NOT EXISTS) використовується той факт, що номер кожної поставляється деталі є номером існуючої деталі Іншими словами, ці два формулювання еквівалентні, але друга є правильною тільки завдяки підтримці деякого обмеження цілісності (Подробиці наводяться в наступному розділі)

Примітка Насправді в наведеному вище прикладі виконується завдання порівняння двох таблиць, тому даний запит можна було б представити таким чином

SELECT DISTINCT SSNAME / * Застереження Неприпустимий запит * /

FROM   S

WHERE { SELECT SPP# FROM   SP

WHERE  SPS# = SS#

) = ( SELECT PP# FROM   P )

Але в мові SQL безпосередньо не підтримується операція порівняння таблиць, тому доводиться вдаватися до виверту, використовуючи порівняння Кардинально таблиць замість порівняння таблиць (спираючись на практичний досвід, який свідчить про те, що якщо кардинальності таблиць рівні, то і таблиці однакові, принаймні, в обговорюваному випадку) Додатковий матеріал з даної теми наведено в упр 811

8616Определіть номера деталей, які або важать більше 16 фунтів, або поставляються постачальником з номером S2, або відповідають і тому, й іншому умові (див приклад 839)

SELECTPP# FROM  P

WHERE PWEIGHT &gt WEIGHT ( 160 )

UNION

SELECT SPP# FROM   SP

WHERE SPS# = S# (S2)

Зайві повторювані рядки завжди виключаються з результату виконання неуточнених операторів UNION, INTERSECT І EXCEPT (У мові SQL оператор EXCEPT служить аналогом операції MINUS реляційної алгебри) Однак мова SQL також підтримує уточнені варіанти цих операторів(UNION  ALL, INTERSECT  ALL  І EXCEPT ALL), при яких повторювані рядки (якщо вони є) зберігаються Приклади з цими варіантами операторів навмисне не показані

8617Определіть номер деталі і вага в грамах для кожної деталі з вагою

> 10 000 г (див приклад 851)

SELECT PP#, PWEIGHT * 454 AS GMWT FROM  P

WHERE PWEIGHT * 454 &gt WEIGHT ( 100000 )

Тепер необхідно згадати визначення конструкція WITH, яка була вперше представлена ​​в розділі 5 і використовувалася при описі реляційної алгебри9 в главі 7 Неформально висловлюючись, конструкція WITH призначена для присвоювання імен виразами У мові SQL також є конструкція WITH, але її застосування обмежується тільки виразами з таблицями У даному прикладі за допомогою цієї конструкції можна уникнути необхідності двічі записувати вираз PWEIGHT * 454, як показано нижче

WITH Tl AS ( SELECT PP#, PWEIGHT * 454 AS GMWT FROM  P )

SELECT T1P#, TlGMWT FROM   Tl WHERE TlGMWT &gt WEIGHT ( 100000

)

До речі, слід зазначити, що записи в конструкції WITH (які в попередньому розділі іменувалися як &ltname intro&gt — визначення імені) в мові SQL приймають вид AS (<ехр>), а в мові Tutorial D мають форму<Ехр> AS &ltname&gt. Необхідно також враховувати, що конструкція WITH набуває важливого значення, коли потрібно сформулювати мовою SQL аналог алгебраїчного оператора TCLOSE Додаткові відомості тут не представлені, але відповідний приклад можна знайти у відповіді на упр 46, який представлений в додатку Д

На цьому список прикладів застосування мови SQL для вибірки даних завершується Хоча цей список був досить великим, про багато можливостей мови SQL тут навіть не згадувалося Мова SQL в дійсності є надзвичайно надмірною [419] в тому сенсі, що майже завжди існує безліч способів подання одного і того ж запиту, і нам не вистачить місця, щоб описати всі можливі формулювання і всі можливі опції навіть для порівняно невеликого числа прикладів, які розглядалися в цьому розділі (Додаткові відомості на цю тему наведені у додатку Б)

9 Безумовно, ця конструкція може також використовуватися в реляційному численні

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*