Podatkovne baze 1

Podatkovne baze 1 - seminar


SELECT - primer

Ime Priimek Starost Kraj
Janez Slovenec 42 Kranj
Ivan Slovenec 44 Celje
Peter Slovenec 33 Kranj
Miha Slovenski 12 Celje

</span>

SELECT DISTINCT Kraj FROM t;               -- 2 vrstici
SELECT DISTINCT Priimek, Kraj FROM t;      -- 3 vrstice
SELECT DISTINCT Ime, Priimek, Kraj FROM t; -- 4 vrstice
SELECT Kraj FROM t;                        -- 4 vrstice
SELECT Priimek, Kraj FROM t;               -- 4 vrstice
SELECT Ime, Priimek, Kraj FROM t;          -- 4 vrstice

SELECT - dodatki


Enostavna oblika stavka SELECT

SELECT * FROM world;

SELECT name, population FROM world;

SELECT name AS "Ime države" FROM world;

SELECT name AS Ime FROM world
 ORDER BY population DESC;

SELECT DISTINCT continent FROM world;

SELECT 2 FROM world WHERE continent = 'Europe';

SELECT population/area FROM world
 WHERE continent IN ('Europe', 'Asia', 'Africa') AND
       area BETWEEN 100000 AND 1000000;

SELECT name FROM world
 WHERE continent = 'Europe'
 ORDER BY population/area;

</span>


Poizvedbe s podpoizvedbami


Poizvedbe s podpoizvedbami (2)


Poizvedbe s podpoizvedbami (3)

SELECT name FROM world
 WHERE population BETWEEN (
         SELECT population FROM world
          WHERE name = 'Canada'
       ) AND (
         SELECT population FROM world
          WHERE name = 'Algeria'
       );

WITH (2)


Velike države


HAVING


HAVING (2)

</span>


Preverimo


Popravimo


Več tabel


Stikanje

SELECT title FROM movie
  JOIN casting ON movie.id = movieid
  JOIN actor   ON actorid = actor.id
 WHERE actor.name = 'John Wayne';

Igralci v filmu Velikan


Največje zvezde


Glavni igralci


Seznam filmov z Alom Pacinom


Rešitev

SELECT title, name FROM movie
  JOIN casting ON movie.id = movieid
  JOIN actor   ON actor.id = actorid
 WHERE ord = 1 AND
       name <> 'Al Pacino' AND
       movie.id IN (
         SELECT movieid FROM casting
           JOIN actor ON actor.id = actorid
          WHERE actor.name = 'Al Pacino'
    );
 

Vrstni red izvajanja

SELECT [DISTINCT]                       -- 8
    stolpci, združevalne_funkcije       -- 7
  FROM leva_tabela                      -- 1
[LEFT] JOIN                             -- 3
       desna_tabela ON pogoji_stikanja  -- 2
 WHERE vsebinski_pogoji                 -- 4
 GROUP BY ključi_skupin                 -- 5
HAVING pogoji_skupin                    -- 6
 ORDER BY ključi_urejanja               -- 9
 LIMIT število;                         -- 10

Primer

</span>


Poizvedba

SELECT narocnik_id, ime, priimek,
         COUNT(narocilo_id) AS stevilo,
         COALESCE(SUM(kolicina), 0) AS skupna_kolicina
  FROM narocnik
  LEFT OUTER JOIN
       narocilo USING (narocnik_id)
 WHERE priimek = 'Kmetec'
 GROUP BY narocnik_id, ime, priimek
HAVING COALESCE(SUM(kolicina), 0) <= 3
 ORDER BY stevilo;

Stikanje

...
FROM narocnik LEFT OUTER JOIN narocilo USING (narocnik_id)
...

narocnik_id ime priimek narocilo_id kolicina
1 Damjan Kmetec 1 2
1 Damjan Kmetec 2 1
2 Aljaž Kmetec NULL NULL
3 Špela Prezelj 3 1
4 Metka Kmetec 4 4

</span>


Filtriranje

...
WHERE priimek = 'Kmetec'
...

