Садржај
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 |
… |
… |
… |
… |
Вежба¶
Покушај сада да самостално решиш наредних неколико задатака.
Приказати све податке о изостанцима добијеним током прва три часа.
Приказати сва имена и презимена ученика чија презимена почињу на „Ми“.