Baze podataka 1

Vežbe 10

DDL Naredbe

DDL (Data Definition Language) komande se koriste za definisanje i upravljanje trukturama podataka u SQL Serveru (tabele, baze podataka, pogledi…). Evo nekoliko osnovnih DDL komandi:

CREATE

Ova komanda se koristi za kreiranje nove strukture. Prvo cemo je iskoristi da kreiramo novu testnu bazu podataka.

CREATE DATABASE [TestDB]

Kako bi SSMS znao da se sledece naredbe koji izvrsavamo odnose bas na ovu bazu, potrebno je da je “iskoristimo”, a to radimo:

USE [TestDB]

Sada cemo kreirati našu prvu tabelu, to radimo isto pomoću naredbe CREATE, ali će poziv biti malo drugačiji. Naime, sada je potrebno i da navedemo strukturu naše tabele, a ne samo naziv:

CREATE TABLE Osoba (
    [Id] INT,
    [Ime] VARCHAR(255),
    [Prezime] VARCHAR(255),
    [GodinaRodjenja] INT
);

Unutar zagrada () potrebno je da navedemo sve kolone koje će imati naša tabela, u formatu naziv tip ograničenje. O samim ograničenjima ćemo posle.

Tipove koje SQL Server podržava možete naći na sledećem linku.

DROP

DROP komanda se koristi za brisanje cele tabele. Komandom će biti obrisana cela tabela i svi podaci u njoj:

DROP TABLE [Studenti];

TRUNCATE

TRUNCATE komanda se koristi za brisanje svih podataka iz tabele.

TRUNCATE TABLE [Studenti];

ALTER

ALTER komanda se koristi za izmenu postojeće tabele. Primer može biti dodavanje novih kolona, ograničenja, brisanje postojećih kolona, izmena… Koristimo je u kombinaciji sa drugim DDL naredbama.

Sa ALTER naredbom možemo dodati novu kolunu u tabelu:

ALTER TABLE Studenti
ADD Email varchar(64) NOT NULL;

Kolonu u tabeli takođe možemo izmeniti:

ALTER TABLE Studenti
ALTER COLUMN Email varchar(255);

Kao i da je obrišemo:

ALTER TABLE Studenti
DROP COLUMN Email;

Ograničenja - Constraints

SQL ograničenja se koriste za definisanje pravila za podatke u tabeli.

Ograničenja se koriste da bi se ograničila vrsta podataka koja može da uđe u tabelu. To osigurava tačnost i pouzdanost podataka u tabeli (biznis logika podataka). Ako postoji bilo kakvo kršenje između ograničenja i akcije podataka, akcija se prekida.

Ograničenja mogu biti na nivou kolone ili na nivou tabele. Ograničenja na nivou kolone se primenjuju na kolonu, a ograničenja na nivou tabele se primenjuju na celu tabelu.

Sledeća ograničenja se često koriste u SQL-u:

Ograničenja se mogu navesti kada se tabela kreira sa naredbom CREATE TABLE, ili nakon što je tabela kreirana sa naredbom ALTER TABLE.

Kreirajmo tabelu iznad ali uz dodata ograničenja.

CREATE TABLE Uloga (
    [Id] INT PRIMARY KEY IDENTITY(1,1),
    [Naziv] VARCHAR(255)
);

CREATE TABLE Osoba (
    [Id] INT PRIMARY KEY IDENTITY(1,1),
    [Ime] VARCHAR(255) NOT NULL,
    [Prezime] VARCHAR(255) NOT NULL,
    [GodinaRodjenja] INT DEFAULT 1970,
	  [JMBG] VARCHAR(14) NOT NULL UNIQUE,
    [UlogaId] INT FOREIGN KEY REFERENCES Uloga([Id])
);

Ograničenja možemo takođe definisati i na sledeći način, posle definisanja kolona.

CREATE TABLE Osoba (
    [Id] INT IDENTITY(1,1),
    [Ime] VARCHAR(255) NOT NULL,
    [Email] VARCHAR(255) NOT NULL,
    [Prezime] VARCHAR(255) NOT NULL,
    [GodinaRodjenja] INT DEFAULT 1970,
    [JMBG] VARCHAR(14) NOT NULL,
    [UlogaId] INT,

    PRIMARY KEY ([Id]),
    UNIQUE ([JMBG]),
    CHECK ([Email] LIKE '%@%'),
    FOREIGN KEY [UlogaId] REFERENCES Uloga([Id])
);

Uz pomoć ALTER naredbe, možemo i da dodajemo ograničenja naknadno posle kreiranja tabele, i to na sledeći način.

ALTER TABLE Osoba
ADD CONSTRAINT PK_Osoba PRIMARY KEY ([Id]);

Kada ograničenja dodajemo prilikom kreiranja tabele, nije potrebno definisati imena, već se ona generišu automatski.

Data Manipulation Language DML

DML naredbe u SQL Serveru se koriste za manipulaciju podacima unutar tabela. To uključuje INSERT, UPDATE i DELETE operacije. Evo detaljnog objašnjenja svake od njih:

INSERT

Koristi se za dodavanje novih redova u tabelu. Postoje različiti načini za izvođenje INSERT naredbi u SQL Serveru, a evo nekoliko primera korišćenja sa tabelom “Studenti”:

INSERT INTO Studenti (Indeks, Upisan, Imes, Mesto, Datr, Ssmer) 
VALUES (1, 2023, 'Marko', 'Beograd', '2000', 1);

