Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структурована мова запитів SQL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
663.04 Кб
Скачать

Використання умов пошуку для відбору рядків

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

WHERE - пропозиція команди SELECT, що дозволяє встановлювати предикати, умову яких може бути або вірним або невірним для будь-якого запису таблиці. Команда витягає тільки ті записи з таблиці, для якої таке твердження істинно. Припустимо, що необхідно вибрати прізвища й розміри стипендії студентів, при цьому цікавлять тільки такі, які одержують стипендію в розмірі 25.50. Такий запит буде мати вигляд:

SELECT SFAM, STIP

FROM STUDENTS

WHERE STIP=25.50;

Виведення для цього запиту буде наступний:

SFAM STIP

---------------------

Поляков 25.50

Нагорний 25.50

Коли команда WHERE має місце, СКБД переглядає всю таблицю по одному запису, щоб визначити, чи є предикат дійсним. Отже, для запису про студента Полякова система розгляне поточне значення поля STIP, визначить, що воно дорівнює 25.50, і включить цей рядок у висновок, а запис для студента Старова не буде включена, і т.д.

Команда WHERE сумісна із уже розглянутими командами, використовуваними в SELECT, тобто можна використати найменування полів, усувати дублікати, або з поля. Однак допускається змінювати порядок стовпців для імен тільки в команді SELECT, але не в команді WHERE.

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

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

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

= рівний чому-небудь;

> більше чим;

< менше ніж;

>= більше чим або дорівнює;

<= менше ніж або дорівнює;

<> не дорівнює.

Ці оператори мають стандартні значення для числових даних, а для символьних їхнє визначення залежить від кодів ASCII символів - вони розміщені за абеткою, причому заголовні літери мають менший код, чим рядкові, тому, наприклад, "Z" < "а".

Припустимо, що необхідно вивести список студентів, що одержують стипендію, тобто для яких STIP>0. Для цього скористаємося наступним запитом:

SELECT *

FROM STUDENTS

WHERE STIP > 0;

Результат запиту буде наступний:

SNUM SFAM SIMA SOTCH STIP

-----------------------------------------------------------------------------

  1. Поляков Анатолій Олексійович 25.50

  2. Огарьова Любов Михайлівна 17.00 3416 Нагорний Євген Васильович 25.50

Стандартними булевими операторами, які використаються в SQL, є AND, OR і NOT. Нагадаємо, як вони працюють:

■ AND використовує два операнда у формі A AND В й оцінює їх стосовно істини: чи вірні вони обоє;

  • OR використовує два операнда у формі A OR В и оцінює на істинність: чи вірний один з них;

■ NOT використовує один операнд у формі NOT А и заміняє його значення з ІСТИНА на НЕПРАВДУ, або навпаки.

Зв'язуючи предикати з булевими операторами, можна значно збільшити можливості вибірки даних. Наприклад, по таблиці з даними про успішність можна одержати інформацію про всіх студентів, що здали предмет з кодом 2003:

SELECT *

FROM USP

WHERE OCENKA >=3 AND PNUM = 2003;

У результаті буде отримане наступне:

UNUM OCENKA UDATE SNUM PNUM

----------------------------------------------------------------------------

1002 4 10/06/1999 3413 2003

1004 4 12/06/1999 3412 2003

Якщо в аналогічному запиті використати OR, то буде отримана інформація про всіх студентів, що має оцінки 3 і вище, або що здавали (незалежно від оцінки) навчальний предмет з кодом 2003:

SELECT *

FROM USP

WHERE OCENKA >=3 OR PNUM = 2003;

Виведення для цього запиту представлений нижче:

UNUM OCENKA UDATE SNUM PNUM

----------------------------------------------------------------------------

1001 5 10/06/1999 3412 2001

1002 4 10/06/1999 3413 2003

1003 3 11/06/1999 3414 2005

1004 4 12/06/1999 3412 2003

Умова NOT може використатися для інвертування логічних значень. Наприклад, для висновку інформації про студентів, у яких оцінки не є 3, можна скористатися наступним запитом:

SELECT *

FROM USP

WHERE NOT (OCENKA. = 3) ;

Виведення цього запиту наступне:

UNUM OCENKA UDATE SNUM PNUM

----------------------------------------------------------------------------

1001 5 10/06/1999 3412 2001

1002 4 10/06/1999 3413 2003

1003 4 12/06/1999 3412 2003

1005 5 12/06/1999 3416 2004

Варто мати на увазі, що булевий оператор міститься перед реляційним оператором, на який він діє, а при необхідності розширення дії використаються дужки. Наприклад, для отримання інформації про студентів, у яких оцінки не є 3 й у той же час по навчальному предметі з кодом, не рівним 2005, можна скористатися таким запитом:

SELECT *

FROM USP

WHERE NOT(OCENKA = 3 AND PNUM = 2005) ;

Виведення цього запиту буде таким:

UNUM OCENKA UDATE SNUM PNUM

----------------------------------------------------------------------------

1001 5 10/06/1999 3412 2001

1002 4 10/06/1999 3413 2003

1004 4 12/06/1999 3412 2003

1005 5 12/06/1999 3416 2004

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

У процедурі SELECT на додаток до традиційних реляційних і булевих операторів, розглянутих вище, міг бути використаний спеціальні оператори IN, BETWEEN LIKE, і IS NULL.

Оператор IN визначає набір значень, у який дане значення повинне бути включене. Наприклад, якщо відповідно до навчального БД виникає необхідність у відображенні інформації про всіх студентів, ім'я яких Анатолій або Володимир, потрібно використати наступний запит:

SELECT *

FROM STUDENTS

WHERE SIMA = 'Анатолій' OR SIMA = 'Володимир';

Результату цього запиту показаний нижче:

SNUM SFAM SIMA SOTCH STIP

----------------------------------------------------------------------------------------------

3412 Поляков Анатолій Олексійович 25.50

  1. Гриценко Володимир Миколайович 0.00

  2. Котенко Анатолій Миколайович 0.00

Однак є й більше простий спосіб одержати ту ж інформацію за допомогою запиту:

SELECT *

FROM STUDENTS

WHERE SIMA IN ('Анатолій', 'Володимир');

Звідси ясно, що IN визначає набір значень за допомогою списку, розміщеного в круглих дужках з роздільниками у вигляді ком. Він перевіряє різні значення зазначеного поля, намагаючись знайти збіг зі значеннями з набору. Якщо це трапляється, то предикат вірний. Якщо набір містить числові значення, а не символьні, то одиночні лапки опускаються. Прикладом такого запиту може служити пошук всіх студентів, що мають стипендію 17.00 й 25.50:

SELECT *

FROM STUDENTS

WHERE STIP IN (17.00, 25.50);

Виведення для цього запиту наступне:

SNUM SFAM SIMA SOTCH STIP

-------------------------------------------------------------------------------------------------------

3412 Поляков Анатолій Олексійович 25.50

3413 Огарьова Любов Михайлівна 17.00 3416 Нагорний Євген Васильович 25.50

Оператор BETWEEN трохи схожий на IN, але, на відміну від визначення з набору, BETWEEN визначає діапазон значень, у який повинні вміщатися шукані значення, що й робить предикат вірним. Структура оператора BETWEEN наступна: уводиться початкове значення, ключове слово AND і кінцеве значення. На відміну від IN, BETWEEN розрізняє порядок значень, і, отже, перше з них у команді повинне бути першим по алфавітному або числовому порядку.

Наступний приклад буде витягати з таблиці успішності номера й оцінки всіх студентів, оцінки яких між 3 й 5:

SELECT SNUM, OCENKA

FROM USP

WHERE OCENKA BETWEEN 3 AND 5;

Результат запиту наступний:

SNUM OCENKA

-------------------------------

  1. 5

  2. 4

  3. 3

  1. 4

3416 5

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

SELECT SNUM, OCENKA

FROM USP WHERE (OCENKA BETWEEN 3 AND 5)

AND NOT OCENKA IN (3, 5);

Результат запиту буде наступний:

SNUM OCENKA

--------------------------------

3413 4

3412 4

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

SELECT SFAM, SIMA, SOTCH

FROM STUDENTS

WHERE SFAM BETWEEN 'K' AND 'C';

Результати цього запиту показані нижче:

SFAM SIMA SOTCH

---------------------------------------------------------------

Поляков Анатолій Олексійович

Котенко Анатолій Миколайович

Нагорний Євген Васильович

Відмітимо, що Старова в результатах відсутні - це відбувається через те, що BETWEEN порівнює рядки нерівної довжини, а рядок 'С' більше коротка, чим рядок Старова, тобто BETWEEN виводить 'С' із пробілами, які передують символам за абеткою. Це дуже важливо пам'ятати при використанні BETWEEN для відбору значень із алфавітних діапазонів.

Оператор LIKE застосуємо тільки до полів типу CHAR або VARCHAR, у яких він шукає подрядки, тобто він шукає символи й перевіряє, чи збігаються вони з умовою. Як умову оператор використає групові символи - спеціальні символи, які відповідають чому-небудь. Існує два типи групових символів, використовуваних з LIKE:

  • символ підкреслення заміщає будь-який одиночний символ, наприклад, 'С_Н' буде відповідати словам 'СОН' або 'СИН', але не буде відповідати 'СТЕПАН';

  • знак відсотка заміщає послідовність будь-якого числа символів, у тому числі нульової довжини. Наприклад, '%С%Н' буде відповідати словам 'СОН' або 'ЕСЕНІН', але не відповідає 'ПЕРСОНА'.

