Структурована мова запитів SQL. Вивід програми на екран. Друк програми на мові SQL. Основна операція (основний синтаксичний блок). Приклад використання
« НазадСтруктурована мова запитів (SQL)Якщо після створення запиту виконати команду: Вид/ Режим SQL, то на екран буде виведено невелику програму мовою SQL. Оскільки приклади, які виконують користувачі, є невеликими, то можна спробувати розібратися в цих програмах. Початкова версія мови SQL (Structured English Query Language) базувалася на раніше розробленій мові square. Прототип цієї версії SQL був реалізований у науково-дослідній лабораторії фірми IBM у 1974 році (Chamberlin D., Boyce R. SEQUEL: A Structured English Query Language. Proc. 1974 ACM SIGMOND Workshop on Data Description, Access and Control). Приклади, які ми далі розглянемо, можуть навести на думку, що SQL є просто мовою запитів. Попередимо, що SQL є дещо більше, ніж просто мова запитів. SQL забезпечує повний набір операцій запам’ятовування — Insert (Включить), Delete (Удалить), Update (Обновить), а також інші можливості. Основною операцією у мові SQL є відображення, яке синтаксично є блоком SELECT-FROM-WHERE (вибрати-з-де). Наприклад, запит «Одержати номери та статуси постачальників, які перебувають у Парижі», можна виразити таким чином: SELECT S#, STATUS FROM S WHERE CITY=«PARIS» Тут спочатку ми створюємо горизонтальну підмножину з рядками, у яких CITY = «PARIS», а потім з одержаного результату створюємо вертикальну підмножину (вибираємо атрибути S# і STATUS). Далі можна за допомогою операції присвоювання визначити ім’я таблиці та імена стовпчиків, що утворилися в результаті виконання запиту. Наприклад: REZULT (SNO, CODE) SELECT S#, STATUS FROM S WHERE CITY=«PARIS» У мові SQL надається перевага термінам «таблиця», «стовпчик», «рядок» над термінами «відношення», «атрибут», «кортеж». Проста вибірка. 1) Одержати всі номери деталей, що постачаються: SELECT UNIQUE P# FROM SP Оператор UNIQUE дає змогу зробити вибірку без дублікатів. 2) Одержати повну інформацію про всіх постачальників: SELECT * FROM S Будуть виведені всі стовпчики таблиці S. Вибірка за умовою. Одержати номери постачальників, що перебувають у Парижі і мають статус >20: SELECT S# FROM S WHERE CITY=«PARIS» AND STATUS >20 Предикат, який іде за WHERE, може включати оператори порівняння =, >, >=, <, <=, <>, бульові оператори AND, OR та NOT, а також дужки для зазначування потрібного порядку обчислення. Вибірка з упорядкуванням. Одержати номери та статуси постачальників, які перебувають у Парижі, у порядку зменшення їх статусів: SELECT S#, STATUS FROM S WHERE CITY=«PARIS» ORDER BY STATUS DESC Оператор DESC означає сортування за зменшенням, а ASC — сортування за зростанням. Вибірка з використанням вкладеного відображення. 1) Одержати імена постачальників, які постачають деталь Р2: SELECT SNAME FROM S WHERE S# IS IN (SELECT S# FROM SP WHERE P#=«P2») Тут оператор IS IN (можна просто IN) означає належність елемента множині. Оператор IS NOT IN (або просто NOT IN) інтерпретується як «не належить множині». 2) Одержати номери постачальників, які постачають хоча б одну червону (RED) деталь: SELECT UNIQUE S# FROM SP WHERE P# IN SELECT P# FROM P WHERE COLOR=«RED» Якщо неоднозначність результату виключена, то дужки у внутрішньому блоці можуть бути опущені. Вибірка з використанням кількох рівнів вкладеності. Одержати імена постачальників, які постачають хоча б одну червону (RED) деталь: SELECT SNAME FROM S WHERE S# IN SELECT S# FROM SP WHERE P# IN SELECT P# FROM P WHERE COLOR=«RED» Вибірка з використанням вкладеного відображення і міжблокового посилання. Одержати імена постачальників, які не постачають деталь Р1: SELECT SNAME FROM S WHERE «P1» NOT IN SELECT P# FROM SP WHERE S#=S.S#. Для посилання на S# з зовнішнього блоку у внутрішній потрібно використати очевидне уточнення (S). Вибірка з використанням вкладеного відображення і з однією і тією самою таблицею в обох блоках. Одержати номери тих постачальників, які постачають хоча б одну деталь, що поставляється постачальником S2: SELECT UNIQUE S# FROM SP WHERE P# IN SELECT P# FROM P WHERE S#=«S2». Вибірка з використанням синоніма. Одержати номери всіх деталей, що постачаються кількома постачальниками: SELECT UNIQUE P# FROM SP SPX WHERE P# IN SELECT P# FROM SP WHERE S#<>SPX.S. SPX є довільною позначкою, що використовується для зв’язку між SPX.S# у внутрішньому блоці і таблицею зовнішнього блоку. Виконання запиту можна пояснити так: «по черзі для кожного рядка, наприклад, SPX таблиці SP знайти значення P#, якщо це значення належить множині значень P#, для яких відповідне значення S# не дорівнює значенню S# у рядку SPX, тобто, якщо деталь постачається постачальником, відмінним від постачальника, ідентифікованим рядком SPX». Вибірка більше ніж з однієї таблиці. Для кожної деталі, яка постачається, одержати номер деталі (P#) та назви всіх міст (CITY), з яких ця деталь постачається. SELEKT UNIQUE P#, CITY FROM SP, S WHERE SP.S#=S.S#. Вибірка, що включає порівняння множин. 1) Одержати імена постачальників (SNAME), які постачають усі деталі. SELECT SNAME FROM S WHERE (SELECT P# FROM SP WHERE S#=S.S#) = (SELECT P# FROM P). Нам потрібні імена таких постачальників, щоб множина деталей, які вони постачають (результат першого внутрішнього відображення), була еквівалентна множині всіх деталей (результат другого внутрішнього відображення). У даному випадку оператор «=» є оператором еквівалентності множин. 2) Одержати номери тих постачальників, які постачають щонайменше всі деталі, що й постачальник S2. SELECT UNIQUE S# FROM SP SPX WHERE (SELECT P# FROM SP WHERE S#=SPX.S#) CONTAINS (SELECT P# FROM SP WHERE S#=«S2»). Оператор CONTAINS означає «містить», «має». Вибірка, що включає GROUP BY, HAVING i SET. Одержати номери тих постачальників, які постачають щонайменше всі деталі, що й постачальник S2. SELECT S# FROM SP GROUP BY S# HAVING SET (P#) CONTAINS (SELECT P# FROM SP WHERE S#=«S2»). Оператор GROUP BY ділить поточну таблицю на такі групи, в яких усередині будь-якої з цих груп усі рядки мають однакові значення в зазначеному стовпці (стовпчиках). Потім діє вираз HAVING, який є спеціальною формою виразу WHERE, але стосується не окремих рядків, а груп: предикат у виразі HAVING завжди посилається на властивості груп, а не рядків, і на основі цього предиката групи або відбираються, або відкидаються. Отже, спочатку таблиця поділяється на такі групи, що кожна містить певне значення S#. Потім по черзі для кожної групи множина всіх значень P# у групі порівнюється з множиною всіх значень P#, яка відповідає постачальнику S2. Коли перше з цих двох множин містить друге як підмножину (включаючи випадок рівності), дістаємо відповідне значення S#. Тепер, як бачимо, потреба в позначці SPX відпала і ключове слово UNIQUE більше не потрібне. |