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

11. Відбір даних із таблиць засобами sql

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

SELECT [DISTINCT] {*| <Список полів>}

FROM <Список таблиць>

[WHERE <Умови відбору>]

[ORDER BY <Список полів для сортування>]

[GROUP BY <список полів для групування>]

[HAVING <умови групування>]

[UNION <вкладенний оператор SELECT>]

Тут SELECT – ключове слово, яке повідомляє СУБД, що ця команда – запит. Всі запити починаються цим словом з наступним пробілом.

В результатному наборі даних можуть дозволятися або не дозволятися записи, які повторюються (тобто мають одинакові значення всіх полів). Цим режимом керує оператор DISTINCT. Якщо він відсутній, то в наборі даних дозволяються записи, які повторюються.

В оператор SELECT обов’язково включається: список полів і операнд FROM, інші операнди можуть бути відсутні. Ключове слово FROM з наступним пробілом й іменами таблиць вказує на джерело інформації для запиту. В списку таблиць повинна бути як мінімум одна таблиця.

Якщо в набір даних потрібно включити всі поля таблиці, то замість перерахованих імен полів вказують символ “*”. Якщо список містить поля декількох таблиць, то для вказання належності поля до таблиці використовують складене ім’я, яке включає ім’я таблиці та ім’я поля, розділені крапкою:

<ім’я таблиці>.<ім’я поля>.

Операнд WHERE задає умови (критерії) відбору, які повинні задовольняти записи в результатному наборі даних. Вираз, який описує умову відбору, є логічним. Його елементами можуть бути імена полів, операції порівняння, арифметичні і логічні операції, спеціальні функції LIKE, NULL, IN.

Операнд GROUP BY дозволяє виділяти групи записів в результатному наборі даних. Групою є записи з однаковими значеннями в полях, перерахованим за операндом GROUP BY.

Операнд HAVING діє сумісно з оператором GROUP BY і використовується для відбору записів всередині групи.

Операнд ORDER BY містить список полів, які визначають порядок сортування записів результатного набору даних. По замовчуванню сортування відбувається в порядку зростання значень. Якщо необхідно посортувати по спаданню, то після імені цього поля вказується описувач DESK.

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

Тут у синтаксичних конструкціях використовуються наступні позначення:

  • зірочка (*) для позначення "усі" - використовується у звичайному для програмування змісті, тобто "усі випадки, що задовольняють умову";

  • квадратні дужки ([]) - означають, що конструкції, укладені в ці дужки, є необов'язковими (тобто можуть бути опущені);

  • фігурні дужки ({}) - означають, що конструкції, укладені в ці дужки, повинні розглядатися як цілі синтаксичні одиниці, тобто вони дозволяють уточнити порядок розбору синтаксичних конструкцій, заміняючи звичайні дужки, які використовуються в синтаксисі SQL;

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

  • пряма риска (|) - означає наявність вибору з двох чи більше можливостей. Наприклад, позначення ASC|DESC указує: можна вибрати один з термінів ASC чи DESC; коли ж один з елементів вибору укладений у квадратні дужки, то це означає, що він вибирається за замовчуванням (так, [ASC]|DESC означає, що відсутність усієї цієї конструкції буде сприйматися як вибір ASC);

  • крапка з комою (;) - завершальний елемент операторів SQL;

  • кома (,) - використовується для відокремлення елементів списків;

  • пробіли ( ) - можуть вводитися для підвищення наочності між будь-якими синтаксичними конструкціями операторів SQL;

  • прописні жирні латинські букви і символи - використовуються для написання конструкцій мови SQL і повинні (якщо це спеціально не обговорено) записуватися точно так, як показано;

  • малі літери - використовуються для написання конструкцій, що повинні замінятися конкретними значеннями, обраними користувачем, причому для визначеності окремі слова цих конструкцій зв'язуються між собою символом підкреслення (_);

  • терміни таблиця, стовпець, ... - заміняють (з метою скорочення тексту синтаксичних конструкцій) терміни ім'я_таблиці, ім'я_стовпця, ..., відповідно;

  • термін таблиця - використовується для узагальнення таких видів таблиць, як базова_таблиця, вигляд чи псевдонім; тут псевдонім служить для тимчасового (на момент виконання запиту) перейменування і (чи) створення робочої копії базової_таблиці (вигляду).

