Типови SQL упита

SQL упити се по својој функцији могу поделити на следеће групе:

DML (Data Manipulation Language), језик за манипулацију података. Ову групу ћемо детаљније проучити јер се односи на преглед, додавање, измену и брисање података.
DDL (Data Definition Language) помоћу кога се креирају, мењају и бришу објекти у бази података. Помоћу њих можемо креирати табеле, одредити називе и типове податка, дефинисати примарни кључ табеле и слично.
DCL (Data Control Language) – jезик за контролу података помоћу кога се одређује који корисник шта сме да ради са подацима. На пример, можете одређеним корисницима дата право да само прегледају податке, а неким и да их мењају.

Наш циљ је упознавање са језиком за манипулацију података.

Приказ података

Приказ података из базе се добија помоћу SELECT наредбе. Основа синтаксна структура SELECT наредбе је веома једноставна:

SELECT nazivi kolona
FROM naziv tabele

Називи колона су раздвојени зарезом, а после FROM клаузуле се уписује име табеле. Наведена имена колона морају постојати у табели, у супротном добићемо поруку о грешци. У питању су записи из Access-а, односно наставак теорије.

У Northwind бази постоји табела под називом Customers у којој се налази листа свих купаца са колонама CustomerID (шифра купца), CompanyName (име компаније), City (град) и тако даље.

Ако би желели да прикажемо поменуте колоне из табеле Customers, SELECT упит би требао да изгледа овако:

SELECT CustomerID, CompanyName, City
FROM Customers

(Нису битна велика и мала слова – неписано правило је да се SQL наредбе пишу великим словима)

Када се покрене овакав упит, добија се резултат као на слици:

access2

Ако желите добити све колоне из табеле можете их све редом навести али постоји и скраћени облик – упишите звездицу уместо листе колона:

SELECT *
FROM Customers

Резултат:

access3

Ово је и згодан начин да се брзо сазна које колоне има табела.

У пракси је често потребно да се подаци прикажу по одређеном редоследу. Редослед може бити по једној или више колона. Ако би резултат упита желели да сложимо по граду и то од A па на даље користимо ORDER BY клаузулу:

SELECT CustomerID, CompanyName, City
FROM Customers
ORDER BY City ASC

Резултат:

access4

ASC је скраћено од Ascending (растући низ). Може се користити и DESC – Descending, односно опадајући низ где се сортирање обавља од већег ка мањем. Код већине база података ASC је подразумевана вредност и не мора се експлицитно наводити.

Написаћемо упит који ће сортирати по две колоне: City и CompanyName и то City по растућем, а CompanyName по опадајућем редоследу.

SELECT City, CompanyName
FROM Customers
ORDER BY City ASC, CompanyName DESC

access5

У практичном раду готово никад нам не треба приказ свих података из једне табеле. У том смислу, постоје два термина: вертикални и хоризонтални филтер.

Вертикални филтер значи да не приказујемо све колоне из табеле, већ само оне које нам заиста требају. На пример, желите видети само шифру и назив компаније и никакве друге податке. Ово се имплементира једноставно тако што у SELECT листи наведете само потребна поља.

Хоризонтални филтер значи да не желите да видите све слогове (редове) из табеле. На пример, желите да видите само купце за задати град. Ово се постиже помоћу WHERE наредбе у којој се дефинише један или више критеријума који морају бити испуњени да би се слог приказао. WHERE наредба (још се зове клаузула) је веома слична if наредби у програмским језицима. Могуће је задати више критеријума који се међусобно повезују OR и AND операторима.

Ако желимо да видимо све купце из града London, упит би изгледао овако:

SELECT CustomerID, CompanyName, City
FROM Customers
WHERE City = 'London'

Синтакса је једноставна: после WHERE клаузуле се наводи име поља (City), затим оператор (=) и на крају вредност (‘London’). Обратите пажњу да се вредност London налази између једноструких знакова за навођење. Пошто је поље City tекстуалног типа, синтаксно, критеријум мора овако да се пише. Ово усвојите као правило које се поштује у свим базама података.

