Alias

Az alias-t már említettem ittott, de azt kifejezetten nem mondtam el, mi is ez. Pedig nagyon hasznos.

Az alias-t nem is tudom, hogyan lehetne magyarra fordítani, vagy hogy egyáltalán kell-e. Az „álnév” elég hülyén hangzik, a „másképpen” szintén, a „mint” meg semmitmondó. Talán használhatnánk az „átnevevés” kifejezést, ami nagyjából stimmel is, de zavaró lehet, mert itt végleges átnevezésre is gondolhatunk. Maradjunk az alias-nál.

A lényege, hogy SQL objektumokra tudunk más néven hivatkozni, konkrétan oszlopokra, tábla nevekre, illetve subquery-t tudunk vele elnevezni. Nagyon hasznosak, ha

  • több tábla szerepel egy műveletben
  • valamilyen függvényt használunk
  • vagy a mezőnevek nem feltétlenül szépen lettek elnevezve

Kétféle szintaxisban lehet vele találkozni, az egyik, amikor nincs hozzá kulcsszó, a másik, amikor az AS kulcsszót használjuk.

select * from tabla t1
select * from tabla as t1

Mindkettő elterjedt, én személy szerint a kulcsszavas megoldást szeretem, olvashatóbb tőle a kód.

Táblák

A tábla nevét azért szoktuk alias-olni, hogy ne kelljen annyiszor leírni, hanem egy rövidítést használva mehetünk végig a query-n, például

select * from tabla1 as t1 
inner join tabla2 as t2 on t1.id = t2.id
where t1.valamilyenmezo > ertek

Ez így rövidebb, de nem feltétlenül olvashatóbb később. Ezért azt javaslom, hogy alias-nak mindig valami értelmes nevet adjunk meg, ne ragadjunk le a t1, t2, t3 és hasonló megnevezéseknél.

Ha egy táblára így hivatkozunk, akkor minden további helyen ezt kell használnunk. Ha egy oszlopot prefixelünk, ha egy ON kapcsolatot adunk meg, ha a feltételben szükségünk van a tábla nevére, akkor mindenhol az új nevet kell használnunk. Ezek hibára fognak futni, mert az eredeti tábla neve mondhatni nem létezik már a lekérdezéseknél:

select tabla.mezo1, * from tabla as t1
select * from tabla as t1 where tabla.mezo1 > ertek
select * from tabla as t1 inner join tabla2 as t2 on tabla.id = tabla2.id

Ahogy már írtam, JOIN és IN esetén mindig kell alias-t használni, mert különben sokáig nézhetjük, miért nem azt az eredményt kapjuk, amire számítunk.

Oszlopok

Oszlopokat vagy mezőket is el lehet látni alias-szal és ez is nagyon hasznos tud lenni, például:

select mezo1 as SzepNevuMezo from tabla
select id as CustomerId from tabla
select pstlCd as [Zip Code], ct as City, Address1 as Street, Address2 as Address from tabla

Ezzel a kimenetet tudjuk szebbé, emberi fogyasztásra alkalmasabbá tenni, például két tábla összekapcsolásánál az eredményben nem kell, hogy két azonos nevű oszlop legyen, mert hivatkozhatunk rájuk más néven:

select felh.id as FelhasznaloId, csop.id as CsoportId
from felhasznalok as felh
inner join csoport as csop on felh.csoportid = csop.id

Oszlopoknál az új névre nem igazán hivatkozhatunk máshol, csak az eredetire. Ez hibára fog futni:

select id as CustomerId from tabla where CustomerId = 1234

Ez attól van, ahogyan a feldolgozó értelmezi és végigmegy a parancson. Ha megnéztek egy execution plant, akkot látszik, hogy először leszedi az adatokat az eredeti névvel, vagyis id szerepel benne, majd ezzel dolgozik tovább, majd csak a megjelenítéshez fogja az új nevet használni. Oszlopok esetén az új név ilyen szempontból „csak” kozmetika, nem olyan mély, mint táblák esetében.

Akkor viszont kifejezetten hasznos, ha valamilyen műveletet hajtunk végre vagy függvényeket használunk oszlopokon. A kimenet sokkal olvashatóbb, ha alias-t használunk:

select min(id) as elso, max(id) from utolso from tabla
select netto + afa as brutto from tabla
select valamiBonyolult(mezo1, mezo2, mezo3) as [NagyonFontosAdat] from tabla

Subquery-k

Subquery-ket is el lehet látni egy névvel, hogy azzal hivatkozzunk rá a későbbiekben.

select * from tabla1 as t1
inner join (select id, mezo1, mezo2, mezo3 from tabla2) as sub on t1.id = sub.id
where sub.mezo1 > 1

Ha belegondolunk, akkor ez mondhatni egy sima tábla alias, csak éppen a tábla nem fix objektum az adatbázisunkban, hanem ideiglenesen hozzuk létre a lekérdezés idejére.

Persze ha a subquery csak egy mezőt számol ki, akkor a fentiek alapján simán átnevezhetjük:

select (select count(*) from tabla) as OsszesSor, * from tabla

Ez pedig egy sima oszlop alias-nak felel meg, csak ismét nem egy létező objektumon, hanem egy itt létrehozott és utána megszűnő adaton használjuk.

Egyéb

Az alias nem tárolódik sehol, csak az adott műveletben használható, csupán a művelet idejére jönnek létre a memóriában (illetve a temp adatbázisban, ha úgy jön ki a lépés), ezért így nem használható:

select * from tabla as t1
select * from t1

Kicsit bővebb magyarázat a tábla és oszlop alias-ra történő hivatkozás különbözőségéről. Egy lekérdezést mi természetesen az elejétől kezdünk el olvasni, de az SQL szerver nem így tesz. A lekérdezésben a kiértékelés sorrendje a következő:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE or WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

Ebből látszik, hogy amikor a táblának adunk új nevet, az egyből az első lépésnél életbe lép, ezért arra kell hivatkozunk végig a lekérdezésben. Ellenben ha egy oszlop kap új nevet, akkor az a SELECT résznél lép életbe, ami egészen a kiértékelés vége felé kap helyet, ezért az előtte lévő részeknél (például a WHERE-nél) nem használható, mert az még nem tud a megváltoztatott névről.