SELECT ImePriimek, Posta, Kraj FROM zaposleni, posta;
Posta?
SELECT ImePriimek, posta.Posta, Kraj FROM zaposleni, posta;
tabela.stolpec.Izberimo samo zapise, kjer se poštni številki ujemata:
SELECT * FROM zaposleni, posta
WHERE zaposleni.Posta = posta.Posta;
Ker smo uporabili *, dobimo vse stolpce iz obeh tabel.
ID |
ImePriimek |
Posta |
Posta |
Kraj |
|---|---|---|---|---|
| MK1 | Miha Kranjc | 1000 | 1000 | Ljubljana |
| MH1 | Maja Hrust | 2000 | 2000 | Maribor |
| LS1 | Lidija Svet | 1000 | 1000 | Ljubljana |
| MK2 | Mitja Kern | 3000 | 3000 | Celje |
Posta dobimo iz obeh tabel!SELECT * FROM zaposleni, posta
WHERE zaposleni.Posta = posta.Posta AND
ID = 'MK1';
WHERE:
zaposleni.Posta = posta.Posta)ID = 'MK1')INNER JOIN)SELECT * FROM zaposleni
INNER JOIN posta
ON zaposleni.Posta = posta.Posta
WHERE ID = 'MK1';
INNER lahko izpustimo.posta), teh vrstic ne bo v izhodu!OUTER JOIN)SELECT * FROM oi
LEFT OUTER JOIN kraj
ON oi.kraj = kraj.kraj;
LEFT [OUTER] JOIN - ohrani vse vrstice iz prve tabeleRIGHT [OUTER] JOIN - ohrani vse vrstice iz druge tabeleFULL [OUTER] JOIN - ohrani vse vrstice iz obeh tabelON ni nikoli izpolnjen, se ohranijo, vrednosti v stolpcih iz druge tabele pa dobijo vrednosti NULL.WHERE se zgodi po stikanju (in lahko izloči prej ohranjene vrstice).ON je lahko poljuben (ne nujno ujemanje po stolpcih)!ON naštejemo stolpce z določilom USING:SELECT * FROM zaposleni
INNER JOIN posta USING (Posta);
NATURAL JOIN:SELECT * FROM oi
NATURAL LEFT OUTER JOIN kraj;
movie(id, title, yr, score, votes, director)actor(id, name)casting(movieid, actorid, ord)movie.actor.casting povezuje igralce in filme.
movie in actor (igralec je igral v več filmih, filmi pa imajo več igralcev)SELECT title FROM movie
JOIN casting ON movie.id = movieid
JOIN actor ON actorid = actor.id
WHERE actor.name = 'John Wayne';
WHERE.
movie.casting, ki imajo vrednost v stolpcu movieid enako vrednosti stolpca id tabele movie.actor, ki imajo vrednost v stolpcu id enako vrednosti stolpca actorid tabele casting.name v tabeli actor enaka John Wayne.casting.
movie.actor.casting.ord).SELECT name FROM movie
JOIN casting ON movie.id = movieid
JOIN actor ON actor.id = actorid
WHERE title = 'Giant' AND
name <> 'James Dean'
ORDER BY ord;
casting se pojavijo vsaj desetkrat z ord = 1.
WHERE ord = 1HAVING COUNT(*) >= 10actor.SELECT name FROM actor
JOIN casting ON actorid = id
WHERE ord = 1
GROUP BY id, name
HAVING COUNT(*) >= 10;
CREATE DATABASE baza;
CREATE TABLE tabela (
stolpec1 tip
[PRIMARY KEY] -- glavni ključ
[NOT NULL] -- prepovedana vrednost NULL
[UNIQUE] -- enolične vrednosti v stolpcu
[CHECK (pogoj)] -- pogoj, ki mora veljati za stolpec
[DEFAULT (vrednost)] -- privzeta vrednost
[REFERENCES druga_tabela(stolpec)], -- tuji ključ
[PRIMARY KEY (st1, st2, ...),] -- glavni ključ iz več stolpcev
[UNIQUE (st1, st2, ...),] -- enolične vrednosti v več stolpcih
[CHECK (pogoj),] -- pogoj, ki vključuje več stolpcev
[FOREIGN KEY (st1, st2, ...) -- tuji ključ iz več stolpcev
REFERENCES druga_tabela(s1, s2, ...),]
...
);
AUTOINCREMENT pri SQLite.integer ipd. - cela številanumeric(p, s), decimal(p, s), real, ... - decimalna številachar(n), varchar(n) - nizi dolžine natanko/največ n znakovtext - poljubno besedilodate - datum v obliki YYYY-MM-DDtime - čas v obliki hh:mm:ssdatetime - datum in čas v obliki YYYY-MM-DD hh:mm:ssPRIMARY KEY (glavni ključ) - stolpec (ali več njih), katerega vrednost enolično določa vrstico.
NULL.NOT NULL - vrednosti v stolpcu morajo obstajati (niso NULL).UNIQUE (enoličnost) - vrednosti v stolpcu (ali več njih) se ne smejo ponavljati.
NULL se lahko pojavi tudi večkrat (če ni prepovedana z NOT NULL)!CHECK - pogoj, ki mora veljati v vsaki vrstici tabele.FOREIGN KEY/REFERENCES - tuji ključ oz. referenca na drugo tabelo.
NULL (če niso prepovedane z NOT NULL).AUTOINCREMENT takoj za PRIMARY KEY pri stolpcu tipa ìnteger.CREATE TABLE kupec (
id_kupec integer PRIMARY KEY AUTOINCREMENT,
uporabnisko_ime text NOT NULL UNIQUE,
ime text NOT NULL,
priimek text NOT NULL,
naslov text,
datum_rojstva date CHECK (datum_rojstva < DATETIME('now', '-18 years')),
-- kupec mora biti starejši od 18 let
CHECK (LENGTH(ime) + LENGTH(priimek) <= 30)
);
CREATE TABLE narocilo (
id_narocilo integer PRIMARY KEY AUTOINCREMENT,
id_kupec integer NOT NULL REFERENCES kupec(id_kupec),
stevilo integer DEFAULT (1),
datum datetime DEFAULT (DATETIME('now'))
);
INSERT INTO tabela [(stolpec1, stolpec2, ...)]
VALUES (vrednost1, vrednost2, ...), ...;
NULL.INSERT INTO tabela [(stolpec1, stolpec2, ...)]
SELECT ...;
SELECT.
SELECT je lahko poljuben (WHERE, JOIN, GROUP BY, WITH, ...).INSERT INTO kupec (uporabnisko_ime, ime, priimek, datum_rojstva)
VALUES ('janez', 'Janez', 'Novak', '1978-03-24'); -- dobi id_kupec = 1
INSERT INTO kupec (uporabnisko_ime, ime, priimek, datum_rojstva)
VALUES ('micka', 'Micka', 'Kovač', '2008-07-11'); -- napaka!
INSERT INTO kupec (uporabnisko_ime, ime, priimek, datum_rojstva)
VALUES ('micka', 'Micka', 'Kovač', '1998-07-11'); -- dobi id_kupec = 2
INSERT INTO narocilo (id_kupec)
SELECT id_kupec FROM kupec
WHERE priimek = 'Novak'; -- ena vrstica, dobi id_narocilo = 1
INSERT INTO narocilo (id_kupec, stevilo)
VALUES (1, 3), (2, 4), (2, 2), (3, 6), (1, 5); -- napaka!
INSERT INTO narocilo (id_kupec, stevilo)
VALUES (1, 3), (2, 4), (2, 2), (1, 5); -- dobijo id_narocilo = 2, 3, 4, 5
UPDATE tabela
SET stolpec1 = vrednost1, stolpec2 = vrednost2, ...
WHERE pogoj;
WHERE določa, katere vrstice bomo spremenili.
SET povemo, kako spremenimo stolpce v izbranih vrsticah.
DELETE FROM tabela
WHERE pogoj;
WHERE, bomo pobrisali vse vrstice!UPDATE narocilo
SET stevilo = stevilo - 1
WHERE id_kupec = 1;
DELETE FROM narocilo
WHERE stevilo < 1;
BEGIN [TRANSACTION];
END [TRANSACTION];
COMMIT;
ROLLBACK;
INSERT/UPDATE/DELETE kot ena transakcija.