четвртак, 13. октобар 2016.

Rad sa tabelama u SQL serveru


Kad ste kreirali bazu podataka, prva stvar koju trebate uraditi jeste da dobro razmislite koje informacije vaša baza podataka treba da sadrži i kako te iste informacije treba da budu smeštene u tabele. Vaša sposobnost da umete da prepoznate koje informacije smeštate u bazu podataka, koje ne; neke se mogu preračunati; i kako da ih pravilno rasporedite u tabele da se iste mogu pravilno povezati i koristiti jeste pre svega profesionalnost višegodišnjeg iskustva rada sa bazama podataka. Zato se taj posao u kompanijama ne prepušta bilo kome već profesionalnim administratorima baza podataka. Ali to ne znači da će oni praviti vama tabele kad vam trebaju. Vi kao programer morate da u svako doba dana i noći umete da profesionalno izgradite celu bazu podataka sa svim objektima i da je pravilno povežete da vašom aplikacijom koju programirate. Inače i najmanja nepravilnost u vašoj bazi podataka može izazvati kobne greške, upropastiti sav vaš programerski rad i koštati vas skupo. Zato biti programer bez profesionalnog poznavanja rada sa bazama podataka je isto kao biti spasilac koji ne zna da pliva na bazenu. Još jedna bitna stvar koju treba da razumete jeste da se stroga pravila pri kreiranju svega što se odnosi na baze podataka ne može ignorisati. Već se sva pravila moraju znati i ista primenjivati na najbolji mogući način sa svakim poslovnim segmentom. I ne, nije pitanje šta će administratori baza da rade, ako vi kao programer kreirate i baze podataka; imaju oni posla i kad vaša baza odlično funkcioniše.


( Table ... stavka u meniju SSMS za kreiranje tabele u grafičkom okruženju )


Svaka tabela se sastoji od Columns - kolona i Rows - redova. Ponekad se kolone nazivaju i Fields – polja. Svaka tabela mora imati različito ime od drugih tabela u bazi podataka ali isto tako i svaka kolona u tabeli mora imati različito ime kolone u jednoj tabeli. Možete imati isti naziv kolona ako su oni u različitim tabelama. Svakoj tabeli morate podesiti atribut tipa podataka koji će sadržavati kolona. Jedna kolona može sadržavati samo jedan tip podataka i u tu kolonu se mogu unositi podaci samo koji odgovaraju tom tipu podataka. Tip podataka jednostavno određuje kakvi podaci se mogu zapisati u koloni. Tipovi podataka u SQL-u jesu slični tipovima promenjivima u programskim jezicima ali se neki razlikuju. U SQL-u možete praviti i svoje vlastite tipove podataka iako za takvim nečim nemate potrebe. Pre nego što se upoznate sa tipovima podataka, skoro svakoj tabeli koju kreirate trebate definisati jednu kolonu primarnim ključem ili u većini slučajeva kreirati jednu posebnu; često prvu kolonu; kao posebnu kolonu namenjenu isključivo generisanim celobrojnim brojevima; kolonu koja se sama uvećava za 1 prilikom svakog kreiranja novog reda u tabeli i takvu kolonu označiti primarnim ključem.Vi možete unositi iste podatke u kolonu ukoliko vi sami niste ograničili da podaci u koloni ne mogu imati duplikate, ali to ne možete sa kolonom koju hoćete da zadate primarni ključ. Takvom kolonom, unikatnom; kolonom koja ne može sadržavati prazno polje ili duplikat; kako jednostavno kažemo primarnim ključem vi jednostavno identifikujete red tabele. Vaš primarni ključ mora da bude kratak, stabilan i jednostavan radi što bržeg i lakšeg pretraživanja svih podataka u tabeli. Zato nije dobro rešenje da vam za primarni ključ bude kolona tipa string, već celobrojni pozitivni broj ili kolona tipa UNIQUEINDETIFIER što opet uzima više memorije od tipa Int. Vaša tabela može sadržavati i druge kolone definisane stranim ključem. Čak pored jednog primarnog ključa vi možete imati više kolona definisani stranim ključem ali o stranim ključevima i relacijama tabela će biti više reči u sledećem SQL postu. Za sada je najbitnije da se koncentrišete isključivo na pravljenje tabela i da dobro prostudirate SQL tipove podataka.

Koji su to tipovi podataka u SQL jeziku i za koje podatke se koriste?


Celobrojni tipovi podataka

  • Bigint – brojevi u opsegu od – 263 do 263 – 1 i zauzima 8 bajtova.
  • Int – brojevi u opsegu od – 331 do 231 – 1 i zauzima 4 bajta.
  • SmallInt – brojevi u opsegu od – 315 do 215 – 1 i zauzima 4 bajta.
  • TinyInt – brojevi u opsegu od 0 do 255 i zauzima 1 bajt.
