Лекція №10

Мова структурованих запитів SQL. Пошук та вибірка даних

1.   Мова структурованих запитів SQL

На початку 1970-х праці дослідника з IBM Едгара Кодда дали поштовх для створення продукту, пов’язаного з реляційною моделлю даних, під назвою SEQUEL (Structured English Query Language, структурована англійська мова для запитів), яка з часом перетворилася в SQL (Structured Query Language). І тому, згідно історичних причин, абревіатуру SQL іноді читали як «сіквел», але правильною назвою є все таки «ескюель». Як випливає з назви, SQL є інформаційно-логічною мовою, що використовується для організації взаємодії

користувача з базою даних. Однак SQL працює лише з реляційними базами даних.

Спочатку ця мова була реалізована в реляційній СКБД DB2 виробництва IBM. На відміну від мов третього покоління (COBOL, С), які з'явилися в той самий час, мова SQL не є  процедурною. Непроцедурна мова ‒ це мова, в якій описується, що потрібно одержати, а не як це зробити.

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

Хоча IBM і була розробником теорії реляційних БД, однак на ринок з технологією першою вийшла компанія Oracle. Оскільки діалекти SQL почали швидко розмножуватися, то у 1986 р. Американський національний інститут стандартів ANSI видав перший стандарт SQL для узгодження роботи виробників, а у 1989 р. – другий стандарт, який був також підтверджений Міжнародною організацією по стандартизації ISO. У 1992 р. ANSI випустила обновлення стандарту, відомого як SQL92 чи SQL2. У 1999 р. вийшло чергове

обновлення SQL99 чи SQL3. На сьогодні існує стандарт SQL2003, з незначними модифікаціями внесеними пізніше (у 2006 та 2008 роках).

Однак, не зважаючи на існуючі стандарти, все одно існують діалекти для мови SQL. Існування діалектів пов’язане в першу чергу з необхідністю додаткових інструментів, які не передбачені у стандартах, наприклад, засоби умовної обробки (оператор IF … THEN), керуючі оператори (наприклад, цикли WHILE), змінні, оброблення помилок.

SQL надає такі можливості:

- створювати й видаляти таблиці бази даних, а також змінювати заголовки таблиць;

- вставляти, змінювати й видаляти рядки в таблицях;

- виконувати пошук даних у багатьох таблицях та впорядковувати результати цього пошуку;

- описувати процедури підтримки цілісності;

- визначати та змінювати інформацію про захист даних.

 

Деякі популярні діалекти SQL:

PL/SQL (Procedural Language/SQL) – використовується в Oracle;

T-SQL (Transact-SQL) – використовується в Microsoft SQL Server та Sybase Adaptive Server;

PSQL (Procedural SQL) – використовується в InterBase та Firebird;

SQL PL (SQL Procedural Language) – використовується в IBM DB2;

SQL/PSM (SQL/Persistent Stored Module) – використовується в MySQL;

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) –

використовується в PostgreSQL (читається як «Пост-Грес-Кью-ел» або «Постгрес») та є подібний до Oracle PL/SQL.

Рисунок 8.1 ‒ Використання SQL для роботи з базою даних

Мова SQL поділяється на три частини:

1.   Оператори визначення даних – DDL (Data Definition Language). Призначені для опису структури баз даних. Такі як: CREATE (створити), ALTER (змінити), DROP (видалити).

2.   Оператори маніпулювання даними – DML (Data Manipulation Language). Призначені для отримання, вставки, видалення чи зміни даних у БД. Такі як: SELECT (вибрати), INSERT (вставити), UPDATE (обновити), DELETE (видалити).

3.   Оператори визначення доступу до даних – DCL (Data Control Language). Такі як: GRANT (надати доступ), DENY (заборонити доступ), REVOKE (анулювати видані раніше дозволи чи заборони).

 

Надалі синтаксис SQL будемо розглядати з огляду на діалект Transact-SQL для Microsoft SQL Server.

2. Оператор для вибірки даних SELECT

SELECT  [ DISTINCT ]

     < * | перелік стовпців | формули | статистичні функції >

FROM < перелік таблиць [ псевдоніми ] >

[ WHERE < умова відбору даних > ]   

[ GROUP BY < ім’я стовпця(ів) >

     [ HAVING < умова відбору для групи > ]  ]

    [ ORDER BY < перелік стовпців | порядкові № стовпців > ] [ ;]

Рис.1. Робоча таблиця Model

 

3. Вибірка даних

3.1. Вибір усіх стовпців з даними

 

SELECT * FROM Model

 

Відобразиться уся базова таблиця, як на рис. 1.

При вказанні групового символу * повертаються усі стовпці з даними.

3.2. Вибір декількох стовпців

 

SELECT Year, Price FROM Model

 

При  виборі  лише  декількох  стовпців  вони будуть  виведені  у  тому порядку,  в  якому  були вказані уSQL-запиті.

 

 

3.3. Використання псевдонімів для назв стовпців

SELECT Year AS Y, Price AS P FROM Model

або

SELECT Year Y, Price P FROM Model

 

Ключове слово AS є необов’язковим. Використання псевдоніма дає нову назву стовпцю при виведенню.

 

3.4. Фільтрація дублікатів стрічок

 