Ako zelimo da insertujemo vise redova jod jednom, to radimo ovako.

INSERT INTO Studenti (Indeks, Upisan, Imes, Mesto, Datr, Ssmer) 
VALUES 
(2, 2023, 'Ana', 'Novi Sad', '2001', 2),
(3, 2023, 'Ivan', 'Niš', '2000', 1),
(4, 2023, 'Jelena', 'Kragujevac', '2002', 2);

Ako ne definišemo kolone i njihove pozicije, SQL će zahtevati da unesemo sve vrednosti redom kako su definisani u šemi tabele.

INSERT INTO Studenti
VALUES (1, 2023, 'Marko', 'Beograd', '2000', 1);
-- očekuje sve kolone da budu popunjenje

INSERT INTO Studenti (Imes, Indeks, Upisan) 
VALUES ('Marko', 1, 2023);
-- očekuje samo 3 kolone, i to ne u redosledu definisanom u šemi

UPDATE

Koristi se za ažuriranje postojećih redova u tabeli. Evo nekoliko primera:

UPDATE Studenti 
SET Imes = 'Milica' 
WHERE Indeks = 2;

Moguće je i ažurirati više kolona prilikom update-a:

UPDATE Studenti 
SET
  Mesto = 'Novi Pazar',
  Datr = '2001',
  Indeks = Indeks + 1
WHERE Indeks = 3;

UPDATE će ažurirati sve redove koji ispunjavaju logički uslov definisan u WHERE klauzuli. Ako WHERE nije definisan, svi redovi će biti ažurirani.

DELETE

Koristi se za brisanje postojećih redova iz tabele. Evo nekoliko primera:

Brisanje pojedinačnog reda na osnovu uslova:

DELETE FROM Studenti 
WHERE Upisan = 2005;

Brisanje svih redova u tabeli:

DELETE FROM Studenti 
WHERE Indeks = 1 and Upisan = 2002;

Brisanje više redova na osnovu kompleksnog uslova:

DELETE FROM Studenti 
WHERE Upisan < 2022 AND Ssmer = 2;

Funkcije

U SQL Serveru, funkcije su skupovi instrukcija dizajniranih da izvrše određene zadatke i vrate rezultat. Postoje različite vrste funkcija:

Skalarne funkcije

Napisi mo funkciju koja vraca prosek studenta za prosledjen indeks i godinu upisa:

CREATE FUNCTION prosek(@brojIndeksa INT, @godinaUpisa INT)
RETURNS FLOAT
AS
BEGIN
  DECLARE @p FLOAT = 0

  -- setovanje vrednosti posle declarea
  -- SET @p = 0;

  SELECT @p = avg(ocena * 1.0)
  FROM prijave
  WHERE indeks = @brojIndeksa and upisan = @godinaUpisa

  RETURN @p
END
GO

Funkcije pozivamo ovako:

SELECT prosek(1, 2003);
SELECT Imes, Indeks, Upisan, proesk(Indeks, Upisan) as Prosek
FROM Studenti

Inline Table funkcije

Inline table funkcije u SQL Serveru su vrsta korisnički definisane funkcije koje vraćaju tabelu rezultata kao rezultat. One se mogu koristiti u SQL upitima na isti način kao i bilo koja druga tabela. Glavna razlika između inline table funkcija i drugih tipova funkcija, poput skalarnih funkcija ili višestrukih izjava, jeste ta što inline table funkcije vraćaju tabelu kao rezultat, dok skalarna funkcija vraća samo jednu vrednost, a višestruka izjava može izmeniti više redova.

Kada se inline table funkcija koristi u SQL upitu, rezultat te funkcije se tretira kao da je tabela koja može biti korišćena u daljim operacijama, kao što su filtriranje, spajanje sa drugim tabelama i sl.

Inline table funkcije se definišu koristeći ključnu reč CREATE FUNCTION uz dodatak RETURNS TABLE.

CREATE FUNCTION sviStudentiNaInformatici()
RETURNS TABLE
AS
RETURN 
	SELECT [Indeks], [Upisan], [Imes], [Mesto]
	FROM [Studenti]
	WHERE [Ssmer] IN (
					SELECT [Ssmer]
					FROM [Smer]
					WHERE [Nazivs] LIKE '%Informatika%'
					)
GO

Inline-table funkcije posmatramo kao tabelu, pa je koristimo na sledeći način:

SELECT *
FROM sviStudentiNaInformatici()

TABLE Varijable

Pored klasicnih varijabli, moguce je i kreirati tabelarne varijable, koje se ponasaju isto kao tabele (samo sto fizicki ne psotoje, vec privremeno cuvaju podatke)

DECLARE @tabela TABLE (
  [Indeks] INT,
  [Upisan] INT,
  [Imes] VARCHAR(255),
  [Mesto] VARCHAR(255)
);

Sada, @tabela mozemo posmatrati kao tabelu, i vrsiti sve DML operacije koje mozemo vrsiti nad tabelom.

INSERT INTO @tabela
SELECT *
FROM sviStudentiNaInformatici()

Sada mozemo izvrsiti prikaz promenljive @tabela:

SELECT *
FROM @tabela
Indeks Upisan Imes Mesto
2 2001 Sanja Jagodina
3 2001 Tanja Ćuprija
4 2000 Pavle Batočina
5 2001 Marko Kruševac
5 2002 Sima Paraćin
6 2001 Ivan Užice
15 2002 Ana Užice
18 2003 Saša Jagodina