Садржај
1.0 Базе: Увод у базе података
1.1 Базе: SQLite
1.2 Базе: Дизајнирање базе података
2.0 - SQL: Читање података из базе
2.1 SQL: Пројекција и селекција
2.2 SQL: Логички и релацијски оператори
2.3 SQL: Изрази и функције - Додатно
2.4 SQL: Сортирање, уклањање дупликата, ограничавање броја врста
2.5 SQL: Агрегатне функције и груписање
2.6 SQL: Спајање табела
2.7 SQL: Угнежђени упити
2.8 SQL: Сложенији угњеждени упити - Додатно
2.9 SQL: Погледи
3.0 SQL: Промена садржаја базе
3.1 SQL: Уписивање података у табеле
3.2 SQL: Ажурирање података у табелама
3.3 SQL: Брисање података из табела
Релацијски оператори (<, <=, >, >=, BETWEEN, IN)¶
До сада смо у свим упитима употребљавали само релацијске операторе
једнако (=) и различито (!=). Језик SQL подржава још неке
релацијске операторе. Над бројевима (као и на још неким типовима)
могу се употребљавати и релацијски оператори поретка <, <=, >
и >=.
Приказати све ученике старијих разреда.
Приказујемо све ученике код којих је разред већи или једнак од 3.
SELECT *
FROM ucenik
WHERE razred >= 3;
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
9 |
Вања |
Савић |
м |
2004-11-13 |
3 |
1 |
10 |
Николина |
Јовановић |
ж |
2004-08-03 |
3 |
1 |
11 |
Станоје |
Бекоња |
м |
2004-03-04 |
3 |
1 |
181 |
Срђан |
Рељин |
м |
2004-07-25 |
3 |
1 |
182 |
Вида |
Кнежевић |
ж |
2005-01-15 |
3 |
1 |
… |
… |
… |
… |
… |
… |
… |
Овај упит можемо протумачити као:
На следећој слици може да се види како изгледа овај упит покренут у систему SQLite Studio. Види се само првих неколико редова и информација о томе да има укупно 169 редова који задовољавају постављен услов.
Алтернативно, приказујемо све ученике код којих је разред строго већи од два.
SELECT *
FROM ucenik
WHERE razred > 2;
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
9 |
Вања |
Савић |
м |
2004-11-13 |
3 |
1 |
10 |
Николина |
Јовановић |
ж |
2004-08-03 |
3 |
1 |
11 |
Станоје |
Бекоња |
м |
2004-03-04 |
3 |
1 |
181 |
Срђан |
Рељин |
м |
2004-07-25 |
3 |
1 |
182 |
Вида |
Кнежевић |
ж |
2005-01-15 |
3 |
1 |
… |
… |
… |
… |
… |
… |
… |
Приказати све податке о предметима у прва два разреда.
SELECT *
FROM predmet
WHERE razred <= 2;
Извршавањем упита добија се следећи резултат:
id |
naziv |
razred |
fond |
|---|---|---|---|
1 |
Математика |
1 |
4 |
2 |
Српски језик |
1 |
4 |
3 |
Рачунарство и информатика |
1 |
2 |
4 |
Математика |
2 |
5 |
5 |
Психологија |
2 |
2 |
… |
… |
… |
… |
Оператори поретка могу да се примене и на другим типовима података (на пример, нискама и датумима).
Приказати све податке о ученицима који су рођени после првог јуна 2006.
SELECT *
FROM ucenik
WHERE datum_rodjenja > '2006-06-01';
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
3 |
Лидија |
Петровић |
ж |
2006-12-14 |
1 |
1 |
12 |
Ана |
Анђелковић |
ж |
2007-04-23 |
1 |
2 |
13 |
Дуња |
Травица |
ж |
2007-01-03 |
1 |
1 |
14 |
Јована |
Божић |
ж |
2006-09-06 |
1 |
1 |
… |
… |
… |
… |
… |
… |
… |
Подсетимо се да се датум наводи као ниска карактера, између једноструких
наводника, у формату gggg-mm-dd.
Приказати све податке о ученицима који су на време кренули у школу током 2006. године (то су они који су рођени између 1. марта 2006. и 1. марта 2007. године, не укључујући последњи датум).
SELECT *
FROM ucenik
WHERE '2006-03-01' <= datum_rodjenja AND datum_rodjenja < '2007-03-01';
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
2 |
Милица |
Јовановић |
ж |
2006-04-03 |
1 |
1 |
3 |
Лидија |
Петровић |
ж |
2006-12-14 |
1 |
1 |
6 |
Јован |
Миленковић |
м |
2006-04-07 |
1 |
2 |
7 |
Јована |
Миленковић |
ж |
2006-04-07 |
1 |
2 |
… |
… |
… |
… |
… |
… |
… |
Припадност интервалу може да се испитује и помоћу посебног оператора
BETWEEN ... AND .... Обе границе које се наведу се укључују. На
пример, услов ocena BETWEEN 2 AND 4 допушта вредности 2, 3, и 4.
Овај оператор може да се примени и на датуме.
SELECT *
FROM ucenik
WHERE datum_rodjenja BETWEEN '2006-03-01' AND '2007-02-28';
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
2 |
Милица |
Јовановић |
ж |
2006-04-03 |
1 |
1 |
3 |
Лидија |
Петровић |
ж |
2006-12-14 |
1 |
1 |
6 |
Јован |
Миленковић |
м |
2006-04-07 |
1 |
2 |
7 |
Јована |
Миленковић |
ж |
2006-04-07 |
1 |
2 |
… |
… |
… |
… |
… |
… |
… |
Оператор BETWEEN може да се комбинује и са другим операторима.
Приказати податке о свим регулисаним изостанцима на првом часу добијеним у 2021. години.
SELECT *
FROM izostanak
WHERE datum BETWEEN '2021-01-01' AND '2021-12-01' AND
status != 'нерегулисан' AND cas = 1;
Извршавањем упита добија се следећи резултат:
id |
id_ucenik |
datum |
cas |
status |
|---|---|---|---|---|
1 |
1 |
2021-05-14 |
1 |
оправдан |
5 |
6 |
2021-06-01 |
1 |
неоправдан |
7 |
8 |
2021-06-01 |
1 |
оправдан |
9 |
100 |
2021-03-02 |
1 |
неоправдан |
12 |
100 |
2021-03-10 |
1 |
неоправдан |
… |
… |
… |
… |
… |
Приказати све ученике који су у дневнику одељења I1 пре Петровића
SELECT *
FROM ucenik
WHERE razred = 1 AND odeljenje = 1 AND prezime < 'Петровић';
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
2 |
Милица |
Јовановић |
ж |
2006-04-03 |
1 |
1 |
14 |
Јована |
Божић |
ж |
2006-09-06 |
1 |
1 |
15 |
Елена |
Ђурђевић |
ж |
2007-01-16 |
1 |
1 |
16 |
Даница |
Анђелковић |
ж |
2007-02-11 |
1 |
1 |
17 |
Теодора |
Вучковић |
ж |
2007-02-25 |
1 |
1 |
… |
… |
… |
… |
… |
… |
… |
У овом упиту смо презиме упоредили са Петровић, помоћу оператора <,
и тада се поређење врши по азбучном редоследу (каже се,
лексикографски). За примену овог оператора над нискама је веома битно
да је за колону подешена одговарајућа колациона секвенца (подсетимо
се, у колони презиме поставили смо колациону секвенцу UNICODE, што
омогућава да се и ћирилички карактери исправно пореде).
Још један често коришћен оператор који се примењује над текстуалним
подацима (нискама) је оператор LIKE, којим може да се наметне облик
(шаблон) ниске који желимо да издвојимо (или изоставимо) из резултата.
Приказати све ученике чије презиме почиње на слово П.
SELECT *
FROM ucenik
WHERE prezime LIKE 'П%';
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
3 |
Лидија |
Петровић |
ж |
2006-12-14 |
1 |
1 |
5 |
Ана |
Пекић |
ж |
2005-02-23 |
2 |
1 |
24 |
Ивана |
Пејчев |
ж |
2006-05-13 |
1 |
1 |
47 |
Душанка |
Петровић |
ж |
2006-09-28 |
1 |
2 |
… |
… |
… |
… |
… |
… |
… |
Шаблон презимена која се траже је описан у облику 'П%', што значи
да она почињу словом П након чега следи произвољан низ карактера
(карактер % у склопу шаблона означава било какав низ карактера,
док карактер _ означава било који појединачан карактер).
Приказати све ученике чији су иницијали ПП.
SELECT *
FROM ucenik
WHERE ime LIKE 'П%' AND prezime LIKE 'П%';
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
163 |
Петар |
Платиша |
м |
2005-05-30 |
2 |
3 |
Приказати све ученице чије се име не завршава на слово а.
SELECT *
FROM ucenik
WHERE pol = 'ж' AND NOT (ime LIKE '%а');
Извршавањем упита добија се следећи резултат:
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|
322 |
Натали |
Ристић |
ж |
2003-03-06 |
4 |
3 |
У овом примеру је употребљен оператор NOT да би се приказали само
они ученици чије се име НЕ уклапа у дати шаблон. Шаблон '%а'
означава произвољан низ карактера иза којих следи ниска а.
Приказати имена и презимена ученика чије се презиме завршава на
ић, али не и на вић.
SELECT ime, prezime
FROM ucenik
WHERE (prezime LIKE '%ић') AND NOT (prezime LIKE '%вић');
Извршавањем упита добија се следећи резултат:
ime |
prezime |
|---|---|
Ана |
Пекић |
Гордана |
Сарић |
Јована |
Божић |
Тијана |
Божић |
Зоран |
Илић |
… |
… |
Још један користан оператор може бити оператор IN, којим се
проверава да ли вредност припада неком датом скупу
елемената. Приказаћемо његову употребу на следећем примеру.
Издвојити податке о свим предметима који се зову Математика,
Физика или Рачунарство и информатика.
SELECT *
FROM predmet
WHERE naziv IN ('Математика', 'Физика', 'Рачунарство и информатика')
Извршавањем упита добија се следећи резултат:
id |
naziv |
razred |
fond |
|---|---|---|---|
1 |
Математика |
1 |
4 |
3 |
Рачунарство и информатика |
1 |
2 |
4 |
Математика |
2 |
5 |
6 |
Физика |
1 |
2 |
7 |
Физика |
2 |
3 |
… |
… |
… |
… |
Вежба¶
Покушај сада да самостално решиш наредних неколико задатака.
Приказати све податке о изостанцима добијеним током прва три часа.
Приказати сва имена и презимена ученика чија презимена почињу на „Ми“.