Skip to content

Commit

Permalink
bp1 10
Browse files Browse the repository at this point in the history
  • Loading branch information
milica222 committed May 7, 2024
1 parent 9e751e1 commit 7d21ad0
Showing 1 changed file with 162 additions and 0 deletions.
162 changes: 162 additions & 0 deletions vezbe/10.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@
- [TRUNCATE](#truncate)
- [ALTER](#alter)
- [Ograničenja - Constraints](#ograničenja---constraints)
- [Data Manipulation Language DML](#data-manipulation-language-dml)
- [INSERT](#insert)
- [UPDATE](#update)
- [DELETE](#delete)
- [Funkcije](#funkcije)
-[Skalarne funkcije](#skalarne-funkcije)
-[Inline Table funkcije](#inline-table-funkcije)

## DDL Naredbe

Expand Down Expand Up @@ -146,3 +153,158 @@ 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":

```sql
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.

```sql
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.

```sql
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:

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

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

```sql
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:

```sql
DELETE FROM Studenti
WHERE Upisan = 2005;
```

Brisanje svih redova u tabeli:

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

Brisanje više redova na osnovu kompleksnog uslova:

```sql
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:

- **Unapred definisane funkcije (Built-in Functions):** Ove funkcije su ugrađene u SQL Server i mogu se koristiti direktno. Na primer, funkcije poput LEN() za pronalaženje dužine niza, SUM() za sumirane, CONCAT() za spajanje stringova, itd.
- **Korisnički definisane funkcije (User-defined Functions):** Korisnici mogu kreirati svoje funkcije kako bi obavili specifične zadatke koji nisu pokriveni unapred definisanim funkcijama. Korisničke funkcije možemo svrstati u:
- **Skalarne funkcije:** Vraćaju jednu skalarnu vrednost (rezultat).
- **Inline-table funkcije:** Vraćaju tabele.

### Skalarne funkcije

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

```sql
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:

```sql
SELECT prosek(1, 2003);
```

```sql
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**.

```sql
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:

```sql
SELECT *
from sviStudentiNaInformatici()
```

0 comments on commit 7d21ad0

Please sign in to comment.