Ne preporučujem da koristite
  • Money – brojevi u opsegu od – 263 do 263 – 1 i zauzima 8 bajtova.
  • SmallMoney – brojevi u opsegu od – 331 do 231 – 1 i zauzima 4 bajta.
Decimalni tipovi podataka
  • Real – brojevi u opsegu od -3,40E+38 do 3,40E+38 preciznosti do 7 cifara i zauzima 4 bajta.
  • Float – brojevi u opsegu od -1,79E+308 do 1,79E+308 preciznosti do 15 cifara i zauzima 8 bajtova.
  • Decimal – brojevi u opsegu od -1038-1 do 1038+1 preciznosti do 7 cifara i zauzima od 2 do 17 bajtova u zavisnosti od zadate preciznosti.
Znakovni tip podataka
  • Char(n) – omogućava upis od 1 do 8000 ne-Uncode znakova stalne dužine, 1 bajt za svaki znak.
  • VarChar(n) – omogućava upis od 1 do 8000 ne-Uncode stringova stalne dužine, 1 bajt za svaki string.
  • Text – omogućava zapisivanje najviše 2 147 483 647 ne-Uncode znakova.
  • NChar(n) – omogućava upis od 1 do 4000 Uncode znakova stalne dužine, 2 bajta za svaki znak.
  • NVarChar(n) – omogućava upis od 1 do 4000 Uncode stringova stalne dužine, 2 bajta za svaki znak.
  • NText – omogućava zapisivanje najviše 1 073 741 823 Uncode znakova.
Datumsko vremenski tipovi podataka
  • SmallDateTime – 4 bajta za datum i vreme od 1 januara 1900 do 6 juna 2079 godine.
  • DateTime – 8 bajtova za datum i vreme od 1 januara 1753 do 31 decembra 9999 godine.
  • DateTime2 – isto kao i DateTime, samo sa većom tačnošću od 100 nanosekundi.
  • Date – 3 bajta za datum od 1 januara 0 do 31 decembra 9999 godine.
  • Time – od 3 do 5 bajtova za vreme od 00 00 00 do 59 59 59.0000000 sati.
  • DateTimeOffSet - od 8 do 10 bajtova za vreme od 00 00 00 do 59 59 59.0000000 sati plus UTC vremenske zone.
Ostali tipovi podataka
  • Binary – omogućava upis od 1 do 8000 bitova u heksadecimalnom obliku gde se veličina povećava za 4 bajta.
  • VarBinary - omogućava upis od 1 do 8000 bitova u heksadecimalnom obliku gde je veličina promenjiva.
  • Bit – omogućava upis 0 ili 1 i zauzima 1 bajt.
  • Image – namenjen za velike binarne objekte poput slika, veličina zavisi ali maksimum je 2 147 483 647 bajtova.
  • TABLE – se koristi za čuvanje rezultata funkcija i kao tip za lokalne promenjive.
  • UNIQUEINDETIFIER – globalno jedinstveni identifikator, 128-bitna generisana vrednost.
  • CURSOR – snima reference za kursor u promenjivoj ili izlazni parametar SAVE procedure.
  • ROWVERSION – označava vrstu kad se promeni vrednost u posmatranoj vrsti.
  • HIERARCHY – je sistemski tip podataka koji predstavlja poziciju u hijerarhiji.
  • XML – može da modeluje podatke koje imaju složenu strukturu
Ne preporučujem da koristite
  • SQLVARIANT – može da sadrži Int, Binary i Char tipove podataka.
Kod rada sa tabelama trebate voditi računa da imate što manje kolona, da koristite najmanji tip podataka, izbegavati tipove fiksne veličine i da sortiranje podataka uvek bude celobrojna vrednost.

Kako se pravi tabela pomoću grafičkog interfejsa SQL Management Studio-a?


