---
# System prepended metadata

title: Upiti nad jednom tabelom

---

# Upiti nad jednom tabelom

## ER dijagram:
![proizvodi baza v2](https://hackmd.io/_uploads/rywYRVbSp.png)

## Upiti:

### 1. Naći proizvode koji se zavrsavaju sa “ship”.

:::    info 
ℹ️ Uputstvo

Kod poređenja tekstualnih polja, koristimo ***LIKE*** i karaktere **'_'** i **'%'**, u kombinaciji sa tekstom koji tražimo.
Karakter '_' mijenja jedan, bilo koji karakter (slovo, broj, znak), dok '%' mijenja bilo koliko, bilo kojih karaktera (slova, brojeve, znakove, ili prazan tekst).
:::

:::    spoiler Rješenje

``` SQL
SELECT * 
FROM proizvodi
WHERE naziv LIKE "%ship";
```

::: warning
⚠️ Napomena

Da se tražilo u zadatku da počine sa 'ship', rješenje bi bilo:

``` SQL
...
WHERE naziv LIKE "ship%";
```

Da se tražilo u zadatku da samo sadrži 'ship', rješenje bi bilo:

``` SQL
...
WHERE naziv LIKE "%ship%";
```

Da se tražilo u zadatku da je drugi karakter 's', rješenje bi bilo:

``` SQL
...
WHERE naziv LIKE "_s%";
```

:::


### 2. Naći broj kupaca u Švedskoj, Španiji i Francuskoj.

:::    info 
ℹ️ Uputstvo

Kad u uslovu jedna kolona može imati neku od različitih vrijednost, koristimo ***IN***. Da bismo našli ukupan broj redova koji odgovaraju uslovu, koristimo agregatnu funkciju ***COUNT()***.
:::

:::    spoiler Rješenje

``` SQL
SELECT count(*) 
FROM kupci
WHERE drzava IN ("Sweden", "Spain", "France");
```

::: warning
⚠️ Napomena

Zadatak smo mogli da uradimo i na ovaj način:

``` SQL
SELECT count(*) 
FROM kupci
WHERE drzava LIKE "Sweden"
OR drzava LIKE "Spain"
OR drzava LIKE "France";
```

Ali, pošto je riječ o istoj koloni, ljepše je koristiti ***IN***.
:::

### 3. Naći broj kupaca koji nemaju popunjen poštanski broj.

:::    info 
ℹ️ Uputstvo

Polje koje je prazno ima vrijednost ***NULL***. Za negaciju se koristi ***NOT***.
:::

:::    spoiler Rješenje

``` SQL
SELECT count(*) 
FROM kupci
WHERE postanski_broj IS NOT NULL;
```

::: warning
⚠️ Napomena

Za poređenje NULL vrijednosti koristimo **IS**, a ne **=**. 
:::

### 4. Naći broj radnika koji imaju kao nadređenog radnika sa emailom *abow@classicmodelcars.com* (više upita).

:::    info 
ℹ️ Uputstvo

Prvo moramo pronaći koji radnik ima traženi email. Onda pronalazimo koji su to radnici kojima je on/a nadređen/a.
:::

:::    spoiler Rješenje
``` SQL
SELECT id
FROM zaposleni
WHERE email LIKE "abow@classicmodelcars.com";
```

Pokretanjem ovog upita, saznajemo da je ID zaposlenog kojeg tražimo 6. Sada ćemo to iskoristiti u drugom upitu da pronađemo kojim radnicima je on nadređen.

U tabeli zaposleni postoji kolona nadređeni_id, koja sadrži ID drugog zaposlenog koji mu/joj je nadređen (rekurzija).

``` SQL
SELECT *
FROM zaposleni
WHERE nadredjeni_id = 6;
```
:::

### 5. Naći proizvod kojeg na lageru ima manje od 600, i čiji opis vrste proizvoda sadrži tekst *official logos and insignias* (više upita).

:::    info 
ℹ️ Uputstvo

Za svaki proizvod znamo samo ID vrste proizvoda kojoj pripada. Prvo moramo da pronađemo koji ID ima vrsta proizvoda sa ovim opisom, pa da njega iskoristimo da pronađemo sve proizvode koji joj pripadaju.
:::

:::    spoiler Rješenje
``` SQL
SELECT id
FROM vrste_proizvoda
WHERE opis LIKE "%official logos and insignias%";
```

Pokretanjem ovog upita, saznajemo da je ID vrste proizvoda koju tražimo 3. Sada ćemo to iskoristiti u drugom upitu da pronađemo koji proizvodi pripadaju toj vrsti.

``` SQL
SELECT *
FROM proizvodi
WHERE kolicina_na_lageru < 600
AND vrsta_proizvoda_id = 3;
```
:::

### 6. Naći mjesec (broj od 1 do 12) u kojem se, prosječno, pravi najviše narudžbi i odštampati ovu vrijednost sa imenom *Najprometniji mjesec*.

:::    info 
ℹ️ Uputstvo

Za datume postoje funkcije ***YEAR()***, ***MONTH()***, ***DAY()*** itd. koje izvlače traženo iz datuma.
Za prikaz određenog naziva kolone u tabeli rezultata, koristimo ***AS***.
:::

:::    spoiler Rješenje
``` SQL
SELECT AVG(MONTH(datum_narucivanja)) AS "Najprometniji mjesec"
FROM narudzbe;
```
::: warning
⚠️ Napomena

Prilagođeni prikaz naziva kolone u rezultatu se zove **alias**. Ukoliko alias ima jednu riječ (ili ukoliko koristimo *snake_case* ili *camelCase*), ne pišemo navodnike.
:::

### 7. Dodatno: Odštampaj mjesec kao integer, ne kao decimalan broj (npr. 5 umjesto 5.67564).

:::    info 
ℹ️ Uputstvo

Postoji više funkcija za zaokruživanje decimalnog broja u cijeli, a koju koristimo zavisi od toga šta se traži. Funkcija ***ceil()*** zaokružuje uvijek na veći cijeli broj, ***floor()*** uvijek zaokružuje na manji cijeli broj, a ***round()*** pravilno zaokružuje broj.
:::

:::    spoiler Rješenje
``` SQL
SELECT FLOOR(AVG(MONTH(datum_narucivanja))) AS "Najprometniji mjesec"
FROM narudzbe;
```
:::

### 8. Naći vrijednost trenutnog inventara tj. zbir vrijednosti svih proizvoda. Vrijednost jednog proizvoda se računa kao *kolicina_na_lageru* * *nabavna_cijena*. Odštampati kao *Vrijednost inventara*.

:::    info 
ℹ️ Uputstvo

Za računanje zbira se koristi agregatna funkcija ***SUM()***;
:::

:::    spoiler Rješenje
``` SQL
SELECT SUM(kolicina_na_lageru * nabavna_cijena) AS "Vrijednost inventara"
FROM proizvodi;
```
:::

### 9. Naći 3 najskuplja proizvoda vrste proizvoda *Planes*. Vrijednost proizvoda se računa kao u prethodnom zadatku. Prikazati samo ime proizvoda i vrijednost.

:::    info 
ℹ️ Uputstvo

Za pronalaženje *n* najboljih ili najgorih redova po određenom kriterijumu, potrebno je da se rezultati sortiraju u opadajućem ili rastućem poretku koristeći ***ORDER BY*** i ***ASC***/***DESC***, a onda da se ograniči broj najboljih tj. najgorih redova koristeći ***LIMIT***.
:::

:::    spoiler Rješenje
``` SQL
SELECT naziv, (kolicina_na_lageru * nabavna_cijena) as vrijednost
FROM proizvodi
WHERE vrsta_proizvoda_id = 3
ORDER BY vrijednost DESC
LIMIT 3; 
```

::: warning
⚠️ Napomena

Vrsta proizvoda *Planes* ima ID 3, što smo vidjeli u 4. zadatku.
:::

### 10. • Naći poslovnicu kojoj broj telefona počinje sa +1 i čija ulica ne sadrži riječ Street. • Naći radnika koji radi u toj poslovnici i čiji e-mail ima 31 karakter. • Naći najmanji i najveći limit kredita kupaca sa kojima posluje taj radnik.(više upita)

:::    info 
ℹ️ Uputstvo

Za računanje dužine tekstualnih polja koristi se funkcija ***LENGTH()***.
Za računanje minimalne i maksimalne vrijednosti određene kolone iz skupa rezultata, koriste se funkcije ***MIN()*** i ***MAX()***.
:::

:::    spoiler Rješenje
``` SQL
SELECT *
FROM poslovnice
WHERE telefon LIKE "+1%"
AND adresa NOT LIKE "%street%";
```

Nakon ovog upita, saznajemo da ta poslovnica ima ID 2, što koristimo dalje.

``` SQL
SELECT *
FROM zaposleni
WHERE poslovnica_id = 2
AND LENGTH(email) = 31;
```

Ovdje saznajemo da taj zaposleni ima ID 10.

``` SQL
SELECT min(limit_racuna) as najmanji, max(limit_racuna) as najveci
FROM kupci
WHERE odgovorni_zaposleni_id = 10;
```
:::