SELECT DISTINCT Name, Price FROM Model

 

Ключове  слово  DISTINCT забезпечує  унікальний вивід стрічок (без їхніх дублікатів) для вибраних стовпців з даними.

 

4. Сортування вибраних даних.

4.1. Сортування даних відносно певного стовпця.

 

SELECT Name, Price FROM Model

ORDER BY Price

 

 

4.2. Сортування за декількома стовпцями

SELECT Name, Price FROM Model

ORDER BY Price, Name

 

Спершу сортування виконується за першим вказаним у переліку сортування стовпцем, а при співпадінні значень – вже за другим, і т.д.

 

4.3. Сортування за номером стовпця

 

SELECT Name, Price FROM Model

ORDER BY 2, 1

 

Результат буде аналогічним попередньому.

Тут цифри вказують на відносне положення у переліку стовпців після слова SELECT.

Недолік: цей спосіб неможливо використати при сортуванні за стовпцями, що не вказані у переліку SELECT.

 

SELECT Name, Price FROM Model

ORDER BY Year

 

4.4. Задання напряму сортування

 

SELECT Name, Price FROM Model

ORDER BY Name DESC, Price

 

За замовчуванням порядок сортування задається  за  зростанням  даних. При  необхідності можна вказати порядок за спаданням за допомогою ключового слова DESC після назви чи номера стовпця.  Порядок  сортування  за  зростанням можна вказати явно за допомогою ключового слова ASC. ASC та DESC є  скороченнями  для  ключових  слів,  відповідно,  ASCENDING  та DESCENDING.

 

5. Фільтрація даних

5.1. Операції порівняння

 

SELECT Name FROM Model

WHERE Price >= 65

 

Для порівняння використовують такі стандартні операції:

= (рівно); <>, != (не рівно); < (менше ніж); <= (менше або рівно); !< (не менше ніж); > (більше ніж); >= (більше або рівно); !> (не більше ніж);  BETWEEN (між  двома  вказаними  значеннями);  IS NULL (значення рівне null).

        Однакові операції: <> та !=; !< та >=; !> та <=.

Однак не всі ці операції підтримуються усіма СКБД.

SELECT Name FROM Model

WHERE Price BETWEEN 30 AND 65

 

Для  логічного  оператора  BETWEEN необхідно вказувати  два  значення –  менше  та  більше  із вибраного діапазону, та які розділені ключовим словом AND. Оператор BETWEEN еквівалентний такому поєднанню логічних операцій:

 

Price >= 30 AND Price <= 65

SELECT Name FROM Model

WHERE Price IS NULL

 

Операція IS NULL здійснює вибірку стрічок із пустими, тобто null-значенями для вказаного стовпця. Протилежна до неї операція – IS NOT NULL.

 

5.2. Комбіновані умови: логічні оператори AND та OR

 

SELECT Name, Price FROM Model

WHERE Name = 'Z' OR Name = 'B' AND Price < 50

Пріоритет оператора AND є вищим за пріоритет  оператора  OR;  для  задання  необхідного порядку  виконання  логічних  виразів  слід  використовувати дужки (…).

SELECT Name, Price FROM Model

WHERE (Name = 'Z' OR Name = 'B') AND Price < 50

 

5.3. Логічний оператор IN

 

SELECT Name FROM Model

WHERE Name IN ('A', 'C', 'D')

 

Оператор  IN  використовується  для  задання переліку допустимих значень, які вказуються у дужках через кому. Оператор IN еквівалентний логічній сумі OR усіх операцій рівності для  допустимих значень:

 

SELECT Name FROM Model

WHERE Name = 'A' OR Name = 'C' OR Name = 'D'

 

5.4. Логічний оператор NOT  

 

SELECT Name FROM Model

WHERE NOT (Name = 'B' OR Name = 'Z')

 

Логічний  оператор  NOT використовується  для  заперечення логічного виразу, що розташований за ним. NOT має вищий пріоритет за оператори AND та OR.

Зауваження: логічний оператор NOT не підтримується MySQL.

 

5.5. Логічний оператор LIKE

 

SELECT Email FROM Model

WHERE Email LIKE '%@ukr.net'

 

Оператор LIKE дає можливість здійснювати пошук за заданим шаблоном, що містить комбінацію тексту та метасимволів (символів-шаблонів).

Метасимволи:

% – замінює довільну послідовність з нуль або більше символів.

_ (підкреслення) – замінює довільний одиничний символ.

[  перелік  символів  ] – замінює  довільний  одиничний  символ,  що вказаний у діапазоні, наприклад: [bcz] чи [b-z].

[^ перелік символів ] – замінює довільний одиничний символ, що не входить у вказаний діапазон чи набір, наприклад: [^bk-p].

Зауваження 1: метасимвол [ ] підтримується не усіма СКБД.

Зауваження 2: залежність від регістру літер при пошуку залежить від СКБД та її конфігурації.

 

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

 

1. Дайте характеристику мови структурованих запитів SQL.

2. Мова структурованих запитів SQLісторична довідка та діалекти.

3. Охарактеризуйте оператори вибірки даних в мові SQL.

4. Охарактеризуйте оператори сортування вибраних даних в мові SQL.

5. Охарактеризуйте оператори фільтрації даних в мові SQL.