Najlakši način da naučite i razumete kako funkcionišu i kako se kreiraju tabele jeste da često kreirate tabele i eksperimentišete. Tabele možete praviti pomoću grafičkog interfejsa SSMS-a ili kodiranjem T-SQL strukturno upitnog jezika. Prvi način je lakši ali drugi će se od vas takođe često tražiti kada budete koristili First Code Entity Approach prilikom kreiranja i povezivanja baza podataka sa entitetima. Zato najbolje da uradimo jedan praktičan primer. 

  • Pokrenite vaš server i ulogujte se na SSMS. Da bi ste kreirali tabelu prvo trebate da kreirate bazu podataka ili da koristite već kreiranu bazu podataka u kojoj hoćete da kreirate vašu tabelu. Zato u SSMS-u Object Explorer-u; kliknite desnim tasterom miša na direktorijum Databases. U meniju kliknite na Create Database… i u formi New Database; samo unesite naziv baze podataka School i pritisnite dugme OK.
  • Kad ste kreirali bazu podataka, u Object Explorer-u proširite direktorijume i u poddirektorijumu Tables; direktorijuma School. Kliknite desnim tasterom miša i u meniju kliknite na stavku Table… ; Otvoriće vam se Design forma koja služi isključivo za dizajniranje tabele. U Design formi, unesite sledeće informacije pod Column Name i Data Type:
               ID_Student          int

               [First Name]        nvarchar(15)

               [Last Name]         nvarchar(25)

               Subject                 varchar(30)

               Marks                   tinyint

  • Prvu kolonu ID_Student smo kreirali da nam predstavlja primarni ključ. Zato kliknite na prvi red desnim tasterom miša i u meniju kliknite na Set Primary Key. Na početku vašeg reda pojaviće vam se ikonica ključa žute boje. To znači da ste definisali kolonu ID_Student za primarni ključ. Međutim, to nije dovoljno. Vi ne želite u toj koloni da unosite brojeve 1, 2, 3 … kad god unosite novog studenta u tabelu već hoćete da kolona bude generisana i da ona upisuje automatski brojeve 1, 2, 3 … u kolonu ID_Student kad god unosite u tabelu novog studenta. Da bi ste to postigli u Column Properties pronađite svojstvo Identity Specification i podesite (IsIndetity) na Yes.
  • Snimite tabelu i nazovite je Students i direktorijum Students će se pojaviti kao podirektorijum direktorijuma Tables. Uvek se trudite da svi nazivi bilo koje vaše tabele bude u množini. Tabela treba da se zove Students - studenti a ne Student – student. Tabele se uvek nazivaju u množini dok se kolone nazivaju u jednini; to je praksa. Ukoliko ne vidite podirektorijum vaše kreirane tabele Students; kliknite na direktorijum Tables, zatim desnim tasterom miša otvorite meni i kliknite na Refrish.
Ukoliko ste sve uradili kako sam ovde naveo; čestitam! Kreirali ste vašu prvu tabelu. Možda se pitate zašto se kolona First Name i Last Name pišu u zagradama [ ]. U praksi se uglavnom naziv kolone piše bez zagrada ali i bez praznog prostora poput FirstName i LastName ali sam ovde to namerno stavio da kada pogledate nazive kolona u tabeli koju smo kreirali vidite čitljivo nazive kolona.


( Prozor Design u SSMS-u koji omogućava modifikaciju tabela u grafičkom okruženju )

Sad kad imate napravljenu tabelu, dodavanje nove kolone tabeli je jednostavno. 
  • Otvorite Design formu desnim klikom na tabelu u Object Explorer-u ili kliknite na direktorijum Columns, zatim New Column… i opet će vam se otvoriti Design forma za modifikovanje vaše tabele. Nazovite je na primer NewColumn.
  • Vašu kolonu možete preimenovati ili preko menija i stavke Rename ili preko Design forme. Promenite ime NewColumn u RenameColumn.      
  • Na isti način možete i obrisati vašu dodatu kolonu, tako što će te u meniju kliknuti na Delete. Zato obrišite kolonu RenameColumn. Ona je stavljena u tabelu samo radi demonstracije dodavanja, preimenovanja i brisanja kolone u tabeli.
  • Međutim, ajde da unesemo neke podatke u našu tabelu. Kliknite desnim tasterom miša na tabelu i u meniju kliknite na Edit Top 200 Rows i unesite sledeće podatke. Kao što vidite kolona u tabeli ID_Student je samo za čitanje, nije dozvoljen upis u nju, nego se ona sama generiše kao što smo već naveli. Zato ovu kolonu preskačemo i u sledeće tri kolone upisujemo podatke; na primer:
             Manuel Radovanović           English                    10

             Bill Gates                             Mathematics            90
  • Usnimite podatke klikom na ikonicu Save u Toolbar-u ili samo zatvorite tabelu. Kad je otvorite ponovo, vaši podaci će biti u tabeli. 
  • Tabela takođe može da se preimenuje. Kliknite desnim tasterom miša na vašu tabelu i u meniju izaberite Rename. Promenite Students u Students2016 i pritisnite na tastaturi ENTER.
  • Ukoliko želite da izbrišete skroz tabelu iz baze podataka, jednostavno kliknite desnim tasterom miša na naziv vaše tabele u direktorijumu Object Explorer-a i u meniju kliknite na Delete. Otvoriće vam se posebna forma Delete Object. Kliknite na Ok i vaša tabela će biti obrisana.