Управління полями

Управління полями полягає у виборі полів таблиці (таблиць), які повинні ввійти в результатний набір даних. Приклад відбору всіх полів у таблиці:

select * from stat

В результаті цього запиту із таблиці stat в набір даних попадають всі поля і всі записи. При цьому порядок полів у наборі даних відповідає порядку фізичних полів у таблиці.

Приклад перегляду декількох таблиць одночасно:

select *

from stat

select *

from obsag

В результаті цього запиту із таблиць stat і obsag виводяться всі поля і всі записи таблиць.

Якщо необхідно вибрати дані лише з декількох полів таблиці, то після слова SELECT через кому перелічуються у потрібному порядку назви цих полів. Порядок полів у наборі відповідатиме порядку полів у списку. Якщо ім’я поля вказано у списку неодноразово, то в наборі даних буде декілька стовпців з однаковими іменами і даними. Наприклад:

select cod, osvita

from stat

В результаті виконання цього SQL-запиту здійснюється відбір із таблиці записів тільки двох полів: cod, osvita.

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

select cod, summa, summa - 20

from obsag

У полі summa – 20 виведеться значення поля summa, зменшене на 20.

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

SELECТ DISTINCT <ім’я поля>, <ім’я поля >

FROM <ім’я таблиці>

Наприклад, вивести із таблиці obsag коди рекламних агентів, які виконали операції:

Select distinct cod

from obsag

Проста умова відбору записів

В попередніх прикладах в набір даних попадали всі записи із вказаних таблиць. На практиці набір даних обмежується записами, які задовольняють певним умовам (критеріям) відбору, які задаються з допомогою операнда WHERE.

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

= – дорівнює;

> – більше;

< – менше;

>= – більше-рівне;

<= – менше-рівне;

<> або != – не рівне;

!> – не більше;

!< – не менше;

LIKE – порівняння по шаблону;

IS NULL – перевірка на нульове значення;

IN – перевірка на входження;

BETWEEN – перевірка на входження в діапазон.

Для операцій порівняння і порівняння по шаблону критерій відбору має наступний вигляд:

<Вираз1> <Операція порівняння> <Вираз2>

Використання операторів порівняння

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

select cod

from obsag

where summa>= 1500

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

select prizv

from stat

where osvita = ‘вища’

У цьому прикладі в операції порівняння враховується регістр символів. Тому слова „Вища” і „вища” не рівні між собою. Різниця в регістрі символів або наявність початкових і кінцевих пробілів прозводить до помилок при відборі записів. У даному випадку критерій відбору доцільно записати так:

where upper(trim(osvita)) = ‘вища’

Функція TRIM знищує початкові і кінцеві пробіли, а функція UPPER приводить символи рядка до верхнього регістру. В результаті освіта „Вища” буде приведена до значення „ВИЩА”.

Використання LIKE

Для порівняння рядків замість операцій =, !=, <> можна використовувати операцію LIKE, яка виконує порівняння за частковим співпадінням. Часткове співпадіння значень доцільно перевіряти, наприклад, коли відома тільки початкова частина прізвища:

select prizv

from stat

where prizv like ‘Ac%’

Тут ми отримаємо список прізвищ, які починаються на “Ac”. Звичайна форма для стовпця текстового типу дозволяє відшукати всі значення вказаного стовпця, які відповідають зразку, заданому „текстовою константою”.

У виразах операції LIKE допускається використання шаблону, в якому можна використовувати всі алфавітно-цифрові символи (з врахуванням регістра). При цьому два символи мають спеціальне призначення:

% - заміняє будь-яку кількість символів, в тому числі й нульовий;

_ - заміняє один символ.

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

select prizv

from stat

where prizv like '% р %'

Перед операцією LIKE можна використовувати описувач NOT, який змінює результат виконання операції на протилежне значення і перевіряє значення виразів на неспівпадіння.

Для перевірки нульового значення виразу служить операція IS NULL, яка має наступний формат:

<Вираз> IS [NOT] NULL

Наприклад,

select *

from stat

where is null

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

Використання IN

Перевірка на входження значення виразу в список виконується з допомогою операції IN наступного формату:

<Вираз> [NOT] IN <Список значень>

Цю операцію зручно виконувати, якщо вираз може приймати невелику кількість різних значень. Наприклад:

select cod, prizv

from stat

where osvita in (‘середня’, ‘вища’)

У результаті отримаємо вибірку кодів і прізвищ всіх працівників з середньою і вищою освітою.

Використання BETWEEN

Операція BETWEEN виконує перевірку входження значення в діапазон. Вона має такий формат:

<Вираз> [NOT] BETWEEN

<Мінімальне значення> AND <Максимальне значення>

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

Розглянемо приклад:

select *

from stat

where data_nar between ‘01/01/1960’ and ‘03/12/1980’

У результаті виконання такого запиту отримаємо набір записів, для яких дата народження (поле data_nar) знаходиться в діапазоні з 1 січня 1960 року до 3 грудня 1980 року.

Використання HAVING

Операція HAVING відіграє таку ж роль для груп, як і WHERE для рядків. Ця операція включається в оператор при наявності GROUP BY.

Складені критерії відбору записів

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

  • простих умов;

  • логічних операцій: AND (логічне І), OR (логічне АБО), NOT(логічне НЕ);

  • круглих дужок.

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

Приклади запитів із складеним критерієм відбору:

select prizv

from stat

where osvita = ‘вища’ and adres =’Львів’

Запит відбирає прізвища працівників, які мають вищу освіту і домашня адреса – Львів.

select prizv, name

from stat

where osvita = ‘вища’ or osvita = ‘незакінчена вища’

Запит відбирає прізвища та імена працівників, які мають вищу або незакінчену вищу освіту.

select prizv

from stat

where (osvita = ‘вища’) and

(data_nar between ‘01.01.1960’ and ‘03.12.1980’)

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

Агрегирование данных. SQL-функции

В SQL існує ряд стандартних функцій (SQL-функцій). Крім спеціального випадку COUNT(*) кожна з цих функцій оперує сукупністю значень стовпця деякої таблиці і створює єдине значення, яке визначаються так: COUNT - кількість значень в стовпці, SUM - сума значень в стовпці, AVG - среднє значення в стовпці, MAX - найбільше значення в стовпці, MIN - найменше значення в стовпці. Для функцій SUM и AVG стовпець повинен містити числові значення. Зауважимо, що тут стовпець - це стовпець віртуальної таблиці, в якій можуть міститися дані не тільки з стовпця базової таблиці, але й дані, отртимані шляхом функціонального перетворення й(або) зв’язування символами арифметичних операцій значень з одного або декількох стовпців. Із SQL-функцій можно складати будь-які вирази. Перед аргументами всіх функций, кроме COUNT(*), може ставити ключове слово DISTINCT (різний), яке вказує, що значения, які дублюються, повинні бути виключені перед тем, як буде застосовуватися функція. Спеціальна функція COUNT(*) служить для підрахунку всіх без виключення рядків в таблиці (включаючи дублікати).

Записи набору даних можуть бути згруповані за деякою ознакою. Групу утворюють записи з однаковими значеннями в полях, перелічених в списку операнда GROUP BY.

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

Приклад запиту з групуванням записів:

select data_nar, count (data_nar)

from stat

where data_nar between ‘01.01.1960’ and ‘15.01.1980’

group by data_nar

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

Виконавши запит

select cod, sum (suma)

from obsag

group by cod

можна вивести загальну суму операцій, виконаних кожним рекламним агентом.

Максимальну суму операції кожного рекламного агента можна вибрати з допомогою запиту:

select cod, max (suma)

from obsag

group by cod

Сортування записів

Сортування - це впорядкування записів за зростанням або спаданням значень полів. Список полів, за якими здійснюється сортування, вказується в операнді ORDER BY. Порядок полів в цьому операнді визначає порядок сортування: спочатку записи впорядковуються за значенням поля, вказаного в цьому списку першим, потім записи, які мають однакові записи першого поля, впорядковуються за значенням другого поля і т.д.

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

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

select *

from stat

order by prizv

Тут сортування записів задано за полем prizv.

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

select prizv, stag

from stat

order by prizv, stag desc

або

select prizv, stag

from stat

order by 1, 2 desc

У створений набір даних входять поля prizv, stag всіх записів. Записи посортовані за полями prizv, stag, при цьому значення поля stag впорядковано в порядку спадання.

Ще одна перевага мови SQL – це простота об’єднання даних, які містяться в декількох таблицях. Для цього після слова FROM перераховуються імена таблиць, із записів яких формується набір даних:

SELECT *

FROM <ім’я таблиці_1>, < ім’я таблиці_2>

або

SELECT <ім’я таблиці_1.*>, <ім’я таблиці_2.*>

FROM <ім’я таблиці_1>, <ім’я таблиці_2>

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

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

SELECT <ім’я таблиці_1.ім’я поля>, <ім’я таблиці_2.ім’я поля>

FROM <ім’я таблиці_1>, <ім’я таблиці_2>

Якщо імена полів унікальні (не повторюються), то у запиті імена таблиць у визначенні полів не вказуються:

SELECT <ім’я поля>, <ім’я поля>

FROM <ім’я таблиці_1>, <ім’я таблиці_2>

Звязування таблиць

У набір даних можна включати поля з різних таблиць. Таке включення називається зв’язуванням таблиць. Зв’язування таблиць може бути внутрішнім і зовнішнім.

Внутрішнє зв’язування таблиць - це найпростіший випадок, коли після слова SELECT перелічуються поля різних таблиць.

Таблиці stat і obsag містять основні і додаткові дані про рекламних агентів. Таблиці зв’язані відношенням „один до одного”, тобто кожному запису першої таблиці відповідає один запис іншої таблиці. Результатний набір даних є об’єднанням полів двох таблиць таким чином, що ніби додаткові дані з’єднуються з основними. У таблицях можуть бути вибрані не всі поля, але це не міняє принципу з’єднання.

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

select *

from stat, obsag

where stat.cod = obsag.cod

У результаті запиту виведуться всі поля і записи таблиці obsag і всі поля таблиці stat.

select stat.cod, stat.prizv, obsag.suma

from stat, obsag

where stat.cod = obsag.cod

У результаті запиту виведуться всі записи полів cod i prizv таблиці stat, а також поля suma таблиці obsag.

select *

from stat, obsag

where stat.cod = obsag.cod

order by stat.cod

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

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

Без використання операнда WHERE результатний набір даних буде містити також записи з рекламними агентами, що не виконали жодної операції.

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

При зовнішньому зв’язуванні таблиць можна вказати, яка з таблиць буде головною, а - яка підлеглою. При використанні зовнішнього зв’язування оператор FROM має такий формат:

FROM <Таблиця1> [< Вид зв’язування>] JOIN <Таблиця2>

ON <Критерії відбору>

Критерій відбору після слова ON задає умову включення записів в набір даних, таблиці, що зв’язуються зліва і справа від слова JOIN. Яка з таблиць буде головною, визначає вид зв’язування:

  • LEFT - головна таблиця вказана зліва;

  • RIGHT - головна таблиця вказана справа (по замовчуванню).

Запит, в якому використовується зовнішнє зв’язування таблиць:

SELECT *

FROM stat LEFT JOIN obsag

ON stat.cod = obsag.cod

Зв’язуються таблиці штат рекламних агентів (stat) і обсяг операцій (obsag). Головною є таблиця stat.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]