Як приклад знайдемо всіх викладачів, чиї прізвища починаються з літери К.

SELECT TFAM, TIMA, ТОТСН

FROM TEACHERS

WHERE TFAM LIKE 'K%';

Результат запиту буде наступний:

TFAM TIMA ТОТСН

--------------------------------------------------------

Костыркин Олег Володимирович

Казанко Віталій Володимирович

Оператор LIKE може бути корисний, наприклад, при пошуку значення, якщо точне його написання невідомо. Наприклад, якщо неясно, як пишеться прізвище викладача Казанко, Казанків або Козанко, те можна використати відому частину й групові символи для знаходження всіх можливих значень:

SELECT TFAM,.TIMA, ТОТСН

FROM TEACHERS

WHERE TFAM LIKE 'К_занко%';

Результат запиту наведений нижче:

TFAM TIMA ТОТСН

--------------------------------------------------------

Казанко Віталій Володимирович

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

Нарешті, виникає закономірне питання, пов'язаний з необхідністю пошуків знака відсотка або підкреслення в рядку. В LIKE предикаті можна визначити будь-який одиночний символ, як символ ESC. Символ ESC використається відразу перед відсотком або підкресленням у предикаті й означає, що відсоток або підкреслення буде інтерпретуватися як звичайний, а не як груповий символ. Наприклад, що наступний запит дозволяє знайти знак підкреслення в даних про прізвище викладача:

SELECT TFAM, TIMA, ТОТСН

FROM. TEACHERS

WHERE TFAM LIKE '%/_%'ESCAPE'/f;

Оскільки в даних про прізвище знака підкреслення немає, те результат висновку не буде містити даних. У цьому прикладі рядок порівнюється зі змістом будь-якої послідовності символів (перший знак %), що супроводжуються символом підкреслення (/_ ), і будь-якою послідовністю символів наприкінці рядка (другий знак %).

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

Наприклад, у таблицю успішності можна ввести інформацію про студента, навчальний предмет і відому дату іспиту, однак, оскільки оцінка ще не виставлена, у полі OCENKA буде перебувати значення NULL доти, поки оцінка не стане відома.

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

Зрозуміло, що досить часто необхідно розрізняти невірне й невідоме значення, для чого в SQL використовують спеціальний оператор IS із ключовим словом NULL.

Знайдемо, наприклад, всі записи в таблиці з інформацією про успішність зі значеннями NULL у поле OCENKA:

SELECT *

FROM USP

WHERE OCENKA IS NULL;

Даних як результат цього запиту не буде, тому що в таблиці відсутні значення NULL у полі OCENKA.

Разом з розглянутими операторами, можуть бути використані й традиційні функції логічного відношення AND, OR й NOT.

Зокрема, для одержання предикатів, зміст яких протилежний розглянутим реляційним операторам, використовують заперечення NOT. Наприклад, якщо необхідно усунути NULL з виведення інформації про успішність, можна скористатися запитом, що містить NOT у предикаті:

SELECT *

FROM USP

WHERE OCENKA NOT NULL;

У результаті буде отримане наступне:

UNUM OCENKA UDATE SNUM PNUM

---------------------------------------------------------------------------

1001 5 10/06/1999 3412 2001

1002 4 10/06/1999 3413 2003

1003 3 11/06/1999 3414 2005

1004 4 12/06/1999 3412 2003

1005 5 12/06/1999 3416 2004

Тобто при відсутності значень NULL буде виведена вся таблиця успішності. До речі кажучи, розглянутий запит аналогічний наступному, що дає такий же результат:

SELECT *

FROM USP

WHERE NOT OCENKA IS NULL;

Допускається використання NOT з IN, наприклад, для висновку даних про успішність студентів, номер квитка яких не 3412 й 3413, причому запропонуємо це зробити двома способами:

SELECT *

FROM USP

WHERE SNUM NOT IN (3412, 3413);

або

SELECT *

FROM USP

WHERE NOT SNUM IN (3412, 3413);

що в обох випадках видасть наступну таблицю:

UNUM OCENKA UDATE SNUM PNUM

---------------------------------------------------------------------------------------

1003 3 11/06/1999 3414 2005

1005 5 12/06/1999 3416 2004

Аналогічним способом можна вживати NOT BETWEEN й NOT LIKE , тобто можна використати весь набір стандартних математичних і спеціальних операторів.