Kako celi ovaj primer od kreiranja do brisanja tabele izgleda; možete pogledati i na video-u


( SQL Tutorial - 8. Create, Rename And Delete The Table Using SSMS )

Kako se pravi tabela pomoću T-SQL-a?

Uradićemo isti prethodni primer; samo što ćemo koristiti T-SQL upitno strukturni jezik. Pokrenite SSMS i kliknite na New Query dugme u ToolBar-u da bi ste otvorili SQL Editor. Ukucajte sledeći kod:

-- Create database
USE master
CREATE DATABASE School
GO

Selektujte navedene komande i kreiraćete School bazu podataka. Zatim ukucajte sledeći kod:

USE School
GO
CREATE TABLE Students
(
       ID_Student int IDENTITY NOT NULL,
       [First Name] nvarchar(15),
       [Last Name] nvarchar(20),
       [Subject] varchar(30),
       Marks tinyint
)
GO

Prethodni kod će kreirati tabelu Student sa kolonama ID studenta, imena, prezimena, predmeta i ocene. Obratite pažnju pošto radimo sa tabelom u kojoj će se unositi podaci na engleskom jeziku. Samo polja za ime i prezime su tipa nvarchar(n) i zato je u ovim kolonama omogućen upis Uncode karaktera da možete koristiti imena na svim jezicima. Ali već za predmetom to nije slučaj, pošto će svi predmeti biti pisani na engleskom jeziku. Znači za tu kolonu koristimo tip varchar(n). Ovaj tip podataka uzima duplo manje bajtova od tipa nvarchar(n) i na taj način ste uradili uspešno optimizaciju kolone predmet. Iz prethodnog primera vam je jasno zašto koristimo zagrade [ ]. Jednostavno da možemo koristiti prazan prostor u nazivu kolone da bi nazivi kolona u tabelama izgledali čitljivije. Ali zašto predmet? Zato što je Subject u T-SQL-u ključna reč i bez zagrada [ ] bi ste dobili grešku prilikom izvršavanja navedenog koda. Selektujete kod i kliknite na Execute. Pogledajte tabelu koju ste kreirali. Kako se dodaje nova kolona na već postojeću tabelu?

- Add column into the table
USE School
GO
ALTER TABLE Students
ADD NewColumn varchar(10)
GO

Kao što vidite u navedenom kodu; vrlo jednostavno. Naredba ALTER TABLE vam dozvoljava da modifikujte tabelu, dok komada ADD će dodati novu kolonu u vašu tabelu. Sledeće pitanje je, kako da promenite ime već nekoj postojećoj koloni? Pokrenite sledeći kod:

-- Rename column into the table
USE School
GO
EXEC sp_rename 'Students.NewColumn','RenameColumn','COLUMN';
GO

Kao što vidite sp_rename nije komanda, već ugrađena SQL funkcija. Funkcije se pokreću naredbom EXEC. S obzirom da se ista funkcija koristi i za promenu imena kod drugih objekata baze podataka, moramo navesti i ime objekta na kom se funkcija izvršava. U ovom slučaju je to kolona. ’COLUMN’ Pogledajte sledeći kod:

-- Delete column into the table
USE School
GO
ALTER TABLE Students
DROP COLUMN RenameColumn
GO

Prethodni kod vam služi za brisanje kolone iz tabele. Za ovu funkcionalnost koristimo naredbu DROP. Inače, T-SQL ne koristimo samo za modifikovanje objekata u bazi podataka, već sa njim možete i da unosite podatke u tabele. Za tu svrhu koristimo naredbu INSERT INTO.

-- Insert data into the table
USE School
GO
INSERT INTO Students
VALUES ('Manuel','Radovanović','English', 90),
       ('Bill','Gates','Mathematics', 10)
GO

Pokrenite navedeni kod da se izvrši, kliknite desnim tasterom na vašu tabelu; zatim u meniju kliknite na Edit Top 200 Rows i videćete da su podaci uneseni i sačuvani u tabeli. Promena imena tabele je takođe jednostavno:

-- Rename table
USE School
GO
EXEC sp_rename 'Students','Students2016'
GO

Kad pokrenete navedeni kod, tabela Students će promeniti ime u Students2016. Brisanje tabele takođe nije komplikovano. Jednostavno koristite naredbu DROP:

-- Delete table
USE School
GO
DROP TABLE Students2016
GO

Kako celi ovaj primer koji smo objasnili funkcioniše; možete pogledati i na video-u:


( SQL Tutorial - 9. Create, Rename And Delete The Table Using T - SQL )