У вас вопросы?
У нас ответы:) SamZan.net

ТЕМА 5 Мова реляційних запитів SQL

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 28.12.2024

ТЕМА 5. Мова реляційних запитів SQL.

Лекція 12. Співвідношення реляційної алгебри та структурованої мови запитів.

Роль та історія розвитку SQL. Непроцедурність SQL. SQL, як мова, наближена до природної. Нотація SQL. Проблеми використання SQL кінцевим користувачем. Поняття реляційної повноти. Методика перетворення алгебраїчних запитів в запити SQL. Діалекти мови SQL.

Роль та історія розвитку SQL. 1

Простий приклад 2

Історія 2

Стандарти 4

Питання сумісності 7

Переваги стандартів SQL 7

Недоліки стандартів SQL 8

Процедурні розширення 9

Коротко про стандарт SQL:2003 10

Приклад нотації для визначення оператора SELECT в Oralce 16

Співвідношення реляційної алгебри та структурованої мови запитів 17

Проекція 17

Селекція 17

Селекція: синтаксис умови 18

Операції над множинами: Об'єднання 18

Операції над множинами: перетин 18

Операції над множинами: Різниця 18

Декартів добуток 19

Тета-з’єднання 19

Натуральне з’єднання 19

Роль та історія розвитку SQL.

SQL (Structured query language — мова структурованих запитів) — декларативна мова програмування для взаємодії користувача з базами даних, що застосовується для формування запитів, оновлення і керування реляційними БД, створення схеми бази даних і її модифікації, системи контролю за доступом до бази даних. Сам по собі SQL не є ні системою керування базами даних, ні окремим програмним продуктом. Не будучи мовою програмування в тому розумінні, як C або Pascal, SQL може формувати інтерактивні запити або, будучи вбудованою в прикладні програми, виступати в якості інструкцій для керування даними. Стандарт SQL, крім того, вміщує функції для визначення зміни, перевірки і захисту даних.

SQL — це діалогова мова програмування для здійснення запиту і внесення змін до бази даних, а також управління базами даних. Багато баз даних підтримує SQL з розширеннями до стандартної мови. Ядро SQL формує командна мова, яка дозволяє здійснювати пошук, вставку, обновлення, і вилучення даних, використовуючи систему управління і адміністративні функції. SQL також включає CLI (Call Level Interface) для доступу і управління базами даних дистанційно.

Простий приклад

Простий запит для виведення списку із атрибутами Name, Address, Class із таблиці School у певній базі даних має такий вигляд:

SELECT Name, Address, Class

   FROM School;

Історія

