Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.47 KB | None | 0 0
  1. -- CAS 01 -- DDL
  2.  
  3. --CREATE
  4. --DROP
  5. --ALTER
  6.  
  7.  
  8. --CREATE TABLE
  9. --explicitno
  10. --implicitno(automatski) --select into
  11.  
  12.  
  13. --CREATE TABLE schema_name.naziv_tabele
  14. --(naziv_obelezja data_type(size) oganicenje,
  15. -- naziv_obelezja1,
  16. -- naziv_obelezja2,
  17. -- ogranicenje
  18. --);
  19.  
  20. --database schema
  21. CREATE SCHEMA Production AUTHORIZATION dbo
  22. go
  23.  
  24. DROP SCHEMA Production;
  25.  
  26. CREATE TABLE Production.Categories
  27. (
  28. categoryid INT NOT NULL,
  29. categoryname NVARCHAR(15) NOT NULL,
  30. description NVARCHAR(200) NOT NULL
  31. )
  32. GO
  33.  
  34. --DROP TABLE
  35. DROP TABLE Production.Categories
  36. GO
  37.  
  38. --naming tables and columns
  39.  
  40. --regular
  41. --delimited
  42.  
  43. --SET QUOTED_IDENTIFIER
  44.  
  45. SET QUOTED_IDENTIFIER ON --default
  46.  
  47. CREATE TABLE "Tomorrow's Schedule"
  48. ( id int)
  49.  
  50. DROP TABLE [Tomorrow's Schedule]
  51.  
  52. SET QUOTED_IDENTIFIER OFF
  53.  
  54. CREATE TABLE "Tomorrow's Schedule"
  55. ( id int)
  56.  
  57. SET QUOTED_IDENTIFIER ON;--vratiti na default
  58.  
  59. --NULL
  60.  
  61. CREATE TABLE Production.Categories(
  62. categoryid INT NOT NULL,
  63. categoryname NVARCHAR(15) NOT NULL,
  64. description NVARCHAR(200) NOT NULL);
  65. GO
  66.  
  67. --select into
  68. SELECT mbr, prz, ime
  69. INTO radnik2
  70. FROM hr2016.dbo.radnik
  71. GO
  72.  
  73. select *
  74. from radnik2
  75.  
  76.  
  77. drop table radnik2
  78. GO
  79.  
  80. --zadatak
  81. --1. Napraviti tabelu Projekat2 u kojoj ce
  82. --biti svi radnici(njihov maticni broj, ime i prezime)
  83. --koji rade na projektu sa sifrom 2.
  84. select radnik.*
  85. into Projekat2
  86. from hr2016.dbo.radnik
  87. inner join hr2016.dbo.radproj on radnik.mbr=radproj.mbr
  88. where spr=2
  89.  
  90. select *
  91. from Projekat2
  92.  
  93.  
  94. --pregled svih sema
  95.  
  96. SELECT name FROM sys.schemas
  97.  
  98. /*Kreirati shemu Test i u okviru nje tabelu Test1
  99. koja ima sledeca obelezja test_id tipa INT,
  100. test_ime tipa NVARCHAR velicine 15, i opis tipa
  101. NVARCHAR velicine 200. Ni jedno od obelezja ne sme
  102. da dozvoli NULL.*/
  103. CREATE SCHEMA Test
  104. GO
  105. CREATE TABLE Test.Test1(
  106. test_id int NOT NULL,
  107. test_ime nvarchar(15) NOT NULL,
  108. opis nvarchar(200) NOT NULL,
  109. )
  110.  
  111.  
  112. /*Kreirati novu tabelu Test2 u okviru sheme Test koja
  113. ima samo obelezje test_id tipa int, ne dozvoljava
  114. NULL vrednosti.*/
  115. CREATE TABLE Test.Test2(
  116. test_id int NOT NULL,
  117. )
  118.  
  119. --ALTER TABLE
  120. --dodavanje kolona
  121. --brisanje kolona
  122. --izmena definicije kolone
  123. --tipa podatka
  124. --velicinu tipa kolone
  125.  
  126. --ALTER TABLE schema_name.table_name
  127. -- ADD column_name type(size) NOT NULL;
  128.  
  129. /*Dodati u tabelu Test2 obelezje test_ime
  130. tipa NVARCHAR(15)
  131. koje ima ogranicenje NOT NULL */
  132.  
  133. ALTER TABLE Test.Test2
  134. ADD test_ime NVARCHAR(15) NOT NULL;
  135. GO
  136.  
  137. /*Dodati i obelezje opis koje ima iste
  138. karakteristike kao i u Test1.*/
  139. ALTER TABLE Test.Test2
  140. ADD opis NVARCHAR(15) NOT NULL;
  141. GO
  142.  
  143. /*Uneti jednu torku u tabelu Test1.*/
  144. INSERT INTO Test.Test1 values(1,'Novo', 'Opis imena');
  145.  
  146. /*Uneti te iste podatke u tabelu Test2,
  147. tako sto prvo treba seletovati podatke
  148. iz tabele Test1 i te iste upisati u Test2.*/
  149.  
  150. INSERT INTO Test.Test2 (test_id, test_ime, opis)
  151. SELECT test_id, test_ime, opis
  152. FROM Test.Test1
  153. GO
  154.  
  155. --work with NULL columns
  156.  
  157. INSERT INTO Test.Test2 values (2, 'Novo ime', 'Opis novog imena');
  158.  
  159. select *
  160. from Test.Test2
  161.  
  162. ALTER TABLE Test.Test2
  163. ALTER COLUMN opis NVARCHAR(500);
  164. GO
  165.  
  166. SELECT opis
  167. FROM Test.Test2;
  168.  
  169. UPDATE Test.Test2
  170. SET opis = NULL
  171. WHERE test_id=1;
  172.  
  173.  
  174. ALTER TABLE Test.Test2
  175. ALTER COLUMN opis NVARCHAR(500) NULL;
  176.  
  177.  
  178. UPDATE Test.Test2
  179. SET opis = NULL
  180. WHERE test_id=1;
  181.  
  182. ALTER TABLE Test.Test2
  183. ALTER COLUMN opis NVARCHAR(500) NOT NULL;
  184.  
  185. UPDATE Test.Test2
  186. SET opis = 'Opis'
  187. WHERE test_id=1;
  188.  
  189. ALTER TABLE Test.Test2
  190. ALTER COLUMN opis NVARCHAR(500) NOT NULL;
  191.  
  192. SELECT opis
  193. FROM Test.Test2;
  194.  
  195. /*2.Modifikovati tabelu Projekat2 ubacivanjem
  196. još jedne kolone za obeležje datum,
  197. koje predstavlja datum angažovanja.
  198. Tip obeležja je DATE.*/
  199. select *
  200. from Projekat2;
  201.  
  202. ALTER TABLE projekat2
  203. ADD datum DATE;
  204.  
  205. select *
  206. from Projekat2;
  207.  
  208. --Brisanje postojecih kolona
  209. ALTER TABLE projekat2
  210. DROP COLUMN datum;
  211.  
  212. select *
  213. from Projekat2;
  214.  
  215. /*Uraditi sledeće modifikacije na tabeli Projekat2:
  216. a) dodati kolonu adresa sa tipom podataka
  217. VARCHAR dužine 12,
  218. b) promeniti tip kolone adresa u tip
  219. podataka VARCHAR dužine 30,
  220. c) obrisati kolonu adresa iz tabele.
  221. */
  222.  
  223. ALTER TABLE Projekat2
  224. ADD adresa VARCHAR(12)
  225.  
  226. ALTER TABLE Projekat2
  227. ALTER COLUMN adresa VARCHAR(30)
  228.  
  229. ALTER TABLE Projekat2
  230. DROP COLUMN adresa
  231.  
  232. --Promena naziva objekta
  233. sp_rename 'Projekat2','Projekat2Nova';
  234.  
  235. select *
  236. from Projekat2Nova;
  237.  
  238. sp_rename 'Projekat2Nova','Projekat2';
  239.  
  240. --Promena naziva kolone
  241. sp_rename 'Projekat2.datum','datumNovi';
  242.  
  243. select *
  244. from Projekat2;
  245.  
  246.  
  247. --TRUNCATE TABLE
  248. select * from Projekat2;
  249.  
  250. TRUNCATE TABLE Projekat2;
  251.  
  252. select * from Projekat2;
  253.  
  254. --instrukcije za pisanje cistog koda
  255. SELECT OBJECT_ID('Sales.Customer', 'U');
  256. GO
  257.  
  258. SELECT OBJECT_ID('Test.Test1', 'U');
  259. GO
  260.  
  261. SELECT OBJECT_ID('Radnik', 'U');
  262. GO
  263.  
  264. IF OBJECT_ID('Test.Test2', 'U') IS NOT NULL
  265. DROP TABLE Test.Test2;
  266. GO
  267.  
  268. -- RECNIK PODATAKA
  269.  
  270. SELECT *
  271. FROM sys.all_objects
  272. WHERE type='U'
  273. GO
  274.  
  275. SELECT *
  276. FROM sys.tables
  277. GO
  278.  
  279. --DESCRIBE TABLE
  280. exec sp_columns radnik
  281.  
  282. SELECT *
  283. FROM INFORMATION_SCHEMA.COLUMNS
  284. Where TABLE_NAME = 'radnik'
  285.  
  286. ----------------------------------------------------------------------------------------------------
  287. -- CAS 02 -- DDL: Integritet podataka
  288.  
  289.  
  290. /******* Ogranicnje primarnog kljuca ******/
  291. --koristite bazu [it<br_indeksa>g<godina>] ne [Test]
  292. use [Test]
  293.  
  294. create schema Test
  295.  
  296. CREATE TABLE Test.Kategorije(
  297. id_kategorije int PRIMARY KEY, --kreiranje pri definiciji kolone
  298. naziv_kategorije varchar(30),
  299. opis_kategorije varchar(500)
  300. );
  301.  
  302. DROP TABLE Test.Kategorije;
  303.  
  304. CREATE TABLE Test.Kategorije(
  305. id_kategorije int,
  306. naziv_kategorije varchar(30),
  307. opis_kategorije varchar(500),
  308. CONSTRAINT PK_Kategorije_id_kategorije PRIMARY KEY(id_kategorije)--kreiranje sa CONSTRAINT
  309. );
  310.  
  311. --unos podataka kako bi testirali ogranicenje PRIMARY KEY
  312. insert into Test.Kategorije values (1,'kategorija1', 'opis kategorije 1');
  313. insert into Test.Kategorije values (2,'kategorija2', 'opis kategorije 1');
  314. insert into Test.Kategorije values (3,'kategorija3', 'opis kategorije 3');
  315. insert into Test.Kategorije values (4,'kategorija4', 'opis kategorije 4');
  316. insert into Test.Kategorije values (4,'kategorija44', 'opis kategorije 44');
  317. insert into Test.Kategorije values (NULL,'kategorijaNULL', 'opis kategorije NULL');
  318.  
  319.  
  320. select * from Test.Kategorije --proveravamo sta je upisano
  321.  
  322. drop table Test.Kategorije --pre svakog novog kreiranja brisemo tabelu
  323.  
  324. --kreiranje tabele bez ogranicenja PK
  325. CREATE TABLE Test.Kategorije(
  326. id_kategorije int not null, --moramo da dodamo not null ako zelimo kasnije da dodamo PK kroz ALTER TABLE
  327. naziv_kategorije varchar(30),
  328. opis_kategorije varchar(500)
  329. );
  330.  
  331. insert into Test.Kategorije values (1,'kategorija1', 'opis kategorije 1');
  332. insert into Test.Kategorije values (2,'kategorija1', 'opis kategorije 1');
  333. insert into Test.Kategorije values (2,'kategorija1', 'opis kategorije 1');
  334.  
  335. -- naknadno dodavanje PK ogranicenje kroz ALTER TABLE
  336. --obratiti paznju na not null(pukasati bez not null--videti gresku)
  337. ALTER TABLE Test.Kategorije
  338. ADD CONSTRAINT PK_Kategorije_id_kategorije PRIMARY KEY(id_kategorije);
  339. GO
  340.  
  341. --brisemo podatke iz tabele
  342. truncate table Test.Kategorije
  343.  
  344. --proveravamo podatke u tabeli
  345. select * from Test.Kategorije
  346.  
  347. --brisemo citavu tabelu
  348. drop table Test.Kategorije
  349.  
  350. --kreiranje slozenog kljuca
  351. CREATE TABLE Test.Kategorije(
  352. id_kategorije int,
  353. id_kategorije_novi int,
  354. naziv_kategorije varchar(30),
  355. opis_kategorije varchar(500),
  356. CONSTRAINT PK_Kategorije_id PRIMARY KEY (id_kategorije, id_kategorije_novi)
  357. );
  358.  
  359. --unos vrednosti u tabelu kako bi proverili ogranicenje slozenog kljuca
  360. insert into Test.Kategorije values (1,1,'kategorija1', 'opis kategorije 1');
  361. select * from Test.Kategorije
  362.  
  363. insert into Test.Kategorije values (2,2,'kategorija2', 'opis kategorije 2');
  364. insert into Test.Kategorije values (2,2,'kategorija1', 'opis kategorije 1');
  365. insert into Test.Kategorije values (1,2,'kategorija12', 'opis kategorije 12');
  366.  
  367. -- Iscitavanja PK ogranicenje iz recnika podataka
  368.  
  369. SELECT *
  370. FROM sys.key_constraints
  371. where type='PK';
  372.  
  373. /******* Unique ogranicenjev ********/
  374. drop table Test.Kategorije
  375.  
  376. CREATE TABLE Test.Kategorije(
  377. id_kategorije int,
  378. naziv_kategorije varchar(30),
  379. opis_kategorije varchar(500)
  380. );
  381.  
  382. insert into Test.Kategorije values (1,'kategorija1', 'opis kategorije 1');
  383.  
  384. insert into Test.Kategorije values (1,'kategorija2', 'opis kategorije 1');
  385.  
  386. insert into Test.Kategorije values (2,'kategorija1', 'opis kategorije 1');
  387.  
  388. insert into Test.Kategorije values (3,null, 'opis kategorije 3');
  389.  
  390. ALTER TABLE Test.Kategorije
  391. ADD CONSTRAINT UQ_ Kategorije_naziv_kategorije UNIQUE(naziv_kategorije);
  392. GO
  393.  
  394. SELECT * FROM Test.Kategorije
  395.  
  396. -- DEFAULT "ogranicenje"
  397.  
  398. drop table Test.Kategorije
  399.  
  400. CREATE TABLE Test.Kategorije(
  401. id_kategorije int,
  402. naziv_kategorije varchar(30),
  403. opis_kategorije varchar(500),
  404. velicina_kategorije int DEFAULT (0)
  405. );
  406.  
  407. insert into Test.Kategorije values (1,'kategorija1', 'opis kategorije 1', 5);
  408. insert into Test.Kategorije(id_kategorije,naziv_kategorije,opis_kategorije)
  409. values (1,'kategorija1', 'opis kategorije 1');
  410. insert into Test.Kategorije(id_kategorije,naziv_kategorije,opis_kategorije,velicina_kategorije)
  411. values (1,'kategorija1', 'opis kategorije 1',10);
  412.  
  413. select * from Test.Kategorije
  414.  
  415. select * from Test.Proizvod
  416.  
  417. delete from Test.Kategorija
  418. where id_kategorije=3;
  419.  
  420.  
  421. SELECT *
  422. FROM sys.default_constraints
  423.  
  424. -- Check ogranicenje
  425. drop table Test.Kategorije
  426.  
  427. CREATE TABLE Test.Kategorije(
  428. id_kategorije int,
  429. naziv_kategorije varchar(30),
  430. opis_kategorije varchar(500),
  431. oznaka_kategorije varchar(1),
  432. velicina_kategorije int DEFAULT (0),
  433. CONSTRAINT PK_Kategorije_id_kategorije PRIMARY KEY (id_kategorije),
  434. CONSTRAINT UQ_Kategorije_naziv_kategorije UNIQUE (naziv_kategorije)
  435. );
  436.  
  437. ALTER TABLE Test.Kategorije
  438. ADD CONSTRAINT CHK_Kategorije_oznaka_kategorije CHECK (oznaka_kategorije>0);
  439. GO
  440.  
  441. insert into Test.Kategorije values (1,'kategorija1', 'opis kategorije 1', 5);
  442.  
  443. insert into Test.Kategorije(id_kategorije,naziv_kategorije,opis_kategorije, oznaka_kategorije)
  444. values (2,'kategorija2', 'opis kategorije 2','1');
  445.  
  446. insert into Test.Kategorije(id_kategorije,naziv_kategorije,opis_kategorije, oznaka_kategorije)
  447. values (3,'kategorija3', 'opis kategorije 3','1');
  448.  
  449. SELECT * FROM Test.Kategorije
  450.  
  451. --PRIMER CHECK OGRANICENJA
  452. --Dodati ogranicenje za pol, da moze da ima
  453. --samo vrednosti M i Z
  454. create table student
  455. (
  456. id int,
  457. ime char(20),
  458. pol char(30),
  459. CONSTRAINT CHK_Student_Pol check (pol in ('M','Z'))
  460. );
  461.  
  462. insert into student
  463. values (1, 'Dajana', 'Z');
  464.  
  465. insert into student
  466. values (2, 'Stefan', 'M');
  467.  
  468. insert into student
  469. values (3, 'Vanja', null);
  470.  
  471. insert into student
  472. values (4, 'Ana', 'm');
  473.  
  474. select * from student
  475.  
  476. --ispraviti prethodni primer i dozvoliti da mogu
  477. --da se unesu vrednosti koje su velika slova 'M' 'Z'
  478.  
  479. --PRIMER2 CHECK OGRANICENJA
  480. create table person
  481. (
  482. person_id int primary key,
  483. mobile_phone numeric(13),
  484. phone numeric(13),
  485. CONSTRAINT CK_Phone_Number CHECK (mobile_phone is not null or phone is not null)
  486. );
  487.  
  488. insert into person values (1,null,022732233);
  489. insert into person values (2,066254965,null);
  490. insert into person values (3,066258965,022732233);
  491. insert into person values (4,null,null);
  492.  
  493. select *
  494. from person;
  495.  
  496. /****** Ogranicenje spoljnog/stranog kljuca ******/
  497.  
  498. CREATE TABLE Test.Proizvod(
  499. id_proizvoda int,
  500. naziv_proizvoda varchar(30),
  501. opis_proizvoda varchar(500),
  502. cena int,
  503. id_kategorije int,
  504. CONSTRAINT PK_id_proizvoda PRIMARY KEY (id_proizvoda),
  505. CONSTRAINT FK_Proizvod_Kategorija FOREIGN KEY (id_kategorije)
  506. REFERENCES Test.Kategorije(id_kategorije)--on delete set null
  507. --on delete cascade
  508. );
  509.  
  510. select * from Test.Kategorije
  511.  
  512. insert into Test.Proizvod values (1, 'cokolada', 'mlecna cokolada', 50, 1)
  513. insert into Test.Proizvod values (2, 'cips', 'cips sa ukusom soli', 20, 2)
  514. insert into Test.Proizvod values (3, 'sok', 'sok od limuna', 10, 4)
  515. insert into Test.Proizvod values (3, 'sok', 'sok od limuna', 10, null)
  516.  
  517. select * from Test.Proizvod
  518.  
  519. SELECT *
  520. FROM sys.foreign_keys
  521. WHERE name = 'FK_Products_Categories';
  522.  
  523.  
  524. --TABELE KOJE SE MEDJUSOBNO REFERENCIRAJU
  525. --Napisati script koji ce omoguciti kreiranje
  526. --tabele koka koja ima obelezja kokaID i jajeID,
  527. --kao i tabele jaje koja ima obelezja jajeID i kokaID
  528. --sa ogranicenjima referencijalnih integriteta gde
  529. --jaje referencira koku, a koka jaje.
  530. CREATE TABLE koka
  531. (
  532. kokaID INT PRIMARY KEY,
  533. jajeID INT,
  534. CONSTRAINT FC_KOKA_JAJE FOREIGN KEY (jajeID)
  535. REFERENCES jaje (jajeID)
  536. );
  537. CREATE TABLE jaje
  538. (
  539. jajeID INT PRIMARY KEY,
  540. kokaID INT,
  541. CONSTRAINT FC_JAJE_KOKA FOREIGN KEY (kokaID)
  542. REFERENCES koka (kokaID)
  543. );
  544. CREATE TABLE koka
  545. (
  546. kokaID INT PRIMARY KEY,
  547. jajeID INT
  548. );
  549. CREATE TABLE jaje
  550. (
  551. jajeID INT PRIMARY KEY,
  552. kokaID INT
  553. );
  554. ALTER TABLE koka ADD CONSTRAINT FC_KOKA_JAJE
  555. FOREIGN KEY (jajeID) REFERENCES jaje (jajeID);
  556.  
  557. ALTER TABLE jaje ADD CONSTRAINT FC_JAJE_KOKA
  558. FOREIGN KEY (kokaID) REFERENCES koka (kokaID);
  559.  
  560.  
  561.  
  562. INSERT INTO koka VALUES(3, 4);
  563. INSERT INTO jaje VALUES(4, 3);
  564. go
  565.  
  566.  
  567. ALTER TABLE koka
  568. NOCHECK CONSTRAINT FC_KOKA_JAJE;
  569. GO
  570. ALTER TABLE jaje
  571. NOCHECK CONSTRAINT FC_JAJE_KOKA;
  572. GO
  573.  
  574. INSERT INTO koka VALUES(1, 2);
  575. INSERT INTO jaje VALUES(2, 1);
  576.  
  577. ALTER TABLE koka
  578. CHECK CONSTRAINT FC_KOKA_JAJE;
  579. GO
  580. ALTER TABLE jaje
  581. CHECK CONSTRAINT FC_JAJE_KOKA;
  582. GO
  583.  
  584. ALTER TABLE koka
  585. DROP CONSTRAINT FC_KOKA_JAJE;
  586.  
  587. ALTER TABLE jaje
  588. DROP CONSTRAINT FC_JAJE_KOKA;
  589.  
  590. drop table koka;
  591. drop table jaje;
  592. ----------------------------------------------------------------------------------------------------
  593. /*
  594. TIPOVI PROMENLJIVIH i KONVERZIJA TIPOVA
  595. */
  596. /*
  597. TIPOVI PODATAKA
  598. */
  599. --EXACT NUMBER int, numeric
  600. --CHARACTER STRING char, varchar
  601. --UNICODE CHARACTER STRING nchar, nvarchar
  602. --APROXIMATE NUMERIC float, real
  603. --float truble
  604. declare @f as float = '29545428.022495';
  605. select cast(@f as numeric(28,14)) as value;
  606. --rezultat nije isti kao ulazna vrednost
  607. --BINARY STRING binary, varbinary
  608. --DATE AND TIME date, time, datetime2, smalldatetime, datetime, datetimeoffset
  609. --others...
  610.  
  611. --prezime --razlika izmedju char i varchar
  612. char(30);
  613. varchar(30);
  614. /*
  615. KONVERZIJA TIPOVA
  616. CAST, CONVERTE, PARSE -- TRY_CAST, TRY_CONVERTE, TRY_PARSE
  617. */
  618. --cast ima izraz i ciljani tip
  619. --primer
  620. SELECT CAST(123 AS int);
  621. SELECT CAST('abc' AS int);
  622. SELECT TRY_CAST('abc' AS int);
  623.  
  624. --razlika između cast i try_cast
  625. SELECT CAST('abc' AS int);
  626. SELECT TRY_CAST('abc' AS int);--vraca null ukoliko ne može da izvrši konvertovanje
  627.  
  628. SELECT CAST('02-21-2019' AS date);
  629. SELECT TRY_CAST('21-02-2019' AS date);
  630.  
  631. --convert ima i treci argument koji predstavlja stil
  632. --primer
  633. SELECT CONVERT(date, '21-02-2019', 105); -- 105: dd-mm-yyyy
  634.  
  635. --razlika CONVERT and TRY_CONVERT
  636. SELECT CONVERT(date, '21-02-2019', 101); -- 101: mm/dd/yyyy
  637. SELECT TRY_CONVERT(date, '21-02-2019', 101); -- 101: mm/dd/yyyy
  638.  
  639. SELECT CONVERT(date, '1/2/2019', 101);
  640. SELECT CONVERT(date, '21/2/2019', 101);
  641.  
  642. --parse definiše i kulturu
  643. --primer
  644. SELECT PARSE('1/2/2019' AS DATE USING 'en-US');
  645.  
  646. --literal of a type
  647. SELECT CAST(N'123' AS int);--from Unicode charecter strings
  648. SELECT CAST('123' AS int);--regular character strings
  649.  
  650. --KONVERZIJA /
  651. --isti tipovi
  652. --implicitna konverzija
  653. declare @string char;
  654. set @string='1';
  655. declare @string1 char;
  656. set @string1='1';
  657. select @string+@string1;
  658.  
  659. --KONVERZIJA +
  660. --razliciti tipovi
  661. --implicitna konverzija
  662. declare @int int;
  663. set @int='1';
  664. declare @string1 char;
  665. set @string1='1';
  666. select @int + @string1;
  667.  
  668. declare @int3 int;
  669. set @int3='5';
  670. declare @numeric numeric;
  671. set @numeric='2';
  672. select @int3 / @numeric;
  673.  
  674. --RAD SA TIPOVIMA PODATAKA
  675. /*
  676. DATE AND TIME FUNCTION
  677. */
  678. --CURENT DATA and TIME
  679. -- Iscitavanje trenutnog vremena i datuma
  680. select GETDATE() as Datum; --datetime type
  681. go
  682. select CURRENT_TIMESTAMP as Trenutak; --standardna i preporucuje se za koriscenje
  683. go
  684. select SYSDATETIME(); --SYSDATETIME vraca DATETIME2, veca preciznost
  685. go
  686.  
  687. -- Ni jedna od ovih funkcija ne vraca samo datum ili vreme
  688.  
  689. -- Iscitavanjae samo datuma
  690. select CAST(GETDATE() as DATE);
  691. go
  692. -- Iscitavanje samo vremena
  693. select CAST(GETDATE() as TIME);
  694. go
  695.  
  696. -- DATE i TIME delovi
  697. -- DATEPART funkcija, vraca integer DATEPART(deo, date), drugi parametar mora biti tip podatka date
  698. -- oznake delova su: year, month, day
  699. select DATEPART(year,'11-10-2019'); --select DATEPART(year,'11/10/2017'); --select DATEPART(year,'11102017');
  700. go
  701. select DATEPART(month,'11-10-2019');
  702. go
  703. select DATEPART(day,'11-10-2019');
  704. go
  705.  
  706. -- Funkcija DATENAME() vraca ime dela kao string
  707. select DATENAME(month,'11-10-2019');
  708. go
  709.  
  710. -- dw = day of week
  711. select DATENAME(dw,'11-10-2019');
  712. go
  713.  
  714. --zavisi od jezika u sesiji
  715. --SET LANGUAGE { [ N ] 'language' | @language_var }
  716. SET LANGUAGE Italian;
  717. go
  718.  
  719. --vracamo na engleski
  720. SET LANGUAGE us_english;
  721. go
  722.  
  723. --kreiranje datuma od brojeva
  724. --DATEFROMPARTS(2012,02,12) vraca date
  725. SELECT DATEFROMPARTS(2019,02,13);
  726. go
  727.  
  728. -- Koliko dana ima mesec? EOMONTH()
  729. --funkcija vraca poslednji dan u mesecu
  730. select EOMONTH('02-02-2019');
  731. go
  732.  
  733. --ADD I DIFF
  734. -- Aritmetika sa datumima. DATEADD()
  735. --funkcija dodaje celi broj delova datuma na ulazni datum
  736. select DATEADD(year,2,'02-02-2019');
  737. go
  738. select DATEADD(month,14,'02-02-2019');
  739. go
  740.  
  741. -- DATEDIFF() funkijca vraca razliku izmedju dva datuma
  742. -- broj dana
  743. select DATEDIFF(day,'02-02-2019','01-01-2018');
  744. go
  745. select DATEDIFF(day,'02-02-2018','01-01-2019');
  746. go
  747. -- broj meseci
  748. select DATEDIFF(month,'02-02-2018','01-01-2019');
  749. go
  750. select DATEDIFF(month,'20180202','20190101'); --kada prosledjujemo drugaciji format datuma
  751. go
  752. -- broj godina
  753. select DATEDIFF(year,'02-02-2018','01-01-2019');
  754. go
  755.  
  756. --kod broja godina treba biti pazljiv jer prebrajamo samo godine
  757. select DATEDIFF(year,'20111231','20120101');
  758. go
  759. select DATEDIFF(year,'12-31-2011','02-01-2012');
  760. go
  761.  
  762. -- Funkcije za rad sa karakterima
  763. -- KONKATENACIJA stringova moguca je
  764. --koriscenjem + operatora ili CONCAT() funkcije
  765.  
  766. select mbr, nar, nar + N' ' + ime + N' ' + nap
  767. + N'. ' + prz as "pun naziv"
  768. from radnik
  769. left join projekat on radnik.mbr=projekat.ruk;
  770. go
  771.  
  772. -- + operator vraca NULL marker ako je jedan od stringova NULL
  773. --standardno ponasanje koje je moguce promeniti
  774. PRINT 'Setting CONCAT_NULL_YIELDS_NULL ON';
  775. GO
  776.  
  777. -- SET CONCAT_NULL_YIELDS_NULL ON and testing.
  778. SET CONCAT_NULL_YIELDS_NULL ON;
  779. GO
  780.  
  781. SELECT 'abc' + NULL ;
  782. GO
  783.  
  784. -- SET CONCAT_NULL_YIELDS_NULL OFF and testing.
  785. SET CONCAT_NULL_YIELDS_NULL OFF;
  786. GO
  787. SELECT 'abc' + NULL;
  788. GO
  789. --vratiti na pocetno stanje--default
  790. SET CONCAT_NULL_YIELDS_NULL ON;
  791. GO
  792.  
  793.  
  794. -- koristiti COALESCE() funkciju koja menja NULL marker sa onim sto prosledimo kao drugi parametar
  795. select mbr, nar,
  796. COALESCE(nar,'') + N' ' + ime + N' ' + COALESCE(nap,'nap') + N'. ' + prz as "pun naziv"
  797. from radnik
  798. left join projekat on radnik.mbr=projekat.ruk;
  799. go
  800.  
  801. -- Upotreba CONCAT() funkcije
  802. select mbr, nar,
  803. CONCAT(nar, ' ', ime, ' ', nap, '. ', prz) as "pun naziv"
  804. from radnik
  805. left join projekat on radnik.mbr=projekat.ruk;
  806. go
  807. -- CONCAT() funkcija zamenjuje NULL marker sa praznim stringom, za raliku od + operatora
  808.  
  809. -- Podstringovi
  810. -- SUBSTRING()funkcija izdvaja podstring od pocetne pozicije sa zadatom duzinom
  811. select SUBSTRING('abcde',2,4);
  812. go
  813. select SUBSTRING('abcde',2,6);
  814. go
  815.  
  816. -- alternativno mogu se koristiti LEFT() i RIGHT() funkcije
  817. select LEFT('abcde',2);
  818. go
  819. select RIGHT('abcde',2);
  820. go
  821. select LEFT(' abcde',2);
  822. go
  823.  
  824. -- uklanjanje praznina
  825. -- LTRIM(), RTRIM()
  826. select LTRIM(' abcde ');
  827. go
  828. select RTRIM(' abcde ');
  829. go
  830.  
  831. -- ocistimo praznine pa izdvojimo prva dva karaktera
  832. select LEFT(LTRIM(' abcde'),2);
  833. go
  834.  
  835. -- Pronalazenje podstringa u stringu
  836. -- CHARINDEX()
  837. select CHARINDEX(' ','Dr. Nikolic Miladin');
  838. go
  839.  
  840.  
  841. --koristeci prethodno spomenute funkcije izdvojiti
  842. --"titulu" u prosledjenom stringu
  843. -- cesto se CHARINDEX() koristi u kombinaciji
  844. --sa trim ili podstring funkcijama
  845. select LEFT('Dr. Nikolic Miladin',
  846. CHARINDEX('.','Dr. Nikolic Miladin'));
  847. go
  848.  
  849. --izdvojiti samo ime iz punog imena i prezimena
  850. --koristeci samo funkciju left i carindex
  851. declare @fullname varchar(20);--ako ne napisem duzinu podrazumeva se da je 1
  852. set @fullname= 'Mirko Mirkovic';
  853. select @fullname;
  854. select LEFT(@fullname, CHARINDEX(' ', @fullname)-1);
  855.  
  856. -- odredjivanje duzine stringa
  857. -- LEN() i DATALENGTH()
  858. -- LEN() vraca duzinu stringa kao broj karaktera a ne kao broj bajtova
  859. select LEN('abcd');
  860. go
  861. select LEN(N'abcd');
  862. go
  863. select LEN('abcd ');--razmak ne broji kao karakter
  864. go
  865. select LEN(N'abcd ');--razmak ne broji kao karakter cak ni kada je unicode
  866. go
  867.  
  868. select DATALENGTH('abcd');
  869. go
  870. select DATALENGTH(N'abcd');
  871. go
  872. select DATALENGTH('abcd ');
  873. go
  874. select DATALENGTH(N'abcd ');
  875. go
  876.  
  877. -- Promena stringa
  878. -- REPLACE(), REPLICATE(), STUFF()
  879. -- zamena bilo kog podstringa sa novim
  880. select REPLACE('.1.2.3.', '.', '/');
  881. go
  882. select REPLACE('.1.2.3.', ';', '/');
  883. go
  884.  
  885. -- generisanje stringova kopiranjem originala
  886. select REPLICATE('OK ',10);
  887. go
  888.  
  889. -- brisanje delova stringova i zamena sa drugim stringom
  890. select STUFF('x,y,z', 3, 1, 'O');
  891. go
  892. select STUFF('x,y,z', 1, 2, '');
  893. go
  894.  
  895. --UPPER, LOWER, LTRIM, RTRIM, FORMAT
  896. select UPPER('ok');
  897. select LOWER('OK');
  898. select LTRIM(' ok ');
  899. select RTRIM(' ok ');
  900.  
  901. --ne postoji funkcija koja odseca prazne stringove
  902. --i sa leve i sa desne strane odjednom
  903. select LTRIM(RTRIM(' ok '));
  904.  
  905. -- CASE iskaz
  906. -- CASE iskaz se koristi kada zelimo da
  907. --primenimo uslovnu logiku prilikom iscitavanja vrednosti
  908.  
  909. -- jednostavan oblik CASE iskaza:
  910. select prz, ime,
  911. case sodel
  912. when 0 then 'ne radi nigde'
  913. when 1 then 'Radi u jedinici'
  914. when 2 then 'Radi u dvojci'
  915. when 3 then 'Radi u trojci'
  916. else 'Uknown'
  917. end as odeljenje
  918. from radnik;
  919. go
  920.  
  921. -- searched oblik CASE iskaza
  922. select ime, plt,
  923. case
  924. when plt < 1000 then 'Low'
  925. when plt >= 1000 and plt < 50000 then 'Medium'
  926. when plt > 5000 then 'High'
  927. else 'Unknown'
  928. end as Plata
  929. from radnik;
  930. go
  931.  
  932. -- COALESCE i ISNULL
  933. declare
  934. @x as VARCHAR(3) = NULL,
  935. @y as VARCHAR(10) = '1234567890';
  936.  
  937. select COALESCE(@x, @y) as [COALESCE],
  938. ISNULL(@x, @y) as [ISNULL];
  939.  
  940. -- OBRATITI PAZNJU KOJI TIP JE VRACEN!
  941.  
  942. -- Zadatak 1. Iscitati trenutni Datum u sledecim
  943. --formatima: dd.mm.yyyy, yyyy/mm/dd, dd-mm-yyyy
  944. DECLARE @D DATE = SYSDATETIME();
  945. SELECT FORMAT (@D, 'dd.MM.yyyy', 'en-US') as 'date'
  946. DECLARE @D2 DATE = SYSDATETIME();
  947. SELECT FORMAT (@D2, 'dd-MM-yyyy', 'en-US') as 'date'
  948. DECLARE @D3 DATE = SYSDATETIME();
  949. SELECT FORMAT (@D3, 'yyyy/MM/dd', 'en-US') as 'date'
  950. GO
  951.  
  952. DECLARE @now DATE = CURRENT_TIMESTAMP;
  953. SELECT CONVERT(varchar, @now, 104),
  954. CONVERT(varchar, @now, 111),
  955. CONVERT(varchar, @now, 105)
  956. GO
  957.  
  958. -- Zadatak 2. Prikazati Ime i Prezime i datume rodjenja
  959. --svih radnika koji su rodjeni izmedju
  960. --1-og i 10-og u mesecu.
  961.  
  962. -- Zadatak 3. Prebrojati koliko je radnika rodjeno
  963. --na svaki dan u nedelji. U kom danu
  964. --ima najvise rodjenih radnika?
  965.  
  966. -- Zadtak 4. Izlistati imena i prezimena
  967. --i datume rodjenja radnika koji su rodjeni
  968. --na poslednji dan u mesecu.
  969.  
  970. -- Zadatak 5. Prikazati broj radnika po godinama rođenja.
  971.  
  972. -- Zadatak 6. Za sve zaposlene iz tabele radnik izlistati ime,
  973. --prezime, user name i emali, koji treba da budu u formatu,
  974. -- username (prvo slovo imena + prezime + godina rodjenja
  975. --(sve malim slovima)) Email adresa je username@mail.com
  976. ----------------------------------------------------------------------------------------------------
  977. use [Test]
  978. --kreirati schemu
  979. create schema Test;
  980.  
  981. --pre svakog ponovnog kreiranja tabele obavezno obrisati postojecu
  982. drop table Test.Student
  983.  
  984. create table Test.Student(
  985. id int identity, --default za identity je (1,1)
  986. --prvi broj oznacava da pocinjem od 1,
  987. --a drugi da se uvecava za 1
  988. broj_indeksa varchar(30),
  989. ime varchar(30),
  990. prezime varchar(30),
  991. godine numeric(2)
  992. )
  993.  
  994. --pre i posle inserta proveriti sta se nalazi u tabeli
  995. select from Test.Student
  996.  
  997. --uneti nekoliko torki(obatiti paznju da ne unosimo vrednosti za id)
  998. insert into Test.Student values ('gg34g2012', 'Marko', 'Markovic', 19)
  999. insert into Test.Student values ('gg22g2012', 'Milan', 'Milanovic', 20)
  1000. insert into Test.Student values ('gg33g2012', 'Ivana', 'Vasic', 20)
  1001.  
  1002. --select koji vraca trenutne vrednosti za identity
  1003. select
  1004. SCOPE_IDENTITY() as [SCOPE_IDENTITY],
  1005. @@IDENTITY as [@@IDENTITY],
  1006. ident_current('Test.Student') as [ident_current];
  1007.  
  1008. --pokusati sledeci insert(torka nece biti upisana u tabelu jer ne zadovoljava sva ogranicenja)
  1009. insert into Test.Student values ('gg44g2012', 'Dragana', 'Vukosic', 'broj godina')
  1010.  
  1011. --pokrenuti sledeci insert
  1012. insert into Test.Student values ('gg44g2012', 'Dragana', 'Vukosic', 20)
  1013.  
  1014. --proveriti da li je torka uneta i koja je vrednost za id(zasto je tako)
  1015. select from Test.Student
  1016.  
  1017.  
  1018. --pokusati sve kao i sa prethodnim primerom
  1019. drop table Test.Student
  1020.  
  1021. create table Test.Student(
  1022. id int identity(5,4),--identity koji pocinje od 5 i uvecava se za 4
  1023. broj_indeksa varchar(30),
  1024. ime varchar(30),
  1025. prezime varchar(30),
  1026. godine numeric(2)
  1027. )
  1028.  
  1029. select from Test.Student
  1030.  
  1031. insert into Test.Student values ('gg34g2012', 'Marko', 'Markovic', 19)
  1032. insert into Test.Student values ('gg22g2012', 'Milan', 'Milanovic', 20)
  1033. insert into Test.Student values ('gg33g2012', 'Ivana', 'Vasic', 20)
  1034.  
  1035. select
  1036. SCOPE_IDENTITY() as [SCOPE_IDENTITY],
  1037. @@IDENTITY as [@@IDENTITY],
  1038. ident_current('Test.Student') as [ident_current];
  1039.  
  1040. insert into Test.Student values ('gg44g2012', 'Dragana', 'Vukosic', 'broj godina')
  1041.  
  1042. insert into Test.Student values ('gg44g2012', 'Dragana', 'Vukosic', 20)
  1043. select from Test.Student
  1044.  
  1045. --unos explicitnih vrednosti za kolonu id
  1046. set identity_insert Test.Student on--setovanje identity_insert
  1047. insert into Test.Student(id, broj_indeksa,ime,prezime,godine)
  1048. values (34,'gg34g2012', 'Marko', 'Markovic', 19)
  1049. insert into Test.Student(id, broj_indeksa,ime,prezime,godine)
  1050. values (35,'gg22g2012', 'Milan', 'Milanovic', 20)
  1051. insert into Test.Student(id, broj_indeksa,ime,prezime,godine)
  1052. values (36,'gg33g2012', 'Ivana', 'Vasic', 20)
  1053.  
  1054. select from Test.Student
  1055.  
  1056. set identity_insert Test.Student off --vratiti na defaultno stanje
  1057.  
  1058. --obrisati sve podatke iz tabele sa truncate
  1059. truncate table Test.Student
  1060.  
  1061. --proveriti vrednosti za identity
  1062. select
  1063. SCOPE_IDENTITY() as [SCOPE_IDENTITY],
  1064. @@IDENTITY as [@@IDENTITY],
  1065. ident_current('Test.Student') as [ident_current];
  1066.  
  1067. --ponovo uraditi inserte u tabelu
  1068. insert into Test.Student values ('gg34g2012', 'Marko', 'Markovic', 19)
  1069. insert into Test.Student values ('gg22g2012', 'Milan', 'Milanovic', 20)
  1070. insert into Test.Student values ('gg33g2012', 'Ivana', 'Vasic', 20)
  1071.  
  1072.  
  1073. --obrisati sve podatke iz tabele sa delete
  1074. delete from Test.Student
  1075.  
  1076. --proveriti vrednosti za identity
  1077. select
  1078. SCOPE_IDENTITY() as [SCOPE_IDENTITY],
  1079. @@IDENTITY as [@@IDENTITY],
  1080. ident_current('Test.Student') as [ident_current];
  1081.  
  1082.  
  1083. --resetovanje vrednosti za identity
  1084. dbcc checkident('Test.Student', reseed, 4)
  1085. dbcc checkident('Test.Student', reseed, 10)
  1086.  
  1087.  
  1088.  
  1089. SEKVENCE
  1090.  
  1091. --minimalna sintaksa za kreiranje sekvence
  1092. --create sequence schema.sequenca
  1093. create sequence Test.ID
  1094.  
  1095. --INCREMENT BY Increment value. The default is 1.
  1096. --MINVALUE The minimum value to support. The default is the minimum value in the type. For example, for an INT type, it will be -2147483648.
  1097. --MAXVALUE The maximum value to support. The default is the maximum value in the type.
  1098. --CYCLE NO CYCLE Defines whether to allow the sequence to cycle or not. The de-fault is NO CYCLE.
  1099. --START WITH The default is MINVALUE for an ascending sequence (positive increment) and MAXVALUE for a descending one.
  1100.  
  1101. --brisanje sekvence
  1102. drop sequence Test.ID
  1103.  
  1104. --kreiranje sekvence
  1105. create sequence Test.ID as int --tipa int
  1106. start with 1 --pocinje od
  1107. minvalue 1 --minimalna vrednost sekvence
  1108. increment by 2 --uvecava se za 2
  1109. cycle --ciklicna je
  1110.  
  1111. --citanje vrednosti sekvence
  1112. select next value for Test.ID
  1113.  
  1114. --izmena definicije sekvence, kroz alter
  1115. alter sequence Test.ID
  1116.  
  1117. --restartovanje vrednosti sekvence na neki broj
  1118. alter sequence Test.ID
  1119. restart with 2147483647
  1120.  
  1121.  
  1122. --napraviti tabelu koja nema nikakvih dodatnih ogranicenja
  1123. drop table Test.Student
  1124. create table Test.Student(
  1125. id int,
  1126. broj_indeksa varchar(30),
  1127. ime varchar(30),
  1128. prezime varchar(30),
  1129. godine numeric(2)
  1130. )
  1131.  
  1132. --upisati nekoliko torki koristeci prethodno kreiranu sekvencu
  1133. insert into Test.Student values
  1134. (next value for Test.ID, 'hh45g2015', 'Miroslav', 'Mirkovic', 25)
  1135.  
  1136. select from Test.Student
  1137.  
  1138. insert into Test.Student values
  1139. (next value for Test.ID, 'hh45g2015', 'Miroslav', 'Mirkovic', 25)
  1140.  
  1141. insert into Test.Student values
  1142. (next value for Test.ID, 'hh45g2015', 'Miroslav', 'Mirkovic', 25)
  1143.  
  1144. insert into Test.Student values
  1145. (next value for Test.ID, 'hh45g2015', 'Miroslav', 'Mirkovic', 25)
  1146.  
  1147. --dodavanje sekvence u definiciju tabele kroz default ogranicenje
  1148. ALTER TABLE Test.Student
  1149. ADD CONSTRAINT DFT_Student_id DEFAULT (next value for Test.ID) for id;
  1150.  
  1151. --pokusati nove inserte u tabelu
  1152. insert into Test.Student(broj_indeksa,ime,prezime,godine) values ('jj58g2016', 'Ana', 'Nikolic', 22)
  1153.  
  1154. --proveriti da li se koristi sekvenca
  1155. select from Test.Student
  1156.  
  1157. --ukoliko se ne ogranici dodatno moguce je uneti eksplicitne vrednosti za kolonu id
  1158. insert into Test.Student(id, broj_indeksa,ime,prezime,godine) values (55,'jj58g2016', 'Ana', 'Nikolic', 22)
  1159.  
  1160.  
  1161. --citanje podataka o kreiranim sekvencama
  1162. select
  1163. from sys.sequences
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement