- •Мова sql(Structured Query Language) – як універсальний засіб створення баз даних, маніпулювання данними та отримамання потрібної інформації.
- •Умова відбору (ключове слово where)
- •Зрівняння.
- •Ліве з’єднання (left join)
- •Сортування результату (фраза order by)
- •Групування результатів (фраза group by). Агрегатні функціії.
- •Використання фрази group by
- •Використання фрази having
- •Підзапити
- •Ключові слова exists I not exists
- •Модифікація даних (оператор update)
- •Видалення даних з бази(оператор delete).
- •Створенння таблиць (оператор create table).
- •Check (Naukov_stupin in(‘не має’, ‘кадидат’, ‘доктор’))
- •Використання транзакцій.
- •Управління доступом даних
- •Insert – право втавляти в таблицю нові рядки;
- •Надання привілеїв іншим користувачам (оператор grant)
- •Insert - користувач з цим привілеєм може виконувати оператор insert для цієї таблиці;
- •Відміна наданих привілеїв (оператор revoke)
Умова відбору (ключове слово where)
В наведених вище прикладах в результаті виконання оператора SELECT вибирались всі рядки вказаної таблиці. Якщо потрібно задати критерій відбору рядків це задається після ключового слова WHERE. Існує 5 основних типів умов відбору (або, згідно термінології ISO, предикатів).
-
Зрівняння. Зрівнюються результати обчислення одного виразу з результатами обчислення другого виразу.
-
Діапазон. Перевіряється, чи попадає результат обрахунку виразу в заданий діапазон.
-
Приналежність до множини. Перевіряється, чи належить результат обчислення виразу до заданої множини значень.
-
Відповідність шаблону. Перевіряється, чи відповідає деяке строкове значення заданому шаблону.
-
Значення NULL. Перевіряється, чи даний стовпчик має невизначене значення NULL.
Розглянемо приклади застосування вказаних типів відбору.
Зрівняння.
Необхідно скласти перелік товарів, ціна покупки яких перевищила 90.
SELECT kod,suma,data
FROM table_a
WHERE suma>90
Результат запиту матиме вид:
|
kod |
suma |
data |
|
1 |
100 |
1.1.2002 |
|
2 |
150 |
2.1.2002 |
(2 рядки)
Одержати перелік товарів з відповідними сумами і відповідними сумами податку ПДВ, в яких сума податку ПДВ перевщує 10. Відповідний оператор SELECT матиме вид:
SELECT kod,suma,(suma*0.2)/(1+0.2) AS pdv
FROM table_a
WHERE suma*0.2/1.2 >10
Результат запиту матиме вид:
|
kod |
suma |
Pdv |
|
1 |
100 |
16.666666 |
|
2 |
150 |
25 |
|
2 |
89 |
27.666666 |
Необхідно скласти перелік покупок товару з кодом 1, ціна покупки яких не перевищувала 80.
SELECT kod,suma,data
FROM table_a
WHERE kod=1 AND suma<=80
Результат запиту матиме вид:
|
kod |
suma |
data |
|
1 |
55 |
10.1.2002 |
|
1 |
40 |
15.1.2002 |
Використання діапазонів (BETWEEN / NOT BETWEEN)
Необхідно скласти перелік товарів, ціна покупки яких лежить в межах від 50 до 100 грн.
SELECT kod,suma,data
FROM table_a
WHERE suma BETWEEN 50 AND 100
Результат запиту матиме вид:
|
kod |
suma |
data |
|
1 |
100 |
1.1.2002 |
|
1 |
55 |
10.1.2002 |
|
2 |
89 |
2.2.2002 |
Умови відбору з перевіркою входження у множину (IN / NOT IN)
Задача. Необхідно скласти список покупок, які здійснювались 1.1.2002 і 2.2.2002 року. Запит матиме такий вид:
SELECT *
FROM table_a
WHERE data IN( #1/1/2002#,#2/2/2002#)
Результат запиту матиме вид:
|
kod |
suma |
data |
|
1 |
100 |
1.1.2002 |
|
2 |
89 |
2.2.2002 |
Умови відбору з допомогою шаблону (LIKE / NOT LIKE)
В мові SQL існує два спеціальних символи шаблону, які використовуються для зрівнювання символьних значень.
% Символ проценту представляє любу послідовність з нуля і більше символів.
_ Символ підкреслювання представляє любий одиночний символ.
Всі останні символи в шаблоні представляють самі себе. Наприклад:
-
Adresa LIKE ‘П%’ – цей шаблон означає, що перший символ значення стовпчика Adresa повинен бути символом П, а всі останні символи можуть бути любими;
-
Adresa LIKE ‘П___’ - цей шаблон означає, що значення стовпчика Adresa повиненно мати довжину 4 і починатись з символа П;
-
Adresa LIKE ‘%п’ – цей шаблон означає, значення стовпчика Adresa повинено закінчуватись символом п;
-
Adresa LIKE ‘%ДПС%’ – цей шаблон означає, що значення стовпчика Adresa повиненно містити підслово ДПС;
-
Adresa NOT LIKE ‘П%’ – цей шаблон означає, що перший символ значення стовпчика Adresa НЕ повинен бути символом П, а всі останні символи можуть бути любими.
Приклад. Нехай таблиця ustanova має такі стовпчики: kod, Nazva, Adresa, в яких заноситься інформація про ідентифікаційний код підприємства, його назву і адресу відповідно. Тоді запит
SELECT *
FROM ustanova
WHERE Adresa LIKE’%Ірпінь%’
поверне перелік підприємств, в адресі яких зустрічається слово Ірпінь.
Використання значення NULL в умовах відбору (IS NULL / NOT NULL)
Для знаходження незаповнених значень певного стовпчика деякої таблиці використовується спеціальне ключове слово IS NULL. Наприклад, для формування списку підпрємств з незаповненими адресами потрібно написати такий запит:
SELECT *
FROM ustanova
WHERE Adresa IS NULL
і навпаки, запит
SELECT *
FROM ustanova
WHERE Adresa IS NOT NULL
сформує список підприємств із заповненими адресами.
Використання множини таблиць в одному запиті.
До цих пір кожний запит базувався на одній таблиці. Але на практиці цього недостатньо. Для того, щоб об’єднать в результуючий таблиці даних з декількох таблиць, необхідно виконати операцію з’єднання. Для виконання з’єднання двох і більше таблиць в одному запиті необхідно після ключового слова FROM вказати імена цих таблиць, розділивши їх комами, після чого додати в запит ключове слово WHERE з визначенням стовпчиків, які викориситовуються для з’єднання вказаних таблиць. Крім того, замість імен таблиць можна використовувати назначені їм в розділі FROM псевдоніми (аліаси). В цьому випадку імена таблиць і назначені їм аліаси повинні розділятись комами.
Імена таблиць і стовпчиків.
Повне ім’я стовпчика складається з імені таблиці, безпосередньо за яким стоїть крапка, а за нею - ім’я стовпчика. Наприклад, table_a.kod,table_b.suma, table_a.suma. В наведених раніше прикладах імена таблиць можно було опускати, поскільки запити використовували тільки одну таблицю. Навіть формуючи запит до декількох таблиць їх імена можна опустити, якщо імена цих таблиць різні. Одначе так буває не завжди.
З’єднання таблиць (join)
Припустимо, необхідно встановити звязок між закупленим товаром і проданим. Для цього потрібно прирівняти код купленого товару до коду проданого товару, тобто table_a.kod=table_b.kod. Отже запит матиме вид:
SELECT a.kod AS kod_a,a.suma AS suma_a, b.kod AS kod_b,b.suma AS suma_b
FROM table_a a,table_b b
WHERE a.kod=b.kod
Результат запиту матиме вид:
|
kod_a |
suma_a |
kod_b |
suma_b |
|
1 |
100 |
1 |
50 |
|
1 |
100 |
1 |
47 |
|
2 |
150 |
2 |
35 |
|
2 |
150 |
2 |
80 |
|
1 |
55 |
1 |
50 |
|
1 |
55 |
1 |
47 |
|
1 |
40 |
1 |
50 |
|
1 |
40 |
1 |
47 |
|
2 |
89 |
2 |
35 |
|
2 |
89 |
2 |
80 |
Тепер пояснимо роботу оператора SELECT, в якому використовується декілька таблиць. На основі таблиць, які зустічаються після ключового слова FROM (в нашому випадку – table_a i table_b) , будується декартовиий добуток множин рядків таблиць. В одержаному добутку перевіряється істинність предикату заданого у WHERE, якщо предикат приймає значення істина, рядок поміщається в рельтуючу множину, в противному разі – не включається. Тепер стає зрозумілим, чому в результаті є 6 рядків в яких kod_a i kod_b приймають значення 1 (в таблиці table_a значення 1 в колонці kod зустрічається 3 рази, а у таблиці table_b відповідно 2 рази, отже в декартовому добутку буде 6 рядків) і 4 рядки, в яких kod_a i kod_b приймають значення 2 (в таблиці table_a значення 2 в колонці kod зустрічається 2 рази і в таблиці table_b 2 рази, отже в декартовому добутку буде 4 рядків). Оскільки, в table_b в колонці kod 3 не зустрічається, тому в результаті не має рядка з kod_a=kod_b=3.
В наведеному вище прикладі продемонстровано з’єднання (join) двох таблиць. З’єднання, яке використовує предикати, які побудовані виключно на рівностях, називається еквіз’єднанням. Еквіз’єднання є найбільш поширеним типом з’єднанням, але існують і інші типи з’єднання. Фактично в з’єднанні можна використовувати любу операцію зрівняння. Наприклад,
SELECT a.kod AS kod_a,a.suma AS suma_a, b.kod AS kod_b,b.suma AS suma_b
FROM table_a a,table_b b
WHERE a.kod>b.kod
Результат запиту матиме вид:
|
kod_a |
suma_a |
kod_b |
suma_b |
|
1 |
100 |
2 |
35 |
|
1 |
100 |
2 |
80 |
|
1 |
55 |
2 |
35 |
|
1 |
55 |
2 |
80 |
|
1 |
40 |
2 |
35 |
|
1 |
40 |
2 |
80 |
Наведемо приклад більш практичнішої задачі. Для обчислення прибуткового податку з громадян в Excel’і користуються такою формулою
Якщо(Дохід<=17; 0;
Якщо(Дохід<=85; (Дохід-17)*0.1;
Якщо(Дохід<=170; (Дохід-85)*0.15+6.8;
Якщо(Дохід<=1020; (Дохід-170)*0.2+19.55;
Якщо(Дохід<=1700; (Дохід-1020)*0.3+189.55;
(Дохід-1700)*0.4+393.55)))));
Нижче наведена таблиця tpp обрахування прибуткового податку на зарплату:
|
d_l |
d_r |
p |
c |
|
0 |
17 |
0 |
0 |
|
17 |
85 |
0.1 |
0 |
|
85 |
170 |
0.15 |
6.8 |
|
170 |
1020 |
0.2 |
19.55 |
|
1020 |
1700 |
0.3 |
189.55 |
|
1700 |
109 |
0.4 |
393.55 |
Якщо D – дохід, то податок P на прибуток обраховується за формулою:
(D-d_l)*p+c.
Рядок, з якого вибирабться відповідні d_l, p i c, визначається нерівностями:
d_l<D<=d_r
Очевидно, ці нерівності однозначно визначають рядок таблиці tpp.
Нахай таблиця Vidomist має вид:
|
kod |
priz |
D |
|
1 |
Іванов |
367.78 |
|
2 |
Петров |
1309.55 |
|
3 |
Сидоров |
2709.98 |
де через kod позначено ідентифікаційний код особи, priz – прізвище особи, D – суму сукупного доходу.
Для того, щоб сформувати відомість нарахованих сум податку на прибуток, необхідно застосувати такий оператор SELECT:
SELECT a.kod,a.priz, (a.D-b.d_l)*b.p+b.c AS podatok
FROM Vidomist a, tpp b
WHERE (a.D>b.d_l) AND (a.D<=b.d_r)
Стандарт SQL-92 додатково надає і таку можливість створення цього з’єднання:
FROM Vidomist a INNER JOIN tpp b ON((a.D>b.d_l) AND (a.D<=b.d_r))
Таким чином, запит виглядатиме так:
SELECT a.kod,a.priz, (a.D-b.d_l)*b.p+b.c AS podatok
FROM Vidomist a INNER JOIN tpp b ON((a.D>b.d_l) AND (a.D<=b.d_r))
Запит, який з’єднанує таблиці table_a i table_b матиме вид:
SELECT a.kod AS kod_a,a.suma AS suma_a, b.kod AS kod_b,b.suma AS suma_b
FROM table_a a INNER JOIN table_b b ON a.kod=b.kod
