Adatbázisok szerver oldali programozása Előadás, 2006.04.21.
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
<style> code.pre { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px; } code.precompact { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px; line-height:13px; } li { line-height: 18px; } </style>
Microsoft SQL Server bevezetés
Rendszer objektumok és kapcsolataik
+------= * +-----------+ * +-------------+=
| példány |-------|| adatbázis ||-------|| felhasználó
|}
+------= +-----------+ +-------------+
=
Rendszer adatbázisok
- Master: rendszer szintű információk
- SQL init adatok
- többi adatbázis helye
- TempDB: átmeneti táblák és tárolt eljárások
- Model: ez alapján jön létre egy új adatbázis
- MSDB: SQL Server Agent használja
- figyelmeztetések
- munkák ütemezése
adat file: *.mdf, *.ndf
log file: *.ldf
A rendszer szintű információkat az =sp_= kezdetű tárolt eljárásokkal lehet lekérdezni és müdosítani.
Identity
Kulcsgeneráló objektum. 1 táblának legfeljebb 1 identity oszlopa lehet.
CREATE TABLE anyag (
anyag_id INT IDENTITY PRIMARY KEY,
anyag_nev VARCHAR(50) NOT NULL,
lejar DATETIME
)
Megadható a kulcs kezdőértéke és növekménye is: =IDENTITY(start, incr)=. Default érték: 1-től indul és egyesével nő.
- Beszúrás generált kulccsal: =INSERT INTO anyag VALUES ('cukor', NULL)=
- Beszúrás felhasználó által definiált kulccsal:
SET IDENTITY_INSERT anyag ON
Az =INSERT= utasításon belül ilyenkor kötelező felsorolni az oszlopokat.
INSERT INTO anyag(anyag_id, anyag_nev) VALUES(2, 'liszt')
SET IDENTITY_INSERT anyag OFF
- Session utoljára generált kulcsának lekérdezése (globális változó, nem táblafüggő): =SELECT @@IDENTITY=
- Adott táblába utoljára beszúrt kulcs: =IDENT_CURRENT(táblanév)=
- Identity kezdeti beállításainak lekérdezése: =IDENT_SEED(táblanév)=, =IDENT_INCR(táblanév)=
SQL Server programozása
A szerver Transact-SQL (T-SQL) nyelven programozható. A végrehajtás batchenként történik, a batcheket =GO= utasítás zárja le. Az utasítások végére nem kell pontosvessző.
Komment
- egysoros: =--=
- többsoros: =/* */=, egymásba ágyazható (az Oracle-ben nem)
Azonosítók
- Szabályos: ([A-Z0-9_]|@{1,2}#{1,2})[A-Z0-9_$]*
- =@=: lokális változó vagy paraméter
- =@@=: rendszerváltozó vagy -függvény
- =#=: átmeneti tábla vagy eljárás
- =##=: globális átmeneti tábla vagy eljárás
- Delimited: [ ] vagy " " jelek közé kell írni, speciális karaktereket is tartalmazhat
- Deklaráció: =DECLARE @változónév típus, @változónév típus, ...=
Alapértéket nem lehet megadni, a változók
NULL
-ra inicializálódnak. Változó bárhol deklarálható, nem csak blokk elején.
- Értékadás:
- =SET @a = 5=
- =SET @a = (SELECT ...)=. A =SELECT= 0 vagy 1 soros és 1 oszlopos eredménnyel kell, hogy visszatérjen, különben hiba történik. Ha 0 sorral tér vissza, a változó =NULL= értéket kap.
- =SELECT @a=oszlop1, @b=oszlop2, ... FROM ...=
Ha a =SELECT= 0 sorral tér vissza,
NULL
-t vesz föl minden változó, több soros eredmény esetén az utolsó sor mezői kerülnek a változókba. A legutolsó SQL utasítás által érintett sorok számát a =@@ROWCOUNT= változó adja vissza.
Adattípusok
- Egészek
- =BIGINT=: 64 bit, előjeles
- =INT=: 32 bit, előjeles
- =SMALLINT=: 16 bit, előjeles
- =TINYINT=: 8 bit, előjel nélküli
- =BIT=: 0 vagy 1 értékű
- Fixpontos
- =DECIMAL=, =NUMERIC=: legfeljebb 38 jegyű
- =MONEY=, =SMALLMONEY=
- Lebegőpontos
- =FLOAT=: 8 byte-os lebegőpontos, 15 számjegy pontosságú
- =REAL=: 4 byte-os lebegőpontos, 7 számjegy pontosságú
- Dátum
- =DATETIME=: 1753. január 1. és 9999. december 31. közötti időpontot tárol
- =SMALLDATETIME=: 1900. január 1. és 2079. január 6. közötti időpontot tárol
- Elfogadott dátum formátumok: ='mm/dd/yyyy'=, ='mm-dd-yyyy'=, ='yyyy-mm-dd'=, stb.
- a =SET DATEFORMAT= utasítással egyéb formátumokban is beolvasható a dátum
- String
- =CHAR=, =VARCHAR=: <=8000 byte-os fix/változó hosszúságú string
- =NCHAR=, =NVARCHAR=: <=8000 byte-os (4000 karakteres) fix/változó hosszúságú unicode string
- =TEXT=, =NTEXT=: <=2 GB hosszú string, a string műveletek nem alkalmazhatók rá
- =VARCHAR(MAX)=, =NVARCHAR(MAX)=: <=2 GB hosszú string, string függvények alkalmazhatók rá, az SQL Server 2005-ben jelentek meg.
- =BINARY=, =VARBINARY=: <=8000 byte-os fix/változó hosszúságú bináris string
- =IMAGE=: <=2 GB-os bináris string
- Egyéb
- =BOOLEAN=: implicit típus, csak kifejezésben lehet használni, nem lehet oszlopnak vagy változónak értékül adni
- =CURSOR=
- =SQL_VARIANT=: típus nélküli változó
- =TABLE=: eredményhalmazt tárol későbbi feldolgozásig
- =TIMESTAMP=
- =UNIQUEIDENTIFIER=: globálisan egyedi azonosító
- =XML=
Típus precedencia
Ha egy operátor 2 oldalán különböző típusok állnak, az eredmény a magasabb precedenciájú típus lesz.
SQL_VARIANT= > =DATETIME= > =SMALLDATETIME= > =FLOAT= > =REAL= > =DECIMAL= > =MONEY= > =SMALLMONEY= > =BIGINT= > =INT= > =SMALLINT= > ... > =NVARCHAR= > =VARCHAR= > =CHAR
A fenti precedencia sor következménye pl. az, hogy stringet és számot csak típuskonverzió után lehet összefűzni. Castolni a =CONVERT(típusnév[(paraméterek)], érték)= függvénnyel lehet. Pl. =CONVERT(numeric(10,2), 1.23456)=
Operátorok
egy operandusú műveletek: =+=, =-=, =~=
operátor precedencia:
1 =+ - ~= előjel 2 =* / %= 3 =+ -= additív és összefűző 4 =< > ...= 5 =^ & |= 6 =NOT= 7 =AND= 8 =ALL ANY= 9 =SET=
Batch
Def.:
amit egyszerre küldünk a szervernek, utasítások sorozata
Kliens:
- Query Analyzer (2000)
- Management Studio (2005)
Blokk:
batch vagy =BEGIN ... END=
Vezérlési szerkezetek
Feltételes utasítások
IF bool_kif utasítás ELSE utasítás
- több utasítás esetén =BEGIN END= közé kell tenni
IF (bool értékű SQL utasítás) utasítás ELSE utasítás
Pl.:
IF (EXISTS (SELECT * FROM anyag)) print('nem üres') ELSE print('üres')
- =THEN= és =ELSE= ágban ugyan arra a táblára kell vonatkoznia a =CREATE TABLE= ill. a =SELECT= utasításoknak
Ciklus
WHILE bool_kifejezés utasítás
- kilépes: =BREAK=
- folytatás: =CONTINUE=
Ugrás
GOTO címke
- címke def.: =cimke:=
- =RETURN=
Várakozás
WAIT FOR {DELAY idő | TIME időpont}
Case függvény
CASE bemeneti kif. WHEN kif. THEN kif. ... [ELSE kif.] END
Pl.:
SELECT CASE egyseg_nev WHEN 'l' THEN 'liter' WHEN 'dl' THEN 'deci' ELSE egyseg_nev END egysnev FROM anyag ORDER BY egysnev
- ha nem, tud illeszteni és nincs ELSE-ág akkor =NULL= lesz az eredmény
Searched case:
CASE WHEN bool_kif THEN kif. ... [ELSE kif.] END