owned this note
owned this note
Published
Linked with GitHub
---
tags: vaje, opb, insert, update, delete, select
hackmd: https://hackmd.io/yGv-urqwRTm54-EDM7QQrw
---
# Osnove podatkovnih baz - vaje 18.2.2021
---
## Osnovna uporaba SQL
### Naloga 3: Ukaz `INSERT`
```sql
INSERT INTO tabela [(st1, st2, ...)]
VALUES (vr1, vr2, ...);
```
1. Vsak naj se vpiše v tabelo `oseba`. Po potrebi je treba prej vpisati še kraj v tabelo `kraj`. Vpiši se z ukazom `INSERT`. (Najprej klikni na zbirko `banka` in izberi zavihek *SQL*. Odpre se polje, v katerega lahko pišeš ukaze SQL in jih izvajaš.)
```sql
INSERT INTO kraj (posta, kraj) VALUES (6281, 'Škofije');
INSERT INTO oseba VALUES
('2305939505123', 'Moja', 'Nona', '1939-05-23', 'Stara ulica 80', 6281);
```
2. V tabeli `racun` ustvari še svoj bančni račun.
```sql
INSERT INTO racun (lastnik) VALUES ('2305939505123');
```
3. V tabeli `transakcija` naredi nekaj transakcij na svojem računu, na primer vsaj dva dviga in dva pologa.
```sql
INSERT INTO transakcija (znesek, racun, opis)
VALUES (800, 100002, 'Penzija');
INSERT INTO transakcija (znesek, racun)
VALUES (-100, 100006);
INSERT INTO transakcija (znesek, racun, opis)
VALUES (300, 100010, 'Dobitek na Milijonarju');
```
---
### Naloga 4: Ukaz `UPDATE`
```sql
UPDATE tabela SET st1 = vr1, st2 = vr2, ...
WHERE stolpec = vrednost AND (pogoj1 OR pogoj2)
<>
>
<
>=
<=
LIKE 'a_b%' -- nize, ki imajo na 1.mestu a in na 3.mestu b
IS [NOT] NULL;
```
V tabeli `oseba` poskusi spremeniti EMŠO v zapisu, ki si ga naredil v nalogi 3. Uporabi ukaz `UPDATE`. Ali ti baza to dovoli? Poskusi spremeniti še kakšno drugo polje v tabeli.
```sql
UPDATE oseba SET emso = '2305939505456'
WHERE emso = '2305939505123'; -- ne gre, ker imamo račun s tem EMŠOm
UPDATE oseba SET ime = priimek, priimek = ime
WHERE emso = '2305939505123'; -- zamenjamo ime in priimek
```
---
### Naloga 5: Ukaz `DELETE`
```sql
DELETE FROM tabela
WHERE pogoj;
```
Iz tabele `transakcija` zbriši eno transakcijo (vseeno katero).
Glej, da ne pobrišeš celotne tabele!
```sql
DELETE FROM transakcija
WHERE id = 8;
```
---
### Naloga 6: Ukaz `SELECT`
```sql
SELECT [DISTINCT] [*], st1, st2, izraz AS novo_ime, ...
FROM tabela1
JOIN tabela2 [ON pogoj | USING (st1, st2, ...)]
WHERE pogoj;
```
Naredi naslednje poizvedbe:
1. Za vse osebe, ki živijo v kraju s poštno številko 2000, izpiši celotne pripadajoče vrstice.
```sql
SELECT * FROM oseba
WHERE posta = 2000;
```
2. Vse osebe v tabeli `oseba`, vendar izpiši samo ime, priimek in poštno številko.
```sql
SELECT ime, priimek, posta FROM oseba;
```
3. Vse transakcije, pri katerih je znesek manjši od -1000.
```sql
SELECT * FROM transakcija
WHERE znesek < -1000;
```
4. Vse transakcije, pri katerih je znesek manjši od -1000. Zneski transakcij naj bodo pri izpisu zaokroženi na najbližjo stotico proti ničli. (Uporabi celoštevilsko deljenje.)
```sql
SELECT *, (znesek / 100) * 100 AS zaokrozen_znesek FROM transakcija
WHERE znesek < -100; -- -100, ker imamo bolj primerne podatke
```
5. Vse osebe v tabeli `oseba`, vendar izpiši samo ime, priimek in ime kraja, v katerem živijo (pomagati si bo treba s tabelo `kraj`).
```sql
SELECT ime, priimek, kraj
FROM oseba JOIN kraj
ON oseba.posta = kraj.posta;
SELECT ime, priimek, kraj
FROM oseba JOIN kraj
USING (posta);
SELECT ime, priimek, kraj
FROM oseba NATURAL JOIN kraj;
```
6. Vse osebe, ki živijo v kraju *Maribor*, pri čemer poštno številko dobiš iz tabele `kraj`.
Nato naredi še bolj komplicirane poizvedbe:
1. Z uporabo funkcije `count` preštej, koliko računov je odprtih na banki.
```sql
SELECT count(*) FROM transakcija;
```
2. Preštej, koliko je oseb, ki živijo v kraju s poštno številko 1000.
```sql
SELECT count(*) FROM oseba
WHERE posta = 1000;
```
3. Z uporabo funkcije `sum` izračunaj, koliko denarja je trenutno v banki (seštej stolpec `znesek` v tabeli `transakcija`).
```sql
SELECT sum(znesek) FROM transakcija;
```
4. Z uporabo funkcije `sum` izračunaj, koliko denarja imaš trenutno na svojem računu.
```sql
SELECT sum(znesek) FROM transakcija
WHERE racun = 100005;
```
5. Izpiši imena in priimke vseh tistih ljudi, ki so naredili vsaj eno transakcijo z absolutno vrednostjo 1000 ali več. Pri izpisu ne podvajaj oseb, ki so opravile več takih transakcij; uporabi določilo `DISTINCT`.
```sql
SELECT DISTINCT ime, priimek FROM oseba
JOIN racun ON lastnik = emso
JOIN transakcija ON racun = stevilka
WHERE abs(znesek) >= 1000;
```
6. Nadgradnja prejšnje naloge: za vsako osebo, ki je opravila vsaj eno transakcijo z absolutno vrednostjo 1000 ali več, izpiši niz *__Ime Priimek__ iz kraja __Kraj__*. Uporabi operator `||` za stikanje nizov.
7. **Dodatna naloga**: Z uporabo funkcij `sum` in `pow` ter ustrezne funkcije, ki izračuna razliko med dvema časoma (poišči jo v dokumentaciji!), izračunaj, koliko denarja imaš trenutno na svojem računu, pri predpostavki, da se obrestuje z 1% na 30 dni. (Obračunavanje pa je zvezno - po enem dnevu in pol recimo profitiraš za faktor 1.01<sup>1.5/30</sup>).