Резултат предходног упита:

access6

Ако на пример, желимо да прикажемо купце из Londona и Berlina онда се ради о сложеном услову са два критеријума. Читајте овако: прикажи купце који су из Londona или Berlina – значи ради се о OR (eng. или) оператору.

SELECT CustomerID, CompanyName, City
FROM Customers
WHERE City = 'London' OR City = 'Berlin'

Резултат упита:

access7

Питање за читаоца: ако би у предходном примеру оператор OR заменили са оператором AND, какав би резултат добили?

Одговор: не би добили ни један слог јер (логично) ни један купац не може истовремено да буде и из Londona и из Berlina 🙂

Често се у комбинују WHERE и ORDER BY клаузула која служи за сортирање и коју смо описали у предходном наставку. У том случају неопходно је испоштовати редослед клаузула у SELECT упиту:

SELECT ...
FROM ...
WHERE ...
ORDER BY …

На пример:

SELECT ContactName, CustomerID, CompanyName, City
FROM Customers
WHERE City = 'London' OR City = 'Berlin'
ORDER BY ContactName

Резултат упита:

access8

Можете креирати произвољно сложене критеријуме коришћењем више OR и/или AND оператора, али водите рачуна о приоритету: AND има виши приоритет од OR. Како се тачно тумачи следећи критеријум:

...
WHERE City = 'London' AND CustomerID = 'ALFKI' OR
Country = 'Italy'

Пошто AND има приоритет, услов читамо на следећи начин:

...
WHERE (City = 'London' AND CustomerID = 'ALFKI') OR Country = 'Italy'

Постављањем услова у заграде можете форсирати потребни приоритет по правилима булове алгебре.

Ако желите да прикажете све податке осим неког по задатом критеријуму, можете користити оператор негације NOT.

На пример желимо видети све купце осим оних из Londona:

SELECT CustomerID, CompanyName, City
FROM Customers
WHERE NOT City = 'London'

Постоји још једна згодна скраћеница у писању. Ако за исто поље постоји више критеријума везаних са оператором OR, може се користити IN оператор. На пример, ако желимо да видимо све купце из градова London, Berlin, Madrid и Pariz критеријум би се скраћено написао на следећи начин:

SELECT ContactName, CustomerID, CompanyName, City
FROM Customers
WHERE City IN ('London', 'Berlin', 'Madrid', 'Paris')

Резултат упита:

access9

Када су поља у критеријуму нумеричког типа, услов се пише исто као и до сада али овог пута вредност критеријума не сме да се ставља у једноструке знакове навода. На пример желимо видети све производе чија је цена (поље UnitPrice) већа од 50 и да резултат сортирамо по истом пољу.

SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE UnitPrice > 50
ORDER BY UnitPrice

Резултат упита:

access10

Слично IN оператору постоји још један скраћени начин писања

критеријума. Ако желимо да видимо све производе чије су цене између 50 и 100 (укључујући и ове вредности) регуларно би написали:

SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE UnitPrice >= 50 AND UnitPrice <= 100

Оператор >= означава „веће или једнако“.

Оператор <= значи „мање или једнако“.

Критеријум можемо скратити и што је можда важније, учинити читљивијим помоћу BETWEEN оператора:

SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE UnitPrice BETWEEN 50 AND 100

Резултат упита:

access12

Водите рачуна да коришћење BETWEEN оператора увек укључује и горњу и доњу границу.

Коришћење хоризонталног и вертикалног филтера је веома битно јер значајно смањује оптерећење сервера базе података и мрежне инфраструктуре. Имајте у виду да у пракси никад није потребно гледати све податке. Пажљиво написани упити, где се приказује само оно што је стварно потребно (и по хоризонтали и по вертикали), могу значајно да побољшају укупне перформансе система.

One thought on “Типови SQL упита

  1. Повратни пинг: C# апликација за рад са SQL упитима – Рачунари и програмирање

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google photo

Коментаришет користећи свој Google налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

Повезивање са %s