На початку 1970-х років в одній з дослідницьких лабораторій компанії IBM була розроблена експериментальна реляційна СУБД System R, для якої потім була створена спеціальна мова SEQUEL, що дозволяла відносно просто управляти даними в цій СУБД. Абревіатура SEQUEL розшифровувалася як англ. Structured English QUEry Language — «структурована англійська мова запитів». Пізніше з юридичних міркувань[2] мова SEQUEL була перейменована в SQL. Коли в 1986 році перший стандарт мови SQL був прийнятий ANSI (American National Standards Institute), офіційною вимовою стало [,es kju:' el] — ес-кью-ел. Попри це, навіть англомовні фахівці по колишньому часто називають SQL сіквел, замість ес-кью-ел.

Метою розробки було створення простої непроцедурної мови, якою зміг би скористатися будь-який користувач, що навіть не має навиків програмування. Власне розробкою мови запитів займалися Дональд Чемберлін (Donald D. Chamberlin) і Рей Бойс (Ray Boyce). Пет Селінджер (Pat Selinger) займалася розробкою вартісного оптимізатора (англ. cost-based optimizer), Реймонд Лорі (Raymond Lorie) займався компілятором запитів.

Варто відзначити, що SEQUEL не був єдиною мовою подібного призначення. У Каліфорнійському університеті в Берклі була розроблена некомерційна СУБД Ingres (що була, між іншим, дальнім прародичем популярної зараз некомерційної СУБД PostgreSQL), яка була реляційною СУБД, але використовувала свою власну мову QUEL, яка, проте, не витримала конкуренції за кількістю СУБД, що підтримували його, з мовою SQL.

Першими СУБД, що підтримують нову мову SQL, стали в 1979 році Oracle V2 для машин VAX від компанії Relational Software Inc. (що згодом стала компанією Oracle) і System/38 від IBM, заснована на System/R.

Перший офіційний стандарт мови SQL був прийнятий ANSI в 1986 і ISO (Міжнародною організацією зі стандартизації) в 1987 (так званий SQL-86) і дещо уточнений в 1989 році. Подальший розвиток мови постачальниками СУБД зажадав ухвалення в 1992 р. нового розширеного стандарту (ANSI SQL-92 або просто SQL2). Наступним стандартом став SQL:1999 (SQL3).

Сьогодні мова SQL реалізована у всіх комерційних реляційних СУБД і майже у всіх СУБД, які споконвічно ґрунтувалися не на реляційному підході. Всі компанії-виробники проголошують відповідність своєї реалізації стандарту SQL, і насправді реалізовані діалекти SQL дуже близькі. Цього вдалося домогтися не відразу.

Найбільш близькі до System R були дві системи компанії IBM – SQL/DS й DB2. Розроблювачі обох систем використали досвід проекту System R, а СУБД SQL/DS прямо ґрунтувалася на програмному коді System R. Звідси гранична близькість діалектів SQL, реалізованих у цих системах, до SQL  System R. З SQL  System R були вилучені тільки ті частини, які були недостатньо пророблені (наприклад, крапки збереження) або реалізація яких викликала занадто більші технічні труднощі (наприклад, обмеження цілісності й тригери). Можна назвати цей шлях до комерційної реалізації SQL рухом зверху вниз.

Інший підхід застосовувався в таких системах, як Oracle, Informix й Sybase. Незважаючи на розходження в способах розробки систем, реалізація SQL скрізь відбувалася «знизу нагору». У перших випущених на ринок версіях цих систем використовувалася обмежена підмножина SQL  System R. Зокрема, у першій відомій нам реалізації SQL у СУБД Oracle в операторах вибірки не допускалося використання вкладених підзапитів і була відсутня можливість формулювання запитів із з'єднаннями декількох відносин.

Проте, незважаючи на ці обмеження й на дуже слабку, спочатку, ефективність СУБД, орієнтація компаній на підтримку різних апаратних платформ і зацікавленість користувачів у переході до реляційних систем дозволили компаніям домогтися комерційного успіху й приступитися до вдосконалювання своїх реалізацій. У поточних версіях Oracle, Informix, Sybase й Microsoft SQL Server підтримуються досить потужні діалекти SQL, хоча реалізація в багатьох конструкціях дуже відрізняється.


Стандарти

Історія версій стандартів-ревізій SQL:

Рік

Назва

Коментар

1986

SQL-86, SQL-87

Перший варіант стандарту, прийнятий інститутом ANSI і схвалений ISO у 1987 році.

1989

SQL-89

Трохи допрацьований варіант попереднього стандарту.

1992

SQL-92, SQL-2

Значні зміни (ISO 9075); рівень Entry Level стандарту SQL-92 був прийнятий як стандарт FIPS 127-2.

1999

SQL:1999, SQL-3

Додана підтримка регулярних виразів, рекурсивних запитів, підтримка тригерів, базові процедурні розширення, нескалярні типи даних і деякі об'єктно-орієнтовані можливості.

2003

SQL:2003

Введені розширення для роботи з XML-даними, віконні функції (застосовувані для роботи з OLAP-базами даних), генератори послідовностей і засновані на них типи даних.

2006

SQL:2006

Функціональність роботи з XML-даними значно розширена. З'явилася можливість спільно використовувати в запитах SQL і XQuery.

2008

SQL:2008

Поліпшено можливості віконних функцій, усунуті деякі неоднозначності стандарту SQL: 2003

ANSI SQL

SQL-92

(SQL2)

SQL-99

(SQL3)

Типова версія SQL для комерційної СУБД

  1. Всі можливості ANSI SQL;
  2. Майже всі можливості SQL-92;
  3. Деякі можливості ANSI SQL-99;
  4. Процедурні розширення*

  1.  JET SQL – для MsAccess;
  2.  Transact SQL – для MsSQL;
  3.  PL/SQL – для ORACLE;
  4.  SQL/PSM – для MySQL
  5. Та інші.

*З 1996р. внесені в стандарт ANSI, а невдовзі ISO

Подробиці на http://ru.wikipedia.org/wiki/SQL

SQL-2003

(SQL3)

SQL-2006

(SQL3)

SQL-2008

(SQL3)

Підтримка XML та OLAP

Розширена підтримка XML та OLAP

Включає обєктно-реляційні інструменти та інші можливості

 

Рис.5.1. Співвідношення діалектів  SQL

Приведемо коротку характеристику поточного стану стандарту SQL:1999 і перспектив його розвитку. Насамперед, помітимо, що кожен новий варіант стандарту мови SQL був істотно об'ємніше попередніх версій. Так, якщо стандарт SQL/89 займав близько 600 сторінок, то обсяг SQL/92 становив на 300 із зайвим сторінок більше. Найперші проекти SQL3 займали близько 1500 сторінок. Це цілком природно, тому що мова ускладнюється, а його специфікації стають більше детальними й точними. Але розроблювачі SQL3 прийшли до виводу, що при таких обсягах стандарту ймовірність його прийняття й наступної успішної підтримки помітно зменшується. Тому було ухвалене рішення розбити стандарт на відносно незалежні частини, які можна було б розробляти й підтримувати окремо.

В 1999 р. були прийняті п'ять перших частин стандарту SQL:1999. Перша частина (SQL/Framework) присвячена опису концептуальної структури стандарту. У цій частині приводиться розгорнута анотація наступних чотирьох частин і формулюються вимоги до реалізацій, що претендують на відповідність стандарту.

Друга частина SQL:1999 (SQL/Foundation) утворить базис стандарту. Уводиться система типів мови, формулюються правила визначення функціональних залежностей і можливих ключів, визначаються синтаксис і семантика основних операторів SQL:

  1.  операторів визначення й маніпулювання схемою бази даних;
  2.  операторів маніпулювання даними;
  3.  операторів керування транзакціями;
  4.  операторів керування підключеннями до бази даних і т.д.

Третю частину займає уточнена в порівнянні з SQL/92 специфікація SQL/CLI. У четвертій частині специфікується SQL/PSM - синтаксис і семантика мови визначення збережених процедур. Нарешті, у п'ятої частини - SQL/Bindings - визначаються правила зв'язування SQL для стандартних версій мов програмування FORTRAN, COBOL, PL/1, Pascal, Ada, C й MUMPS.

SQL / CLI, або інакше званий Call-Level Interface (інтерфейс рівня викликів), - розширення стандарту SQL, закріплене в ISO / IEC 9075-3:2003. Дане розширення визначає загальну взаємодію компонентів (структур і процедур), яке може використовуватися при виконанні SQL-запитів від програми, написаної на інших мовах програмування. Розширення SQL / CLI визначає порядок, в якому окремо викликаються SQL-запити і SQL / CLI-процедури з вихідного коду викликає додатка.

SQL / PSM - стандарт для SQL / Persistent Stored Modules (постійно збережувані модулі), розроблений Американським національним інститутом стандартів (ANSI) в якості розширення SQL. Стандарт підтримує процедурне програмування на додаток до виразів запиту мови SQL.

Розширення SQL / PSM закріплено стандартом ISO / IEC 9075-4:2003. SQL / PSM стандартизує процедурне розширення для SQL, включаючи управління потоком виконання, обробку умов, обробку прапорів станів, курсори і локальні змінні, а також привласнення виразів змінним і параметрами. SQL/PSM формалізує оголошення і підтримку постійних підпрограм мов баз даних (наприклад, «збережених процедур»).

У стандарт SQL:1999 повинні були ввійти ще кілька частин. Серед них специфікації наступних засобів:

  1.  керування розподіленими транзакціями (SQL/Transaction);
  2.  підтримка темпоральних властивостей даних (SQL/Temporal);
  3.  керування зовнішніми даними (SQL/MED);
  4.  зв'язування з об’єктно-орієнотованими мовами програмування (SQL/OLB);
  5.  підтримка оперативної аналітичної обробки (SQL/OLAP).

Наприкінці 2003 р. був прийнятий й опублікований новий варіант міжнародного стандарту SQL:2003. Багато фахівців уважали, що у варіанті стандарту, що випливає за SQL:1999, будуть усього лише виправлені неточності SQL:1999. Але насправді, в SQL:2003 специфікований ряд нових і важливих властивостей, частина з яких ми торкнемося в цьому курсі.

Перетерпіла деякі зміни загальна організація стандарту. Стандарт SQL:2003 складається з наступних частин:

  1.  9075-1, SQL/Framework;
  2.  9075-2, SQL/Foundation;
  3.  9075-3, SQL/CLI;
  4.  9075-4, SQL/PSM;
  5.  9075-9, SQL/MED (Management of External Data );
  6.  9075-10, SQL/OLB - Object Language Bindings (объектное языковое связывание);
  7.  9075-11, SQL/Schemata - Information and Definition Schemas (Схемы информации и определения);
  8.  9075-13, SQL/JRT - SQL Routines and Types for the Java Programming Language (Подпрограммы и типы SQL для языка программирования Java);
  9.  9075-14, SQL/XML - XML-Related Specifications (Спецификации, связанные сXML).

Частини 1-4 й 9-10 з необхідними змінами залишилися такими ж, як й в SQL:1999 (розд. 7.4). Частина 5 (SQL/Bindings) перестала існувати; відповідні специфікації включені в частину 2. Розділ частини 2 SQL:1999, присвячений інформаційній схемі, виділений в окрему частину 11. З'явилися дві нові частини - 13 й 14. Частина 13 повністю називається «SQL Routines and Types Using the Java Programming Language» («Використання підпрограм і типів SQL у мові програмування Java»). Поява такої частини стандарту виправдано підвищеною увагою до мови Java з боку провідних виробників SQL-орієнтованих СУБД. Нарешті, остання частина SQL:2003 присвячена специфікаціям язикових засобів, що дозволяють працювати з XML-документами в середовищі SQL.

Провідні постачальники відповідних СУБД (сьогодні це компанії IBM, Oracle й Microsoft) намагаються максимально швидко реагувати на потреби й кон'юнктуру ринку й розширюють свої продукти всі новими й новими можливостями. Очевидна потреба в стандартизації відповідних язикових засобів, але процес стандартизації явно не поспіває за змінами, що відбуваються.

Питання сумісності

Як і з багатьма стандартами, що мають місце в IT-індустрії, з мовою SQL виникла проблема, що у минулому багато виробників ПЗ з використанням SQL вирішили, що функціональність в поточній (на той момент часу) версії стандарту недостатня (що, в принципі, для ранніх версій SQL було певною мірою справедливо) і його бажано розширити. Що і призводить в цей час до того, що у різних виробників СУБД в ході різні діалекти SQL, в загальному випадку між собою несумісні.

До 1996 року питаннями відповідності комерційних реалізацій SQL стандарту займався в основному інститут NIST, який і встановлював рівень відповідності стандарту. Але пізній підрозділ, що займався СУБД, був розформований, і в цей час всі зусилля з перевірки СУБД на відповідність стандарту лягають на її виробника.

Вперше поняття «Рівня відповідності» було запропоноване в стандарті SQL-92. А саме, ANSI і NIST визначали чотири рівні відповідності реалізації цьому стандарту:

  1.  Entry (базовий)
  2.  Transitional (перехідний) — перевірку на відповідність цьому рівню проводив тільки інститут NIST
  3.  Intermediate (проміжний)
  4.  Full (повний)

Легко можна зрозуміти, що кожен подальший рівень відповідності свідомо мав на увазі відповідність попередньому рівню. Далі, згідно з цими рівнями стандартів будь-яка СУБД, яка відповідала рівню Entry, могла заявляти себе як «SQL-92 відповідна», хоча насправді переносимість і відповідність стандарту обмежувалося набором можливостей, що входять у цей рівень.

''Положення'' змінилося з введенням стандарту SQL:1999. Відтепер стандарт придбав модульну структуру — основна частина стандарту була винесена в розділ «SQL/Foundation», всі інші були виведені в окремі модулі. Відповідно, залишився тільки один рівень сумісності — Core, що означало підтримку цієї основної частини. Підтримка решти можливостей залишена на розсуд виробників СУБД. Аналогічне положення мало місце і з подальшими версіями стандарту.

Переваги стандартів SQL

1. Незалежність від конкретної СУБД

Незважаючи на наявність діалектів і відмінностей в синтаксисі, в більшості своїй тексти SQL-запитів, що містять, DDL і DML, можуть бути досить легко перенесені з однієї СУБД в іншу. Існують системи, розробники яких спочатку закладалися на застосування щонайменше кількох СУБД (наприклад: система електронного документообігу Documentum може працювати як з Oracle, так і з Microsoft SQL Server та IBM DB2). Природно, що при застосуванні деяких специфічних для реалізації можливостей такої переносимості добитися вже дуже важко.

2. Наявність стандартів

Наявність стандартів і набору тестів для виявлення сумісності і відповідності конкретній реалізації SQL загальноприйнятому стандарту тільки сприяє «стабілізації» мови. Правда, варто звернути увагу, що сам по собі стандарт місцями занадто формалізований і роздутий в розмірах, наприклад, Core-частину стандарту SQL:2003 включає понад 1300 сторінок тексту.

3. Декларативність

За допомогою SQL програміст описує тільки те, які дані потрібно витягнути або модифікувати. Те, яким чином це зробити, вирішує СУБД безпосередньо при обробці SQL-запиту. Проте не варто думати, що це повністю універсальний принцип — програміст описує набір даних для вибірки або модифікації, проте йому при цьому корисно уявляти, як СУБД розбиратиме текст його запиту. Особливо критичні такі моменти стають при роботі з великими базами даних і зі складними запитами — чим складніше сконструйований запит, тим більше він допускає варіантів написання, різних за швидкістю виконання, але тих самих за набором даних.

Недоліки стандартів SQL

1. Невідповідність реляційної моделі даних

Творець реляційної моделі даних Едгар Кодд, Крістофер Дейт та їхні прихильники указують на те, що SQL не є істинно реляційною мовою. Зокрема вони указують на такі проблеми SQL[3]:

  1.  Рядки, що повторюються
  2.  Невизначені значення (null)
  3.  Явна вказівка порядку стовпчиків зліва направо
  4.  Стовпці без імені та імена стовпчиків, що дублюються
  5.  Використання покажчиків
  6.  Висока надлишковість

У опублікованому Крістофером Дейтом і Г'ю Дарвеном Третьому Маніфесті вони висловлюють принципи СУБД наступного покоління і пропонують мову Tutorial D, яка є достовірно реляційною.

2. Складність

Хоча SQL і замислювався, як засіб роботи кінцевого користувача, врешті-решт він став настільки складним, що перетворився на інструмент програміста.

3. Відступи від стандартів

Незважаючи на наявність міжнародного стандарту ANSI SQL-92, багато компаній, СУБД (наприклад, OracleSybaseMicrosoftMySQL), що займаються розробкою, вносять зміни до мови SQL, вживаної в розроблених ними СУБД, тим самим відступаючи від стандарту. Таким чином з'являються специфічні для кожної конкретної СУБД діалекти мови SQL.

4. Складність роботи з ієрархічними структурами

Раніше SQL не пропонував стандартного способу маніпуляції деревовидними структурами. Деякі постачальники СУБД пропонували свої рішення. Наприклад, Oracle використовує вираз CONNECT BY.

Процедурні розширення

Оскільки SQL не є мовою програмування (тобто не надає засобів для автоматизації операцій з даними), введені різними виробниками розширення стосувалися в першу чергу процедурних розширень. Це збережені процедури (англ. stored procedures) і процедурні мови-«надбудови». Практично в кожній СУБД застосовується своя процедурна мова. Подібні мови для найпопулярніших СУБД приведені в такій таблиці:

СУБД

Коротка назва

Розшифровка

Borland InterBase/
Firebird

PSQL

Procedural SQL

IBM DB2

SQL PL

SQL Procedural Language (розширює SQL/PSM)

Microsoft SQL Server/
Sybase ASE

Transact-SQL

Transact-SQL

MySQL

SQL/PSM

SQL/Persistent Stored Module

Oracle

PL/SQL

Procedural Language/SQL (заснований на мові Ada)

PostgreSQL

PL/pgSQL

Procedural Language/PostgreSQL Structured Query Language (схожий на Oracle PL/SQL)

Коротко про стандарт SQL:2003 

Запис SQL-операторів

Для успішного вивчення мови SQL необхідно привести короткий опис структури SQL-операторів і нотації, які використовуються для визначення формату різних конструкцій мови. Оператор SQL складається з зарезервованих слів, а також зі слів, що визначаються користувачем. Зарезервовані слова є постійною частиною мови SQL і мають фіксоване значення. Їх слід записувати в точності так, як це встановлено, можна розбивати на частини для переносу з одного рядка на іншу. Слова, визначені користувачем, задаються їм самим (відповідно до синтаксичними правилами) і являють собою ідентифікатори або імена різних об'єктів бази даних. Слова в операторі розміщуються також відповідно до встановлених синтаксичними правилами.

Ідентифікатори мови SQL призначені для позначення об'єктів в базі даних і є іменами таблиць, уявлень, стовпців і інших об'єктів бази даних. Символи, які можуть використовуватися в створюваних користувачем ідентифікаторах мови SQL, повинні бути визначені як набір символів. Стандарт SQL задає набір символів, який використовується за умовчанням, - він включає рядкові і прописні букви латинського алфавіту (А-Я, AZ), цифри (0-9) і символ підкреслення (_). На формат ідентифікатора накладаються наступні обмеження:

  1.  ідентифікатор може мати довжину до 128 символів;
  2.  ідентифікатор повинен починатися з букви;
  3.  ідентифікатор не може містити пробіли.

<ідентифікатор>::=<буква>

{<буква>|<цифра>}[,...n]

Більшість компонентів мови не чутливі до регістру. Оскільки у мови SQL вільний формат, окремі SQL-оператори і їх послідовності будуть мати більш читаний вигляд при використанні відступів і вирівнювання.

Мова, в термінах якого дається опис мови SQL, називається метамовою. Синтаксичні визначення зазвичай задають за допомогою спеціальної металінгвістічна символіка, звана Бекуса-Науера формулами (БНФ). Прописні букви використовуються для запису зарезервованих слів і повинні вказуватися в операторах точно так, як це буде показано. Рядкові букви вживаються для запису слів, що визначаються користувачем. Застосовувані в нотації БНФ символи і їх позначення показані в таблиці.

Таблиця 5.1. Символи в нотації БНФ

Символ

Позначення

::=

Рівне за визначенням

|

Необхідність вибору одного з декількох наведених значень

<…>

Описана за допомогою метамови структура мови

{…}

Обов'язковий вибір деякої конструкції зі списку

[…]

Необов'язковий вибір деякої конструкції зі списку

[,…n]

Необов'язкова можливість повторення конструкції від нуля до декількох разів

Типи даних мови SQL, визначені стандартом

Дані - це сукупна інформація, що зберігається в базі даних у вигляді одного з кількох різних типів. За допомогою типів даних встановлюються основні правила для даних, що містяться в конкретному стовпчику таблиці, в тому числі розмір виділюваної для них пам'яті.

У мові SQL є шість скалярних типів даних, визначених стандартом. Їх короткий опис представлено в таблиці.

Таблиця 5.2. Символи в нотації БНФ

Тип даних

Оголошення

Символьний

CHAR | VARCHAR

Бітовий

BIT | BIT VARYING

Точні числа

NUMERIC | DECIMAL | INTEGER | SMALLINT

Округлені числа

FLOAT | REAL | DOUBLE PRECISION

Дата/час

DATE | TIME | TIMESTAMP

Інтервал

INTERVAL

<символьний_тип>::=

{ CHARACTER [ VARYING][довжина] | [CHAR | VARCHAR][ довжина]}

<бітовий_тип>::=

BIT [VARYING][довжина]

<фіксований_тип>::=

{NUMERIC[точність[,маштаб]]|{DECIMAL|DEC}

[точність[, маштаб]]

| {INTEGER |INT}| SMALLINT}

<дійсний_тип>::=

{ FLOAT [точність]| REAL |DOUBLE PRECISION}

<тип_дати/часу>::=

{DATE | TIME[точність][WITH TIME ZONE]| TIMESTAMP[точність][WITH TIME ZONE]}

Поняття домену

Домен це набір допустимих значень для одного або декількох атрибутів. Якщо в таблиці бази даних або в декількох таблицях присутні стовпці, що володіють одними і тими ж характеристиками, можна описати тип такого стовпця і його поведінку через домен, а потім поставити у відповідність кожному з однакових стовпців ім'я домену. Домен визначає всі потенційні значення, які можуть бути присвоєні атрибуту.

Стандарт SQL дозволяє визначити домен за допомогою наступного оператора:

<домен>::=

CREATE DOMAIN імя_домену [AS]

 тип_даних

[ DEFAULT значення]

[ CHECK (допустимі_значення)]

Кожному створюваному домену присвоюється ім'я, тип даних, значення за замовчуванням і набір припустимих значень. Слід зазначити, що наведений формат оператора є неповним. Тепер при створенні таблиці можна вказати замість типу даних ім'я домену.

Видалення доменів з бази даних виконується за допомогою оператора:

DROP DOMAIN імя_домену [ RESTRICT | CASCADE]

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

Альтернативою доменам в середовищах SQL Server і Oracle є користувальницькі типи даних.

Базовий синтаксис деяких основних операторів

Cтворення таблиці

<таблиця> ::=

  CREATE TABLE ім’я_таблиці

  (ім’я_стовпця тип_даних

    [NULL | NOT NULL ] [,...n])

Видалення таблиці

DROP TABLE імя_таблиці [RESTRICT | CASCADE]

Індекси в стандарті мови

Створення індексів не передбачено стандартом SQL, однак більшість діалектів підтримують як мінімум наступний оператор:

CREATE [ UNIQUE ] INDEX ім’я_індексу

 ON ім’я_таблиці(ім’я_стовпця [ASC|DESC][,...n])

Зазначені в операторі стовпці складають ключ індексу. Індекси можуть створюватися тільки для базових таблиць, але не для представлень (уявлень, подань). Якщо в операторі вказано ключове слово UNIQUE, унікальність значень ключа індексу буде автоматично підтримуватися системою. Вимога унікальності значень обов'язково для первинних ключів, а також можливо і для інших стовпців таблиці (наприклад, для альтернативних ключів). Хоча створення індексу допускається в будь-який момент, при його побудові для вже заповненої даними таблиці можуть виникнути проблеми, пов'язані з дублюванням даних в різних рядках. Отже, унікальні індекси (щонайменш, для первинного ключа) має сенс створювати безпосередньо при формуванні таблиці. В результаті система відразу візьме на себе контроль за унікальністю значень даних у відповідних стовпцях.

Якщо створений індекс згодом виявиться непотрібним, його можна видалити за допомогою оператора

DROP INDEX імя_індекса

Вираз SELECT

Оператор SELECT – один з найбільш важливих і найбільш поширених операторів SQL. Він дозволяє робити вибірки даних з таблиць і перетворювати до потрібного вигляду отримані результати. Будучи дуже потужним, він здатний виконувати дії, еквівалентні операторам реляційної алгебри, причому в межах єдиної виконуваної команди. За його допомогою можна реалізувати складні і громіздкі умови відбору даних з різних таблиць.

Оператор SELECT – засіб, який повністю абстраговано від питань представлення даних, що допомагає сконцентрувати увагу на проблемах доступу до даних. Приклади його використання наочно демонструють один з основоположних принципів великих (промислових) СУБД: засоби зберігання даних і доступу до них відділені від засобів подання даних. Операції над даними виробляються в масштабі наборів даних, а не окремих записів. Оператор SELECT має наступний формат:

SELECT [ALL | DISTINCT ] {*|[ім’я_стовпця

 [AS  нове_ім’я]]} [,...n]

 FROM  ім’я_таблиці [[AS] псевдонім] [,...n]

 [WHERE  <умова_пошуку>]

 [GROUP BY  імя_стовпця  [,...n]]

 [HAVING <критерії вибору груп>]

 [ORDER BY імя_стовпця [,...n]]

Оператор SELECT визначає поля (стовпчики), які будуть входити в результат виконання запиту. У списку вони розділяються комами і наводяться в такій черговості, у якій повинні бути представлені в результаті запиту. Якщо використовується ім'я поля, що містить пробіли або роздільники, його слід укласти в квадратні дужки. Символом * можна вибрати всі поля, а замість імені поля застосувати вираз із декількох імен.

Якщо обробляється ряд таблиць, то (при наявності однойменних полів у різних таблицях) у списку полів використовується повна специфікація поля, тобто ім’я_таблиці.ім’я_поля.

Частина FROM

Частина FROM задає імена таблиць і уявлень, які містять поля, перераховані в операторі  SELECT. Необов'язковий параметр псевдоніма - це скорочення, яке встановлюється для імені таблиці.

Обробка елементів оператора SELECT виконується в наступній послідовності:

  1.  FROM – визначаються імена використовуваних таблиць;
  2.  WHERE – виконується фільтрація рядків об'єкта відповідно до заданих умовами;
  3.  GROUP BY – утворюються групи рядків, які мають одне і те ж значення у вказаному стовпці;
  4.  HAVING – фільтруються групи рядків об'єкта відповідно до зазначеного умовою;
  5.  SELECT – встановлюється, які стовпці повинні бути присутніми у вихідних даних;
  6.  ORDER BY – визначається впорядкованість результатів виконання операторів.

Порядок пропозицій і фраз в операторі SELECT не може бути змінений. Тільки дві пропозиції SELECT та FROM є обов'язковими, всі інші можуть бути опущені. SELECT – закрита операція: результат запиту до таблиці являє собою іншу таблицю. Існує безліч варіантів запису даного оператора, що ілюструється наведеними нижче прикладами.

Приклад 1. Скласти список відомостей про всіх клієнтів.

SELECT * FROM Клієнт

Частина WHERE

За допомогою WHERE-параметра користувач визначає, які блоки даних з наведених у списку FROM таблиць з'являться в результаті запиту. За ключовим словом WHERE слід перелік умов пошуку, що визначають ті рядки, які повинні бути вибрані при виконанні запиту. Існує п'ять основних типів умов пошуку (або предикатів):

  1.  Порівняння: порівнюються результати обчислення одного виразу з результатами обчислення іншого.
  2.  Діапазон: перевіряється, чи потрапляє результат обчислення виразу в заданий діапазон значень.
  3.  Належність множині: перевіряється, чи належить результат обчислень вираження заданому безлічі значень.
  4.  Відповідність шаблону: перевіряється, чи відповідає деякий строкове значення заданим шаблоном.
  5.  Значення NULL: перевіряється, чи містить даний стовпець визначник NULL (невідоме значення).

Приклад 2. Показати всі операції відпуску товарів об'ємом більше 20.

SELECT * FROM Угода

   WHERE Кількість >20

Приклад 3. Вивести список товарів, ціна яких більше або дорівнює 100 і менше або дорівнює 150.

SELECT Назва, Ціна

   FROM Товар

   WHERE Ціна>=100 And Ціна<=150

Відповідність шаблону

За допомогою оператора LIKE можна виконувати порівняння виразу з заданим шаблоном, в якому допускається використання символів-замінників:

  1.  Символ % – замість цього символу може бути підставлено будь-яку кількість довільних символів.
  2.  Символ _ замінює один символ рядка.
  3.  [] – замість символу рядка буде підставлений один з можливих символів, зазначений у цих обмежниках.
  4.  [^] – замість відповідного символу рядка будуть підставлені всі символи, крім зазначених у обмежниках.

Приклад 4. Знайти клієнтів, у яких у номері телефону друга цифра – 4.

SELECT Клієнт.Фамілія, Клієнт.Телефон

   FROM Клієнт

   WHERE Клієнт.Телефон LIKE '_4%'

Значення NULL

Оператор IS NULL використовується для порівняння поточного значення зі значенням NULL, – спеціальним значенням, що вказує на відсутність будь-якого значення. NULL – це не те ж саме, що знак пробілу (пробіл - допустимий символ) або нуль (0 - допустиме число). NULL відрізняється і від рядка нульової довжини (порожнього рядка).

Приклад 5. Знайти співробітників, у яких немає телефону (поле Телефон не містить ніякого значення).

SELECT Фамілія, Телефон

   FROM Клієнт

  WHERE Телефон IS NULL

Частина ORDER BY

 

У загальному випадку рядки в результуючій таблиці SQL-запиту ніяк не впорядковані. Однак їх можна необхідним чином відсортувати, для чого в оператор SELECT , поміщається фраза ORDER BY, яка сортує дані вихідного набору в заданій послідовності. Сортування може виконуватися за кількома полями, в цьому випадку вони перераховуються за ключовим словом ORDER BY через кому. Спосіб сортування задається ключовим словом, вказуються в рамках параметра ORDER BY слідом за назвою поля, по якому виконується сортування. За замовчуванням реалізується сортування за зростанням. Явно вона задається ключовим словом ASC. Для виконання сортування у зворотній послідовності необхідно після імені поля, по якому вона виконується, вказати ключове слово DESC. Фраза ORDER BY дозволяє впорядкувати вибрані записи в порядку зростання або зменшення значень будь-якого стовпця або комбінації стовпців, незалежно від того, чи присутні ці стовпці в таблиці результату чи ні. Фраза ORDER BY завжди повинна бути останнім елементом в операторі SELECT .

Приклад 6. Вивести список клієнтів в алфавітному порядку.

SELECT Клієнт.Фамілія, Клієнт.Фірма

   FROM Клиент

   ORDER BY Клієнт.Фамілія


Приклад нотації для визначення оператора SELECT в Oracle

Нижче наведено тільки перші два рівня деталізації опису семантики запису SELECT оператора в SQL, детальну та повну інформацію можна знайти для Oracle 10g за посиланням:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htm#SQLRF01702

select::=


subquery::=


Або те саме в текстовому вигляді:

Query ::= subquery [ for_update_clause ] ;

subquery ::=  [subquery_factoring_clause ]

SELECT

  [ hint ]

  [ { { DISTINCT | UNIQUE }

    | ALL

    }

  ]

  select_list

  FROM { table_reference [, table_reference ]...

              | join_clause

              | ( join_clause )

              }

  [ where_clause ]

  [ hierarchical_query_clause ]

  [ group_by_clause ]

  [ HAVING condition ]

  [ model_clause ]

  [ { UNION [ ALL ]

    | INTERSECT

    | MINUS

    }

    (subquery)

  ]

  [ order_by_clause ]

Співвідношення реляційної алгебри та структурованої мови запитів

Проекція

  1.  Оператор проекції вибирає з відношення R нове відношення, що містить тільки деякі з стовпці R.
  2.  Отримати відношення, що включає тільки задані атрибути відношення R:

 RA  

SQL  SELECT A1, A2,…, An

              FROM R;

Селекція

  1.  Оператор селекції після застосування до відношення R дає нове відношення з підмножиною кортежів R.
  2.  Кортежі в результуючому відношенні задовольняють деякій умові C, що включає атрибути R:

 RA  

SQL  SELECT *

           FROM R

         WHERE C;

  1.  Частина WHERE SQL синтаксису відповідає

Селекція: синтаксис умови

  1.  Синтаксис: схожий на умовами в мовах програмування.
  2.  Порівнювані значення – констант та атрибути відношень.
  3. Ми можемо застосовувати звичайні арифметичні оператори до числових значень для їх порівняння:

RA Порівняти значення з використанням стандартних арифметичних операторів.

SQL Порівняти значення за допомогою =, <>, <, >, <=, >=.

Операції над множинами: Об'єднання 

  1.  Об'єднанням двох відношень R і S є множина  кортежів, що належать R або S або обом відношенням одночасно.
  2.  R і S повинні мати однакові набори атрибутів і типи атрибутів повинні бути однаковими.
  3.  Атрибути R і S мають з’являтись в однаковому порядку.

RA  

SQL  (SELECT * FROM R)

               UNION

   (SELECT * FROM S);

Операції над множинами: перетин

  1.  Перетином двох відношень R і S є множина кортежів, які присутні одночасно в R і S.
  2.  Ті ж умови на R і S, як і для оператору об'єднання UNION.

RA  

SQL  (SELECT * FROM R)

         INTERSECT

         (SELECT * FROM S);

Операції над множинами: Різниця

  1.  Різницею двох відношень R і S є множина кортежів, які знаходяться в R, але не в S.
  2.  Ті ж умови на R і S, як і для оператору об'єднання UNION.

RA  

SQL  (SELECT * FROM R)

         EXCEPT

         (SELECT * FROM S);

  1.  

  1.  Порівняйте:

(SELECT * FROM R)

EXCEPT

((SELECT * FROM R)

EXCEPT

(SELECT * FROM S));

(SELECT * FROM R);

INTERSECT

(SELECT * FROM S);

Декартів добуток

  1.  Декартів добуток (або крос-добуток) двох відношень R і S є безліч пар, які можуть бути утворені шляхом спарювання кожного кортежу з R з кожним кортежем S.
  2.  Результат – ввідношення зі схемою R та приєднаною до неї схемою S.
  3.  Атрибути перейменовуються для уникнення двозначності або до атрибуту додається префікс – назва відношення до якого воно відноситься:

RA

SQL SELECT * FROM R,S;

Тета-з’єднання 

  1.  Тета-з’єднання двох відношень R і S є безліч пар декартового добутку R та S, що задовольняють деякій умові C.

RA  

SQL  SELECT * FROM R,S WHERE C;

  1.  

Натуральне з’єднання 

  1.  Натуральне з’єднання двох відношень R та S – це множина пар кортежів, одного з R та одного з S, які однакові в атрибутах, що є однаковими для схем R та S.
  2.  Схема результату включає об’єднання атрибутів R та S.
  3.  Нехай схеми будуть такі: R (A,B,C) та S(B,C,D)

RA  

SQL  SELECT R.A, R.B, R.C, S.D

FROM R,S

WHERE R.B = S.B AND R.C = S.C;

або

SQL  SELECT *

FROM R NATURAL JOIN S;

  1.  Висячі кортежі – такі, які є в одному відношенні, але не має в іншому.




1. Контрольная работа по дисциплине Политологии студента 2 курса экономического факультета Специальность
2. 040313 Литовцы всегда пытались сохранить свою культурную особенность
3. реферат дисертації на здобуття наукового ступеня кандидата медичних наук Київ ~
4. НА АЛТАРЬ ПОБЕДЫ
5. ЛЕКЦІЯ 1 МОНІТОРИНГ НЕБЕЗПЕК ЩО МОЖУТЬ СПРИЧИНИТИ НАДЗВИЧАЙНІ СИТУАЦІЇ Питання які розглядають
6. Культурологічний підхід як основа модернізації змісту астрономічної освіти у загальноосвітніх навчальних заклада
7. ЗАДАНИЕ ПО КУРСОВОЙ РАБОТЕ по дисциплине- Бухгалтерский управленческий учет Студент Ф
8. Сочинение- Художник Борисов-Мусатов и группа Наби
9. Кодекс этики аудиторов Росси
10. лекція тварин АВТОРЕФЕРАТ на здобуття наукового ступеня кандидата сільськогосподарських
11. Оренбургская теплогенерирующая компания 2
12. Что Вы сделаете если я в Вас сейчас кину пепельницей или Какого пола Чебурашка
13. ХРОНИКА ВРЕМЕН ЕКАТЕРИНЫ II КНИГА ПЕРВАЯ Валентин ПИКУЛЬ Аннотация В романе запечатлены важнейш
14. Курсовая работа- Политика США в отношении Кубы после распада СССР
15. Не я один этого не понимаю пришла в голову мне гениальная мысль достойная Капитана Очевидности
16. Цели финансового планирования зависят от выработанных критериев принятия финансовых решений- макс
17. а отвечать полню или частно за исполне обязва этого лица
18.  Кинематика материальной точки
19. ТЕМА 1 ИНВЕСТИЦИОННАЯ СТРАТЕГИЯ НА МАКРО И МИКРОУРОВНЯХ 1
20. .В мире насчитывается более 6000 сетевых и около сетевых компанийкомпании прямых продаж и пирамиды