narocnik_id ime priimek narocilo_id kolicina
1 Damjan Kmetec 1 2
1 Damjan Kmetec 2 1
2 Aljaž Kmetec NULL NULL
4 Metka Kmetec 4 4

</span>


Združevanje

...
GROUP BY narocnik_id, ime, priimek
...

narocnik_id ime priimek narocilo_id kolicina
1 Damjan Kmetec 1 2
      2 1
2 Aljaž Kmetec NULL NULL
4 Metka Kmetec 4 4

</span>


Filtriranje skupin

...
HAVING COALESCE(SUM(kolicina), 0) <= 3
...

narocnik_id ime priimek narocilo_id kolicina skupna_kolicina
1 Damjan Kmetec 1 2 3
      2 1  
2 Aljaž Kmetec NULL NULL 0
4 Metka Kmetec 4 4 4

</span>


Izračun stolpcev

SELECT narocnik_id, ime, priimek,
         COUNT(narocilo_id) AS stevilo,
         COALESCE(SUM(kolicina), 0) AS skupna_kolicina
...
narocnik_id ime priimek stevilo skupna_kolicina
1 Damjan Kmetec 2 3
2 Aljaž Kmetec 0 0

Urejanje

...
 ORDER BY stevilo;
narocnik_id ime priimek stevilo skupna_kolicina
2 Aljaž Kmetec 0 0
1 Damjan Kmetec 2 3

Še nekaj primerov


Povprečna ocena in dolžina po žanrih


Filmi z več kot enim režiserjem

SELECT naslov, COUNT(*) AS st_reziserjev
  FROM vloga
  JOIN film ON film = id
 WHERE tip = 'R'
 GROUP BY naslov
HAVING st_reziserjev > 1
 ORDER BY st_reziserjev DESC;

</span>


Romantične komedije


Romantične komedije (2)


Igralec in režiser v istem filmu

SELECT naslov, ime FROM film
  JOIN vloga ON film.id = film
  JOIN oseba ON oseba = oseba.id
 GROUP BY film.id, naslov, oseba.id, ime
HAVING COUNT(*) = 2;

Igralec in režiser v istem filmu (2)

WITH reziser AS (
       SELECT * FROM vloga
        WHERE tip = 'R'
     ),
     igralec AS (
       SELECT * FROM vloga
        WHERE tip = 'I'
     )
SELECT naslov, ime FROM reziser
  JOIN igralec USING (oseba, film)
  JOIN film ON film.id = film
  JOIN oseba ON oseba.id = oseba;

Kaj počne ta poizvedba?

SELECT film.*
  FROM pripada AS prvi
  JOIN pripada AS drugi USING (film)
  JOIN film ON id = film
 WHERE prvi.zanr = 4 AND
       drugi.zanr = 8 AND
       oznaka <> 'R'
 ORDER BY film.glasovi DESC;

Primer ER diagrama - šola

w:1000px


Primer ER diagrama - knjižnica

w:1000px


Primer načrtovanja baze: banka


Konceptualni model

h:500px


Logični model (SQLite)

CREATE TABLE kraj (
  posta    integer PRIMARY KEY,
  kraj     text    NOT NULL
);

CREATE TABLE oseba (
  emso     text    PRIMARY KEY,
  ime      text    NOT NULL,
  priimek  text    NOT NULL,
  ulica    text    NOT NULL,
  posta    integer NOT NULL
             REFERENCES kraj(posta)
);

</span>

CREATE TABLE racun (
  stevilka integer PRIMARY KEY
                   AUTOINCREMENT,
  lastnik  text    NOT NULL
             REFERENCES oseba(emso)
);

CREATE TABLE transakcija (
  id       integer   PRIMARY KEY
                     AUTOINCREMENT,
  racun    integer   NOT NULL
             REFERENCES racun(stevilka),
  znesek   integer   NOT NULL, 
  cas      timestamp NOT NULL
             DEFAULT CURRENT_TIMESTAMP,
  opis     text
);

</span> </span>


Kako deluje internet

</span>


DNS - Domain Name System

</span>


Protokoli in vrata


Kaj se zgodi, ko v brskalnik vtipkamo https://www.google.com/