Sie sind auf Seite 1von 568

John L. Viescas, Michael J.

Hernandez

SQL-lekrdezsek fldi halandknak

Budapest, 2009

John L. Viescas Michael J. Hernandez

SQL-lekrdezsek
fldi halandknak
Gyakorlati tmutat az SQL nyelv adatkezelshez

Addison-Wesley

A fordts a kvetkez angol eredeti alapjn kszlt:


John L. Viescas, Michael J. Hernandez: SQL Queries for Mere Mortals: A Hands-On Guide to Data Manipulation in SQL

Authorized translation from the English language edition, entitled SQL QUERIES FOR MERE MORTALS*: A HANDS-ON GUIDE TO DATA MANIPULATION IN SQL, 2nd Edition, ISBN 0321444434, by VIESCAS, JOHN L.; HERNANDEZ, MICHAEL J., published by Pearson Education, Inc., publishing as AddisonWesley Professional. Copyright 2008 by Michael J. Hernandez and John L. Viescas. Translation and Hungarian edition 2009 Kiskapu Kft.
All rights reserved. No part of this book, including interior design, cover design, and icons, may be reproduced or transmitted in any form, by any means (electronic, photocopying, recording, or otherwise) without the prior written permission of the publisher.

Trademarked names appear throughout this book. Rather than list the names and entities that own the trademarks or insert a trademark symbol with each mention of the trademarked name, the publisher states that it is using the names for editorial purposes only and to the benefit of the trademark owner, with no intention of infringing upon that trademark Fordts s magyar vltozat 2009 Kiskapu Kft. Minden jog fenntartva! A knyv egyetlen rsze sem sokszorosthat semmilyen mdszerrel a Kiad elzetes rsos engedlye nlkl. Ez a korltozs kiterjed a bels tervezsre, a bortra s az ikonokra is. A knyvben bejegyzett vdjegyek s mrkanevek is felbukkanhatnak Ahelyett, hogy ezt minden egyes helyen kln jeleznnk, a Kiad ezennel kijelenti, hogy a mben elfordul valamennyi vdett nevet s jelzst szerkesztsi clokra, jhiszemen, a nv tulajdonosnak rdekeit szem eltt tartva hasznlja, s nem ll szndkban az azokkal kapcsolatos jogokat megszegni, vagy ktsgbe vonni. A szerzk s a kiad a lehet legnagyobb krltekintssel jrt el e kiadvny elksztsekor. Sem a szerz, sem a kiad nem vllal semminem felelssget vagy garancit a knyv tartalmval, teljessgvel kapcsolatban. Sem a szerz, sem a kiad nem vonhat felelssgre brmilyen baleset vagy kresemny miatt, mely kzvetve vagy kzvetlenl kapcsolatba hozhat e kiadvnnyal.
Lektor: Rzmves Lszl Fordts: Blint Istvn Zsolt,

Borbly Gyrgy, Cspny Gergely Lszl, Fodor Ferenc Dniel, Heiner Pter, Kmeczk Csilla, Koronczay Dvid, Rzmves Lszl, Szabados Ern, Varga Pter Mszaki szerkeszt: Csutak Hoffmann Levente Trdels: Kis Pter
Felels kiad a Kiskapu Kft. gyvezet igazgatja 2009 Kiskapu Kft. 1134 Budapest, Csng u. 8. Fax: (+36-1) 303-1619 http://www.kiskapukiado.hu/ e-mail: kiado@kiskapu.hu
ISBN: 978 963 9637 52 8

Kszlt a debreceni Kinizsi Nyomdban


Felels vezet: Brds

Jnos

Hacsak nem vagyunk profik, ez az egyetlen SQL-knyv, amire valaha szksgnk lesz. A szerzk felfedik az sszetett lekrdezsek rejtlyt, s olyan vilgosan magyarzzk el a klnbz elveket s eljrsokat, hogy egy fldi haland is kpes lesz emberfeletti tet teket vghezvinni. Kihagyhatatlan knyv!

Graham Mandeno, adatbzis-szakrt

n elssorban ennek a knyvnek az els kiadsbl tanultam meg az SQL hasznlatt: remekl szerkesztett knyv, amely jl felptett mdon mutatja be a nyelvet. rlk, hogy egy msodik kiadst is megrt, gy msoknak is a hasznra lehet. Onnan kezdve, hogy miknt tervezzk meg az adattblinkat, hogy az SQL segtsgvel hatkonyan ke zelhessk az adatainkat (ami ltalban gondot jelent a kezdknek), a knyv rszletesen bemutatja az SQL kpessgeit s klnfle szerkezeteit, gy az olvas a ktet elolvassa s a pldk ttekintse utn flig-meddig szakrtv vlhat. Megtanuljuk, hogyan alaktha tunk egy angol nyelv krdst rtelmes SQL-utastss, ami nagyban elsegti, hogy elsa jtthassuk a nyelvet, a vals letbl vett szmos plda alapjn pedig kpet formlhatunk arrl, hogy miknt adhatunk vlaszokat az SQL segtsgvel az adatbzisban tallhat adatokra vonatkoz krdsekre. Mr egyetlen olyan megjegyzs elolvassa, amely egy csapdra figyelmeztet, tbb pnzt takarthat meg neknk a knyv rnl, mivel gy elke rlhetjk az adott problmt, amikor lekrdezseket runk. Ha az adatbzisaink kpess geit teljes mrtkben ki szeretnnk aknzni, ezt a knyvet felttlenl el kell olvasnunk!

Kenneth D. Snell, Ph.D, adatbzis-tervez s -programoz

Nem tudom, hogy az iskolban mg tantjk-e - ha nem, az elg baj , de annak idejn mi a hetedik vagy a nyolcadik osztlyban megtanultuk, hogyan rajzolhatunk fel egy mon datot diagramknt Lehet, hogy mr nem emlksznk r, hogyan csinltuk, de mindny junk mondatszerkesztse javult ltala. John Viescas s Mike Hernandez bizonyra nem fe lejtettk el, mert kpesek r, hogy htkznapi angol krdseket alaktsanak t SQL-utastsokk, s mindenki szmra knnyen rthetv teszik az E. F. Codd-nak a relcis adat bzisok tervezesrl rott eredeti munkjban vzolt bonyolult matematikai halmazelm letet s elsrend prediktumlogikt. Knyvk nlklzhetetlen minden adatbzis-terve z szmra. Ha kezd-kzphalad szint tanknyvet keresnk az SQL-rl, ez a ktet ktelez anyag, fggetlenl attl, hogy hny msik knyvet vesznk meg mg.

Aruin Meyer; MCP, MVP

Az SQL-lekrdezsek fldi halandknak msodik kiadsa lpsrl lpsre halad, olvas mnyos bevezetst ad az SQL-lekrdezsek rsba. Pldk szzait tartalmazza rszletes magyarzattal elltva, s minden eszkzt megad, ami ahhoz szksges, hogy kpesek le gynk megrteni az SQL-lekrdezseket, valamint ltrehozni s mdostani azokat." Keith W Hare, elnk, ISO/IEC JTC1 SC32 WG3- nemzetkzi SQL-szabvnygyi bizottsg Mg ma, a varzslk s kdgenertorok korban is biztos tudssal kell rendelkeznie a strukturlt lekrdeznyelvrl (SQL, Structured Query Language a szabvnyos nyelv a legtbb adatbzisrendszerrel val kommunikcihoz) minden olyan adatbzis-fejleszt nek, aki sikeres szeretne lenni. Ebben a knyvben John s Mike nagyszert munkt v gezve letre keltenek egy ltalban szraz s bonyolult tmt, s az anyagt logikus rend ben, sok humorral s rengeteg hasznos pldval krtve tlaljk Azt kellene mondanom, hogy ktetknek minden komoly fejleszt knyvtrban kitntetett helyet kellene kapnia - csakhogy biztos vagyok benne, hogy olyan srn fogjk forgatni, hogy nem fog sok idt tlteni a polcon!
-

Doug Steele, Microsoft Access-fejleszt, szakr

Tartalomjegyzk
l. rsz A relcis adatbzisok s az SQL
1. fejezet Mit jelent az, hogy relcis"? A fejezet tmakrei........................................................................................................................ 3 Az adatbzisok fajti......................................................................................................................3 A relcis modell rvid trtnete ............................................................................................... 4 A kezdetek ......................................................................................................................................4 A relcis adatbzisprogramok....................................................................................................5 A relcis adatbzisok felptse................................................................................................. 6 Tblk...............................................................................................................................................6 Mezk...............................................................................................................................................7 Rekordok ........................................................................................................................................ 7 Nzettblk..................................................................................................................................... 9 Kapcsolatok ..................................................................................................................................10 Mirt hasznosak szmunkra a relcis adatbzisok? ............................................................ 14 Hogyan tovbb? .......................................................................................................................... 15 sszefoglals ............................................................................................................................... 16 2. fejezet A helyes adatbzis-szerkezet kialaktsa A fejezet tmakrei...................................................................................................................... 17 Mi a clja ennek a fejezetnek?.....................................................................................................17 Mirt lnyeges a helyes szerkezet? ...........................................................................................18 A mezk finomhangolsa........................................................................................................... 18 Mikor helyes egy nv? (Els rsz) ............................................................................................ 18 A durva lek lecsiszolsa............................................................................................................ 20 A tbbrszes mezk feloldsa....................................................................................................22 A tbbrtk mezk feloldsa................................................................................................... 24 A tblk finomhangolsa............................................................................................................ 26 Mikor helyes egy nv? (Msodik rsz)..................................................................................... 26 A helyes szerkezet biztostsa....................................................................................................28 A feleslegesen tbbszr szerepl mezk feloldsa ................................................................ 29

A kulcs az azonosts .................................................................................................................34 Szilrd kapcsolatok kialaktsa ................................................................................................37 Trlsi szably meghatrozsa .................................................................................................39 A tblk szerepnek belltsa ................................................................................................. 40 A rszvtel mrtknek belltsa............................................................................................ 42 Ennyi az egsz?........................................................................................................................... 44 sszefoglals .............................................................................................................................. 44 3. fejezet Az SQL rvid trtnete A fejezet tmakrei......................................................................................................................47 Az SQL eredete ........................................................................................................................... 47 Az els megvalstsok.............................................................................................................. 49 s megszletik egy szabvny....................................................................................................50 Az ANSI/ISO szabvny fejldse............................................................................................ 51 Egyb SQL-szabvnyok............................................................................................................. 54 Kereskedelmi megvalstsok...................................................................................................57 Mit tartogat a jv? .................................................................................................................... 58 Mirt rdemes megtanulnunk az SQL hasznlatt? ............................................................. 58 sszefoglals .............................................................................................................................. 59

II. rsz Az SQL alapjai


4. fejezet Egyszer lekrdezsek rsa A fejezet tmakrei..................................................................................................................... 63 Bemutatkozik a SELECT ........................................................................................................... 63 A SELECT utasts ..................................................................................................................... 64 Egy kis kitr: adat kontra informci.....................................................................................66 A krelmek lefordtsa SQL-re..................................................................................................68 Szlestsk a ltkrnket! .......................................................................................................72 Rvidts hasznlata az sszes oszlop lekrshez................................................................73 A sorismtls kikszblse......................................................................................................74 Az informcik rendezse......................................................................................................... 77 Mieltt tovbblpnnk: jelsorrend............................................................................................78 Rendezzk a sorainkat!.............................................................................................................. 78 Ments...........................................................................................................................................81 Pldk............................................................................................................................................82 sszefoglals .............................................................................................................................. 89 nll feladatok.......................................................................................................................... 90 5. fejezet Kapjunk tbbet egyszer oszlopoknl! A fejezet tmakrei..................................................................................................................... 93 Mik azok a kifejezsek?.............................................................................................................. 94 Milyen tpus adatokat szeretnnk megjelenteni?............................................................... 94

Adattpusok megvltoztatsa: a CAST fggvny ..................................................................97 Konkrt rtkek meghatrozsa ...............................................................................................99 Karakterlnc-literlok ................................................................................................................ 99 Szmliterlok............................................................................................................................. 101 Dtum-id literlok...................................................................................................................101 A kifejezsek tpusai .................................................................................................................104 sszefzs ................................................................................................................................. l 04 Matematikai kifejezsek............................................................................................................l 07 Dtum- s idmveletek.......................................................................................................... 110 Kifejezsek hasznlata a SELECT zradkban .....................................................................113 A kifejezsek elnevezse...........................................................................................................115 A matematikai kifejezsek hasznlata ...................................................................................117 A dtumkifejezsek hasznlata .............................................................................................. 118 A semmit jelkpez rtk: a Null ....................................................................................... 120 Bemutatkozik a Null rtk....................................................................................................... 121 A Null rtkek htulti ......................................................................................................... 123 Pldk..........................................................................................................................................124 sszefog(lal)s........................................................................................................................... 130 nll feladatok........................................................................................................................ 131 6. fejezet Az adatok szrse A fejezet tmakrei....................................................................................................................133 A lekrdezsek finomtsa a WHERE segtsgvel.............................................................. 133 A WHERE zradk.................................................................................................................... 134 A WHERE zradk hasznlati terletei ................................................................................ 136 A keressi felttelek megfogalmazsa.................................................................................... 137 sszehasonlts......................................................................................................................... 137 Tartomny.................................................................................................................................. 144 Tagsg belltsa........................................................................................................................148 Mintailleszts..............................................................................................................................149 Null..............................................................................................................................................153 Sorok kizrsa a NOT mvelettel .......................................................................................... 155 Tbb felttel hasznlata............................................................................................................157 AND s OR ................................................................................................................................ 158 Az AND hasznlata ................................................................................................................. 158 Az OR hasznlata ..................................................................................................................... 159 Az AND s az OR egyttes hasznlata.................................................................................. 161 Sorok kizrsa: msodik felvons ..........................................................................................163 Kirtkelsi sorrend.................................................................................................................. 165 A felttelek elsbbsge .............................................................................................................166 A kevesebb tbb........................................................................................................................ 168 Egymst tfed tartomnyok ellenrzse ............................................................................ 169 Visszatrs a Null-okhoz: egy figyelmeztet megjegyzs...................................................171

Felttelek ms megfogalmazsban ........................................................................................ 175 Pldk..........................................................................................................................................176 sszefoglals............................................................................................................................. 183 nll feladatok........................................................................................................................ 184

III. rsz Tbbtbls lekrdezsek


7. fejezet Halmazokban gondolkodni A fejezet tmakrei....................................................................................................................189 Mik azok a halmazok?..............................................................................................................190 Halmazmveletek..................................................................................................................... 191 Metszet .......................................................................................................................................191 Metszet a halmazelmletben................................................................................................... 192 Eredmnyhalmazok metszete ................................................................................................ 193 Metszetkpzssel megoldhat feladatok............................................................................... 196 Klnbsg.................................................................................................................................. 197 Klnbsg a halmazelmletben.............................................................................................. 197 Eredmnyhalmazok klnbsge............................................................................................ 199 Klnbsgkpzssel megoldhat feladatok..........................................................................202 Uni ............................................................................................................................................203 Uni a halmazelmletben ........................................................................................................203 Eredmnyhalmazok unija ..................................................................................................... 205 Unival megoldhat feladatok ...............................................................................................206 Halmazmveletek az SQL-ben................................................................................................207 A klasszikus halmazmveletek s az SQL ........................................................................... 207 Kzs elemek megtallsa: INTERSECT .............................................................................. 208 Hinyz elemek megtallsa: EXCEPT (klnbsg) ...........................................................211 Halmazok egyestse: UNION................................................................................................ 213 sszefoglals............................................................................................................................. 216 8. fejezet Bels sszekapcsols A fejezet tmakrei....................................................................................................................217 Mi az a JOIN?.............................................................................................................................217 Az INNER JOIN........................................................................................................................ 218 Mit szabad JOIN segtsgvel sszekapcsolni? ............................................................... 218 Oszlophivatkozsok ................................................................................... .............................219 Utastsforma.............................................................................................................................220 A tblk hasznlata ..................................................................................................................220 Korrelcis nevek (lnevek) hozzrendelse tblkhoz .....................................................225 SELECT utastsok begyazsa ..............................................................................................227 JOIN begyazsa JOIN-ba........................................................................................................ 229 Ellenrizzk a kapcsolatokat! .................................................................................................234 Az INNER JOIN alkalmazsi lehetsgei..............................................................................235

Kapcsold sorok keresse.......................................................................................................235 Egyez rtkek keresse........................................................................................................... 236 Pldk.......................................................................................................................................... 236 Kt tbla ..................................................................................................................................... 237 Kettnl tbb tbla ....................................................................................................................241 Egyez rtkek keresse........................................................................................................... 247 sszefoglals..............................................................................................................................2 57 nll feladatok ........................................................................................................................257 9. fejezet Kls sszekapcsols A fejezet tmakrei.................................................................................................................... 261 Mi az OUTER JOIN?..................................................................................................................261 A LEFT s a RIGHT OUTER JOIN ......................................................................................... 263 Utastsforma............................................................................................................................. 263 A FULL OUTER JOIN............................................................................................................... 282 Utastsforma............................................................................................................................. 2 82 Nem kulcsmezkn vgzett FULL OUTER JOIN mvelet ................................................ 285 A UNION JOIN .........................................................................................................................286 Az OUTER JOIN hasznlatnak terletei.............................................................................. 286 Hinyz rtkek megtallsa...................................................................................................2 87 Rszlegesen megfeleltetett informci megtallsa..............................................................2 87 Pldk.......................................................................................................................................... 2 88 sszefoglals.............................................................................................................................. 300 nll feladatok ........................................................................................................................301 10. fejezet Uni A fejezet tmakrei.................................................................................................................... 303 Mi az a UNION?........................................................................................................................ 303 UNION utastst tartalmaz lekrdezsek............................................................................ 306 Egyszer SELECT utastsok hasznlata............................................................................... 306 sszetett SELECT utastsok egyestse................................................................................ 309 Tbb UNION mvelet hasznlata ..........................................................................................313 Unik rendezse.........................................................................................................................314 A UNION utasts hasznlatnak terletei........................................................................... 316 Pldk.......................................................................................................................................... 317 sszefoglals..............................................................................................................................326 nll feladatok.........................................................................................................................327 11. fejezet Allekrdezsek A fejezet tmakrei.................................................................................................................... 329 Mi az az allekrdezs?..............................................................................................................3 30 Sorallekrdezsek...................................................................................................................... 330 Tbla-allekrdezsek................................................................................................................. 331

Skalris allekrdezsek .......................................................................................................... 331 Allekrdezsek oszlopkifejezsknt ......................................................................................332 Utastsforma............................................................................................................................ 332 Bevezets az sszest fggvnyek hasznlatba: a COUNT s a ....................................334 Szrs allekrdezsekkel......................................................................................................... 337 Utastsforma............................................................................................................................ 337 Az allekrdezsek lltsaiban hasznlt klnleges kulcsszavak......................................340 Az allekrdezsek hasznlati terletei...................................................................................352 Allekrdezsek felptse oszlopkifejezsknt .................................................................... 352 Allekrdezsek hasznlata szrknt ................................................................................... 352 Pldk......................................................................................................................................... 3 53 Allekrdezsek kifejezsekben ...............................................................................................354 Allekrdezsek szrkben.......................................................................................................358 sszefoglals............................................................................................................................. 365 nll feladatok .......................................................................................................................365

IV. rsz Adatok sszestse s csoportostsa


12. fejezet Egyszer sszestsek A fejezet tmakrei................................................................................................................... 371 sszest fggvnyek ..............................................................................................................372 Sorok s rtkek megszmllsa a COUNT segtsgvel................................................... 374 rtkek sszeszmllsa oszlopokban s kifejezsekben .................................................. 375 sszeg kiszmtsa a SUM segtsgvel................................................................................377 tlag kiszmtsa az AVG fggvnnyel ...............................................................................378 A legnagyobb rtk meghatrozsa a fggvnnyel.............................................................380 A legkisebb rtk meghatrozsa a MIN fggvnnyel....................................................... 381 Tbb fggvny hasznlata.......................................................................................................382 sszest fggvnyek hasznlata szreikben...................................................................... 384 Pldk......................................................................................................................................... 386 sszefoglals............................................................................................................................. 391 nll feladatok........................................................................................................................392 13. fejezet Adatok csoportostsa A fejezet tmakrei................................................................................................................... 395 Mirt csoportostsuk az adatokat? .........................................................................................395 A GROUP BY zradk..............................................................................................................398 Utastsforma............................................................................................................................ 398 Oszlopok s kifejezsek vegyes hasznlata.......................................................................... 404 A GROUP BY zradk hasznlata Where-zradkban tallhat allekrdezsben..........405 A SELECT DISTINCT utasts kivltsa .............................................................................. 407 Bizonyos korltozsokkal....................................................................................................408

Oszlopokra vonatkoz megktsek .......................................................................................408 Kifejezseken alapul csoportosts ...................................................................................... 410 Mikor hasznljuk a GROUP BY zradkot?.......................................................................... 411 Pldk.......................................................................................................................................... 412 sszefoglals..............................................................................................................................421 nll feladatok........................................................................................................................ 421 14. fejezet Csoportostott adatok szrse A fejezet tmakrei.................................................................................................................... 425 A clcsoport" j jelentse........................................................................................................ 426 Szrkkel minden ms ............................................................................................................ 430 A WHERE vagy a HAVING zradkban szrjnk? ............................................................430 Ne essnk a HAVING COUNT csapdjba! ........................................................................ 433 A HAVING hasznlati terletei...............................................................................................4 37 Pldk.......................................................................................................................................... 438 sszefoglals.............................................................................................................................. 445 nll feladatok ........................................................................................................................445

V. rsz Adathalmazok mdostsa


15. fejezet Adathalmazok frisstse A fejezet tmakrei.................................................................................................................... 451 Mi az az UPDATE?....................................................................................................................451 Az UPDATE utasts................................................................................................................. 452 Az egyszer UPDATE utasts................................................................................................ 452 Egy rvid kitr: tranzakcik...................................................................................................456 Tbb oszlop mdostsa............................................................................................................457 Egyes adatbzisrendszerek megengedik a JOIN hasznlatt az UPDATE zradkban.................................................................................................... 461 Allekrdezs hasznlata az UPDATE kifejezsben.............................................................. 464 Az UPDATE hasznlati terletei.............................................................................................466 Pldk.......................................................................................................................................... 466 sszefoglals.............................................................................................................................. 479 nll feladatok ........................................................................................................................479 16. fejezet Adathalmazok beszrsa A fejezet tmakrei.................................................................................................................... 483 Mi az az INSERT?...................................................................................................................... 483 Az INSERT utasts .................................................................................................................. 485 rtkek beszrsa ..................................................................................................................... 485 Az elsdleges kulcs kvetkez rtknek ellltsa........................................................... 488 Adatok beszrsa a SELECT utasts segtsgvel ..............................................................489

Az INSERT hasznlati terletei...............................................................................................496 Pldk..........................................................................................................................................497 sszefoglals............................................................................................................................. 504 nll feladatok........................................................................................................................ 505

17. fejezet Adathalmazok trlse


A fejezet tmakrei ...................................................................................................................507 Mi az a DELETE? ......................................................................................................................507 A DELETE utasts.................................................................................................................... 508 Minden sor trlse.....................................................................................................................509 Csak bizonyos sorok trlse ................................................................................................... 510 A DELETE hasznlati terletei................................................................................................ 515 Pldk......................................................................................................................................... 516 sszefoglals..............................................................................................................................521 nll feladatok ....................................................................................................................... 522

VI. rsz Fggelkek


A fggelk Az SQL-szabvnynak megfelel diagramok 527 B fggelk A mintaadatbzisok smja
Sales Orders adatbzis..............................................................................................................535 Entertainment Agency adatbzis ........................................................................................... 536 School Scheduling adatbzis................................................................................................... 536 Bowling League adatbzis....................................................................................................... 537 Recipes adatbzis ......................................................................................................................537

C fggelk Dtum- s idfggvnyek


IBM DB2......................................................................................................................................539 Microsoft Office Access.............................................................................................................541 Microsoft SQL Server................................................................................................................542 MySQL........................................................................................................................................ 543 Oracle.......................................................................................................................................... 546

D fggelk Ajnlott irodalom


Adatbzisokrl szl knyvek................................................................................................ 549 Az SQL-rl szl knyvek....................................................................................................... 550

Trgymutat 551

Elsz
Az SQL adatbzisnyelv nemzetkzi szabvnny vlsa ta eltelt 20, illetve az SQL adatb zis-kezel termkek piacra dobsa ta eltelt 25 vben az SQL vlt az adatok trolsnak, mdostsnak, kiolvassnak s trlsnek meghatroz nyelvv. Ma a vilg - s a vi lggazdasg - adatainak jelents rszt SQL-adatbzisok troljk. SQL ott van mindentt, mert az adatok kezelsnek igen hatkony eszkze. Jelen van a nagyteljestmny tranzakcifeldolgoz rendszerekben, a webes felletek mgtt, st tallkoztam mr vele hlzatfigyel eszkzkben s levlszemtszr tzfalakban is. SQL-utastsok mai formjukban vgrehajthatk kzvetlenl, begyazhatok ms prog ramozsi nyelveken rt kdokba, s hozzfrhetk hvsi felleteken keresztl. Megbjik a grafikus felletek fejleszteszkzeiben, a kdgenertorokban s a jelentsksztkben. Nem szmt, hogy lthat vagy rejtett mdon, de a httrben vgrehajtott lekrdezsek rendszerint SQL nyelvek Ahhoz teht, hogy megrtsk a mai alkalmazsok mkdst s jakat kszthessnk, ismernnk kell az SQL-t.

SQL-lekrdezsek fldi halandknak msodik kiadsa lpsrl lpsre halad, olvas mnyos bevezetst ad az SQL-lekrdezsek rsba. Pldk szzait tartalmazza rszletes magyarzattal elltva, s minden eszkzt megad, ami ahhoz szksges, hogy kpesek le gynk megrteni az SQL-lekrdezseket, valamint ltrehozni s mdostani azokat.
Adatbzis-szakrt tancsadknt, s mind az amerikai, mind a nemzetkzi SQL-szab vnygyi bizottsg tagjaknt sok idt tltk munkm sorn az SQL-lel, ezrt btran elhihetik nekem, hogy ennek a knyvnek a szerzi nem csak rtik az SQL-t, hanem azt is tud jk, hogyan lehet elmagyarzni a mkdst. Ez a kt kpessgk az, ami ezt a ktetet ki vtelesen rtkes forrss teszi.

Keith W. Hare
ftancsad, JCC Consulting, Inc. alelnk, INCITS H2 - az Amerikai Egyeslt llamok SQL-szabvnygyi bizottsga elnk, ISO/IEC JTCl SC32 WG3 - a nemzetkzi SQL-szabvnygyi bizottsg

A kiad elszava
"A nyelv puszta termszetnl fogva kzssgi dolog,

vagyis soha nem egy konkrt dolgot, hanem egy kompromisszumot fejez ki - azt, ami benned, bennem s mindnyjunkban kzs." - Thomas Earnest Hulme, Elmlkedsek

Megtanulni, hogy miknt nyerhetnk ki s kezelhetnk informcikat egy adatbzisbl, ltalban zavarbaejt feladat, ugyanakkor viszonylag egyszer, ha tudjuk, mit is krde znk, illetve rtjk, hogy milyen vltoztatst is prblunk eszkzlni az adatbzisban. Mi utn megrtettk a krdst, lefordthatjuk egy olyan nyelvre, amelyet minden mai adatb zisrendszer megrt ami a legtbb esetben a Structured Query Language (SQL, strukturlt lekrdeznyelv). A krelmet egy SQL-utastss kell alaktanunk, hogy az adatbzis-keze l rendszernk tudja, hogy milyen adatokat szeretnnk kinyerni vagy mdostani. Az SQL biztostja az eszkzket ahhoz, hogy kommuniklni tudjunk az adatbzisrendszerrel Adatbzis-tancsadknt vgzett sok vnyi munknk sorn azt tapasztaltuk, hogy azok nak a szma, akiknek csupn adatok kiolvassra vagy egyszer mdostsokra van szk sgk egy adatbzisban, messze meghaladja azokt, akiknek a feladata az adatbzist m kdtet programok s alkalmazsok elksztse. Ezzel a tmval eddig sajnos egyetlen knyv sem foglalkozott kizrlagosan, klnsen nem a fldi halandk szemszgbl. Termszetesen sok j knyvet rtak az SQL-rl, de a legtbbnek az adatbzisok programozsa s fejlesztse llt a kzppontjban. Ezt figyelembe vve gy dntttnk, hogy ideje egy olyan knyvet rni, amely azt tantja meg, hogy miknt krdezhetnk le helyesen s hatkonyan egy adatbzist. Knyvnk el s kiadsa 2000-ben jelent meg. Ebben az j, javtott kiadsban abba is be szeretnnk ve zetni az olvaskat, hogy az SQL-t hasznlatakor milyen alapvet eljrsokkal mdosthat jk az adatbzisokban tallhat adatokat.

Az Olvas teht a fenti dntsnk eredmnyt tartja a kezben. Knyvnk annyiban egyedlll az SQL-lel foglalkoz ktetek kztt, hogy az adatbzisrendszerek megvals tsaitl szinte teljesen fggetlenl trgyalja az SQL-t. A msodik kiads j pldk szzait, valamint a npszer nylt forrs MySQL adatbzis-kezel rendszer mintaadatbzisainak knyvnkhz igaztott vltozatait tartalmazza. Ha elolvastuk a knyvet, minden tudssal fel lesznk vrtezve ahhoz, hogy brmilyen informcit kiolvassunk vagy mdostsunk, amire csak szksgnk van.

Ksznetnyilvnts
Egy ehhez hasonl knyv megrsa mindig csapatmunka: szerkesztk, munkatrsak, roko nok s bartok nyjtanak lelkesen tmogatst, s ltjk el a szerzket hasznos tancsokkal, amikor a legnagyobb szksg van rjuk. Minket is ezek az emberek btortottak szntele nl, k segtettek a feladatra sszpontostani, s k sztnztek, hogy csinljuk vgig. Elszr is szeretnnk ksznetet mondani Elizabeth Peterson szerkesztnek, amirt szt klt, hogy ksztsk el a msodik kiadst. Ksznet jr Kristin Weinbergernek is, aki a munka sorn a helyes irnyba terelgetett minket. Nem feledkezhetnk meg Chuck Toporek szerkesztrl, Rornny Freneh-rl s a nagyszer produkcis csapatrl sem. K ln ksznet illeti Chrysta Meadowbrooke-ot, aki nagyszer munkt vgzett a vgs kz irat korrektrzsval, s nem csak sok-sok kvetkezetlensget javtott ki, hanem mg a javtsra szorul SQL-pldkra is rmutatott. Vgl, szeretnnk megksznni Karen Gettman fszerkeszt erfesztseit, aki sszerakta ezt a csapatot, s figyelemmel ksrte a teljes munkt. Elismers jr szakmai lektorainknak, Stephen Forte-nak s Keith Hare-nek is. Keith sok idt tlttt az sszes plda tnzsvel, kiszrt jnhny hibt, s javaslatokat tett a sz veg jobb ttelre. Mg egyszer ksznjk mindenkettjknek, hogy idt s energit fek tettek abba, hogy segtsenek neknk egy igazn alapos munkt letenni az asztalra az SQLlekrdezsekrl. Vgl mg egyszer kln ksznet Keith Hare-nek, aki elszt rt a ktethez. Keith, aki a nemzetkzi SQL-szabvnygyi bizottsg elnke, elsrang SQL-szakrt, akinek a trgy ban szerzett tudst s tapasztalatt igen nagyra becsljk, s megtiszteltetsnek vesszk, hogy a knyvnk felvezetsl szolgl gondolatait s megjegyzseit paprra vetette.

A szerzkrl
John L. Viescas fggetlen tancsad, tbb mint 40 vnyi tapasztalattal. Plyafutst rend szerelemzknt kezdte, s nagy adatbzis-alkalmazsokat tervezett az IBM nagygpes rendszereihez. Hat vet tlttt az Applied Data Research-nl a texasi Dallasban, ahol egy tbb mint 30 emberbl ll csapat vezetjeknt az IBM mainframe szmtgpeihez k szlt adatbzis-kezel termkekhez kapcsold kutatsokrt, fejlesztsekrt s a termk-

tmogatsrt felelt. Mikzben az Applied Data Research-nl dolgozott, diplomt szerzett zletviteli pnzgyi ismeretekbl a Dallasban tallhat texasi egyetemen. Tanulmnyait kitntetssel vgezte. John 1988-ban csatlakozott a Tandem Computers, Inc. grdjhoz, ahol adatbzis-npsze rst programok fejlesztsrt s megvalstsrt felelt az Egyeslt llamok nyugati r szt kiszolgl eladsi rszlegen, valamint mszaki oktatanyagokat lltott ssze s sze minriumokat tartott a Tandem NonStop SQL nev relcis adatbzis-kezel rendszerrl Hawaiitl Coloradig s Alaszktl Arizonig. John az els knyvt (A Quick Reference Guide to SQL, Microsoft Press, 1989) kutatsi projektknt rta, amelynek clja az ANSI-86 SQL-szabvny, az IBM DB2, a Microsoft SQL Server, az Oracle Corporation Oracle rend szere s a Tandem NonStop SQL nyelvtana kztti hasonlsgok dokumentlsa volt. A Tandem-tl szabadsgot kivve megrta a Running Microsoft Access (Microsoft Press, 1992) els kiadst, amelybl eddig ngy kiads kszlt, a Microsoft Office Access Inside Out (Microsoft Press, 2004 s 2007 a Running sorozat folytatsa) kt kiadsa s a BuildingMicrosof Access Applications (Microsoft Press, 2005) mellett. John 1993-ban megalaptotta a sajt tancsad cgt, amely informcis rendszerek ze meltetsvel kapcsolatban ad tancsokat klnfle kis- s nagyvllalatoknak szerte a vil gon, elssorban a Microsoft Access s SQL Server adatbzis-kezel termkekre szakosod va. A cgnek irodi vannak a New Hampshire-i Nashuban, illetve a franciaorszgi Prizs ban. 1993 ta minden vben elnyerte a legrtkesebb szakrt cmet a Microsoft Product Support Services-tl a nyilvnos tmogatsi frumokon nyjtott szakmai segtsgrt. John webhelyt a www.viescas.com cmen ltogathatjuk meg, e-mailben pedig a johnv@viescas.com cmre rhatunk neki.
***

Michael J. Hernandez vetern adatbzis-fejleszt, tbb mint 20 vnyi alkalmazsfejlesztsi ta pasztalattal, amelyet klnbz ipargakban, a legklnflbb gyfeleknek vgzett mun ka sorn szerzett. Mike szakterlete a relcis adatbzisok tervezse az adatbzis-terve zsrl rta a nagy siker Database Design for Mere Mortals (msodik kiads, AddisonWesley, 2004; magyarul: Adatbzis-tervezs - A relcis adatbzisok alapjairl fldi ha landknak, Kiskapu, 2004) cm knyvet. Egsz plyja sorn az SQL-lel dolgozott, olyan SQL alap adatbzis-kezelkhz fejlesztve alkalmazsokat, mint a Microsoft Access s a Microsoft SQL Server, emellett szmos adatbzis-kezelsi tmj knyvnek s folyirat nak volt a trsszerzje, illetve szakmai lektora. Mike 2002-ben a Microsofthoz kerlt, ahol teljes munkaidben dolgozik. Kezdetben a Visual Studio Tools for Office (VSTO) csapatnak kzssgi programmenedzsereknt a fejlesztk kzssgi tevkenysgt irnytotta, majd 2006-ban a VSTO termkmenedzse-

re lett. Ebben a munkakrben a feladata a jvbeni termkstratgia kidolgozsnak else gtse, valamint a VSTO npszerstse a vsrlk s fejlesztk kztt klnfle mdsze rekkel. Ahogy karrierje sorn mr annyiszor tette, Mike gyakran tart eladst fejleszti konferencikon s felhasznli tallkozkon szerte az orszgban, illetve az egsz vilgon. Valamelyik korbbi letben Mike zenszknt rt el sikereket, a legklnflbb helyeken szrakoztatva a kznsget. Knnyed eladsmdjt s kantaktusteremt kpessgt a kznsggel ennek a szrakoztatmvszi rksgnek tulajdontja. Mike soha nem sznt meg zensznek lenni, ezrt a VSTO csapatnak tagjaibl zenekart verbuvlt, hogy alkalma nyljon j tmegek eltt pengetni szeretett gitrjt. Mike ma is gyakran a hrok kz csap, ha akad pr szabad perce a munkartekezletek kztt. Mike lvezi az let olyan apr dolgait, mint az rkig tart bngszs egy Barnes & Noble knyvesboltban, egy amerikai kv szrcslse a Starbucksban, egy finom szivar elpfkelse, vagy a he gyi kerkprozs felesgvel, Kendrval. Mike-nak e-mailben az mjhernandez@msn.com cmre rhatunk.

s mg valami. Ez a knyv egy kis OCR-ezsen esett t, gy pr helyesrsi s gpelsi hiba elfordulhat, ez nem (felttlenl) az "eredeti szerzk" hibja. Ezekrt elnzst krek. - A korrektor [:D]

Olvasd ezt is - www.kuruc.info

Bevezets
Bizonyra n is haland, gy tvedhet."
- James Shirley - The Lady of Pleasure

Ha nem csak alkalmi szmtgphasznlk vagyunk, valsznleg hasznltuk mr a struktu rlt lekrdeznyelvet vagy ms nven SQL-t akr anlkl, hogy tudtunk volna rla. Az SQL a szabvnyos nyelv, amelyen keresztl a legtbb adatbzisrendszerrel kommuni klhatunk. Minden alkalommal, amikor adatokat tltnk be egy tblzatkezel programba vagy olvasztunk be egy dokumentumba egy szvegszerkeszt programban, tbb mint va lszn, hogy az SQL-t hasznljuk valamilyen formban. Amikor csatlakozunk az Inter netre, hogy megltogassunk egy kereskedelmi webhelyet a Weben, s megrendeljnk egy knyvet, lemezt, filmet vagy valami mst abbl a sok tucatnyi terrnkfajtbl, ami hozz frhet, szinte biztos, hogy a weboldal a httrben ugyancsak az SQL segtsgvel ri el a bolt adatbzist. Ha teht egy olyan adatbzisrendszerbl kell adatokat kinyernnk, amely az SQL-t hasznlja, olvassuk el ezt a knyvet, s jobban megrthetjk a nyelvet.

Fldi halandk vagyunk?


Feltehetjk a krdst: Ki szmt kznsges fldi halandnak? n? Nos, a vlasz nem egyszer. Amikor elkezdtk rni ezt a knyvet, azt hittk, hogy az SQL nev adatbzis nyelv szakrti vagyunk. Menet kzben azonban rjttnk, hogy sok szempontbl mi is csak kznsges fldi halandk vagyunk. Az SQL nhny konkrt megvalstst na gyon jl ismertk, de ahogy megvizsgltuk, hogyan alkalmazzk az SQL-t a klnbz, kereskedelmi forgalomban kaphat termkek, a nyelv szmos addig ismeretlen finoms gt felfedeztk. (Ne TROLLkodj! - ez a korrektornak szl...!)

Teht ha az albbi lersok brmelyike rnk illik, mi is fldi halandk vagyunk: Ha olyan szmtgpes alkalmazsokat hasznlunk, amelyek segtsgvel adatokat rhetnk el egy adatbzisrendszerbl, valsznleg egyszer fldi halandk va gyunk. Az els alkalommal, amikor nem a vrt adatokat kapjuk az alkalmazsunk ba ptett lekrdezeszkzket hasznlva, meg kell vizsglnunk a httrben meg bv SQL-utastsokat, hogy kidertsk, mirt. Ha mostanban fedeztk fel a szmos elrhet asztali adatbzis-kezel alkalmazs egyikt, de nehezen tudjuk meghatrozni s lekrdezni a szksges adatokat, biz tosan fldi halandk vagyunk. Ha adatbzis-programozknt dolgozunk, akinek ksz termkeket kell szem eltt tar tania egyes bonyolult problmk megoldsakor, kznsges fldi halandk vagyunk. Ha szakrti vagyunk egy adott adatbzis-kezel termknek, de most azzal a fel adattal talljuk magunkat szembe, hogy a meglev rendszernk adatait egy msik, az SQL-t tmogat rendszerbe kell beptennk, csupn fldi halandk vagyunk. Rviden, brki, akinek egy az SQL-t ismer adatbzisrendszert kell hasznlnia, haszonnal forgathatja ezt a knyvet. Kezd adatbzis-felhasznlknt, aki csak most fedezte fel, hogy a szmra szksges adatokat az SQL segtsgvel nyerheti ki, minden alapvet is meretet (st annl tbbet is) megtallhatunk a ktetben, ha pedig tapasztalt felhasznlk vagyunk, akinek hirtelen bonyolult feladatokat kell megoldania, vagy tbb olyan rend szert kell egyttmkdsre brnia, amelyek az SQL-re plnek, a knyvbl tleteket kap hatunk arra, hogy miknt aknzhatjuk ki az SQL adatbzisnyelv sokrt kpessgeit.

Nhny sz a knyvrl
Minden, amit ebben a knyvben olvashatunk, az SQL adatbzisnyelv jelenlegi Interna tional Organization for Standardization (ISO, Nemzetkzi Szabvnygyi Szervezet) szab vnyn (az ISO/IEC 9075-2:2003 jel dokumentumon) alapul, abban a formban, ahogy azt a npszer adatbzisrendszerek legtbbje ma megvalstja. Az ISO-dokumentumot az American National Standards Institute (ANSI, Amerikai Szabvnygyi Hivatal) is a ma gv tette, vagyis valban nemzetkzi szabvnyrl van sz. A knyvben ismertetett SQL teht nem ktdik egyetlen konkrt szoftvertemkhez sem. Ahogy a 3. fejezetben rszletesebben megtanulhatjuk, az SQL-szabvny egyszerre tbbet s kevesebbet hatroz meg annl, amit a legtbb kereskedelmi adatbzis-kezel termk megvalst Az adatbzis-kezelk gyrti a halad szolgltatsok kzl mg sokat nem valstottak meg, de a szabvny magjt a legtbben tmogatjk.

A npszer termkek szles krt vizsgltuk meg, hogy meggyzdjnk rla, hogy a knyv ben tadott ismeretek a gyakorlatban is alkalmazhatk. Ha egyes elterjedt termkekben azt talltuk, hogy nem ismerik a nyelv valamelyik alapszolgltatst, a szvegben figyelmeztetst helyeztnk el, s lertuk, milyen ms szabvnyos mdon fogalmazhatjuk meg az adatbzis kezelhz intzett krelmnket Azokban az esetekben, amikor az SQL-szabvny egy fontos rszt csak nhny gyrt tmogatja, ismertetjk a krdses utastsok formjt, s kerl megoldsokat javaslunk. A knyvet t fbb rszre osztottuk: Az I. rsz (A relcis adatbzisok s az SQL) elmagyarzza, hogyan plnek a mai adatbzisrendszerek egy szigor matematikai modellre, s rviden ismerteti annak az adatbzis-lekrdez nyelvnek a trtnett, amelybl a ma SQL-knt ismert nyelv kifejldtt. Ezen kvl ebben a rszben egyes egyszer szablyokat is megtanu lunk, amelyeket betartva gondoskodhatunk rla, hogy az adatbzisaink felptse egszsges legyen. A II. rsz (Az SQL alapjai) a SELECT utasts hasznlatba, a kifejezsek ltrehoz sba, valamint az informciknak az ORDER BY zradkkal trtn rendezsbe vezet be bennnket, illetve megtudhatjuk belle, hogy miknt szrhetjk az adato kat a WHERE zradk segtsgvel. A III. rsz (Tbbtbls lekrdezsek) megmutatja, hogyan fogalmazhatunk meg olyan lekrdezseket, amelyek egynl tbb tblbl olvasnak ki adatokat. Ebben a rszben megtanuljuk, hogyan kapcsolhatunk ssze tblkat egy lekrdezsben az INNER JOIN, OUTER JOIN s UNION mveletekkel, valamint hogy miknt hasz nlhatunk allekrdezseket. A IV. rsz (Adatok sszestse s csoportostsa) azt trgyalja, hogy miknt nyerhe tnk ki sszest adatokat, illetve hogy miknt csoportosthatjuk s szrhetjk az sszestett informcikat Ebben a rszben tanulunk majd a GROUP BY s a HAVING zradkokrl Az V. rsz (Adathalmazok mdostsa) azt magyarzza el, hogy miknt rhatunk olyan lekrdezseket, amelyek sorok egy adott csoportjt mdostjk egy tblban. Ennek a rsznek a fejezeteibl tanulhatjuk meg az UPDATE, az INSERT s a DELETE utasts hasznlatt A knyv vgn tallhat fggelkekben megtallhatjuk az sszes megismert SQL-elem szintaxisdiagramjt, a mintaadatbzisok felptst, az t legelterjedtebb adatbzis-kezel rendszerben megvalstott dtum- s idkezel fggvnyeket, valamint az SQL tovbbi ta nulmnyozshoz ajnlott knyvek jegyzkt A knyvhz egy CD is tartozik, amely a k tet sszes mintaadatbzist tartalmazza, tbb klnbz formtumban.

Mirl nem szl a knyv?


Br ez a knyv a 2003-as SQL-szabvnyon alapul, amely a legfrissebb volt, amikor a knyvet rtuk (azta kidolgozs alatt ll a 2007/2008-as szabvnyvzlat), nem trgyalja a szabvny minden rszlett. Valjban a 2003-as SQL-szabvny sok szolgltatst mg hossz vekig nem fogjk megvalstani - ha egyltaln megvalstjk - a fontosabb adat bzisrendszerekben. Knyvnk alapvet clja, hogy szilrd tudst nyjtson az SQL nyelv lekrdezsek rshoz. A knyv sorn gyakran javasoljuk az adatabzis-kezelnk doku mentcijnak fellapozst, hogy megtudjuk, mkdik-e egy adott szolgltats. Ez nem azt jelenti, hogy a fbb adatbzisrendszerek szolgltatsainak csak a legkisebb kzs ne vezjt trgyaljuk, mindazonltal igyeksznk figyelmeztetni, ha egyes rendszerek egy szolgltatst mskpp vagy egyltaln nem valstanak meg. Ha az adatbzisunkat hibsan terveztk meg, nehzsget okozhat mst ltrehozni, mint egyetlen tblt hasznl egyszer lekrdezseket, ezrt egy fejezetet az adatbzis-terve zsnek szenteltnk, hogy segtsnk azonostani a problms helyzeteket, de az emltett fejezetben csak az alapelveket ismertetjk. Az adatbzis-tervezsi elvek kimert trgyal sa, illetve annak a vizsglata, hogy egy adott felptst hogyan valsthatunk meg egy konkrt adatbzisrendszerben, tlmutat knyvnk keretein. Ennek a knyvnek az sem a tmja, hogy miknt oldhatunk meg egy problmt a legha tkonyabban. Ahogy a ksbbi fejezeteket olvassuk, lthatjuk majd, hogy egy adott prob lmra tbb megoldst is javasolunk. Egyes esetekben, amikor egy lekrdezs megrsa egy adott mdon valsznleg minden rendszeren teljestmnyproblmkat okoz, igyek sznk erre felhvni a figyelmet. Ugyanakkor minden adatbzisrendszernek megvannak a maga erssgei s gyengi. Miutn elsajttottuk az alapokat, kszen llunk arra, hogy tovbblpjnk, s belessuk magunkat annak a konkrt adatbzisrendszernek a mkd sbe, amelyen megtanultuk, hogyan fogalmazhatjuk meg a lekrdezseinket gy, hogy optimlisan fussanak.

Hogyan olvassuk a knyvet?


A knyv fejezeteit gy terveztk meg, hogy sorrendben clszer elolvasni ket. Minden fejezet az elz fejezetekben megtanult elvekre pl, mindazonltal akkor sem vesznk el, ha rgtn a knyv kzepre ugrunk. Pldul ha mr ismerjk a SELECT utasts alap vet zradkait, s a JOIN-okrl szeretnnk tbbet tudni, nyomban a 7., 8. s 9. fejezet hez lapozhatunk. Sok fejezet vgn szmos mintafeladatot tallhatunk, a megoldsukkal s eredmnyhalmaz-mintkkal egytt. Ajnlott elszr nhny pldt tanulmnyozni, hogy jobban rtsk a szksges eljrsokat, majd nllan megprblni megoldani a ksbbi pldkat, anl kl, hogy megnznnk az ajnlott megoldsokat.

Megjegyzend, hogy ahol egy adott lekrdezs sarok tucatjait adja vissza az eredmnyhal mazban, a knyvben csak az els nhny sort mutatjuk meg, hogy kpet adjunk arrl, ho gyan kell festenie a kapott vlasznak. A sajt rendszernkn lehet, hogy nem pontosan ugyanazt az eredmnyt ltjuk, mivel minden adatbzisrendszer, amely tmogatja az SQL-t, sajt optimalizlval rendelkezik, amely kitallja, hogyan lehet a leggyorsabban megolda ni a lekrdezst. Ezen kvl az els nhny sor, amelyet az adatbzisrendszernk vissza ad, nem felttlenl egyezik meg pontosan azokkal a sorokkal, amelyeket a knyvben lt hatunk, hacsak a lekrdezs nem tartalmaz egy ORDER BY zradkot, amely megkvete li, hogy a sarok egy adott sorrendben jelenjenek meg. A legtbb fejezet vgn nllan megoldand feladatokat is tallunk, amelyek lehets get adnak arra, hogy gyakoroljuk a fejezetben tanultakat. Ne aggdjunk: a megoldsokat a CD-n tallhat mintaadatbzisok tartalmazzk, az olyan feladatokhoz pedig, amelyek egy kicsit nehezebbnek tnnek, tleteket is adunk. Ha trgtuk magunkat az egsz knyvn, az A fggelkben tallhat teljes SQLdiagramok bizonyra felbecslhetetlen rtk segtsgnek bizonyulnak az ismertetett SQL-eljrsok elsajttshoz, a sajt adatbzisaink megtervezshez pedig felhasznlhat juk a B fggelk adatbzis-felptsi mintit.

Hogyan rtelmezzk a ktet diagramjait?


A knyvben szerepl szmos diagram az SQL-ben hasznlt egyes utastsok, kulcsszavak s kifejezsek helyes hasznlati formjt szemllteti. Minden diagram vilgos kpet ad a trgyalt SQL-elem ltalnos felptsrl, de brmelyik diagramot hasznlhatjuk sablon knt is, hogy ltrehozzuk a sajt SQL-utastsainkat, vagy hogy tisztbban megrtsnk egy adott pldt. A diagramok mindegyike alapelemek halmazbl pl fel, s kt csoport egyikbe sorol hat: utastsok s meghatrozott kifejezsek. Az utastsok az SQL-nek a knyvben tr gyalt olyan f mveletei, mint a SELECT utasts, mg a meghatrozott kifejezsek olyan elemek, amelyekbl egy utasts egy rszt ptjk fel - ilyenek pldul az rtkkifejez sek, a keressi felttelek, illetve a feltteles kifejezsek. (Ne aggdjunk - ezeket a szakkifeje zseket ksbb kivtel nlkl elmagyarzzuk.) Egy utasts s egy meghatrozott kifejezs szintaxisdiagramja kztt az egyetlen klnbsg az, ahogy az utastsforma f sora kezd dik, illetve vgzdik. A diagramokat gy terveztk meg, hogy ezek a klnbsgek vilgo san mutassk, hogy egy teljes utasts vagy egy utastsn bell hasznlhat kifejezs di agramjt ltjuk-e. Az 1. bra mindkt diagramcsoport kezd- s vgpontjt szemllteti. Et tl a klnbsgtl eltekintve a diagramok ugyanazokbl az elemekbl plnek fel. A 2. brn a szintaxisdiagramok mindkt tpusra lthatunk egy-egy pldt, amelyet a diagra mok egyes elemeinek rvid magyarzata kvet.

1. bra
A szintaxisdiagram sorainak vgpontja az utastsok s a meghatrozott kifejezsek esetben

2. bra
Pldk az utastsok s a meghatrozott kifejezsek diagramjaira

1.

Utasts kezdpontja - Egy utasts f sornak kezdett jelli. Brmely elem, amely kzvetlenl a f sorban tallhat, ktelez elem, az alatta tallhat elemek pedig nem k telez (vlaszthat) elemek.

2. Az Utastsforma f sora - Az utasts vagy meghatrozott kifejezs ktelez s vlasztha t elemeinek sorrendjt hatrozza meg. Az utasts vagy meghatrozott kifejezs fel ptshez ezt a sort balrl jobbra (vagy a nyilak irnyban) kell kvetnnk.

3. Kulcsszavak - Egy utasts vagy meghatrozott kifejezs utastsformjnak ktelez nyelvi elemt jelli, amely az SQL nyelvtannak egyik kitntetett szava. A diagramok ban a kulcsszavak flkvr nagybetkkel formzottak. (Amikor tnylegesen megrunk egy utastst az adatbzis-kezel programunkban, nem muszj nagybetvel rnunk a kulcsszavakat, de az utasts is knnyebben olvashat lesz.) 4. Konkrt elem - Az utastsnak konkrtan megadand rtk nevt hatrozza meg. A konkrt (literlis) elemeket egy olyan sz vagy kifejezs brzolja, amely az tadan d rtk tpusra utal. A diagramok konkrt elemei csupa kisbetvel formzottak 5. Meghatrozott kifejezs - Olyan szt vagy kifejezst jell, amely egy olyan mveletet b rzol, amely az adott utastsban felhasznland rtket ad vissza. A knyv sorn min den olyan meghatrozott kifejezst elmagyarzunk s diagramon brzolunk, amelyet ismernnk kell. A meghatrozott kifejezseket mindig dlt betvel jelljk. 6. Nem ktelez elem - Olyan elemet vagy elemcsoportot jell, amely az utastsforma f sora alatt jelenik meg. A nem ktelez elemek lehetnek utastsok, kulcsszavak, meg hatrozott kifejezsek s konkrt rtkek is, s a tisztnlts kedvrt kln sorban sze repelnek Egyes esetekben egy adott paramterben rtkek halmazt is tadhatjuk, az egyes rtkeket vesszvel elvlasztva (lsd a 8. pontot). Szmos nem ktelez elem nek lehetnek rszelemei is (lsd a 7. pontot). A nem ktelez elemek sort ltalban balrl jobbra kell olvasnunk, ugyangy, ahogy az utastsforma f sort olvassuk. Ha mindig a nyilakat kvetjk, nem tvedhetnk Megjegyzend, hogy egyes param terek tbb rtk megadst is lehetv teszik, ezrt a nyl jobbrl balra mutathat. Miu tn azonban bertuk az sszes elemet, amire szksgnk van, a haladsi irny visszatr a szoksos balrl jobbra olvasshoz. Szerencsre a nem ktelez elemek mindegyike ugyangy mkdik, gy miutn megmutattuk, hogy miknt hasznlhatunk egy vlaszt hat elemet, tudni fogjuk az sszes olyan nem ktelez elem hasznlatnak a mdjt, amellyel a szintaxisdiagramokban tallkozhatunk. 7. Nem ktelez elem rszeleme Olyan elemet vagy elemcsoportot jell, amely egy nem ktelez elem alatt jelenik meg. A nem ktelez elemek rszelemeinek segtsgvel finomhangolhatjuk az utastsainkat, hogy sszetettebb feladatokat oldjunk meg velk. 8. Paramterlista-elvlaszt - Azt jelzi, hogy az adott paramterben egynl tbb rtket is megadhatunk, mely rtkeket vesszvel kell elvlasztanunk 9. Alternatv paramter - Olyan kulcsszt vagy meghatrozott kifejezst jell, amelyet egy vagy tbb nem ktelez elem helyett hasznlhatunk. Az utastsformban az alternatv paramterek sorai megkerlik azoknak a nem ktelez elemeknek a sorait, amelyek kel ezek a paramterek felcserlhetk. 10. Utasts vgpontja - Egy utasts f sornak vgt jelli. 11. Meghatrozott kifejezs kezdpontja - Egy meghatrozott kifejezs f sornak kezdett jelli. 12. Meghatrozott kifejezs vgpontja - Egy meghatrozott kifejezs f sornak vgt jelli.

Most, hogy megismertk ezeket az elemeket, a knyv minden szintaxisdiagramjt kpe sek lesznk elolvasni. Ha egy diagram mgis tovbbi magyarzatot ignyelne, minden in formcit megadunk, ami ahhoz szksges, hogy a diagramot knnyen s vilgosan rtel mezhessk. Hogy knnyebben megrtsk a diagramok mkdst, lssunk egy pldt egy olyan SELECT utastsra, amelyet a 2. bra alapjn ptettnk fel:

SELECT FirstName, LastName, City, DOB AS DateOfBirth FROM Students WHERE City = 'El Paso'
Ez a SELECT utasts ngy oszlopot ad vissza a Students (Tanulk) tblbl, ahogy ezt a SELECT s FROM zradkokban jelltk. Ha balrl jobbra kvetjk az utastsforma f sort, lthatjuk, hogy legalbb egy rtkkifejezst meg kell adnunk. Az rtkkifejezs lehet egy oszlop neve, egy oszlopnevek hasznlatval megalkotott kifejezs, vagy egyszeren egy (konkrt) lland rtk, amelyet meg szeretnnk jelenteni. Az rtkkifejezs paramterlista-elvlasztjval (vesszkkel) annyi oszlopot adhatunk meg, amennyit csak aka runk, ezrt tudtunk ngy oszlopot kijellni a Student tblbl. Mivel nem voltunk benne biztosak, hogy mindenki, aki a fenti SELECT utasts ltal visszaadott adatokat megtekinti, tudja, hogy mit jelent a DOB, egy lnevet rendeltnk a DOB oszlophoz, az rtkkifejezst nem ktelez AS rszelemknt megadva. Vgl a zradkot hasznltuk, hogy biztostsuk, hogy a SELECT utasts csak azokat a tanulkat adja vissza, akik El Pasban laknak. (Ha ez most mg nem vilgos, nem kell aggdnunk. Mindent megtanulunk majd rszletesen a knyv htralev rszben) Az A" fggelkben minden szksges szintaxisdiagramot megtallunk, amelyek megmu tatjk a knyvben trgyalt valamennyi utasts s meghatrozott kifejezs teljes s helyes utastsformjt Ha az egyes fejezetek olvassa kzben ezeket a diagramokat lapozzuk fel, egyes diagra moknl nmi eltrst tapasztalhatunk a fejezetben s a fggelkben lev vltozat kztt. Ennek az az oka, hogy a fejezetekben szerepl diagramok a fggelk diagramjainak egy szerstett vltozatai. Az egyszerstett diagramok segtenek, hogy egyszerbben magya rzzuk el a bonyolultabb utastsokat s meghatrozott kifejezseket, s lehetsget ad nak arra, hogy az ppen trgyalt elemekre sszpontostsunk. Emiatt nem kell, hogy fjjon a fejnk - a fggelk minden diagramjt tkletesen rteni fogjuk, ha vgigrgtuk magun kat a knyv anyagn.

A knyvben hasznlt mintaadatbzisok


A knyvhz egy CD-ROM-ot is mellkeltnk, amely t mintaadatbzist tartalmaz, amelye ket a knyv sorn bemutatott lekrdezsekhez hasznlunk. A ,,B fggelk diagramjain emellett ezeknek az adatbzisoknak a felptst is brzoltuk 1. Sales Orders (Megrendelsek) - Ez egy tipikus, megrendelsek bejegyzseit tartalmaz adatbzis egy kerkprokat s kerkpr-alkatrszeket rust zlet szmra. (Minden adatbzisokkal foglalkoz knyvben kell lennie legalbb egy megrendelsi adatbzis nak, nem igaz?) Entertainment Agency (Szrakoztatgynksg) - Ezt az adatbzist gy szerkesztettk meg, hogy eladmvszek, gynkk, gyfelek s lekttt eladsok rekordjait kezelje. Hasonlan terveznnk meg egy rendezvny- vagy szllodaszoba-foglalsi adatbzist is. School Scheduling (Iskolai nyilvntarts) - Ezt az adatbzis-felptst kzp- vagy fiskolai hallgatk nyilvntartshoz hasznlhatjuk Az adatbzis nem csak az rkat tartja nyil vn, hanem azt is, hogy az egyes rkat mely oktatk tartjk, s hogy a tanulk milyen osztlyzatokat kaptak. Bowling League (Tekebajnoksg) - Ez az adatbzis tekecsapatok nyilvntartsra szolgl, s a csapatokat, azok tagjait, a lejtszott meccseket s az eredmnyeket trolja. Recipes (Receptek) - Ezt az adatbzist a kedvenc receptjeink trolsra s szerkesztsre hasznlhatjuk Nhny olyan receptet is tallhatunk benne, amit rdemes kiprblni.

2.

3.

4. 5.

A CD-n mind az t mintaadatbzis megtallhat ngy klnbz formtumban: A Microsoft Office Access nev asztali adatbzis-kezeljnek nagy npszersge mi att az adatbzisokat elksztettk a Microsoft Access 2000 (Version 9.0, .mdb flkiterjeszts) segtsgvel is. Azrt a termk 9-es vltozatt vlasztottuk, mert az majdnem teljesen tmogatja a jelenlegi ISO/IEC SQL-szabvnyt, s az ebben a for mtumban mentett adatbzisfjlokat az Access 2000, 2002 (XP), 2003 s 2007 segts gvel is megnyithatjuk. Az emltett fjlokat az MSAccess alknyvtrban tallhatjuk A msodik formtum adatbzisfjljai a Microsoft SQL Server 2000 hasznlatval k szltek (.mdf fjlkiterjeszts). Ezek mellett SQL-parancsfjlokat (.sql fjlkiterjeszts) s ktegfjlokat (.bat fjlkiterjeszts) is mellkeltnk, amelyek segtsgvel a mint kat felvehetjk egy Microsoft SQL Server katalgusba. Az emltett fjlok, amelyek az MSSQLServer alknyvtrban tallhatk, Microsoft SQL Server 2005 kiszolglk hoz is kapcsolhatk A Microsoft SQL Server 2005 Express Edition ingyenesen letlt het a http://msdn.microsoft.com/vstudio/express/sql/download/default.aspx cmrl. Az adatbzisfjlok harmadik csoportjt a npszer nylt forrs MySQL adatbzis rendszer 5-s vltozatval ksztettk el. Az adatbzis szerkezetnek ltrehozs hoz, az adatok betltshez s a mintanzetek ltrehozshoz a sajt MySQLadatknyvtrunkban a MySQL alknyvtrban tallhat parancsfjlokat (.sql fjlkiter-

jeszts) hasznlhatjuk, de az InnoDB adatknyvtrunkat is bellthatjuk gy, hogy a MySQL alknyvtrra mutasson. A MySQL adatbzisrendszer kzssgi kiadsnak egy pldnyt szabadon letlthetjk a http://www.mysql.com/ cmrl. A negyedik formtum SQL-parancsfjlok sorozatbl ll, amelyeket mdosthatunk, s brmely olyan fontosabb adatbzisrendszerrel hasznlhatunk, amelyik ismeri az SQL-t. Az SQLScripts alknyvtrban lev parancsfjlok kztt tallunk olyat, amellyel meghatrozhatjuk az egyes adatbzisok smit (a tblkat), olyat, amely ben INSERT utastsokkal betlthetjk az adatokat, s olyat is, amelyben CREATE VIEW utastsokkal ltrehozhatjuk a lekrdezseket Br ezeket a parancsfjlokat a Microsoft SQL Server segdeszkzeivel ksztettk, egyszerstettk ket, hogy ltalnosan hasznlhatk legyenek a legtbb adatbzisrendszerrel A mintafjlok teleptshez olvassuk el a CD gykrknyvtrban tallhat ReadMe.txt fjlt. Ha a CD-mellkletet Apple Macintosh rendszerhez csatlakoztatjuk, csak a MySQL s az SQL-parancsllomnyok mintafjljait rhetjk el. Br a CREATE TABLE, CREATE INDEX, CREATE CONSTRAINT s INSERT parancsoknak nagyon gondosan csak a legelterjedtebb s leg egyszerbb formjt hasznltuk a minta SQL-parancsfjlokban, lehet, hogy neknk vagy az adatbzisunk felgyeljnek kiss mdostania kell a fjlokat, hogy mkdjenek a mi adatbzisrendszernkn is. Ha az adatbzisrendszert egy tvoli kiszolgln keresztl hasznljuk, elfordulhat, hogy az adatgazda engedlyre lesz szksgnk ahhoz, hogy az ltalunk megadott SQL-parancsokkal felptsk a mintaadatbzisokat. A II., III. s IV. rsznek a SELECT utastssal foglalkoz fejezeteihez tartoz pldautast sokat s megoldsokat az egyes mintaadatbzisok example vltozatban (pldul: SalesOrdersExample, EntertainmentAgencyExample) talljuk. Mivel az V. rsz pldi mdstjk a mintaadatokat, minden mintadatbzisbl elksztettnk egy modify vlto zatot is (pldul: SalesOrdersModify, EntertainmentAgencyModify). Az V. rszhez tartoz mintaadatbzisok olyan tovbbi oszlopokat s tblkat tartalmaznak, amelyek nem szere pelnek a SELECT pldkban, ami lehetv teszi, hogy szemlltessk az UPDATE, INSERT s DELETE lekrdezsek kpessgeit.

Mindig a Srgakves ton!


- A mumpicok kirlya Dorothy-nak az z, a nagy varzsl-ban

Most, hogy vgigolvastuk a Bevezetst, kszen llunk arra, hogy megtanuljuk az SQL hasznlatt, nem igaz? Nos, taln. Jelenleg mg mindig a hzban vagyunk, amelyet a tor nd ostromol, s mg nem hagytuk el Kansast Mieltt rgtn a 4. fejezetre ugrannk, ahol majd elksztnk egy egyszer lekrdezst, fogadjuk meg a szerzk tancst, s olvassuk vgig az els hrom fejezetet. Az l. fejezet bl kpet kaphatunk arrl, hogyan szletett meg a relcis adatbzisok elve, s hogyan vlt bellk az adatbzisoknak az ipargban ma a legszlesebb krben hasznlt tpusa. Remljk, hogy ez megvilgt valamit azzal az adatbzisrendszerrel kapcsolatban is, ame lyet ppen hasznlunk. A 2. fejezetben megtanuljuk, hogyan finomhangolhatjuk az adat szerkezeteinket, hogy az adataink megbzhatak s mindenekeltt pontosak legyenek. Ha az adatszerkezeteinket rosszul terveztk meg, komoly nehzsgeink lehetnek egyes SQL-utastsokkal, ezrt mindenkppen ajnlott alaposan elmlyedni ebben a fejezetben. Valjban a 3. fejezet a Srgakves t kezdete. Itt ismerjk meg az SQL eredett, s hogy miknt nyerte el a nyelv a jelenlegi formjt. Azokrl az emberekrl s cgekrl is olvashatunk majd, akik ttr munkjukkal segtettk a nyelv fejlesztst, s azt is meg tudhatjuk, hogy mirt van olyan sok vltozata az SQL-nek. Vgl elmondjuk, hogyan vlt az SQL orszgos s nemzetkzi szabvnny, s arrl is szt ejtnk, hogy milyen kiltsai vannak az SQL-nek a jvben. Miutn elolvastuk az emltett fejezeteket, mr j ton fogunk jrni z birodalma fel. Csak kvessk a htralev fejezetekben lefektetett utat, s amikor a vgre rnk a knyvnek, rjvnk majd, hogy megtalltuk a varzslt aki nem ms, mint mi magunk.

A relcis adatbzisok s az SQL

I .rsz

Mit jelent az, hogy relcis"?


A tuds egy kis rsze annak a tudatlansgnak, amit rendszereznk s osztlyozunk." - Ambrose Bierce

A fejezet tmakrei
Az adatbzisok fajti A relcis modell rvid trtnete A relcis adatbzisok felptse Mirt hasznosak szmunkra a relcis adatbzisok? sszefoglals

Mieltt fejest ugrannk az SQL vilgba, nem rt, ha rendelkeznk nmi httrinformcival a relcis adatbzisokrl, ezrt elszr arrl fogunk beszlni, hogy mirt talltk ki a relcis adatbzisokat, hogyan plnek fel, s mirt hasznosak a szmunkra. Ez az az alap, amelyen biztosan kell llnunk, hogy megrthessk az SQL lnyegt, s tisztn lssuk, hogy miknt aknzhatjuk ki legjobban az SQL kpessgeit.

Az adatbzisok fajti
Mit neveznk adatbzisnak? Amint azt bizonyra tudjuk, az adatbzis adatok rendezett gyjtemnye, amellye(kke)l valamilyen szervezett dolgot vagy szervezsi folyamatot modelle znk. Tulajdonkppen nem szmt, hogy paprt vagy egy szmtgpes programot haszn lunk az adatok sszegyjtsre s trolsra: amg az adatokat konkrt clra, valamilyen rendezett formban gyjtjk s troljuk, adatbzisrl beszlhetnk. A tovbbiakban persze azt fogjuk felttelezni, hogy az adatgyjtsre s az adatok kezelsre szmtgpprogramot hasznlunk. Az adatbzis-kezels terletn ltalnossgban ktfle adatbzis van hasznlatban: mveleti adatbzisok s elemz adatbzisok. Ma szerte a vilgon mveleti adatbzisok kpezik szmos vllalat, szervezet s intzmny gerinct. Ezt a fajta adatbzist elssorban mindennapi adatgyjtsre, -mdostsra s -kezelsre hasznljk. A trolt adatok dinami-

ami azt jelenti, hogy folyamatosan vltoznak, s mindig friss informcikat tkrznek. Az olyan szervezetek, mint az ruhzak, a gyrtcgek, a krhzak s klinikk, valamint a knyvkiadk mveleti adatbzisokat hasznlnak, mivel az adataik percrl percre vltoznak. Ezzel szemben az elemz adatbzisok korbbrl szrmaz, adott idponthoz kapcsold adatokat trolnak s rendszereznek. Az elemz adatbzisok a vltozsok irnynak nyomon kvetsben hasznosak, valamint a hossz id alatt sszegyjttt statisztikai adatok megjele ntst, illetve a taktikai s stratgiai zleti elrejelzsek ksztst segtik. Az ilyen adatbzis ok vagyis az adatok soha (vagy csak nagyon ritkn) mdosulnak, j adatok felvtelre viszont gyakran sor kerlhet. Az elemz adatbzisokbl kinyert infor mcik ltalban nem naprakszek - egy adott idpontban ksztett pillanatfelvtelt mutatnak az adatokrl. Ilyen fajta adatbzist hasznlnak pldul a kmiai laboratriumok, a fldmr vllalatok, illetve a piackutat s -elemz cgek.

kus adatok,

statikus adatokat trolnak,

A relcis modell rvid trtnete


Az adatbzismodelleknek tbbfle tpusa ltezik. Egyeseket - pldul a hierarchikus s hlzati modelleket csak rgi rendszereken hasznlnak, mg msok pldul a relcis modell szles krben elterjedtek. Ms knyvekben az objektum alap, objektumrelcis s OLAP (online analytical processing, elektronikus elemz-feldolgoz) modellekkel is tallkozhatunk. Az SQL-szabvny bvtmnyeket hatroz meg ezeknek a modelleknek a tmogatsra, s lteznek kereskedelmi adatbzisrendszerek, amelyek meg is valstanak egyes bvtmnyeket ezek kzl. Mi azonban szigoran a relcis modellre s a nemzetk zi SQL-szabvny magjra fogunk sszpontostani. A kezdetek A relcis adatbzis elve 1969-ben szletett meg, s azta valsznleg a legszlesebb krben hasznlt modell vlt az adatbzis-kezelsben. A relcis modell atyja, Dr. Edgar F. Codd (19232003) az IBM kutatjaknt dolgozott az 1960-as vekben, s azt vizsglta, hogy milyen j mdszerekkel lehet nagy adatmennyisgeket kezelni. Az akkor ltez adatbzismodellekkel s -termkekkel elgedetlen volt, ami arra indtotta, hogy matemati kai elvek s szerkezetek segtsgvel prblja meg megoldani az eltte ll tmrdek fel adatot. Matematikusknt szilrdan hitt benne, hogy a matematiknak lteznek olyan gai, amelyeket alkalmazva megoldhatk az olyan problmk, mint az adatismtlds (redun dancia) kikszblse, az adatok egysgessgnek biztostsa, illetve annak lekzdse, hogy az adatbzisok szerkezete tlzottan fggjn a fizikai megvalststl. Dr. Codd hivatalosan 1970 jniusban, az A cm, mrfldknek szmt munkjban1 mutatta be az ltala kidolgozott j relcis modellt. A modell a matematika kt gra tmaszkodott: a halmazelmletre s

Databases
1

Relational Model of Data for Large Shared

Communications of the ACM, 1970. jnius, 377-87. oldal

az elsrend prediktumlogikra. Maga a modell is a halmazelmlet egyik kulcsfogalma, a relci kifejezs utn kapta a nevt. (Szles krben elterjedt tveds, hogy a relcis modell neve onnan ered, hogy a relcis adatbzisok tbli kztt kapcsolatok llhatnak fenn. Most, hogy tudjuk az igazsgot, nyugodtan alhatunk.) Szerencsre nem kell rszlete iben ismernnk a halmazelmletet vagy az elsrend prediktumlogikt ahhoz, hogy re lcis adatbzisokat tervezhessnk s hasznlhassunk. Ha megfelel adatbzis-tervezsi mdszert kvetnk - pldul a Mike Hernandez Database Design forMere Mortals (Addison-Wesley, 2004; magyarul: Adatbzis-temezs: A relcis adatbzisok alapjairl fldi halandknak. Kiskapu, 2004) cm knyvben ismertetett eljrsokat -, egszsges s hatkony adatbzis-szerkezetet alakthatunk ki, amelyet bizalommal hasznlhatunk mindenfle adat sszegyjtsre s kezelsre. (Nos rendben, termszetesen egy kicsit azrt muszj rtennk a prediktumokhoz s a halmazelmlethez, ha bonyolultabb feladatokat is meg szeretnnk oldani. A prediktumokkal - lltsokkal vagy szrkkel; a prediktum valjban csak egy fellengzs nv - kapcsolatos alapvet tudnivalkat a 6., a halmazelmlet alapjait pedig a 7. fejezetben trgyaljuk.)

A relcis adatbzisprogramok
Megjelense ta a relcis modell az alapja az RDBMS (relational database management system, relcis adatbzis-kezel rendszer) nven ismert adatbzistermkeknek Ilyen termket szmos gyrt kszt, s az vek sorn a legklnbzbb ipargak s szerveze tek vettk t a hasznlatt, akik sokfle krnyezetben alkalmazzk Az 1970-es vekben a nagyszmtgpek olyan programokat hasznltak, mint az IBM ltal kifejlesztett System R vagy a Berkeley-i Kaliforniai Egyetemen megalkotott INGRES A nagygpekhez ksztett RDMBS rendszerek fejlesztse az 1980-as vekben olyan programokkal folytat dott, mint az Oracle Corporation Oracle, illetve az IBM DB2 rendszere, a szemlyi szm tgpeknek az 1980-as vek kzepn bekvetkezett elterjedse pedig olyan programokat szlt, mint az Ashton Tate dBase, az Ansa Software Paradoxvagy a Microrim R:BASE szoftvere. Emikor az 1980-as vek vgn, illetve az 1990-es vek elejn nyilvnvalv vlt, hogy igny mutatkozik a PC-k kztti adatmegosztsra, megszletett az gyfl-ki szolgl rendszerek elve, amelyet a kzponti helyen trolt, kzsen hasznlhat, knnyen kezelhet s biztonsgoss tehet adatok tlete ksrt. Erre az elvre olyan termkek pltek, mint az Oracle Oracle Si, valamint a Microsoft SQL Semer rendszere.Krlbell 1996 ta mr abban az irnyban is sszehangolt erfesztseket tesznek, hogy az adatbzisok elrhetsgt az Interneten is biztostsk. A szoftvergyrtk komolyan veszik a krdst, s olyan termkekkel igyekeznek vlaszolni a kihvsokra, amelyek webkzpontbbak: ilyen az Allaire cg Cold Fusion, a Sybase Sybase Enterprise Application Studio vagy a Microsoft Visual Studio programcsomagja. A webfejlesztsben az egyik legnpszerbb adatbzis-kezel a MySQL AB nylt forrs MySQL-je. Ezt eredeti leg Linux rendszer webkiszolglkhoz terveztk, de mr Microsoft Windows rendszere ken fut vltozata is ltezik.

A relcis adatbzisok felptse


A relcis modellnek megfelelen az adatok a relcis adatbzisokban relcikban tro ldnak, amelyeket a felhasznl tblk formjban rzkel. Minden relci egyedekbl (tuple, rekord) s jellemzkbl (mez) pl fel. Ezen kvl a relcis adatbzisoknak termszetesen ms tulajdonsgaik is vannak ezekkel foglalkozunk az albbiakban.

Tblk
A tblk az adatbzisok f szerkezeti elemei. Minden tbla mindig egyetlen konkrt trgyat brzol. A rekordok s mezk logikai sorrendje a tbln bell egyltaln nem szmit. Legalbb egy mezt az gynevezett elsdleges kulcsot, amely egyedileg azonostja a tbla egyes rekordjait minden tblnak tartalmaznia kell. (Az l. l. brn pldul a CustomerID a Customers tbla elsdleges kulcsa.) Valjban a relcis adatbzisokban lev adatok a tblk ez utbbi kt tulajdonsgnak ksznheten fggetlenek attl, hogy fizikailag miknt troldnak a szmtgpen. Ez a felhasznlknak elnys, mert gy ahhoz, hogy kinyerjenek egy adatot, nem kell ismernik az adatot trol rekord fizikai helyt.

1.1. bra

Plda egy tblra A trgy, amelyet egy adott tbla brzol, egy objektum vagy egy esemny lehet. Ha a trgy
egy objektum, a tbla valami olyat brzol, ami megfoghat: egy szemlyt, egy helyet vagy ms fizikai dolgot. Objektumokknt tblban brzolhatok pldul piltk, termkek, gpek, hallgatk, pletek, berendezsek, s gy tovbb. A tpustl fggetlenl minden objektumnak vannak olyan jellemzi, amelyek adatknt trolhatk, s ezeket az adatokat aztn szinte vgtelen mdon lehet feldolgozni Erre a fajta tblra az 1.1. bra mutat jelleg zetes pldt. Amennyiben a tbla trgya egy esemny, a tbla valami olyasmit brzol, ami egy adott idpontban trtnt, illetve trtnik (majd), s olyan jellemzi vannak, amelyeket rgzteni szeretnnk. Ezeket a jellemzket pontosan ugyangy trolhatjuk adatknt, s dolgozhatjuk fel mint informcit, mint azokban a tblkban, amelyek valamilyen konkrt objektumot

rnak le. Olyan esemnyeket rgzthetnk pldul, mint a brsgi trgyalsok, az osztalk kifizets, a laborleletek vagy egy fldtani mrs. Az 1.2. brn pldul egy olyan esemnyt brzol tblt lthatunk, amelyet letnk sorn mindnyjan tlnk - egy orvosi vizetet.

Mezk
A mez az adatbzis legkisebb szerkezeti egysge, amely a hozz tartoz tbla trgynak egy jellemzjt rja le. A mezk azok a szerkezetek, amelyek az adatokat tnylegesen troljk. A mezkben lev adatokat azutn kinyerhetjk s informciknt megjelenthet jk, szinte brmilyen elkpzelhet formban. Vssk az esznkbe, hogy az adatokbl kinyert informcik minsge egyenesen arnyos az id mennyisgvel, amit arra ford tunk, hogy maguknak a mezknek az adat- s szerkezeti kvetkezetessgt biztostsuk A mezk fontossgt nem lehet tlbecslni. Egy megfelelen megtervezett adatbzisban minden mez kizrlag egyetlen rtket tartalmaz, s a neve azonostja a benne trolt rtk tpust. gy nagyon egyszerv vlik az adatok bevitele a mezkbe: ha olyan nev mezket ltunk, mint a FirstName (Kereszt nv), a LastName (Vezetknv), a City (Vros), a State (llam/Megye) vagy a ZipCode (Irnytszm), pontosan tudni fogjuk, hogy milyen rtket kell rnunk az egyes mezkbe, s az adatok rendezse (pldul llam szerint) vagy az sszes olyan szemly kikeresse, akinek a vezetkneve Viescas, ugyancsak knny lesz.

Rekordok
A rekord egy adott tbla trgynak egy egyedi pldnyt jelkpezi, amely a tbla adott sorban tallhat sszes mezt tartalmazza, fggetlenl attl, hogy az egyes mezkben szerepelnek-e rtkek. A tblk meghatrozsnak mdjbl kvetkezik, hogy minden rekordot egy egyedi rtk azonost a teljes adatbzisban, s ez az rtk a rekord elsdle ges kulcs mezjben troldik. Az 1.1. brn pldul minden rekord egy-egy klnbz vsrlt jell a tblban, s az adatbzisban az egyes vsrlkat a CustomerID (Vsrlazonost) mez azonostja. Amint emltettk, az egyes rekordok a tbla adott sorban tallhat sszes mezt tartal-

mazzk, s minden mez egy-egy tulajdonsgt rja le a rekord ltal brzolt vsrlnak A rekordok kulcsfontossgak a tblakapcsolatok megrtsben, mivel tudnunk kell, hogy egy tbla rekordjai milyen viszonyban llnak egy msik tbla rekordjaival.

Kulcsok
A kulcsok klnleges mezk, amelyek meghatrozott szerepet tltenek be az egyes tblk ban. Ezt a szerepet a kulcs tpusa hatrozza meg. Br egy tbla tbbfle kulcsot tartalmaz hat, mi csak a kt legfontosabb tpust trgyaljuk az elsdleges kulcsot s az idegen kulcsot. Az elsdleges kulcs olyan mez vagy mezcsoport, amely egyedileg azonostja a tblban tallhat sszes rekordot. (Ha az elsdleges kulcs kt vagy tbb mezbl ll, sszetett elsdleges kulcsrl beszlnk.) Kt oka van annak, hogy mirt az elsdleges kulcs a legfon tosabb: az rtke egy konkrt rekordot azonost a teljes adatbzisban, a mezje pedig ugyanott egy adott tblt. Az elsdleges kulcsok emellett a tbla szintjn biztostjk a kvetkezetessget, s segtenek kapcsolatokat kialaktani ms tblkkal. Az adatbzisaink minden tbljnak rendelkeznie kell elsdleges kulccsal.

Az 1.3. brn lthat AgentID (gynkazonost) mez j plda az elsdleges kulcsra, mert
egyedileg azonostja az egyes gynkket az Agents (gynkk) tbln bell, s a tbbszr szerepl rekordok kikszblsvel gondoskodik a tblaszint kvetkezetessgrl A kulcsot ezenkvl arra is hasznljuk, hogy az Agents s az adatbzis ms tbli (pldul ahogy az brn lthatjuk az Entertainers tbla) kztt kapcsolatokat alaktsunk ki.

1.3. bra
Elsdleges s idegen kulcsok

Amikor eldntjk, hogy kt tblt valamilyen mdon sszekapcsolunk, a kapcsolatot ltalban gy hozzuk ltre, hogy az els tbla elsdleges kulcst lemsoljuk s beszrjuk a msodik tblba, ahol az idegen kulcs lesz. (Az idegen kulcs kifejezs onnan ered, hogy a msodik tblnak mr van sajt elsdleges kulcsa, s az els tblbl tvett elsdleges kulcs a msodik tbla szmra idegen.)

Az 1.3. brn egy j pldt lthatunk az idegen kulcsra. A pldban az AgentID elsdleges kulcs az Agents tblban s idegen kulcs az Entertainers tblban. Amint lthatjuk, az Entertainers tblnak mr van egy elsdleges kulcsa - az EntertainerID. Ebben a kapcsolatban az AgentID az a mez, amely megteremti az sszefggst az Agents s az Entertainers tbla kztt. Az idegen kulcsok nem csak abbl a nyilvnval szempontbl fontosak, hogy segtenek kapcsolatot teremteni kt tbla kztt, hanem azrt is, mert biztostjk a kapcsolatszint kvetkezetessget, vagyis a kt tbla rekordjai mindig helyes kapcsolatban fognak llni egymssal, mivel az idegen kulcs mez rtkeinek a hivatkozott elsdleges kulcs rtkei bl kell szrmazniuk. Az idegen kulcsok a rettegett rva rekordokat is segtenek elkerl ni, amelyek klasszikus pldja egy olyan rendelsi rekord, amelyhez nem tartozik vsrl. Ha nem tudjuk, ki adta fel a rendelst, nem lesznk kpesek feldolgozni azt, s termsze tesen kiszmlzni sem tudjuk, ami rontja a negyedves eladsi mutatinkat.

Nzettblk
A nzet vagy nzettbla olyan virtulis tbla, amely az adatbzis egy vagy tbb tbljnak mezibl pl fel. A nzettblt alkot tblkat alaptblknak hvjuk. A relcis modell azrt tekinti virtulisnak (ltszlagosnak) a nzettblkat, mert azok adatai ms tblkbl szrmaznak. Maguk a nzettblk nem trolnak adatokat; az adatbzisban valjban a szerkezetk az egyetlen informci, ami troldik rluk. A nzettblk lehetv teszik, hogy az adatbzisban trolt informcikat szmos klnfle szempontbl tekintsk meg, ami nagy rugalmassgot nyjt az adatok kezelsben. Nzet tblkat tbbflekppen is ltrehozhatunk klnsen akkor hasznosak, amikor tbb, egymssal kapcsolatban ll tblra alapozzuk ket. Ltrehozhatunk pldul egy olyan nzettblt, amelyik olyan informcikat sszegez, mint a Seattle belvrosban dolgoz csok ltal ledolgozott rk teljes szma, vagy egy olyat, amelyik adott mezk szerint csoportostja az adatokat. Ez utbbi fajtra j plda egy olyan nzettbla, amelyik egy adott terlet llamait veszi alapul, hogy megmutassa az egyes vrosokban az alkalmazottak teljes szmt. A nzettblk jellemz felptst az 1.4. brn lthatjuk. Sok RDBMS program a nzettblkat mentett lekrdezsknt valstja meg, s ezen a n ven vagy egyszeren lekrdezsknt hivatkozik rjuk. A lekrdezsek a legtbb esetben rendelkeznek a nzettblk minden jellemzjvel, vagyis csupn a nevk az egyetlen k lnbsg kztk (Mi mr gyakran morfondroztunk rajta, hogy ehhez nem egy marketing csapatnak van-e kze.) Fontos megjegyezni, hogy egyes gyrtk mr kezdik a valdi ne vkn nevezni a lekrdezseket, de mindegy, hogy a mi relcis adatbzis-kezelnk hogy hvja ket, az adatbzisban valjban nzettblkkal dolgozunk. Knyvnk cme ettl fggetlenl SQL-lekrdezsek fldi halandknak, mikzben elssor ban azt szeretn megtantani, hogy miknt ptsk fel a nzettblinkat Ahogy a 2. feje zetbl majd megtudhatjuk, egy relcis adatbzist akkor terveznk meg helyesen, ha

az adatainkat gy bontjuk fel, hogy minden trgyhoz vagy esemnyhez egyetlen tbla tar tozzon. Ugyanakkor tbbnyire sszefgg trgyakrl vagy esemnyekrl szeretnnk in formcit szerezni - mely vsrlk s milyen rendelst adtak fel, mely tanrok milyen rkat tartanak, s gy tovbb , ehhez pedig nzettblt kell ltrehoznunk, s tudnunk kell, hogy milyen SQL kddal rhetjk ezt el.

Kapcsolatok
Ha egy adott tbla rekordjai valamilyen mdon egy msik tbla rekordjaihoz trsthatk, azt mondjuk, hogy a tblk kztt kapcsolat ll fenn. A kapcsolat megteremtsnek mdja a kapcsolat tpustl fgg. Kt tbla kztt hromfle kapcsolat llhat fenn: egy-az-egyhez, egy-a-tbbhz (egy-a-sokhoz) vagy tbb-a-tbbhz (sok-a-sokhoz) A kapcsolatok fajtinak ismerete ltfontossg ahhoz, hogy megrtsk, hogyan mkdnek a nzettblk, s hogy miknt kell a tbbtbls SQL-lekrdezseket megtervezni s hasznlni. (Errl a III. rszben tanulunk majd bvebben.)

Egy-az-egyhez
Kt tbla akkor ll egy-az-egyhez kapcsolatban, ha az els tbla egy rekordja a msodik tbla egyetlen rekordjhoz kapcsoldik, s a msodik tbla egy rekordja is egyetlen rekord dal ll kapcsolatban az els tblbl. Ebben a fajta kapcsolatban az egyik tbla elsdleges tbla, mg a msik msodlagos tbla lesz. A kapcsolatot gy hozzuk ltre, hogy vesszk

az elsdleges tbla elsdleges kulcst, s beszrjuk azt a msodlagos tblba, ahol idegen kulcs lesz belle. Ez a kapcsolatok klnleges fajtja, mivel sok esetben az idegen kulcs egyben a msodlagos tbla elsdleges kulcsaknt is viselkedik.

Az egy-az-egyhez kapcsolatra az 1.5. brn lthatunk egy jellemz pldt: itt az Agents
(gynkk) az elsdleges, a Compensation (Djazs) pedig a msodlagos tbla. A kt tbla kztt olyan kapcsolat ll fenn, amelyben az Agents tbla egy-egy rekordja csak egy-egy rekordhoz kapcsoldik a Compensation tblban, s a Compensation tbla egy-egy rekordja is csak egy-egy rekordhoz trsul az Agents tblbl. Figyeljk meg, hogy az AgentID val ban elsdleges kulcs mindkt tblban, de egyben idegen kulcs a msodlagos tblban. A kapcsolatban a vezet szerepet jtsz elsdleges tbla kijellse teljesen tetszleges. Az egy-az-egyhez kapcsolatok nem tl gyakoriak; ltalban akkor tallkozunk velk, ha egy tblt titkosts vgett kt rszre bontottak.

Egy-a-tbbhz Ha kt tbla egy-a-tbbhz kapcsolatban ll, akkor az els tbla egy rekordja a msodik tbla tbb rekordjhoz is kapcsoldhat, de a msodik tbla egy rekordja csak egyetlen rekorddal llhat kapcsolatban az els tblbl. Ezt a kapcsolatot gy hozzuk ltre, hogy vesszk a kapcsolat egy oldaln ll tbla elsdleges kulcst, s beszrjuk azt a tbb oldalon lev tblba, ahol idegen kulcs lesz belle. Az egy-a-tbbhz kapcsolatra az 1.6. brn lthatunk egy jellemz pldt: itt az Entertainers (Eladk) tbla egy-egy rekordja tbb rekordhoz kapcsoldik az Engagements (Rendezv nyek) tblban, de az Engagements tbla egy-egy rekordja csak egyetlen rekordhoz trsul az Entertainers tblbl. Ahogy nyilvn kitalltuk, az Engagements tbla idegen kulcsa az EntertainerID.

Tbb-a-tbbhz
Kt tbla akkor ll tbb-a-tbbhz kapcsolatban, ha az els tbla egy rekordja a msodik tbla tbb rekordjhoz kapcsoldik, s a msodik tbla egy rekordja is tbb rekorddal ll kapcsolatban az els tblbl. Ezt a kapcsolatot helyesen gy hozzuk ltre, hogy ltreho zunk egy gynevezett kapcsol tblt. Ennek a tblnak a segtsgvel egyszeren trst hatunk rekordokat az egyik tblbl a msik tbla rekordjaihoz, s a kapcsol tbla arrl is gondoskodik, hogy a kapcsold adatok hozzadsa, trlse vagy mdostsa sorn semmilyen gond ne lpjen fel. A kapcsol tblt gy hatrozzuk meg, hogy lemsoljuk a kapcsolatban rszt vev mindkt tbla elsdleges kulcst, s ezek segtsgvel alkotjuk meg az j tbla szerkezett. A kulcsmezk kt jl elklnthet szerepet tltenek be: egyttesen a kapcsol tbla sszetett elsdleges kulcst adjk, kln-kln pedig idegen kulcsokknt viselkednek.

Ha egy tbb-a-tbbhz kapcsolat nem megfelelen jtt ltre, feloldatlan kapcsolatrl beszlnk. Erre az 1.7. brn lthatunk egy vilgos pldt. Itt a Customers (Megrendelk) tbla egy-egy rekordja az Entertainers tbla tbb rekordjhoz kapcsoldhat, s az Enter tainers tbla egy-egy rekordja is a Customers tbla tbb rekordjhoz. A kapcsolat a tbb-a-tbbhz viszonyban rejl problma miatt lesz feloldatlan. A krds ez: miknt trsthatjuk egyszeren az els tbla rekordjait a msodik tbla rekordjaihoz? Ha a krdst az 1.7. brn lthat tblk szerint fogalmazzuk jra, a problma ez lesz: hogyan trsthatunk egy megrendelt tbb eladhoz vagy egy adott eladt tbb meg rendelhz? (Ha egy szrakoztatgynksget vezetnk, bizonyra azt remljk, hogy idvel minden megrendel tbb eladt is lekt, illetve az egyes eladk fellpseire is tbben lesznek kvncsiak.) Beszrjuk pr megrendel mezjt az Entertainers tblba? Vagy adjunk nhny eladmezt a Customers tblhoz? Mindkt megolds szmos prob lmt eredmnyez, amikor a kapcsold adatokkal dolgozunk, elssorban az adatok kvetkezetessge tern. A problmra az a megolds, hogy a korbban ismertetett mdon ltrehozunk egy kapcsol tblt, amellyel megfelelen feloldhatjuk a tbb-a-tbbhz kap csolatot. A megolds gyakorlati megvalstst az 1.8. bra mutatja.

Az 1.8. brn a kapcsol tblt gy hoztuk ltre, hogy vettk a CustomerID mezt a Cus tomers tblbl, valamint az Entertainers mezt az Entertainers tblbl, s ezekbl alkot tuk meg az j tblt. Az adatbzis ms tblihoz hasonlan a kapcsol tblnak is sajt ne-

ve van: Engagements (Rendezvnyek). Az Engagements tbla j plda egy olyan tblra, amely egy esemnyrl trol informcikat. Lthatjuk pldul, hogy az 1003-as elad & the Deep Six) a 10001-es megrendelnl (Doris Hartwig) lpett fel februr 23-n. A kapcsol tbla igazi elnye, hogy lehetv teszi, hogy a kapcsolatban rszt vev mindkt tb lbl tetszleges szm rekord kztt teremtsnk kapcsolatot. Ahogy a plda is mutatja, most mr egyszeren sszekapcsolhatunk egy adott megrendelt tetszleges eladkkal vagy egy adott eladt akrhny megrendelvel Ahogy korbban mondtuk, a kapcsolatok megrtse nagyon fontos ahhoz, hogy hatkony tbbtbls SQL-lekrdezseket rjunk, ezrt amikor elrnk a knyv III. rszhez, rdemes visszalapozni ide, s felfrissteni az emlkezetnket

Mirt hasznosak szmunkra a relcis adatbzisok?


De mirt is kell trdnnk azzal, hogy megrtsk a relcis adatbzisokat? Mirt rdekeljen minket, hogy milyen krnyezetben kezeljk az adatainkat? s egyltaln: mirt hasznosak szmunkra a relcis adatbzisok? Nos, ideje, hogy megvilgostsuk az elmnket, s fejest ugorjunk a mlyvzbe! Az id, amit a relcis adatbzisok tanulmnyozsra fordtunk, olyan befektets, ami egyrtelmen megtrl Aktv tudsra kell szert tennnk a relcis adatbzisokkal kapcso latban, mivel ma ez a legszlesebb krben elterjedt adattrolsi modell Felejtsk el, amit korbban olvastunk a tmrl vagy amit Huba az informatikai rszlegrl mondott neknk - a cgek s klnfle szervezetek ltal gyjttt s kezelt adatok tlnyom tbbsgt rel cis adatbzisokban troljk. A modellnek valban lteznek bvtsei, a relcis adatbzi sokat kezel programok ma mr objektumkzpont megoldsokat is alkalmaznak, s az ilyen adatbzisok mra teljesen bepltek a Vilghl szvetbe, de nem szmt, hogy csrjk-csavarjuk, aprtjuk s fszerezzk, ezek az adatbzisok ettl mg relcis adat bzisok maradnak. A relcis modell 35 ve velnk l, a szerepe csak egyre ersdik, s belthat idn bell nem lesz, ami felvltsa. Szinte minden ma hasznlt kereskedelmi adatbzis-kezel szoftver relcis alapokon nyugszik (br Dr. Codd, C. J. Date s Fabian Pascal komolyan megkrdjeleznk, hogy brmelyik kereskedelmi megvalsts valban relcis-e!). Ha adatbzisokkal dolgozunk, s sikert szeretnnk elrni, tudnunk kell, hogyan kell megtervezni egy relcis adatbzist, s hogyan kell azt megvalstani valamelyik npszer RDBMS programban radsul azta, hogy oly sok cg folytat zleti tevkenysget az Interneten, nmi webfejlesztsi tapasztalat sem rt. A relcis adatbzisok gyakorlati ismerete tbb szempontbl is a segtsgnkre lehet. Minl tbbet tudunk pldul a relcis adatbzisok tervezsrl, annl knnyebben tudunk majd egy adott adatbzishoz felhasznli alkalmazsokat fejleszteni. Meg fogunk lepdni, milyen

egyszerv vlik az RDBMS programunk hasznlata - mivel rtjk, hogy mire szolglnak az egyes eszkzei, s hogyan hasznlhatjuk azokat a leghatkonyabban. Gyakorlati isme reteinknek akkor is j hasznt vesszk, amikor az SQL hasznlatt igyeksznk elsajttani, hiszen az SQL a relcis adatbzisok ltrehozsnak s kezelsnek szabvnyos nyelve.

Hogyan tovbb?
Mr rtjk, hogy mirt fontos megismerkednnk a relcis adatbzisokkal, de azt is lt nunk kell, hogy az adatbzisok elmlete s az adatbzisok tervezse kt klnbz dolog. Az adatbzisok elmlett azok az elvek s szablyok alkotjk, amelyeken a relcis adatbzismodell alapul: ez az, amit az iskolk szentlyeiben oktatnak, s amit a valsg stt bugyraiban gyorsan el kell hajtanunk. Az elmlet persze fontos, mert nlkle nem kszt hetnnk szerkezetileg helyes relcis adatbzisokat, s az adatbzisaink adatain vgzett mveletek eredmnye sem lenne megjsolhat. Ezzel szemben viszont az adatbzisok tervezse azokat a strukturlt folyamatokat foglalja magba, amelyek rvn egy relcis adatbzis felpl. A helyes adatbzis-tervezsi mdszerek ismerete elengedhetetlen ahhoz, hogy pontos s kvetkezetes adatokat tartalmaz adatbzisokat hozzunk ltre, illetve hogy a kinyert informcik is a lehet legpontosabbak s legfrissebbek legyenek. Ha teljes vllalatra kiterjed adatbzisokat szeretnnk tervezni s ltrehozni, webes alap internetes zleti adatbzisokat akarunk fejleszteni, vagy adattrakat kvnunk zemeltetni, clszer megfontolni az adatbzisok elmletnek tanulmnyozst. Ez akkor is rvnyes, ha az emltett terletek egyikben sem akarunk elmerlni, csak elismert adatbzis-szakrtv szeretnnk vlni. Mindenki msnak, aki relcis adatbzisokat tervez s kszt klnbz rendszerekre (s gy vljk, k teszik ki e knyv olvasinak nagy tbbsgt), a helyes adat bzis-tervezsi mdszerek alapos ismerete elegend. Ne feledjk, hogy egy adatbzist meg tervezni viszonylag knny, de megvalstani azt egy adott RDBMS programban egy adott rendszerre mr teljesen ms tszta (amit ms knyvekbl sajtthatunk el). A piacon szmos j knyvet tallunk az adatbzis-tervezsrl. Egyesek, pldul Mike Hernandez Database Design for Mere Mortals cm knyve (Addison-Wesley, 2004; ma gyarul: Adatbzis-tervezs: A relcis adatbzisok alapjairl fldi halandknak. Kiskapu, 2004) csak az adatbzis-tervezs mdszertanval foglalkoznak, mg msok, pldul C.J. Date An Introduction to Database Systems (Addison-Wesley, 2003) cm mve, keverik az elmletet s a gyakorlati tervezst. (Arra viszont fel kell hvnunk a figyelmet, hogy az elmleti knyvek ltalban nem knny olvasmnyok.) Miutn eldntttk, hogy mi lyen irnyban szeretnnk tovbbhaladni, vlasszuk ki s vegyk meg a megfelel knyve ket, fogjunk egy cssze dupla eszpresszt (vagy ha ms kedvenc italunk van, akkor azt), s merljnk el bennk. Ha mr ltalnossgban magabiztosan mozgunk a relcis adat bzisok krben, r fogunk jnni, hogy mlyebben meg kell ismerkednnk az SQL-lel is - ezrt olvassuk ezt a knyvet.

sszefoglals
A fejezetet a ma hasznlatos adatbzisok klnbz tpusainak rvid ismertetsvel kezd tk. Megtudtuk, hogy a dinamikus adatokkal dolgoz vllalatok s intzmnyek mveleti adatbzisokat hasznlnak, s gy biztostjk, hogy a kinyert informcik mindig a lehet legfrissebbek s legpontosabbak legyenek, mg a statikus adatokat kezel szervezetek elemz adatbzisokat alkalmaznak. Ez utn rviden ttekintettk a relcis adatbzismodell trtnett. Elmesltk, hogy a modellt Dr. E. F. Codd alkotta meg a matematika egyes gaira alapozva, s hogy a modell mr tbb mint 35 ve ltezik. Adatbzis-kezel programokat, ahogy ma ismerjk ket, klnfle szmtgpes krnyezetekhez ksztenek, a teljestmnyk, a hatkony sguk s a kpessgeik kre pedig az 1970-es vek ta folyamatosan n. A nagygpektl az asztali s webes alkalmazsokig sok-sok vllalat gerinct RDBMS programok kpezik. Ezt kveten a relcis adatbzisok felptst vizsgltuk. Bemutattuk az alapvet sszete viket, s rviden elmagyarztuk a szerepket. Tanultunk a kapcsolatok hrom lehetsges tpusrl, s megrtettk, mirt fontosak, nem csak magnak az adatbzis szerkezetnek a szempontjbl, hanem abbl a szempontbl is, hogy miknt segtik az SQL mkds nek jobb megrtst. Vgl elmagyarztuk, hogy milyen hasznunk szrmazik a relcis adatbzisok tanulmnyo zsbl, s hogy miknt kell megtervezni ket. Most mr tudjuk, hogy a ma hasznlatos adatbzisok kzl a relcis adatbzisok a legelterjedtebbek, s szinte minden adatbzis kezel szoftver mgtt, amivel tallkozhatunk, egy relcis adatbzis ll. Ezen kvl arrl is kpet kaptunk, hogy merre haladhatunk, ha kicsit tbbet szeretnnk tudni a relcis adat bzisok elmletrl s tervezsrl. A kvetkez fejezetben arra tanulunk meg nhny mdszert, hogy miknt finomhangolhatunk meglev adatbzis-szerkezeteket.

A helyes adatbzis-szerkezet kialaktsa


Hzainkat a sajt kpnkre formljuk, ezrt k is formlnak minket." - Sir Winston Churchill

A fejezet tmakrei
Mi a clja ennek a fejezetnek? Mirt lnyeges a helyes szerkezet? A mezk finomhangolsa A tblk finomhangolsa Szilrd kapcsolatok kialaktsa Ennyi az egsz? sszefoglals

Knyvnk legtbb olvasja bizonyra egy meglev adatbzis-szerkezettel dolgozik, amelyet (remljk) a kedvenc RDBMS programjra ltetett. Nem tudhatjuk, hogy az Olvas - vagy az, aki elksztette az adatbzist tnylegesen rendelkezett-e az adatbzis megfelel megter vezshez szksges tudssal, kpzettsggel vagy idvel, ezrt a legrosszabbat felttelezzk: valsznleg egy pr olyan tblnk van, amelyekre rfrne nmi finomhangols. Ebben a fe jezetben szerencsre ppen olyan eljrsokrl fogunk tanulni, amelyek segtenek gatyba rzni az adatbzisunkat, s gondoskodnak rla, hogy knnyen kinyerhessk a szksges informcikat a tblkbl

Mi a clja ennek a fejezetnek?


Felmerlhet bennnk a krds, hogy mirt foglalkozunk ebben a knyvben adatbzis tervezssel, klnsen az egyik els fejezetben. Nos, ennek oka egyszer: ha az adatb zisainkat rosszul tervezzk meg, akkor sok SQL-utasts, amit a knyv htralev rszben megtanulunk, a legjobb esetben is nehezen megvalsthat lesz, de az is megtrtnhet, hogy szinte hasznavehetetlenn vlik. Ha azonban az adatbzisaink szerkezete helyes, a knyvben bemutatott fogsokat hatkonyan hasznlhatjuk

A fejezetben nem foglalkozunk az adatbzis-tervezs finomsgaival, csak az a cl, hogy az adatbzisainkat viszonylag j formba hozzuk. Melegen ajnlott vgigolvasni a fejezetet, hogy a tblink szerkezete biztosan helyes legyen.

Fontos megjegyeznnk, hogy az adatbzisok logikai felptst fogjuk trgyalni. Nem mutatjuk be, hogyan kell ltrehozni vagy megvals tani egy adatbzist egy olyan adatbzis-kezel rendszerben, amelyik ismeri az SQL-t, mivel- ahogy a bevezetben emltettk - ezek a tmakrk kvl esnek a knyv keretein.

Mirt lnyeges a helyes szerkezet?


Ha az adatbzisaink szerkezete nem megfelel, a ltszlag egyszer informcik kinyer svel is gondjaink lehetnek, adataink nehezen kezelhetv vlnak, s minden alkalommal knszenveds lesz mezket adni a tblkhoz vagy mezket trlni onnan. A rosszul meg vlasztott felpts az adatbzist az adatok kvetkezetessge, a tblk kapcsolatai s a pontos informcik kinyerse szempontjbl is rinti, s ezek csak a jghegy cscst jelentik. Ha el szeretnnk kerlni a knldst, gondoskodjunk rla, hogy az adatbzisaink szerkezete helyes legyen. Az emltett problmk tbbsge elkerlhet, ha mr az elejn megfelelen tervezzk meg az adatbzisunkat, de akkor sincs minden veszve, ha ezen a lpsen mr tl vagyunk: csak annyit kell tennnk, hogy alkalmazzuk a kvetkezkben bemutatott eljrsokat, s mris lvezhetjk a helyes szerkezet elnyeit. Azzal azonban tisztban kell lennnk, hogy a vgs szerkezet minsge egyenesen arnyos annak az idnek a mennyisgvel, amit a finomhangolsra fordtunk. Minl gondosabban s trelmesebben alkalmazzuk a bemu tatott mdszereket, annl biztosabban jrunk sikerrel. Most pedig lssuk az els lpst a helyes adatbzis-szerkezet kialaktsa fel: a mezk finomhangolst.

A mezk finomhangolsa
Mivel a mezk az adatbzisok alapvet szerkezetei, gondoskodnunk kell rla, hogy tkletes formban legyenek, mieltt a tblk egsznek finomhangolsba kezdhetnnk. Sok esetben a mezk kijavtsa megoldja az adott tbla szmos problmjt, s elejt veheti ms lehetsges gondoknak is.

Mikor helyes egy nv? (Els rsz)


Ahogy az elz fejezetben megtanultuk, a mezk a hozzjuk tartoz tbla trgynak egy-egy jellemzjt rjk le. Ha egy meznek megfelel nevet adunk, kpesek lesznk azonostani, hogy milyen jellemzt is jell. A ktrtelm, homlyos jelents vagy bonyo lult nv elbb-utbb biztosan gondot okoz, s arra utal, hogy a mez cljt nem gondol tuk t alaposan. Vizsgljuk t a mezink nevt az albbi ellenrzlista szerint:

A nv az egsz cgen bell jelentst hordoz, s lerja a mez cljt? Ha az adatb zist tbb rszleg is hasznlni fogja, mindenkppen olyan nevet vlasszunk, ami mindenki szmra, aki hozzfr az adott mezhz, jelentssel br. A jelents fontos, mert ha olyan szt hasznlunk, ami klnbz embereknek mst s mst jelent, magunk keressk a bajt. A mez neve vilgos s egyrtelm? A PhoneNumber (Telefonszm) pldul olyan meznv, ami nagyon flrevezet lehet. Milyen telefonszmot tartalmaz a mez? Otthoni vagy munkahelyi szmot? Mobilszmot? Tanuljunk meg konkrtan fogal mazni! Ha az emltettek telefonszmok mindegyikt rgztennk kell, hozzunk ltre HomePhone (Otthoni telefon), WorkPhone (Munkahelyi telefon) s CellPhone (Mobil) mezket. A meznevek vilgoss s egyrtelmv ttele mellett arra is gyeljnk, hogy ugyan azt a meznevet ne hasznljuk tbb tblban. Tegyk fel pldul, hogy hrom tb lnk van Customers (Vsrlk), Vendars (Beszlltk) s Employees (Alkalmazottak) nven. Ktsgtelen, hogy rnindhrom tblban szksg lesz City (Vros) s State (l lam) mezkre, s mindegyiknek azonos lesz a neve az egyes tblkban. Ezzel addig nincs gond, amg nem kell hivatkoznunk egy adott mezre. De hogyan klnbztet jk meg pldul a Vendars tbla City mezjt a Customers tbla s az Employees tb la City meziti? A vlasz egyszer: adjunk egy rvid eltagot mindegyik mez nev hez. A Vendars tbla mezje lehet mondjuk VendCity, a Customers tbl CustCity, az Employees tbl pedig EmpCity. gy a hrom mezre mr vilgosan hivatkozha tunk. (Ezt a mdszert ms ltalnos mezk pldul FirstName, LastName, Address, vagyis Keresztnv, Vezetknv s Cm - esetben is alkalmazhatjuk.) A legfontosabb, amit meg kell jegyeznnk, hogy gyeljnk r, hogy az adatbzis rninden mezje egyedi nevet kapjon, s a nv csak egyetlen egyszer szerepeljen a teljes adatbzis-szerkezetben. Ez all a szably all az egyetlen kivtelt az jelenti, amikor egy mezt arra hasznlunk, hogy kapcsolatot teremtsnk kt tbla kztt. A mez neveknt rvidtst vagy betszt hasznltunk? Ha igen, vltoztassuk meg! A betszavak nehezen megfejthetk, viszont knny flrertelmezni ket. Kpzeljk el, hogy egy olyan mezt ltunk, amelynek a neve CAD_SW. Honnan tudjuk, hogy rnit jell a mez? A rvidtsekkel is csnjn kell bnnunk; vatosan hasznljuk ket csak akkor, ha a mez nevt vilgosabb teszi, mert nem szabad, hogy elterelje a figyelmet a nv jelentsrl. Olyan nevet adtunk, ami rejtve vagy nyltan egynl tbb jellemzre utal? Az ilyen neveket knny kiszrni, mert ltalban szerepel bennk az and (s) vagy az or (vagy) sz. Az olyan meznevek, amelyek fordtott perjelet (\), ktjelet (-) vagy s" (&) jelet tartalmaznak, szintn egyrtelmen jelzik, hogy tbb jellemzre utal nvrl van sz. Teht ha olyan mezkkel rendelkeznk, mint a Phone/Fax vagy az Area or Location, akkor vizsgljuk fell, hogy milyen adatot trolnak, s ha lehet, bontsuk fel ket kisebb, elklnthet mezkre.

Az SQL-szabvny szablyos azonostknt hatrozza meg azokat a neveket, amelyeknek betvel kell kezddnik, s csak betket, sz mokat, valamint alhzsjelet tartalmazhatnak. A szkzk nem megengedettek. A szabvny a hatrolt azonostt is meghatrozza: ez olyan - (ketts) idzjelekkel k rlvett- nv, amelynek betvel kell kezddnie, s csak betket, szmokat, alhzsjelet, szkzket s meghatrozott klnleges karaktereket tartalmazhat. Mivel sok SQL-megvalsts csak a szablyos azonostkat tmogatja, azt javasoljuk, hogy a meznevek eset ben kizrlag ezt a formt kvessk.
Miutn az ellenrzlista segtsgvel fellvizsgltuk a mezneveinket, egy feladatunk marad; gondoskodnunk kell rla, hogy a meznevekben csak egyes szmot hasznljunk. Az olyan tbbes szm nevek, mint a Categories (Kategrik), azt sugalljk, hogy a mez egy rekordhoz kt vagy tbb rtket is tartalmazhat, ami nem tl j tlet. A meznvnek azrt kell egyes szmnak lennie, mert a hozz tartoz tbla trgynak egyetlen jellemzjt ja le. A tblk neve ezzel szemben tbbes szm kell legyen, mert hasonl objektumok vagy esemnyek gyjtemnyt brzoljk. Ha tartjuk magunkat ehhez a szablyhoz, a tb laneveket knnyen megklnbztethetjk a meznevektl.

A durva lek lecsiszolsa


Most, hogy tisztba tettk a mezneveket, sszpontostsunk magra a mezknek a szer kezetre. Ha biztosak vagyunk benne, hogy a mezink szerkezete megfelel, akkor is tehetnk nhny dolgot annak rdekben, hogy a mezk a lehet leghatkonyabbak legyenek. Az albbi ellenrzlistt kvetve vizsglhatjuk meg, hogy kell-e mg finomta nunk a mezkn: Gondoskodjunk rla, hogy a mez a tbla trgynak egy konkrt jellemzjt rja lel A lnyeg itt az, hogy llaptsuk meg, hogy a mez valban az adott tblba tartozike. Ha nem ltfontossg a tblhoz, tvoltsuk el, vagy helyezzk t egy msik tb lba. Az egyetlen kivtel e szably all, amikor a mezt arra hasznljuk, hogy kap csolatot teremtsnk az adott tbla s az adatbzis ms tbli kztt, vagy amikor azrt adjuk a mezt a tblhoz, hogy az adatbzisprogramnak segtsnk egy adott feladat elvgzsben. A 2.1. brn lthat Classes (rk) tblban pldul a Staff LastName (Tanr vezetkneve) s StaffFirstName (Tanr keresztneve) mezk felesle gesek, mivel StafflD (Tanrazonost) meznk is van. A StafflD kapcsolja ssze a Classes s a Staff (Tanri kar) tblt, s egy nzettbla vagy egy SELECT SQL-lekrdezs segtsgvel egyszerre mindkt tblbl megtekinthetnk adatokat. Ha egy tblban felesleges mezk tallhatk, trlhetjk ket, de egy msik tbla alapja knt is felhasznlhatjuk azokat, ha az adatbzis szerkezetben mshol nem bukkanak fel. (Ennek mdjt a fejezet ksbbi rszben mutatjuk be.) Gondoskodjunk rla, hogy a mez csak egyetlen rtket tartalmazzon! Az olyan mezket, amelyek tbb azonos tpus rtket is tartalmazhatnak, tbbrtk mezk nek hvjuk (ilyen pldul egy tbb telefonszmot trol mez), azokat pedig,

amelyekbe kett vagy tbb klnbz rtk is kerlhet, tbbrszes mezknek (ilyen pldul egy elem sorszmt s lerst egyarnt trol mez). A tbbrtk s tbbrszes mezk komoly kavarodst okozhatnak az adatbzisban, klnsen ha szerkeszteni, trlni vagy rendezni prbljuk az adatokat. Ha gondoskodunk rla, hogy minden mez csak egy rtket troljon, nagy lpst tesznk az adatok kvetke zetessgnek s az informcik pontossgnak biztostsa rdekben, de egyelre elg annyi, ha azonostunk minden tbbrtk s tbbrszes mezt, s feljegyezzk ket. Azt, hogy miknt oldhatjuk fel ket, a kvetkez rszben tanuljuk meg.

Gondoskodjunk rla, hogy a mez ne szmts vagy sszefzs eredmnyt trol ja! Egy helyesen megtervezett tblban nem lehetnek szmtott mezk. A probl mt magnak a szmtott meznek az rtke jelenti. A tblzatkezelk tblzataival ellenttben az adatbzistblk nem trolnak szmtsokat, gy ha a szmtsban szerepl valamelyik rtk megvltozik, a mezben trolt eredmny nem frissl. Az rtket csak sajt kezleg frissthetjk, vagy valamilyen eljrskzpont kdot kell rnunk, ami ezt nmkden elvgzi. Brmelyik megoldst vlasszuk is, ne knk, a fejlesztnek, s a felhasznlnak is knyelmetlen az rtk frisstst biztos tani. A szmtsokat ajnlott ehelyett SELECT utastsokba gyazni; ennek elnyei rl majd akkor tanulunk, ha eljutottunk az 5. fejezethez.

Gondoskodjunk rla, hogy a mez csak egyetlen egyszer szerepeljen a teljes adatbzisban! Ha elkvettk azt a gyakori hibt, hogy ugyanazt a (pldul CompanyName, vagyis Cgnv) mezt az adatbzis tbb tbljba is beszrtuk, az adatok kvetkezetlenn vlhatnak, ha az egyik tblban mdostjuk a mez rtkt, de megfeledkeznk ugyanezt a vltoztatst mindentt elvgezni, ahol a mez elfordul. Ezt a problmt gy kerlhetjk el teljesen, ha gondoskodunk rla, hogy egy mez csak egyszer szerepeljen az egsz adatbzis-szerkezetben. (Az egyetlen kivtelt ez all a szably all az jelenti, ha a mezt arra hasznljuk, hogy kapcsolatot teremtsnk kt tbla kztt.)

Egyes kereskedelmi forgalomban kaphat adatbzis-kezel rendszerek legjabb vltozatai megengedik olyan oszlopok meghatrozst is, amelyek egy szmtott kifejezs eredmnyeknt llnak el. Ha az ltalunk hasznlt adat bzisrendszer rendelkezik ezzel a szolgltatssal, akkor meghatrozhatunk szmtott mezket, de tartsuk szben, hogy az adatbzisrendszer tovbbi erforrsokat ignyel ah hoz, hogy a szmtott rtket mindig frissen tartsa, ha a kifejezsben szerepl valamelyik mez rtke megvltozna.

A tbbrszes mezk feloldsa


Ahogy korbban emltettk, a tbbrszes s tbbrtk mezk tnkretehetik az adatok kvetkezetessgt, ezrt fel kell oldanunk ket, hogy megelzznk minden problmt. Az, hogy melyikkel kezdjk, teljesen mindegy, ezrt elszr a tbbrszes mezkkel foglalkozunk.

2.2. bra
Tbla tbbrszes mezkkel

Nhny egyszer krds megvlaszolsval megllapthatjuk, hogy egy mez tbbrszes-e: Felbonthatom ennek a meznek a jelenlegi rtkt kisebb, elklnthet rszekre?, Gondot okozhat egy konkrt informci kinyerse, mert egy olyan mezben van elte-

metve, ami ms informcikat is tartalmaz?. Ha brmelyik krdsre igennel vlaszolunk, tbbrszes mezvel van dolgunk. A 2.2. brn lthatunk egy rosszul megtervezett tblt, amely tbb tbbrszes mezt is tartalmaz. A Customers tbla kt tbbrszes mezt tartalmaz: a CustomerName (Vsrl neve) s a Street Address (Cm) mezket. Ezen kvl mg egy mez rtke llhat tbb rszbl is a PhoneNumber-. Hogyan tudunk vezetknv vagy irnytszm szerint rendezni? Sehogy, mert ezek az rtkek olyan mezkbe gyazdnak, amelyek ms informcikat is trolnak Viszont ha megfigyeljk, ezek a mezk kisebb mezkre bonthatk. A CustomerName-bl pldul kt kln mezt CustFirstName s CustLastName (Vsrl keresztneve s Vsrl vezetkneve) alkothatunk. (Figyeljk meg, hogy kzben a fejezet korbbi rszben java solt elnevezsi mdszert alkalmaztuk, s a Cust eltaggal lttuk el a FirstName s LastName mezket.) Ha egy tbbrszes mezre bukkantunk egy tblban, llaptsuk meg, hogy az ltala trolt rtk hny rszbl pl fel, majd bontsuk fel a mezt megfelel szm kisebb mezre. A 2.3. brn lthatjuk, hogy miknt bonthatjuk fel a Customers tbla kt tbbrszes mezjt.

A CustomerName s StreetAddress mezk felbontsa mellett az sem rt, ha az adatbzisban a telefonszmokat kt kln mezben krzetszm s helyi telefonszm- troljuk. A legtbb zleti adatbzis egyetlen mezben trolja a telefonszmokat, a demogrfiai adatokat elemz alkalmazsokban azonban lnyeges lehet a krzetszm elklntse (ezt a szkre szabott hely miatt sajnos nem llt mdunkban bemutatni a 2.3. brn).
Nha nem knny felismerni egy tbbrszes mezt. Nzzk meg pldul a 2.4. brn lthat Instruments (Hangszerek) tblt. Els pillantsra nem vesznk szre egyetlen tbbrszes me zt sem, de ha kzelebbrl megnzzk, lthatjuk, hogy az InstrumentID (Hangszerazonos t) valjban tbb rszbl ll. Az ebben a mezben trolt rtk ktfle informcit is megad: a hangszercsoportot - pldul AMP (amplifier, erst), GUIT (guitar, gitr) vagy (multi-

effects unit, multieffekt) -, valamint a hangszer azonostszmt. Ezt a kt rtket szt kell vlasztanunk, s a sajt mezikben kell trolnunk, hogy biztostsuk az adatok kvetkezetes sgt. Kpzeljk el, micsoda nehzsget jelentene a mez frisstse, ha az MFX hangszercso port rvidtse pldul MFU-ra vltozna: kdot kellene rnunk, ami feldolgozza a mez rt kt, megnzi, hogy szerepel-e benne az MFX eltag, s ha igen, MFU-ra cserli azt. Nem mintha ezt nem tudnnk megcsinlni, de az biztos, hogy a szksgesnl tbb munkt kelle ne vgeznnk, st egyltaln nem kellene foglalkoznunk a krdssel, ha az adatbzist helye sen terveztk volna meg. Ha teht a pldban szereplhz hasonl mezkkel rendelkeznk, bontsuk azokat kisebb mezkre, hogy a mezszerkezet hatkony legyen.

A tbbrtk mezk feloldsa


A tbbrszes mezk feloldsa egyltaln nem nehz, a tbbrtk mezk azonban mr egy kicsit bonyolultabb, s tbb munkt ignyel. A tbbrtk mezket szerencsre knnyen felismerhetjk. Az ilyen tpus mezkben trolt adatok szinte kivtel nlkl vesszket, pontosvesszket vagy ms szokvnyos elvlaszt karaktereket tartalmaznak, amelyek a mezben lev klnbz rtkek kztt llnak. A tbbrtk mezre a 2.5. brn lthatunk egy pldt.

A pldban minden pilta adott gpekre szl jogostvnyokkal rendelkezik, s ezeket egyetlen mez, a Certifications (Jogostvnyok) trolja. Az adatok trolsi mdja komoly gondot jelent, mert az adatok kvetkezetessgt valsznleg ugyanolyan nehz lesz biztostani, mint a tbbrszes mezk esetben. Ha kzelebbrl megnzzk az adatokat, lthatjuk, hogy egy SQL-lekrdezssel nehz lesz keresst vgrehajtani kzttk, vagy rendezni ket Mieltt azonban megfelelen feloldhatnnk a mezt, elszr meg kell rte nnk, hogy valjban milyen kapcsolat ll fenn a tbbrtk mezk s az ket eredetileg tartalmaz tblk kztt. A tbbrtk mezkben lev rtkek tbb-a-tbbhz kapcsolatban llnak a szltbla minden rekordjval: egy tbbrtk mez egy konkrt rtke brmennyi rekordhoz kapcsoldhat a szltblban, s a szltbla egyes rekordjait is brmennyi rtkhez trsthatjuk a tbbrtk mezben. A 2.5. bra Certifications mezjben szerepl repl gptpusokat pldul egyenknt brmennyi pilthoz kapcsolhatjuk, s egy piltt is brmennyi replgphez trsthatunk a Certifications mezben. Ezt a tbb-a-tbbhz kapcsolatot ugyangy oldhatjuk fel, mint brmely ms tbb-a-tbbhz kapcsolatot egy adatbzisban: egy kapcsol tbla segtsgvel.

A kapcsol tblt gy hozzuk ltre, hogy a tbbrtk mezbl s az eredeti tbla elsdle ges kulcs mezjnek msolatbl j tblt alkotunk. Az jonnan ltrehozott kapcsol tb lnak adunk egy megfelel nevet, a kt mezt sszetett elsdleges kulccs tesszk (vagyis a kt mez rtke egyttesen fogja az j tbla rekordjait egyedileg azonostani), vgl pedig a kapcsol tbla kt mezjnek rtkeit egy-az-egyhez kapcsolattal egymshoz trstjuk Az eljrs menett a 25. brn ltott Pilots tbla esetben a 2.6. bra szemllteti. Vessk ssze Sam Alborous (PilotID 25100) bejegyzst a rgi Pilots s az j Pilot_Certifications tblban! Az j kapcsol tbla legfbb elnye, hogy most mr tetszleges szm jo gostvnyt kapcsolhatunk egy pilthoz, s bizonyos krdseket sokkal knnyebben tehe tnk fel az adatbzisnak Megllapthatjuk pldul, hogy mely piltk jogosultak Boeing 747-est vezetni, vagy lekrhetjk egy adott pilta jogostvnyainak listjt. Emellett azt is tapasztalhatjuk, hogy az adatokat brmilyen sorrendbe rendezhetjk, htrnyos hatsok nlkl.

Egyes adatbzis-kezel rendszerek - elssorban a Microsoft Office Access 200 7- megengedik, hogy kifejezetten tbbrtk mezket hat rozzunk meg. Az adatbzisrendszer ugyanakkor ezt gy teszi lehetv, hogy egy rejtett rendszertblt hoz ltre, ami igen hasonl a 2.6. brn lthat kapcsol tblhoz. Vlemnynk szerint jobb, ha ltjuk s kzben tartjuk a tblinkat, ezrt azt javasoljuk, hogy magunk hozzuk ltre a helyes adatszerkezeteket, s ne az adatbzisrendszer szolgltatsaira tmaszkodjunk.
Ha kvetjk az ebben a rszben bemutatott eljrsokat, a mezink megfelelek lesznek Most pedig, hogy finomhangoltuk a mezket, fordtsuk a figyelmnket a fejezet msodik tmjra, s vegyk szemgyre a tblk szerkezett!

A tblk finomhangolsa
A tblk jelentik rninden SQL-lekrdezs alapjt. Nem telik sok idbe, s rjvnk majd, hogy a rosszul megtervezett tblk gondokat okozhatnak az adatok kvetkezetessgvel kapcsolatban, s a tbbtbls SQL-lekrdezsek rsakor is megneheztik a munkt. Mindezek miatt gondoskodnunk kell rla, hogy a tblinkat a lehet leghatkonyabban ptsk fel, hogy knnyen kinyerhessk bellk azokat az informcikat, amelyekre szksgnk van.

Mikor helyes egy nv? (Msodik rsz)


A mezkrl szl rszben megtanultuk, hogy milyen fontos, hogy egy meznek megfelel nevet adjunk, s hogy mirt kell komoly figyelmet fordtanunk a mezk elnevezsre. Ebben a rszben ltni fogjuk, hogy ugyanez vonatkozik a tblkra is. Ahogy mondtuk, a tblk egyetlen trgyat kell, hogy brzoljanak - ha egynl tbb trgyuk van, akkor kisebb tblkra kell bontanunk ket. A tbla nevnek egyrtelmen azonostania kell

a tbla trgyt: ha ktrtelm, homlyos vagy bonyolult, akkor biztosak lehetnk benne, hogy a tbla trgyt nem gondoltuk t kellkppen. A tblanevek megfelelsgt az albbi ellenrzlista szerint vizsglhatjuk meg: A nv egyedi s kellen ler ahhoz, hogy az egsz cgen bell jelentssel brjon? Az egyedi nevek biztostjk, hogy az adatbzis rninden tblja ms trgyat brzol jon, s hogy a cgen bell mindenki szmra vilgos legyen, hogy mit tartalmaznak az egyes tblk. Egyedi, ler neveket tallni nem mindig knny, de hossz tvon egyrtelmen kifizetdik. A nv pontosan, vilgosan s egyrtelmen azonostja a tbla trgyt? Ha egy tbla neve homlyos vagy nem egyrtelm, a nyakunkat tehetjk r, hogy a tbla egynl tbb trgyat brzol. A Dates (Dtumok) pldul homlyos tblanv, mert nehz pontosan megllaptani, hogy mit tartalmaz a tbla, hacsak nincs kznl egy lers rla. Tegyk fel pldul, hogy egy szrakoztatgynksg adatbzisban tallunk egy ilyen nev tblt. Ha kzelebbrl megvizsgljuk a tblt, valsznleg kiderl, hogy az gyfelekkel val tallkozk idpontjt, illetve az gynksg eladinak lekttt eladsait trolja vagyis vilgos, hogy kt trgya van. Ebben az esetben kt tblra kell bontanunk a tblt, s az j tblkat megfelel nevekkel pldul Client_Meetings (gyfelek tallkozi) s Entertainer_Schedules (Eladk fellpsei) kell elltnunk. Tartalmaz a nv olyan szavakat, amelyek fizikai jellemzkre utalnak? Kerljk az olyan szavak hasznlatt a tblanevekben, mint a File, a Record vagy a Table, mivel ezek csak szksgtelen zavart okoznak. Ha egy tbla neve ilyen jelleg szt tartalmaz, a tbla valsznleg tbb trgyat brzol. Vegyk pldul az Employee_Record (Alkalmazottak bejegyzsei) nevet: felletes rnzsre gy tnik, hogy ezzel a nvvel nincs semmi baj, de ha belegondolunk, hogy egy alkal mazott bejegyzsnek mit kell tartalmaznia, rjhetnk, hogy itt bizony gondok lehetnek. A nv olyan szt tartalmaz, amelyet el kell kerlnnk, a tblnak pedig hrom trgya is lehet: az alkalmazottak, a rszlegek s a fizets. Bontsuk teht az eredeti tblt (Employee_Record) hrom j tblra, hogy mindhrom trgy kln tblba kerljn. A tbla neveknt rvidtst vagy betszt hasznltunk? Ha igen, azonnal vltoztas suk meg a nevet! Egy rvidtsbl ritkn tallhat ki a tbla trgya, a betszavak pedig ltalban nehezen megfejthetk. Tegyk fel pldul, hogy a cgnk adatb zisban van egy tbla, amelynek a neve SC. Honnan tudjuk, hogy mit brzol a tbla, ha nem ismerjk maguknak a betknek a jelentst? Tny, hogy gy nehz azonostani a tbla trgyt, st az is lehet, hogy a tbla neve a cg egyes rszlegei nek mst s mst jelent: a szemlyzeti osztly dolgozi azt hihetik, hogy az SC a Steering_Committees (gyviv bizottsgok) rvidtse, az informatikai rszlegen dolgozk azt, hogy a System_Configurations- (Rendszerbelltsok), a biztonsgi ak pedig nyilvn biztosak benne, hogy a jelentse Security_Codes (Biztonsgi k dok). A plda vilgosan mutatja, hogy mirt kell kerlnnk a rvidtseket s bet szavakat a tblanevekben.

Olyan nevet adtunk, ami rejtve vagy nyltan egynl tbb trgyra utal? Ez az egyik leggyakoribb hiba, amit egy tbla elnevezsnl elkvethetnk, de az ilyen neve ket viszonylag knny kiszrni, mert ltalban szerepel bennk az and (s) vagy az or(vagy) sz, vagy olyan karakterek, mint a fordtott perjel (\), a ktjel (-) vagy az s (&) jel. Jellemz plda az ilyen nevekre a Facility/Building vagy a Department or Branch. Ha egy tblt gy neveztnk el, akkor vizsgljuk fell, hogy valban egynl tbb trgyat brzol-e. Amennyiben igen, bontsuk fel a tblt kisebb tblkra, s adjunk az j tblknak megfelel neveket.

Emlkezhetnk, hogy az SQL-szabvny szablyos azonostknt hat rozza meg azokat a neveket, amelyeknek betvel kell kezddnik, s csak betket, szmokat, valamint alhzsjelet tartalmazhatnak. A szkzk nem megengedettek. A szabvny a hatrolt azonostt is meghatrozza: ez olyan - (ketts) idzjelekkel krlvett - nv, amelynek betvel kell kezddnie, s csak betket, szmokat, alhzsjelet, szkzket s meghatrozott klnleges karaktereket tartalmazhat. Mivel sok SQL-megvalsts csak a szablyos azonostkat tmogatja, azt javasoljuk, hogy a tblanevek esetben is kizrlag ezt a formt kvessk.
Miutn az ellenrzlista segtsgvel fellvizsgltuk a tblaneveket, mg egy feladatunk marad: ellenrizznk minden tblanevet mg egyszer, s gondoskodjunk rla, hogy a ne vekben tbbes szmot hasznljunk. A tblanevekben azrt kell tbbes szmot hasznlnunk, mert a tblk az ltaluk brzolt trgy pldnyainak gyjtemnyt troljk. Egy Employees nev tbla pldul nem csak egy, hanem sok alkalmazott adatait tartalmazza. Emellett, ha tartjuk magunkat a tbbes szmhoz, az abban is segt, hogy a tblaneveket megklnbz tessk a meznevektl.

A helyes szerkezet biztostsa


Most, hogy a tblaneveket fellvizsgltuk, sszpontostsunk a tblk szerkezetre! Ahhoz, hogy hatkonyan troljuk az adatainkat, s pontos informckat nyerjnk ki, ltfontossg, hogy a tblkat helyesen tervezzk meg. rdemes idt sznni arra, hogy meggyzdjnk a tblk megfelel felptsrl, mert a befektetett id bussan megtrl, amikor sszetett, tbbtbls SQL-lekrdezseket kell majd rnunk. Az albbi ellenrzlistt hasznlhatjuk arra, hogy megllaptsuk, hogy a tblink szerkezete helyes-e: Gondoskodjunk rla, hogy minden tbla egyetlen trgyat brzoljon! Igen, tudjuk, hogy ezt mr sokszor mondtuk, de nem lehet elgg hangslyozni. Ha biztostjuk, hogy minden tbla egyetlen trgyat brzoljon, jelentsen cskkentjk annak a kockzatt, hogy az adatok kvetkezetessge srljn. Azt sem szabad elfelejte nnk, hogy a tblk trgya egy objektum vagy esemny lehet. Objektum alatt va lami fizikai dolgot rtnk alkalmazottakat, beszlltkat, gpeket, pleteket vagy rszlegeket , mg esemny valami olyasmi lehet, ami egy adott idben trtnik, s olyan jellemzi vannak, amiket rgzteni szeretnnk. Az esemnyekre a legjobb

plda az, amit letnk sorn mindnyjan tlnk - egy orvosi vizitet. A vizit nem kzzelfoghat, de vannak rgzthet jellemzi: pldul a vizit dtuma s idpontja, a pciens vrnyomsa, vagy a beteg testhmrsklete. Gondoskodjunk rla, hogy minden tblnak legyen elsdleges kulcsa! Kt oka van annak, hogy rninden tblhoz kell elsdleges kulcsot rendelnnk. Elszr is, az elsdleges kulcs egyedileg azonostja a tblban tallhat sszes rekordot. Msodszor, segtsgkkel alaktunk ki kapcsolatokat a tblk kztt. Ha nem rende lnk elsdleges kulcsot minden tblhoz, az adatok kvetkezetessge srlhet, s a tbbtbls SQL-lekrdezsek egyes fajtival is gondjaink tmadhatnak. Az elsdle ges kulcsok helyes megadshoz a fejezet ksbbi rszben adunk tancsokat. Gondoskodjunk rla, hogy egyetlen tbla se tartalmazzon tbbrszes vagy tbbr tk mezket! Elmletileg ezeket a problmkat mr kikszbltk, amikor finomhangoltuk a mezszerkezetet, mindazonltal nem rt mg egyszer fellvizsglni a mezket, hogy meggyzdjnk rla, hogy minden tbbrszes s tbbrtk mezt megszntettnk. Gondoskodjunk rla, hogy a tblkban ne legyenek szmtott mezk! Br meg le hetnk gyzdve rla, hogy a jelenlegi tblaszerkezetben mr nincsenek szmtott mezk, elfordulhat, hogy a mezk finomhangolsa sorn tsiklottunk egy-kett fe lett. Most j alkalom nylik arra, hogy mg egyszer ttekintsk a tblaszerkezeteket s eltvoltsunk minden olyan szmtott mezt, amirl esetleg megfeledkeztnk. Gondoskodjunk rla, hogy egyetlen tblban se legyenek feleslegesen tbbszr sze repl mezk! A rosszul megtervezett tblk egyik f ismertetjele, hogy ms tblk mezinek msolatait tartalmazzk. A mezk megkettzsre kt okunk lehet: hivat kozni szeretnnk egy adatra, vagy jelezni szeretnnk, hogy egy adott rtk tbb pldnyban is ltezik. Az ilyen tbbszr szerepl mezk azonban mindenfle nehzsget tmasztanak az adatok kezelse sorn, s az informcik kinyerst is megneheztik a tblkbl A tbbszr szerepl mezk krdsvel ezrt az albbiak ban kln is foglalkozunk.

A feleslegesen tbbszr szerepl mezk feloldsa


A megfelel felpts biztostsnak valsznleg a tbbszr szerepl mezk kezelse a legnehezebb rsze. Lssunk nhny pldt, amelyek szemlltetik, hogy miknt oldhatjuk fel helyesen a msolt mezket tartalmaz tblkat! A 2.7. brn egy olyan tblt lthatunk, amelynek msolt mezi hivatkozsknt szolglnak. Ebben az esetben a StaffLastName s a StaffFirstName a Classes tblban is szerepel, hogy aki ezt a tblt nzi, lssa az adott rhoz tartoz tanr nevt. Ugyanakkor a Classes s a Staff tblk kztt fennll egy-a-tbbhz kapcsolat miatt (egy tanr tbb rt is tarthat, de egy ra csak egy adott tanrhoz tartozhat) ezek a mezk feleslegesek A kt tbla k ztt a kapcsolatot a StafflD teremti meg, maga a kapcsolat pedig lehetv teszi, hogy egy SQL-lekrdezsben egyidejleg mindkt tblbl lekrhessnk adatokat. Ezt szben tartva

biztonsgosan trlhetjk a StaffLastName s a StaffFirstName mezt a Classes tblbl; ez semmilyen htrnyos kvetkezmnnyel nem jr. A Classes tbla javtott szerkezett a 2.8. brn lthatjuk.

Ha a tblban megtartjuk az emltett felesleges mezket, az adatok kvetkezetessgnek biztostsa komoly gondot jelenthet. Gondoskodnunk kell rla, hogy a Classes tbla StaffLastName s StaffFirstName mezinek rtke mindig megegyezzen a Staff tbla ha sonl mezinek rtkvel. Tegyk fel pldul, hogy egy tanrn frjhez megy, s gy dnt, hogy attl a naptl fogva a frjezett nevt hasznlja. Ekkor nem csak a Staff tbl ban kell mdostanunk a hozz tartoz rekordot, hanem a Classes tblban is ki kell jav tanunk a nv minden elfordulst. Ez persze nem lehetetlen feladat (legalbbis technika ilag), de gy sokkal tbbet kell dolgoznunk a szksgesnl. A relcis adatbzisok hasz nlatnak radsul ppen az lenne az egyik legnagyobb elnye, hogy egy adatot elg egyszer bevinni az adatbzisba. (Az egyetlen kivtel ez all a szably all, ha egy mezt arra hasznlunk, hogy kapcsolatot teremtsnk kt tbla kztt.) Mint mindig, most is az a legjobb, ha minden mez felesleges pldnyait eltvoltjuk az adatbzis tblibl.

A 2.9. bra egy msik tiszta pldt mutat egy tbbszr szerepl mezket tartalmaz tblra, s jl szemllteti, hogyan szoktk hibsan egy adott tpus rtk tbb elfordulst tbbszr szerepl mezkkel jelezni. Ebben az esetben hrom Committee (Bizottsg) mez rgzti azoknak a bizottsgoknak a nevt, amelyeknek az adott alkalmazott a tagja.

Nem tl nehz kitallni, hogy ezek a tbbszr szerepl mezk mirt okoznak majd gondot. Az egyik problma a Committee mezk szma a tblban. Mi trtnik, ha nhny alkalma zott ngy bizottsgba is bekerl? s egyltaln honnan tudjuk elre, hogy hny Committee mezre lesz szksg? Ha egyes alkalmazottak hromnl tbb bizottsgban foglalnak helyet, tovbbi Committee mezket kell a tblhoz adnunk. A msodik problma az informcik kinyersvel kapcsolatos. Hogyan nyerjk ki azokat az alkalmazottakat, akik jelenleg az ISO 9000 bizottsg tagjai? A feladat nem lehetetlen, de nem is egyszer. A krds pontos megvlaszolshoz hrom klnll lekrdezst kell vgrehajtanunk (vagy meg kell adnunk egy keressi felttelt, amely hrom klnbz mezt vizsgl), mert nem tudhatjuk, hogy az ISO 9000 rtk a hrom Committee mez kzl melyikben troldik. gy aztn a feladat vgrehajtsa a valban szksgesnl tbb idt s erfesztst ignyel. A harmadik problmt az adatok rendezse jelenti. Az adatokat semmilyen praktikus mdszerrel nem tudjuk bizottsg szerint rendezni, s a bizottsgok nevt sem tudjuk sehogy helyesen bcsorrendbe lltani. Ezek apr problmknak tnnek, de igencsak frusztrlak lehetnek, ha az adatokat valamilyen rendezett formban szeretnnk ttekinteni.

Ha figyelmesen megnzzk a 2.9. brn lthat Employees tblt, hamar rjhetnk, hogy az alkalmazottak s az ket a tagjaik sorban tud bizottsgok kztt valjban tbb-atbbhz kapcsolat ll fenn. Egy alkalmazott brmennyi bizottsgnak a tagja lehet, s egy bizottsg is brmennyi tagbl llhat. Ezrt ezeket a tbbszr szerepl mezket is ugyangy oldhatjuk fel, mint brmely ms tbb-a-tbbhz kapcsolatot: egy kapcsol tbla ltrehoz sval. Az Employees tbla esetben a kapcsol tblt gy hozzuk ltre, hogy lemsoljuk az elsdleges kulcsot (EmployeeID), s hozzvesznk egyetlen Comitee mezt. Adjunk megfelel nevet az j tblnak (pldul Committee_Members, vagyis Bizottsgi tagok),

tegyk sszetett elsdleges kulccs az EmployeelD s Committee mezket, trljk a Committee mezket az Employees tblbl, s kszen is vagyunk. (Az elsdleges kulcsokrl a fejezet ksbbi rszben rszletesebben is tanulunk.) A javtott Employees tblt s az j Committee_Members tblt a 2.10. brn lthatjuk. Br az eredeti Employees tblban tbbszr szerepl mezket feloldottuk, mg nem vagyunk teljesen kszen. Ha felidzzk, hogy a bizottsgok s a tagjaikknt dolgoz alkal mazottak kztt tbb-a-tbbhz kapcsolat van, joggal merlhet fel a krds, hogy hol van a Committees (Bizottsgok) tbla? Nos, ilyen tblnk nincs egyelre. A bizottsgoknak nagy valsznsggel ms olyan jellemzik is vannak, amelyeket rgzteni szeretnnk: pldul a terem szma vagy neve, ahol a bizottsg lsezik, vagy a hnapnak az a napja, amikor az lsekre sor kerl. Hozzunk ht ltre egy igazi Committees tblt, amely olyan mezket tartalmaz, mint a CommitteID (Bizottsgazonost), a CommitteeName (Bizottsg neve), a MeetingRoom (lsterem) s a MeetingDay (lsnap). Ha az j tblval kszen vagyunk, cserljk a Committee_Members tbla Committee mezjt az j Committees tbla CommitteeID mezjre. A vgs tblaszerkezeteket a 2.11. brn lthatjuk.

A tblk ilyetn felptse hatalmas elnyt jelent, mert gy egy tagot akrhny bizottsghoz kapcsolhatunk, s egy bizottsgba is felvehetnk akrhny alkalmazottat, majd egy SQL-le krdezssel egyidejleg mindhrom tblbl megtekinthetnk informcikat. Most mr kzelednk afel, hogy befejezzk a tblaszerkezeteink finomhangolst. Az utols feladatunk az, hogy gondoskodjunk rla, hogy az egyes tblkon bell minden rekord egyedileg azonosthat legyen, s hogy magt a tblt is kpesek legynk azonos tani a teljes adatbzisban.

A kulcs az azonosts
Ahogy az 1. fejezetben megtanultuk, az elsdleges kulcs az egyik legfontosabb elem, mert ez az, ami egyedileg azonostja a rekordokat a tblban, s a tblt is a teljes adatbzisban. Ezen kvl kt tbla kztt is ez teremti meg a kapcsolatot, ezrt az elsdleges kulcs szere pt nem lehet elgg hangslyozni: az adatbzis minden tbljnak rendelkeznie kell eggyel. Meghatrozsa szerint az elsdleges kulcs egy mez vagy mezcsoport, amely egyedileg azonost minden rekordot egy tblban. Amennyiben a kulcs egyetlen mezbl ll, egyszer elsdleges kulcsrl beszlnk (vagy rviden elsdleges kulcsrl), mg ha kt vagy tbb mez alkotja, sszetett elsdleges kulcsnak nevezzk. Amikor csak lehetsges, egyszer elsdleges kulcsot hatrozzunk meg, mert hatkonyabb, s sokkal knnyebben hasznlhat a tblk kztti kapcsolatok megteremtsre. sszetett elsdleges kulcsot csak akkor alkalmazzunk, amikor valban erre van szksg (pldul ha egy kapcsol tblt szeretnnk meghatrozni s ltrehozni). Elsdleges kulcsknt meglev mezt vagy mezket is hasznlhatunk, amennyiben azok az albbi ellenrzlista valamennyi felttelt kielgtik. Ha egy mez vagy mezcsoport nem felel meg minden kvetelmnynek, hasznljunk egy msik mezt, vagy hatrozzunk meg egy j mezt a tbla elsdleges kulcsaknt. Sznjuk r az idt, s az albbi ellenrzlis ta segtsgvel llaptsuk meg, hogy az adatbzisunk minden elsdleges kulcsa megfelel-e: A mezk egyedileg azonostanak minden rekordot a tblban? Egy tblban min den rekord a tbla trgynak egy-egy pldnyt jelkpezi. Egy j elsdleges kulcs biztostja, hogy a tbla minden rekordjt pontosan azonostani lehessen, illetve hogy kpesek legynk a rekordokra pontosan hivatkozni az adatbzis ms tblibl, vala mint segt elkerlni, hogy a tblba tbbszr szerepl rekordok kerljenek. A mez vagy mezcsoport egyedi rtkeket tartalmaz? Amg az elsdleges kulcs mez rtkei egyediek, biztosak lehetnk benne, hogy a tbla nem fog tbbszr szerepl rekordokat tartalmazni. Lehetnek ezekben a mezkben ismeretlen rtkek? Ez nagyon fontos krds, mert az elsdleges kulcs nem tartalmazhat ismeretlen rtkeket. Ha gy gondoljuk, hogy br valszntlen elfordulhat, hogy a mez ismeretlen rtkeket is tartalmaz, azonnal zrjuk ki az elsdleges kulcs szerepbl.

Megengedett, hogy ezekbl a mezkbl hinyozzon az rtk? Ha erre a krdsre igennel felelnk, a mezt nem hasznlhatjuk elsdleges kulcsknt. Ha egy mezben nem ktelez rtknek szerepelnie, az azt jelenti, hogy bizonyos esetekben ismeret len rtke is lehet, mrpedig ahogy az elz krdsnl emltettk, az elsdleges kulcs nem tartalmazhat ismeretlen rtkeket. Tbbrszes mezrl van sz? Br mostanra mr meg kellett szabadulnunk minden tbbrszes meztl, rdemes mg egyszer feltenni magunknak a krdst. Ha korbban elsiklottunk egy tbbrszes mez felett, oldjuk fel most, s prbl junk msik mezt elsdleges kulcsknt alkalmazni, vagy a sztvlasztssal jonnan ltrehozott mezket egytt, sszetett elsdleges kulcsknt hasznljuk. Mdosthat ezeknek a mezknek az rtke? Az elsdleges kulcs mezk rtknek llandnak kell lennie, vagyis e mezk rtke nem vltozhat meg, hacsak nincs erre igazn nyoms okunk. Ha egy mez rtke megvltozhat, a mez nehezen lesz kpes megfelelni az ellenrzlista tbbi kvetelmnynek. Ahogy korbban emltettk, egy meznek vagy mezk kombincijnak a fenti ellenrz lista minden kvetelmnyt tkletesen ki kell elgtenie ahhoz, hogy elsdleges kulcs knt hasznlhassuk. A 2.12. brn a Pilots tbla elsdleges kulcsa a PilotID - de megfelel a PilotID az ellenrzlista minden pontjnak? Ha igen, az elsdleges kulcs megfelel, de ha nem, vagy mdostanunk kell, hogy eleget tegyen a feltteleknek, vagy msik mezt kell vlasztanunk elsdleges kulcsnak.

Itt a PilotID ppensggel megfelel elsdleges kulcs, mert az ellenrzlista valamennyi kvetelmnynek eleget tesz. De mit trtnik, ha nem tallunk olyan mezt, ami megfe lelne elsdleges kulcsnak? Vegyk pldul a 2.13. brn lthat Employees tblt: van a tblban olyan mez, amit elsdleges kulcsknt hasznlhatnnk? Teljesen vilgos, hogy ez a tbla nem tartalmaz olyan mezt (vagy mezcsoportot), ami elsdleges kulcs lehetne, az EmpPhone kivtelvel ugyanis minden mezben vannak azonos rtkek, radsul az EmpZip, az EmpAreaCode s az EmpPhone ismeretlen

rtket is tartalmaz. Ksrtst rezhetnk, hogy az EmpLastName s az EmpFirstName kombincijt hasznljuk kulcsknt, de nincs r biztostk, hogy egyszer csak nem vesznk majd fel valakit, akinek szintn Jim Wilson vagy David Smith a neve. Ezen kvl, mivel a tbla minden mezjben megvltozhatnak az rtkek, nyilvnval, hogy egyik mezt sem hasznlhatjuk a tbla elsdleges kulcsaknt.

Mit tehetnk ilyen esetben? Nos, ltrehozunk egy mestersges elsdleges kulcsot, vagyis meghatrozunk s a tblhoz adunk egy mezt, amelynek az egyetlen szerepe, hogy a tbla elsdleges kulcsa legyen. Ennek az az elnye, hogy olyan mezt hozhatunk ltre, amely biztosan megfelel az ellenrzlistnak. Miutn a mezt a tblhoz adtuk, kijelljk

elsdleges kulcsknt, s kszen is vagyunk ennyi az egsz. A 2.14. brn megtekinthet jk, hogyan fest az Employees tbla egy EmployeelD nev mestersges elsdleges kulccsal. Br mestersges elsdleges kulcsokkal knnyen megoldhatjuk az ilyen problmkat, ezek a mezk nem zrjk ki, hogy a tblban tbbszr szerepl adatok legyenek. Ha valaki pldul felvesz egy rekordot egy John Kennedy nev szemly szmra a tblba, s j egyedi mestersges EmployeeID-rtket rendel hozz, honnan fogjuk tudni, hogy a msodik John Kennedy nem azonos-e a tblban mr szerel 98002-es alkalmazottal? A megolds az, hogy az alkalmazs kdjt kiegsztjk egy ellenrz eljrssal, ami megvizsglja, hogy egy nv nem szerepel-e tbbszr, s figyelmezteti a felhasznlt. Sok adatbzisrendszerben lehetsgnk van gynevezett kioldknt ( trigger) megrni egy ilyen ellenrz kdot, amit az adatbzis-kezel minden alkalommal nmkden lefuttat, amikor egy sor mdosul, j sor kerl a tblba, vagy trlnk egy sort onnan. A kioldk trgyalsa azonban tlmutat knyvnk keretein, ezrt ha tbbet szeretnnk tudni rluk, a rszleteket az adatbzisrendszernk lersban kell keresnnk. Most mr minden megtettnk annak rdekben, hogy megerstsk s finomhangoljuk a tblink szerkezett. A kvetkez rszben azt vizsgljuk, hogy miknt gondoskodhatunk arrl, hogy a tblakapcsolatok is helyesek legyenek.

Szilrd kapcsolatok kialaktsa


Az 1. fejezetben megtanultuk, hogy kt tbla kztt akkor ll fenn kapcsolat, ha az els tbla rekordjai valamilyen mdon sszefggnek a msodik tbla rekordjaival Arrl is beszltnk, hogy maga a kapcsolat hromfle lehet: egy-az-egyhez, egy-a-tbbhz s tbb-a-tbbhz. A kapcsolatok egyes fajtinak kialaktst is tanultuk - az albbiakban rviden ezt ismteljk t. Az ebben a rszben lthat diagramok jellsei Mike Hernandez Database Design for Mere Mortals (Addison-Wesley, 2004; magyarul: Adatbzis-tervezs: A relcis adatbzisok alapjairl fldi halandknak. Kiskapu, 2004) cm knyvnek diagramksztsi mdszert kvetik. A PK elsdleges kulcsot (primary key) jell, az FK idegen kulcsot (foreign key), a CPK pedig egy olyan mezt, amely egy sszetett elsdleges kulcs (composite primary key) rsze.

Egy-az-egyhez kapcsolatot gy alaktunk ki, hogy vesszk az elsdleges tbla elsd leges kulcst, s beszrjuk az alrendelt tblba, ahol idegen kulcs lesz belle. Ez klnleges fajta kapcsolat, mert sok esetben az idegen kulcs az alrendelt tbla elsdleges kulcsaknt is viselkedik. Ennek a fajta kapcsolatnak a diagramjt a 2.15. bra mutatja.

Egy-a-tbbhz kapcsolatot gy hozunk ltre, hogy vesszk a kapcsolat egy oldaln ll tbla elsdleges kulcst, s beszrjuk azt a tbb oldalon lev tblba, ahol idegen kulcs lesz belle. Ennek a fajta kapcsolatnak a diagramjt a 2.16. bra mutatja.

Tbb-a-tbbhz kapcsolatot gy hozunk ltre, hogy ltrehozunk egy kapcsol tblt. A kapcsol tblt gy hatrozzuk meg, hogy lemsoljuk a kapcsolatban rszt vev mindkt tbla elsdleges kulcst, s ezek segtsgvel alkotjuk meg az j tbla szerkezett. A kulcsmezk kt jl elklnthet szerepet tltenek be: egyttesen a kapcsol tbla sszetett elsdleges kulcst adjk, kln-kln pedig idegen kul csokknt viselkednek. Ennek a fajta kapcsolatnak a diagramjt a 2.17. bra mutatja. Ahhoz, hogy biztosak lehessnk benne, hogy az adatbzis tbli kztti kapcsolatok szi lrdak, minden kapcsolathoz tulajdonsgokat kell meghatroznunk Ezek a tulajdonsgok adjk meg, hogy mi trtnik, amikor trlnk egy rekordot, hogy milyen szerepe van az adott tblnak a kapcsolatban, s hogy az egyes tblk milyen mrtkben vesznek rszt a kapcsolatban.

Mieltt azonban belefognnk a kapcsolatok tulajdonsgainak trgyalsba, egy dolgot vilgoss kell tennnk: a tulajdonsgokat ltalnos logikai rendszerben mutatjuk be. Ezek a tulajdonsgok azrt fontosak, mert lehetv teszik, hogy kiknyszertsk a kapcso latok kvetkezetessgt (erre hivatkoznak egyes adatbzisrendszerek hivatkozsi psg knt), programtl fggen azonban ms-ms mdon valsthatjuk meg ket. Utna kell nznnk az adatbzis-kezel szoftvernk lersban, hogy a kapcsolattulajdonsgok tmogatottak-e, s ha igen, hogyan hatrozhatjuk meg azokat.

Trlsi szably meghatrozsa


A trlsi szablyok adjk meg, hogy mi trtnik, ha egy felhasznl olyan krelmet ad ki, amellyel egy egy-az-egyhez kapcsolat elsdleges tbljbl vagy egy egy-a-tbbhz kapcso lat egy oldaln ll tblbl szeretne rekordokat trlni. A szably meghatrozsval az rva rekordokkal szemben vdhetjk meg magunkat. (Az rva rekordok olyan rekordok, amelyek egy egy-az-egyhez kapcsolat alrendelt tbljban tallhatk, s nem kapcsoldik hozzjuk rekord az elsdleges tblban, illetve olyan rekordok, amelyek egy egy egy-atbbhz kapcsolat tbb oldaln ll tblban tallhatk, s nincs prjuk az egy oldalon lev tblban.) Egy kapcsolatra ktfle trlsi szablyt hatrozhatunk meg: korltoz s tbbszint trlst.

A korltoz trlsi szably nem engedi meg a kvnt rekord trlst, amennyiben
az egy-az-egyhez kapcsolat alrendelt tbljban vagy az egy-a-tbbhz kapcsolat tbb" oldaln ll tblban rekordok kapcsoldnak hozz. Minden kapcsold rekordot mg az eltt el kell tvoltanunk, hogy a krdses rekordot trlhetnnk Azokban az adatbzisrendszerekben, amelyek megengedik a kapcsolati szablyok meghatrozst, ltalban ez az alaprtelmezett, st nha az egyetlen vlaszthat tpus.

Ha tbbszint trlsi szablyt lptetnk letbe, egy a kapcsolat egy oldaln ll rekord trlsnek hatsra a rendszer automatikusan trl minden kapcsold rekordot az egy-az-egyhez kapcsolat alrendelt tbljbl, illetve az egy-a-tbbhz kapcsolat tbb oldaln ll tblbl. Ezt a szablyt nagyon krltekinten hasznljuk, nehogy vgl olyan rekordokat is trljnk, amelyeket nem szerettnk volna! A tbbszint trlst nem minden adatbzisrendszer tmogatja. Az alkalmazott trlsi szably tpustl fggetlenl mindig nagyon gondosan vizsgljuk meg a kapcsolatot, hogy megllaptsuk, melyik fajta szably a megfelel. Ezt egy nagyon egyszer krdssel eldnthetjk. Elszr vlasszunk ki egy tblaprt, majd tegyk fel a kvetkez krdst: Ha egy rekord trldik az [elsdleges vagy az egy oldalon ll tbla neve] tblbl, trldjenek az [alrendelt vagy a tbb oldalon ll tbla neve] tbla kapcsold rekordjai is?. A krdst azrt ltalnos formban fogalmaztuk meg, hogy megrtsk a mgtte hzd elvet. A krds szgletes zrjelben lev kifejezseit a megfelel tblanevekre kell cserl nnk, teht egy konkrt esetben a krds gy fog festeni: Ha egy rekord trldik a Committees tblbl, trldjenek a Committee_Members tbla kapcsold rekordjai is?. Ha a fenti krdsre nemmel felelnk, korltoz trlsi szablyt alkalmazzunk; ha igennel, tbbszint trlsi szablyt. Vgssoron a vlasz nagymrtkben fgg attl, hogy miknt hasznljuk az adatbzisban trolt adatokat. Ezrt kell gondosan megvizsglnunk a kapcsolatot, s megbizonyosodnunk arrl, hogy a megfelel tpus szablyt vlasztottuk. A pldban emltett kapcsolat trlsi szablynak diagramjt a 2.18. brn lthatjuk. Megfigyelhetjk, hogy a korltoz (restrict) trlsi szably jelzse (R), mg a tbbszint (cascade) trlsi szably (C).

A tblk szerepnek belltsa


Amikor kt tblt sszekapcsolunk, mindkt tbla adott szerepet kap a kapcsolatban. A szerep (a rszvtel tpusa), amelyet egy adott tblhoz rendelnk, hatrozza meg, hogy a tblban lteznie kell-e rekordnak, mieltt bevihetnnk egy rekordot a msik tblba. Ktfle szerep lehetsges:

Ktelez - A tblban legalbb egy rekordnak lennie kell, mieltt brmilyen rekordot bevihetnnk a msik tblba. Nem ktelez - Nem kvetelmny, hogy a tblban legyen rekord, mieltt brmilyen rekordot bevihetnnk a msik tblba. Az, hogy a tblkhoz milyen szerepet rendelnk, legnagyobb rszt az adott adatbzisrend szer zleti logikjtl fgg. Tegyk fel pldul, hogy egy tbb rszlegbl ll nagy cgnek dolgozunk, s a cg szmra ksztett adatbzisban tallhat egy Employees (Alkalmazot tak), egy Departments (Rszlegek) s egy Department_Employees (Rszleg alkalmazottai) tbla. Az alkalmazottak minden fontos adatt az Employees tbla trolja, mg a rszlegekt a Departments tbla. A Department_Employees kapcsol tbla, amely lehetv teszi, hogy egy adott alkalmazottat tetszleges szm rszleghez kapcsoljunk. Az emltett tblkat a 2.19. brn lthatjuk. (Az brn egyszer nyilak mutatnak a kapcsolat tbb oldalra.)

A legutbbi rtekezleten azt a feladatot kaptuk, hogy egyes alkalmazottakat osszunk be az j Research and Development (Kutats-fejleszts) rszlegbe. A problmt a kvetkez jelenti: szeretnnk biztosak lenni benne, hogy az j rszleg a Departments tblba kerl, hogy alkalmazottakat rendelhessnk a rszleghez a Department_Employees tblban. Ez az, ahol a tblk szerepe jelentst nyer. lltsuk a Departments tbla szerept ktele zre", a Department_Employees tbla szerept pedig nem ktelezre. Ezekkel a bell tsokkal biztostjuk, hogy egy rszlegnek lteznie kell a Departments tblban, mieltt alkalmazottakat vehetnnk fel bele a Department_Employees tblban. Ugyangy, ahogy a trlsi szably esetben, most is gondosan vizsgljuk meg, hogy a kapcsolatban rszt vev tblknak milyen tpus szerep felel meg. A szerepeket gy brzolhatjuk diagramon, ahogy a 2.20. bra mutatja.

A rszvtel mrtknek belltsa


Most, hogy meghatroztuk, hogyan vesznek rszt az egyes tblk a kapcsolatban, meg kell llaptanunk azt is, hogy milyen mrtkben teszik ezt. Ezt gy vgezhetjk el, hogy meghatrozzuk, hogy az egyik tblban legalbb s legfeljebb hny rekord kapcsoldhat a msik tbla egy rekordjhoz. Ez a mvelet a tbla rszvteli mrtknek meghatrozsa. A rszvtel mrtkt egy adott tbla esetben kt zrjelben ll szmmal adjuk meg, amelyeket vessz vlaszt el egymstl. Az els szm a kapcsold rekordok lehetsges legkisebb szmt jelzi, mg a msodik szm azok lehetsges legnagyobb szmt. Az (1,12) rszvteli mrtk pldul azt mutatja, hogy legalbb egy, de legfeljebb tizenkett kapcso ld rekord lehet. Az adatbzis klnbz tblihoz meghatrozott rszvteli mrtk nagyban fgg attl, hogy a cgen bell miknt hasznljuk s tekintjk meg az adatokat. Tegyk fel pldul, hogy egy rendezvnyszervez cg gynkeknt dolgozunk, s az adatbzisunkban tall-

hat egy Agents (gynkk) s egy Entertainers (Eladk) tbla. Tegyk fel tovbb, hogy a kt tbla egy-a-tbbhz kapcsolatban ll egymssal: az Agents tbla egy rekordja az Entertainers tbla tbb rekordjhoz kapcsoldhat, de az Entertainers tbla egy rekordja csak egyetlen rekorddal llhat kapcsolatban az Agents tblbl (vagyis ltalnossgban azt biztostjuk ezzel, hogy egy eladt csak egy gynk kpviseljen, nehogy rivalizlsra kerljn sor, ami mindenkinek csak krt okozna). A kapcsolat tbb oldaln lev rekordok lehetsges legnagyobb szma szinte minden esetben vgtelen. Nha azonban az zleti szablyok azt diktljk, hogy korltozzuk ezt a rszvteli mrtket, pldul ha meg akarjuk szabni, hogy egy adott rra legfeljebb hny hallgat iratkozhat fel. Az gynksg pldjt folytatva tegyk fel, hogy a fnk biz tos szeretne lenni benne, hogy minden gynk egyformn j lehetsgeket kap, a kztk lev versenyt pedig a lehet legkisebb mrtkre szeretn visszaszortani, ezrt bevezeti azt a szablyt, hogy egy gynk legfeljebb hat eladt kpviselhet (Nem biztos benne, hogy ez hossz tvon is mkdni fog, de azrt megprblja.) Az j szably letbe lpte tshez a kt tbla rszvteli mrtkt az albbiak szerint kell belltanunk: Agents Entertainers (1,1)- Egy elad legalbb s legfeljebb is csak egy gynkhz rendelhet. (0,6) - Egy gynknek nem felttlenl kell kpviselnie egyetlen eladt sem, viszont adott idben nem kpviselhet tbbet hat eladnl

A fenti tblk rszvteli mrtkt a 2.21. bra diagramja mutatja.

Miutn belltottuk a rszvtel mrtkt, el kell dntennk, hogy miknt rvnyestse (kny szertse ki) az adatbzisrendszer a kapcsolatot. A kiknyszerts mdja az adatbzisrendszer nyjtotta lehetsgektl fgg. A legegyszerbb kiknyszertsi md, amelyet a legtbb adatabzisrendszer tmogat, a tbb oldalon lev tbla idegen kulcs mezjben lev rt kek korltozsa gy, hogy a felhasznl ne rhasson ebbe a mezbe olyan rtket, ami nem szerepel az egy oldalon lev tblban. Ezt a diagramon egy zrjelben lev R betvel jelezzk az egy oldalon lev tblra mutat kapcsolati vonal mellett (lsd a 2.22. brt). Egyes adatbzisrendszerek lehetv teszik, hogy olyan szablyt hatrozzunk meg, amely tviszi a kulcsrtket az egy oldalon lev tblbl a tbb oldalon lev tblba - (C), vagyis tbbszint (cascade) mdosts - , ha a felhasznl megvltoztatja az elsdleges

kulcs rtkt az egy" tblban. Az adatbzisrendszer lnyegben kijavtja a tbb tbla kapcsold sorainak idegen kulcs rtkt, amikor mdostjuk az "egy" tbla elsdleges kulcs rtkeit. Egyes adatbzis-kezelk arra is kpesek, hogy automatikusan trljk (D) a tbb tbla kapcsold sorait, ha trlnk (delete) egy sort az egy tblbl. A rszlete ket az adatbzisrendszernk lersbl derthetjk ki.

Ahhoz, hogy tnylegesen kiknyszertsk a rszvtel mrtkre vonatkoz korltozsokat, meg kell adnunk egy vagy tbb kioldt vagy megszortst az adatbzis meghatrozsban (amennyiben az adatbzis-kezelnk tmogatja ezeket a szolgltatsokat).

Ennyi az egsz?
Az ebben a fejezetben elsajttott mdszerek alkalmazsval megtettk a szksges lpse ket afel, hogy az adatbzisunkban alapszinten biztostsuk az adatok kvetkezetessgt. A kvetkez lps, hogy megvizsgljuk, hogyan hasznljk s tekintik meg az adatokat a cgen bell, hogy kialakthassuk s letbe lptethessk az adatbzis zleti szablyait. Ahhoz azonban, hogy valban a legtbbet hozhassuk ki az adatbzisbl, vissza kell trnnk a rajtkockba, s egy megfelel tervezsi mdszerrel alaposan meg kell terveznnk az adat bzist. Sajnos ezek a tmakrk kvl esnek knyvnk keretein, de a helyes adatbzis-terve zsi elveket megtanulhatjuk olyan knyvekbl, mint Michael J. Hernandez Database Design for Mere Mortals (Addison-Wesley, 2004; magyarul: Adatbzis-tervezs: A relcis adatb zisok alapjairl fldi halandknak. Kiskapu, 2004) vagy Thomas Connolly s Carolyn Begg

Database Systems: A Practical Approach to Design, Implementation, and Management


(4. kiads, Addison-Wesley, 2004) cm ktete. A legfontosabb, amit az esznkbe kell vs nnk, hogy minl szilrdabb az adatbzisunk szerkezete, annl knnyebb lesz mind infor mcikat kinyerni az adatbzis adataibl, mind alkalmazsokat fejleszteni az adatbzishoz.

sszefoglals
A fejezetet annak a rvid sszefoglalsval kezdtk, hogy mirt fontos szmunkra, hogy az adatbzisunk szerkezete helyes legyen. Megtanultuk, hogy a rosszul megtervezett tblk szmos problmt okozhatnak, fknt az adatok kvetkezetessgvel kapcsolatban.

Ezt kveten a tblk mezinek finomhangolsval foglalkoztunk. Megtudtuk, hogy nagyon fontos, hogy a mezinknek megfelel neveket adjunk, mert gy biztosthatjuk, hogy minden nv rtelmes legyen, s knnyebben megtallhatjuk a magban a mezszerkezetben lev rejtett problmkat is. Most mr tudjuk, hogyan kell nhny egyszer szably rvnyests vel finomhangolni a mezk szerkezett. Ezek a szablyok gondoskodnak rla, hogy minden mez a tbla trgynak csak egy jellemzjt rja le, az egyes mezk csak egy rtket tartal mazzanak, illetve hogy ne legyen bennk szmtott rtk. A tbbrszes s tbbrtk mezk okozta gondokrl is beszltnk, s azt is megtanultuk, hogyan oldhatjuk fel az ilyen mezket. A kvetkez krds, amit trgyaltunk, a tblk finomhangolsa volt. Megtudtuk, hogy a megfelel tblanevek ppen olyan fontosak, mint a j meznevek, mgpedig ugyanazok bl az okokbl. Most mr tudjuk, hogyan adhatunk a tblinknak jelentssel br neveket, s hogyan biztosthatjuk, hogy minden tbla csak egy trgyat brzoljon. Ez utn azokat a szablyokat trgyaltuk, amelyek segtsgvel az egyes tblk szerkezetnek helyessgt biztosthatjuk. Br ezek a szablyok ltszlag hasonl szerepet tltenek be, mint azok az eljrsok, amelyeket a mezk szerkezetnek finomhangolsakor alkalmaztunk, lthattuk, hogy a tblaszerkezetek finomhangolst vgz szablyok valjban egy jabb szintet jelentenek afel, hogy a tblink szerkezete a lehet legegszsgesebb legyen. A kvetkez tma, amellyel foglalkoztunk, az elsdleges kulcsok szerepe volt. Megtanul tuk, mirt fontos, hogy az adatbzis minden tblja rendelkezzen elsdleges kulccsal, s mr azt is tudjuk, hogy az elsdleges kulcsoknak meghatrozott tulajdonsgokkal kell rendelkeznik, illetve hogy az elsdleges kulcs szerept betlt mezt nagyon gondosan kell kivlasztanunk a tblbl. Azt is megtudtuk, hogy mestersges elsdleges kulcsot is ltrehozhatunk, ha a tblban nem tallhat olyan mez, amely az elsdleges kulcsok szmra ktelez tulajdonsgok mindegyikvel rendelkezne. A fejezetet a szilrd kapcsolatok kialaktsnak trgyalsval zrtuk. Miutn ismtlskppen jra ttekintettk a kapcsolatok hrom lehetsges tpust, megtanultuk, hogyan brzolha tok ezek a kapcsolatok egy diagramon. Ezt kveten megtanultuk, hogyan hatrozhatunk meg egy trlsi szablyt egy adott kapcsolathoz, illetve hogyan jellhetjk azt a diagramon. Elmondtuk, hogy a trlsi szablyok azrt fontosak, mert vdelmet nyjtanak az rva rekor dok megjelense ellen. Az utols kt tmakr, amelyrl szt ejtettnk, a tblknak a kapcso latban betlttt szerepe, valamint a tblk rszvtelnek mrtke volt. Megtanultuk, hogy a tbla rszvtele lehet ktelez vagy nem ktelez, s hogy kt tbla kapcsolathoz megadhatjuk a kapcsold rekordok legkisebb s legnagyobb szmt. A kvetkez fejezetben az SQL trtnetrl olvashatunk rvid sszefoglalst, illetve arrl, hogy a nyelv fejldse miknt rt el a jelenlegi vltozathoz, az SQL:2003-hoz.

Az SQL rvid trtnete


Csak egy valls ltezik - br sok vltozata van." - George Bernard Shaw Bartsgos s bartsgtalan sznmvek

A fejezet tmakrei Az SQL eredete Az els megvalstsok s megszletik egy szabvny ... Az ANSI/ISO szabvny fejldse Kereskedelmi megvalstsok Mit tartogat a jv? Mirt rdemes megtanulnunk az SQL hasznlatt? sszefoglals

A trtnelernrk - gyakran homlyosan s megkrdjelezhet hitelessggel klnfle esemnyekrl, politikai fondorlatokrl s emberi gyengesgekrl szmolnak be. Ebben a tekintetben az SQL trtnete sem ms. Az SQL ilyen-olyan formban mr a relcis modell megjelense ta ltezik, s hossz, m korntsem makultlan mltjrl szmos beszmol szletett. Ebben a fejezetben azonban kzelebbi pillantst vetnk az adatbzis kezel nyelv eredetre, fejldsre s jvjre. Kt clunk van: elszr is kpet szeretnnk adni arrl, hogy miknt rt az SQL olyan nyelvv, amelyet ma az adatbzisrendszerek tbbsge hasznl, valamint azt is rzkeltetni szeretnnk, hogy mirt fontos, hogy megta nuljuk az SQL hasznlatt

Az SQL eredete
Ahogy az 1. fejezetben megtanultuk, a relcis adatbzismodellt Dr. E. F. Codd 1970-ben mutatta be a vilgnak. Ez utn a mrfldknek szmt pillanat utn az egyetemek, kuta tlaboratriumok s ms hasonl intzmnyek igyekeztek egy olyan nyelvet kifejleszteni, amelyet egy a relcis modellt tmogat adatbzisrendszer alapjaknt hasznlhatnnak

A kezdeti erfesztsek gymlcseknt az 1970-es vek elejn-kzepn tbb nyelv is szletett, ksbb pedig kidolgoztk az SQL alapjait s kifejlesztettk a ma hasznlatos SQL alap adatbzis-kezelket. De milyen eldei voltak az SQL-nek, hogyan fejldtt, s mit tartogat szmra a jv? Ahhoz, hogy vlaszolni tudjunk ezekre a krdsekre, vissza kell mennnk az idben a kaliforniai San Josba, az IBM cg Santa Teresa Research Laboratory nvre hallgat intzetbe. Az 1970-es vek elejn az IBM System/R nven elindtott egy nagyszabs kutatsi projektet, amelynek a clja a relcis modell alkalmazhatsgnak bizonytsa, valamint a relcis adatbzisok tervezse s megvalstsa tern trtn tapasztalatszerzs volt. A kutatk kezdeti erfesztsei az 1974-es s 1975-s vben sikeresnek bizonyultak: megalkottk a relcis adatbzis alapszint prototpust. Amellett, hogy mkdkpes relcis adatbzist igyekeztek kifejleszteni, a kutatk annak rdekben is erfesztseket tettek, hogy meghatrozzanak egy adatbzis-kezel nyelvet. Az ilyen nyelv megalkotsra tett els ksrletek kzl ktsgkvl az ebben a laboratri umban vgzett munka bizonyult a legnagyobb kereskedelmi jelentsgnek. 1974-ben Dr. Donald Chamberlin s munkatrsai kifejlesztettk a SEQUEL (Structured English Query Langugage, strukturlt angol lekrdeznyelv) nyelvet, amely lehetv tette a felhasznli nak, hogy vilgosan meghatrozott, az angolhoz hasonl nyelv mondatokkal krdezze nek le adatokat egy relcis adatbzisbl. Dr. Chamberlin s csapata az j nyelvet elszr a SEQUEL-XRM nev mintaadatbzisban valstotta meg. A SEQUEL-XRM sikere s a kezdeti visszajelzsek arra btortottk Dr. Chamberlint s trsait, hogy folytassk a kutatmunkt. 1976-77-ben teljesen tterveztk a SEQUEL-t, s az j vltozatot SEQUEL/2-nek neveztk el. Ksbb azonban a nevet jogi okokbl SQL-re (Structured Query Language, strukturlt lekrdeznyelv) kellett vltoztatniuk (valaki ms ugyanis mr hasznlta a SEQUEL betszt). Sokan a mai napig gy ejtik ki az SQL nevt, mint a sequel szt, br a hivatalos (a legszlesebb krben elfogadott) kiejts es-k-el" (illetve angolul esz-kj-el"). Az SQL tbb j szolgltatst is knlt, pldul tmogatta a tbbtbls lekrdezseket, valamint az adatok tbb felhasznl ltali megosztott elrst. Az SQL megjelense utn nem sokkal az IBM egy j s mg nagyratrbb terv megvals tsba fogott: egy olyan adatbzis-prototpust igyekeztek megalkotni, amely mg kzzel foghatbb teszi a relcis modell alkalmassgt. Az j prototpust System R-nek neveztk el, s az SQL egy kiterjedt rszhalmazra alapoztk. Miutn az elkszt munka nagyja befejezdtt, az IBM tbb bels hlzatra, illetve nhny kivlasztott gyfelre teleptette a System R-t tesztels s rtkels cljbl, majd a tapasztalatok s a felhasznlk visszajel zsei alapjn szmos vltoztatst eszkzlt a rendszeren s az SQL-en. Az IBM 1979-ben fejezte be a ksrletet, ami azzal a megllaptssal zrult, hogy a relcis modell valban alkalmas adatbzis-technolgia, amelyben komoly zleti lehetsgek vannak.

Az emltett projekt egyik legfontosabb eredmnynek tulajdontottk az SQL kifejlesztst is, pedig az SQL valjban a SQUARE (Specifying Queries As Relational Expressions, lekrdezsek meghatrozsa relcis kifejezsknt) kutatsi nyelvben gykerezik. Ezt a nyelvet 1975-ben dolgoztk ki (mg a System R pro jekt eltt), s arra terveztk, hogy az angol nyelvhz hasonl mondatokkal valstsanak meg relcis algebrt. Felmerlhet bennnk a krds, hogy ha az IBM arra a kvetkeztetsre jutott, hogy a rel cis modellben zletei lehetsgek rejlenek, mirt fejezte be a projektet? Knyvnk egyik szerzje, John, emlkszik r, hogy ltott egy bemutatt a System R-rl az 1970-es vek vgn, ami sok tekintetben lenygzte, de az akkor rendelkezsre ll hardveren mg a legegyszerbb lekrdezs vgrehajtsa is percekig tartott. Vilgos volt, hogy az SQL-nek van jvje, de egyrtelmen jobb hardver s szoftver szksgeltetett hozz, hogy a termk vonzv vljon a piac szmra.

Az els megvalstsok
Az 1970-es vekben az IBM kutatlaboratriumban vgzett munkt nagy rdekldssel ksrtk a klnbz mszaki folyiratok, s az j relcis modell elnyeirl lnken vitztak az adatbzis-technolgiai szeminriumokon. Az vtized vge fel vilgoss vlt, hogy az IBM nagyon szeretne a relcis adatbzismodellre s az SQL-re pl termkeket fejleszteni, s el is ktelezte magt ebben az irnyban. Ez termszetesen sok gyrtt tprengsre ksztetett: vajon mikor dobja piacra az els ilyen termkt az IBM? Egyesek j rzkkel gy dntttek, hogy a lehet leggyorsabban sajt termkek fejlesztsbe kezdenek, s nem vrjk meg, amg az IBM piacvezetv vlik. 1977-ben a kaliforniai Menlo Park mrnkei megalaptottk a Relational Software, Inc. nev cget, azzal a szndkkal, hogy egy j relcis adatbzistermket ksztsenek, amely az SQL-en alapul. A termk az Oracle nevet kapta. Az Oracle 1979-ben kerlt a piacra, kt vvel megelzve az IBM els hasonl termkt, s gy az els kereskedelmi forgalomban kaphat relcis adatbzis-kezel rendszerr (RDBMS, relational database management system) vlt. Az Oracle egyik elnye az volt, hogy a Digital VAX miniszmtgpein futott, nem pedig a kltsgesebb IBM-nagygpeken. A Relational Software azta Oracle Corporationre vltoztatta a nevt, s a mai napig az egyik piacvezet az RDBMS-szoftvergyrtk kztt. Mindekzben Michael Stonebraker, Eugene Wong s a kaliforniai Berkeley Egyetem szm tgpes laboratriumnak ms professzorai ugyancsak a relcis adatbzis-technolgia tern vgeztek kutatsokat. Az IBM csapathoz hasonlan kifejlesztettek egy relcisadatbzis-prototpust, amelynek a neve INGRES lett. Az INGRES-be beptettk a QUEL (Query Language) nev adatbzis-kezel nyelvet is, amely az SQL-lel sszevetve strukturltabb nyelv, de kevsb tmaszkodik a termszetes (angol) nyelv utastsokra. Az INGRES-t vgl SQL alap RDBMS rendszerr alaktottk t, amikor nyilvnvalv vlt, hogy az SQL

lesz az adatbzis-kezel nyelvek szabvnya. 1980-ban a Berkeley-rl tvoz nhny professzor megalaptotta a Relational Technology, Inc. cget, s 1981-ben bejelentettk az INGRES els kereskedelmi vltozatnak megjelentetst. A Relational Technology azta szmos talakulson esett keresztl, s ma a Computer Associates International Inc. rsze. Az INGRES azonban mg mindig az iparg egyik piacvezet adatbzistermke. De trjnk vissza az IBM-hez, akik a sajt RDBMS rendszerket, amelyet SQL/Data System-nek (SQL/DS) neveztek el, 1981-ben jelentettk be, s 1982-ben dobtk piacra. 1983-ban j vltozatot ksztettek belle a VM/CMS opercis rendszerre (ez az IBM egyik nagygpeken fut rendszere volt), valamint egy j RDBMS-termket is bejelentettek Database 2 (DB2) nven, amelyet az IBM nagygpeken a cg MVS opercis rendszervel lehetett hasznlni. A DB2 1985-ben kerlt a piacra, s azta az IBM vezet RDBMS-termkv vlt, technolgijt pedig a teljes IBM-termkvonalba beptettk Az IBM egybknt nem vltoztatta meg a nevt mg mindig IBM-nek hvjk. A System R kutatsi projekt ta eltelt tbb mint 25 v sorn a relcis modell olyan erv vlt, amely az ipargra szinte minden szinten hatst gyakorol, s tbbmillird dollros zlett ntte ki magt.

s megszletik egy szabvny...


Az adatbzisnyelvek kifejlesztsre irnyul vllalkozsok szertegazsgt figyelembe vve felmerlhet bennnk a krds, hogy gondolt-e valaki a szabvnyostsra. Az adatbzis-kuta tk kzssge persze megvitatta ennek a lehetsgt, de nem jutottak egyezsgre abban, hogy kinek kellene kidolgoznia a szabvnyt, vagy hogy az melyik nyelven alapuljon. Ezrt minden gyrt nllan folytatta a sajt adatbzis-termke fejlesztst, abban remnykedve, hogy az - s vele a benne hasznlt SQL-nyelvjrs lesz majd az ipargi szabvny. A vsrlk visszajelzsei s a piacon mutatkoz ignyek sok gyrtt arra ksztettek, hogy bizonyos elemeket beleptsenek a sajt SQL-nyelvjrsukba, gy idvel kialakult egy nem hivatalos szabvny, amely mai szemmel nzve rvid lers volt, mivel csak azokra az elemekre trt ki, amelyek a klnbz SQL-vltozatokban megegyeztek. Mindazonltal ez a szabvnyflesg (brmilyen is volt) megadta az adatbzis-felhasznlknak azokat az alapkvetelmnyeket, amelyek alapjn rtkelhettk a piacon jelen lev klnbz adatbzisprogramokat, s a legfontosabb tudnivalkat is sszefoglalta, amelyeket minden adatbzisprogramban hasznosthattak Egyre nagyobb igny jelentkezett egy hivatalos relcisadatbzisnyelv-szabvnyra, amire vlaszul az Amerikai Nemzeti Szabvnygyi Intzet (ANSI, American National Standards Institute) 1982-ben megbzta az al tartoz X3 nev szervezet adatbzis-technolgiai bizottsgt, az X3H2-t, hogy ksztsen tervezetet egy ilyen szabvnyhoz. (Az X3 az ANSI ltal felgyelt szmos szervezet egyike, az X3H2 azonban csak egy azok kzl a mszaki bizottsgok kzl, amelyek az X3 hatskrbe tartoznak. Az X3H2-t adatbzis-szakrtk

s a fontosabb SQL alap adatbzisokat gyrt cgek kpviseli alkotjk.) A bizottsg kezdetben ttekintette s megvitatta a klnbz javasolt nyelvek elnyeit s htrnyait, s egy az INGRES adatbzisnyelvn, a QUEL-en alapul szabvny kidolgozsba is bele fogott. A piac eri s az IBM nvekv elktelezettsge az SQL mellett azonban meggyz tk a bizottsgot, hogy a szabvnytervezet alapjul inkbb az SQL-t vlassza. Az X3H2 bizottsg szabvnytervezete nagyrszt az IBM DB2-jnek SQL-nyelvjrst vette alapul. A bizottsg a kvetkez kt v sorn tbb vltozatot is kidolgozott, s bizonyos fokig tovbb is fejlesztette az SQL-t. Ennek a tovbbfejlesztsnek azonban az lett a szeren cstlen eredmnye, hogy az j szabvny sszeegyeztethetetlenn vlt a mr ltez fonto sabb SQL-nyelvjrsokkal. Az X3H2 hamarosan rbredt, hogy az SQL-en vgrehajtott mdostsok nem eredmnyeztek elg jelents javulst ahhoz, hogy ellenslyozzk a csereszabatossg srlst, ezrt a bizottsg visszatrt a szabvny eredeti vltozathoz. Az ANSI 1986-ban ANSI X3.135-1986 Database Language SQL nven szentestette az X3H2 szabvnytervezett, amely vgl SQL/86 nven vlt szles krben ismertt. Br az X3H2 ki sebb javtsokat is eszkzlt a szabvnyon, mieltt azt az ANSI elfogadta volna, az SQL/86 csupn a legkisebb kzs rszhalmazt hatrozta meg azoknak a kvetelmnyeknek, amelyeknek az adatbzisgyrtknak eleget kellett tennik. Lnyegben teht csak hivatalos szintre emelte azokat az elemeket, amelyek a klnbz SQL-nyelvjrsokban megegyez tek, s amelyeket a legtbb adatbzisgyrt mr megvalstott. Mindazonltal az j szabvny vgre konkrt alapot biztostott, ahonnan kiindulva a nyelvet s annak megvalstsait tovbb lehetett fejleszteni. A Nemzetkzi Szabvnygyi Szervezet (ISO, International Organization for Standardization) a sajt szabvnytervezett (ami pontosan megfelelt az ANSI SQV86-nak) 1987-ben hagyta jv nemzetkzi szabvnyknt, s ISO 9075-1987 Database Language SQL nven tette kzz. (ltalban mindkt szabvnyra ma is csak SQL/86-knt szoktak hivatkozni.) Az adatbzisgyrtk nemzetkzi kzssge innen kezdve ugyanazokra a szabvnyokra pthetett, mint az Egyeslt llamokban tevkenyked trsaik. Mindazonltal annak ellen re, hogy az SQL hivatalos szabvnny vlt, a nyelv mg messze nem llt teljesen kszen.

Az ANSI/ISO szabvny fejldse


Az SQL/86-ot hamarosan nyilvnos brlatok rtk, egyrszt a kormnyzat, msrszt az iparg olyan szaktekintlyei rszrl, mint C. J. Date. A kritikusok olyan dolgokat rttak fel a szabvnynak, mint az SQL-nyelvtan felesleges ismtldsei (ugyanazt a lekrdezst tbbflekppen is meg lehetett hatrozni), valamint bizonyos relcis mveletek tmogat snak, valamint a hivatkozsi psgnek a hinya. Br az X3H2 mr az eltt tisztban volt ezekkel a problmkkal, mieltt kzztettk volna az SQL/86-ot, a bizottsg gy dnttt, hogy clszerbb hamarabb megjelentetni a szabvnyt (mg ha ksbb finomtani kell is), mint hogy egyltaln ne legyen szabvny.

Mind az ISO, mind az ANSI gy felelt a hivatkozsi psget rint kritikkra, hogy finom tott a szabvnyn. Az ISO 1989 kzepn tette kzz az ISO 9075:1989 Database Language SQL with Integrity Enhancements nev vltozatot, az ANSI pedig mg ugyanabban az v ben megjelentette az X3.135-1989 Database Language SQL with Integrity Enhancements szabvnyt, amelyre gyakran SQL/89-knt szoktak hivatkozni. Az ANSI-bizottsg munkja azonban nem rt vget az vre: az X3H2 tovbbra is megoldst igyekezett tallni egy fontos krdsre, amelyet a kormnyzat vetett fel. Egyes llami felhasznlk panaszkodtak, hogy a szabvny nem rja le kifejezetten, hogy miknt lehet az SQL-t begyazni egy hagyomnyos programozsi nyelvbe. (A szabvny tartalmazott ugyan erre vonatkoz lerst, de csupn fggelkknt.) Amiatt aggdtak, hogy a gyrtk esetleg nem hordozhat megvalstsokkal llnak majd el a begyazott SQL-hez, hiszen a szabvny ehhez nem r el kvetelmnyeket. Az X3H2 vlaszul kidolgozott egy msodik szabvnyt, amely megkvetelte a begyazs lersnak val megfelelsget; ez volt az ANSI X3.168-1989 Database Language Embedded SQL. rdekes, hogy az ISO nem tett kzz hasonl szabvnyt, mert a nemzetkzi kzssgnek nem voltak hasonl aggodalmai. gy aztn az ISO-nak nem volt szabvnylersa az SQL begyazsra ms programozsi nyelvekbe, s ez a helyzet csak akkor vltozott meg, amikor az ISO megjelentette az SQL/92 szabvnyt. Az SQL/86 s az SQL/89 mg tvol llt attl, hogy teljes szabvny legyen, mert hinyzott bellk nhny a kereskedelmi adatbzisrendszerekben elengedhetetlen szolgltats. A kt szabvny egyike sem rta le pldul, hogy miknt lehet mdostani az adatbzis szerkezett (akr magn az adatbzisrendszeren bell), miutn meghatroztuk azt. Egyetlen szerkezeti elem (pldul a tblk s az oszlopok) sem volt mdosthat vagy trlhet, s az adatbzis biztonsgn sem lehetett vltoztatni. Ltrehozhattunk pldul a CREATE utastssal egy tblt, de a szabvny nem hatrozta meg sem a tblk trlsre szolgl DROP parancsot, sem a mdost ALTER utastst. Hozzfrst adhattunk egy tblhoz a GRANT paranccsal, de a szabvnyban nem szerepelt a REVOKE parancs, amellyel visszavonhattuk volna az engedlyt. Ironikus mdon ezekkel a kpessgekkel minden kereskedelmi SQL alap adatbzis-kezel rendelkezett, de egyik szabvnyba sem kerltek be, mert az egyes gyrtk ms-ms mdon valstottk meg ket. Szmos ms olyan szolgltats is helyet kapott sok SQL alap adatbzis-kezelben, amely kimaradt a szabvnyokbl - ismt csak a megvalstsok klnbzsge miatt. Mire az SQL/89-t befejeztk, mr mind az ANSI, mind az ISO megkezdte a munkt az SQL-szabvny javtott vltozatn, amely a nyelvet valban teljess s hatkonny volt hivatott tenni. Az j vltozatba, amelyre (termszetesen) SQL/92-knt hivatkoztak, olyan szolgltatsokat kvntak bepteni, amelyeket a fontosabb adatbzisgyrtk mr szles krben megvalstottak. Az ANSI s az ISO egyik legfontosabb clkitzse azonban az volt, hogy elkerljk, hogy a szabvny ismt "a legkisebb kzs oszt" elvt kvesse,

ezrt gy dntttek, hogy olyan kpessgekkel is bvtik a nyelvet, amelyek mg nem vltak szles krben elfogadott, valamint olyan j szolgltatsokat is belevesznek, ame lyek jelentsen tlmutatnak a ltez megvalstsokon. Az j ANSI, illetve ISO szabvny az X3.135-1992 Database Language SQL, illetve az ISO/IEC 9075:1992 Database Language SQL - 1992 oktberben jelent meg. (A doku mentumok mr 1991 vgn kszen lltak, de a rkvetkez vben mg finomtottak raj tuk.) Az SQL/92 lers lnyegesen hosszabb volt az SQL/89-nl, de bvebb anyagot is tartalmazott. Meghatrozta pldul azokat a mdszereket, amelyekkel az adatbzis szer kezett annak meghatrozsa utn mdosthatjuk, tovbbi mveleteket adott a karakter lncok, valamint a dtumok s idpontok kezelsre, s j biztonsgi szolgltatsokat is lert. Az SQL/92 teht hatalmas ugrst jelentett brmelyik eldjhez kpest. Szerencsre a szabvnygyi bizottsgok bizonyos fokig felkszltek az j helyzetre. Ahhoz, hogy az j szabvnyra trtn fokozatos s grdlkeny tllst biztostsk, az ANSI s az ISO az SQL/92-nek hrom szintjt hatrozta meg: Entry SQL (Belp szint SQL) Ez a szint hasonl az SQL/89-hez, de a korbbi szabvnyt olyan szolgltatsokkal bvti, amelyek segtenek az SQL/92-re trtn tllsban, illetve kijavtjk az SQL/89 hibit. Az elv az volt, hogy ezt a szintet knnyen meg lehessen valstani, mivel a szolgltatsainak tbbsge mr rendelkezsre ll a legtbb meglv termkben. INTERMEDIATE SQL (Kzpszint SQL) Ez a szint az j szabvny legtbb szolgltatst tartal mazza. A kt bizottsg dntst, miszerint e szint rszv tesznek bizonyos szolgl tatsokat, tbb tnyez befolysolta. Az ltalnos cl az volt, hogy gy javtsanak a szabvnyon, hogy az SQL jobban tmogassa a relcis modell elveit, illetve hogy a nyelvtanbl kikszbljk a homlyos vagy ktrtelm elemeket. Az egyrtelm volt, hogy a gyrtk ltal gy vagy gy mr megvalstott s az emltett clokkal sszhangban lev szolgltatsok helyet kapnak ezen a szinten. Az SQL-adatbzisrendszerek felhasznli ltal ignyelt szolgltatsokat aszerint brltk el, hogy ele get tesznek-e ezeknek a kvetelmnyeknek, s hogy a legtbb gyrt viszonylag knnyen kpes lesz-e megvalstani ket. Ennek a szintnek teht az volt a clja, hogy biztostsa, hogy egy adott termk a lehet leghatkonyabb megvalstst le gyen kpes nyjtani. Full SQL (Teljes SQL) Ez a szint a teljes SQL/92 szabvnyt magba foglalja, s termsze tesen itt kaptak helyet azok az sszetettebb szolgltatsok, amelyek az els kt szintbl kimaradtak. Ez a szint teht olyan szolgltatsokat tartalmaz, amelyekrl br a felhasznli ignyek kielgtsre, illetve a nyelv tovbbi megtiszttsra elg fontosnak talltattak gy gondoltk, hogy a legtbb gyrt csak nehezen tudn azonnal megvalstani. Sajnos a Full SQL-nek val megfelelsg mg nem kvetelmny, ezrt egyhamar nem vrhatjuk, hogy minden adatbzistermk telje sen megvalstja a szabvnyt.

Br szmos adatbzisgyrt igyekezett megvalstani az SQL/92-ben lertakat, a sajt szolgltatsok fejlesztst s megvalstst is folytattk. Ezeket az SQL-szabvnyt kiegszt szolgltatsokat nevezzk bvtseknek. Egyes gyrtk pldul tbb adattpust biztostanak az SQL/92-ben meghatrozott hat tpusnl. Br a bvtsek tovbbi kpessgekkel ruhznak fel egy adott termket, s lehetv teszik a gyrtknak, hogy megklnbztessk a prog ramjukat ms termkektl, htrnyaik is vannak. A bvtsekkel kapcsolatban az jelenti a f problmt, hogy hatsukra az adott gyrt SQL-nyelvjrsa tvolabb kerl az eredeti szabvnytl, ami megakadlyozza, hogy az adatbzis-fejlesztk olyan hordozhat alkalma zsokat ksztsenek, amelyek brmely SQL alap adatbzis-kezelbl futtathatk

Egyb SQL-szabvnyok
Az ANSI/ISO SQL-szabvny ma a legszlesebb krben elfogadott szabvny, ami termsze tesen azt is jelenti, hogy a tbbi ltez szabvny ugyancsak tartalmazza az SQL-t valamilyen formban. Lssunk nhnyat a jelentsebb alternatv szabvnyok kzl:
X/OPEN Az X/OPEN eurpai gyrtk csoportja, amely egy olyan szabvnygyjtemnyt

dolgozott ki, amelynek az a clja, hogy elsegtse egy UNIX-alap hordozhat alkal mazskrnyezet kialaktst. Az eurpai piacon komoly jelentsggel br, hogy egy alkalmazst mdosts nlkl t lehessen vinni egy szmtgprendszerrl egy msikra. Br az X/OPEN tagjai a szabvnygyjtemny rszv tettk az SQL-t, az vltozatuk tbb ponton is eltr az ANSI/ISO szabvnyoktl SAA Az IBM mindig is sajt SQL-nyelvjrst hasznlt, amelyet beleptettek a Systems Application Architecture (SAA) nev szabvnylersukba. Az SAA egyik f clja az volt, hogy az IBM SQL-nyelvjrst a cg teljes adatbzistermk-knlatnak rszv tegyk, s br ezt a clt soha nem rtk el, az SQL most is fontos szerepet jtszik az IBM adatbzistermkeinek egysgess ttelben. FIPS Az NIST (National Institute of Standards and Technology, Nemzeti Szabvnygyi s Technolgiai Intzet) 1987-ben tette az SQL FIPS-szabvnny (a FIPS a Federal Information Processing Standard, vagyis szvetsgi informcifeldolgozsi szabvny rvidtse). Az eredetileg FIPS PUB 127 nven kzztett szabvny azt a szintet rja le, amelyet egy RDBMS-nek teljestenie kell ahhoz, hogy megfeleljen az ANSI/ISO szab vnynak. Az Egyeslt llamok kormnyzati szervei azta csak olyan relcis adatb zistermkeket hasznlhatnak, amelyek megfelelnek az rvnyben lev FIPSszabvnynak. ODBC 1989-ben adatbzisgyrtk egy csoportja megalaktotta az SQL Access csoportot, azzal a cllal, hogy megoldjk az adatbzisok egyttmkdsnek problmjt. Br ezen gyrtk els erfesztsei nem igazn jrtak sikerrel, az eredeti clkitzs mellett arra is ksrletet tettek, hogy kidolgozzanak egy mdszert arra, hogy egy SQL-adatbzist egy felhasznli felleti nyelvhez lehessen kapcsolni. Ennek az eredmnye lett a CLI (Call-Level Interface) szabvny, amelyet 1992-ben tettek kzz. Ugyanebben az vben a Microsoft megjelentette a sajt ODBC (Open Database Connectivity) ler st is, amely a CLI-n alapult. Az ODBC azta az adatok elrsnek s megosztsnak de facto szabvnyv vlt az ODBC-t tmogat SQL adatbzisok kztt.

A fenti szabvnyokat folyamatosan tovbbfejlesztik, hogy igazodjanak az ANSI/ISO SQL jabb vltozataihoz, de nha ettl fggetlenl is javtanak rajtuk. 1997-ben az ANSI X3 szervezete j nevet kapott: National Committee for Information Technology Standards (NCITS, Nemzeti Informcitechnolgiai Szabvnyok Bizottsga). Az SQL-szabvnyrt felels mszaki bizottsg neve is megvltozott; ezt ma ANSI NCITS-H2nek hvjk. Az SQL-szabvny rohamosan nvekv bonyolultsga miatt az ANSI s az ISO szabvnygyi bizottsgai az SQL3 szabvny kidolgozsnak megkezdsekor (a nv onnan ered, hogy ez lesz a szabvny harmadik nagyobb vltozata) megegyeztek abban, hogy a szabvnyt tizenkt nllan szmozott rszre, valamint egy fggelkre bontjk, hogy az egyes rszeken prhuzamosan folyhasson a munka. Ezenkvl 1997 ta kt tovbbi rszt is meghatroztak. Az SQL-szabvny egyes rszeinek nevt s lerst a 31. tblzatban soroltuk fel, azzal egytt, hogy az adott rsz milyen llapotban volt 2007 elejn. (A "teljes"(-nek mondhat) szabvny itt (is) van: http://www.jcc.com/sql.htm)

Kereskedelmi megvalstsok
Ahogy a fejezetben korbban olvashattuk, az SQL-t elszr nagygpes krnyezetben hasznltk. Az olyan termkek, mint a DB2, az INGRES vagy az Oracle 1979 ta lteznek, s elfogadott tettk az SQL-t mint a relcis adatbzisok kezelsnek elsdleges nyelvt. Az 1980-as vekben a relcis adatbzisok megjelentek az asztali szemlyi szmtgpe ken is, s az olyan programok, mint az R:BASE, a dBase IV s a Super Base egyszeren elrhetv tettk a tblkban trolt adatokat a htkznapi felhasznlk szmra is. Az SQL azonban csak az 1980-as vek vgn, illetve az 1990-es vek elejn vlt az asztali relcis adatbzisok meghatroz nyelvv. A termk, amelynek az ttrs ksznhet, ktsgkvl a Microsoft Access 1992-ben megjelent 1-es vltozata volt. Az 1990-es vek elejn elrkezett az gyfl-kiszolgl rendszerek kora is, az olyan RDBMS programokat pedig, mint a Microsoft SQL Server vagy az Informix-SE, gy terveztk, hogy a legklnflbb tbbfelhasznls krnyezet felhasznlinak nyjtsanak adatbzis-szolgl tatsokat. 2000 ta arra is sszehangolt erfesztsek trtnnek, hogy az adatbzisok infor mciit az Interneten keresztl is elrhetv tegyk. Az e-kereskedelem vonzv vlt a cgek szmra, s azok is, akik mg nem jelentek meg a Vilghln, igyekeznek gyorsan ptolni ezt a hinyossgot. Ennek eredmnyekppen az adatbzis-fejlesztknek hatko nyabb gyfl-kiszolgl adatbzisokra van szksgk, s a bevlt RDBMS-termkek olyan j vltozataira, amelyek segtsgvel a webhelyek ignyeit kielgt adatbzisokat fejleszt hetnek s tarthatnak fenn.

Megprblhatnnk felsorolni az SQL-t tmogat sszes kereskedelmi forgalomban lev termket, de a lista sok-sok oldalnyi lenne, ezrt elg, ha megllaptjuk, hogy az SQL mg sokig a kereskedelmi adatbzisrendszerek rsze lesz.

Mit tartogat a jv?


Amikor knyvnk els kiadst rtuk 1999-ben, a szabvnygyi bizottsgok ppen az utols simtsokat vgeztk a rgta grt SQL3-on. Azta megjelent az SQL:1999 s az SQL:2003 is, 2007 kzepn pedig mind az ANSI-, mind az ISO-bizottsg kemnyen dolgozott az SQL:2007 javtott kiadsn. A tervek szerint alapos fellvizsglat vr az SQL/XML rszre (Part 14). A nemzetkzi bizottsg egy nll SQL/MM-Multimedia szabvnyon is munklko dik, amely maga is t rszbl Framework (keretrendszer), Full Text (teljes szveg), Spatial (trgrafika), Still Image (llkp) s Data Mining (adatbnyszat) fog llni. Br a szabvny gyi bizottsgok a kereskedelmi megvalstsok mgtt alaposan lemaradva kezdtk meg a munkt 1986-ban, az SQL-szabvny azta egyrtelmen behozta a htrnyt, s sok terle ten mr a hozzfrhet adatbzisrendszerek szolgltatsai eltt jr.

Mirt rdemes megtanulnunk az SQL hasznlatt?


Ha megtanuljuk az SQL hasznlatt, birtokba jutunk mindazoknak a kpessgeknek, amelyek rvn brmilyen relcis adatbzisbl informcikat nyerhetnk ki, ezen fell segt, hogy megrtsk, mi zajlik az RDBMS-termkek grafikus lekrdezfellete mgtt. Az SQL ismerete rvn sszetett lekrdezseket rhatunk, s rendelkezni fogunk azzal a tudssal is, ami a lekrdezsek esetleges hibinak elhrtshoz szksges. Mivel az SQL a legklnflbb RDBMS-termkek rsze, tudsunkat sokfle rendszeren hasznosthatjuk Ha megtanuljuk pldul, hogy miknt kell hasznlni az SQL-t egy olyan programban, mint a Microsoft Access, ennek a kpessgnknek akkor is hasznt ltjuk, ha a cgnk gy dnt, hogy Microsoft SQL Serverre, az Oracle Corporation Oracle rend szerre vagy az IBM DB/2-jre tr t. Nem kell jra elsajttanunk az SQL hasznlatt csak az els termk nyelvjrsa s a msik program SQL-vltozata kztti klnbsgekkel kell tisztban lennnk. Nem lehet elgszer hangslyozni, hogy az SQL mg sokig velnk marad. Szmos gyrt fektetett rengeteg pnzt, idt s kutati erforrst abba, hogy az SQL-t beptse a sajt RDBMS-termkeibe, s hatalmas a szma azoknak a cgeknek s intzmnyeknek is, amelyek informcitechnolgiai infrastrukrjukat ezekre a termkekre ptettk. Amit ebben a fejezetben olvashattunk az SQL-rl, annak alapjn felttelezhetjk, hogy a fejl dse nem ll meg: folyamatosan megjul majd, hogy igazadjon a vltoz ignyekhez s piaci kvetelmnyekhez.

sszefoglals
A fejezetet az SQL eredetnek rvid ttekintsvel kezdtk. Megtudtuk, hogy az SQL a relcis adatbzisokhoz kszlt nyelv, amelyet nem sokkal a relcis modell megjelense utn alkottak meg, s hogy a fejldse eleinte szorosan kapcsoldott magnak a relcis modellnek a fejldshez. Ez utn arrl olvashattunk, hogy kezdetben miknt valstottk meg a klnbz adatb zisgyrtk a relcis modellt. Megtudtuk, hogy az els relcis adatbzisokat nagyszm tgpes krnyezetekhez ksztettk, s lttuk, hogyan vlt az IBM s az Oracle az iparg vezet erejv. Ezt kveten az ANSI SQL-szabvny megszletst ismertettk: megtudtuk, hogy mr l tezett egy nem hivatalos szabvny, amikor az ANSI gy dnttt, hogy kszt egy hivatalos vltozatot, s olvashattunk az ANSI X3H2 bizottsgnak az els szabvnyvltozaton vgzett munkjrl. Elmondtuk, hogy br az j szabvny a szolgltatsoknak csupn a legkisebb kzs rszhalmazt hatrozta meg, vgre konkrt alapot biztostott, ahonnan kiindulva a nyelvet tovbb lehetett fejleszteni, s arrl is szt ejtettnk, hogy az ISO is megjelentette a sajt szabvnyt, amely pontosan megfelelt az ANSI lersnak. Kvetkez tmnk az ANSI/ISO szabvny fejldse volt. Elmondtuk, hogy a szabvny els vltozatt sokan brltk, s hogy az ANSI/ISO a brlatokra a szabvny tbbszri fellvizs glatval vlaszolt. Lttuk, hogyan vezetett az egyik vltozat a msikhoz, s hogy miknt rkeztnk el vgl az SQL/92 szabvnyhoz. Ismertettk, hogy a szabvny tbb megfelels gi szintet hatroz meg, ami lehetv teszi a gyrtknak, hogy a lehet leggrdlkenyebben ptsk be a szabvny j szolgltatsait a termkeikbe. Ez utn sszefoglaltuk, hogyan fejl dtt tovbb az SQL-szabvny 1992 ta, s a kereskedelmi SQL-adatbzisok fejldsre is vetettnk egy gyors pillantst. A fejezet vgn az SQL jvjrl elmlkedtnk. Megtudhattuk, hogy az SQL:2003 sokkal bonyolultabb szabvny az SQL/92-nl, elmagyarztuk, mirt fog folytatdni az SQL fej lesztse, s azt is megindokoltuk, hogy mirt rdemes megtanulnunk a nyelv hasznlatt.

II. rsz
Az SQL alapjai

Egyszer lekrdezsek rsa


Gondolkodjunk gy, mint a blcsek, de beszljnk gy, mint az emberek." - William Butler Yeats

A fejezet tmakrei
Bemutatkozik a SELECT A SELECT utasts Egy kis kitr: adat kontra informci A krelmek lefordtsa SQL-re A sorismtls kikszblse Az informcik rendezse Ments Pldk sszefoglals nll feladatok

Most, hogy egy kicsit megismerkedtnk az SQL trtnetvel, lpjnk tovbb, s ismerked jnk meg magval a nyelvvel! Amint a bevezetben is emltettk, a knyvben a legnagyobb hangslyt a nyelv adatkezel kpessgeinek bemutatsra fektetjk majd. Vegyk ht szemgyre elsknt az SQL igazi igslovnak tekinthet SELECT utastst!

Bemutatkozik a SELECT
A SELECT utastst tekinthetjk minden ms kulcsszt megelzve -, az SQL nyelv lelk nek. Sarokkvt kpezi a leghatkonyabb s legsszetettebb utastsoknak, segtsgvel vltoztathatjuk az adatbzisunk tbliban trolt adatokat beszdes informcikk. Radsul a SELECT-et ms kulcsszavakkal s kifejezsekkel szmtalan mdon ssze is kapcsolhatjuk. Ki? Mi? Hol? Mikor? Mennyi? Milyen esetben? Szinte minden krdstpusra vlaszolhatunk vele. Ha jl terveztk meg az adatbzisunkat, s rendelkezsnkre llnak a megfelel

adatok, minden feleletet megkaphatunk, amire csak szksgnk lehet pldul a cgnk szmra fontos dntsek meghozatalhoz. Amikor pedig az 5. fejezethez rnk, szre fog juk venni, hogy sok mindent, amit a SELECT-rl tanultunk, az UPDATE, INSERT, s DELETE utastsok rsa sorn is alkalmazhatunk majd. Az SQL nyelvben a SELECT mvelet hrom kisebb mvelettpusra bonthat, amelyekre a ksbbiekben SELECT utasts, SELECT kifejezs s SELECT lekrdezs nven fogunk hivatkozni. gy egyszerbb lesz tltnunk s megrtennk a benne rejl sszetett lehet sgeket. Mindegyik mvelettpusnak megvannak a jellemz kulcsszavai s zradkai, ami nagyfok rugalmassgot biztost a vgs lekrdezs sszelltshoz, hogy az minl tkletesebben kifejezhesse az adatbzisnak feltenni kvnt krdst. Amint a kvetkez fejezetekben megtanuljuk majd, az egyes mveletek szmtalan mdon kombinlhatk is egymssal, gy igen sszetett krdseket is feltehetnk Ezt a fejezetet a SELECT utasts trgyalsval kezdjk, s rviden ttekintjk a SELECT lekrdezseket Ezt kveten rszleteiben megvizsgljuk a SELECT utastsokat az 5. s 6. fejezetben.

A tma szakirodalmban elfordul, hogy a tbla helyett a relci kifejezst olvashatjuk, az adatbzis soraira a rekord egyes angol nyelv knyvekben ritkbban a tuple-, az oszlopaira pedig a jellemz (attribtum) vagy mez elnevezst alkalmazzk, jllehet az SQL-szabvny kvetkezetesen tbla, sor, s oszlop nven hivatkozik az adatbzisszerkezet ezen elemeire . Mi sszhangban a szabvnnyal az utbbi hrom fogalmat fogjuk hasznlni a tovbbiakban is.

A SELECT utasts
A SELECT utasts kpezi minden krds alapjt, amit feltesznk az adatbzisnak. Amikor megfogalmazunk s vgrehajtunk egy SELECT utastst, lekrdezst intznk az adatbzis fel. (Tudjuk, hogy magtl rtetdnek hangzik, de szeretnnk biztosak lenni benne, hogy a tma bizonyos sarokpontjait minden olvasnk azonosan rtelmezi.) A gyakorlatban sok relcis adatbzis-kezel (RDBMS) rendszer lehetsget ad r, hogy a SELECT utastsainkat lekrdezs, nzettbla, fggvny vagy trolt eljrs formjban mentsk. Ha valakitl azt halljuk, hogy vgrehajt egy lekrdezst, tudjuk, hogy valamilyen SELECT utastst kszl futtatni az adatbzison. Adatbzis-kezeltl fggen a SELECT utastsokat vgrehajthatjuk kzvetlenl egy parancsablakbl, interaktv Query by Example (QBE) szerkesztrcsbl, de programkd belsejbl is. Fggetlenl attl, hogy miknt hatrozzuk meg s futtatjuk, a SELECT utasts nyelvtani szablyai ugyanazok maradnak. Sok adatbzis-kezel biztost bvtett lehetsgeket az eredeti SQLszabvnyhoz kpest, s teszi lehetv sszetettebb utastsok (pldul If... Then... Else) hasznlatt fggvnyekben vagy trolt eljrsokban, de a pontos utas-

tsformk minden termk esetben egyediek. Akr csak egy-kt ilyen bvtett programo zsi nyelv pldul a Microsoft SQL Server Transact-SQL-je vagy az Oracle PL/SQL-je bemutatsa is messze tlmutatna ennek a knyvnek a keretein, ezrt az adatbzisrend szernk fggvnyeinek s trolt eljrsainak ltrehozshoz tovbbra is az alapvet SELECT utastst fogjuk hasznlni. Knyvnkben mindvgig a nzettbla elnevezst fogjuk alkalmazni, amikor mentett SQL-utastsokrl ejtnk szt, jllehet ezeket valsz nleg egy fggvnybe vagy eljrsba gyazzuk majd. A SELECT utastsok egymstl fggetlen kulcsszavakbl plnek fel, amelyeket zrad koknak (clause) hvunk. A SELECT utastsok ezeknek a zradkoknak a klnfle bellt saitl fggen kpesek a krt informcik visszaadsra. A zradkok egy rsze ktelezen megadand, msokat elhagyhatunk. Emellett az egyes zradkokhoz is tartoznak sajt kulcsszavak, amelyek kztt szintn vannak ktelezk s elhagyhatk. Ezeket az adott zradk hasznlja annak rdekben, hogy azokat az informcikat krje le, amelyeket a teljes SELECT utasts ignyel. A SELECT utastst s a zradkait a 4.1. brn lthatjuk.

A 4.1. brn lthat szintaxisdiagram egy egyszer SELECT-utastst mutat be. A ksbbiekben ezt a diagramot fogjuk bvteni, ahogy az j kulcsszavakkal s zradkokkal megismerkednk. Ha van mr tapasztalatunk SQL-utastsokkal, legynk trelmesek, ezeknek is hamarosan eljn az idejk.
Az albbiakban sszefoglaljuk a SELECT utasts zradkait. SELECT Ez a SELECT utasts elsdleges zradka, amelyet minden esetben ktele z megadni. Arra hasznljuk, hogy meghatrozzuk azokat az oszlopokat, amelyeket a lekrdezs eredmnyben vissza szeretnnk kapni. Az oszlopokat abbl a tblbl vagy nzettblbl vlasztjuk ki, amelyeket a FROM zradkban meghatroztunk (Szrmazhatnak egyszerre tbb tblbl is, de erre bvebben a 3. fejezetben trnk

ki.) Hasznlhatunk sszest fggvnyeket is, mint a Sum(HoursWorked) (Sum(Munkark)), vagy matematikai mveleteket, mint a Quantity * Price (Mennyisg * r). FROM - Ez a msodik legfontosabb zradk, s ezt is ktelez megadnunk. Arra hasznljuk, hogy megnevezzk a tblkat vagy nzettblkat, amelyeknek az osz lopaibl a SELECT zradkban meghatrozott elemek szrmaznak. Ezt a zradkot sokkal sszetettebb mdon is hasznlhatjuk; rszletesebben ezzel is a ksbbi feje zetekben fogunk foglalkozni. WHERE - Ez egy elhagyhat zradk, s arra hasznlhatjuk, hogy szktsk a FROM zradk ltal visszaadott sorok krt. A WHERE kulcsszt egy kifejezs kveti, amelyet lltsnak (prediktumnak) neveznk, s amelyet kirtkelve igaz, hamis vagy ismeretlen rtket kaphatunk. A kifejezs kirtkelsre szabvnyos sszeha sonlt mveleteket, logikai mveleteket, s mg nhny klnleges mveletet hasznlhatunk. A WHERE zradk sszes elemt a 6. fejezetben trgyaljuk majd. GROUP BY - Amikor gynevezett sszest fggvnyeket hasznlunk a SELECT zra dkban sszegz jelleg informcik ellltshoz, a GROUP BY zradkot hasznl juk az adatok csoportokra bontshoz. Adatbzis-kezelnk a GROUP BY utn meg adott oszlop vagy oszlopok szerint csoportostja az adatokat. A GROUP BY zradk hasznlata nem ktelez. Rszletesebben a 13. fejezetben foglalkozunk vele. HAVING - A HAVING zradkot az sszest fggvnyek ltal szolgltatott csopor tostott adatok szrsre hasznlhatjuk. A WHERE zradkkal megegyezen a HAVING kulcsszt egy kifejezs kveti, amely igaz, hamis vagy ismeretlen rtket adhat. A kifejezs kirtkelsre szabvnyos sszehasonlt mveleteket, logikai mveleteket, s mg nhny klnleges mveletet hasznlhatunk. A HAVING meg adsa sem ktelez; rszletesebben a 14. fejezetben ismerhetjk meg.

Elszr a legegyszerbb SELECT utastsokkal ltunk munkhoz, s a SELECT s FROM zradkokra sszpontostunk, majd egyesvel bvtjk a fegyvertrunkat ms zradkokkal, ahogy haladunk fejezetrl fejezetre, hogy egyre sszetettebb SELECT utastsokat ptsnk.

Egy kis kitr: adat kontra informci


Mieltt els lekrdezsnket nekiszegeznnk az adatbzisunknak, tisztznunk kell, hogy l nyeges klnbsg van adat s informci kztt. Egyszeren megfogalmazva, adat az, amit az adatbzisban trolunk, informci pedig az, amit az adatbzisbl kinyernk. Ez a sztv laszts azrt fontos a szmunkra, mert segt a helyes szemlletmd kialaktsban. Tartsuk szem eltt, hogy az adatbzis arra szolgl, hogy beszdes informcikat szolgltasson vala kinek, aki az adott cgnl dolgozik. Az informci azonban csak akkor llhat majd a rendel kezsnkre, ha a megfelel adatok megtallhatk az adatbzisban, s magt az adatbzist is gy ptettk fel, hogy tmogassa ezeknek az informciknak a megszerzst. Vizsgljuk meg ezeket a fogalmakat rszletesebben!

Az adatbzisunk meziben trolt rtkek az adatok. Az adatok llandnak tekinthetk, abban az rtelemben, hogy vltozatlanok maradnak, amg sajt kezleg vagy valamilyen automatizlt eljrssal nem mdostjuk ket. A 4.2. brn szemgyre vehetnk nhny pldaadatot.

Ezek az adatok nem mondanak neknk tl sokat, pldul nem tudjuk eldnteni, hogy a 89931-es rtk mit takar. Irnytszm? Vagy taln egy alkatrsz azonostkdja? Mg ha tudnnk is, hogy egy vsrl azonostjrl van sz: vajon Katherine Ehrlich-hez tartozik? Nem tudhatjuk, amg az adatokat fel nem dolgoztuk Az adatok feldolgozsa utn mindez rtelmet nyer, s az adatok hasznlhatv vlnak. Amikor mr olyan mdon jelenik meg, hogy dolgozunk vele vagy megtekintjk, az adatbl informci lesz. Az informcikat dinamikusnak tekintjk, mivel az adatbzisban trolt adatok fggvnyben folyamatosan vltoznak, s szmtalan mdon dolgozhatjuk fel s jelenthetjk meg ket. A SELECT utastsok eredmnyeknt elll informcikat megjelenthetjk rlapok formjban a szmtgp kpernyjn, vagy jelents formjban paprra nyomtatva. Ne felejtsk el, hogy az adatokat fel kell dolgoznunk ahhoz, hogy rtelmes, jelentssel br informciv vltoztassuk azokat. A 4.3. bra az elz pldban szerepl adatokat mutatja be, miutn informciv alak tottuk ket egy gyfelnk kpernyjn. Jl szemllteti, hogyan kezelhetk gy az adatok, hogy rtelmesek legyenek brki szmra, aki megtekinti azokat.

Amikor SELECT utastsokat hasznlunk, a zradkok segtsgvel az adatokon vgznk mveleteket, de az utasts maga mr informcival tr vissza. Vilgos, ugye? Van mg egy krds, amelyre vlaszt kell tallnunk. Ha vgrehajtunk egy SELECT utastst, az rendszerint egy vagy tbb oszlopnyi informcival tr vissza. (A pontos szm persze attl is fgg, hogyan ptettk fel az utastst.) Ezeknek a soroknak az sszessgt eredmnyhal-

maznak nevezzk - ezt a fogalmat hasznljuk majd a knyv htralv rszben. Ez a nv jl rzkelteti, hogy amikor relcis adatbzist hasznlunk, mindig adatok halmazval dolgozunk. (Emlkezznk r, hogy a relcis modell rszben a halmazelmleten alapul.) Az eredmnyhalmazban knnyedn ttekinthetjk az informcikat, sok esetben mdost hatjuk is az adatokat. Minden attl fgg, hogy miknt szerkesztettk meg a SELECT utast sunkat

Csapjunk ht a lovak kz, s kezdjnk hozz a SELECT utastsok hasznlathoz!

A krelmek lefordtsa SQL-re


Amikor informcikrt folyamodunk az adatbzishoz, ezt ltalban krdsek vagy krdsknt is megfogalmazhat utastsok formjban tesszk. Pldul ilyen utastsokat fogalmazhatunk meg:

Mely vrosokban laknak a vsrlink?" Mutasd meg az alkalmazottak aktulis listjt s a telefonszmaikat! Milyen rkat knlunk jelenleg?" Add meg a tanri kar tagjainak a nevt s a dtumokat, amikor felvettk ket!
Miutn mr tudjuk, mit akarunk krdezni, a krelmeket szablyszer alakra fordthatjuk. Ezt az albbi minta szerint tehetjk meg: Select <elem> from the <forrs> rdemes azzal kezdennk, hogy a felvetett krdsben az olyan szavakat s kifejezseket, mint az "rd ki, Mutasd meg', Melyek azok..., Kik azok... a Select (kivlaszt) szra cserljk. Kvetkez lpsknt keressk meg a fneveket a krdsben, s dntsk el, hogy az adott fnv megfeleltethet-e a keresett elemnek vagy egy tblnak, amelyben az elem troldik. Ha egy elemrl van sz, akkor azt helyettestsk be az <elem> helyre, ha egy tbla nevrl, akkor pedig a <forrs> helyre. Ha az els pldakrdsnket lefor dtjuk, valami ilyesmit kapunk: Select city from the customers table (- ez az angol talaktott szveg) (Vlaszd ki a vrost a vsrlk tbljbl) (- ez - sznes zrjelben -, a magyar fordts) Miutn a mondatot szablyosabb formra fordtottuk, t kell alaktanunk egy teljesen ksz SELECT-utastss, hogy megfeleljen az SQL nyelvtani szablyainak, amint az a 4.4. brn lthat. Ehhez az els lps az, hogy letisztzzuk a lefordtott mondatot. Hzzuk ki azokat a szavakat, amelyek nem oszlopot vagy tblt megnevez fnevek, vagy(is) nem tartoznak az SQL nyelvi elemei kz. Ezutn a mondatunk gy fog kinzni: Select city from the customers table (-ez a letisztzs, a "Pldk"-rszben mr nem lesz sznes)

Hagyjuk el a kihzott szavakat, s mris megkaptuk a ksz SQL-utastst:

SELECT City FROM Customers

Ezt a hromlpses eljrst alkalmazhatjuk minden krelem esetben, amelyet egy adat bzishoz szeretnnk intzni. A knyv legnagyobb rszben mi is ezt a mdszert fogjuk alkalmazni. Mindenkit btortunk a hasznlatra, amg egy kis gyakorlatot nem szerez az utastsok felptsben. Ha mr rutinosan szerkesztnk SQL-utastsokat, ezeket a lpseket egy mveletben sem okoz majd gondot elvgezni. Amg a nyelv tanulsnak ennyire az elejn vagyunk, jobbra csak oszlopokkal s tblkkal dolgozunk. A 4.4. bra szintaxisdiagramja is ezt tkrzi (oszlop_neve a SELECT zradkban, illetve a tbla_neve a FROM zradkban). A kvetkez fejezetben megtanuljuk, hogyan pthetnk fel sszetettebb SELECT utastsokat tovbbi kulcsszavak bevonsval. szrevehettk, hogy az elz pldban a krelem nagyon egyszer volt. Knny volt lefor dtott utastss alaktani s behelyettesteni az oszlopneveket De mi a helyzet akkor, ha a krelem nem ilyen egyszer s knnyen lefordthat, hanem nehzsget okoz azonostani az oszlopokat, amelyekre majd a SELECT zradkban szksgnk lesz? A legegyszerbb lehetsgnk, hogy finomtjuk a krdst, s igyeksznk konkrtabb tenni azt. Pldul a Mutasd meg a vsrlinkhoz kapcsold informcikat!" krelmet gy pontosthatjuk, ha gy fogalmazunk, hogy rd ki minden vsrl nevt, vrost s telefonszmt!". Ha a kre lem finomtsa nem oldja meg a problmt, mg mindig van kt lehetsgnk. Az els, hogy a FROM zradkban megadott tblk kztt meghatrozzuk azokat, amelyek tartal mazzk azokat az oszlopokat, amelyek a neknk kell adatokat troljk, ami megknnythe ti a krelem lefordtst. A msik lehetsg, hogy kzelebbrl megvizsgljuk a krelmet, s megfigyeljk, hogy mely szavak vagy kifejezsek utalnak oszlopnevekre. A mdszerek kzl az alapjn kell vlasztanunk, hogy mi volt az eredeti krelem. Ha nehzsgeink tmadnak az utastsok megfogalmazsban, idzzk fel ezeket a mdszereket! Most viszont nzznk meg nhny pldt mindkt mdszerre, hogy lssuk, hogyan alkalmazhatk jellemznek mondhat helyzetekben! Az els mdszer bemutatsra prbljuk meg lefordtani az albbi krelmet:

Add meg minden alkalmazott nevt s cmt!"


Ez els rnzsre vilgos krsnek tnik. De ha jobban megfigyeljk, szrevesszk, hogy van egy kis problma: br tudjuk, hogy melyik tblra lesz szksgnk (Employees, vagyis Alkalmazottak), a krelem nem ad felvilgostst arrl, hogy mely oszlopokat kell megad nunk a SELECT zradkban. Igaz ugyan, hogy a "nv" s a cm szerepel a krelemben, ezek azonban nagyon ltalnos meghatrozsok. A problmt gy oldhatjuk meg, ha azonostjuk, hogy mely tblkra lesz szksgnk a lekrdezsben, mgpedig gy, hogy megvizsgljuk a krelmet, hogy milyen oszlopokra utalhat. Ezek utn hasznlhatjuk az oszlopok neveit a lefordtott utastsban. (Ha ez segt jobban elkpzelni a lekrdezsn ket, dnthetnk gy, hogy a fordtsban mg ltalnos oszlopneveket hasznlunk, a vgs SQL-utastsban azonban mr a vals oszlopneveket kell alkalmaznunk.) Esetnkben az Employees tbla oszlopait megvizsglva a 4.5. brn lthat felptssel tallkozunk, amelynek alapjn meghatrozhatjuk, hogy mit kell behelyettestnk a nv s cm szavak helyre.

Hogy teljesen lefedjk a names (nevek) s addresses (cmek) fogalmakat, a tblbl sszesen hat oszlopra lesz szksgnk. Az EmpFirstName (Alkalmazott keresztneve) s az EmpLastName (Alkalmazott vezetkneve) megfelel a names-nek, az EmpStreetAddress (cm), az EmpCity (vros), az EmpState (llam) s az EmpZipCode (irnytszm) pedig az addresses-nek a krelemben. Most fordtsuk le a teljes krelmet, amelyet a biztonsg kedvrt meg is ismtlnk (a lefordtott utastsban az oszlopneveket ltalnosan fogal mazzuk meg, mg az SQL-utastsban a tnyleges oszlopneveket hasznljuk):

Add meg minden alkalmazott nevt s cmt!"


Fordts - Select first name, last name, street address, city, state, and ZIP Code from the employees table (Vlaszd ki a vezetknevet, keresztnevet, utct, vrost, llamot s irnytszmot az alkalmazottak tbljbl.) Tisztzs - Select first name, last name, street address, city, state, and ZIP Code from the employees table SQL SELECT EmpFirstName, EmpLastName, EmpStreetAddress,

EmpCity, EmpState, EmpZipCode FROM Employees

Ebben a pldban jl megfigyelhet, hogyan hasznlhatunk tbb oszlopot egy SELECT-zradkban. Ezt a lehetsget a ksbbiekben rszletesebben is trgyaljuk. A kvetkez pldban a msodik mdszer alkalmazst szemlltetjk, azaz felkutatjuk a tblban a krelem ltal sugallt oszlopokat. Tegyk fel, hogy az albbi krelmet szeret nnk lefordtani: Milyen fajta rkat knlunk jelenleg? Els pillantsra bonyolultnak tnik meghatrozni a lefordtott utastst ebbl a krdsbl, hiszen nem jell ki szmunkra oszlopokat vagy brmilyen kivlasztand elemet, ezek hinyban pedig nem tudjuk megfogalmazni a lefordtott utastst. Mit tehetnk ebben az esetben? Vizsgljuk meg kzelebbrl szavanknt az egsz mondatot, s szrjk ki, hogy mely pontok utalhatnak bizonyos oszlopokra a Classes (rk) tblbl. Mieltt tovbb olvasnnk, sznjunk nhny pillanatot a krelem tanulmnyozsra. Tallunk ilyen szt? Esetnkben "fajta" ("kind") sz utalhat oszlopnvre a Classes tblban. Mirt? Mert az osztlyok egy fajtja rtelmezhet osztlyok egy csoportjaknt Ha van egy category (csoport) oszlopunk a Classes tblban, akkor mr tudjuk, hogy melyik oszlopra van szksgnk, hogy teljess tegyk a lefordtott mondatot s ezltal a SELECT utastst. Tegyk fel, hogy tnyleg van category oszlop a Classes tblban. Most mr elvgezhetjk a szoksos hrom lpst (helyenknt ezentl teht sznekkel is lesz megklnbztetve pr lps): Milyen fajta rkat knlunk jelenleg?" Fordts - Select category from the Classes table (Vlaszd ki a csoportot az rk tbljbl.) Tisztzs - Select category from the classes table SQL SELECT Category

FROM Classes
A pldbl lthatjuk, hogy a mdszer alkalmazsa sorn szinonimkat hasznltunk bizonyos szavak vagy kifejezsek cserjhez. Ha meghatroztunk egy szt vagy kifejezst, amely oszlopnvre utalhat, prbljuk meg egy szinonimjra cserlni. Ez a szinonima valsznleg meg fog hatrozni egy oszlopot, amely megtallhat az adatbzisban. Amennyiben az els esznkbe jut rokon rtelm sz nem felel meg, prblkozzunk egy msikkal. Ismteljk ezt az eljrst addig, amg meg nem talljuk azt a kifejezst, amelynek megfelel oszlop ltezik az adatbzisban, vagy amg meg nem bizonyosodunk rla, hogy sem az eredeti sz, sem annak szinonimi nem tallhatk meg ott oszlopnvknt Hacsak nem jelezzk mskpp, a pldk SQL-utastsaiban minden oszlop- s tblanv a B fggelkben tallhat mintaadatbzisokra vonatkozik. Ez a szably az sszes pldra rvnyes a knyv htralev rszben.

Szlestsk a ltkrnket!
A SELECT utastsokban tbb oszlopot is ugyanolyan knnyen lekrhetnk, mint egyet, csak soroljuk fel az oszlopok neveit a SELECT zradkban egymstl vesszvel elvlasztva. A 4.6. bra szintaxisdiagramja bemutatja, hogyan adhatunk meg egynl tbb oszlopot, ezt egy balrl jobbra mutat nyllal szemlltetve az oszlop_neve alatt. A vessz a vonal kzepn azt jelli, hogy egy vesszt kell beszrnunk, mieltt a kvetkez oszlopnevet begpeljk.

Azzal, hogy tbb oszlopot is megadhatunk egy SELECT utastsban, lehetsgnk nylik megfogalmazni az albbihoz hasonl krelmeket:

Mutasd meg az alkalmazottak aktulis listjt s a telefonszmaikat!"


Fordts - Select the last name, first name, and phone number of all our employees from the employees table (Vlaszd ki minden alkalmazott keresztnevt, ve zetknevt s telefonszmt az alkalmazottak tbljbl.) Tisztzs - Select last name, first name, phone number of all our employees from the employees table SQL SELECT EmpLastName, EmpFirstName, EmpPhoneNumber

FROM Employees
Milyen nev s r termkeket knlunk, s milyen termkcsoportokba soroltuk az egyes elemeket?"
Fordts - Select the name, price, and category of every product from the products table (Vlaszd ki minden termk nevt, rt s termkcsoportjt a termkek tbljbl.) Tisztzs - Select the name, price, and category of every products from products table SQL SELECT ProductName, RetailPrice, Category

FROM Products
Ha tbb oszlopot adunk meg a SELECT utasts szmra, tbb informcit tekinthetnk t egyszerre. Az oszlopok sorrendje nem kttt; tetszleges sorrendben megadhatjuk ket, ami lehetsget nyjt arra, hogy ugyanazokat az informcikat tbbflekppen jelentsk meg. Pldul tegyk fel, hogy a 4.7. brn lthat tblval dolgozunk, s az albbi krelmet fogalmazzuk meg az adatbzis fel:

Mutass egy listt a tantrgyakrl s a tantrgycsoportokrl, amelyek al tartoznak, valamint a kdjaikat, amelyeket a katalgusunkban hasznlunk! A nv legyen ell, azt kvesse a tantrgycsoport, vgl a kd!"

Ezt a krelmet is le tudjuk fordtani a megfelel SELECT utastsra, pedig a krelmet megfo galmaz szemly az oszlopokat egy bizonyos sorrendben szeretn megkapni: egyszeren soroljuk fel az oszlopok neveit a megfelel sorrendben, amikor meghatrozzuk a lefordtott utastst. A mondatok SELECT utastss alaktsa az albbiak szerint alakul: Fordts - Select the subject name, category ID, and subject code from the subjects table (Vlaszd ki a tantrgy nevt, a tantrgycsoport azonostjt s a tantrgy kdjt a tantrgyak tbljbl.) Tisztzs - Select the subject name, category ID, and subject code from the subjects table SQL SELECT SubjectName, CategoryID, SubjectCode

FROM Subjects

Rvidts hasznlata az sszes oszlop lekrshez


A SELECT zradkban korltlan mennyisg oszlopot felsorolhatunk - akr az sszeset is a forrstblbl. A kvetkez plda egy olyan SELECT utastst mutat be, amely a 4.7. b rn szerepl Subject tbla sszes oszlopt felsorolja: SQL

SELECT SubjectID, CategorylD, SubjectCode, SubjectName, SubjectDescription FROM Subjects

Ha egy olyan tblnak szeretnnk az sszes oszlopt lekrdezni, amelyik sok oszlopot tar talmaz, akkor nagyon sokat kellene gpelnnk. Szerencsre az SQL-szabvny rendelkez snkre bocstja a csillag karaktert, amelyet az utastsainkban rvidtsknt hasznlhatunk. A 4.8. bra szintaxisdiagramja azt brzolja, hogy a csillagot helyettest karakterknt hasz nlhatjuk az oszlopok felsorolsa helyett a SELECT zradkban.

A csillagot kzvetlenl a SELECT utn kell megadnunk, hogy az sszes oszlopot megkapjuk a FROM zradkban szerepl tblbl. Pldul az elz SELECT utasts az albbiak szerint alakul a rvidts hasznlatval: SQL

SELECT * FROM Subjects

gy minden bizonnyal kevesebbet kell gpelnnk! Viszont egy j problma is felmerl, ha ilyen SELECT utastsokat runk: a csillag azokat az oszlopokat jelli, amelyek jelenleg megtallhatk a forrstblban, teht ha oszlopokat vesznk fel vagy trlnk, az befoly solja a SELECT utasts ltal visszaadott eredmnyhalmazt (br klns mdon az SQLszabvny azt lltja, hogy ennek nem szabad hatssal lennie az eredmnyhalmazra). Ez persze csak akkor lnyeges, ha az eredmnyhalmazban kvetkezetesen ugyanazokat az oszlopokat kell visszakapnunk. Az adatbzis-kezelnk nem fog figyelmeztetni arra, hogy egy oszlopot trltnk a forrstblbl, ha a SELECT zradkban csillagot alkalmaz tunk, de figyelmeztetst fogunk kapni, ha nem tallhat egy oszlop, amelyet kimondottan felsoroltunk. A mi esetnkben ugyan ez nem igazn jelent gondot, de fontoss vlhat, ha mlyebben elmerlnk az SQL-programozs vilgban, ezrt alapszablyknt jegyezzk meg: csak akkor hasznljunk csillagot, ha gyors s piszkos lekrdezst szeretnnk az adatbzishoz intzni, hogy lthassuk az sszes informcit egy adott tblban. Minden ms esetben soroljuk fel az oszlopokat, amelyekre szksgnk van a lekrdezsben. Ennek eredmnykppen pontosan azokat az informcikat fogjuk megkapni, amelyekre szksgnk van. Az eddigi pldk egyszer krelmeken alapultak, amelyek egyetlen tblbl ignyeltek csak oszlopokat. A harmadik fejezetben megtanuljuk, hogyan fogalmazhatunk meg ssze tett krelmeket, amelyekhez akr tbb tbla oszlopaira is szksg lehet.

A sorismtls kikszblse
Amikor SELECT utastsokkal dolgozunk, elkerlhetetlenl akadhatnak olyan eredmny halmazaink, amelyekben bizonyos sorok tbbszr szerepelnek. Ilyenkor nem kell ktsg be esnnk: hasznljuk a DISTINCT kulcsszt a SELECT utastsban, s az eredmnyhal mazt knnyedn megtisztthatjuk a tbb pldnyban szerepl soroktl. A DISTINCT kulcssz szintaxisdiagramjt a 4.9. brn lthatjuk.

Amint a diagramon is lthat, a DISTINCT elhagyhat kulcssz, amely az oszlopok listjt elzi meg a SELECT zradkban, s arra kri az adatbzis-kezelt, hogy a visszaadott oszlopokat egy egysgknt, sorrl sorra rtkelje ki, s dobjon el minden olyan sort, amely mr megtallhat az eredmnyben. Az eredmnyhalmaz gy mr csak teljesen egyedi sorokat fog tartalmazni. A kvetkez plda szemllteti, hogy milyen klnbsget jelent a DISTINCT kulcssz egyes esetekben. Tegyk fel, hogy az albbi krelemmel fordulunk az adatbzishoz:

Mely vrosok kpviseltetik magukat a tekebajnoksgunkon?"


Nem tnik bonyolult krdsnek, gyhogy lssuk az talaktst: Fordts - Select city from the bowlers table (Vlaszd ki a vrost a tekejtkosok tbljbl.) Tisztzs - Select city from the bowlers table SQL SELECT City

FROM Bowlers
Ezzel a SELECT utastssal az a gond, hogy minden vros minden elfordulst megjele nti a Bowlers (Tekejtkosok) tblbl. Pldul ha 20 ember rkezett Bellevue vrosbl, 7 ember Kent-bl s 14 Seattle-bl, az eredmnyhalmaz 20 pldnyban fogja tartalmazni Bellevue-t, 7 pldnyban Kent-et s 14 pldnyban Seattle-t. Ezek a tbbszr szerepl in formcik szksgtelenek, mert nyilvn csak egyszer szeretnnk ltni minden vros nevt, ami szerepel a Bowlers tblban. Ezt a problmt gy oldhatjuk meg, ha a DISTINCT kulcsszt hasznljuk a SELECT utastsban. Fordtsuk le jra a krelmet, ezttal a DISTINCT hasznlatval! Figyeljk meg, hogy a distinct (eltr) sz a fordtsi s a tisztzsi lpsben is szerepel:

Mely vrosok kpviseltetik magukat a tekebajnoksgunkon?"


Fordts - Select the distinct city values from the bowlers table (Vlaszd ki az eltr vrosrtkeket a tekejtkosok tbljbl.) Tisztzs - Select the distinct city values from the bowlers table

SQL

SELECT DISTINCT City FROM Bowlers

Most mr pontosan azt az eredmnyt kapjuk, amit kerestnk: egy pldnyban minden vros nevt, ami elfordul a Bowlers tblban. A DISTINCT kulcssz tbb oszlopon is hasonlan hasznlhat. Mdostsuk az elz pldban szerepl lekrdezst gy, hogy a city" (vros) s a state (llam) oszlopokat is lekrjk a Bowlers tblbl. Az j SELECT utastsunk gy fog festeni:

SELECT DISTINCT City, State FROM Bowlers


Ez a SELECT utasts egy olyan eredmnyhalmazzal tr vissza, amely csak egyedi sorokat tartalmaz, s hatrozottan megklnbzteti az ugyanolyan nev vrosokat, pldul kln bznek tekinti a Portland, ME,, a Portland, OR,, a Hollywood, CA, s a Hollywood, FL, sorokat. (A vrosnv utni kt bets rvidts klnbz amerikai llamokra utal, amelyeket a tbla state oszlopban trolunk.) rdemes megjegyeznnk, hogy a legtbb adatbzis-kezel rendszer a kimenetet aszerint rendezi, hogy milyen sorrendben adtuk meg az oszlopokat a lekrdezsben. A mi esetnkben az albbi lesz az rtkek sorrendje: Hollywood, CA,, Hollywood, FL,, Portland, ME, s Portland, OR, (jllehet az SQLszabvny nem kveteli meg, hogy az eredmny ilyen sorrendben legyen). Ha egy kvnt sorrendet szeretnnk biztostani, olvassunk tovbb, mert a kvetkez rszben az erre szolgl ORDER BY-zradkrl fogunk tanulni. A DISTINCT kulcssz nagyon hasznos eszkz, ha megfelelen alkalmazzuk, de csak akkor hasznljuk, ha tnyleg egyedi sorokat szeretnnk kapni az eredmnyhalmazban.

A grafikus felhasznli fellettel rendelkez adatbzis-kezelk ltal ban sorokbl s oszlopokbl ll rcsknt jelentik meg a lekrdezsek eredmnyhalmazt. Ha j rtket gpelnk egy oszlopba vagy sorba, az adatbzis-kezel automatikusan frissti a tblban trolt rtket. (Tulajdonkppen egy UPDATE lekrdezst hajt vgre a sznfalak mgtt errl bvebben olvashatunk a 15. fejezetben.) Ugyanakkor az sszes adatbzis-kezelben, amelyet a knyv szerzi tanulmnyoztak, az eredmnyhalmazban szerepl sorok nem voltak frissthetk, ha a DISTlNCT kulcssz is szerepelt a lekrdezsben. Ahhoz, hogy frisstsnk egy oszlopot egy sorban, az adatb zis-kezelnek tudnia kell egyedileg azonostania azt a sort s oszlopot, amelyet meg akarunk vltoztatni. A DISTlNCT hasznlatval azonban azok az rtkek, amelyeket az eredmny egyes soraiban ltunk, akr tucatnyi egyez sor kirtkelsbl is szr mazhatnak. Ha megprblunk frissteni egy oszlopot, az adatbzis-kezel nem fogja tudni, hogy melyik sort kell frisstenie, s azt sem fogja rteni, ha mi gy gondoltuk, hogy az sszes olyan sort mdostani szeretnnk, ami az adott rtket tartalmazza.

Az informcik rendezse
A fejezet elejn azt olvashattuk, hogy a SELECT mvelet hrom kisebb mveletre tagolhat: a SELECT utastsra, a SELECT kifejezsre s a SELECT lekrdezsre. Arrl is olvashattunk, hogy ezeket a mveleteket sokflekppen kombinlhatjuk annak rdekben, hogy vlaszt kaphassunk a bonyolultabb krdsekre. Ahhoz, hogy egy eredmnyhalmaz sorait rendezett formban kapjuk meg, szintn ezeknek a mveleteknek a kombincijra van szksg. Alapesetben a SELECT utasts ltal szolgltatott eredmnyhalmaz sorai nem rendezettek. A sorrendjk attl fggen alakul, hogy az adatok fizikailag milyen sorrendben szerepelnek a tblban. (Ez dinamikusan vltozhat az adatbzis-kezel dntse alapjn, attl fggen, hogy miknt tudja a leghatkonyabban kiszolglni a krsnket.) Az egyetlen mdja, hogy az eredmnyhalmazt rendezetten kapjuk meg, ha a SELECT utastsunkat egy SELECT lekr dezsbe gyazzuk, amint az a 4.10. brn is megfigyelhet. A SELECT lekrdezs tulajdon kppen egy ORDER BY zradkkal elltott SELECT utasts. Ennek a zradknak a segts gvel meghatrozhatjuk az eredmnyhalmaz sorainak sorrendjt. A ksbbi fejezetekben ltni fogjuk, hogy a SELECT utastst msik SELECT utastsba vagy SELECT kifejezsbe is begyazhatjuk, s gy sszetett krelmeket fogalmazhatunk meg. Ezzel ellenttben a SELECT lekrdezs semmilyen formban nem gyazhat be.

A knyvben az SQL-szabvnyban szerepl, illetve az adatbzis-keze lk ltal szles krben hasznlt fogalmakat hasznljuk. A 2003-as SQL-szabvny azonban az ORDER BY zradkot egy kurzor (sormutat) rszeknt hat rozza meg. A kurzor olyan objektum, amelyet egy alkalmazson bell hatrozunk meg egy tmb rszeknt (a tmb rtkek listja, amely egy logikai tblt, pldul egy allekrdezst alkot - az allekrdezsekrl a 11. fejezetben olvashatunk), vagy egy skalris allekrdezs rszeknt (amely egy olyan allekrdezs, amely egyetlen rtkkel tr vissza). A kurzorok s tmbk rszletes trgyalsa tlmutat ennek a knyvnek a keretein. Mivel az SQL-nek szinte minden megvalstsa lehetv teszi az ORDER BY zradk hasznla tt a SELECT utastsok vgn, amely ebben a formban nzettblaknt is menthet, a knyv szerzi bevezettk a SELECT lekrdezs fogalmt ennek az utaststpusnak a le rsra. Ez lehetv teszi a szmunkra, hogy knnyebben trgyalhassuk a lekrdezsek eredmnyekppen ltrejv, online vagy jelents formjban megtekinthet kimenetek rendezsnek lehetsgt. Habr tudatban vagyunk annak, hogy a 2007/2008-as szab vnytervezet megengedi az ORDER BY tbb ms helyen val hasznlatt is, ebben a knyvben a SELECT lekrdezs fogalmra tmaszkodva jrjuk krl ezt a tmt.

Az ORDER BY segtsgvel egy adott SELECT-utasts eredmnyhalmazt annak egy vagy tbb oszlopa szerint, nvekv s cskken sorrendben egyarnt rendezhetjk. Csak azokat az oszlopokat hasznlhatjuk az ORDER BY zradkban, amelyeket a SELECT zradkban is felsoroltunk. (Errl a megszortsrl az SQL-szabvny is rendelkezik, ennek ellenre nhny gyrt lehetv teszi, hogy ezt teljes mrtkben figyelmen kvl hagyjuk. A knyv pldiban azonban betartottuk a szabvny vonatkoz korltozsait.) Az oszlopokat egymstl vesszvel elvlasztva kell megadnunk. A SELECT lekrdezs akkor tr vissza az eredmny halmazzal, ha a rendezst befejezte.

Az ORDER BY zradk nem vltoztatja meg a tblban lv sorok fizikai sorrendjt. Ennek megvalstshoz tanulmnyozzuk t az adatbzis-kezel szoftvernk dokumentcijt.

Mieltt tovbblpnnk: jelsorrend


Mieltt kzelebbrl szemgyre vennnk nhny konkrt pldt a SELECT lekrdezsek hasznlatra, nhny szt kell ejtennk a jelsorrendrl. Az ORDER BY zradk attl fg gen llaptja meg a rendezs sorn az rtkek sorrendjt, hogy az adatbzis-kezel szoft ver milyen jelsorrendet hasznl. A jelsorrend szabja meg az opercis rendszer ltal meg hatrozott nyelvi karakterkszlet karaktereinek elsbbsgi sorrendjt, pldul eldnti, hogy a kisbetk elnyt lvezzenek-e a nagybetkkel szemben, vagy hogy a kis- s nagy betket egyltaln meg kell-e klnbztetni. Az alaprtelmezett jelsorrend meghatroz shoz tanulmnyozzuk t az adatbzis-kezel rendszernk dokumentcijt, esetleg kr dezzk meg az adatbzisunk rendszergazdjt A jelsorrendekrl bvebben is beszlnk a 6. fejezetben.

Rendezzk a sorainkat!
Az ORDER BY zradk segtsgvel sokkal kifejezbb mdon jelenthetjk meg a lekr dezett informcikat. Ez egyarnt igaz az egyszer s bonyolult lekrdezsekre. Mostantl gy rdemes megfogalmaznunk a krdseinket, hogy a rendezsi ignyeinket is kifejezzk velk. Pldul egy olyan krds, mint a Milyen fajta rkat knlunk jelenleg?' gy lenne tfogalmazhat, hogy Kszts listt az ltalunk knlt rk tpusairl, s jelentsd meg ket

bcsorrendben!"
Mieltt munkhoz ltnnk a SELECT lekrdezssel, kicsit igaztanunk kell a lefordtott utastsainkon: a mondat vge egy j rsszel bvl, hogy kifejezhessk a sorrendre vonatkoz elvrsainkat. Hasznljuk az albbi formt az utastsok lefordtshoz: Select <elem> from the <forrs> and order by <oszlop(ok)> Most, hogy a krelmeket olyan rszekkel bvtettk, mint a rendezd az eredmnyt vro sok szerint vagy jelentsd meg vszmok szerinti sorrendben, esetleg rd ki ket veze tk-, majd keresztnv szerint, vizsgljuk meg a krdsnket alaposabban, s dntsk el, milyen oszlopokra lesz szksgnk a rendezshez. Ez egyszer feladat, mivel a krelmek-

ben ltalban a fentiekhez hasonl megfogalmazsokat hasznlunk, s a szksges oszlo pok ltalban magtl rtetdek. Ha kivlasztottuk az oszlopot vagy oszlopokat, egysze ren helyettestsk be azokat az <oszlop(ok)> helyre a lefordtott utastsban. Nzzk meg, hogyan valsul meg ez a gyakorlatban egy egyszer krelem esetben:

Kszts listt az ltalunk knlt rk tpusairl, s jelentsd meg ket bcsorrendben!


Fordts - Select category from the classes table and order by category (Vlaszd ki a tantrgycsoportokat az rk tbljbl, s rendezd azokat tan trgycsoport szerint.) Tisztzs - Select category from the classes table and order by category SQL SELECT Category

FROM Classes ORDER BY Category


Ebben a pldban biztosak lehetnk benne, hogy a rendezs a Category oszlop szerint trtnik, mivel ezt az egy oszlopot adtuk meg a lekrdezsben. Azt is nyugodtan felttelez hetjk, hogy a rendezs nvekv sorrendben fog trtnni, mivel a lekrdezsben nem krtk ennek az ellenkezjt. Az SQL-szabvnnyal sszhangban a nvekv sorrendben trtn rendezs lesz az alaprtelmezett, amennyiben nem adjuk meg a rendezs sorrend jt. Ha teljesen biztosak szeretnnk lenni a dolgunkban, szrjuk be az ASC (ascending, nvekv) kulcsszt a Category nv utn az ORDER BY zradkban. Az albbi krelemben az oszlop, ami szerint rendezni kell, mg egyrtelmbben meghat rozott:

Sorold fel a beszlltk neveit, irnytszm szerinti sorrendben!'


Fordts - Select vendor name and ZIP Code from the vendors table and order by ZIP Code (Vlaszd ki a beszlltk nevt s irnytszmt a beszlltk tbljbl, s rendezd irnytszm szerint.) Tisztzs - Select vendor name and ZIP Code from the vendors table and order by ZIP Code SQL SELECT VendName, VendZipCode

FROM Vendors ORDER BY VendZipCode


A legtbben egyrtelmen a tudtunkra adjk, ha az informcikat cskken sorrendbe rendezve szeretnk ltni. Ha ez a helyzet, s az eredmnyhalmazt fordtott sorrendben kell megjelentennk, szrjuk be a DESC (descending, cskken) kulcsszt a megfelel oszlop utn az ORDER BY zradkban. Az albbi plda bemutatja, hogyan kell mdosta nunk az elz pldban ltott SELECT utastst ahhoz, hogy az informcik irnytszm szerint cskken sorrendben jelenjenek meg:

SQL

SELECT VendName, VendZipCode FROM Vendors ORDER BY VendZipCode DESC

A kvetkez plda egy bonyolultabb krelmet mutat be, amelyhez tbb oszlop szerinti ren dezsre lesz szksg. Az egyetlen klnbsg az elz kt pldhoz kpest, hogy ez esetben tbb oszlopot sorolunk fel az ORDER BY zradkban (gyeljnk r, hogy az oszlopokat vesszvel vlasszuk el egymstl, ahogy azt a 4.10. bra szintaxisdiagramjn lthattuk):

Jelentsd meg az alkalmazottak nevt, telefonszmt s azonostjt, vezetk-, majd keresztnv szerint rendezve!'
Fordts - Select last name, first name, phone number, and employee ID from the employees table and order by last name and first name (Vlaszd ki a vezetkneveket, keresztneveket, telefonszmokat s alkalma zott-azonostkat az alkalmazottak tbljbl, s rendezd vezetknv, majd keresztnv szerint.) Tisztzs - Select last name, first name, phone number, and employee ID from the employees table and order by last name and first name SQL

SELECT EmpLastName, EmpFirstName, EmpPhoneNumber, EmployeelD FROM Employees ORDER BY EmpLastName, EmpFirstName

Az ORDER BY zradk egy rdekes lehetsge, hogy klnbz rendezsi sorrendet adhatunk meg az egyes oszlopok szmra. Az elz pldt alapul vve krhetjk a vezetkneveket az bc szerint cskken, a keresztneveket pedig nvekv sorrendben. Az ehhez szksges mdostsok utn a SELECT utasts gy fest: SQL

SELECT EmpLastName, EmpFirstName, EmpPhoneNumber, EmployeelD FROM Employees ORDER BY EmpLastName DESC, EmpFirstName ASC

Br az ASC kulcsszt nem muszj kirnunk, az utasts sokkal egyrtelmbb lesz, ha megtesszk. Ez a plda egy rdekes krdst is felvet: van-e jelentsge az oszlopsorrendnek az ORDER BY zradkban? A vlasz: Igen! Az oszlopok sorrendje azrt fontos, mert az adatbzis-kezel az oszlopokat balrl jobbra haladva rtkeli ki, radsul a sorrend je lentsge a megadott oszlopok szmval egyenes arnyban n. Mindig olyan sorrendben soroljuk fel az oszlopokat, amilyen sorrendben az eredmnyt is rendezni szeretnnk.

A Microsoft ltal gyrtott adatbzis-kezelk (Microsoft Office Access s Microsoft SQL Server) tartalmaznak egy rdekes bvtst, amelynek a segtsgvel a sorok egy rszhalmazt is lekrdezhetjk az ORDER BY szerinti rendezs alapjn, ha a SELECT zradkban megadjuk a TOP kulcsszt. Az albbi lekrdezssel pldul megtallhatjuk az t legdrgbb termket a Sales Orders adatbzisban:

SELECT TOP 5 ProductName, RetailPrice FROM Products ORDER BY RetailPrice DESC


Az adatbzis-kezel r szerint cskken sorrendbe rendezi a Products tbla sorait, majd visszatr az els t sorral. Mindkt adatbzisrendszer lehetsget ad arra is, hogy a krt sorok szmt az sszes sor szzalkban adjuk meg. Az albbi lekrdezssel pldul megkaphatjuk az r alapjn a fels 10 szzalkba es termkeket:

SELECT TOP 10 PERCENT ProductName, RetailPrice FROM Products ORDER BY RetailPrice DESC
Ha az ORDER BY-t egy nzettblban szeretnnk megadni, az SQL Servernek minden kppen meg kell adnunk a TOP kulcsszt is, teht ha az sszes sorra szksgnk van, akkor TOP 100 PERCENT-et kell rnunk. Ezrt tapasztalhatjuk azt, hogy az SQL Server minden olyan pldanzettbljban, amely ORDER BY zradkot tartalmaz, a TOP 100 PERCENT kulcsszavak is megtallhatk. A Microsoft Access nem tartalmazza ezt a megktst.

Ments
Mentsk a SELECT utastsainkat - minden fontos adatbzis-kezel lehetsget biztost erre. Az utastsok mentsvel elkerlhetjk, hogy jra s jra meg kelljen rnunk ket, valahnyszor ugyanazt a krelmet szeretnnk intzni az adatbzishoz. Ha a ments sorn beszdes nevet vlasztunk, az segt majd emlkeznnk, hogy milyen informcikat krdez le szmunkra az utasts. Ha az adatbzis-kezelnk lehetsget ad r, adjunk tmr lerst az utasts cljrl. Ennek hasznossgt majd akkor rtjk meg igazn, ha bizonyos SELECT utastsokkal mr nem tallkoztunk egy ideje, s vissza kell emlkeznnk r, hogy mirt hoztuk ltre ket annak idejn. A mentett SELECT utastsok nhny adatbzisszoftverben lekrdezsknt, msokban pedig nzettblaknt, fggvnyknt vagy trolt eljrsknt jelennek meg. A megvalsts mdjtl fggetlenl minden adatbzis-kezel lehetsget ad a mentett utastsok ksbbi vgrehajtsra s eredmnyhalmazuk hasznlatra.

A tovbbiakban a lekrdezs sz a mentett SELECT utastsokra, a vgrehajts kifejezs pedig a velk val mveletekre vonatkozik majd.

A mentett lekrdezseket ltalban ktflekppen hajthatjuk vgre: egy interaktv eszkz (pldul egy eszkztrgomb vagy lekrdezsrcs) segtsgvel, vagy egy kdblokkbl. Az els mdszert gyakran fogjuk alkalmazni, a msodikkal azonban addig nem is kell trdnnk, amg el nem kezdjk hasznlni az adatbzis-kezelnk programozsi nyelvt. Mi arra vllalkoztunk, hogy megtantsuk az SQL-utastsok megfogalmazst s haszn latt, viszont az Olvas feladata elsajttani a lekrdezsek ltrehozsnak, mentsnek s vgrehajtsnak mdjt a sajt adatbzis-kezel szoftverben.

Pldk
Miutn megismertk a SELECT utasts s a SELECT lekrdezs alapvet jellemzit, nz znk nhny pldt, hogyan alkalmazhatk ezek a mveletek klnbz helyzetekben! Az albbi pldk mindegyike a mintaadatbzisokra tmaszkodik, s a SELECT utastsok, a SELECT lekrdezsek, valamint a lefordtott utastsok szmra az oszlopok meghatro zst segt kt mdszer hasznlatt mutatja be. Ezenkvl ksztettnk az eredmnyhalmazokbl is mintkat; ezek kzvetlenl az SQL-uta stsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ketts clt szolgl: azonostja az eredmnyhalmazt, s a pldban szerepl SQL-utastshoz rendelt nvknt is szolgl. Ha meglepdnnk azon, hogy minden SQL-utastsnak nevet adtunk, j ha tudjuk, hogy azrt tettnk gy, mert mentettk ket. Valjban a pldkban szerepl sszes SQL-utas tst elneveztk s mentettk, amelyek itt vagy a knyv tovbbi rszeiben szerepelnek Minden lekrdezst a megfelel mintaadatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz lekrdezsek neve ,,CH04-gyel kezddik. A pldkat a knyv elejn tallhat bevezets tmutatst kvetve betlthetjk s kiprblhatjuk, ezltal lehetsgnk nylik r, hogy megfigyeljk az utastsokat mkds kzben, mieltt megprblnnk sajt magunk megrni azokat. Emlkeztetl: a pldkban szerepl oszlop- s tblanevek a B fggelkben tallhat mintaadatbzisokbl szrmaznak.

Sales Orders adatbzis


Mutasd meg az sszes beszllt nevt!
Fordts - Select the vendor name from the vendors table (Vlaszd ki a beszlltk nevt a beszlltk tbljbl.) Tisztzs - Select the vendor name from the vendors table SQL - SELECT VendName

FROM Vendors

Milyen nev s r termkeket knlunk?'


- Select product name, retail price from the products table (Vlaszd ki a termkek nevt s fogyaszti rt a termkek tbljbl.) Tisztzs - Select product name, retail price from the products table SQL SELECT ProductName, RetailPrice Fordts

FROM Products

Mely llamokban lnek vsrlink?


Fordts - Select the distinct state values from the customers table (Vlaszd ki az eltr llam rtkeket a vsrlk tbljbl.) Tisztzs - Select the distinct state values from the customers table SQL SELECT DISTINCT CustState

FROM Customers

Entertainment Agency adatbzis


Sorold fel az sszes eladt s a vrosukat, az eredmnyt vrosok, majd nevek szerint nvekv bcsorrendbe rendezve!"
Fordts - Select city and stage name from the entertainers table and order by city and stage name (Vlaszd ki a vrosokat s a mvszneveket az eladk tbljbl, s ren dezd vros, majd mvsznv alapjn.) Tisztzs - Select city and stage name from the entertainers table and order by city and stage name SQL SELECT EntCity, EntStageName

FROM Entertainers ORDER BY EntCity ASC, EntStageName ASC

Add meg a rendezvnydtumok egyedi rtkeket tartalmaz listjt! Az, hogy egy-egy dtumhoz hny rendezvny tartozik, nem rdekes!"
Fordts - Select the distinct start date values from the engagements table (Vlaszd ki az eltr kezddtumrtkeket a rendezvnyek tbljbl.) Tisztzs - Select the distinct start date values from engagements table

SQL

SELECT DISTINCT StartDate FROM Engagements

School Scheduling adatbzis


Mutass meg minden informcit az rkrl!"
Fordts - Select all columns from the classes table (Vlaszd ki az sszes oszlopot az rk tbljbl.) Tisztzs - Select all columns * from classes table SQL SELECT *

FROM Classes

Add meg a kampusz pleteinek listjt, valamint minden plethez, hogy hny emeletes! Rendezd a listt pletek szerint, nvekv sorrendben!"
Fordts - Select building name and number of floors from the buildings table, ordered by building name (Vlaszd ki az pletek nevt s a szintek szmt az pletek tbljbl, az plet neve szerint rendezve.) Tisztzs - Select building name and number of floors from the buildings table, ordered by building name SQL SELECT BuildingName, NumberOfFloors

FROM Buildings ORDER BY BuildingName ASC

Bowling League adatbzis ,,Milyen helyszneken rendeznk tornkat?''


Fordts - Select the distinct tourney location values from the tournaments table (Vlaszd ki a klnbz tornahelyszn-rtkeket a tornk tbljbl.) Tisztzs - Select the distinct tourney location values from the tournaments table SELECT DISTINCT TourneyLocation SQL

FROM Tournaments

,,Sorold fel az sszes torna dtumt s helysznt! A dtumok cskken sorrendben legyenek, a helysznek pedig bcsorrendben!"
Fordts - Select tourney date and location from the tournaments table and order by tourney date in descending order and location in ascending order (Vlaszd ki a tornk dtumt s helysznt a tornk tbljbl, s rendezd dtum szerint cskken sorrendben, majd helyszn szerint nvekv sor rendben.) Tisztzs - Select tourney date and location from tournaments table and order by tourney date in descending order by location in ascending order SQL SELECT TourneyDate, TourneyLocation

FROM Tournaments ORDER BY TourneyDate DESC, TourneyLocation ASC

Recipes adatbzis
,,Milyen tpus receptjeink vannak, s melyek az egyes tpusokhoz tartoz receptek nevei? Rendezd az informcikat tpus s receptnv szerint!
Fordts - Select recipe class ID and recipe title from the recipes table and order by recipe class ID and recipe title (Vlaszd ki a receptosztly-azonostkat s receptek nevt a receptek tbl jbl, receptosztly-azonost s receptnv szerint rendezve.) Tisztzs - Select recipe class ID and recipe title from the recipes table and order by recipeclass ID and recipe title SQL SELECT RecipeClassID, RecipeTitle

FROM Recipes ORDER BY RecipeClassID ASC, RecipeTitle ASC

Sorold fel az eltr receptosztly-azonostkat a receptek tbljbl!"


Fordts - Select the distinct recipe class ID values from the recipes table (Vlaszd ki az eltr receptosztly-azonost rtkeket a receptek tbljbl.) Tisztzs - Select the distinct recipe class ID values from the recipes table SQL SELECT DISTINCT RecipeClassID

FROM Recipes

sszefoglals
Ebben a fejezetben megismerkedtnk a SELECT mvelettel, s megtanultuk, hogy ez az egyik az SQL ngy alapvet adatkezel mvelete kzl. (A msik hrom mvelet az UPDATE, az INSERT s a DELETE, amelyekkel az 5. fejezetben foglalkozunk majd.) Megtanultuk, hogyan bonthat fel a SELECT mvelet hrom kisebb mveletre: a SELECT utastsra, a SELECT kifejezsre s a SELECT lekrdezsre. Ez utn a SELECT utasts rszleteit trgyaltuk, s megismerkedtnk az utastst felpt zradkokkal. Megtanultuk, hogy a SELECT s a FROM zradk alapvet, s mindig meg kell adnunk ket, ha informcikrt fordulunk az adatbzishoz, valamint azt is, hogy a tovbbi zradkok - a WHERE, a GROUP BY s a HAVING - akr el is hagyhatk, m a segtsgkkel szrhetv vlnak a SELECT ltal szolgltatott informcik. Ezt kveten rviden kitrtnk az adat s az informci klnbzsgre, s megtanultuk, hogy az adatbzis soraiban trolt rtkek adatok, s hogy az informci olyan adat, amelyet feldolgoztunk annak rdekben, hogy jelentst hordozzon valaki szmra. Megtudtuk, hogy a SELECT utasts ltal sorokknt visszaadott informcikat eredmnyhalmaznak nevezzk. Ezt kveten arrl szltunk, hogy miknt krhetnk le informcikat egy adatbzisbl. Elszr megtanultuk a SELECT utasts alapvet formjt, majd elsajttottuk a SELECT utasts helyes felptst egy hromlpses eljrssal, amellyel a htkznapi nyelven megfogalmazott krdsnket nyelvtanilag helyes SQL-utastss alakthatjuk Megtudtuk, hogy a SELECT zradkban kett vagy tbb oszlopot is megadhatunk, kibvtve ezltal az adatbzisbl egy lpsben lekrdezhet informcik mennyisgt. Ezt kveten vetet tnk egy gyors pillantst a DISTINCT kulcsszra, amelyrl megtudtuk, hogy a segtsgvel eltntethetjk a tbbszr elfordul sorokat az eredmnyhalmazbl A tovbbiakban a SELECT lekrdezsrl olvastunk. Megtanultuk, hogyan kombinlhat a SELECT utastssal az eredmnyhalmaz rendezse rdekben, s megtudtuk, hogy mindez azrt szksges, mert a SELECT lekrdezs az egyetlen SELECT mvelet, amely ORDER BY zradkot tartalmaz. Megtanultuk, hogy az ORDER BY zradkot kell alkal maznunk, ha az informcikat egy vagy tbb oszlop alapjn rendezni szeretnnk, vala mint hogy minden oszlopra egyenknt bellthatjuk, hogy nvekv vagy cskken sor rendben legyen-e rendezve. Ez utn rviden trgyaltuk a SELECT utastsok mentsnek lehetsgt, s megtanultuk, hogy a ksbbi felhasznls cljra lekrdezs vagy nzet tbla formjban menthetjk ket. Vgl szmos pldt tanulmnyoztunk, amelyek a mintaadatbzisok klnfle tblira tmaszkodtak. A pldk bemutattk, hogyan alkalmazhatjuk a fejezetben megismert elveket s eljrsokat bizonyos helyzetekben. A kvetkez fejezetben behatbban megismerkednk a SELECT zradkkal, s megltjuk, hogyan nyerhetnk ki mst is, mint informcikat az oszlopokbl.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a megoldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrdezsekkel Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Order adatbzis


1. Mutass meg minden informcit az alkalmazottainkrl!" A megolds itt tallhat: CH04_Employee_Information (8 sor). 2. Mutasd meg azoknak a vrosoknak a listjt bcsorrendben, ahol beszlltink

vannak, az egyes vrosokban tallhat beszlltk nevvel egytt!"


A megolds itt tallhat: CH04_Vendor_Locations (10 sor).

Entertainment Agency adatbzis


1. Add meg az sszes gynknk nevt s telefonszmt, s rendezd ket vezetk

nv, majd keresztnv alapjn!"


A megolds itt tallhat: CH04_Agent_Phone_List (9 sor). 2. Adj informcikat minden rendezvnynkrl!" A megolds itt tallhat: CH04_Engagement_Information (111 sor).

3. Sorold fel az sszes rendezvnynket s a hozzjuk rendelt kezd dtumot!


Rendezd ket dtum alapjn cskken, rendezvny alapjn pedig nvekv sorrendbe!"
A megolds itt tallhat: CH04_Scheduled_Engagements (111 sor).

School Scheduling adatbzis


1. Mutass teljes kr listt az ltalunk knlt tantrgyakrl!" A megolds itt tallhat: CH04_Subject_List (56 sor). 2. Milyen cmek tartoznak a karunkhoz?" A megolds itt tallhat: CH04_Faculty_Titles (3 sor).

3. Sorold fel minden tanr nevt s telefonszmt, s rendezd a listt keresztnv,


majd vezetknv szerint!"
A megolds itt tallhat: CH04_Staff_Phone_List (27 sor).

Bowling League adatbzis 1. rd ki az sszes csapatot bcsorrendben!" A megolds itt tallhat: CH04_Team_List (8 sor).
2. Mutass meg minden pontszmokra vonatkoz informcit minden tagunkhoz!" A megolds itt tallhat: CH04_Bowling_Score_Information (1344 sor).

3. Sorold fel a tekejtkosokat a lakcmkkel egytt, s rendezd bcsorrendbe!"


A megolds itt tallhat: CH04_Bowler_Names_Addresses (32 sor).

Recipes adatbzis
1. Sorold fel az sszes nyilvntartott hozzvalt!" A megolds itt tallhat: CH04_Complete_Ingredients_List (79 sor). 2. Mutass meg minden fontosabb receptinformcit, a recept neve szerint

bcsorrendbe rendezve!" A megolds itt tallhat: CH04_Main_Recipe_Information (15 sor).

Kapjunk tbbet egyszer oszlopoknl!


A tnyek makacs dolgok Tobias Smollett Gil Blas de Santillane

A fejezet tmakrei
Mik azok a kifejezsek? Milyen tpus adatokat szeretnnk megjelenteni? Adattpusok megvltoztatsa: a CAST fggvny Konkrt rtkek meghatrozsa A kifejezsek tpusai Kifejezsek hasznlata a SELECT zradkban A semmit jelkpez rtk: a Null Pldk sszefoglals nll feladatok

A 4. fejezetben megtanultuk, hogyan hasznlhatjuk a SELECT utastst arra, hogy inform cikat szerezznk egy tbla egy vagy tbb oszlopbl. Ez a mdszer jl hasznlhat, amg olyan egyszer krdseket intznk az adatbzishoz, amelyek rvn alapvet adatokhoz szeretnnk hozzjutni, amikor azonban sszetettebb krdsekkel kezdnk foglalkozni, elkerlhetetlenn vlik az SQL-szkincsnk gazdagtsa. Ebben a fejezetben megismerke dnk a kifejezsek fogalmval, amelyek segtsgvel lehetsgnk nylik az adataink m dostsra s j adatoszlopok ellltsra a meglv adatokbl. Ez utn arrl ejtnk szt, hogy az oszlopokban trolt adatok tpusa miknt befolysolja a kifejezseket s lekrdez seket, majd rvid kitrt tesznk, hogy megismerkedjnk a CAST fggvny hasznlatval, amelynek a segtsgvel a kifejezseinkben megvltoztathatjuk az adatok tpust. Ez utn megtanulunk llandkat (literlis rtkeket) ltrehozni, amelyeket kreatvan hasznlhatunk a lekrdezsekben. Elsajttjuk, hogyan hatrozhatjuk meg nagy pontossggal a lekrdezett informcik krt, kifejezsek segtsgvel kezelve az adatokat. Vgl megismerkednk a klnleges Null rtkkel, s megtanuljuk hogyan befolysolja a Null a munknkat.

Mik azok a kifejezsek?


Ha tbbre van szksgnk egyszer oszlopoknl, kifejezseket kell rnunk. A kifejezs nem ms, mint valamilyen mvelet szmokkal, karakterlncokkal, dtumokkal s idpontokkal. Egyarnt hasznlhatunk bennk adatokat a tblink meghatrozott oszlopaibl, lland (literlis) rtkeket, vagy a kett kombinciit. (A literlis rtkek ltrehozst a fejezet ksbbi rszben mutatjuk be.) Miutn az adatbzis elvgezte a kifejezsben meghatrozott mveleteket, egy rtket ad vissza az SQL-utastsnak, amelyet az feldolgoz. A kifejezsek a lekrdezett informcik krnek szktsre s bvtsre egyarnt jl hasznlhatk, s klnsen hasznosnak bizonyulhatnak, ha mi lenne, ha? tpus krdsre keressk a vlaszt. Lssunk nhny pldt a kifejezsek segtsgvel megvlaszolhat krdsekre:

sszesen mennyi az rtke az egyes termkekbl raktron lev daraboknak?" Adj egy cmlistt az alkalmazottainkrl, amelyben a vezetknv szerepel ell!" Mutasd meg az egyes rk kezd s zr idpontjt, valamint az ra idtartamt!" Mutasd meg a tekejtkosok tiszta pontszma s bntetpontszmok ltal terhelt pontszma kztti klnbsget!" Mi a becslt radja az egyes rendezvnyeknek?" Mi lenne, ha megemelnnk a termkeink rt 5 szzalkkal?"
Ahogy vgighaladunk ezen a fejezeten, fokozatosan megtanuljuk, hogy a kifejezsek hasznlata nagyon rtkes rsze az SQL-ismereteinknek. Kifejezsekkel sztdarabolhatjuk s jrapthetjk a nyers adatokat, hogy rthetbb s hasznlhatbb eredmnyt kapjunk a lekrdezseinkben, s nagy hasznukat vesszk majd a 6. fejezetben is, amikor adatok szrsre s tbb tbla sszekapcsolsra hasznljuk ket.

Milyen tpus adatokat szeretnnk megjelenteni?


A kifejezsekben hasznlt adatok tpusa befolysolja a kifejezs visszatrsi rtkt, ezrt kezdetnek meg kell ismerkednnk az SQL szabvnyos adattpusaival. Adatbzisunk minden oszlophoz egy adattpus rendeldik, amely meghatrozza, hogy milyen rtkeket trolhat az adott oszlop, valamint azt is korltozza, hogy milyen mveleteket vgezhetnk az oszlop adataival. Ismernnk kell az alapvet adattpusokat, hogy hozzkezdhessnk a literlis rt kekkel val munkhoz vagy oszlopok s literlis rtkek egyttes alkalmazshoz a kifeje zsekben, hogy ezeket hibtlanul ltrehozhassuk, s a megfelel rtkekkel trjenek vissza. Az SQL-szabvny ht ltalnos kategrit jell ki az adatok tpusainak: CHARACTER (karak teres vagy szveges), NATIONAL CHARACTER (nemzetkzi karakteres/szveges), BINARY (binris), NUMERIC (szm), BOOLEAN (logikai), DATETIME (dtum/id) s INTERVAL (idkz vagy tartomny). Mindegyik kategria egy vagy tbb egyedileg elnevezett adattpust tartal maz, amelyekrl az albbiakban kzlnk egy tmr sszefoglal listt (Az albbi listban a szm kategrit kt alcsoportra bontottuk, pontos szm s kzelt szm nven.)

CHARACTER

A karakteres adattpus rgztett vagy vltoz hosszsg karakterlncot trolhat, amely egy vagy tbb nyomtathat karaktert tartalmaz. Az elfogadott karakterek ltalban a szabvnyos amerikai informcitviteli kdols (ASCII) vagy a bvtett binris kdols (EBCDIC) karakterkszlete ken alapulnak A rgztett hosszsg karakteres adattpus CHARACTER vagy CHAR nven, a vltoz hosszsg karakte res tpusok CHARACTER VARYING, CHAR VARYING vagy VARCHAR nven ismeretesek Megadhatjuk a troland adatok hosszt, de a legnagyobb trolhat hosszsg az adott adatb zis-kezel rendszertl fgg (Ez a szably a nemzetkzi karak teres adattpusokra is vonatkozik) Ha a troland karakter lnc hossza tllpi a rendszer ltal meghatrozott legnagyobb rtket (ez ltalban 255 vagy 1024 karakter), CHARACTER LARGE OBJECT, CHAR LARGE OBJECT vagy CLOB adattpust kell alkalmaznunk Sok rendszerben a CLOB adattpus text vagy MEMO nven rhet el. NATIONAL CHARACTER A nemzetkzi karakteres adattpus lnyegben megegyezik az elzekben megismert karakteres adattpussal, azzal a ki vtellel, hogy a karakterei az ISO ltal meghatrozott idegen nyelv karakterkszletekbl szrmaznak A rgztett hosszs g nemzetkzi karakteres tpus neve NATIONAL CHARACTER, NATIONAL CHAR vagy NCHAR, rng a vltoz hosszsg nem zetkzi karakteres tpus NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING vagy NCHAR VARYING. Ha a trolan d karakterlnc hossza tllpi a rendszer ltal meghatrozott legnagyobb rtket (ez ltalban 255 vagy 1024 karakter), NATIONAL CHARACTER LARGE OBJECT, NCHAR LARGE OBJECT vagy NCLOB adattpust kell alkalmaznunk Sok rendszerben az NCLOB adattpus NTEXT nven rhet el. BINARY A binris adatok (kpek, zenk, videk), illetve az olyan sszetett begyazott dokumentumok, rnint a szvegszerkesz tk s tblzatkezelk fjljainak trolsra a BINARY large OBJECT (vagy BLOB) adattpus szolgl. Sok rendszerben ez az adattpus BINARY, BIT vagy BIT VARYING nven rhet el. Ez az adattpus egsz, illetve tizedesjegyeket tartalmaz sz Pontos szm mokat trol. A pontossgt (a szm sszes jegye, az egszt s a tizedesjegyeket is belertve) s a mretet (a tizedesjegyek szma a tizedesvessztl jobbra) a pontos szmtpus esetben a felhasznl is bellthatja, de be kell tartania az adott adatbzis-kezel rendszer korltozsait A NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT s BIGINT elnevezs tpusok

Kzelt szm

boolean

DATETIME

mind ezt az adattpust jellik. Egy dolgot azonban szem eltt kell tartanunk: az SQL-szabvny szerint - s a legtbb adatb zis-kezel rendszerben - a BIGINT tpus nagyobb rtktarto mnyt vehet fel, mint az INTEGER, az INTEGER pedig nagyobb rtktartomnyt kpvisel, mint a SMALLINT. Az egyes tpusok hoz tartoz rtktartomnyok tekintetben az adatbzis-keze lnk dokumentcijbl tjkozdhatunk. Nhny rendszer egy TINYINT tpust is a rendelkezsnkre bocst, amelyhez a SMALLINT-nl is kisebb rtktartomny tartozik. Ez az adattpus tizedestrtek s exponencilis szmok trol sra szolgl. A float, REAL s DOUBLE PRECISION nven elfordul tpusok tartoznak ebbe a krbe. A kzelt szmt pusoknak nincs meghatrozott pontossguk s mretk, de az SQL-szabvny csak a float tpusnl engedlyezi, hogy a pontossgot a felhasznl adja meg. Az ilyen tpusokhoz tartoz mretet mindig a konkrt adatbzis-kezel rendszer korltozza. Az SQL-szabvny s a legtbb adatbzis-kezel a DOUBLE PRECISION tpus rtktartomnyt nagyobbknt ha trozza meg a REAL s a FLOAT adattpusok rtktartomny nl. Ennek tekintetben is ellenrizzk a rendszernk lerst. Ez az adattpus igaz (true) s hamis (false) rtkek trolsra szolgl, s jellemzen egyetlen bitet hasznl fel. Nhny rend szer a bit, INT vagy TINYINT nevet hasznlja a logikai adatt pus neveknt Ebben az adattpusban dtumok, idpontok, valamint ezek kombincii troldnak. Az SQL-szabvny a dtumokra az vh-nap jellsmdot, mg az idpontokra a 24 rs idpont megadst rja el. A legtbb adatbzis-kezel rendszerben a dtumok megadhatk az angolszsz orszgokban elterjed tebb h/nap/v vagy nap/h/v formtumban, az idpontok pedig a 12 rs de./du. formtumban is. A tovbbiakban a knyvben az SQL-szabvny ltal elrt jellsmdot kvet jk. Hrom tpus tartozik ebbe a kategriba: a DATE, a TIME s a timestamp. A TIMESTAMP (idblyeg) adattpus dtum s idpont egyttes trolsra alkalmas. A tpusok elnevezsei s hasznlatuk mdja eltr lehet az egyes adatbzis-kezel rendszerek esetben. Vannak rendszerek, amelyek a DATE t pusban egyarnt trolnak dtumot s idt is, mg msok erre a TIMESTAMP vagy a DATETIME adattpust hasznljk. Ezek te kintetben is az adatbzis-kezel rendszernk dokumentci jra tmaszkodhatunk.

INTERVAL

Ez az adattpus kt idpont (DATETIME) klnbsgnek trol sra alkalmas, amely v, hnap; v/h; nap, id; vagy nap/id formjban jelenhet meg. A fbb adatbzis-kezelk kzl nem mindegyik tmogatja az INTERVAL adattpust, ezrt ez esetben is javasoljuk a rendszer lersnak tanulmnyozst.

Sok adatbzis-kezel rendszer biztost tovbbi adattpusokat is, amelyek bvtett adattpus nven ismeretesek az SQL-szabvnyban. (Nhnyat felsoroltunk kzlk az elz adatt pus-csoportokat bemutat felsorolsban.) Ilyen bvtett adattpus pldul a MONEY/CUR RENCY s a SERIAL/ROWID (ez utbbi egyedi sorazonostkat trol). Mivel mi elssorban az SQL adatkezel rszvel foglalkozunk, csak az adatbzis-kezelnk ltal biztostott adattpusok egy rszre lesz szksgnk. A tpusok ismerete segt a kifeje zsek helyes megrsban s megfelel vgrehajtsban, ezrt rdemes idt sznnunk az adatbzis-kezelnk tpusainak megismersre.

Adattpusok megvltoztatsa: a CAST fggvny


Amikor kifejezseket szerkesztnk, gyelnnk kell r, hogy a bennk hasznlt oszlopok s literlisok sszeegyeztethetk legyenek a rajtuk vgzett mveletekkel - pldul nem lenne szerencss egy szveget sszeadnunk egy szmmal. m ha egy szveges (karakteres) oszlop vagy lland egy szmot tartalmaz, a CAST fggvny segtsgvel valdi szmm alakthatjuk azt, mieltt elvgezzk az sszeadst. A majdnem minden adatbzis-kezelben tmogatott CAST fggvny utastsformjt az 5.1. brn lthatjuk.

5.1. bra A CAST-fggvny szintaxisdiagramja A CAST fggvny a neki tadott literlis rtket vagy oszloptartalmat a meghatrozott adattpusv alaktja. Segtsgvel biztosthatjuk, hogy a kifejezseinkben szerepl adatok tpusa egymssal sszeegyeztethet legyen, vagyis minden oszlop vagy literlis rtk egy arnt szveget, szmot vagy dtum-id rtkeket tartalmazzon. (Mint minden szablynl, itt is vannak kivtelek, de ezekkel ksbb foglalkozunk.) A kifejezsben szerepl minden rtknek sszeegyeztethetnek kell lennie a rajta vgzett mvelettel, hogy a kifejezs helyesen mkdjn; ellenkez esetben az adatbzis-kezel hibt jelez.

A legtbb kereskedelmi forgalomban kaphat adatbzis-kezel rendszer tmogatja a CAST fggvnyt, de nem mindegyik. Ezekben a rendszerekben mst fggvnyekkel rhetjk el ugyanezt az eredmnyt. Ezek megisme rshez tanulmnyozzuk t a rendszernk dokumentcijt.
Az adatok talaktsa egyik tpusrl a msikra viszonylag egyszer, de az albbi megszor tsokat szem eltt kell tartanunk. Hvjuk ezt a szablyt a ne rakjunk egy 10 kils zskot egy t kils dobozba szably nak. Amint korbban olvashattuk, a karakteres adattpusok esetben lehetsgnk van belltani a trolt adatok legnagyobb hosszt. Amikor megprblunk talaktani egy szveges mezt (pldul VARCHAR-t) egy ms tpus szveges mezv (pldul CHARACTER-r), s az eredeti adat hossza nagyobb, mint az talaktott adat szmra kijellt adattpus lehetsges legnagyobb mrete, az adatbzis-kezel csonkolja az eredeti szveget. Ilyen esetben a rendszer figyelmeztet a csonkols tnyre. A ne prbljunk ngyszgletes pecket dugni kerek lyukba szably: brmilyen karakteres rtket vagy oszlopot talakthatunk ms tpusv, de a forrsadatnak a cltpusra alakthatnak kell lennie. Pldul egy szveges mezben tallhat, t karakterbl ll irnytszmot talakthatunk szm tpusv, de a kanadai irnyt szmok esetben, amelyek betket is tartalmaznak, mr problmkba fogunk tkz ni. Az adatbzis-kezelk figyelmen kvl hagyjk a szvegek elejn s vgn lv szkzket a karakteres tpusok szmm vagy dtumm alaktsakor. A legtbb adatbzis-kezel a szveges adatknt megadott dtumok s idpontok sokfle formjt kpes felismerni. Ezzel kapcsolatban rendszernk dokumentcija ad tovbbi tjkoztatst. A 10 kils zsk szably msodik vltozata: amikor egy szm tpus oszlop rtkt egy msik szmtpuss alaktjuk, az talaktand rtknek illeszkednie kell a szmra megadott j adattpushoz. Pldul, ha egy 32 767-nl nagyobb REAL tpus rtket szeretnnk SMALLlNT-t alaktani, valsznleg hibazenetet kapunk, ha pedig tizedestrtet prblunk INTEGER vagy SMALLINT tpusv alaktani, az adatbzis kezel rendszer a tizedesvessztl jobbra lv szmjegyeket levgja vagy kerekti. A fentiek ellenre lehet ngyszgletes pecket kerek lyukba dugni - bizonyos korltozsokkal. Szm tpus oszlopok karakteres tpuss alaktsa hrom fajta eredmnnyel zrulhat: 1. Az talakts sikeresen megtrtnik 2. A rendszer szkzkkel tlti fel a maradk helyet, ha az adat rvidebb, mint a karakteres tpus oszlop szmra belltott hossz. 3. Az adatbzis-kezel hibazenetet kld, ha a karakteres tpusv alaktott adat hossza nagyobb, mint a karakteres oszlop szmra belltott hossz.

Az SQL-szabvny ugyan ezeket a megszortsokat adja meg, ettl azonban a sajt adatbzis-kezelnk eltrhet az talaktsok elvgzse sorn. Nhny adatbzis-kezel rendszer automatikusan elvgzi a tpusok talaktst, anlkl, hogy alkalmaztuk volna a CAST fggvnyt. Pldul hozzfzhetnk egy szveg hez egy szmot, vagy sszeadhatunk egy szmot tartalmaz szveget egy msik szmmal anlkl, hogy kln mveletben elvgeznnk a tpusok talaktst. A rszletek tekintet ben tanulmnyozzuk t az adatbzis-kezelnk lerst. Fontos tudnunk, hogy a fenti felsorols nem tartalmazza az SQL-szabvnyban lert sszes korltozst. Csak azokat soroltuk fel, amelyek a knyvben hasznlt adattpusokkal sszefggnek. Ha rszletesebben szeretnnk olvasni az adattpusokrl s a tpusok tala ktsakor felmerl problmkrl, a D fggelkben felsorolt knyvekben tallhatunk rszletesebb informcikat.
Figyeljk a CAST fggvny alkalmazst a knyv tovbbi rszben: akkor fogjuk hasznlni, ha biztosak szeretnnk lenni abban, hogy bizonyos adatok biztosan egy adott tpusba tartoznak.

Konkrt rtkek meghatrozsa


Az SQL-szabvny lehetsget ad a SELECT utasts ltal szolgltatott informcik rugalmas kibvtsre, lehetv tve lland rtkek, pldul karakterlncok, szmok, dtumok s idpontok hasznlatt, illetve ezek vltozatos kombinciit a SELECT utastsban hasznlt minden rvnyes kifejezsben. Az SQL-szabvny az ilyen mdon megadott rtkeket literlis rtkeknek nevezi, s lerja a meghatrozsuk szablyait is.

Karakterlnc-literlok
A karakterlnc-literl aposztrfok (egyszeres idzjelek) kz zrt karakterek sorozata. Br valsznleg hozzszoktunk, hogy ltalban (ketts) idzjelek kz zrjuk a karak terlncokat, itt gy szeretnnk bemutatni ezeket a megoldsokat, ahogy az SQL-szabvny megadja azokat. A karakterlnc-literlok diagramjt az 5.2. brn lthatjuk.

Nhny plda ilyen karakterlnc-literlokra:

'Ez egy pldamondat a karakterlnc-literlok szemlltetsre.' 'Here"s yet another!' 'B-28' 'Seattle'
Vegyk szre, hogy ami ketts idzjelnek tnik a diagramon s a msodik pldamondat ban, az valjban kt egymst kvet aposztrf, amelyek kztt nem hagytunk szkzt, ezrt nagyon hasonlan nznek ki, mint egy ktszeres idzjel. A szabvny szerint az adatbzis-kezel rendszerek gy tudjk megklnbztetni egymstl a karakterlnc kezdett s vgt jelz aposztrfot egy a mondat kzepn lv aposztrftl. Az albbi kt sor bemutatja, hogyan adhatunk meg aposztrfot egy karakterlnc kzepn: SQL Megjelentett eredmny

'The Vendor"s name is: ' The Vendor' s name is:

Amint korbban emltettk, a karakterlnc-literlok segtsgvel kibvthetjk a SELECT ltal adott informcikat. A lekrdezsek ltal visszaadott informci ltalban knnyen ttekinthet, de ha a helyzet szksgess teszi, mg vilgosabb tehet. Pldul ha vgre hajtjuk az albbi SQL-utastst, az eredmnyhalmaz csak a beszlltk weboldalnak cmt s a beszlltk nevt fogja tartalmazni: SQL

SELECT VendWebPage, VendName FROM Vendors

Ha azt szeretnnk, hogy a lekrdezs tbb informcit adjon, megadhatunk egy karakter lncot, amelynek a segtsgvel kiegszt, magyarz szveget adhatunk a SELECT zradkhoz. Ezt az eljrst krltekinten hasznljuk, mivel a karakterlnc-literl az eredmnyhalmaz minden sorban szerepelni fog. Az elz plda lekrdezst egy karakterlnc-literllal kibvtve az albbihoz hasonl lekrdezst kapunk: SQL

SELECT VendWebPage, 'is the Web site for', VendName FROM Vendors

Az ezltal a SELECT utasts ltal ellltott eredmny egy sora ehhez hasonlan nz ki:

Ez egyrtelmbb teszi a megjelentett informcikat, hiszen pontosan tisztzza az internetcm hovatartozst. Termszetesen ez csak egy nagyon egyszer plda annak szemlltetsre, hogy miknt hasznlhatjuk a karakterlnc-literlokat. A ksbbiekben a kifejezsekben val hasznlatukkal is megismerkednk.

A fenti megoldsnak klnsen akkor vehetjk hasznt, ha rgrl rklt adatbzisokkal kell dolgoznunk, amelyek megfejthetetlen oszlopneveket tartalmaznak. Ha az adatbzisaink ltrehozsa sorn azonban kvetjk a 2. fejezet javaslatait, erre a mdszerre nem tl gyakran lesz szksgnk.

Szmliterlok
A szmliterl a SELECT utastsban hasznlhat literlok msik tpusa. Ahogy a neve is elrulja, eljelet, szmot, tizedespontot, exponencilis jelet s exponencilis szmot tartal mazhat. A szmliterlok diagramjt az 5.3. brn lthatjuk.

5.3. bra A szmliterlok szintaxisdiagramja Nhny plda szmliterlokra: 427 -ll.253 .554 0.3E-3 A szmliterlok kifejezsekben alkalmazva a leghasznosabbak a szmunkra (pldul szorzst vagy sszeadst tesznek lehetv egy meghatrozott rtkkel), ezrt rszletesebb megismersket a fejezet ksbbi rszeire halasztjuk.

Dtum-id literlok
A SELECT utastsokon bell a dtumliterlok, idliterlok, illetve idblyeg-literlok segt sgvel klnbz dtum- s idrtkeket adhatunk meg. Az SQL-szabvny ezekre dtum-id literl ( datetime literal) nven hivatkozik. Amint az 5.4. brn megfigyelhetjk, ezeknek a literloknak a megadsa igen egyszer.

5.4. bra A dtum-id literlok szintaxisdiagramja Dtum-id literlokat, illetve azok klnbsgt kifejez literlokat hasznlva az albbiakat kell szben tartanunk: Dtum A dtumliterlok v-h-nap alakban adhatk meg. A knyvben is vgig ezt a formt kvetjk majd, de sok adatbzis-kezel megengedi az Egyeslt llamokban elterjedt h/nap/v formtum, valamint a vilg szmos orszgban hasznlt nap/h/v forma hasznlatt is. Az SQLszabvny megkveteli a DATE kulcssz hasznlatt a literl eltt, de majd nem rninden, a piacon elterjedt szoftver megengedi, hogy a literlis rt ket egyszeren hatrol karakterek kztt (ezek ltalban aposztrfok) adjuk meg. Egy kivtelt talltunk: a MySQL-t, amely a dtumliterlok megadst (ketts) idzjelek kztt kveteli meg, majd az gy megadott karakterlnc a CAST fggvny segtsgvel DATE adattpusv alaktand, mieltt dtummveletekhez hasznlhatnnk. Idpont megadshoz a 24 rs formtum alkalmazand. A du. 07:00 idpontot pldul 19:00-knt adhatjuk meg. Az SQL-szabvny megkve teli a TIME kulcssz hasznlatt is a literl eltt, de majdnem minden kereskedelmi szoftverben elegend csupn a literlis rtket megadni hatrol (ltalban aposztrf) karakterek kztt. Egy kivtelt talltunk: a MySQL-t, amelyben az idliterlokat (ketts) idzjelek kztt kell megadnunk, majd a CAST fggvnnyel a karakterlncot TIME tpusv kell alaktanunk, mieltt idmveleteket vgezhetnnk vele. Az idblyeg-literl nem ms, mint egy dtum s egy idpont egyttes megadsa egy szkzzel elvlasztva. A dtum s az idpont megadsnak formai szablyai megegyeznek a dtum- s idliterlok megadsnl ler-

Id

Idblyeg

takkal. Az SQL-szabvny megkveteli a TIMESTAMP kulcssz alkalma zst a literl eltt, de majdnem minden kereskedelmi szoftver, amely tmogatja a TIMESTAMP adattpust, lehetv teszi, hogy a literl rtkt egyszeren hatrol karakterek (ltalban aposztrfok) kztt adjuk meg. Bizonyos rendszerekben az idkz-literlok (idtartomny-literlok) hasznlata is tmogatott a dtum- s idliterlokkal mveletet vgz kifejezsekben, de ezzel a literltpussal a knyvben bvebben nem foglalkozunk. Tovbbi rszleteket az adatbzis-kezelnk dokumentcijbl tudhatunk meg. A DATE, TIME, TIMESTAMP s INTERVAL adattpusoknak az SQL-szabvny ltal meghatrozott formtumt az A fggelkben tallhat diagramok mutatjk be. Nhny plda dtum- s idliterlokra:

'2007-05-16' '2016-11-22' '21:00' '03:30:25' '2008-09-29 14:25:00'


Ha MySQL adatbzis-kezelt hasznlunk, ne felejtsk el, hogy minden karakterlnc formjban megadott dtumot s idpontot kifejezetten t kell alaktanunk a CAST fggvnnyel:

CAST('2016-ll-22' AS DATE) CAST('03:30:25' AS TIME) CAST('2008-09-29 14:25:00' AS DATETIME)


Amint az elzekben mr megjegyeztk, ha kvetni szeretnnk az SQL-szabvnyt, mindegyik literl eltt alkalmaznunk kell a megfelel kulcsszavakat. A DATE s TIME kulcs szavak az SQL-szabvny szerint a dtum- s idliterlok szksges alkotelemei, az adatb zis-kezel rendszerek azonban ritkn tmogatjk ezeket a kulcsszavakat, s csak a literl karakterlnc rsznek megadst ignylik, ezrt a knyv pldiban tartzkodni fogunk a kulcsszavak hasznlattl, s csak az aposztrfokat hasznljuk a dtum- s idliterlok megadsakor. Az gy megadott dtumok s idpontok kifejezsekben val hasznlatval a fejezet ksbbi rszben ismerkednk meg. A dtum- s idliterloknak az SQL-szabvny szerinti formtumt az ,,A fggelk diagramjai mutatjk be rszletesen.

A kifejezsek tpusai
Az SQL-utastsok rsa sorn a kifejezseknek ltalban az albbi hrom tpust hasznljuk.

sszefzs Matematikai kifejezs Dtum- s idmveletek

Kt vagy tbb, karaktereket tartalmaz oszlop vagy literl egyestse egyetlen karakterlncc. sszeads, kivons, szorzs vagy oszts szmadatokat tartalmaz oszlopokkal vagy literlokkal. Dtumok s idpontok sszeadsa vagy kivonsa.

sszefzs
Az SQL-szabvny kt fggleges vonalat (Csvonal) hatroz meg az sszefzs mveleti jeleknt. Kt karakteres elem sszefzse gy trtnik, hogy az egyik elemet az sszefz mveleti jel egyik oldaln szerepeltetjk, a msikat pedig a msikon. Eredmnyl egyetlen karak terlncot kapunk, amely a kt elem sszefzseknt ll el. Az sszefz kifejezsek szintaxisdiagramjt az 5.5. brn lthatjuk.

5.5. bra Az sszefz kifejezs szintaxisdiagramja

A jelentsebb adatbzis-kezel rendszerek kzl csak az IBM DB2, az Informix, valamint az Oracle tmogatja az SQL-szabvnyban meghatrozott sszefz mveleti jelet. A Microsoft Office Access az & s +jeleket hasznlja, a Microsoft SQL Server s Ingres csak a +jelet tmogatja, a MySQL-ben pedig a CONCAT fggvnyt kell hasznlnunk. A knyv pldiban a szabvnyos || mveleti jelet hasznljuk, a CD-n tallhat mintaadatbzisokban pedig minden adatbzisrend szerhez (Microsoft Access, Microsoft SQL Server s MySQL) az ltala tmogatott megfelel mveleti jelet.
Az albbiakban lthatjuk az sszefzs mveletnek elvt: Kifejezs - ElsElem || MsodikElem Eredmny - ElsElemMsodikElem Kezdjk a vilg legegyszerbb pldjval: fzznk ssze kt karakterlnc-literlt, pldul egy kereszt- s egy vezetknevet:

Kifejezs Eredmny

'Mike' || 'Hernandez' MikeHernandez

Kt dolgot figyelhetnk meg ebben a pldban. Elszr is, mindkt nevet aposztrfok kz kell rnunk, mivel kt karakterlnc-literlrl van sz. Msodszor, az eredmnyben a kereszt- s a vezetknv kzvetlenl egyms utn szerepel. Br az sszefzs mvelete sikeres volt, valsznleg ebben az esetben nem ezt szeretnnk elrni. Megoldsknt helyezznk egy szkzt a kt nv kz, mgpedig egy jabb karakterliterl hozzadsval, amely egyetlen szkzt tartalmaz: Kifejezs Eredmny
'Mike' || ' ' || 'Hernandez' Mike Hernandez

A fenti plda azt mutatja, hogy tbb sszefz mveleti jel alkalmazsval tbb karakter lncot is sszefzhetnk Az sszefzend rtkek szmnak tekintetben semmilyen korltozs nincs, viszont az sszefzs eredmnyekppen kapott karakterlnc hossza korltozott. Az eredmnyl kapott karakterlnc hossza ltalban nem lehet nagyobb, mint a vltoz hosszsg karakteres adattpus ltal megengedett legnagyobb mret. Az adatbzis-kezel rendszerek ezt a problmt klnbzkppen kezelik, ezrt a tovb bi rszletekrt tanulmnyozzuk t a rendszernk lerst. Kt vagy tbb karakterlnc sszefzse remek lehetsg, de ugyanilyen mdon ssze tudunk fzni kett vagy tbb karakteres tpus oszlopot is. Pldul ha van kt oszlopunk CompanyName (Cgnv) s City (Vros) nven, rhatunk egy kifejezst, amelyben az oszlopneveket szerepeltetve lehetsgnk nylik a tartalmuk sszefzsre. Az albbi pldban a kt oszlop tartalmt egy karakterlnccal fzzk ssze: Kifejezs Eredmny
CompanyName || ' is based in ' || City DataTex Consulting Group is based in Seattle

A CompanyName s City oszlopneveket nem kell aposztrfok kz tennnk, mivel ezek oszlophivatkozsok (Emlksznk mg az elz fejezetben megismert oszlophivatkozsok ra?) Ilyen oszlophivatkozsokat brmilyen kifejezsben hasznlhatunk, amint azt a tovbbi pldkban majd lthatjuk is. Biztosan szrevettk, hogy a pldkban mindig karakterlncokat fztnk ssze. Ezek utn valsznleg kvncsiak vagyunk, hogy kell-e tennnk valami klnlegeset, ha szmokat vagy dtumokat szeretnnk sszefzni. Nos, a legtbb adatbzis-kezel rendszer esetben tallkozunk nmi klnbsggel. Ha az adatbzis-kezel szreveszi, hogy karakteres tpus oszlopot vagy literlt szeretnnk sszefzni szmmal vagy dtumrtkkel, automatikusan elvgzi a szm vagy dtum talaktst, s az sszefzs gond nlkl megtrtnik

Viszont nem mindig bzhatjuk az adatbzis-kezelre, hogy az talaktst csendben, a httrben elvgezze. Ha karakterlnc-literlokat vagy karakteres tpus oszlopok rtkt szeretnnk dtumliterllal vagy szm, illetve dtum tpus oszlopok rtkvel sszefzni, a CAST fggvnyt kell hasznlnunk az rtkek karakterlncc alaktshoz. Az albbi pl dban a CAST hasznlatval talaktjuk a DateEntered nev, dtum tpus oszlop rtkt: Kifejezs Eredmny EntStageName || ' was signed with our agency on ' || CAST(DateEntered as CHARACTER(10))

Modern Dance was signed with our agency on 1995-05-16

A fenti pldban kifejezetten megadtuk a CHARACTER adattpus hosszt, mivel az SQL-szabvny abban az esetben, ha nem adunk meg hosszrtket, alaprtelmezsknt az 1 rtket hasznlja. Azt tapasztaltuk, hogy a fbb adatbzis-kezelk nem ragaszkodnak ehhez a viselkedshez, hanem olyan hossz karakterlncot hoznak ltre, amelybe belefr az talakts eredmnye. A rszleteket az adatbzis-kezelnk dokumentcijban talljuk, de ha biztosra szeretnnk menni, mindig adjunk meg konkrt hosszrtket.
Szmliterlok vagy szm tpus oszlopok rtknek karakterlnchoz val fzsekor szintn a CAST fggvnyt kell hasznlnunk. A kvetkez pldban a RetailPrice nev, szm tpus oszlop rtkt alaktjuk t a CAST-tal: Kifejezs Eredmny ProductName || ' sells for ' || CAST(RetailPrice AS CHARACTER(8))

Trek 9000 Mountain Bike sells for 1200.00

Az sszefz kifejezs egyidejleg is tartalmazhat karakterlncokat, dtum-id rtkeket s szmrtkeket Az albbi pldban egyetlen kifejezsben mindhrom adattpust hasz nljuk: Kifejezs 'Order Number ' || CAST( OrderNumber AS CHARACTER (2)) || ' was placed on ' || CAST(OrderDate AS CHARACTER(10))

Eredmny

Order Number 1 was placed on 2007-09-01

Az SQL-szabvny fggvnyek sokasgt rja le, amelyekkel informci kat nyerhetnk ki az oszlopokbl, vagy tbb sor rtkvel vgezhetnk szmtsokat. Ezek kzl nhnnyal rszletesebben foglalkozunk a 12. fejezetben. A legtbb kereskedelmi adatbzis-kezel rendszer tovbbi fggvnyeket is nyjt, amelyekkel karakterlncok rszeivel vgezhetnk mveleteket, vagy dtum-, id- s pnznemrtkeket formzhatunk. A rszletekrt tanulmnyozzuk t a rendszernk lerst.

Most, hogy megismerkedtnk a klnbz forrsbl szrmaz adatok egyetlen karak terlncc val sszefzsvel, ismerjk meg a kifejezsek msik csoportjt is: azokat a kifejezseket, amelyeket szm tpus adatokbl pthetnk fel.

Matematikai kifejezsek
Az SQL-szabvny az sszeads, kivons, szorzs s oszts mvelett rtelmezi a szm tpus adatok kztt. Igen, ezek valban nagyon korltozott lehetsgek. Szerencsre a legtbb RDBMS szoftver mveletek sokkal szlesebb vlasztkt - pldul maradkkp zs, gykvons, exponencilis s abszolt rtk biztostja. Tudomnyos, trigonometriai, statisztikai s matematikai fggvnyeket is rengeteget ismernek. A knyvben azonban csak az SQL-szabvnyban lert mveletekre sszpontostunk. A mveletek vgrehajtsi sorrendje (kirtkelsi sorrendje) fontos szempont a matematikai kifejezsek rsakor. Az SQL-szabvny a sorrend tekintetben nem tesz klnbsget a szor zs s az oszts kztt, csak azt rja le, hogy ezeket az sszeadsok s kivonsok eltt kell vgrehajtani. Ez valamelyest ellentmond a mveletek iskolban tanult sorrendjnek, ahol a szorzs az oszts eltt szerepel, az oszts az sszeads eltt, az sszeads pedig a kivo ns eltt, de megfelel a modern programozsi nyelvek ltal hasznlt mveleti sorrendnek. A matematikai kifejezsek kirtkelse balrl jobbra trtnik. Ez attl fggen, hogy miknt ptettk fel a kifejezst nha rdekes eredmnyt adhat, ezrt javasoljuk, hogy ahol csak lehet, hasznljunk zrjeleket az sszetett matematikai kifejezseknl, hogy azok az elvrsainknak megfelelen rtkeldjenek ki. Ha mg emlksznk r, hogyan rtunk egyenleteket matematikarn az iskolban, akkor az SQL-kifejezsek megrsa sem fog gondot okozni. Lnyegben egy eljeles vagy eljel nlkli szmrtk, egy matematikai mveleti jel s egy msik eljeles vagy eljel nlkli szmrtk alkot egy egyszer kifejezst. A matematikai kifejezsek felptst az 5.6. bra mutatja.

5.6. bra A matematikai kifejezsek szintaxisdiagramja Az albbiakban nhny pldt lthatunk matematikai kifejezsekre, amelyek szmszer literlis rtkeket, oszlophivatkozsokat s a kett kombincijt tartalmazzk:

25 + 35 -12 * 22 RetailPrice * QuantityOnHand TotalScore / GamesBowled RetailPrice - 2 . 5 0 TotalScore / 12


Amint mr emltettk, az sszetett matematikai kifejezsek esetben tancsos zrjeleket hasznlnunk. Az albbi egyszer plda egy ilyen kifejezst mutat be: Kifejezs Eredmny

( 1 1 - 4) + (12 *3)
43

Figyeljk meg, hogyan befolysolja a zrjelek elhelyezse a kifejezs eredmnyt. A kvetkez pldban szerepl kt kifejezs vilgosan megmutatja ennek jelentsgt. Mindkt kifejezst ugyanazok a szmok s mveleti jelek alkotjk, csak a zrjelezskben trnek el egymstl, ennek kvetkeztben mgis teljesen klnbz rtkkel fognak visszatrni: Kifejezs Eredmny Kifejezs Eredmny (23 * 11) + 12 265 23 * (11 + 12) 529

Knny beltni, hogy mirt kell vatosan bnnunk a zrjelekkel, ez azonban ne tntortsan el bennnket a hasznlatuktl: nlklzhetetlenek lesznek, amikor bonyolult kifejezsekkel akad dolgunk. Zrjelek segtsgvel lehetsgnk van mveletek egymsba gyazsra is a kifejezseken bell. Amikor egymsba gyazott, zrjelezett mveleteket hasznlunk, ezek kirtkelst az adatbzis-kezel balrl jobbra s bentrl kifel vgzi. Az albbi pldban egy zrjelek segtsgvel egymsba gyazott mveleteket tartalmaz kifejezst lthatunk: Kifejezs Eredmny (12 * (3 + 4)) - (24 / (10 + ( 6 - 4 ) ) ) 82

A kifjezsben szerepl mveletek vgrehajtsa nem olyan bonyolult, rnint amilyennek tnik. Az adatbzis-kezel a kvetkez sorrendben rtkeli ki a mveleteket:

1. (3 + 4) = 7 2. (12 *7) = 8 4 3. ( 6 - 4 ) = 2

12-vel szorozzuk az els mvelet eredmnyt

4. (10 + 2) = 12 5. (24 / 12) = 2


6. 84 - 2 = 82

10-et hozzadunk a harmadik mvelet eredmnyhez a 24-et elosztjuk a negyedik mvelet eredmnyvel a 84-bl kivonjuk a msodik mvelet eredmnyt

Lthat, hogy a rendszer balrl jobbra halad, de a zrjelek kz zrt kifejezseket bentrl kifel rtkeli ki. Gyakorlatilag a (12 *(3 + 4)) s a (24 / (10 + (6 - 4))) kifejezsek ugyan azon a szinten vannak, ezrt a rendszer a bal oldali kifejezst rtkeli ki elszr, bentrl kifel haladva. Ez utn tovbb halad a msodik zrjelekkel hatrolt kifejezsre, s ezt is elkezdi bentrl kifel haladva kirtkelni. Vgs mveletknt a bal oldali kifejezs eredm nybl kivonja a jobb oldali kifejezs eredmnyt. (Ha gy rezzk, hogy megfjdult a fejnk, akkor j, ha tudjuk, hogy nem vagyunk egyedl!) Br az elz pldban szmliterlokat hasznltunk, ugyanilyen egyszeren hasznlhatunk oszlophivatkozsokat vagy a kett tetszleges kombincijt is. A legfontosabb, amit meg kell jegyeznnk, hogy mindig tervezzk meg s nagy gondossggal lltsuk ssze a mate matikai kifejezsnket, hogy valban az ltalunk vrt eredmnyt adja vissza. Hasznljunk zrjeleket, hogy tisztn jelljk a mveletek vgrehajtsnak sorrendjt - ha odafigye lnk erre, a vrt eredmnyt fogjuk kapni. Amikor matematikai kifejezsekkel dolgozunk, gyzdjnk meg rla, hogy a kifejezsben hasznlt rtkek egymssal sszeegyeztethetk. Ez klnsen igaz az olyan kifejezsekre, amelyek oszlophivatkozsokat tartalmaznak. Erre a clra hasznlhatjuk a CAST fggvnyt, pontosan gy, ahogy azt az sszefz kifejezseknl tettk. Tegyk fel pldul, hogy van egy TotalLength nev oszlopunk, amely INTEGER tpus adatokat trol, s a 345 rtket tar talmazza, valarnint egy oszlopunk Distance nven, amelyben a REAL tpus 138,65 rtk ta llhat. Ahhoz, hogy hozzadjuk a Distance oszlop rtkt a TotalLength oszlop rtkhez, vagy a Distance oszlop rtkt kell INTEGER tpusv alaktanunk a CAST fggvny segts gvel, vagy a TotalLength oszlop rtkt REAL tpusv, attl fggen, hogy vgeredmnyl INTEGER vagy REAL tpus adatot szeretnnk kapni. Ha azt felttelezzk, hogy csak az r tkek egsz rszvel szeretnnk trdni az sszeads sorn, akkor ezt az albbi kifejezssel tehetjk meg: Kifejezs Eredmny

TotalLength + CAST(Distance AS INTEGER) 483

Nem ezt az eredmnyt vrtuk? Akkor valsznleg arra szmtottunk, hogy a 138,65 egsz szmm alaktsa kerektssel trtnik. Az SQL-szabvny lltsa szerint az talaktsok sorn kerektsnek kell trtnnie, ennek ellenre a CAST fggvny az adatbzis-kezel rendszertl fggen ettl eltren mkdhet. A legtbb adatbzis-kezel egyszeren levgja a tizedesjegyeket az egssz alaktskor. Teht a mi rendszernk is valsznleg gy tesz, ezrt a pldban a 345-hz 138-at ad hozz, nem pedig a kerektett rtket, 139-et.

Ha elfelejtettk biztostani az oszlopok rtknek megfelelsgt egy kifejezsben, az adatbzis-kezelnk hibazenetet kldhet, s ha gy tesz, valsznleg megszaktja a kifejezsen bell vgzett tovbbi mveletek vgrehajtst. A legtbb RDBMS rendszer viszont az ehhez hasonl talaktsokat automatikusan kezeli, anlkl, hogy brmilyen figyelmeztetst jelentene meg. Ilyenkor valsznleg az trtnik, hogy az sszes szmr tket automatikusan a legsszetettebb adattpusra alaktja, mieltt kirtkeli a kifejezst. Az elz pldt alapul vve a relcis adatbzis-kezelnk valsznleg legszvesebben a TotalLength oszlopot alaktan REAL tpusv (ez az adattpus sszetettebb a kt adatt pus kzl), majd REAL tpus rtket hasznlna minden INTEGER rtk trolsra, mivel a REAL tpus oszlopokban ezek gond nlkl brzolhatk. Ez azonban valsznleg nem az, amit mi el szeretnnk rni. Azok a relcis adatbzis-kezelk, amelyek nem vgzik el automatikusan ezt az talaktst, ltalban tudatjk, hogy adattpus-eitrsi problma merlt fel, ezrt j, ha tudjuk, mire van szksgnk, hogy kijavtsuk a kifejezst. Teht ahogy azt most megtanultuk, matematikai kifejezseket alkotni viszonylag egyszer, ha eltte sznunk egy kis idt a tervezsre, s tudjuk, hogyan hasznlhatjuk a CAST fggvnyt a cljaink elrsre. Most pedig vizsgljuk meg, hogyan rhatunk olyan kifejezseket, amelyekben dtumokat s idpontokat adunk ssze, illetve vonunk ki egymsbl.

Dtum- s idmveletek
Az SQL-szabvny a dtumok s idpontok esetben az sszeads s a kivons mvelett rtelmezi. Bizonyra meglepdnk, de sok relcis adatbzis-kezel eltren valstja meg ezeket a mveleteket. Nhnyukban ezeket egyszer matematikai kifejezs formjban is megadhatjuk, mg msokban kln beptett fggvnyek vannak erre a clra. Arrl, hogy a mi esetnkben hogyan valsulnak meg ezek a mveletek, a rendszernk dokumentci jbl tjkozdhatunk. A knyvben a dtum- s idkifejezseket ltalnossgban trgyal juk, mert az a clunk, hogy azok mkdsrl adjunk kpet.

Dtumkifejezsek
Az 5.7. bra a dtumkifejezsek szintaxisdiagramjt brzolja, gy, ahogy az az SQL-szab vnyban szerepel. Amint azt megfigyelhetjk, a kifejezsek ltrehozsa nagyon egyszer: vesszk az els rtket, majd hozzadjuk vagy kivonjuk belle a msodikat.

Az SQL-szabvny tovbb lerja az rvnyes mveleteket s a hozzjuk tartoz eredmnyeket: DATE plusz vagy mnusz INTERVAL eredmnyeknt DATE tpust kapunk. DATE mnusz DATE eredmnyeknt INTERVAL tpust kapunk. INTERVAL plusz DATE eredmnyeknt DATE tpust kapunk. INTERVAL plusz vagy mnusz INTERVAL eredmnyeknt INTERVAL tpust kapunk. INTERVAL szorozva vagy osztva NUMBER eredmnyeknt INTERVAL tpust kapunk. Jegyezzk meg, hogy az SQL-szabvny rtelmben csak DATE tpus rtket vonhatunk ki DATE tpusbl, s csak DATE tpus rtket adhatunk INTERVAL tpushoz. Oszlophivatkozsok hasznlatakor gyelnnk kell r, hogy a fentieknek megfelelen DATE vagy INTERVAL tpus rtket tartalmazzanak Ha az oszlop nem megfelel tpus adatot tartalmaz, a CAST fggvny segtsgvel talakthatjuk az sszeadand vagy kivo nand rtkeket. A szabvny konkrtan meghatrozza, hogy ezeket a mveleteket csak a fenti adattpusokkal vgezhetjk el, de sok adatbzis-kezel automatikusan talaktja az oszlopok adatait. Ezrt hogy megtudjuk, szksgnk lesz-e valamilyen talaktsra, tanulmnyozzuk a rendszernk dokumentcijt. Az INTERVAL adattpust csak nhny rendszer tmogatja, viszont kzel mindegyik lehetv teszi egsz szm kivonst vagy hozzadst egy dtumrtkhez. Ezt a mveletet napok hozzadsaknt, illetve kivonsaknt foghatjuk fel. Segtsgvel olyan krdsekre vlaszol hatunk pldul, hogy Milyen dtumot rtunk kilenc nappal ezeltt?' vagy Mi volt az t nappal ezeltti dtum?'. Megemltend mg, hogy nhny rendszer esetben lehetsgnk van trtszmok hozzadsra, illetve kivonsra is. Pldul 3,5-et egy idponthoz hozzad va a Microsoft Access hrom napot s 12 rt ad az idponthoz. Amikor kivonunk egy dtumbl egy msikat, tulajdonkppen a kt dtum kztt eltelt idt kapjuk meg. Pldul ha egy szerzds alrsnak idpontjt kivonjuk a jelenlegi d tumbl, megkapjuk, hogy az alkalmazottunk mennyi ideje dolgozik a cgnl. A szabvny szerint ugyan csak idtartomnyt adhatnnk dtumhoz, sok adatbzis-kezel rendszer (klnsen azok, amelyek nem tmogatjk az INTERVAL adattpust) mgis megengedi, hogy szmot vagy dtumot adjunk hozz. Az ilyen jelleg szmtsok segtsgvel vla szolhatunk pldul egy olyan krdsre, mint a Mikor lesz az alkalmazottunk kvetkez

rtkelse?'.
Knyvnkben egyszer mveleteket mutatunk be dtumok hasznlatval, s felttelezzk, hogy legalbb egsz szmokban kifejezett napokat hozz tudunk adni dtumrtkekhez. Azt is felttelezzk, hogy egy dtumot kivonva egy msikbl a kt dtum kztt eltelt napok szmt kapjuk. Ezeket az egyszer elveket alkalmazva a ksbbiekben gond nlkl megrhatjuk a legtbb dtumkifejezst, amire szksgnk lesz. lljon itt nhny plda dtumkifejezsekre, amelyeket alkalmazhatunk:

Idkifejezsek
Kifejezseket az elzekhez hasonlan idrtkek felhasznlsval is ltrehozhatunk. Az 5.8. brn lthatjuk, hogy a dtum- s idkifejezsek utastsformja nagyon hasonl; a dtumkifejezsekre rvnyes szablyok s korltozsok rvnyesek az idkifejezsekre is.

Az SQL-szabvny tovbb lerja az rvnyes mveleteket s a hozzjuk tartoz eredm nyeket: TIME plusz vagy mnusz INTERVAL eredmnyeknt TIME tpust kapunk. TIME mnusz TIME eredmnyeknt INTERVAL tpust kapunk. INTERVAL plusz vagy mnusz INTERVAL eredmnyeknt INTERVAL tpust kapunk. INTERVAL szorozva vagy osztva NUMBER eredmnyeknt INTERVAL tpust kapunk. Jegyezzk meg, hogy az SQL-szabvny rtelmben csak TIME tpus rtket vonhatunk ki TIME tpusbl, s csak TIME tpus rtket adhatunk INTERVAL tpushoz. Az sszes buktat, amit elmondtunk a dtumkifejezsekkel kapcsolatban, rvnyes az idkifejezsekre is. Tovbb azok a rendszerek, amelyek tmogatjk a dtumot s idt egyarnt tartalmaz DATETIME adattpust, annak idrszt egy nap trtrszeknt kifejezve troljk, legalbb msodperc pontossgig. A DATETIME tpust tmogat rendszerekben az sszeads s kivons sorn ltalban hasznlhatunk trt rtkeket is; pldul a 0,25 hat rt (negyed napot) jelent. A knyv az felttelezi, hogy rendszernk az idliterlok, illetve -oszlopok sszeadst s kivonst is tmogatja. A tizedestrtek hozzadsrl s kivon-

srl viszont semmilyen elfelttelezssel nem lnk. Ismtelten azt kell mondanunk, ellenrizzk a rendszernk dokumentcijt, hogy megtudjuk, hogy az esetnkben mely mveletek tmogatottak. A fentiek tkrben nzznk meg nhny pldt az idkifejezsekre:

'14:00' + '00:22' '19:00' - '16:30' StartTime + '00:19' StopTime - StartTime


Korbban mr mondtuk, hogy a dtum- s idkifejezsekkel csak ltalnossgban fogunk foglalkozni. Az a clunk, hogy az Olvas a dtum- s idkifejezsek lnyegt rtse meg, valamint hogy ltalnos kpet kapjon a ltrehozhat kifejezsek fajtirl Sajnos a legtbb adatbzis-kezel nem valstja meg tkletesen a szabvny elrsait az idkifejezsek esetben, s sok kzlk csak rszlegesen tmogatja a dtumkifejezsekkel kapcsolatos meghatrozsokat. Szerencsre azonban rninden rendszer biztost fggvnyeket a dtu mokkal s idpontokkal val munkhoz. Ezen fggvnyeknek az t legfontosabb rend szerben val megvalstsrl a , C fggelkben tallunk sszefoglalt Melegen ajnlott , tanulmnyozni az adatbzis-kezelnk dokumentcijt, hogy megtudjuk, milyen fggv nyeket tmogat. Most, hogy megismertk a klnfle kifejezsek ltrehozst, kvetkez lpsknt tanuljuk meg hasznlni is ket!

Kifejezsek hasznlata a SELECT zradkban


A kifejezsek hasznlatnak ismerete az egyik legfontosabb, amit megtanulhatunk ebbl a knyvbl. Amikor az SQL nyelvvel dolgozunk majd, szles krben fogunk hasznlni kifejezseket. Pldul minden bizonnyal kifejezseket kell rnunk ahhoz, hogy olyan oszlopot jelentsnk meg egy lekrdezsben, amelynek az rtkt szmtssal kaptuk, megkeressnk egy rtket egy bizonyos oszlopban, szktsk egy eredmnyhalmaz sorainak krt, vagy sszekapcsoljunk kt tblt egy JOIN mvelet segtsgvel. A knyv htralv rszben mindezt (s mg sok egyb dolgot) el fogjuk sajttani. Kezdjk azzal, hogy megnzzk, hogyan hasznlhatunk egyszer kifejezseket a SELECT zradkban. A fejezetben vgig a 4. fejezetben megismert Krelem-Fordts

Tisztzs-SQL -mdszert fogjuk (nha "sznesen" is) hasznlni.

A SELECT zradkban egyszer kifejezsek hasznlatval egyrtelmbb tehetjk az ered mnyhalmazban megjelen informcikat, illetve kiszlesthetjk a kapott informcik krt. Pldul rhatunk kifejezseket, hogy sszefzznk vezetk- s keresztneveket, kiszmoljuk az rt egy termknek, meghatrozzuk, hogy mennyi idt vesz majd ignybe egy projekt vghezvitele, vagy megtudjuk az gyfelnkkel val kvetkez tallkoz dtu mt. Lssuk, hogyan hasznlhatunk egy sszefz kifejezst, matematikai kifejezst vagy dtumkifejezst a SELECT zradkban! Elszr sszefz kifejezsekkel dolgozunk majd.

Az sszefz kifejezsek hasznlata


A matematikai s dtumkifejezsekkel ellenttben az sszefz kifejezseket csak a kapott informcik olvashatsgnak javtsra hasznljuk. Tegyk fel, hogy az albbi krelmet intzzk az adatbzishoz:

" Mutasd meg a jelenleg nlunk dolgozk listjt s a telefonszmaikat!"


Mikzben ezt a krelmet SELECT utastss alaktjuk, nmileg javthatunk az eredmny halmaz kimenetn, ha egy oszlapp fzzk ssze a vezetk- s keresztneveket A krel met pldul gy alakthatjuk t:

Ennek eredmnyekppen egy ehhez hasonl sort fogunk kapni:

Figyeljk meg, hogy azon kvl, hogy sszefztk a keresztnevet egy szkzzel, majd a vezetknvvel, a "Phone Number: " karakterlnc-literlt is hozzfztk a phone number oszlop rtkhez. Ebben a pldban tisztn lthat, hogy milyen knnyen javthatjuk a SELECT utasts olvashatsgt egy sszefz kifejezs segtsgvel Ne felejtsk el, hogy klnbz tpus adatokat is sszefzhetnk a CAST fggvnnyel. Pldul ssze fzhetjk egy szveget tartalmaz oszlop rtkt egy szmot tartalmaz oszlop rtkvel az albbiak mintjra:

Mutasd meg a beszlltk listjt s az azonost szmaikat!''


Fordts - Select the vendor name and vendor ID from the vendors table (Vlaszd ki a beszlltk nevt s a beszlltk azonostjt a beszlltk tbljbl.) Tisztzs - Select the vendor name and vendor ID from the vendors table SQL SELECT 'The ID Number for ' || VendName ||

' is ' || CAST(VendorID AS CHARACTER) FROM Vendors


Az sszefz kifejezs hasznos eszkz lehet egy SELECT utastsban, de csak akkor, ha blcsen hasznljuk. Ha sszefz kifejezseink hossz karakterlnc-literlokat tartalmaznak, ne felejtsk el, hogy ezek a literlok az eredmnyhalmaz minden sorban megjelennek, ez az ismtld informci pedig inkbb sszezavarja a vgeredmnyt, ahelyett hogy kiegsz ten azt. Ezrt megfontoltan dntsnk a literlok hasznlatrl az sszefz kifejezsekben, hogy valban megknnytsk a munknkat.

A kifejezsek elnevezse
Amikor egy SELECT zradkban kifejezst hasznlunk, az eredmnyhalmaz j oszloppal bvl, amelyben megjelenik a kifejezsben meghatrozott mveletek rtke. Ezt az j oszlopot szmtott oszlopnak (vagy szrmaztatott oszlopnak nevezzk). Az albbi SELECT utasts eredmnyhalmaza pldul hrom oszlopot fog tartalmazni - kt valdi oszlopot s egy szmtott oszlopot: SQL

SELECT EmpFirstName || ' ' || EmpLastName, EmpPhoneNumber, EmpCity FROM Employees

A kt valdi oszlop termszetesen az EmpPhoneNumber s az EmpCity, a szmtott oszlop pedig az sszefz kifejezs eredmnyekppen ll el a SELECT zradk elejn. Az SQL-szabvnynak megfelelen az j oszlopot el is nevezhetjk (nem ktelez) az AS kulcssz hasznlatval. (Gyakorlatilag brmely oszlophoz j nevet rendelhetnk az AS zradk segtsgvel.) Mindazonltal majdnem minden adatbzis-kezel rendszer megk veteli a szmtott oszlopok elnevezst. Nhnyuk konkrt nvadst ignyel, mg msok automatikusan lltanak el egy nevet. Nzznk utna, hogy a rendszernk hogyan kezeli ezt, mieltt munkhoz ltunk a pldkkal. Ha a ksbbiekben hivatkozni szeretnnk egy kifejezs eredmnyre egy lekrdezsben, mindenkppen nevet kell adnunk neki. A kifejezsek elnevezsnek utastsformjt az 5.9. bra mutatja. Nvknt brmilyen rvnyes karakterlnc-literlt hasznlhatunk (aposztrfok kz zrva). Nhny adatbzis kezel nem foglalkozik ezzel a kvetelmnnyel a kifejezs ellenrzsekor, s az aposztr fokat csak akkor kveteli meg, ha az adott nv szkzket tartalmaz. Mi azonban ersen javasoljuk, hogy kerljk a szkzk hasznlatt a nevekben, ezek ugyanis nhny adat bzis-kezel programozsi nyelvben megnehezthetik a dolgunkat.

5.8. bra

A kifejezsek elnevezsnek szintaxisdiagramja


Most pedig mdostsuk az elz plda SELECT utastst, s adjunk nevet az sszefz kifejezsnek: SQL

SELECT EmpFirstName || ' ' || EmpLastName AS EmployeeName, EmpPhoneNumber, EmpCity FROM Employees

A SELECT utasts eredmnyhalmaza most mr hrom oszlopot tartalmaz, EmployeeName, EmpPhoneNumber s EmpCity nven. Az AS kulcssz segtsgvel nem csak a kifejezse ket nevezhetjk el, de lnevet is rendelhetnk egy valdi oszlophoz. Tegyk fel, hogy van egy DOB nev oszlopunk, s attl tartunk, hogy nhny felhasznlnk nem lesz tisztban ennek a rvidtsnek a jelentsvel. Szerencsre minden flrertst tisztzhatunk egy lnv megadsval: SQL

SELECT EmpFirstName || ' ' || EmpLastName AS EmployeeName, DOB AS DateOfBirth FROM Employees

Ez a SELECT utasts egy kt oszlopbl ll eredmnyhalmazzal tr vissza, amelyek az EmployeeName s DateOfBirth nevet viselik. Ezzel gyakorlatilag minden lehetsges flrertst tisztztunk a megjelen informcikkal kapcsolatban. A szmtott oszlopok elnevezse kis mrtkben befolysolja a jl bevlt fordtsi folyamatot. Az elz plda krelmnek lefordtsa pldul gy trtnhet:

Adj egy listt az alkalmazottak nevvel s szletsk dtumval!


Fordts - Select first name and last name as employee name and DOB as date of birth from the employees table (Vlaszd ki a keresztnevet s a vezetknevet EmployeeName (alkalmazott neve) nven s a DOB rtkt DateOfBirth (szletsi dtum) nven az al kalmazottak tbljbl.) Tisztzs - Select first name and || ' ' || last name as EmployeeName and DOB as DateOfBirth from the employees table SQL SELECT EmpFirstName || ' ' || EmpLastName

AS EmployeeName, DOB AS DateOfBirth FROM Employees

Ha mr egy kis gyakorlatot szereztnk a kifejezsek hasznlatban, nem lesz szksgnk r, hogy ilyen konkrtan kidolgozzuk a lefordtott utastsokat, amint azt az elzekben tet tk. A kifejezseket kzvetlenl a SELECT utasts rsa sorn knnyedn kpesek lesznk azonostani s megfogalmazni.

A knyv htralv rszben az SQL-utastsokban szerepl szmtott oszlopokat mindig megfelelen elnevezzk majd.

A matematikai kifejezsek hasznlata


A matematikai kifejezsek minden bizonnyal a legsokoldalbbak a kifejezsek hrom tpusa kzl, s valsznleg nagyon gyakran hasznljuk majd ket. Pldul matematikai kifejezseket hasznlunk, hogy sszegezzk egy sor elemeit, hogy meghatrozzuk, mennyi az tlagos pontszma bizonyos tesztsorozatoknak, hogy kiszmoljuk az eltrst kt laboratriumi eredmny kztt, vagy hogy megbecsljk egy plet befogadkpes sgt. A mkdkpes kifejezsek rsnak az a trkkje, hogy nmi figyelmes tervezs elzze meg. Az albbiakban egy pldt lthatunk a matematikai kifejezsek hasznlatra egy SELECT utastsban:

''Jelentsd meg minden gynk nevt s vrhat bevtelt (alapbr s teljestmnyar nyos juttatsok), felttelezve, hogy minden gynk 50 000 dollr rtk megrendelst szerez!''
Fordts - Select first name and last name as agent name and salary plus 50000 times commission rate as projected income from the agents table (Vlaszd ki a keresznevet s vezetknevet AgentName (gynk neve) n ven s az alapbrt sszegezve az rtkestsi hnyados 50 000-szeresvel Projected Income (tervezett bevtel) nven az gynkk tbljbl.) Tisztzs - Select first name and || ' ' || last name as AgentName and salary plus + 50000 times * commission rate as Projected Income from the agents table (- Ne szokd meg, hogy mindig szpen ki lesz sznezve!) SQL SELECT AgtFirstName || ' ' || AgtLastName AS AgentName, Salary + (50000 * CommissionRate) AS ProjectedIncome FROM Agents; Figyeljk meg, hogy zrjelezssel tettk egyrtelmv, hogy az rtkestsi hnyadost kell megszoroznunk 50 000-rel s utna hozzadni az alapbrhez, s nem az 50 000-ret hozz adni az alapbrhez s aztn megszorozni az rtkestsi hnyadossal. Amint a pldbl lthat, nincs olyan megkts, hogy csak egyfle kifejezst hasznlhatunk a SELECT utas tsokban, st kifejezsek szles vlasztkt alkalmazhatjuk, hogy lekrjk a szksges informcikat az eredmnyhalmazban. Az elz SQL-utastst gy is lerhatjuk:

SQL

SELECT AgtFirstName || ' ' || AgtLastName || ' has a projected income of ' || CAST(Salary + (50000 * CommissionRate) AS CHARACTER) AS ProjectedIncome FROM Agents

A matematikai kifejezsek segtsgvel lekrdezhet informcik kre szinte vgtelen, de mindig meg kell terveznnk a kifejezseinket, s szksg esetn hasznlnunk kell a CAST fggvnyt.

A dtumkifejezsek hasznlata
A dtumkifejezseket a matematikai kifejezsekkel megegyez mdon hasznlhatjuk: egyszeren rtkeket adunk ssze vagy vonunk ki egymsbl. A legklnbzbb felada tok sorn lthatjuk hasznukat: meghatrozhatjuk egy szllts becslt dtumt, egy projekt befejeztig htralv napok szmt vagy a kvetkez tallkoz idpontjt egy gyfelnk kel. Az albbi plda egy dtumkifejezs hasznlatt szemllteti egy SELECT zradkban:

Hny napot vett ignybe az egyes megrendelsek teljestse?'


Fordts - Select the order number and ship date minus order date as days to ship from the orders table (Vlaszd ki a rendels szmt s a teljests dtumt mnusz a rendels d tumt DaysToShip (teljestsi id) nven a rendelsek tbljbl.) Tisztzs - Select the order number and ship date minus - order date as

DaysToShip from the orders table


SQL

SELECT OrderNumber, CAST(ShipDate - OrderDate AS INTEGER) AS DaysToShip FROM Orders

Az idkifejezsek esetben ugyangy jrhatunk el:

Mi lenne az egyes rk kezdsi idpontja, ha az rkat tz perccel ksbb kezdennk a jelenlegi kezdsi idpontnl?''
Fordts - Select the start time and start time plus 10 minutes as new start time from the classes table (Vlaszd ki a kezdsi idpontot s a kezdsi idpont plusz 10 percet NewStartTime (j kezdsi idpont) nven az rk tbljbl.) Tisztzs - Select the start time and start time plus + 00:10 minutes as

NewStartTime from classes table


SQL

SELECT StartTime, StartTime + ' 0 0 : 1 0 ' AS NewStartTime FROM Classes

Ahogy korbban emltettk, minden adatbzis-kezel rendszer biztost fggvnyeket a dtummveletekhez. A knyvben tletet adtunk, hogyan hasznlhatjuk a dtumokat s idpontokat a SELECT utastsokban, de ismt meg kell jegyeznnk, hogy tancsos tta nulmnyozni az adatbzis-kezelnk dokumentcijt a dtum- s idfggvnyekkel kap csolatos rszletek megismerse vgett.

Egy rvid kitr: rtkkifejezsek


Mr tudjuk, hogyan hasznljunk oszlophivatkozsokat, literlis rtkeket s kifejezseket egy SELECT zradkban. Azt is tudjuk, hogyan rendelhetnk nevet egy oszlophivatkozs hoz vagy kifejezshez. Most meg fogjuk ltni, hogyan vlik mindez egy nagyobb rendszer rszv. Az SQL-szabvny az oszlophivatkozsokra, literlis rtkekre s kifejezsekre egyttesen rtkkifejezs nven hivatkozik. Az 5.10. bra bemutatja, hogyan adhatunk meg rtkkifejezseket.

5.10. bra
Az rtkkifejezsek szintaxisdiagramja

Vizsgljuk meg kzelebbrl az rtkkifejezsek alkotelemeit: Az rtkkifejezs egy nem ktelez plusz- vagy mnuszjellel kezddik. Ezeket a je leket akkor kell megadnunk, ha azt szeretnnk, hogy az rtkkifejezs egy eljeles rtkkel trjen vissza. Az rtk maga lehet szmliterl, szm tpus oszlop rtke, fggvnyhvs, amely szmmal tr vissza (lsd a CAST fggvnynl lertakat a feje zet korbbi rszben) vagy egy matematikai kifejezs visszatrsi rtke. A pluszs mnuszjelet a karakteres tpus adatokat visszaad kifejezsek esetben nem hasznlhatjuk Megfigyelhetjk, hogy az els felsorols az brn tartalmazza az (rtkkifejezs) elemet is. Ez azt jelenti, hogy sszetett rtkkifejezseket is ltrehozhatunk, amelyek ms rtkkifejezseket foglalnak magukba. Ezeknek szintn meglehetnek a sajt sszefz vagy matematikai mveletei. Zrjelezssel knyszerthetjk az adatbzis-kezelt, hogy egy bizonyos rtkkifejezst rtkeljen ki elszr. Az rtkkifejezsek kvetkez eleme a mveleti jel. Amint a bels tblzatban lthatjuk, az utastsforma elejn szerepl kifejezs tpusa hatrozza meg, hogy mely mveletek hasznlatra van lehetsgnk.

Nem, nem kprzik a szemnk: a mveleti jel utn ismtelten kvetkezhet egy rtkkifejezs. Az, hogy egy rtkkifejezsen bell hasznlhatunk ms rtkkife jezseket, nagyon sszetett kifejezsek ltrehozst teszi lehetv. Egyszeren fogalmazva teht az rtkkifejezs olyan rtket ad vissza, amelyet az SQLutastsunk valamelyik sszetevje hasznl majd. Az SQL-szabvny a legklnbzbb utastsokban s elemekben rja le az rtkkifejezsek hasznlatt. Akrhol is hasznljuk, egy rtkkifejezst mindig a fent lert mdon pthetnk fel. Hogy mindezt jobban el tudjuk kpzelni, az albbiakban megfigyelhetjk az rtkkifejezs hasznlatt egy SELECT utastsban. Az 511. bra a SELECT utasts szintaxisdiagramjnak (4. fejezet, 4.9. bra) mdostott vltozatt mutatja be. Az j forma nagyon rugalmas: lite rlok, oszlophivatkozsok, kifejezsek vagy ezek tetszleges kombincijnak hasznlatt teszi lehetv egyetlen SELECT utastsban. Az rtkkifejezseinket el is nevezhetjk az AS kulcssz hasznlatval

5.11. bra Az rtkkifejezst tartalmaz SELECT utastsok szintaxisdiagramja


A knyv tovbbi rszben rtkkifejezs alatt oszlophivatkozst, literlis rtket vagy kifejezst rtnk (termszetesen ezek kzl a megfelelt). A ksbbi fejezetekben azt is trgyaljuk, hogyan hasznlhatjuk az rtkkifejezseket ms utastsokban, s bemutatunk nhny tovbbi dolgot, amit egy rtkkifejezs kifejezhet. Most pedig trjnk vissza az eredeti menetrendnkhz!

A semmit" jelkpez rtk: a Null


Mint azt mr tudjuk, a tblk oszlopokbl s sorokbl llnak. Minden oszlop a tbla ltal lert dolog egy tulajdonsgt kpviseli, mg az egyes sorok az adott dolog egy konkrt pldnyt jelkpezik. A sorokat az oszlopok rtkeinek teljes halmazaknt is felfoghatjuk - minden sor pontosan egy rtket tartalmaz a tbla minden oszlopbl A 5.12. bra egy jellemz tblt szemlltet

Az eddigiekben megismertk, hogy krdezhetnk le informcikat egy tblbl a SELECT utasts segtsgvel, s hogyan mdosthatjuk ezeket kifejezsek hasznlatval. Mindez grdlkenyen ment eddig, mivel azt feltteleztk, hogy a tbla minden oszlopa tartalmaz adatokat. Az 5.12. bra azonban jl szemllteti, hogy elfordulhatnak sorok, amelyekben egyes oszlopok nem tartalmaznak rtket. Attl fggen, hogy miknt szeretnnk felhasz nlni az adatokat, ezeknek az rtkeknek a hinya klnbzkppen rintheti a SELECT utastsainkat s rtkkifejezseinket Mieltt rszletesen kifejtjk, mire cloznak az elz mondatok, vizsgljuk meg, hogyan viszonyul az SQL a hinyz rtkekhez!

Bemutatkozik a Null rtk


Az SQL-ben a Null a hinyz vagy ismeretlen rtkeket testesti meg. Tudnunk kell, hogy a Null nem azonos sem a nullval, sem pedig az egy vagy tbb szkzt tartalmaz vagy nulla hosszsg karakterlncokkal. Ennek oka egszen egyszer: A nulla rtknek szmtalan jelentse lehet: vonatkozhat szmlaegyenlegre, a rendel kezsre ll els osztlyra szl jegyek mennyisgre, vagy hogy hny darab van raktron egy bizonyos termkbl. Egy vagy tbb szkz karakter pedig - br sz munkra nem sok jelentssel br - az SQL szmra egyltaln nem rtelmetlen: egy hrom szkzbl ll karakterlnc (' ') ppen gy teljes rtk karakteres adatnak szmt, mint egy betkbl ll karakterlnc (' karakterlnc'). A nulla hosszsg karakterlnc azaz kt egymst szkzk nlkl kvet aposzt rf (' ') is bizonyos esetekben szintn jelentssel brhat. Egy alkalmazottak adatait trol tblban a KzpsNv oszlopban szerepl nulla hosszsg karakterlnc pldul azt jelentheti, hogy az adott alkalmazottnak nincs kzps neve. J ha tud juk azonban, hogy egyes adatbzis-kezelk (pldul az Oracle) a VARCHAR tpus mezkben lev nulla hosszsg karakterlncokat Null-nak tekintik.

A Null rtk megfelelen hasznlva egszen hasznos lehet. Az 5.12. bra Customers (Vsrlk) tblja nagyon j plda erre. A CustCountry oszlopban minden resen hagyott mez egy hinyz vagy ismeretlen llamnevet jelent az adott sor esetben, ahol feltnik. A Null rtkek helyes hasznlathoz meg kell rtennk, hogy honnan szrmaznak. A hinyz rtkek ltalban emberi hiba eredmnyei. Tekintsnk pldul a Robert Brown nevt tartalmaz sorra: Brown r adatainak rgztse sorn elfelejtettk megkrdezni, hogy melyik llamban l. Ez az adat teht hinyozni fog, az adatbzisban pedig Null rtkknt jelenik meg. Ksbb termszetesen szrevehetjk a hibt, s megkrdezhetjk Brown rtl, hogy melyik llamban is lakik. Egy tblban tbb okbl is elfordulhatnak ismeretlen rtkek. Az egyik ok lehet pldul, hogy az oszlopban szerepl rtk mg nem ismert az adatok rgztsekor. Pldul ha van egy Categories (Tantrgycsoportok) nev tblnk a School Scheduling (Iskolai nyilvntarts) adatbzisban, akkor az valsznleg mg nincs kitltve az jonnan indul rk esetben, amelyeket majd csak az szi flvben szeretnnk meghirdetni. A msik helyzet, amikor is meretlen rtkek fordulhatnak el egy tblban, ha az adott rtk valban ismeretlen a sz munkra. Tekintsk meg ismt az 5.12. bra Costumers tbljt, azon bell is a Dean McCrae nevt tartalmaz sort. Tegyk fel, hogy McRae r adatainak rgztsekor megkrdezzk tle, hogy melyik llamban l. Ha egyiknk sem tudja, hogy az adott vros melyik llamhoz tartozik, akkor a Country oszlop rtke ebben a sorban tnylegesen ismeretlennek mond hat. Ez a sorban egy Null rtk formjban nyilvnul majd meg. Ez termszetesen ksbb javthat, ha valamelyiknk utnanz az llam nevnek. Egy oszlop rtke akkor is Null lesz, ha semmilyen rtk nem megfelel a szmra az adott sor esetben. Pldul ha egy olyan alkalmazotti tblval van dolgunk, amely tar talmaz egy HaviBr s egy radj nev oszlopot is, valamelyik oszlop rtke a kett kzl mindig Null lesz, hiszen nem fizethetnk valakinek egyszerre havi meghatrozott sszeget s rabrt is. Fontos megemltennk, hogy nagyon vkony a hatr akztt, hogy egy adat nem rtelme zett" s akztt, hogy nem rtelmezhet". Az elz pldban a kt oszlop kzl az egyik nem rtelmezett. De tegyk fel, hogy egy gyfltblval akad dolgunk, amely tartalmaz egy Hajszn nev oszlopot, s ppen frisstnk egy sort, amely egy mr ltez frfi gyfelnk adatait tartalmazza. Abban az esetben, ha az gyfelnk kopasz, az oszlop rtke nem rtel mezhet. Br hasznlhatnnk Null rtket is a nem rtelmezhet rtkek kifejezseknt, a hasonl helyzetekben egy ltez rtk pldul Nem rtelmezhet (angol krnyezetben ltalban az N/A - Not Applicable rtket hasznljk ilyen esetekben) alkalmazst java soljuk Ez hossz tvon jobban rthetv teszi az informcikat Amint lthattuk, az, hogy engedlyezzk-e a Null rtkek megjelenst egy tblban, attl fgg, hogyan szeretnnk majd feldolgozni az adatokat. Miutn megismerkedtnk a Null rtkek pozitv tulajdonsgaival, foglalkozzunk kicsit az rnyoldalukkal is!

A Null rtkek htulti


A Null rtkek legfbb htultje, hogy kedveztlenl viselkednek a matematikai mvele tek sorn. Minden mvelet, amelyben egy Null rtk is felbukkan, Null rtket ad eredm nyl. Ennek logikja a elfogadhat ha egy bizonyos rtk ismeretlen, akkor a mvelet vgeredmnye is szksgszeren ismeretlen lesz. Figyeljk meg, hogyan befolysolja a Null rtk a mvelet eredmnyt a kvetkez pldban:

(25 * 3) + 4 = 79 (Null * 3 ) + 4 = Null ( 2 5 * Null) + 4 = Null ( 2 5 *3) + Null = Null


Ha a mvelet Null rtket is tartalmaz, minden esetben azonos eredmnyt kapunk. Tegyk fel pldul, hogy vgrehajtjuk az albbi SELECT utastst, s az az 5 . 1 3 . brn lthat ered mnyhalmazzal tr vissza: SQL

SELECT ProductID, ProductDescription, Category, Price, QuantityOnHand, Price * QuantityOnHand AS TotalValue FROM Products

5.13. bra
A null rtkek viselkedse matematikai mveletekben A mvelet, amely a TotalValue oszlopban megjelen rtket adja, sikeresen vgrehajtdik,

amg a Price s QuantityOnHand oszlopok rvnyes szmrtkeket tartalmaznak. Egyb esetben a QuantityOnHand oszlop Null-t ad eredmnyl A j hr az, hogy a TotalValue oszlop a megfelel rtket fogja tartalmazni, ha a Price s QuantityOnHand mezk Null rtkeit rvnyes szmokkal helyettestjk. A problma teljes egszben elkerlhet, ha gyelnk r, hogy a matematikai kifejezsekben rszt vev oszlopok ne tartalmazzanak Null rtkeket. Nem most beszltnk utoljra a Null rtkekrl. A 12. fejezetben azt is megnzzk, hogy miknt hatnak a Null-ok az informcikat sszegz SELECT utastsokra.

Pldk
Most, hogy tudjuk, hogyan hasznlhatunk klnfle kifejezseket a SELECT utasts SELECT zradkban, tekintsk t a kvetkez nhny oldalon szerepl pldkat, amelyek a mintaadatbzisok tblit hasznljk. A pldk szemlltetik, hogyan hasznlhatjuk a kifeje zseket kimeneti oszlopok ellltsra. Ezenkvl ksztettnk az eredmnyhalmazokbl is mintkat; ezek kzvetlenl az SQLutastsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ugyanaz, mint a CD-mellkleten tallhat megfelel SQL-lekrdezs neve. Minden lekrdezst a megfe lel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz le krdezsek neve ,,CH05-tel kezddik. A pldkat a knyv elejn tallhat bevezets tmutatst kvetve tlthetjk be s prblhatjuk ki.

A kvetkez pldkban sszevontuk a Fordts s Tisztzs lpseit, hogy megszokjuk, hogyan vgezhetjk el tmrebb formban a mve letet. A fejezetek trzsben ugyanakkor tovbbra is a hromlpses mdszert hasznljuk majd, de a pldk sorn mr alkalmunk nylik gyakorolni a tmrebb megoldst is.

Sales Orders adatbzis


Mennyi az egyes termkeink leltri rtke?''
Fordts/ Tisztzs SQL Select the product name, retail price times * quantity on hand as InventoryValue from the products table

SELECT ProductName, RetailPrice * QuantityOnHand AS InventoryValue FROM Products

CH05_Product_lnventory_Value (40 sor)

Hny nap telt el a rendels s a teljests dtuma kztt az egyes rendelsek esetben?'
Fordts/ Tisztzs SQL Select the order number, order date, ship date, ship date minus - order date as DaysElapsed from the orders table

SELECT OrderNumber, OrderDate, ShipDate, CAST(ShipDate - OrderDate AS INTEGER) AS DaysElapsed FROM Orders

Entertainment Agency adatbzis


Mennyi ideig tartanak az egyes rendezvnyek?'
Fordts/ Tisztzs SQL Select the engagement number, end date minus - start date plus one + 1 as DueToRun from the engagements table

SELECT EngagementNumber, CAST(CAST(EndDate - StartDate AS INTEGER) + 1 AS CHARACTER) || ' day(s)' AS DueToRun FROM Engagements

Azrt kell hozzadnunk egyet a dtumok klnbsghez a kifejezs ben, mert a krds arra vonatkozik, hogy hny napig tart egy-egy rendezvny, gy msklnben 0 napos idtartamot kapnnk az egyazon dtummal kez dd s vgzd rendezvnyek esetben. A kivons eredmnyt a CAST-fggvny segts gvel alaktjuk t INTEGER tpusra, hogy az l hozzadst el tudjuk vgezni. Ez utn ismt a CAST hasznlatra van szksg, hogy CHARACTER tpusv alaktsuk az rtket az sszefzshez.

Mennyi az egyes szerzdseink nett rtke?'


Fordts/ Tisztzs SQL Select the engagement number, contract price, contract price times * 0.12 as OurFee, contract price minus (contract price times * 0.12) as NetAmount from the engagements table

SELECT EngagementNumber, ContractPrice, ContractPrice * 0.12 AS OurFee, ContractPrice -(ContractPrice * 0.12) AS NetAmount FROM Engagements;

School Scheduling adatbzis


rd ki, hogy 2007. oktber 1-ig a tanri kar egyes tagjai hny vet tltttek az iskola csapatban, az eredmnyt pedig rendezd kereszt- s vezetknv szerint!' Fordts/ Select last name || ', ' || and first name concatenated with a Tisztzs comma as Staff, date hired, and ((2007-10-01 minus - date hired) divided by/365) as YearsWithSchool from the staff table and sort order by last name and first name
SQL

SELECT StfLastName || ', ' || StfFirstName AS Staff, DateHired, CAST(CAST('2007-10-01' - DateHired AS INTEGER) / 365 AS INTEGER) AS YearsWithSchool FROM Staff ORDER BY StfLastName, StfFirstName

A fenti SELECT utastsban lv kifejezs formailag tkletes, s az elv rsainknak megfelelen mkdik, de szkvek esetn rossz vlaszt ad. A problma az adatbzis-kezelnk ltal biztostott megfelel dtumkezel-fggvny hasz nlatval hidalhat t. Amint azt korbban emltettk, a legtbb adatbzis-kezel rend szer a sajt tagfggvnyeit hasznlja a dtumokkal s idpontokkal val mveletekhez. Sorold fel a tanri kar tagjait a brkkel s egy tervezett 7 szzalkos jutalommal egytt!'' Fordts/ Select the last name || ', ' || and first name as StaffMember, Tisztzs salary and salary times * 0.07 as Bonus from the staff table

SQL

SELECT StfLastName || ', ' || StfFirstName AS Staff, Salary, Salary * 0 . 0 7 AS Bonus FROM Staff

Bowling League adatbzis


,,Sorold fel az sszes tekejtkost s a lakcmeiket egy levelezsi cmlistnak megfelelen formzva s irnytszm szerint rendezve!'' (Ezt itt alul tisztzd le magad!)
Fordts/ Tisztzs SQL Select first name || ', ' || and last name as FullName, BowlerAddress, city || ', ' || state || ' ' || and ZIP Code as CityStateZip from the bowlers table and order by ZIP Code

SELECT BowlerFirstName || ' ' || BowlerLastName AS FullName, Bowlers.BowlerAddress, BowlerCity || ', ' || BowlerState || ' ' || BowlerZip AS CityStateZip FROM Bowlers ORDER BY BowlerZip

Mennyi volt az egyes mrkzsek s jtszmk sorn a klnbz tekejtkosok bntetpontokkal terhelt s tiszta pontszma kztti klnbsg?
Fordts/ Tisztzs Select bowler ID, match ID, game number, handicap score, raw score, handicap score minus - raw score as PointDifference from the bowler scores table and order by bowler ID, match ID, game number

SQL

SELECT BowleriD, MatchiD, GameNumber, HandiCapScore, RawScore, HandiCapScore - RawScore AS PointDifference FROM Bowler_Scores ORDER BY BowleriD, MatchiD, GameNumber

sszefog(lal)s
A fejezetet a kifejezsek rvid ttekintsvel kezdtk, majd kifejtettk, hogy az adattpusok megrtse nagyon fontos, mieltt kifejezsek felptsbe fognnk, s megismertk az sszes fontos adattpust, amellyel a ksbbiekben tallkozhatunk. Ez utn megtanultuk a CAST fggvny hasznlatt, s megtudtuk, hogy gyakran hasznljuk majd kifejezsekben az adatok tpusnak megvltoztatsra, hogy azok sszeegyeztethetk legyenek a kifejezs ltal elvrt adattpusokkal. Ezt kveten sorra vettk az sszes lehetsges mdszert, ahogyan egy lland rtket egy literlt - felhasznlhatunk a kifejezsekben, majd megismertk, hogy miknt hasznl hatjuk a kifejezseket az adatbzisbl lekrdezett informcik krnek bvtsre s szktsre. Megtanultuk, hogy a kifejezs olyan mvelet, amelynek rszeknt szmokat, karakterlncokat, dtumokat s idpontokat egyarnt alkalmazhatunk. Ez utn folytattuk a kifejezsek trgyalst, s behatbban megismerkedtnk azok tpusai val. Lttuk, hogyan fzhetnk ssze karakterlncokat egymssal, s hogyan fzhetjk ket ssze ms adattpusokkal a CAST fggvny segtsgvel. Megismerkedtnk a mate matikai kifejezsekkel, s megtanultuk, hogy a mveletek vgrehajtsi sorrendje hogyan befolysolja a mveletek vgeredmnyt. Ezt a rszt a dtum- s idkifejezsek trgyal sval zrtuk. Miutn megismertk, hogy az SQL-szabvny hogyan kezeli a dtumokat s idpontokat, azt is megtudtuk, hogy az adatbzis-kezelk ltalban sajt, egyedi tagfgg vnyeket nyjtanak a dtumokkal val munkhoz. Ez utn tovbblptnk a kifejezsek SELECT utastsokban val hasznlatt bemutat tmakrre, s megtanultuk, hogyan gyazhatjuk a kifejezseinket a SELECT zradkba. Lttuk, hogyan hasznlhatunk egyidejleg literlokat s oszlophivatkozsokat a kifejez sekben, valamint hogy miknt adhatunk nevet a kifejezsek eredmnyt tartalmaz oszlo poknak. Mieltt lezrtuk volna a tmt, tettnk egy rvid kitrt, s megismerkedtnk az rtkkifejezs fogalmval. Kiderlt, hogy az SQL-szabvny ezen a nven hivatkozik egyttesen az oszlophivatkozsokra, literlis rtkekre s kifejezsekre a klnfle SQLzradkokban. (Termszetesen errl ksbb tbbet is megtudhatunk majd.) A fejezetben vgezetl a Null rtket trgyaltuk Megtanultuk, hogy a Null hinyz vagy is meretlen rtket jell. Megfigyelhettk a Null rtkek helyes hasznlatt, s megtudhattuk, hogy megfelelen alkalmazva a Null rtkek nagyon hasznosak lehetnek a szmunkra. Megismerkedtnk ugyanakkor a Null rnyoldalval is, vagyis azzal, hogy a Null kedvezt lenl befolysolhatja a matematikai mveletek eredmnyt. Megtanultuk, hogy minden Null rtkeket rint matematikai mvelet Null eredmnnyel tr vissza, valamint azt, hogy miknt tehetik a Null rtkek az eredmnyhalmazunkat pontatlann.

A kvetkez fejezetben annak az elvrl olvashatunk, hogy miknt krdezhetjk le adatok meghatrozott csoportjt, majd megismerkednk a WHERE zradkkal, amellyel szrhetjk a SELECT utasts ltal szolgltatott informcikat A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak
a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis 1. Mi lenne, ha cskkentennk a termkeink rt 5 szzalkkal?''


A megolds itt tallhat: CH05_Adjusted_Wholesale_Prices (90 sor).

2. ,,Mutasd meg az egyes vsrlk rendelseit cskken dtumsorrendben!"


(Tipp: valsznleg tbb oszlop szerint is rendeznnk kell az informcikat a megfelel vgeredmnyhez.) A megolds itt tallhat: CH05_0rders_By_Costumer_And_Date (944 sor).

3. lltsd ssze a beszlltk neveinek teljes kr listjt a cmeikkel egytt,


a beszllt neve szerint rendezve!"
A megolds itt tallhat: CH05_Vendors_Addresses (10 sor).

Entertainment Agency adatbzis 1. Add meg az sszes megrendelnk nevt, vros szerint rendezve!''
(Tipp: valsznleg szksgnk lesz egy ORDER BY zradk hasznlatra az egyik oszlopon.) A megolds itt tallhat: CH05_Customers_By_City (15 sor).

2. Sorold fel az sszes eladt s a webhelyeik cmt!''


A megolds itt tallhat: CH05_Entertainer_Web_Sites (13 sor).

3. Mutasd meg az egyes gynkeink els hat hnapos teljestmnyrtkelsnek


dtumt!"
A megolds itt tallhat: CH05_First_Performance_Review (9 sor).

School Scheduling adatbzis 1. Sorold fel a tanri kar tagjait brezs szerint cskken sorrendben!" A megolds itt tallhat: CH05_Staff_List_By_Salary (27 sor). 2. Sorold fel a tanri kar tagjait a telefonszmaikkal egytt! A megolds itt tallhat: CH05_Staff_Member_Phone_List (27 sor). 3. rd ki az sszes hallgat nevt, s rendezd ket a lakhelyk vrosa szerint!" A megolds itt tallhat: CH05_Students_By_City (18 sor). Bowling League adatbzis 1. Mutasd meg a kvetkez vi tornk dtumt az sszes tornahelysznhez?'' A megolds itt tallhat: CH05_Next_Years_Tourney_Dates (14 sor). 2. rd ki a bajnoksg minden rsztvevjnek nevt s telefonszmt!'' A megolds itt tallhat: CH05_Phone_List (32 sor). 3. Mutasd meg az sszes csapat felllst!" A megolds itt tallhat: CH05_Team_Lineups (32 sor).

Az adatok szrse
Van hat becsletes szolgm (Mindent tlk tudok) Nevk Mi, Mirt s Hogyan s Hol s Ki s Mikor." Rudyard Kipling "I keep six honest-serving men

A fejezet tmakrei
A lekrdezsek finomtsa a WHERE segtsgvel A keressi felttelek megfogalmazsa Tbb felttel hasznlata Visszatrs a Null-okhoz: egy figyelmeztet megjegyzs Felttelek ms megfogalmazsban Pldk sszefoglals nll feladatok

Az elz kt fejezetben megtrgyaltuk, hogy mely mdszerekkel krdezhetjk le az sszes adatot egy adott tblbl. Szba kerlt az is, hogy miknt alkothatunk olyan kifejezseket, amelyekkel bvthetjk vagy szkthetjk a keresett informcik halmazt. Ebben a fejezet ben megmutatjuk, hogyan lehet finomhangolni az informci szrst a WHERE zradk hasznlatval.

A lekrdezsek finomtsa a WHERE segtsgvel


Az eddig hasznlt SELECT utastsok egy adott tbla minden sort visszaadtk az utasts eredmnyeknt. Ez nagyszeren mkdik, ha a tbla sszes informcijra szksgk van, de mit tegynk, ha csak azokra a sorokra van szksgnk, amelyek egy adott sze mlyhez vagy helyhez kapcsoldnak, vagy egy adott szmrtkhez, illetve idszakhoz

kthetk? Ezek Cseppet sem szokatlan krdsek. Valjban ezek bjnak meg azon krd seink sokasga mgtt, amelyeket nap mint nap feltesznk az adatbzis-kezelnek. El fordulhatnak pldul a kvetkez krelmek: Kik a vsrlink Seattle-ben? Mutass egy friss listt a bellevue-i alkalmazottainkrl a telefonszmukkal egytt!" Milyen zenei rkat knlunk jelenleg.?" Adj egy listt a hrom kreditet r zenei rinkrl!" Mely eladknak van honlapjuk?" Adj egy listt a Caroline Coie Trio lekttt fellpseirl!" Adj egy listt azokrl a vsrlkrl, akik mjusban rendeltek valamit!" Kiket vettnk fel 1985. mjus 16-n?" Mi a Red Rooster Lanes turnjnak jelenlegi idbeosztsa? Mely tekzk vannak az ts csapatban?" Az ilyen krdsek megvlaszolshoz megint bvtennk kell az SQL-szkincsnket: most egy zradkot (clause) adunk a SELECT utastshoz, mgpedig a WHERE zradkot.

A WHERE zradk
A WHERE zradk a SELECT utastssal egytt hasznlhat, egy tblbl lekrdezett adatok szrsre. A WHERE zradk egy keressi felttelt tartalmaz, amit szrknt hasznl. Ez a keressi felttel adja meg a lehetsget, hogy csak a szksges sorokat vlasszuk ki, illetve hogy kizrjuk azokat, amelyek nem kellenek. Az adatbzis-kezel rendszernk a FROM zradkkal kivlasztott logikai tbla minden sorban ellenrzi a keressi felttelt. A 6.1. brn a SELECT utasts formja lthat a WHERE zradkkal.

6.1. bra A SELECT utasts szintaxisdiagramja a WHERE zradkkal Egy keressi felttel egy vagy tbb lltst (amelyek egy-egy kifejezsnek felelnek meg) tartalmaz, s egy vagy tbb rtkkifejezst vizsgl, aminek az eredmnyekpp igaz, hamis vagy ismeretlen rtket ad vissza. Ksbb megtanuljuk, hogy ezek az lltsok az AND s OR logikai mveletekkel egy keressi felttelbe is sszevonhatk. Amikor a teljes keressi

felttel igazra rtkeldik ki egy sor esetben, akkor az a sor megjelenik az eredmnyben. Megjegyezzk, hogy ha egy keressi felttel csak egy lltst tartalmaz, akkor a keressi felttel (search condition) s az llts (prediktum, predicate) azonos fogalmak. Az 5. fejezetben szerepelt, hogy az rtkkifejezsek oszlopneveket, literlis rtkeket, fggvnyeket vagy ms rtkkifejezseket tartalmazhatnak. Amikor megfogalmazunk egy lltst, ltalban egy olyan oszlopra vonatkoz rtkkifejezst hasznlunk, ami a FROM zradkkal megadott tblkban tallhat. A legegyszerbb s valsznleg a legtbbszr hasznlt llts egy rtkkifejezst (egy oszlopot) hasonlt ssze egy msikkal (egy literlissal). Pldul ha csak azokat a sorokat szeretnnk ltni a Customers (Vsrlk) tblbl, ahol a vsrl vezetkneve Smith, meg fogalmazhatunk egy lltst, ami sszehasonltja a vezetknv oszlopt a literlis Smith rtkkel. SQL

SELECT CustLastName FROM Customers WHERE CustLastName = 'Smith'

Az llts a WHERE zradkban megegyezik azzal, mintha a kvetkez krdst tennnk fel minden egyes sornak a Customers tblban: A vsrl vezetkneve azonos a Smithszel?". Ha a Customers tbla egy adott sorban erre a krdsre igen (igaz) a vlasz, akkor az a sor szerepelni fog az eredmnyben. Az SQL-szabvny tizennyolc lltst hatroz meg, de csak az t legfontosabbat trgyaljuk ebben a fejezetben, amelyek a kvetkezk: sszehasonlts, BETWEEN, IN, LIKE s IS NULL. SSZEHASONLTS A hat sszehasonlt mveleti jellel (=, <>, <, >, <=, >=) egy rtkkifejezst egy msik rtkkifejezssel hasonlthatunk ssze. BETWEEN (TARTOMNY) A BETWEEN llts segtsgvel eldnthetjk, hogy egy adott rtkkifejezs rtkek egy adott tartomnyba esik-e. A tartomnyt kt rtkkifejezssel lehet megadni, amelye ket az AND kulcsszval ktnk ssze. IN (Tagsg) Segtsgvel eldnthet, hogy az adott rtkkifejezs meg egyezik-e egy bizonyos listban szerepl elemek valamelyi kvel. LIKE (Mintailleszts) A LIKE lltssal eldnthet, hogy egy karakterlnc form tum rtkkifejezs megegyezik-e egy adott karakterlnc mintjval. IS NULL Az IS NULL lltst annak eldntsre hasznlhatjuk, hogy egy rtkkifejezs Null rtk-e.

Nem rdemes a tbbi tizenhrom, az SQL-szabvnyban szerepl lltssal foglalkozni. Tizenegyhez ugyanis nem talltunk semmifle kereskedelmi megvalstst, a maradk kettt pedig - Quantified s EXISTS- a 11. feje zetben trgyaljuk.

A WHERE zradk hasznlati terletei


Mieltt felfedezzk az SQL-szabvnyban meghatrozott alapvet lltsokat, nzznk megint egy egyszer pldt a WHERE zradk hasznlatra. Az albbiakban rszletesen lerjuk, hogy milyen lpsek sorn lehet felpteni a lekrdezst. Ebben a fejezetben vgig a ,,Krelem - Fordts- Tisztzs - SQL" mdszert alkalmazzuk amit a 4. fejezetben vezettnk be. Tegyk fel, hogy a kvetkez krdsre szeretnnk vlaszt kapni az adatbzisunk segtsgvel: Hogy hvjk a Washington llamban l vsrlinkat? Amikor ilyen krelemhez lltunk ssze fordtsi utastst, meg kell prblnunk minl vilgosabban s tlthatbban megfogalmazni, hogy mely informcikra van szksgnk. Tbb munkba fog kerlni a krelem tfogalmazsa, mint ahogy eddig megszoktunk, de az eredmny indokolni fogja ezt a tbbletmunkt. A feltett krdst gy fogalmazhatjuk t: Fordts - Select first name and last name from the customers table for those customers who live in Washington State (Vlaszd ki azoknak a vsrlknak a vezetk- s keresztnevt a vsrlk tbljbl, akik Washington llamban laknak.) Ezt az lltst a megszokott mdon tisztzzuk le, de most kt tovbbi feladatot is elvgznk. Elszr keressnk olyan szavakat s kifejezseket, amelyek valamilyen megszortsra utalnak. Biztos tallatnak szmtanak a hol s a ki, illetve a szmra s a -nak/nek ragokra vgzd szavak. Szerepeljen itt nhny plda ezekre a keresett kifejezsekre: ,,...akik Bellevue-ben lnek! ,,...mindenkit, akinek az irnytszma 98125!" ...akik mjusban adtak le rendelst!" ...a kaliforniai beszlltkhoz tartozkat! ,,...akiket 1985. mjus 16-n vettek fel! ,,...ahol a krzetszm 425! ,,...a Mike Hernandezhez tartozkat! Amikor ilyen megszortst tallunk, kszen llunk a msodik feladatra. Tanulmnyozzuk a kifejezst, s prbljuk meghatrozni, hogy melyik oszlopban, milyen rtket s hogyan kell keresni. A vlaszaink ezekre a krdsekre segtenek majd megalkotni a keressi felt teleket a WHERE zradk szmra. Alkalmazzuk ezeket a krdseket a lefordtott lltsra:

Melyik oszlopban kell keresni? State (llam) Milyen rtket kell keresni? WA Hogyan kereshetnk az oszlopban? Az egyenl" mveleti jellel A vlasz megtallshoz ismernnk kell a tbla szerkezett. Ha szksges, ksztsnk msolatot a tbla szerkezetrl, mieltt nekillunk megvlaszolni ezeket a krdseket.

Nha a vlaszok ezekre a krdsekre nyilvnvalak, nha azonban csak rejtett utalsokat tallunk. Ebben a fejezetben a pldk sorn megmutatjuk, hogyan vlaszthatjuk ki s fejthetjk meg a helyes vlaszokat.
Miutn megvlaszoltuk a fenti krdseket, hasznljuk fel ket a megfelel felttelek meg hatrozshoz. A kvetkez lpsben kihzzuk az eredeti megszortst, s a WHERE sz ra, valamint az imnt megalkotott keressi felttelre cserljk le. A Tisztzs utn gy nz ki az lltsunk: Tisztzs - Select first name and last name from the customers table for

these-customers who live in where state is equal to = WA' Whashington State


Ezt utna egy rendes SELECT utastsba rjuk t: SQL

SELECT CustFirstName, CustLastName FROM Customers WHERE CustState = 'WA'

A SELECT utasts eredmnyben csak azok a vsrlk fognak szerepelni, akik Washington llamban laknak. A WHERE zradk meghatrozsrl mindssze ennyit kell tudnunk. Ahogy ennek a rsznek az elejn is emltettk, csupn meg kell fogalmaznunk a megfelel keressi fel tteleket, s elhelyezni ezeket a WHERE zradkban. Az igazi munkt azonban a keressi felttelek megfogalmazsa jelenti.

A keressi felttelek megfogalmazsa


Most hogy lttuk, miknt pl fel egy egyszer WHERE zradk, vessnk kzelebbi pillantst az t alapvet lltsra.

sszehasonlts
A leggyakrabban hasznlt felttel az sszehasonlt llts, amellyel kt rtkkifejezst ha sonlthatunk ssze. Ahogy a 6.2. brn lthat, hatfle sszehasonltst hatrozhatunk meg az sszehasonlt mveleti jelekkel.

6.2. bra Az sszehasonlt felttel szintaxisdiagramja

egyenl

< > nem egyenl

< kisebb > nagyobb

< = kisebb vagy egyenl > = nagyobb vagy egyenl

Karakterlncok sszehasonltsa: vigyzat!


Knny sszehasonltani a szmrtk vagy dtum s id formtum adatokat, de a karak terlncok sszehasonltsval vigyzni kell. Pldul nem azt az eredmnyt kaphatjuk, amire szmtunk, ha sszehasonltjuk a rnzsre hasonl Mike s MIKE" karakterlncokat. A karakterlncok sszehasonltsban a dnt tnyez a hasznlt adatbzisrendszer karak tersorrendje. Ez a sorrend dnti el a karakterlncok sorrendjt is, s a tbbi sszehasonlt felttelre is hatssal van. Mivel az SQL nyelvet a klnfle gyrtk eltr rendszerekre s helyi nyelvekhez igazod va valstjk meg, az SQL-szabvny nem hatroz meg semmilyen karaktersorrendet. A karakterek sorrendje a legkisebbtl a legnagyobbig a hasznlt adatbzisrendszeren s annak belltsain mlik. Sok adatbzis-kezel rendszer az ASCII karaktersorrendet hasznlja, ami a szmokat a be tk el helyezi, s a nagybetk a kisbetk eltt szerepelnek. Ha az adatbzisrendszernk az ASCII sorrendet tmogatja, akkor a karakterek sorrendje a kvetkez, a legkisebbtl a legnagyobbig: ...0123456789...ABC...XYZ...abc...xyz... Nhny rendszeren viszont a kis- s nagybetk megegyeznek. Ilyen esetben a kis a bet azonosnak tekintend a nagy A betvel. Ha az adatbzisrendszernk ezt a sorrendet hasznlja az ASCII sorrendet alapul vve, a sorrend a kvetkezkpp alakul: ...0123456789...{Aa}{Bb}{Cc}...{Xx}{Yyl{Zz}... A kapcsos zrjelekben ({}) lv karakterek azonosnak szmtanak, mivel nem tesznk klnbsget a kis- s nagybetk kztt, s ezt a sorbarendezsnl is figyelembe kell venni.

Az IBM rendszereken fut adatbzis-kezel rendszerek az IBM szabadalmaztatott EBCDIC karaktersorrendjt hasznljk. Egy olyan adatbzisrendszerben, amely EBCDIC sorrendet hasznl, elszr jnnek a kisbetk, utnuk a nagybetk s vgl a szmok. Ha az adatb zisrendszernk az EBCDIC-et tmogatja, a karakterek sorrendje a kvetkez: ...abc...xyz...ABC...XYZ ...0123456789... Mindezt jobban tlthatjuk, ha megnzzk a kvetkez mintaoszlopon, hogy miknt befo lysoljk a klnbz karaktersorrendek a kisebb, a nagyobb vagy az egyenl relcikat az adatbzisban. A tblban az rtkeket az ASCII karakterkszlet szerint rendeztk sorba, figyelve a kis- s nagybetk kzti klnbsgre (elbb jnnek a szmok, majd a nagybetk, vgl a kisbetk):

Most hagyjuk el a kis- s nagybetk kzti klnbsget, s nzzk, mi lesz az eredmnye:

Vgl nzzk meg, hogy ezek az adatokat hogyan rendezhetjk sorba egy IBM rendszeren az EBCDIC sorrendet hasznlva (kisbetk, nagybetk s szmok):

Vratlan eredmnyt kaphatunk akkor is, ha olyan, eltr hosszsg karakterlncokat prblunk sszehasonltani, mint a "John s a "John vagy a Mitch s a Mitchell. Szerencsre az SQL-szabvny pontosan lerja, mi a teend ekkor. Mieltt az adatbzis-ke zel rendszer sszehasonltan a kt nem azonos hosszsg karakterlncot, a rvidebbet ki kell egsztenie az alaprtelmezett kitlt karakterrel annyira, hogy a hosszuk megegyezzen. (Az alaprtelmezett kitlt karakter a legtbb rendszeren a szkz.) Ezutn az adatbzisrendszer a belltott karaktersorrendet figyelembe vve eldnti, hogy gy azonos-e a kt karakterlnc. Ennek eredmnyekppen a "John" s a "John " egyezni fog (a kiegszts utn), de a Mitch s a Mitchell nem. Nhny rendszer eltr az SQL-szabvnytl abban, hogy figyelmen kvl hagyja a zr res karaktereket, ahelyett hogy kibvten a rvi debb karakterlncot. Ezrt a "John s a "John bizonyos rendszerekben megegyeznek, de ms indokok miatt- mivel a msodik elemnl a zr res karakterek sszehasonlt sra nem kerl sor. Vizsgljuk meg, hogy az adatbzisrendszernk hogyan mkdik, azaz prbljuk ki, hogy miknt kezeli ezeket az sszehasonltsokat, s hogy az elvrt eredmnyt kapjuk-e. Zrszknt mg annyit, hogy mindig olvassunk utna a kisbetk, nagybetk s szmok sorrendjnek az adatbzisrendszernk kziknyvben.

Egyenlsg s egyenltlensg
Ugyan mr lttunk r pldkat, de vizsgljunk meg figyelmesebben egy egyenlsgi felttelt az egyenl mveletei jel hasznlatval! Tegyk fel, hogy a kvetkez krelmet szeretnnk az adatbzishoz intzni:

Mutasd meg azoknak az gynkknek a vezetk- s keresztnevt, akiket 1977. mrcius 14-n vettek fel!'' Mivel egy bizonyos felvteli dtum szerint keresnk, a szksges informci lekrshez az egyenlsgi sszehasonltst hasznlhatjuk, az egyenl mveleti jellel. Ha most alkal mazzuk a fordtsi eljrst erre a krelemre, megkapjuk a szksges SELECT utastst. Fordts - Select first name and last name from the agents table for all agents hired on March 14, 1977 (Vlaszd ki azoknak az gynkknek a vezetk- s keresztnevt az gyn kk tbljbl, akiket 1977. mrcius 14-n vettek fel.) Tisztzs - Select first name and last name from the agents table for all agents hired on where date hired = March 14, 1977 '1977-03-14' SQL SELECT AgtFirstName, AgtLastName

FROM Agents WHERE DateHired = '1977-03-14'


Ebben a pldban egy bizonyos oszlopban lv rtkek kztt kerestk az adott dtum rtkt Lnyegben egy belefoglal folyamatot hajtottunk vgre egy adott sor az Agents (gynkk) tblbl belekerl az eredmnyek kz, de csak akkor, ha a DateHired (Felvtel dtuma) oszlop rtke az adott dtum rtkvel azonos. De mi a teend, ha pont az ellenkezjt szeretnnk, s kizrni kvnunk adott sorokat az eredmnybl? Ebben az esetben a nem egyenl mveleti jelet hasznlhatjuk az sszehasonlts folyamn. Tegyk fel, hogy a kvetkez krelmet szeretnnk az adatbzishoz intzni: Add meg az sszes beszlltt nevt s telefonszmt, kivve azokt, akik itt vannak Bellevue-ben!'' Knnyen kitallhat, hogy ki kell zrnunk az eredmnybl azokat a beszlltkat, akiknek a telephelye Bellevue-ben tallhat, s ehhez egy nem egyenl felttelt kell keresni. A kivve sz biztos jele annak, hogy egy nem egyenl felttel pont j lesz. Ezt szben tartva lssuk a krelem lefordtst: Fordts - Select vendor name and phone number from the vendors table for all vendors except those based in 'Bellevue' (Vlaszd ki a beszlltk nevt s telefonszmt a beszlltk tbljbl, ki vve azokat, akiknek a telephelye Bellevue-ben tallhat.) Tisztzs - Select vendor name and phone number from the vendors table for all vendors except those based in where city <> 'Bellevue' SQL SELECT VendName, VendPhone

FROM Vendors WHERE VendCity <> 'Bellevue'

Az SQL-szabvny a <>jelet hasznlja a nem egyenl mveletre. Szmos RDBMS (relcis adatbzis-kezel rendszer) program egyb jellseket is knl, pldul a != (ezt a Microsoft SQL Server s a Sybase tmogatja) s a = (ezt az IBM DB2 termke tmogatja) jeleket. Olvassunk utna az adatbzisrendszernk kziknyvben, hogy milyen jellseket hasznlhatunk erre a mveletre. Ezzel az egyszer felttellel hatkonyan kizrtuk a bellevue-i beszlltkat az eredmnybl. Ksbb ebben a fejezetben megmutatunk egy msik mdszert is arra, hogy miknt zrha tunk ki sorokat az eredmnyek kzl.

Kisebb mint s nagyobb mint


Sokszor olyan sorokra van szksgnk, ahol egy oszlopban lv bizonyos adat nagyobb vagy kisebb, mint az sszehasonltand rtk. Ez a fajta sszehasonlts magba foglalja a kisebb (<), kisebb vagy egyenl (<=), nagyobb (>) s nagyobb vagy egyenl(>=) sszehasonlt mveleteket. Az sszehasonltand adat tpusa hatrozza meg a fenti mveletek esetben a relcikat. Ez az sszehasonlts eldnti, hogy az els rtkkifejezs megelzi-e (<) vagy kveti-e (>) a msodik rtkkifejezst a hasznlt adatbzisrendszer karaktersorrendje szerint. Pldul az a < c gy rtelmezhet, hogy Az a megelzi a c-t? A karaktersorrendekrl lsd az elz, Karakterlncok sszeha sonltsa: vigyzat! cm rszt. Ez az sszehasonlts eldnti, hogy az els rtkkifejezs kisebb (<) vagy nagyobb (>), mint a msodik rtkkifejezs. Pldul a 10 > 5 gy rtelmezhet, hogy A 10 nagyobb, mint az 5? Ez az sszehasonlts eldnti, hogy az els rtkkifejezs korbban (<) vagy ksbb (>) van-e, mint a msodik rtk kifejezs. Pldul a '2007-05-16 < '2007-12-15 gy rtel mezhet, hogy 2007. mjus 16-a korbban van-e, rnint 2007. december 15-e? A dtumok s idpontok feldolgozsra idrendi sorrendben kerl sor. Nzzk meg, hogy hasznlhatjuk ezeket az sszehasonlt lltsokat egy krds megvla szolshoz: "Van olyan rendelsnk, amelynl a szlltsi dtum vletlenl a megrendels eltti idpont?'' Ehhez a kisebb mint mveletet fogjuk hasznlni, mert azt szeretnnk megtudni, hogy van-e olyan szlltsi idpont, ami megrendels eltti dtumot jell. me a fordts:

Fordts - Select order number from the orders table where the ship date is earlier than the order date (Vlaszd ki azoknak a megrendelseknek a szmt a megrendelsek tbl jbl, ahol a szlltsi dtum korbbi, mint a megrendelsi dtum.) Tisztzs - Select order number from the orders table where the ship date is earlier than the < order date SQL SELECT OrderNumber

FROM Orders WHERE ShipDate < OrderDate


A SELECT utasts eredmnye csak azokat a sorokat fogja tartalmazni, amelyek megfelel nek a keressi felttelnek A kvetkez pldhoz egy nagyobb mint" mveletet kell segtsgl hvni: Van olyan ra, ami tbb mint ngy kreditet r?" Fordts - Select class ID from the classes table for all classes that earn more than four credits (Vlaszd ki azoknak az rknak a sorszmt az rk tbljbl, amelyek tbb mint ngy kreditesek.) Tisztzs - Select class ID from the classes table for all classes that earn more than four where credits > 4 SQL SELECT C l a s s I D FROM C l a s s e s WHERE C r e d i t s > 4 A SELECT eredmnyei kztt csak azok az rk fognak szerepelni, amelyek t vagy annl tbb kreditet rnek, pldul az Intermediate Algebra (Kzpfok algebra) vagy az Engineering Physics (Ksrleti fizika). Most nzznk olyan pldkat, ahol az rtkek nem csak szigoran kisebb vagy nagyobb volta rdekel minket, hanem egyenlk is lehetnek az sszehasonltand rtkekkel. Mutasd meg azoknak a nevt, akiket 1989. janur 1-e ta vettnk fel!" Itt egy nagyobb vagy egyenl" sszehasonltst hasznlunk, mert az sszes felvteli dtum rdekel minket 1989. janur 1-e s a mai nap kztt, belertve azokat is, akiket azon a napon vettnk fel. A fordts kzben figyeljnk oda, hogy minden szksges oszlopot belefoglaljunk a lekrdezsbe: Fordts - Select first name and last name as EmployeeName from the employees table for all employees hired since January l, 1989

(Vlaszd ki azoknak az alkalmazottaknak a vezetk- s keresztnevt EmployeeName nven az alkalmazottak tbljbl, akiket 1989. janur 1-e ta vettnk fel.) Tisztzs - Select first name and || ' ' || last name as EmployeeName from the employees table for all employees hired since where date hired >= January 1, 1989 '1989-01-01' SQL SELECT FirstName || ' ' || LastName

AS EmployeeName FROM Employees WHERE DateHired >= ' 1 9 8 9 - 0 1 - 0 1 '


Egy msik krelem, amit az adatbzisrendszerhez intzhetnk: Mutasd meg azoknak a termkeknek a listjt, amelyeknek a fogyaszti ra legfeljebb tven dollrt!" A krelembl azonnal kvetkezik, hogy egy kisebb vagy egyenl sszehasonltst kell hasznlnunk. Ezzel biztostjuk, hogy a SELECT utasts csak azokat a termkeket adja vissza, amelyeknek az ra pontosan az egy centtl tven dollrig terjed tartomnyban tallhat. Fordtsuk le a krelmet: Fordts - Select product name from the products table for all products with a retail price of fifty dollars or less (Vlaszd ki azoknak a termkeknek a neveit a termkek tbljbl, amelyek fogyaszti ra tven vagy annl kevesebb dollr.) Tisztzs - Select product name from the products table for all products with a where retail price of <= 50 fifty dollars or less SQL SELECT ProductName

FROM Products WHERE RetailPrice <= 5 0


Az eddigi pldk csak egyfle sszehasonltst alkalmaztak. Ksbb ebben a fejezetben mutatunk pldkat az AND s az OR mvelettel sszefztt felttelekre is.

Tartomny
Egy rtkkifejezst egy tartomnyfelttellel adott rtkek egy tartomnyhoz is hasonlt hatjuk. A 6.3. brn lthat ennek a felttelnek az utastsformja. A tartomnyfelttel egy adott rtkkifejezst hasonlt ssze kt msik rtkkifejezs ltal meghatrozott tartomnnyal. A BETWEEN ... AND llts adja meg a tartomnyt, ahol a msodik rtkkifejezs jelli a tartomny als hatrt, a harmadik pedig a fels hatrt. Az als s a fels hatr is a tartomny rsze. Egy sor csak akkor kerl bele az eredmnybe, ha az els rtkkifejezs az elrt tartomnyba esik.

Van azonban egy kis problma a BETWEEN ... AND hasznlatval Az SQL-szabvny valjban ktfle BETWEEN-sszehasonltst hatroz meg: ASYMMETRIC (aszimmetrikus) s SYMMETRIC (szimmetrikus). Az alaprtelmezett ASYMMETRIC azt okozza, hogy a Value1 BETWEEN Value2 AND Value3 azonos lesz a Value1 >= Value2 AND Value1 <= Value3 kife jezssel. Ez azt jeleni, hogy az llts akkor hasznlhat, ha a Value2 kisebb, mint a Value3, vagy egyenl azzal. Vegyk pldul az albbi kifejezst;

MyColumn BETWEEN 5 AND 10


Az SQL-szabvny szerint ezt a kifejezst gy kell rtelmezni:

MyColumn >= 5 AND MyColumn <= 10


Azaz ha a nagyobb rtket tesszk az els helyre...

MyColumn BETWEEN 10 AND 5


...az az SQL-szabvny rtelmben megegyezik ezzel a kifejezssel:

MyColumn >=10 AND MyColumn <= 5


Mrpedig ez a kifejezs soha nem lehet igaz! (Az oszlop rtke nem tud egyszerre nagyobb lenni 10-nl vagy egyenl azzal, s kisebb lenni 5-nl vagy egyenl 5-tel.) Ennek ellenre nhny adatbzis-kezel rendszer megengedi, hogy a Value2 nagyobb legyen, mint a Value3 - ami megegyezik a SYMMETRIC kulcssz hasznlatval az SQL-szabvnyban. (Egyelre nem tudunk olyan megvalstsrl, ami tmogatn az ASYMMETRIC s SYMMETRIC kulcsszavakat.) Olvassunk utna az adatbzisrendszernk kziknyvben ezeknek a rszleteknek. A kvetkez nhny plda bemutatja a tartomnyfelttel hasznlatt A tanri kar mely tagjait vettk fel 1986 jliusban?'' A tartomnyfelttel itt alkalmazhat, mivel adott dtumok kztt felvettek nevei rdekelnek minket (ebben az esetben az 1986. jlius 1. s 1986. jlius 31. kztt felvettek). Hajtsuk vgre a fordtst ezen a krelmen, s rjuk meg a megfelel SELECT utastst:

Fordts - Select first name and last name from the staff table where the date hired is between July 1, 1986, and July 31, 1986 (Vlaszd ki a tanrok tbljbl azoknak a vezetk- s keresztnevt, akiket 1986. jlius 1. s 1986. jlius 31. kztt vettnk fel.) Tisztzs - Select first name and last name from the staff table where the date hired is between July 1, 1986 '1986-07-01' and July 31, 1986 '1986-07-31' SQL SELECT FirstName, LastName

FROM Staff WHERE DateHired BETWEEN '1986-07-01' AND '1986-07-31'


Figyeljk meg, hogy a dtumokat hnap s nap szerint rszletezve tntettk fel a lefordtott krelemben. Hasznljuk ezt a mdszert a fordtsra, hogy minl pontosabb krelmet kap junk, s a megfelel SELECT utastst fogalmazhassuk meg. A tartomnyfelttelt egy karakterlncra is hatkonyan alkalmazhatjuk, amint az a kvetkez pldban is lthat:

Adj egy listt azokrl a hallgatkrl - a telefonszmukkal egytt-, akiknek a vezetkneve B-vel kezddik!
Fordts - Select last name, first name, and phone number from the students table for all students whose last name begins with the letter 'B' (Vlaszd ki azoknak a hallgatknak a vezetk- s keresztnevt a telefonsz mukkal egytt a hallgatk tbljbl, akiknek a vezetkneve B-vel kezd dik.) Tisztzs - Select last name, first name, and phone number from the students table for all Students whose name begins with the letter B' where last name between 'B' and 'Bz' SQL SELECT StudLastName, StudFirstName, StudPhoneNumber

FROM Students WHERE StudLastName BETWEEN 'B' AND 'Bz'


Amikor egy karakterlnchoz adunk meg tartomnyfelttelt, alaposan gondoljuk t, hogy mi lyen rtkeket szeretnnk belefoglalni. Ehhez a feladathoz pldul hromfle megolds is elkpzelhet a kezd s a zr rtkeket tekintve, s az eredmny igencsak klnbz lesz! BETWEEN A AND C Feltehetleg nem sokszor fordul el, hogy az A betvel jelljk meg a tartomny kezdett, hiszen akkor az sszes A betvel kezdd nv benne lenne az eredmnyben. Ennek ellenre ez igen gyakori hiba.

BETWEEN 'B AND C

BETWEEN B AND Bz

Ilyen mdon jellve a kezd s zr rtkeket ebben a pldban valsznleg a megfelel eredmnyt kapjuk vissza, de vratlan eredmnyt is kaphatunk, az sszehasonl tott adatoktl fggen. Ne felejtsk el, hogy a BETWEEN mvelet a kezd s a zr rtket is belefoglalja a tartomny ba. Ez alapjn a pldnkban, ha egy hallgat vezetkneve a C bet lenne, akkor is szerepelne az eredmnyben. Ez a legpontosabb jellse a kezd s zr rtkekneka legtbb esetben gy megkapjuk a szksges eredmnyt. A pontos hatrok megllaptshoz vgssoron ismernnk s rtennk kell az adatainkat.

Mg egy dolog, mieltt befejezzk a BETWEEN trgyalst. Figyeljk meg a korbbi 6.3. brt, ahol az lthat, hogy egy rtkkifejezs nem csak a BETWEEN zradkban hasznlhat, hanem az els rtkknt is. Mr volt sz rla, hogy egy rtkkifejezs lehet egyszeren egy oszlop neve, vagy egy egyszer literlis rtk, de lehet egy sszetett karakter, egy matematikai kifejezs vagy idpont kifejezse is. Amikor olyan tblnk van, amely kt kln oszlopban tartalmazza a tartomny elejt s vgt jell rtkeket (pldul a StartDate s EndDate oszlopok az Entertainment Agency mintaadatbzis Engagements tbljban), a BETWEEN hasznlhat olyan sorok keressre is, amelyek ben egy rtk a kt oszlop rtke kz esik. Egy plda erre: Mutasd meg az sszes olyan rendezynyt, ami 2007. oktber 10-n esedkes! Fordts - Select engagement number, start date, and end date from the engagements table for engagements where October 10, 2007, is between the start date and the end date (Vlaszd ki a rendezvny szmt, valamint a kezd s zr dtumt a rendezvnyek tbljbl, azoknak a rendezvnyeknek az esetben, amelyeknl 2007. oktber 10-e a kezd s a zr dtum kz esik.) Tisztzs - Select engagement number, start date, and end date from the engagements table for engagements where October 10, 2007 is '2007-10-10' between the start date and the end date SQL SELECT EngagementNumber, StartDate, EndDate

FROM Engagements WHERE ' 2 0 0 7 - 1 0 - 1 0 ' BETWEEN StartDate AND EndDate


Eddig arra lttunk pldkat, hogy miknt szkthetnk egy lekrdezst adatok szles tartomnyra, illetve bizonyos szkebb adattartomnyokra. Most nzzk meg, hogyan finomthatunk tovbb egy lekrdezst, ha rtkek egy listjt adjuk meg felttelknt!

Tagsg belltsa
Tagsgi felttelt akkor hasznlunk, ha egy rtket egy listban elre megadott rtkekhez kvnunk hasonltani. Amint a 6.4. brn lthat, a tagsg felttele az IN lltst hasznlja annak eldntsre, hogy az els rtkkifejezs rtke egyezik-e egy zrjellel jellt lista valamelyik elemvel, amit egy vagy tbb rtkkifejezs hatroz meg.

Elmletileg ugyan nincs fels hatra a listba foglalhat elemeknek, mgis jobb tlet, ha csak nhnyat hasznlunk. Van kt msik felttelnk is mr, amelyekkel rtkek szlesebb tartomnyt jellhetjk meg. A tagsgi felttelt legjobban egy vges elemszm listval hasznlhatjuk, ahogy azt ltni fogjuk a kvetkez pldkban. Egy lehetsges krelem az adatbzisunkhoz:

Sorold fel azokat a tekeklubokat, amelyek 2007. szeptember J8-n, oktber 9-n s november 6-n rendezik a versenyeket!
Ez a krelem ppen alkalmas a tagsgi felttelhez, mivel adott dtumokra krdez r. Ha a krelem nem lenne ennyire pontosan megfogalmazva, akkor egy tartomnyfelttelt hasznlhatnnk. A krelmet gy fordthatjuk le: Fordts - Select tourney location from the tournaments table where the tourney date is in this list of dates: September 18, 2007; October 9, 2007; November 6, 2007 (Vlaszd ki a verseny helysznt a versenyek tbljbl a kvetkez napok ra: 2007. szeptember 18., 2007. oktber 9., 2007. november 6.) Tisztzs - Select tourney location from the tournaments table where the tourney date is in this list of dates: (September 18, 2007; '2007-09-18', October 9 2007; '2007-10-09', November 6, 2007 '2007-11-06') SQL SELECT TourneyLocation

FROM Tournaments WHERE TourneyDate IN ( '2007-09-18', '2007-10-09', '2007-11-06')

Egy msik krelem, amihez szintn tagsgi felttelt kell hasznlni:

Mely eladkat kpviseljk Seattle-ben, Redmondban s Bothellben?


Fordts - Select stage name from the entertainers table for all entertainers based in 'Seattle', 'Redmond', or 'Bothell' (Vlaszd ki azoknak az eladknak a mvsznevt az eladk tbljbl, akik Seattle-ben, Redmond-ban vagy Bothell'-ben dolgoznak.) Tisztzs - Select stage name from the entertainers table for all entertainers based where city in ('Seattle','Redmond', or 'Bothell') SQL SELECT EntStageName

FROM Entertainers WHERE EntCity IN ('Seattle', 'Redmond', 'Bothell')


Vegyk szre, hogy a vagy szt hasznltuk a fordts folyamn az eredeti krelemben szerepl s sz helyett. Ennek az oka egyszer: csak egy bejegyzs tallhat az EntCity oszlopban egy adott eladhoz. Egy adott sor nem tartalmazhatja a Seattle s Redmond s Bothell vrosneveket egyszerre, de tartalmazhatja a Seattle vagy Redmond vagy Bothell vrosneveket Ez nyilvnvalnak tnhet most, de a pontosan megfogalmazott szavak s kifejezsek segtenek jobban tlthat fordtst s tisztzott lkdot alkotni, amelyekkel a krelemhez legjobban ill SELECT utastsokat kaphatunk. Ksbb ebben a fejezetben ltni fogjuk, hogy ezek a kis dolgok mennyire fontosak, ha tbb felttelt hasznlunk egyszerre. Az sszes eddig tanult felttel teljes rtkkifejezseket hasznlt, most azonban egy olyan felttelt tanulunk meg, amely rszleges rtkek hasznlatt is megengedi.

Mintailleszts
A mintaillesztsi felttel akkor hasznos, ha olyan rtkeket kell keresnnk, amelyek meg egyeznek egy adott mintakarakterlnccal, vagy amikor a szksges informcinak csak egy rsze ll rendelkezsre a keressi felttelhez. A 6.5. brn lthatjuk ennek a felttel nek az utastsformjt

Ez a felttel egy rtkkifejezs rtkt veszi, s a LIKE lltssal ellenrzi, hogy illik-e r az adott mintakarakterlnc. A mintakarakterlnc a szoksos karakterek logikus kombinci jbl llhat, s kt helyettest karaktert tartalmazhat: a szzalkjelet (%) s az alhzst (_). A szzalkjel nulla vagy tbb tetszleges karakternek felel meg, az alhzs pedig egyetlen tetszleges karaktert jelent. A mintakarakterlnccal hatrozzuk meg, hogy milyen adatokat szeretnnk visszakapni a lekrdezs folyamn. A klnfle mintakarakterlncokra a 6.1. tblzatban lthatunk pldkat. Az egyik legnpszerbb adatbzis-kezel rendszer, a Microsoft Office Access, a csillagot (*) hasznlja a szzalkjel (%) helyett, illetve a krdjelet (?) az alhzs (_) helyett. Az Access a kettskeresztet (#) is tmogatja, amellyel szmjegyeket helyettesthetnk egy adott helyen. Ha Microsoft Accesst hasznlunk, ezeket a karaktereket helyettestsk be a LIKE llts mintakarakterlncba.
6.1. tblzat Pldk mintakarakterlncokra

Nzzk meg, hogyan hasznlhatjuk a mintaillesztsi felttelt a kvetkez krelemnl: Adj egy listt azokrl a vsrlkrl, akiknek a vezetkneve 'Mar-ral kezddik!"

6. fejezet Az adatok szrse 151

Az ilyen krelmeknl jellemzen tallhat olyan kifejezs, ami a mintailleszts hasznlatra utal. me nhny plda az ehhez hasonl kifejezsekre:

... Her'-rel kezddik! ...az els kt karakter a 'Ba'! ...tartalmazza a 'Park' szt! ...tartalmazza a 'han' betsorozatot! ...a kzepn szerepel az 'ave' sztredk! ...'son'-ra vgzdik! ...a vgn 'ez' van!
A legtbb adatbzisrendszerben a karakterlncok sszehasonl'tsn/ a kis- s nagybetk klnbzknek szmtanak, szmos nagyobb adatbzisrendszerben a rendszergazdknak teleptskor lehetsgk van belltani, hogy az sszehasonltsnl a kis- s nagybetk azonosnak vagy klnbznek szmtsanak-e. Ha az adatbzisrendszernk megklnbzteti a kis- s nagybetket, akkor a LIKE ' %chi% ' meg fogja tallni a roast chicken kifejezst, de a chicken a la King kifeje zst mr nem, mivel a mintban tallhat kis 'c' nem egyezik az oszlopban tallhat nagy 'C' betvel. Olvassunk utna az adatbzisrendszernk kziknyvben, hogy kell-e foglalkoznunk a kis- s nagybetk kztti eltrssel. Lthatjuk, hogy viszonylag knny a mintakarakterlnc tpust eldnteni a krds alapjn. Ha mr tudjuk, hogy melyik minta kell neknk, akkor folytathatjuk a krelem lefordtsval: Fordts - Select last name and first name from the customers table where the last name begins with 'Mar' (Vlaszd ki azoknak a vsrlknak a vezetk- s keresztnevt a vsrlk tbljbl, akiknek a vezetkneve a Mar betkkel kezddik.)
Tisztzs - Select last name and first name from the customers table where the last name begins with like 'Mar%'

SQL

SELECT CustLastName, CustFirstName FROM Customers WHERE CustLastName LIKE 'Mar%'

A SELECT utasts eredmnye olyan neveket fog tartalmazni, mint a Marks, a Marshall, a Martinez s a Marx, mivel csak az els hrom karaktert vizsgltuk a vezetknvbl. Plda egy msik, szintn a mintaillesztsi felttellel megalkothat krelemre: Adj egy listt azokrl a beszlltkrl, akiknek a cmben a 'Forest' sz szerepel az utcanvben!" Fordts - Select vendor name from the vendors table where the street address contains the word 'Forest'

(Vlaszd ki azoknak a beszlltknak a nevt a beszlltk tbljbl, akik nek a cmben az utcanv tartalmazza a Forest szt.) Tisztzs - Select vendor name from the vendors table where the street address contains the word like '%Forest%' SQL SELECT VendName

FROM Vendors WHERE VendStreetAddress LIKE '%Forest%'


Ebben az esetben a beszlltk tbljbl egy sor csak akkor kerl be az eredmnybe, ha a cmben az utcanv olyan, mint a Forest Park Place, a Forest Ridge Avenue, az Evergreen Forest Drive vagy a Black Forest Road. A mintakarakterlnccal ugyan brmilyen mintra r tudunk keresni a megfelel helyettes t karaktereket hasznlva, de knnyen problmkba tkzhetnk, ha szzalkjelre vagy alhzsra szeretnnk keresni. Pldul az MX_445 karakterlnc megkeresse gondot okoz, mert alhzs karaktert tartalmaz. Egy ilyen lehetsges problmn a LIKE llts ESCAPE kapcsoljval lehetnk rr, ahogy a 6.5. brn lthattuk. Az ESCAPE kapcsol lehetv teszi, hogy kijelljnk egy literlis karakterlncot amit vdkarakternek hvunk , amivel jelezzk az adatbzis-kezel rendszernek, hogy a szzalkjeleket vagy alhzsokat sima karakterknt kezelje a mintakarakterlncban. A vdkaraktert az ESCAPE kulcssz utn rjuk, s aposztrfok kz tesszk, ahogy a literlis karakterlncokat szoktuk. Ha a mintakarakterlncban egy helyettest karakter eltt vdkarakter tallhat, az adatbzisrendszer a helyettest karaktert literlisan (sz szerint) rtelmezi. Egy lehetsges plda az ESCAPE hasznlatra: Mutass egy listt azokrl a termkekrl, amelyeknek a termkkdja G_OO-val kezd dik, s egy szmmal vagy betvel vgzdik!" Fordts - Select product name and product code from the products table where the product code begins with 'G_OO' and ends in a single number or letter (Vlaszd ki a termknevet s termkkdot a termkek tbljbl azokra a termkekre, amelyeknek a termkkdja a G_OO karakterekkel kezddik, s egy szmjeggyel vagy betvel vgzdik.) Tisztzs - Select product name and product code from the products table where the product code begins with like 'G\_00_' and ends in a single number or letter SQL SELECT ProductName, ProductCode

FROM Products WHERE ProductCode LIKE ' G \ _ 0 0 _ ' ESCAPE ' \ '

Lthat, hogy ehhez a krelemhez az ESCAPE kapcsolt kell hasznlni mskpp az adatbzis-kezel rendszer az alhzst helyettestkarakterknt rtelmezn. Figyeljk meg, hogy a vdkaraktert belefoglaltuk a Tisztzs pontba is. Ajnlott gy letisztzni az lkdot, mert gy biztosan emlkezni fogunk, hogy az ESCAPE kapcsolt nem szabad kifelejtennk a SELECT utastsbl Ez a SELECT utasts meg fogja tallni az olyan termkkdokat, mint a G_002 vagy a G_OOX. Egy vagy kt olyan karaktert keresnk, amelyek alaprtelmezs szerint helyettest karakte rek, ezrt hasznlnunk kell az ESCAPE zradkot. Ha arra keresnk, hogy LIKE 'G_ O O _ ' , akkor az adatbzis-kezel rendszer minden olyan sort visszaad eredmnyknt, ahol a ter mkkd els betje 'G', valamilyen karakter ll a msodik helyen (a helyettest karakter miatt), nullk vannak a harmadik s negyedik helyen, s valamilyen karakterrel zrul az t dik helyen. Amikor a "V"-t lltjuk be vdkarakterknt, az adatbzisrendszer figyelmen kvl hagyja a vdkaraktert, de az els alhzst literlisan rtelmezi, nem helyettestknt Mivel a msodik alhzs el nem rtunk vdkaraktert, azt az adatbzisrendszer valdi he lyettestknt rtelmezi. Tartsuk szben, hogy vdkarakterknt nem szabad olyan karaktert hasznlnunk, ami a megtalland rtkekben szerepelhet. Nem j tlet az &-t hasznlni vdkarakterknt, ha olyan rtkekre keresnk, mint a Martin & Lewis, a Smith & Kearns vagy a Hernandez & Viescas. Emlkezznk arra is, hogy a vdkarakter csak a kzvetlenl utna kvetkez karakterre van hatssal, de annyi vdkaraktert hasznlhatunk a mintakarakterlncban, amennyire szksg van.

Null
Megtanultuk, hogyan kereshetnk teljes s rszleges rtkekre, gy most rtrhetnk az ismeretlen rtkekre. Az 5. fejezetben megtanultuk, hogy a Null nem azonos a null val, az egy vagy tbb res karaktert tartalmaz karakterlnccal vagy a nulla hosszsg karakterlnccal (ami olyan karakterlnc, amiben egyetlen karakter sem szerepel), mert ezek mind jelenthetnek valamit a megfelel krnyezetben. Azt is megtanultuk, hogy a Null azonos a hinyz vagy ismeretlen rtkekkel. Egy rtkkifejezs Null rtknek meghatrozshoz a Nullfelttelt hasznlhatjuk, ahogy a 6.6. brn lthatjuk.

6.6. bra
A Null felttel szintaxisdiagramja Ez a felttel veszi az rtkkifejezs rtkt, s az IS NULL lltssal eldnti, hogy Null rtk-e. Ez elg egyszer mvelet. Nzzk meg a kvetkez pldk segtsgvel, hogyan hasznlhatjuk ezt a felttelt.

Adj egy listt azokrl a vsrlkrl, akik nem adtk meg, hogy melyik megyben laknak!" Fordts - Select first name and last name as Customer from the customers table where the county name is unspecified (Vlaszd ki azoknak a vsrlknak a vezetk- s keresztnevt Customers nven a vsrlk tbljbl, akik nem adtk meg a megyt, ahol laknak.) Tisztzs - Select first name || ' ' || and last name as Customer from the customers table where the county name is null unspecified SQL SELECT CustFirstName || ' ' || CustLastName

AS Customer FROM Customers WHERE CustCounty IS NULL


A fenti SELECT utasts eredmnyben csak azok a vsrlk fognak szerepelni, akik nem tudtk vagy nem emlkeztek, hogy melyik megyben laknak, illetve azok, akik Washington D.C.-ben lnek (mivel Washington az egyetlen vros az Egyeslt llamokban, amelyik egyik megybe sem tartozik). Egy msik lehetsges krds: Mely rendezvnyeknek nincs mg szerzdsi sszege?" Fordts - Select engagement number and contract price from the engagements table for any engagement that does not have a contract price (Vlaszd ki azoknak a rendezvnyeknek a szmt s szerzdsi sszegt, amelyeknek nincs ra.) Tisztzs - Select engagement number and contract price from the engagements table for any engagement that does not have a where contract price is null SQL SELECT EngagementNumber, ContractPrice

FROM Engagements WHERE ContractPrice IS NULL


Ha felsznesen foglalkozunk ezzel a krelemmel, akkor egyszernek tnik csupn a 0 r rendezvnyeket kell megkeresni. Ezzel azonban vigyzzunk, mert hibs feltevsekhez ve zethet. Ha a pldban az gynksg egy reklmcl rendezvny szerzdsi sszegeknt 0-t tntet fel, akkor a 0 vals, jelentssel br rtk. Ezek szerint minden, mg meg nem hatro zott vagy el nem dnttt rnak az rtke valjban Null (vagy annak kellene lennie). Ez a plda mutatja, hogy rtennk kell a tblkban szerepl adatokat, hogy rtelmes, pontos lekrdezseket rhassunk. Ha vgrehajtunk egy SELECT utastst, s gy tnik, hogy a kapott eredmny hibs, ne essnk ktsgbe. Az els tletnk valsznleg az lesz,

hogy az egsz SELECT utastst jrarjuk, mert azt gondolhatjuk, hogy valamilyen vgzetes formai hibt ejtettnk. Mieltt azonban brmilyen drasztikus lpst tennnk, nzzk t jra az adatokat, amelyekkel ppen dolgozunk, s tudjuk meg, hogy pontosan hogyan hasznlhatjuk azokat. Ha jobban megrtettk az adatokat, sokszor szrevesszk majd, hogy csak nhny kisebb javtst kell eszkzlnnk a SELECT utastsn a megfelel adatok lekrdezshez. A Null rtkek megkeresshez a Nullfelttelt kell hasznlnunk. Egy olyan felttel, mint az < r t k k i f e j e z s > = Null, rvnytelen, mert egy rtkkifejezs rtke nem hasonlthat ssze egy olyan dologgal, ami - a meg hatrozsa szerint - ismeretlen.

Sorok kizrsa a NOT mvelettel


Eddig arrl volt sz, hogy miknt tudunk egyes sorokat belefoglalni az eredmnybe. Most nzzk meg, hogyan lehet kizrni sorokat az eredmnybl a NOT mvelet segtsgvel. Mr mutattunk egy egyszer mdszert a sorok kizrsra az egyenlsgi sszehasonlt fel ttelben a nem egyenl mvelettel. Ms feltteleknl is zrhatunk ki sorokat a NOT mve lettel. Ahogy a 6.7. brn lthat, a NOT lehetsges kiegsztje a BETWEEN, IN, LIKE s IS NULL lltsoknak. Amikor a felttel a NOT mveletet is tartalmazza, akkor a SELECT uta sts minden olyan sort el fog dobni, amelyekre az emltett lltsok brmelyike illeszkedik. Az eredmnyben szerepl sarok teht azok lesznek, amelyekre nem illeszkedik a felttel.

A kvetkez pldk megmutatjk, hogyan hasznlhatjuk a NOT mveletet egy keressi felttel rszeknt: Mutasd meg az sszes felvett megrendelst, kivve azokat, amelyeket jliusban adtak fel!" Egy ehhez hasonl krdshez olyan SELECT utastst kell rnunk, amely kizrja az adott felttelnek eleget tev sorokat. Ez sokszor olyan kifejezseket tartalmaz, amelyek sugalljk a NOT mvelet hasznlatt Lssunk nhny ehhez hasonl kifejezst, amellyel tallkozha tunk: ... ami nem 'Her'-rel kezddik! ...amelyek nem az Administrative vagy Personnel osztlyokhoz tartoznak!" ...akiknek van faxszmuk! ...akiket jnius 1. eltt vagy augusztus 31. utn vettek fel! Nha egy kis elemz munkt kell vgezni, hogy jl tudjuk lefordtani a krdses kifejezst. Egyes kifejezsek, pldul a fenti pldk kzl a harmadik, nem indokolja egyrtelmen a NOT mvelet hasznlatt Ebben az esetben az a lnyeg, hogy ki akarjuk zrni azokat, akiknek nincs faxszmuk Ahogy ilyen kifejezseket tartalmaz lekrdezsekkel kezdnk foglalkozni, gyakran elfordul, hogy rszletesen elemezni kell a krelmet, s esetleg jra is kell rni, hogy meghatrozzuk az eredmnybl kizrand sorokat. Erre nincs egyrtelm alapszably, de egy kis trelemmel s gyakorlssal knnyebben kitallhatjuk, hogy szks gnk van-e a NOT mveletre egy adott feladatnk Miutn meghatroztuk, hogy kell-e egyltaln bizonyos informcikat kizrni az eredmnybl, folytathatjuk a fordtssal: Mutass egy listt a felvett rendelsekrl, kivve azokat, amelyeket oktberben adtak fel! Fordts - Select order ID and order date from the orders table where the order date does not fall between October l, 2007, and October 31, 2007 (Vlaszd ki a megrendels szmt s dtumt a megrendelsek tbljbl, azoknak a rendelseknek az esetben, amelyeknek a megrendelsi dtuma nem 2007. oktber l. s 2007. oktber 31. kz esik.) Tisztzs - Select order ID and order date from the orders table where the order date does not fall between October- l, 2007, '2007-10-01' and October 31, 2007 '2007-10-31' SQL SELECT OrderID, OrderDate

FROM Orders WHERE OrderDate NOT BETWEEN '2 007-10-01' AND '2007-10-31'

Ezzel a SELECT utastssal olyan eredmnyt kapunk, amelyben nincs rendels a 2007. oktber 1. s 2007. oktber 31. kztti idszakbl, de ezen kvl minden megrendelst tartalmazni fog az Orders (Megrendelsek) tblbl. Az eredmnyek listjt mg tovbb szkthetjk, ha tbb felttelt alkalmazunk, gy, hogy az eredmny csak a 2007-ben feladott rendelseket tartalmazza (ezt a kvetkez rszben trgyaljuk). Tegyk fel, hogy a kvetkez krelmet szeretnnk az adatbzishoz intzni: Mutasd meg a kar sszes olyan dolgozjnak a szemlyi szmt, aki nem egyetemi tanr vagy docens!" Fordts - Select staff ID and title from the faculty table where the title is not 'professor' or 'associate professor' (Vlaszd ki a tanrazonostt s a rangot a tanszk tbljbl azokra, akiknek a rangja nem 'egyetemi tanr' vagy 'docens'.) Tisztzs - Select staffID and title from the faculty table where the title is not in ('professor, or 'associate professor) SQL SELECT StaffID, Title

FROM Faculty WHERE Title NOT IN ('Professor', 'Associate Professor')


Ebben az esetben ki kell zrni minden olyan tanrt, akinek a rangja megegyezik a kre lemben megfogalmazott valamelyik cmmel, ezrt a tagsgi felttelt alkalmazzuk a NOT mvelettel egytt a megfelel sorok kivlasztshoz. A sorok kizrsa az eredmnybl viszonylag egyszer mvelett vlik, amint hozzszok tunk a krelem helyzettl fgg elemzshez s jrafogalmazshoz. A folyamat lnyege -ahogy eddig is lthattuk - az, hogy meg tudjuk hatrozni az adott krelemhez haszn land felttel tpust.

Tbb felttel hasznlata


Az eddigi krdsek egyszerek voltak, s csak egy felttel kellett a megvlaszolsukhoz. Most megnzzk, hogyan vlaszolhatunk sszetett krdsekre tbb felttelt hasznlva. Kezdsknt nzzk a kvetkez krelmet: Adj egy listt azoknak a vsrlknak a vezetk- s keresztnevrl, akik Seattle-ben lnek, s a vezetknevk 'H' betvel kezddik! Az eddig tanultak alapjn biztosak lehetnk abban, hogy a krelem egy egyenlsgi sszehasonlt s egy mintaillesztsi felttelt ignyel. Felismertk a szksges feltteleket, de hogyan vonhatjuk azokat ssze egy keressi felttelbe? A vlaszt az SQL-szabvny keressi felttelnek utastsformja adja, ahogy a 6.8. brn lthat.

AND s OR
Kt vagy tbb felttelt az AND s OR mveletekkel vonhatunk ssze, s a krds megv laszolshoz szksges sszes felttel alkot egyetlen keressi felttelt. Ahogy a 6.8. brn is lthat, egy mr sszevont keressi felttelt is ssze lehet vonni egyb felttelekkel, ha a keressi felttelt zrjelbe tesszk. Ez igen sszetett WHERE zradkok ksztst teszi lehetv, amelyek pontosan megjellik az eredmnybe bekerl sorokat.

Az AND hasznlata
Az egyik mdszer kt vagy tbb felttel sszevonsra az AND mvelet hasznlata. Ezt akkor hasznljuk, ha az sszes sszevont felttelnek teljeslnie kell egy sorra, hogy az az eredmnyek kz kerlhessen. Hasznljuk fel a jelenlegi rsz elejn szerepl minta krdst pldaknt ennek a mveletnek a bemutatsra:

Adj egy listt azoknak a vsrlknak a vezetk- s keresztnevrl, akik Seattle-ben lnek, s a vezetknevk 'H' betvel kezddik!"
Fordts - Select first name and last name from the customers table where the city is 'Seattle' and the last name begins with 'H' (Vlaszd ki azoknak a vsrlknak a vezetk- s keresztnevt a vsrlk tb ljbl, akiknek a vrosa 'Seattle', s a vezetknevk 'H' betvel kezddik.) Tisztzs - Select first name and last name from the customers table where the city is = 'Seattle' and the last name begins with like 'H%' SQL SELECT CustFirstName, CustLastName

FROM Customers WHERE CustCity = 'Seattle' AND CustLastName LIKE 'H%'


Figyelembe vettk mind az egyenlsgi sszehasonlt felttelt, mind a mintaillesztsi felt telt, ahogy a krelem megkveteli, s az AND mvelettel biztostottuk, hogy mindkett igaz legyen azokra a sorokra, amelyek bekerlnek az eredmnybe. Ha egy sorra valamelyik felttel nem teljesl, az nem fog bekerlni az eredmnyek kz.

Annyi felttelt hasznlhatunk egyszerre, amennyire csak szksgnk van az adott krelem hez, csak ne felejtsk el, hogy az AND mvelettel sszevont sszes felttelnek igaznak kell lennie egy sorra, hogy az az eredmnyek kztt szerepelhessen, s emlkezznk arra is, hogy a teljes keressi felttelnek igaznak kell lennie egy sorra, hogy azt viszontlssuk az eredmnyben. Az eredmnyt kt lltsnak az AND mvelettel trtn sszevonsa esetn a 6.9. bra mutatja. Ha valamelyik kifejezs hamisra rtkeldik ki, akkor a sort a lekrdezs nem adja vissza.

Az OR hasznlata
A msik lehetsg kt vagy tbb felttel sszevonsra az OR mvelettel addik. Ezt akkor hasznljuk, ha az sszevont felttelek kzl elg valamelyiknek teljeslnie ahhoz, hogy egy sor az eredmnybe kerljn. Lssunk egy pldt az OR hasznlatra egy keressi felttelben: Mutasd meg azoknak a tanroknak a nevt, vrost s llamt, akik Seattle-ben lnek, vagy Oregon llambl jttek! Fordts - Select first name, last name, city and state from the staff table where the city is 'Seattle' or the state is 'OR' (Vlaszd ki azoknak a szemlyeknek a vezetk- s keresztnevt, vrost s llamt a tanrok tbljbl, akiknek a vrosa 'Seattle' vagy az llama 'OR'.) Tisztzs - Select first name, last name, city, and state from the staff table where the city is = 'Seattle' or the state is = 'OR' SQL SELECT StfFirstName, StfLastName, StfCity, StfState

FROM Staff WHERE StfCity = 'Seattle' OR StfState = 'OR'


Ebben az esetben mindkt egyenlsgi sszehasonlt felttelt belevettk a lekrdezsbe, s az OR mvelettel biztostottuk, hogy mr az egyik felttel teljeslsekor is igaz legyen a kifejezs. Amg a sorok teljestik valamelyik felttelt, addig be fognak kerlni az ered-

mnyek kz. Hogy knnyebben tlssuk, hogyan is mkdik mindez, nzzk meg a 6.10. brt, amelyen azt lthatjuk, hogy milyen eredmnyt ad, ha kt lltst sszevo nunk az OR mvelettel.

6.10. bra Kt llts sszevonsnak eredmnye az OR mvelet hasznlatakor Viszonylag knny eldnteni, hogy mikor kell az AND mveletet hasznlni a felttelek sszevonsra, viszont az OR hasznlata mr nem ennyire egyrtelm. Pldul nzzk a kvetkez krelmet: Mutass egy listt azoknak a beszlltknak a nevvel s telefonszmval, akiknek a telephelye Washingtonban vagy Kaliforniban tallhat!" Elszr nyilvn az AND mvelet hasznlatra gondolnnk, mert nyilvnvalnak tnik a felttel - azok a beszlltk rdekelnek minket, akiknek a telephelye Washingtonban s Kaliforniban tallhat. Ez azonban sajnos tveds. Ha tgondoljuk, egy beszllt vagy Washingtonban, vagy Kaliforniban lehet, mert az llamok oszlopba csak egyetlen llam nevt lehet berni. Ugye mennyivel tlthatbb most a felttel? A fejezetben korbban mr emltettk, hogy meg kell szoknunk a krelmek tanulmnyozst s elemzst, ahogy egyre sszetettebb krelmekkel tallkozunk. Prbljuk meg minl gyesebben megkeres ni a krelemben rejl feltteleket. Folytassuk teht a krelem lefordtsval: Mutass egy listt azoknak a beszlltknak a nevvel s telefonszmval, akiknek a telephelye Washingtonban vagy Kaliforniban tallhat! Fordts - Select name, phone number, and state from the vendors table where the state is 'WA' or 'CA' (Vlaszd ki azoknak a beszlltknak a nevt, telefonszmt s llamt a be szlltk tbljbl, akiknek az llama 'WA' vagy 'CA'.)

Tisztzs - Select name, phone number, and state from the vendors table where the state is = 'WA' or state = 'CA' SQL SELECT VendName, VendPhoneNumber, VendState

FROM Vendors WHERE VendState = 'WA' OR VendState = 'CA'


Mindkt egyenlsgi sszehasonlt felttelt belevettk a lekrdezsbe, s az OR mvelet

tel biztostottuk, hogy legalbb az egyik teljesljn. Figyeljk meg, hogy a state (llam) ktszer jelenik meg a Tisztzs s az SQL-utasts keressi felttelei kztt. Erre azrt van szksg, mert az sszehasonlt felttelek utastsformja a kvetkez:

rtkkifejezs <sszehasonlt mvelet> rtkkifejezs


Ne felejtsk el, hogy nem hagyhatunk ki semmilyen zradkot, kulcsszt vagy adott kife jezst az utastsbl, kivve, ha az feltteles eleme az utastsnak. Ezrt egy olyan felttel teljesen rvnytelen, mint a WHERE VendState = 'WA' OR ' C A ' . Megkrdezhetnnk, mirt is van ez, de a kifejezsekre alkalmazott mveletek sorrendjnek trgyalsakor - a kirt kelsi sorrendnl - ezt rszletesen el fogjuk magyarzni. Ebben az esetben az adatbzis-kezel rendszernk a kifejezst szigoran balrl jobbra haladva rtelmezi, teht elszr a VendState = 'WA' -t rtkeli ki. Az eredmny minden olyan sorra igaz lesz, ahol az llam Washington, s hamis, ha nem. A kvetkez lpsben az adatbzis-kezel ezt az igaz vagy hamis eredmnyt hasonltja ssze az 'OR' segtsgvel a literlis 'CA' szveggel - ami viszont nem igaz vagy hamis rtk! Az adatbzisrendszer ekkor hibt jelezhet (a 'CA' ami egy literlis karakterlnc - rvnytelen adattpus jelenleg az OR mvelet szmra), vagy csak azokat a sorokat adja vissza, ahol az llam Washington. Mindig bizonyosodjunk meg arrl, hogy a feltteleink teljesen s hibtlanul vannak megfo galmazva. Ha nem gy tesznk, akkor a SELECT utastsunk keressi felttele hibs lehet. Ezt a pldt arra hasznltuk hogy egy az OR mvelet esetben sokszor
elfordul hibra hvjuk fel a figyelmet. Viszont ha arra gondolunk, hogy egy tagsgi felttelt - pldul where VendState in ('WA' , 'CA') - hasznljunk a krelemhez, teljesen igazunk van. Nhny esetben nem csupn egy mdszer addik egy felttel kifejezsre.

Az AND s az OR egyttes hasznlata


Az s OR mveleteket klnsen bonyolult krdelmekhez egytt is hasznlhatjuk Pldul a kvetkez krelemhez mindkt mveletet egyszerre kell hasznlni:
Sorold fel a tanri kar azon tagjainak a nevt, akiknek a krzetszma 425, s a telefonszmuk 555-tel kezddik, valamint azoknak a nevt is, akiket 2007. oktber 1. s december 31. kztt vettnk fel!"

Mostanra knnyen el tudjuk dnteni, hogy milyen felttelek kellenek ehhez a krelemhez. Felismerhetjk, hogy hromfle felttelt kell alkalmaznunk egy egyenlsgi sszehasonlt felttelt a krzetszmhoz, egy mintaillesztsi felttelt a telefonszmhoz, s egy tartomny felttelt azoknak a tanroknak a megtallshoz, akiket oktber l. s december 31. vet tnk fel. Mr csak azt kell kitallni, hogy miknt vonhatjuk ezeket ssze. Az sszehasont s a mintaillesztsi felttelt egy mvelettel kell egyestennk, mert ezek hatrozzk meg a keresett telefonszmot, s mindkt felttelnek teljeslnie kell ahhoz, hogy egy sor bekerljn az eredmnybe. Az egyestett felttelt utna egy egysgknt kezel jk, s az OR mvelet segtsgvel sszevonjuk a tartomnyfelttellel. gy egy sor akkor kerl be az eredmnybe, ha vagy az egyestett felttelt, vagy a tartomnyfelttelt teljesti. A krelem s a fordtsa teht gy fest: Sorold fel a tanri kar azon tagjainak a nevt, akiknek a krzetszma 425, s a tele fonszmuk 555-tel kezddik, valamint azoknak a nevt is, akiket 2007. oktber 1. s december 31. kztt vettnk fel! Fordts - Select first name, last name, area code, phone number, and date hired from the staff table where the area code is 425 and the phone number begins with 555 or the date hired falls between October l, 2007 and December 31, 2007 (Vlaszd ki azoknak a tanroknak a vezetk- s keresztnevt, krzetszmt, telefonszmt s felvteli dtumt a tanrok tbljbl, akiknek a krzet szma 425, s a telefonszmuk 555-tel kezddik, vagy a felvteli dtumuk 2007. oktber l. s 2007. december 31. kz esik.) Tisztzs - Select first name, last name, area code, phone number, and date hired from the staff table where the area code is = '425' and the phone number begins with like '555%' or the date hired falls between October 1, 2007, '2007-10-01' and Decomber 31, 2007 '2007-12-31' SQL SELECT StfFirstName, StfLastName, StfAreaCode,

StfPhoneNumber, DateHired FROM Staff WHERE (StfAreaCode = '425' AND StfPhoneNumber LIKE ' 555% ') OR DateHired BETWEEN '2007-10-01' AND '2007-12-31'
Az elz plda jl mutatja, hogyan hasznlhatunk egy keressi felttelt egy msik keressi felttelen bell. Mieltt lefordtottuk a krelmet, azt mondtuk, hogy az sszehasonlt s a mintaillesztsi felttelt egyestennk kell az AND mvelettel, s egy egysgknt kell kezelni. Amikor feltteleket egy egysgbe vonunk ssze, akkor az az egysg is keressi felttel lesz, s a pldban lthat mdon zrjelek kz kell tenni.

Egy msik plda az s az OR hasznlatra: Mutasd meg azoknak az egyetemi tanroknak s docenseknek a nevt s rangjt, akiket 1989. mjus 16-n vettek fel! Fordts - Select first name, last name, title, and date hired from the staff table where the title is 'professor' or 'associate professor' and the date hired is May 16, 1989 (Vlaszd ki azoknak a szemlyeknek a vezetk- s keresztnevt, rangjt s felvteli dtumt a tanrok tbljbl, akiknek a rangja 'egyetemi tanr' vagy 'docens', s a felvteli dtumuk 1989. mjus 16.) Tisztzs - Select first name, last name, title, and date hred from the staff table where the title is = 'professor' or title = 'associate professor' and the date hired is = May-16, 1989 '1989-05-16' SQL SELECT StfFirstName, StfLastName, Title, DateHired

FROM Staff WHERE (Title = 'Professor' OR Title = 'Associate Professor') AND DateHired '1989-05-16'
szrevehetjk, hogy az OR-ral sszevont kt felttelt egy keressi felttelknt kezeltk. Ez a plda pusztn megersti azt a tnyt, hogy egy keressi felttel megfogalmazhat akr az AND, akr az OR mvelettel, de ne felejtsk el: a lnyeg az, hogy zrjelbe tegyk a keressi felttelt.

Sorok kizrsa: msodik felvons


gy tnhet, mintha ezzel egyszer mr tallkoztunk volna... Nincs ok az aggodalomra, a tmval mr tnyleg foglalkoztunk az elz rszekben legalbbis egy szintig. Ebben a fejezetben korbban mr megtanultuk, hogy a NOT mvelet feltteles kiegsztse a BETWEEN, IN, LIKE s IS NULL lltsoknak De ahogy a 6.11. brn is lthat, a NOT egy keressi felttel els kulcsszava is lehet, s lehetv teszi, hogy ugyangy zrjunk ki vele sorokat, mint az lltsoknl. Ezt a sajtos NOT mveletet egy felttel (llts) vagy egy begyazott keressi felttel eltt hasznlhatjuk Ugyanazt a felttelt itt is tbbfle mdon megfogalmazhatjuk.

Tegyk fel, hogy a kvetkez krelmet szeretnnk megfogalmazni: Mutasd meg azoknak a versenyeknek a helysznt s idpontjt, amelyeket nem a Bolero Lanes, az Imperial Lanes vagy a Thunderbird Lanes plyn tartanak! Nem nehz rjnni, hogy egy tagsgi felttelt fogunk alkalmazni ehhez a krdshez, csupn meg kell azt fogalmaznunk. Az egyik megkzelts, hogy a NOT mveletet hasznljuk az lltson bell:

WHERE TourneyLocation NOT IN ('Bolero Lanes', 'Imperial Lanes', 'Thunderbird Lanes')


A msik megkzelts szerint a NOT mveletet els kulcsszknt is rhatjuk a keressi felttel el:

WHERE NOT TourneyLocation IN ('Bolero Lanes', 'Imperial Lanes', 'Thunderbird Lanes')


Mindkt felttel ki fogja zrni azokat a versenyeket, amelyeknek a helyszne a Bolera Lanes, az Imperial Lanes vagy a Thunderbird Lanes. Annak azonban, hogy a NOT-ot a keressi fel ttel eltt hasznljuk, az az egyik elnye, hogy egy sszehasonlt felttelre is alkalmazhat. (Emlkezznk vissza, hogy az sszehasonlt felttel utastsformja nem tartalmazza a NOT kulcsszt lehetsges mveletknt.) gy teht egy sszehasonlt felttelt sorok kizrsra is hasznlhatunk. Ennek alkalmazst a kvetkez plda mutatja: Mutasd meg azokat a tekzket, akik nem Bellevue-ben lnek!" Fordts - Select first name, last name, and city from the bowlers table where the city is not 'Bellevue' (Vlaszd ki azoknak a tekzknek a vezetk- s keresztnevt, illetve
vrost a tekzk tbljbl, akiknek a vrosa nem 'Bellevue'.)

Tisztzs - Select first name, last name, and city from the bowlers table where the city is not = 'Bellevue' SQL SELECT BowlerFirstName, BowlerLastName, BowlerCity

FROM Bowlers WHERE NOT BowlerCity = 'Bellevue'


Igen, tudjuk jl, hogy ezt a felttelt a WHERE BowlerCity <> 'Bellevue' formban is kifejezhettk volna. Ez a plda csak azt hangslyozza, hogy egy felttelt szmos mdon megfogalmazhatunk. Most, hogy megtanultuk, hogyan hasznlhatjuk a NOT mveletet egy egyszer s egy sszetett keressi felttelben, ismerkedjnk meg azzal a problmval, amikor egy keressi felttelt kt NOT mvelettel runk fel, s ez a sorokat belefoglalja az eredmnybe, nem pedig kizrja. Lssunk egy pldt erre:

Mely alkalmazottaink nem tanrok vagy tanrsegdek?"


Fordts - Select first name, last name, and title from the staff table where the title is not 'teacher' or 'teachers aide' (Vlaszd ki azoknak a vezetk- s keresztnevt, illetve rangjt a tanrok tbljbl, akiknek a cme nem 'tanr' vagy 'tanrsegd'.) Tisztzs - Select first name, last name, and title from the staff table where the title is not in ('teacher', or 'teacher''s aide') SQL SELECT StfFirstName, StfLastName, Title

FROM Staff WHERE NOT Title NOT IN ('Teacher', 'Teacher''s Aide')


Csodlkozhatunk, hogy mit keres kt aposztrf a 'Teachers''s Aide' literlis karakterlncban. Az SQL-szabvny azt mondja, hogy aposzt rffal kell elvlasztani a literlis karakterlncokat s idpontokat. Amikor egy aposztrfot szeretnnk egy literlis karakterlncba rni, akkor meg kell gyzni" az adatbzis-kezel rendszernket a szndkunkrl az aposztrf ktszeres bersval. Ha nem gy tesznk, akkor az aposztrf a karakterlnc vgt fogja jellni, a msodik aposztrf utn kvetkez s Aide szvegre pedig az adatbzisrendszer nyelvtani hibt jelez.
Feltesszk termszetesen, hogy a kt NOT mvelet egyike figyelmetlensgbl kerlt bele a lekrdezsbe. A SELECT utasts gy is vgrehajthat, de rossz sorokat fogunk eredmny knt kapni. Ebben az esetben a kt NOT mvelet kioltja egymst - mint kt mnusz eljel a matematikban vagy a logikban -, s az IN llts fogja az eredmnybe kerl sorokat meghatrozni. Teht ahelyett, hogy a tanrokon s tanrsegdeken kvl mindenkit ltnnk az eredmnyek kztt, csak a tanrok s tanrsegdek fognak az eredmnyben szerepelni. mbr szndkosan nem runk ilyen keressi felttelt, vletlenl knnyen elfordulhat. Emlkezznk arra, hogy gyakran az egyszer hibk okozzk a legtbb gondot.

Kirtkelsi sorrend
Az SQL-szabvny meghatrozza, hogy egy adatbzis-kezel rendszernek hogyan kell kir tkelnie az egyes feltteleket egy keressi felttelen bell, illetve a kirtkels sorrendjt. Ebben a fejezetben megtanultuk, hogyan rtkeli ki az adatbzisrendszer az egyes tpus feltteleket, most pedig megnzzk, hogy az adatbzisrendszer mikor rtkeli ki az egyes feltteleket.

Alaprtelmezs szerint az adatbzisban balrl jobbra haladva trtnik a felttelek kir tkelse. Ez klnsen igaz az egyszer felttelekre. A kvetkez pldban a SELECT utasts elszr megkeresi azokat a sorokat, ahol a szlltsi dtum egyenl a megrende lsi dtummal, s utna hatrozza meg, hogy mely sorokban 1001 a megrendel szma. Azok a sorok, amelyek mindkt felttelt teljestik, bekerlnek az eredmnyek kz.

SQL

SELECT CustomerID, OrderDate, ShipDate FROM Orders WHERE ShipDate = OrderDate AND CustomerID = 1001

Ha azt szeretnnk, hogy a SELECT utasts elbb egy bizonyos megrendeli szmot keressen, s utna rtkelje ki a szlltsi dtumot, csak cserljk meg a kt felttel helyt. Ksbb ebben a rszben elmagyarzzuk, hogy esetleg mirt szeretnnk ilyet tenni. Amikor egy keressi felttel tbbfle egyszer felttelbl ll, az adatbzis egy adott sorrendben rtkeli ki azokat, az egyes felttelekben szerepl mveletektl fggen. Az SQL-szabvny a kvetkez elsbbsgi sorrendet (vagy kirtkelsi sorrendet) hatrozza meg a mveletek kirtkelsre:

A kvetkez SELECT utastsban egy olyan keressi felttelre lthatunk pldt, amelynek a kirtkelsekor az adatbzisnak az elsbbsgi sorrendet kell kvetnie. Ebben az esetben az adatbzis elvgzi az sszeads mvelett, vgrehajtja az sszehasonltsokat, s eldnti, hogy valamelyik felttel igaz lett-e. Ha valamelyik sor kielgtette valamelyik felttelt, akkor az bekerl az eredmnyek kz. SQL

SELECT CustomerID, OrderDate,ShipDate FROM Orders WHERE CustomerID 1001 OR ShipDate = OrderDate + 4

A felttelek elsbbsge
Jelentsen javthatjuk a keressi feltteleink pontossgt, ha megrtjk az elsbbsgi sor rend lnyegt. Ezzel a tudssal kpesek lesznk megalkotni a szksges feltteleket, vi szont a flrerthet felttelek megfogalmazsval vigyzni kell, mert vratlan eredmnyt kaphatunk. Nzznk meg a kvetkez pldn egy lehetsges problmt: SQL

SELECT CustFirstName, CustLastName, CustState, CustZipCode FROM Orders WHERE CustLastName = 'Patterson' AND CustState = 'CA' OR CustZipCode LIKE '%9'

Ebben a pldban nehz eldnteni, hogy mi a valdi clja a keressi felttelnek, mivel ktfle mdon is rtelmezhetjk: 1. A Kalifornia llamban l Patterson neveket keressk, vagy brkit, akinek az irnytszma 9-esre vgzdik. 2. A Patterson neveket keressk, s brkit, aki Kaliforniban l, vagy az irnytszma 9-esre vgzdik. Ha emlksznk a kirtkels sorrendjre, akkor tudjuk, hogy az els megolds lenne a j, mivel a rendszernek az AND kulcsszt az OR mvelet eltt kellene kirtkelnie. De biztos mindig emlkezni fogunk a kirtkelsi sorrendre? Ezt a bizonytalansgot elkerlhetjk, s tlthatbb keressi felttelt rhatunk, ha zrjeleket hasznlunk, amelyekkel sszevonunk egyes feltteleket, s megadjuk a kirtkelsk sorrendjt. Pldul a keressi felttelnek az els megolds szerinti rtelmezshez a WHERE zradkot a kvetkez mdon rhatjuk

WHERE (CustLastName = 'Patterson' AND CustState = 'CA') OR CustZipCode LIKE '%9'


A zrjelek biztostjk, hogy az adatbzis elbb elemzi s rtkeli ki a kt sszehasonlt felttelt, mint a mintaillesztsi felttelt. Ha viszont a msodik megolds szerinti rtelmezst szeretnnk megvalstani, akkor a kvetkez WHERE zradkot hasznlhatjuk

WHERE CustLastName = 'Patterson' AND (CustState - 'CA' OR CustZipCode LIKE '%9')


Ebben az esetben az adatbzis az els sszehasonlt felttelt az ufn elemzi s rtkeli ki, miutn vgzett a msodik sszehasonlt s mintaillesztsi felttellel. A felttelek zrjelezse mostanra mr ismers lehet, hiszen a fejezetben megtanultuk, hogyan tehetjk ezt meg, amikor a felttelek sszevonsa a cl. Most csak megprbljuk kihangslyozni, hogy a zrjelek helynek komoly hatsa lehet az eredmnyre nzve. A zrjelekbe tett felttelekbl akrhnyat hasznlhatunk, s mg egymsba is gyazhatjuk ket szksg szerint. A kifejezsekhez hasonlan a keressi felttelek feldolgozsa is balrl jobbra trtnik, illetve a legbelstl a klsk fel haladva a zrjelekben, kivve, ha kt vagy tbb felttel azonos szinten van, ilyenkor ugyanis az adatbzisrendszer elbb az AND, majd az OR mveleteket rtelmezi. Az adatbzis a kvetkez mdon kezeli a zrjelezett keressi feltteleket: A zrjeles keressi felttelek feldolgozsa a nem zrjelezett keressi felttelek eltt trtnik. Kt vagy tbb zrjelezett keressi felttel feldolgozsa balrl jobbra megy vgbe. Az egymsba gyazott zrjeles keressi felttelek feldolgozsra a legbelstl a legklsig kifel haladva kerl sor.

Miutn az adatbzis elemezte az adott zrjeles felttelt, az sszes kifejezst a szoksos kir tkelsi sorrendben hajtja vgre. Ha megfelel odafigyelssel fordtottuk le a krdsnket, s hatkonyan hasznltuk a zrjeleket a keressi felttelben, akkor pontosabb eredmnyt fogunk kapni.

A kevesebb tbb
Ebben a rszben mr emltettk, hogy az adatbzis kezdetben balrl jobbra halad a feltte lek kirtkelsvel, s az elsbbsgi sorrendet akkor alkalmazza, ha sszetett felttelt adtunk meg. Arrl is volt sz, hogy a zrjelek hasznlatnak kzvetlen hatsa van az ered mnyre. Most egy egyszer, ltalnos tancsot adunk a keressi folyamat felgyorstsra: krjnk kevesebbet, azaz kevesebb oszlopot hasznljunk a krds megvlaszolshoz, s a keressi felttelt a lehet legjobban szktsk le, gy az adatbzis-kezel a lehet legkeve sebb sort fogja feldolgozni. Ha tbb felttelt kell hasznlnunk, bizonyosodjunk meg arrl, hogy elszr a legtbb sort kizr felttel feldolgozsra kerl sor, s az adatbzis reml hetleg gyorsabban megtallja a szksges vlaszt. (Itt lehet igazn elnys, ha alaposan ismerjk az elsbbsgi sorrendet.) Ezt a tippet egy korbban hasznlt pldn mutatjuk be: SQL

SELECT CustomerID, OrderDate, ShipDate FROM Orders WHERE ShipDate = OrderDate AND CustomerID = 1001

Ennl az esetnl egy sornak mindkt felttelt teljestenie kell, hogy az eredmnyek kztt szerepelhessen. Az lltsok ilyen sorrendje arra utastja az adatbzis-kezelt, hogy hason ltson ssze minden szlltsi dtumot a hozz tartoz megrendelsi dtummal Ennek a felttelnek a megvizsglsa a tblban szerepl sorok szmtl fggen jelents idt is ignybe vehet. Ezutn az adatbzis azon sarok kztt, amelyekre az elz felttel igaz lett, megkeresi az 1001-es vsrlazonost szmot tartalmaz sorokat. Lssunk egy taln jobban megfogalmazott lekrdezst ugyanezzel a felttellel: SQL

SELECT CustomerID, OrderDate, ShipDate FROM Orders WHERE CustomerID = 1001 AND ShipDate = OrderDate

Most az adatbzis-kezel vrhatan elbb a vsrlazonost szmt fogja keresni. Ez a felttel feltehetleg kevesebb sort eredmnyez, ami azt jelenti, hogy az adatbzisnak kevesebb id kell a szlltsi dtum felttelnek kirtkelshez.

Ezt a mdszer rdemes tvinni a napi gyakorlatba s alkalmazni a keressi felttelek megfogalmazsnl Ez hossz tvon biztostja, hogy a SELECT utastsainkat gyorsan s hatkonyan vgre lehessen hajtani. Tanulmnyozzuk az adatbzisrendszernk kziknyvt, hogy milyen ms eljrsokkal tudjuk tovbb optimalizlni a SELECT utastsainkat Jformn az sszes kereskedelmi forgalomban kaphat adatbzis rendszer tartalmaz lekrdezs-optimalizl eljrsokat, amelyek tn zik a lekrdezsnket, s megprbljk kitallni, hogyan tudna az a lehet leggyorsabban lefutni. Az optimalizl eljrsok hatkonysgra az adatbzis rendszergazdja l tal belltott oszlopindexeknek van a legnagyobb befolysuk, de nem rt, ha gyakoroljuk, hogy a legtbb sort kizr felttelt adjuk meg els felttelknt, mert ezzel is segthetjk az adatbzisrendszer sajt optimalizl eljrsait. Most, hogy megrtettk a keressi felttelek sszevonsnak mdszereit, tegynk egy kis kitrt valami mg sszetettebb fel. Mit tehetnk, ha azokat a sorokat akarjuk megtallni, amelyekben rtkek egy tartomnya megegyezik ms rtkek egy tartomnyval? Olvassunk tovbb!

Egymst tfed tartomnyok ellenrzse


A BETWEEN nagyon jl mkdik, ha egyetlen oszlopban keresnk olyan rtket, ami egy adott tartomnyban van. Azt is megtanultuk, hogy egy rtket is vizsglhatunk, hogy benne van-e kt oszlop (als s fels hatr) ltal meghatrozott tartomnyban. De mit kell tennnk, ha el szeretnnk eldnteni, hogy egy tartomny tfed-e egy msikat? Pldul tudni szeretnnk, hogy mely rendezvnyekre (mindegyiknek van kezd s zr dtuma) kerl sor 2007. november 12. s 2007. november 18. kztt. Els gondolatunk a BETWEEN hasznlata lehet: Mutasd meg azokat a rendezvnyeket, amelyekre 2007. november 12. s 2007. november 18. kztt kerl sor!" Fordts - Select engagement number, start date, and end date from the engagements table where start date is between November 12, 2007, and November 18, 2007 and end date is between November 12, 2007, and November 18, 2007 (Vlaszd ki azoknak a rendezvnyeknek a szmt, illetve a kezd s zr dtumt a rendezvnyek tbljbl, amelyeknek a kezd dtuma 2007. november 12. s 2007. november 18., a zr dtuma pedig 2007. november 12. s 2007. november 18. kztti.) Tisztzs - Select engagement number, start date, and end date from the engagements table where start date is between November 12, 2007 '2007-11-12'

and November 18, 2007 '2007-11-18' and end date is between November 12, 2007 2007-11-12' and November 18, 2007 '2007-11-18' SQL

SELECT EngagementNumber, StartDate, EndDate FROM Engagements WHERE StartDate BETWEEN '2007-11-12' AND '2007-11-18' AND EndDate BETWEEN '2007-11-12' AND '2007-11-18'

Majdnem j, de nem teljesen. Valjban azok a rendezvnyek rdekelnek minket, amelyeknek brmelyik idpontja a kt adott novemberi nap kz esik. Hogy megrtsk, hogy mirt nem mkdik egy ilyen egyszer kombincija a BETWEEN zradkoknak, nzzk meg a 6.12. brt.

Ahogy ezen az brn lthatjuk, a rendezvnyeknek ngyfle olyan idszaka van, ami rszben vagy teljesen a kvnt hten bellre esik. Nhny rendezvny teljesen rsze az idszaknak, ezeket az A vonal jelli. Nhny a megadott idszak eltt kezddik, de abban r vget; ezeket jelli a B vonal. Msok viszont az idszakban kezddnek, de utna fejezdnek be; ezeket mutatja a C vonal. Vgl, vannak olyan rendezvnyek, amelyek az idszak eltt kezddnek, s utna fejezdnek be; ezeket a D vonal jelli. Ha tgondoljuk, hogyan tettk fel a krdst, az arra adott vlasz csak az A vonalhoz tartoz rendezvnyeket fogja megadni. A B azrt nem lesz j, mert a kezd dtum nem november 12. s november 18. kz esik, mg ha a rendezvny egy rszre az adott idtartamban kerl is sor. A C-t azrt kell kizrni, mert a zr dtum nincs az adott napok kztt, a D pe dig azrt nem lesz az eredmnyek kztt, mert mind a kezd, mind a zr dtum az adott idszakon kvlre esik, mg ha maga a rendezvny vgig az adott idszak alatt tart is. Teht mi a megolds erre a problmra? rhatunk feltteleket mind a ngy eshetsgre kln:

WHERE (StartDate BETWEEN '2007-11-12' AND '2007-11-18' AND EndDate BETWEEN '2007-11-12' AND '2007-11-18') OR (StartDate <= '2007-11-12') AND EndDate BETWEEN '2007-11-12' AND '2007-11-18') OR (StartDate BETWEEN '2007-11-12' AND '2007-11-18' AND EndDate >= '2 0 07-11-18') OR (StartDate <= '2007-11-12' AND EndDate >= '2007-11-18')
Nem tl szp, ugye? De nzzk meg jobban! Mi az az egy dolog, ami minden kezd d tumnl azonos? Mindegyik kisebb vagy egyenl, mint az idtartam zr dtuma! Ugyangy a zr dtumok mind nagyobbak vagy egyenlk, mint az idszak kezd dtuma. Teht az egyszer vlasz a kvetkez: SQL

SELECT EngagementNumber, StartDate, EndDate FROM Engagements WHERE StartDate <= '2007-11-18' AND EndDate >= '2007-11-12'

Nem sokkal egyszerbb? Tartsuk szben ezt a megoldst - szksgnk lesz r a fejezet vgn tallhat egyik mintafeladat megoldshoz. Most pedig trjnk vissza a szoksos programozshoz - nzzk t a Null helyzett mg egyszer.

Visszatrs a Null-okhoz: egy figyelmeztet megjegyzs


ppen ideje, hogy visszatrjnk a Null rtkekhez. Az 5. fejezetben megtanultuk, hogy a Null egy rtk hinyt jelenti, egy Null rtket feldolgoz kifejezs pedig Null rtkkel fog visszatrni. Ugyanez igaz a keressi kifejezsekre is. Egy Null rtket kirtkel llts soha nem lehet igaz - viszont (brmilyen furcsa is) az llts hamis sem lehet! Az SQLszabvny brmely, Null rtket kirtkel llts eredmnyeknt ismeretlent hatroz meg. Emlkezznk arra, hogy egy lltsnak igaznak kell lennie azokra a sorokra, amelyek be kerlnek az eredmnybe, teht hamis vagy ismeretlen rtkek esetn a sort ki kell zrni. Ennek a tisztzshoz tanulmnyozzuk a 6.13. s 6.14 brkat, amelyeken az elszr a 6.9. s 6.10. brkon ltott igazsgtblzatok szerepelnek, ezttal azonban azokkal az ismeretlen rtkekkel egytt, amiket egy Null rtk kirtkelsekor kapunk. Lthat, hogy egy llts kirtkelse egy Null rtk oszlopon igencsak megkavarja az eredmnyt! Pldul tegyk fel, hogy van egy egyszer sszehasonlt lltsunk: A = B. Ha akr A, akr B egy adott sorra Null rtk, akkor az sszehasonlts eredmnye isme retlen lesz. Mivel ez nem igaz eredmny, a sort az adatbzis-kezel nem jelli ki. Ha A = B nem igaz, azt vrhatnnk, hogy a NOT (A = B) igaz lesz. Nem! Ez szintn ismeretlen ered mnyt ad. A 6.15. bra segt megrteni, hogy is van ez.

6. 15. bra
A NOT mvelet alkalmazsa igaz/hamis ismeretlen rtkre

Tegyk fel, hogy a kvetkez lekrdezst szeretnnk intzni az adatbzishoz: - Mutasd meg azoknak a nevt s a telefonszmt King megybl, akiknek a vezetkneve Hernandez!" Fordts - Select first name, last name, and phone number from the customers table where the county name is 'King' and the last name is 'Hernandez' (Vlaszd ki azoknak a vsrlknak a vezetk- s keresztnevt, illetve a tele fonszmt a vsrlk tbljbl, akiknek a megyje 'King', s a vezetkne vk 'Hernandez'.) Tisztzs - Select first name, last name, and phone number from the customers table where the county name is = 'King' and the last name is = 'Hernandez' SQL SELECT CustFirstName, CustLastName, CustPhoneNumber

FROM Customers WHERE CustCounty = 'King' AND CustLastName = 'Hernandez'


Jl tudjuk, hogy egy sornak mindkt felttelt teljestenie kell, hogy bekerlhessen az eredmnyek kz. Ha vagy a megye neve, vagy a vezetknv Null, akkor az adatbzis az adott sort eldobja. Nzzk meg a kvetkez lekrdezst:

Mutasd meg azoknak a dolgozknak a nevt, akik vgzett tancsadk, vagy akiket 2007. szeptember l-n vettek fel! Fordts Select last name and first name from the staff table where the title is graduate counselor or date hired is September l, 2007 (Vlaszd ki azoknak a vezetk- s keresztnevt a tanrok tbljbl, akik nek a cme graduate counselor, vagy akiknl a felvtel dtuma 2007. szep tember 1.) Tisztzs Select last name and first name from the staff table where the title is = 'graduate counselor' or date hired is = Septomber 1, 2007 '2007-09-01' SQL SELECT StfLastName, StfFirstName

FROM Staff WHERE Title = 'Graduate Counselor' OR DateHired = '2 0 0 7 -0 9 -0 1 '


Ugyan azt vrhatnnk, hogy a Null rtkeknek hasonl hatsuk van az OR mvelettel sszevont felttelekre, mint az AND hasznlatakor, de ez nem szksgszer. Egy sor akkor is bekerlhet az eredmnybe, ha a fenti felttelek valamelyikt teljesti. Vessnk ismt egy pillantst a 6.14. brra. A Title s a DateHired rtkeire alapozva a 6.2. tblzat megmu tatja, hogy az adatbzis miknt dnti el, hogy egy sor szerepelhet-e az eredmnyek kztt az OR mvelet hasznlatnl

6.2. tblzat Az eredmnyek meghatrozsa az OR hasznlatnl

Ha azt felttelezzk, hogy az eredmny hibs adatokat tartalmaz, ellenrizzk az adott oszlopokat a Null felttellel. Ezzel lehetsgnk addik arra, hogy szksg szerint foglal kozzunk a Null rtkekkel, s utna jra lefuttassuk az eredeti SELECT utastst. Pldul

ha gy gondoljuk, hogy nhny graduate counselor (vgzett tancsad) hinyzik az eredmnybl, lefuttathatjuk a kvetkez SELECT utastst, hogy lssuk, hogy a feltte lezsnk igaz-e: SQL

SELECT StfLastName, StfFirstName, Title FROM Staff WHERE Title IS NULL

Ha vannak Null rtkek a Title oszlopban, akkor ennek a SELECT utastsnak az ered mnye az sszes olyan dolgozt tartalmazni fogja, akinek nincs meghatrozva a rangja az adatbzisban. Ezutn ezeken az adatokon elvgezhetjk a szksges teendket, majd visszatrhetnk az eredeti SELECT utastshoz. Mg nem fejeztk be a Null rtkek trgyalst. Mg egyszer visszatrnk a Null-okhoz a 12. fejezetben, amikor az adatsszest SELECT utastsokat trgyaljuk

Felttelek ms megfogalmazsban
Az ebben a fejezetben tanultak egyik elnye, hogy most mr szmos mdon ki tudunk fejezni egy adott felttelt. Nzznk erre egy pldt a kvetkez lekrdezssel:

Add meg minden olyan alkalmazott nevt, akit 2007 oktberben vettek fel!
A krds megvlaszolshoz azokat a felvteli dtumokat kell megkeresnnk, amelyek 2007. oktber l. s 2007. oktber 31. kz esnek. Az eddig tanultakra alapozva ezt a felttelt ktfle mdon rhatjuk fel:

DateHired BETWEEN '2007-10-01' AND '2007-10-31' DateHired >= '2007-10-01' AND DateHired <= '2007-10-31'
Mindkt felttel ugyanazokat a sorokat fogja bevlasztani az eredmnyek kz - az, hogy melyiket vlasztjuk, csak tlnk fgg. Nhnyan az els kifejezst talljk rthetbbnek, mg egyesek a msodikat rszestik elnyben. Nhny plda egyenrtk felttelekre:

Mutasd meg azokat a beszlltkat, akiknek a telephelye Kaliforniban, Oregonban vagy Washingtonban tallhat!

VendState IN ('CA', 'OR', 'WA') VendState = 'CA' OR VendState = 'OR' OR VendState = 'WA'
Adj egy listt azokrl a vsrlkrl, akiknek a vezetkneve H'-val kezddik!

CustLastName >= 'H' AND CustLastName <= 'HZ' CustLastName BETWEEN 'H' AND 'HZ' CustLastName LIKE 'H%'

,,Mutasd meg azokat a hallgatkat, akik nem Seattle-ben vagy Redmondban lnek!"

StudCity <> 'Seattle' AND StudCity <> 'Redmond' StudCity NOT IN ('Seattle', 'Redmond') NOT (StudCity = 'Seattle' OR StudCity = 'Redmond')
Egy felttel megfogalmazsnak nincs rossz megoldsa, de lehet hibsan fogalmazni, ha nagyvonalan figyelmen kvl hagyjuk a nyelvtant. (Mint tudjuk, ekkor a felttel kirtke lse hibs lesz.) Ennek ellenre nhny adatbzisrendszer egyes feltteltpusokat megpr blhat optimlisan vgrehajtani a gyorsabb feldolgozs rdekben, s ekkor ajnlott ezeket hasznlni. Nzznk utna az adatbzisrendszernk kziknyvben, hogy vannak-e ilyen elnyben rszestett mdszerek a felttelek megfogalmazsnl

Pldk
Megtanultuk az sszes szksges technikt, ami a megbzhat keressi felttelek elksztshez szksges. Nzznk ht pldkat a klnbz keressi felttelekre a mintaadatbzisokbl vett tblk segtsgvel! Ezek a pldk megmutatjk, hogyan hasznljuk a keressi feltteleket az adatok szrsre. Az SQL-utastsok utn a mintalekrdezsek eredmnyeit is mellkeltk; ezeket kell kap nunk a mveletek vgrehajtsa utn. Az eredmny felett lthat cm a lekrdezs neve, amelyen a lekrdezst megtallhatjuk a CD mellklet mintaadatai kztt. Minden lekrde zst a megfelel rnintaadatbzisban helyeztnk el (ahogy a pldknl jelltk), s az eh hez a fejezethez tartoz pldkat a CH06 eltaggal lttuk el. A pldkat a knyv beveze tsben lert mdon tlthetjk be s prblhatjuk ki. A kvetkez pldknl sszevontuk a Fordts s Tisztzs rszeket, hogy tovbb gyakorolhassuk az egyests folyamatt.

Sales Orders adatbzis


Mutasd meg a 1001-es vsrli szmmal rendelkez vsrl megrendelseit! Fordts/ - Select the order number and customer ID from the orders Tisztzs table where the customer ID is equal to = 1001 (Vlaszd ki a megrendels szmt s a vsrl azonostjt a megrendel sek tbljnak azon soraibl, ahol a vsrlazonost rtke 1001.) SQL SELECT OrderNumber, CustomerID

FROM Orders WHERE CustomerID = 1001

Mutasd meg a 'Dog' kezdet termkek bcrendbe szedett listjt!" Fordts/ Select the product name from the products table where the Tisztzs product name like 'Dog%' and order by product name (Vlaszd ki azoknak a termkeknek a nevt a termkek tbljbl, amelyeknl a termknv 'Dog'-gal kezddik.) SQL SELECT ProductName

FROM Products WHERE ProductName LIKE 'Dog%' ORDER BY ProductName

Csak emlkeztetni szeretnnk arra, hogy az ORDER BY zradkot a SELECT utasts vgn kell elhelyezni. Ha szksges, olvassuk t jra a 4. fejezet Az informcik rendezse cm rszt.

Entertainment Agency adatbzis


Mutass egy nvsorrendbe szedett listt a bellevue-i, redmondi s woodinville-i eladkrl!"
Fordts/ Select stage name, phone number, and city Tisztzs from the entertainers table where the city is in ('Bellevue', 'Redmond', or Woodinville') and order by stage name (Vlaszd ki azoknak az eladknak a mvsznevt, telefonszmt s vro st, akiknek a vrosa 'Bellevue', 'Redmond' vagy 'Woodinville', s rendezd a listt a mvsznv szerint.) SQL SELECT EntStageName, EntPhoneNumber, EntCity

FROM Entertainers WHERE EntCity IN ('Bellevue', 'Redmond', 'Woodinville') ORDER BY EntStageName

Mutasd meg az sszes olyan rendezvnyt, amely ngy napig tart! Tisztzs - Select engagement number, start date, and end date from the engagements table where the CAST(end date minus - start date AS INTEGER) is equal to = 3
Ford. - (Vlaszd ki azoknak a rendezvnyeknek a szmt s kezd-, illetve zr dtumt a rendezvnyek tbljbl, amelyeknl a CAST(zr dtum mnusz kezd dtum AS INTEGER) rtke 3.) SQL

SELECT EngagementNumber, StartDate, EndDate FROM Engagements WHERE CAST(EndDate - StartDate AS INTEGER) = 3

Minden rendezvny a kezd dtumtl a zr dtumig tart, s ezek is beleszmtanak az idtartamba. Amikor kivonjuk a StartDate rtkt az EndDate rtkbl, eggyel kevesebb napot kapunk eredmnyl, mint a rendezvny tel jes idtartama, ezrt hasonltjuk ssze a szmts eredmnyt a 3-mal s nem a 4-gyel.

School Scheduling adatbzis


Adj egy nv szerint rendezett listt az vi 40 000 s 50 000 dollr kztti fizetst kap dolgozk nevvel s fizetsvel! Fordts/ Select first name, last name, and salary Tisztzs from the staff table where the salary is between 40000 and 50000, then order by last name, and first name
(Vlaszd ki azoknak a dolgozknak a kereszt- s vezetknevt, illetve fize tst a dolgozk tbljbl, akiknek a fizetse 40 000 s 50 000 kztti, s rendezd a listt vezetknv, majd keresztnv szerint.) SQL

SELECT StfFirstName, StfLastName, Salary FROM Staff WHERE Salary BETWEEN 40000 AND 50 00 0 ORDER BY StfLastname, StfFirstName

Mutasd meg azoknak a hallgatknak a listjt, akiknek a vezetkneve 'Kennedy', vagy akik Seattle-ben lnek!" Fordts/ Select first name, last name, and city Tisztzs from the students table where the last name is = 'Kennedy' or the city is = 'Seattle' (Vlaszd ki azoknak a hallgatknak a keresztnevt, vezetknevt s vrost a hallgatk tbljbl, akiknek a vezetkneve Kennedy vagy a vrosa Seattle.) SQL SELECT StudFirstName, StudLastName, StudCity

FROM Students WHERE StudLastName = 'Kennedy' OR StudCity = 'Seattle'

Bowling League adatbzis


"rd ki azoknak a csapatoknak az azonostszmt, amelyek egy vagy tbb meccset nyertek az els tzbl a 3. jtkban!" Fordts/ Select the team ID, match ID, and game number from the Tisztzs match_games table where the game number is =3 and the

match ID is between 1 and 10


(Vlaszd ki azokat a csapatazonostkat, mrkzsazonostkat s jtksz mokat a jtkok tbljbl, amelyeknl a jtk szma 3, s a mrkzs azo nostja 1 s 10 kz esik.) SQL

SELECT WinningTeamID, MatchiD, GameNumber FROM Match_Games WHERE GameNumber = 3 AND MatchID BETWEEN 1 AND 10

"rd ki azokat a tekzket a 3, 4. s 5. csapatbl, akiknek a vezetkneve H-val kezddik! Fordts/ Select first name, last name, and team ID Tisztzs from the bowlers table where the team ID is either in (3, 4, or 5) and the last name begins with the letter like 'H%' (Vlaszd ki azoknak a kereszt- s vezetknevt, illetve csapatazonostjt a jtkosok tbljbl, akiknek a csapatazonostja 3, 4 vagy 5), s a veze tkneve H betvel kezddik.) SQL SELECT BowlerFirstName, BowlerLastName, TeamID

FROM Bowlers WHERE (TeamID IN ( 3 , 4 , 5 ) ) AND (BowlerLastName LIKE 'H%')

Recipes adatbzis
Sorold fel azokat a recepteket, amelyekhez nem tartozik megjegyzs!
Fordts/ Select the recipe title from the recipes table Tisztzs where notes is empty Null (Vlaszd ki azoknak a recepteknek a cmt a receptek tbljbl, amelyek nl a megjegyzs mez res.) SQL SELECT RecipeTitle FROM Recipes

WHERE Notes IS NULL

Mutasd meg azokat a hozzvalkat, amelyek a hsflk csoportjba (a hozzvalk 2. osztlyba) tartoznak, a csirkt kivve!"
Fordts/ Select ingredient name from the ingredients table Tisztzs where ingredient class ID is equal to = 2 and ingredient name does not contain like '%chicken%' (Vlaszd ki azoknak a hozzvalknak a nevt a hozzvalk tbljbl, amelyeknek a hozzvalosztlya 2, s a hozzval neve nem tartalmazza a 'chicken' szt.) SQL SELECT IngredientName FROM Ingredients

WHERE (IngredientClassID = 2) AND (IngredientName NOT LIKE '%chicken%')

sszefoglals
Ebben a fejezetben annak az elvvel ismerkedtnk meg, hogy miknt szrhetjk az adato kat a WHERE zradkban megadott keressi felttelekkel. Megtanultuk, hogy a keressi

felttelek lltsok kombincijbl llnak, amelyek meghatrozzk az eredmnybe kerl


adatokat, s hogy minden llts egyfle szempontbl vizsgl egy adott rtkkifejezst, majd bemutattuk az t alapvet lltst. A trgyalst ennek az t alapvet lltsnak a rszletezsvel folytattuk, amelyeket a WHERE zradk keressi felttelben hasznlhatunk. Megtanultuk, hogyan hasonlthatunk ssze rtkeket, s hogyan ellenrizhetjk, hogy egy rtk ms rtkek egy adott tartomnyba esik-e. Azt is megtanultuk, hogyan vizsglhatjuk meg, hogy egy rtk egy megadott lista valamelyik elemvel egyezik-e, vagy hogy rsze-e egy bizonyos mintakarakterlncnak. Ezenkvl megtanultuk, hogy a NOT mvelettel kizrhatunk sorokat az eredmnybl. Ezt kveten megvizsgltuk, hogyan adhatunk meg egyszerre tbb felttelt, amelyeket az AND s az OR mveletekkel fznk ssze. Megtanultuk, hogy egy sornak minden AND mvelettel sszevont felttelt ki kell elgtenie, hogy bekerlhessen az eredmnybe, mg az OR mvelettel sszekapcsolt feltteleknl csak egy felttelnek kell igaznak lennie. Az s az OR egyttes hasznlatval felrhat sszetett lekrdezsekrl is szt ejtettnk, majd megint a NOT mvelettel foglalkoztunk, s megtanultuk, hogy ezt a mveletet kt kln szinten hasznlhatjuk a keressi felttelekben a sorok kizrsra. Az elsbbsgi sorrend volt a kvetkez a trgyalt tmk sorban: megtanultuk, hogyan elemzi s rtkeli ki az adatbzis a feltteleket, gy most mr tudjuk, hogy az adatbzis egy bizonyos sorrendet kvet a kirtkelskor, amit az egyes felttelekben hasznlt mveletek hatroznak meg. Azt is megtanultuk, hogyan alkalmazhatjuk a zrjeleket az adatbzis ltal hasznlt sorrend megvltoztatsra egyes feltteleknl, s hogyan kerlhetjk el a flrert het feltteleket. Tettnk egy rvid kitrt, hogy megmutassuk, hogyan kereshetnk egymst tfed tartomnyokat. A megolds meglepen egyszer, s a BETWEEN hasznlatt sem ignyli. Ez utn mg egyszer visszatrtnk a Null-okhoz. Megtanultuk, hogy a Null hasonl

hatssal van a felttelekre, mint a kifejezsekre, s azt is megtudtuk, hogy ajnlott Null rtkeket keresni az adataink kztt, ha arra gyanakszunk, hogy az eredmnyben hibs adatok szerepelnek. Vgl megtrgyaltuk, hogy ugyanaz a felttel szmos klnbz mdon megfogalmazhat. Mr tudjuk pldul, hogy hrom eltr mdon kereshetjk meg azokat, akiknek a vezetk neve a ,,H betvel kezddik. A knyv kvetkez rszben a halmazokat s a rajtuk vgezhet mveleteket mutatjuk be. A halmazok megismerse utn trhetnk r, hogy miknt adhatunk meg tbb tblval dolgoz SELECT utastsokat. A fejezet utols rszben pedig lssunk nhny nllan kidolgozhat krelmet!

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis 1. Add meg az sszes olyan beszllt nevt, akik Ballardban, Bellevue-ben vagy
Redmondban mkdnek!" A megolds itt tallhat: CH06_Ballard_Bellevue_Redmond_Vendars (3 sor). 2. Mutass egy bcrendbe szedett listt a fogyaszti ron 125 dollros vagy dr gbb termkekrl! (Tipp: a listt egy korbbi fejezetben tanult zradkkal rendezhetjk bcrendbe.) A megolds itt tallhat: CH06_Products_Priced_Over_125 (13 sor). 3. A velnk kapcsolatban ll beszlltk kzl kiknek nincs webhelyk?" A megolds itt tallhat: CH06_Vendors_With_No_Website (4 sor).

Entertainment Agency adatbzis 1. Mutass egy listt a 2007 oktberben megtartott rendezvnyekrl.
(Tipp: ezt a problmt egy rtktartomnyt egy msik tartomnnyal oktber els s utols napja sszehasonltva oldhatjuk meg.) A megolds itt tallhat: CH06_0ctober_2007_Engagements (23 sor). 2. Mutasd meg azokat a 2007. oktberi rendezvnyeket, amelyek dl s dlutn 5 ra kztt kezddtek! A megolds itt tallhat: CH06_0ctober_Dates_Between_Noon_and_Five (17 sor). 3. Sorold fel az sszes olyan rendezvnyt, amelynek a kezd s zr dtuma azonos! A megolds itt tallhat: CH06_Single_Day_Engagements (5 sor).

School Scheduling adatbzis 1. Mutasd meg azokat a dolgozkat, akik postafikot hasznlnak cmknt! A megolds itt tallhat: CH06_Staff_Using_POBoxes (3 sor). 2. Mutasd meg, mely hallgatk laknak a Pacific Northwest-en kvl!

A megolds itt tallhat: CH06_Students_Residing_Outside_PNW (5 sor).


3. Sorold fel az sszes olyan tantrgyat, amelynek a trgykdja az MUS

karakterekkel kezddik!
A megolds itt tallhat: CH06_Subjects_With_MUS_In_SubjectCode (4 sor).
Bowling League adatbzis 1. Adj egy listt a 2007 szeptemberben tartott versenyekrl!

A megolds itt tallhat: CH06_September_2007_Tournament_Schedule (4 sor). 2. Mi az idbeosztsa a versenyeknek a Bolero, a Red Rooster s a Ihunderbird

Lanes plyn? A megolds itt tallhat: CH06_Eastside_Tournaments (6 sor). 3. Sorold fel azokat a tekzket, akik az Eastside-on laknak (Bellevue, Bothell, Duvall, Redmond, Woodinville), s akiknek a csapata az 5-s, a 6-os, a 7-es vagy a 8-as!
(Tipp: a vrosok listjhoz az IN, a csapatok szmhoz pedig a BETWEEN mveletet hasznljuk.) A megolds itt tallhat: CH06_Eastside_Bowlers_On_Teams_5_Through_8 (9 sor).
Recipes adatbzis 1. Sorold fel az sszes olyan ftel (receptosztlyuk az l-es) receptjt, amelyikhez

tartozik megjegyzs!
A megolds itt tallhat: CH06_Main_Courses_With_Notes (4 sor).
2. Mutasd meg az els t receptet!

(Tipp: hasznljuk a BETWEEN mveletet a tbla elsdleges kulcsn.)


A megolds itt tallhat: CH06_First_5_Recipes (5 sor).

III. rsz
Tbbtbls lekrdezsek

Halmazokban gondolkodni
Vidm ebdet ad kis asztal, nagy szvessg - William Shakespeare Tvedsek vgjtka, 3. felvons, 1. szn, fordtotta: Szsz Imre
u

A fejezet tmakrei
Mik azok a halmazok? Halmazmveletek Metszet Klnbsg Uni Halmazmveletek az SQL-ben sszefoglals

Az eddigiekben lttuk, hogyan gyjthetjk halmazba az adatokat a megfelel oszlopokon vgrehajtott lekrdezsekkel vagy oszlopokat tartalmaz kifejezsekkel (SELECT), hogyan rendezhetjk a sorokat (ORDER BY), s szrhetjk a kapott sorokat (WHERE). Eddig arra sszpontostottunk, hogy egyetlen tblval vgezznk el alapvet feladatokat. Mi van azonban akkor, ha tbb tblban trolt adatot akarunk lekrdezni? Mit kell tennnk, ha ssze akarunk hasonltani vagy szembe akarunk helyezni egy vagy tbb tblbl szrma z adathalmazokat? gy knny telt kszteni, ha egy zacsk krumplit vagy egy csomag srgarpt csak h mozni, szeletelni s kockzni kell. Mostantl fogva a problmk nagy rsze, amelyeknek megmutatjuk a megoldst, tbb tbla lekrdezsvel jr majd. Nem csak azt mutatjuk meg, hogyan kell j ragut kszteni, hanem azt is, hogyan legynk j szakcsok! Mieltt belevetnnk magunkat a fejezet mlysgeibe, meg kell jegyeznnk, hogy ez a rsz azokrl a fogalmakrl szl, amelyeket meg kell rtennk ahhoz, hogy ssze tudjunk kapcsolni kt vagy tbb adathalmazt. Ezen kvl rvid ttekintst nyjtunk az ide kapcso-

ld, az SQL-szabvnyban lefektetett utastsformkrl is, amelyek kzvetlenl tmogat jk ezeket a fogalmakat. Elljrban azonban meg kell emltennk, hogy az SQL sok, jelenleg forgalomban lv kereskedelmi megvalstsa mg nem tmogatja ezt a tiszta nyelvtant. A ksbbi fejezetekben megmutatjuk, hogyan lehet az itt tanult fogalmakat a legtbb nagy adatbzisrendszer ltal szleskren tmogatott SQL-utastskszlet segt sgvel megvalstani. E helyen nem a szablyok betjt, hanem azok szellemt tartjuk szem eltt.

Mik azok a halmazok?


Ha az 1960-as vek kzepe utn voltunk tindzserek, bizonyra tanultunk halmazelmletet a matematika rkon. (Emlksznk mg?) Az alapok elsajttsa sorn bizonyra felmerlt a krds: hol hasznosthatjuk majd mindezt? Most a relcis adatbzisokrl s az SQL-nek nevezett cikornys nyelvrl prblunk meg j ismereteket szerezni, hogy alkalmazsokat fejlessznk, klnbz problmkat oldjunk meg, vagy csak egyszeren vlaszt kapjunk a krdseinkre. Figyelemmel ksrtk az algebra rkat? Ha igen, az SQL-lel knnyebben meg fogjuk tudni oldani a problmkat kln sen az sszetetteket Tulajdonkppen mr a knyv elejtl fogva halmazokkal dolgozunk. Az 1. fejezetben a relcis adatbzisok alapvet szerkezetrl tanultunk: a tblk rekordokat tartalmaznak, ezeket pedig egy vagy tbb mez osztja fel. (Emlkezznk r, hogy az SQL-ben a rekordok sorokat, a mezk oszlopokat jelentenek). Minden egyes tbla az adatbzisunkban egy egyedtpus tulajdonsgainak halmaza. A 2. fejezetben megtanultuk, hogyan biztostsuk, hogy az adatbzis szerkezete egszsges legyen. Minden tbla olyan adatok halmazt kell, hogy tartalmazza, amely egyetlen egyedtpust vagy mveletet hatroz meg. A 4. fejezetben lttuk, hogyan kaphatjuk meg egy egyszer SELECT utastssal olyan ada tok halmazt, amely egyetlen tbla meghatrozott sorait tartalmazza, s hogyan rendez hetjk ezeket az eredmnyhalmazokat. Az 5. fejezet arrl szlt, hogy miknt krdezhetjk le kifejezsek segtsgvel tbb oszlopbl adatok halmazt, a 6. fejezetben pedig megta nultuk tovbb szkteni a tblkbl kapott adathalmazt a lekrdezshez fztt szr (WHERE zradk) segtsgvel. Lthat, hogy egy halmazt akr egyetlen tbla egyetlen oszlopa s egyetlen sora is meghat rozhat. Valjban olyan SQL-lekrdezst is rhatunk, amely nem ad vissza egyetlen sort sem, csak egy res halmazt. Nha hasznos lehet rjnnnk, hogy valami nem ltezik. Egy hal mazt azonban tbb tbla tbb oszlopbl (belertve a kifejezsek segtsgvel ltrehozott oszlopokat) s sorbl is megkaphatunk. Az eredmnyhalmaz minden sora a halmaz eleme. Az oszlopokban szerepl rtkek az elemeket ler jellemzk, amelyek olyan adatok, ame lyek meghatrozzk a halmaz adott elemt. A kvetkez nhny fejezetben megmutatjuk,

hogyan lehet tbb adathalmazbl informcit lekrdezni, majd ezeket a halmazokat ssze kapcsolni, hogy bonyolultabb krdseket is megvlaszolhassunk. Elszr azonban meg kell tanulnunk pr dolgot a halmazokrl s azok logikai kapcsolatairl.

Halmazmveletek
Az 1. fejezetben lttuk, hogyan alkotta meg Dr. E. F. Codd a relcis adatmodellt, amin a legtbb modern adatbzis s az SQL alapjai nyugszanak. A modell alappillrjeit a matematika kt ga (a halmazelmlet s az elsrend prediktumkalkulus) kpezte. Miutn elsajttottuk, hogyan kaphatunk vlaszt egyetlen tblbl, azt kell megtanulnunk, hogy miknt hasznlhatjuk adatok eredmnyhalmazt bonyolultabb feladatok megolds ra. Ezek az sszetett feladatok ltalban valamelyik halmazmvelet alkalmazst kvetelik meg, hogy ssze lehessen kapcsolni kt vagy tbb tblbl szrmaz adatot. Nha kt klnbz eredmnyhalmazt kell ltrehoznunk ugyanabbl a tblbl, majd jra ssze kell kapcsolnunk azokat, hogy megkapjuk a vlaszt a krdsnkre. A hrom leggyakoribb halmazmvelet a kvetkez:

Metszet Akkor hasznljuk, ha kt vagy tbb klnbz halmaz kzs elemeire


vagyunk kvncsiak: Mutasd meg a brnyhst s rizst tartalmaz recepteket! Mutasd meg azokat a vevket, akik biciklit s buksisakot rendeltek! Klnbsg - Akkor hasznljuk, ha azokat az elemeket akarjuk megtallni, amelyek benne vannak egy halmazban, de nincsenek benne egyik msikban sem: Mutasd meg azokat a recepteket, amelyekben szerepel brnyhs, de nincs rizs! Mutasd meg azokat a vevket, akik rendeltek biciklit, de nem rendeltek buksisakot! Uni Akkor hasznljuk, ha kt vagy tbb hasonl halmazt egyestnk. Mutass meg minden receptet, amelyben brnyhs vagy rizs szerepel! Mutasd meg azokat a vevket, akik biciklit vagy buksisakot rendeltek! A kvetkez hrom rsz ezt a hrom halmazmveletet fogja bvebben trgyalni, vagyis azokat, amelyeket mr az ltalnos iskolai matematika rkon megtanultunk. Arrl, hogy ezek a mveletek hogyan valsthatk meg tiszta SQL nyelven, a Halmazmveletek az SQL-ben cm rsz nyjt ttekintst.

Metszet
Nem, most nem rzmetszetekrl lesz sz. Kt halmaz metszete azok kzs elemeit tartal mazza. Elszr halmazelmleti szempontbl vesszk szemgyre, hogy mit rtnk metszet alatt, majd megnzzk, hogy metszetek alkalmazsval hogyan oldhatunk meg zleti problmkat.

Metszet a halmazelmletben
A metszet nagyon hatkony matematikai eszkz, amit a kutatk s mrnkk is gyakran hasznlnak. Kutatknt rdekeltek lehetnk abban, hogy megtalljuk kt kmiai vagy fizi kai mrsi sor kzs pontjait. Pldul egy gygyszerkutatnak van kt vegyletcsoportja, amelyek - gy tnik elnys tulajdonsgokkal brnak. Ha sikerl megtallni a kt csoportban a kzs rszt (a metszetet), az hozzsegthet ahhoz, hogy megtudjuk, mi teszi a kt vegyletcsoportot hatsoss. Vagy pldul egy mrnkt az rdekelhet, hogy mi a merev, de trkeny s a puha, de ellenll tvzetek metszete. Most nzzk meg kzelebbrl, hogyan mkdik a metszetkpzs. Vegynk kt szmhalmazt, ahol minden egyes szm a halmaz eleme. Az els szmhalmaz a kvetkez elemeket tartalmazza: 1, 5,8, 9, 32, 55, 78 A msodik szmhalmaz elemei: 3, 7, 8, 22, 55, 71, 99 A kt szmhalmaz metszett azok a szmok alkotjk, amelyek mindkt halmazban elfordulnak: 8, 55 A halmazok egyes elemei nem csak egyszer rtkek lehetnek. Valjban amikor valami lyen problmt oldunk meg az SQL-lel, valsznleg sorok halmazval dolgozunk majd. A halmazelmletben, ha egy elem tbb, mint egy egyszer szm vagy ms rtk, a halmaz minden eleme (vagy egyedtpusa) tbb jellemzvel (vagy bittel) br, amelyek a halmaz minden elemt jellemezni tudjk. Kedvenc ragunk receptje pldul egy sszetett eleme az sszes recept halmaznak, amely sok klnbz hozzvalt foglal magban. Az sszetett ragu halmazelem minden hozzvalja az elem egy-egy jellemzje. sszetett elemeket tartalmaz halmazok metszetnek megtallshoz azokat az elemeket kell megkeresnnk, amelyek minden jellemzjkben megegyeznek. Ez azt jelenti, hogy minden sszehasonltand halmazelem azonos szm s tpus jellemzvel kell, hogy rendelkezzen. Vegyk pldnak az albbi, sszetett halmazt, amelyben minden sor a halmaz (a ragu receptje) egy elemt jelkpezi, s minden oszlop egy bizonyos jellemzt hatroz meg:

A msodik halmaz a kvetkezkppen nz ki:

Eredmnyhalmazok metszete
Ha a korbbi pldk tblzatok sorainak vagy eredmnyhalmaznak tnnek, akkor j nyomon jrunk. Amikor egy SQL-lekrdezs eredmnyekppen kapott adathalmaz soraival foglalkozunk, az oszlopok az egyes jellemzket hatrozzk meg. Tegyk fel, hogy a kvet kez sorokat egy lekrdezs eredmnyekppen kaptuk (a receptek John szakcsknyvbl valk):

Egy msik eredmnyhalmaz a kvetkezkppen nz ki (ezek a receptek Mike szakcs knyvben szerepelnek):

A kt halmaz metszetbe az a kt elem kerl, amelyek a kt halmazban minden jellemz jkben megegyeznek. Ez az a kt recept, ami Mike s John szakcsknyvben azonos:

Recept
Brnyragu r ragu

Kret
Burgonya Burgonya

Alapl
Vz Marha alapl

Hs
Brnyhs Marhahs

Zldsg
Zldbors Fejes kposzta

Halmazdiagram segtsgvel nha knnyebb megrteni, hogyan mkdik a metszetkp zs. A halmazdiagram elegns, m mgis egyszer mdja annak, hogy adathalmazokat jelentsnk meg, s grafikusan brzoljuk a halmazok metszett vagy tfedst. Erre a fajta diagramra az Euler- vagy Venn-diagram elnevezs is hasznlatos. (Leonard Euler svjci matematikus a 18. szzadban lt. John Venn a Cambridge-i Egyetem kutat sztndjasa knt 1880-ban megjelent cikkben hasznlta a logikai diagramoknak ezt a klnleges fajtjt. Lthatjuk teht, hogy halmazokban gondolkodni nem ppen mai tallmny.) Tegyk fel, hogy van egy kedvenc recepteket tartalmaz adatbzisunk. Szeretjk, ahogy a hagyma kiemeli a marhahs zt, ezrt minket minden olyan recept rdekel, amiben van hagyma s marhahs. A 7.1. brn lthat halmazdiagram segt a problmamegolds szemlltetsben.

A fels kr a marhahst tartalmaz recepteket brzolja, az als a hagymt tartalmazkat. A mindkt hozzvalt tartalmaz receptek ott vannak, ahol a kt kr tfedi egymst (a kt halmaz metszetben). Ahogy az vrhat, az SQL-lel elszr lekrdeznk minden marhahst

tartalmaz receptet, majd egy msodik lekrdezssel azokat a recepteket gyjtjk ssze, amelyek hagymt tartalmaznak. Ksbb ltni fogjuk, hogy a kt lekrdezs sszekapcso lshoz hasznlhatunk egy kln SQL-parancsot (INTERSECT), hogy megkapjuk a vgs vlaszt. Igen, tudjuk, mire gondol az Olvas. Ha a receptknyv gy nz ki, mint a fenti pldban, akkor a kvetkezt is mondhatnnk: Mutasd meg azokat a recepteket, amelyek hsbl marhahst, zldsgflbl pedig hagymt tartalmaznak! Fordts - Select the recipe name from the recipes table where meat ingredient is beef and vegetable ingredient is onions (Vlaszd ki azokat a recepteket a receptek tbljbl, amelyeknek a hozz vali kzl a hs marhahs, a zldsgfle pedig hagyma.) Tisztzs - Select the recipe name from the recipes table where meat ingredient is = beef and vegetable ingredient is = onions SQL SELECT RecipeName

FROM Recipes WHERE MeatIngredient = 'Beef' AND VegetableIngredient = 'Onions'


Itt lljunk meg egy pillanatra! Ha emlksznk a msodik fejezetben tanultakra, akkor tud juk, hogy valsznleg egyetlen Recipes (Receptek) tbla nem fogja megfszerezni az le tnket. Mi van azokkal a receptekkel, amelyek a hson s a zldsgfln kvl ms hoz zvalt is tartalmaznak? Mi van azzal a tnnyel, hogy egyes receptek sok hozzvalt tartal maznak, mg msok keveset? Egy helyesen megtervezett receptadatbzisban van egy Recipe_lngredients (Recepthozzvalk) tbla, amely receptenknt s hozzvalnknt egy sorral rendelkezik. A hozzvalk minden sorban csak egyetlen hozzval szerepelhet, gy nem fordulhat el, hogy egy sorban egyszerre szerepel marhahs s hagyma. Elszr meg kell keresnnk a marhahst tartalmaz sorokat, majd a hagymt tartalmaz sorokat, vgl a RecipeID (Receptazonost) alapjn ezek metszett kell kpeznnk. (Ha nem vilgos, mi a kifogsunk az elz Recipes tbla ellen, lapozzunk vissza a 2. fejezethez!) Hogyan oldunk meg ennl sszetettebb feladatokat? Mondjuk, az eddigiekhez mg srga rpt is szeretnnk adni. A megoldst a 7.2. brn lthat halmazdiagram szemllteti. Rreztnk az zre? Annyit kell megjegyeznnk, hogy ha sszetett felttelek alapjn kell valamilyen feladatot megoldanunk, a halmazdiagram rtkes segtsget nyjthat az SQLeredmnyhalmazok metszetnek szemlltetsben.

Metszetkpzssel megoldhat feladatok


Mint bizonyra kitalltuk, metszetkpzssel kt vagy tbb adathalmaz egyez elemeit hat rozhatjuk meg. Az albbiakban nhny pldval szemlltetjk, hogy a mintaadatbzisokbl szrmaz adatokkal hogyan oldhatunk meg feladatokat metszetkpzs segtsgvel:

Mutasd meg az ugyanolyan nev vevket s alkalmazottakat!" Keresd meg azokat a vevket, akik biciklit s buksisakot is rendeltek!" Sorold fel azokat az eladkat, akik a Bonnicksen s a Rosales nev megrendelknl jtszottak!" Mutasd meg azokat a hallgatkat, akiknek rajzbl s szmtstechnikbl legalbb 85 az tlagpontszmuk! Keresd meg azokat a tekejtkosokat, akiknek a tiszta pontszma legalbb 155 volt a Thunderbird s a Bolero plyn! Mutasd meg a marhahst s fokhagymt tartalmaz recepteket!"
A metszetekre vonatkoz korltozs, hogy minden eredmnyhalmazban az sszes oszlop rtknek egyeznie kell. Ez jl mkdik, ha ugyanabbl a tblbl szrmaz kt vagy tbb halmazbl ksztnk metszetet (pldul azoknak a vevknek a halmazaibl, akik biciklit, illetve buksisakat rendeltek). Akkor is jl mkdik, ha klnbz tblkbl szrmaz, de azonos oszlopokkal rendelkez halmazokbl (pldul a vevk s az alkalmazottak neve) kpznk metszetet. Szmos esetben azonban olyan megoldst keresnk, ahol az egyes hal mazoknak csak nhny oszlopa egyezik meg. Az ilyen jelleg problmkra az SQL a JOIN (sszekapcsols) mveletet biztostja, amely a kulcstulajdonsgokbl kpez metszetet. Lssunk nhny problmt, amelynek a megoldsban a JOIN segthet:

Mutasd meg azokat a vevket s alkalmazottakat, akik ugyanabban a vrosban lnek!" (JOIN a vros nevre alkalmazva) Sorold fel a megrendelket s az eljegyzett eladkat! (JOIN a rendezvny szmra alkalmazva)

Keresd meg azokat az gynkket s eladkat, akiknek ugyanaz az irnytszmuk! (!OIN az irnytszmra alkalmazva) Mutasd meg azokat a hallgatkat, akiknek a keresztneve azonos a tanrval! (JOIN a keresztnvre alkalmazva) Keresd meg azokat a tekejtkosokat, akik ugyanabban a csapatban jtszanak! (!OIN a csapat azonostjra alkalmazva) Keresd meg a srgarpt tartalmaz recepteket! (!OIN a hozzvalk azonostjra alkalmazva) Egyet se fljnk, a kvetkez fejezetben megmutatjuk, hogyan kell ilyen (s ennl bonyo lultabb) problmkat JOIN mveletekkel megoldani. Mivel az SQL kevs kereskedelmi megvalstsa tmogatja az INTERSECT-et, azt is megmutatjuk, hogy miknt oldhatunk meg olyan feladatokat, amelyekhez egybknt az INTERSECT lenne szksges.

Klnbsg
Mennyi 21 s 10 kztt a klnbsg? Ha a vlaszunk 11, akkor j nyomon jrunk. A klnbsgkpzs (vagy kivons) sorn vesszk az egyik halmaz elemeit, s eltvoltjuk kzlk a msik halmazzal kzs elemeket. Azok az elemek maradnak, amelyek csak az egyik halmazban vannak benne, de nincsenek benne a msikban. (Amint ksbb ltni fogjuk, az SQL-szabvnyban erre hasznlt kulcssz az EXCEPT.)

Klnbsg a halmazelmletben
A klnbsgkpzs szintn hatkony matematikai eszkz. Kutatknt rdekelhetnek olyan krdsek, hogy mi kt fizikai vagy kmiai mrsi sor klnbsge. Pldul gygy szerkutatknt lehet kt hasonl vegyletcsoportunk, de az egyik rendelkezik egy bizo nyos elnys hatssal, a msik viszont nem. A molekulk kztti klnbsg segthet felfedni, hogy az egyik csoport tagjai mirt rendelkeznek elnys tulajdonsggal, a msik csoport elemei pedig mirt nem. Mrnkknt lehet kt hasonl tervnk, de az egyik job ban mkdik, mint a msik. A kt terv kztti klnbsg megtallsa alapvet fontossg lehet, hogy ki tudjuk szrni a kvetkez pletekbl a szerkezeti hibkat. Nzzk meg a kvetkez kt szmhalmaz pldjn, hogy miknt mkdik a klnbsgkpzs! Az els szmhalmaz elemei a kvetkezk: 1, 5, 8, 9, 32, 55, 78 A msodik szmhalmaz elemei: 3, 7, 8, 22, 55, 71, 99 Az els halmaz elemeibl kivonva a msodik halmaz elemeit megkapjuk azokat a tagokat, amelyek benne vannak az els halmazban, de nincsenek benne a msodikban: 1, 5, 7, 9, 32, 78

Az elz klnbsgkpzst meg is fordthatjuk, hogy a msodik halmaz elemeibl vonjuk ki az els halmaz elemeit. Az eredmny: 3, 7, 22, 71, 99 Az egyes halmazelemek nem szksgszeren egyszer rtkek. Valjban sokkal valsz nbb, hogy sorok halmazaival fogunk foglalkozni, ha az SQL-lel oldunk meg klnbz feladatokat. A fejezet elejn mr mondtuk, hogy ha egy halmazelem tbb mint egy szm vagy egy egyszer rtk, akkor a halmazelemek tbb jellemzvel rhatk le (ezek a halmazelemek tulajdonsgait jellemz bitek). A kedvenc ragunk receptje pldul az sszes receptet tartalmaz halmaz sszetett eleme, ahol a halmaz tbb klnbz hozzvalt tartalmaz. Minden hozzvalra gy gondolhatunk, mint az sszetett ragu elem egy-egy jellemzjre. sszetett elemeket tartalmaz halmazok klnbsgt gy kpezzk, hogy elszr megke ressk azokat az elemeket a msodik halmazbl, amelyek minden tulajdonsgukban meg egyeznek az els halmaz elemeivel. Ne feledjk, mindkt halmaz sszehasonltsra vr megfelel elemnek azonos szm s tpus jellemzvel kell rendelkeznie. Ez utn a kt halmaz egyez elemeit eltvoltjuk az els halmaz elemei kzl, gy a klnbsget kapjuk eredmnyl. Tegyk fel, hogy van egy olyan sszetett halmazunk, mint amilyet albb lthatunk. Minden sor egy halmazelemet (ragureceptet) jell, mg az egyes oszlopok egy-egy jellemzt (egy hozzvalt) hatroznak meg.

A msodik halmaz a kvetkezkppen nz ki:

Az els s a msodik halmaz klnbsgt azok az elemek alkotjk, amelyek benne vannak az els halmazban, de nincsenek benne a msodikban:

Eredmnyhalmazok klnbsge
Amikor SQL-lel lekrdezett sorokkal dolgozunk, a jellemzk az egyes oszlopok. Tegyk fel, hogy a kvetkez sorokat egy lekrdezs eredmnyekppen kaptuk (a receptek John szakcsknyvbl valk):
Recept Brnyragu Csirkeragu Vega ragu r ragu Sertsragu Kret Burgonya Rizs Tszta Burgonya Tszta Alapl Vz Csirke alapl Vz Marha alapl Vz Hs Brnyhs Csirkehs Tofu Marhahs Sertshs Zldsg Zldbors Srgarpa Cukorbors Fejes kposzta Hagyma

Egy msodik lekrdezs eredmnyei lentebb tallhatk (ezek a receptek Mike szakcs knyvbl valk):
Recept Brnyragu Pulykaragu Vega ragu r ragu Sertsragu Kret Burgonya Rizs Tszta Burgonya Bab Alapl Vz Csirke alapl Zldsg Marha alapl Vz Hs Brnyhs Pulykahs Tofu Marhahs Sertshs Zldsg Zldbors Srgarpa Cukorbors Fejes kposzta Hagyma

John s Mike receptjeinek klnbsge (John receptjei kzl kivonjuk Mike receptjeit) azok a receptek, amelyek benne vannak John szakcsknyvben, de nincsenek benne Mike-ban:

Recept Brnyragu Vega ragu Sertsragu

Kret Burgonya Tszta Tszta

Alapl Vz Vz Vz

Hs Brnyhs Tofu Sertshs

Zldsg Zldbors Cukorbors Hagyma

Meg is fordthatjuk a feladatot: tegyk fel, hogy azok a receptek rdekelnek, amelyek benne vannak Mike szakcsknyvben, de nincsenek benne Johnban. me az eredmny:

Recept
Brnyragu Vega ragu Sertsragu

Kret
Burgonya Tszta Tszta

Alapl
Vz Vz Vz

Hs
Brnyhs Tofu Sertshs

Zldsg
Zldbors Cukorbors Hagyma

Itt is alkalmazhatunk halmazdiagramot, hogy szemlltessk, hogyan mkdik a klnb sgkpzs. Tegyk fel, hogy van egy kedvenc recepteket tartalmaz adatbzisunk, s mivel nem szeretjk a hagyms marhahst, olyan recepteket keresnk, amelyekben van marhahs, de nincs hagyma. A 7.3. bra szemllteti, hogyan oldhatjuk meg ezt a feladatot.

7.3. bra
Hagyna nlkli marhahsos receptek

A fels teljes kr a marhahst tartalmaz recepteket brzolja, mg az als teljes kr a hagymt tartalmazkat. Bizonyra emlksznk r az INTERSECT trgyalsbl, hogy ahol a kt kr tfedi egymst, ott vannak a mindkt hozzvalt tartalmaz receptek. A fels kr vilgosszrkvel sznezett, az tfedsen kvli rsze a hagyma nlkli marhahsos recep tek halmazt jelli. Hasonlkppen, az als kr tfedsen kvli rsze azokat a recepteket jelkpezi, amelyek tartalmaznak hagymt, de nincs bennk marhahs. Bizonyra tudjuk, hogy elszr a marhahst tartalmaz recepteket kell egy SQL-paranccsal lekrdeznnk, majd egy kvetkez SQL-paranccsal a hagymt tartalmazkat (Mint ksbb ltni fogjuk ebben a fejezetben, a kt lekrdezst egy kln SQL-kulcsszval, az EXCEPT-tel kapcsolhatjuk ssze, hogy megkapjuk a vgs vlaszt.)

Megint csapdba estnk? (Valban elolvastuk a 2. fejezetet, ugye?) Ha a receptes tblnk a korbbi pldkhoz hasonl, akkor gondolhatnnk, hogy nyugodtan mondhatjuk a kvetkezt: Mutasd meg azokat a recepteket, amelyek hsflbl marhahst tartalmaznak, de a zldsgflkbl nincs bennk hagyma!" Fordts - Select the recipe name from the recipes table where meat ingredient is beef and vegetable ingredient is not onions (Vlaszd ki azokat a recepteket a receptek tbljbl, ahol a hozzvalk k zl a hs marhahs, de a zldsgfle nem hagyma.) Tisztzs - Select the recipe name from the recipes table where meat ingredient is = beef and vegetable ingredient is not <> onions SQL SELECT RecipeName

FROM Recipes WHERE MeatIngredient = 'Beef AND VegetableIngredient <> 'Onions'


Teht mg egyszer: amint azt a 2. fejezetben megtanultuk, egyetlen Recipes tbla alkal mazsa nem valami forr gondolat. Mi van azokkal a receptekkel, amelyek hson s zld sgen kvl ms hozzvalt is tartalmaznak? Mi van azzal a tnnyel, hogy egyes receptek sok, mg msok csak kevs hozzvalt tartalmaznak? Egy helyes mdon megtervezett Recipes adatbzis tartalmaz egy kln Recipe_Ingredients tblt, ami receptenknt s hozzvalnknt egy sort tartalmaz. A hozzvalk minden sorban csak egy hozzval szerepel, gy egyetlen sor sem tartalmazhatja a marhahst s hagymt egyszerre. Elszr meg kell keresnnk minden marhahst tartalmaz sort, majd minden hagymt tartalmaz sort, vgl a RecipeID alapjn ezek klnbsgt kell kpeznnk.

Hogyan oldhatunk meg sszetettebb feladatokat? Tegyk fel, hogy a srgarpt is utljuk. A megoldst a 7.4. brn feltntetett halmazdiagram szemllteti. Elszr meg kell keres nnk a marhahst tartalmaz recepteket, majd ennek a klnbsgt kell kpeznnk a hagymt vagy srgarpt tartalmaz receptek halmazval Az eredmnybl ez utn ki kell vonnunk a megmaradt halmazt (hagyma vagy srgarpa), hogy csak azok a receptek maradjanak, amelyekben van marhahs, de nincs srgarpa s hagyma (a fels kr vilgos szn terlete).

Klnbsgkpzssel megoldhat feladatok


A metszetkpzstl eltren (ahol kt halmaz kzs elemeit keressk) a klnbsgkpzs sorn azokat az elemeket keressk, amelyek benne vannak az egyik halmazban, de nincsenek benne egyik msikban sem. A kvetkezkben a mintaadatbzisokbl nhny, klnbsgkpzssel megoldhat pldt mutatunk be:

Mutasd meg azokat a vevket, akiknek az alkalmazottaktl eltr nevk van!" Keresd meg azokat a vsrlkat, akik rendeltek biciklit, de nem rendeltek buksisakot! "Mutasd meg azokat az eladkat, akik a Bonnicksen nev megrendelnl jtszottak, de nem jtszottak a Rosales nev megrendelnl!" Mutasd meg azokat a hallgatkat, akiknek rajzbl az tlagos pontszmuk legalbb 85, de szmtstechnikbl nem rtek el legalbb 85 pontos tlagot!" "Keresd meg azokat a tekejtkosokat, akiknek a tiszta pontszma legalbb 155 volt a Thunderbird plyn, de ennl kevesebb volt a Bolero plyn!" "Mutasd meg azokat a recepteket, amelyek tartalmaznak marhahst, de nincs bennk fokhagyma!
A klnbsgkpzs korltja, hogy az rtkeknek az eredmnyhalmazok minden oszlop ban egyeznik kell. Ez jl mkdik, ha ugyanabbl a tblbl kpzett halmazok kztt keressk a klnbsgeket (pldul kln azokat a vevket, akik biciklit, s azokat, akik buksisakot rendeltek). Akkor is jl mkdik, ha hasonl oszlopokat tartalmaz tblkbl szrmaz halmazok (pldul a vevk s az alkalmazottak neve) klnbsgt vesszk. Sok esetben azonban a megoldshoz a halmazok egyes oszlopainak rtkei csak rszben kell, hogy egyezzenek. Ilyen problmkra biztostja az SQL az OUTER JOIN (kls ssze kapcsols) mveletet, amely egy olyan metszetet kpez a kulcstulajdonsgokbl, ami magban foglalja azokat a sorokat az egyik vagy mindkt halmazbl, amelyek nem egyez nek meg. A kvetkezkben nhny pldt lthatunk az OUTER JOIN-nal megoldhat feladatokra:

"Mutasd meg azokat a vevket, akik nem ugyanabban a vrosban lnek, mint az al kalmazottak!" (OUTER JOIN a vros nevre alkalmazva) Sorold fel a megrendelket s azokat az eladkat, akiket nem foglaltak le!" (OUTER JOIN a rendezvny szmra alkalmazva.)

Keresd meg azokat az gynkket, akiknek az irnytszma minden eladtl klnbzik! (OUTER JOIN az irnytszmra alkalmazva) Mutasd meg azokat a hallgatkat, akiknek minden tanr nevtl eltr keresztnevk van! (OUTER JOIN a keresztnvre alkalmazva) Keresd meg azokat a tekejtkosokat, akiknek az tlaga legalbb 150, s soha nem volt olyan jtkuk, hogy legalbb 125 pontot ne rtek volna el! (OUTER JOIN a tekejtkos kt klnbz tblbl szrmaz azonostjra alkalmazva) Mutasd meg azoknak a recepteknek az sszes hozzvaljt, amelyek nem tartalmaznak srgarpt!" (OUTER JOIN a recept azonostjra alkalmazva) Ne aggdjunk, a 9. fejezetben ltni fogjuk, hogyan lehet megoldani a fenti (s mg tovbbi) feladatokat az OUTER JOIN alkalmazsval. Mivel az SQL kevs kereskedelmi megvalst sa tmogatja az EXCEPT-et (ami a klnbsgkpzs kulcsszava), meg fogjuk mutatni, hogy az OUTER JOIN-nal hogyan lehet olyan feladatokat megoldani, amelyekhez egybknt az EXCEPT lenne szksges.

Uni
Eddig arrl volt sz, hogy miknt kereshetjk meg kt halmaz kzs elemeit (a kt halmaz metszett), valamint a halmazok klnbz elemeit (a halmazok klnbsgt). A halmazmveletek harmadik fajtja kt halmaz sszeadst (uni) foglalja magban.

Uni a halmazelmletben
Az uni lehetv teszi, hogy kt, hasonl adatokat tartalmaz halmazt sszeadjunk. Kutatknt lehet, hogy fizikai vagy kmiai mrsi eredmnyek kt halmazt akarjuk egyesteni. Pldul egy gygyszerkutat kt halmazba gyjtheti azokat a vegyleteket, amelyek valamilyen kedvez tulajdonsggal brnak. A kmikus egyestheti a kt halmazt, hogy a hatkony vegyletekrl egyetlen listt lltson ssze. Nzzk meg, hogy mkdik az unikpzs kt szmhalmazon. Az els halmazba tartoz szmok a kvetkezk: l, 5, 8, 9, 32, 55, 78 A msodik szmhalmaz tagjai: 3, 7, 8, 22, 55, 71, 99 A kt szmhalmaz unijba azok a szmok tartoznak, amelyeket a kt szmhalmaz egyestsvel kapunk: l, 5, 8, 9, 32, 55, 78, 3, 7, 22, 71, 99 Figyeljk meg, hogy a kt halmaz kzs elemei, a 8-as s 5-s, csak egyszer szerepelnek az eredmnyben. Az eredmnyhalmazban a szmoknak nincs szksgszeren kitntetett sorrendje. Amikor az adatbzisrendszernkben kiadjuk a UNION (uni) parancsot,

a kapott rtkek nem szksgszeren lesznek sorrendben, feltve, hogy nem adjuk meg kifejezetten az ORDER BY zradkot. Az SQL-ben lehetsgnk van a UNION ALL paranccsal is futtatni a lekrdezst, ha a ktszer szerepl elemeket is ltni szeretnnk. Az egyes halmazok elemei nem csak puszta rtkek lehetnek. Valjban alighanem sorok halmazval fogunk foglalkozni, amikor az SQL-lel dolgozunk. Kt vagy tbb halmaz sszetett elemeinek unijt akkor hatrozhatjuk meg, ha az egyes tend halmazok minden eleme azonos szm s tpus jellemzvel br. Tegyk fel, hogy van egy a lentihez hasonl sszetett halmazunk. Egy sor egy halmazelemet (ragureceptet) jell, mg az egyes oszlopok egy-egy jellemzt (egy hozzvalt) hatroznak meg.

A msodik halmaz a kvetkezkppen nz ki:

A kt halmaz unija mindkt halmaz elemeit magban foglalja. A ktszer szerepl eleme ket nem tntettk fel.

Eredmnyhalmazok unija
Az

sszetett elemeket kis lps vlasztja el az SQL-eredmnyhalmazok soraitl, amikor egy adathalmazbl az SQL segtsgvel lekrdezett sorokkal foglalkozunk, a jellemzk az egyes oszlopok. Tegyk fel, hogy a kvetkez tblzat egy lekrdezs eredmnyekp pen kapott sorok halmazt tartalmazza (a receptek John szakcsknyvbl valk): Recept Brnyragu Csirkeragu Vega ragu r ragu Sertsragu Kret Rizs Tszta Tszta Alapl Csirke alapl Vz Vz Hs Csirkehs Tofu Marhahs Sertshs Zldsg Srgarpa Cukorbors Fejes kposzta Hagyma

Burgonya Vz

Brnyhs Zldbors

Burgonya Marha alapl

Egy msodik lekrdezs eredmnye a kvetkezkppen nzhet ki (ezek a receptek Mike szakcsknyvben tallhatk): Recept Brnyragu Pulykaragu Vega ragu r ragu Sertsragu Kret Rizs Tszta Bab Alapl Csirke alapl Zldsg Vz Hs Pulykahs Tofu Marhahs Sertshs Zldsg Srgarpa Cukorbors Fejes kposzta Hagyma

Burgonya Vz

Brnyhs Zldbors

Burgonya Marha alapl

A kt halmaz unja mindkt halmaz sszes sort tartalmazza. Lehet, hogy John s Mike el dntttk: kzsen rnak szakcsknyvet Recept Brnyragu Csirkeragu Vega ragu r ragu Sertsragu Pulykaragu Vega ragu Sertsragu Kret Rizs Tszta Tszta Rizs Tszta Bab Alapl Csirke alapl Vz Vz Csirke alapl Zldsg Vz Hs Csirkehs Tofu Marhahs Sertshs Pulykahs Tofu Sertshs Zldsg Srgarpa Cukorbors Fejes kposzta Hagyma Srgarpa Cukorbors Hagyma

Burgonya Vz

Brnyhs Zldbors

Burgonya Marha alapl

Tegyk fel, hogy van egy a kedvenc receptjeinket tartalmaz adatbzisunk, s szeretjk a marhahsos vagy hagyms recepteket, ezrt szeretnnk egy olyan listt, amelyik tartal mazza az egyik hozzvalt. A 7.5. bra szemllteti, hogyan lehet megoldani ezt a feladatot. A fels kr jelli a marhahst tartalmaz recepteket, az als a hagymt tartalmazkat. A kt halmaz unijba azok a receptek kerlnek, amelyek a kt hozzval kzl az egyi ket tartalmazzk. A ktszer szerepl elemeket (ahol a kt halmaz tfedi egymst) eltvoltottuk. Mint bizonyra tudjuk, elszr a marhahsos recepteket kell lekrdeznnk az SQL-lel, majd egy msodik lekrdezssel a hagymt tartalmaz recepteket gyjtjk ki. Mint ksbb ltni fogjuk, a UNION az az SQL-kulcssz, amivel sszekapcsolhatjuk a kt lekrdezst, hogy megkapjuk a vgs vlaszt.

Mr megtanultuk, hogy nem j tlet olyan receptes adatbzist tervezni, amiben egy tbla van. Ehelyett egy helyes mdon megtervezett adatbzisban van egy Recipe_Ingredients tbla, amely receptenknt s hozzvalnknt egy sort tartalmaz. Minden sor egyetlen hozz valt fog tartalmazni, gy egy sorban sem szerepelhet egyidejleg marhahs s hagyma. Elszr azokat a recepteket kell megkeresnnk, amelyekben van marhahst tartalmaz sor, majd azokat, amelyekben van hagymt tartalmaz sor, vgl ezek unijt kell kpeznnk.

Unival megoldhat feladatok


Az uni lehetv teszi, hogy kt hasonl halmaz sorait sszekeverjk azzal a jrulkos haszonnal, hogy az eredmnyben nem fordul majd el ktszer ugyanaz a sor. Az albbiak ban nhny olyan feladatot lthatunk a mintaadatbzisokbl, amit unikpzssel lehet megoldani:

Mutasd meg minden vsrl s alkalmazott nevt s cmt!" Sorold fel azokat a vsrlkat, akik biciklit vettek, azokkal egytt, akik buksisakot rendeltek! Sorold fel azokat az eladkat, akik a Bonnicksen nev megrendelnl jtszottak, azokkal egytt, akik a Rosales nev megrendelnl lptekfel! Mutasd meg azokat a hallgatkat, akiknek rajzbl tlagosan legalbb 85pontjuk van, azokkal a hallgatkkal egytt, akik szmtstechnikbl rtek el ugyanilyen eredmnyt! Keresd meg azokat a tekejtkosokat, akiknek a Thunderbird plyn legalbb 155, a Bolero plyn pedig legalbb 140 lett a tiszta pontszma!" Mutasd meg azokat a recepteket, amelyek marhahst tartalmaznak, azokkal egytt, amelyekben van fokhagyma!" Mint a tbbi halmazmveletnl, itt is rvnyes az a megszorts, hogy minden eredmny halmazban meg kell egyeznik az oszlopok rtkeinek. Ez jl mkdik, ha ugyanabbl a tblbl kpeznk kt vagy tbb halmazt (pldul azok a vevk, akik biciklit rendeltek s azok a vevk, akik buksisakat rendeltek). Akkor is jl mkdik az unikpzs, ha olyan halmazokbl szrmaz tblkbl kpeznk halmazokat, amelyek azonos oszlopokat tartal maznak (pldul: vsrlk neve s cme, valamint az alkalmazottak neve s cme). A 10. fe jezetben rszletesen elmagyarzzuk, hogyan kell hasznlni az SQL UNION mvelett. Sok esetben, ahol egybknt ugyanabbl a tblbl szrmaz sorokat egyestennk, az is megteszi, ha egy sszetett tbla-sszekapcsolsi felttelekkel elltott DISTINCT-et alkal mazunk (a tbbszr szerepl sarok felesleges pldnyainak eltvoltsra). A 8. fejezetben, amikor a bels sszekapcsolsokrl tanulunk, mindent meg fogunk mutatni arrl, hogy miknt oldhatunk meg ilyen feladatokat a JOIN-nal.

Halmazmveletek az SQL-ben
Most, hogy megvannak a halmazmveletekrl szerzett alapismereteink, nzzk meg, hogy az SQL-ben ezek hogyan valsthatk meg!

A klasszikus halmazmveletek s az SQL


Amint korbban emltettk, egyelre nem sok kereskedelmi adatbzisrendszer valstja meg kzvetlenl a metszetkpzst (INTERSECT) vagy a klnbsgkpzst (EXCEPT). A jelenlegi SQL-szabvny azonban vilgosan meghatrozza, hogy ezeket a halmazmvele teket hogyan kellene megvalstani. gy gondoljuk, hogy ezek a halmazmveletek elg fontosak ahhoz, hogy legalbb ttekintst adjunk a mveletek nyelvtanrl. grtk, hogy ksbbi fejezetekben a JOIN segtsgvel ms lehetsgeket is megmuta tunk, hogy egy metszet- vagy klnbsgkpzsre visszavezethet problmt megoldjunk Mivel a legtbb adatbzisrendszer tmogatja a UNION mveletet, a 10. fejezetet ennek szenteltk. A fejezet htralev rsze a hrom halmazmveletrl nyjt ttekintst.

Kzs elemek megtallsa: INTERSECT


Tegyk fel, hogy a kvetkez egyszer problmt szeretnnk megoldani: Mutasd meg azokat a rendelseket, amelyek biciklit s buksisakot is tartalmaznak! Fordts - Select the distinct order numbers from the order details table where the product number is in the list of bike and helmet product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrende lsek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a biciklik s buksisakok termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of bike and helmet product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (l, 2, 6, 10, 11, 25, 26)


Az SQL-ben jratos olvask jogosan krdezhetik, hogy mirt nem kap csoltuk ssze egy JOIN-nal az Order_Details (Megrendelsek_rszletei) s Products (Termkek) tblkat, majd kerestnk bicikli- s buksisak-termkneveket. A vlasz egyszer: mg nem vezettk be a JOINfogalmt, gy a pldban egyetlen tblt s az IN-t hasznltuk, valamint a biciklik s buksisakok ismert termkazonostinak listjt. Ezzel ltszlag sikerl megoldani a dolgot, a vlasz azonban olyan megrendelseket tartal maz, amelyekben bicikli vagy buksisak van. Minket azonban azok rdekelnek, amelyek ben bicikli s buksisak is tallhat. Knnyebb megrteni a problmt, ha kln halmazknt brzoljuk a bicikli- s buksisak-megrendelseket. A 7.6. bra halmazdiagramon keresztl szemllteti a megrendelsek kt halmaza kztti egyik lehetsges kapcsolatot. Tulajdonkppen nem lehet elre megjsolni, hogy milyen kapcsolat ll fenn kt adathal maz kztt. A 7.6. brn egyes megrendelseknl csak bicikli szerepel a rendelt ttelek lis tjn, de nincs buksisak. Ms megrendelseknl csak buksisak szerepel, de nincs bicikli. A kt halmaz tfedse vagy metszete az a rsz, ahol a biciklit s buksisakot tartalmaz megrendelsek szerepelnek. A 7.7. bra azt a lehetsget szemllteti, amikor minden megrendelsben szerepel bicikli s buksisak, de vannak olyan bicikli-megrendelsek, amelyekhez nem rendeltek buksisakot Az, hogy a lekrdezsben mindkett szerepel, azt sugallja, hogy a megoldst kt adat halmazra kell bontani, majd a kt halmazt valamilyen mdon ssze kell kapcsolni. (A lekrdezst is kt rszre kell bontani.)

7.6. bra
Egy lehetsges kapcsolat a megrendelsek kt halmaza kztt

Mutasd meg a bicikli-megrendelseket!" Fordts - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrende lsek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a biciklik termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (1, 2, 6, 11)


Mutasd meg a buksisak-megrendelseket!" Fordts - Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrendel sek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a buksisakok termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (10, 25, 26)

7.7. bra
A buksisak-megrendelsek egyben bicikli-megrendelseket is tartalmaznak

Most mr kszen llunk, hogy - mint bizonyra kitalltuk - a kt halmaz metszett kpezve megkapjuk a vgs vlaszt. A megoldst a 7.8. brn lthat szintaxisdiagram szemllteti. (Jegyezzk meg, hogy tbb INTERSECT-et is hasznlhatunk, gy tbb SELECT lltst is sszekapcsolhatunk.)

Most mr sszekapcsolhatjuk a lekrdezs kt rszt egy INTERSECT mvelettel, hogy megkapjuk a helyes vlaszt: SQL

SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (l, 2, 6, 11) INTERSECT SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (10, 25, 26)

A rossz hr, hogy az SQL kereskedelmi megvalstsai kzl egyelre nem sok tmogatja

az INTERSECT mveletet - de nincs minden veszve! Emlkezznk r, hogy egy tbla elsdleges kulcsa egyrtelmen azonost minden sort. (Elg, ha a mezk kzl csak az el sdleges kulcs egyezik, gy megtalljuk a metszet egyes sorait.) A 8. fejezetben mutatunk egy msik mdszert (JOIN), amivel a problmt ms mdon is meg lehet megoldani. A j hr, hogy az SQL legtbb kereskedelmi megvalstsa tmogatja a JOIN-t.

Hinyz elemek megtallsa: EXCEPT (klnbsg)


Rendben, trjnk vissza megint a biciklik s buksisakok problmjra. Tegyk fel, hogy a kvetkez, egyszernek tn lekrdezst szeretnnk megoldani: Mutasd meg azokat a bicikli-megrendelseket, amelyekben nem szerepel buksisak!" Fordts - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers and product number is not in the list of helmet product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrende lsek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a biciklik termkazonostinak listjban, s a termkazonost nincs benne a buksisakok termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of product numbers and product number is not in the list of helmet product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (1, 2, 6, 11) AND ProductNumber NOT IN (10, 25, 26)
Sajnos a vlaszba csak azok a megrendelsek kerlnek, amelyekben kizrlag bicikli sze repel. A gond az, hogy az els IN zradk biciklit tartalmaz sorokat ad vissza, a msodik IN zradk viszont egyszeren kiszri a buksisakot tartalmaz sorokat. Knnyebb meg rteni a problmt, ha kln halmazknt brzoljuk a bicikli- s buksisak-megrendelse ket. A 7 . 9 . bra halmazdiagramon keresztl szemllteti a megrendelsek kt halmaza kztti egyik lehetsges kapcsolatot.

Az, hogy a lekrdezsben klnbsg vagy de nem szerepel, azt sugallja, hogy a meg oldst kt adathalmazra kell bontani, majd a kt halmazt valamilyen mdon ssze kell kapcsolni. (A lekrdezst is kt rszre kell bontani.) Mutasd meg a bicikli-megrendelseket! Fordts - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrendel sek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a biciklik termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (1, 2, 6, 11)


Mutasd meg a buksisak-megrendelseket! Fordts - Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrendel sek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a buksisakok termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (10, 25, 26)


Most mr kszen llunk, hogy - mint bizonyra kitalltuk - a kt halmaz klnbsgt kpezve megkapjuk a vgs vlaszt. Az SQL az EXCEPT kulcsszt hasznlja a klnbsg kpz mvelet jellsre. A megoldst a 7.10. brn lthat szintaxisdiagram szemllteti.

Most mr sszekapcsolhatjuk a lekrdezs kt rszt egy EXCEPT mvelettel, hogy


megkapjuk a helyes vlaszt: SQL

SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (1, 2, 6, 11) EXCEPT SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (10, 25, 26)

Emlkezznk vissza arra, amikor a klnbsgkpzst trgyaltuk: a halmazok sorrendje szmt. Ebben az esetben a bicikliket krdezzk le, kivve a buksisakokat Ha ennek az ellenkezjt a bicikli nlkli buksisak-megrendelseket - keressk, a kvetkez kppen fordthatjuk meg a lekrdezst: SQL

SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (10, 25, 26) EXCEPT SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (l, 2, 6, 11)

Sajnos az SQL kereskedelmi megvalstsai kzl egyelre nem sok tmogatja az EXCEPT mveletet, de kapjunk a sisakunkhoz! Emlkezznk r, hogy egy tbla elsdleges kulcsa egyrtelmen azonost minden sort. (Nem kell egy sor minden mezjnek megfelelnie a fel ttelnek, csak az elsdleges kulcsnak, hogy megtalljuk a klnbz sorokat.) A 9. fejezet ben mutatunk egy msik mdszert (OUTER JOIN) is, amivel a problmt ms mdon lehet megoldani. A j hr, hogy az SQL legtbb kereskedelmi megvalstsa tmogatja az OUTER JOIN-t.

Halmazok egyestse: UNION


Mg egy utols megoldand feladat a biciklikkel s buksisakokkal, s utna tovbbpedlozunk a kvetkez fejezetre. Tegyk fel, hogy a kvetkez, a felsznen egyszernek tn problmt akarjuk megoldani:

Mutasd meg azokat a megrendelseket, amelyekben vagy bicikli, vagy buksisak szerepel!"
Fordts - Select the distinct order numbers from the order details table where the product number is in the list of bike and helmet product numbers

(Vlaszd ki azokat a klnbz megrendels-azonostkat a megrendel sek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a biciklik s buksisakok termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of bike and helmet product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (l, 2, 6, 10, 11, 25, 26)


Tulajdonkppen ez gy tkletesen mkdik - de akkor mirt hasznljunk UNION-t, hogy megoldjuk a feladatot? Az igazsg az, hogy nem kell, de ha sszetettebb problmn dol gozunk, jl jhet a UNION. Sorold fel a biciklit rendel vevket, azokkal a beszlltkkal egytt, akik biciklit knlnak! Sajnos ennek a krdsnek a megvlaszolshoz nhny JOIN mveletet magban foglal lekrdezst kell szerkesztennk, majd a UNION-nal kell megtallnunk a vgs vlaszt. Mivel mg nem mutattuk meg, hogyan kell a JOIN-t alkalmazni, ennek a problmnak a megoldsa a 10. fejezetig vratni fog magra. Emiatt mris rdemes tovbb olvasni, nem igaz? Trjnk vissza a biciklik s buksisakok problmra s oldjuk meg a UNION-nal. Ha a bicikli- s buksisak-rendelseket kt kln halmazknt brzoljuk, knnyebben meg fogjuk rteni a problmt. A megrendelsek kt halmaza kztti egyik lehetsges kapcsolatot a 7.11. bra szemllteti.

Az, hogy a lekrdezsben vagy vagy egytt szerepel, azt sugallja, hogy a megoldst kt adathalmazra kell bontani, majd a kt halmazt egy UNION-nal ssze kell kapcsolni. Ezt a lekrdezst kt rszre bonthatjuk. ,,Mutasd meg a bicikli-megrendelseket! Fordts - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrendelsek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a biciklik termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (1, 2, 6, 11)


,,Mutasd meg a buksisak-megrendelseket! Fordts - Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers (Vlaszd ki azokat a klnbz megrendels-azonostkat a megrendelsek rszleteit tartalmaz tblbl, ahol a termkazonost megtallhat a buksi sakok termkazonostinak listjban.) Tisztzs - Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers SQL SELECT DISTINCT OrderNumber

FROM Order_Details WHERE ProductNumber IN (10, 25, 26)


Most mr kszen llunk, hogy mint bizonyra kitalltuk a kt halmaz unijt kpezve megkapjuk a vgs vlaszt. A megoldst a 7 . 1 2 . brn lthat szintaxisdiagram szemllteti.

Most mr sszekapcsolhatjuk a lekrdezs kt rszt egy UNION mvelettel, hogy meg kapjuk a helyes vlaszt:

SQL

SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (1, 2, 6, 11) UNION SELECT DISTINCT OrderNumber FROM Order_Details WHERE ProductNumber IN (10, 25, 26)

A j hr, hogy az SQL kereskedelmi megvalstsai kzl a legtbb tmogatja a UNION mveletet. Mint az elbbi pldkbl is valsznleg kiderlt, a UNION lehet a nehezebb megolds, ha egy vagy eredmnyt akarunk megkapni egyetlen tblbl. A UNION akkor a leghatkonyabb, ha tbb klnbz, de hasonl szerkezet tblbl akarunk listt kszteni. A 10. fejezetben rszletesen is megismerkednk majd a UNION-nal.

sszefoglals
A fejezet elejn a halmaz fogalmval ismerkedtnk meg, majd az SQL-ben megvalstott fbb halmazmveleteket (metszet, klnbsg s uni) trgyaltuk rszletesen. Megmutattuk, hogyan hasznlhatunk halmazdiagramot a megoldsra vr problma szemlltetsre. Vgl tvgygerjesztknt bemutattuk az alapvet SQL-utastsformkat s a hrom halmazmvelet kulcsszavt (INTERSECT, EXCEPT s UNION). Ezen a ponton valsznleg gy gondolkodunk: Vrjunk csak, megmutattak nekem hrom halmazmveletet, amibl kettt valsznleg nem fogok tudni hasznlni? Gondoljunk vissza a fejezet cmre: Halmazokban gondolkodni. Ha szeretnnk egyltaln sikeresen megoldani sszetett feladatokat, a problmt eredmnyhalmazokra kell bontanunk, amelyeket azutn jra ssze kell kapcsolnunk. Szval, ha a problma gy nz ki, hogy ennek ilyennek s annak meg olyannak kell lennie, akkor elszr valsznleg meg kell oldanunk ennek, majd utna annak a problmjt, majd ssze kell ket kapcsolnunk, hogy megkapjuk a vgs vlaszt. Az SQL-szabvny meghatroz egy knyelmes INTERSECT mveletet, de egy INNER JOIN ppen olyan jl mkdhet. Errl bvebben a 8. fejezetben lesz sz. Hasonl mdon, ha a problma gy rhat le, hogy ennek ilyennek kell lennie, de nem lehet olyan, akkor elszr ennek, majd annak a problmjt kell megoldanunk, vgl ebbl ki kell vonnunk azt, hogy megkapjuk a vlaszt. Megmutattuk az SQL-szabvny EXCEPT mvelett, de egy OUTER JOIN-nal is sikerlhet a dolog. Errl a 9. fejezetben lesz rszletesen sz. Vgl megmutattuk, hogyan adhatunk ssze adathalmazokat a UNION segtsgvel Mint grtk, a UNION-nal a 10. fejezetben fogunk mlysgeiben megismerkedni.

Bels sszekapcsols
Ne fogd vissza az ihleted s a kpzeleted; ne vlj a modelled rabszolgjv." - Vincent van Gogh

A fejezet tmakrei
Mi az a JOIN? Az INNER JOIN Az INNER JOIN alkalmazsi lehetsgei Pldk sszefoglals nll feladatok

Eddig elssorban az egyetlen tbla segtsgvel trtn problmamegoldsra sszpontos tottunk. Mr tudjuk, hogyan kaphatunk egyszer vlaszokat egy tblbl, s azt is tudjuk, hogy kifejezsek segtsgvel vagy az eredmny rendezsvel hogyan kaphatunk kicsit bonyolultabb vlaszokat. Ms szavakkal, szemet, orrot, szjat mr tudunk rajzolni. Ebben a fejezetben megtanuljuk, hogyan kell sszektni a rszeket, hogy arckp legyen bellk.

Mi az a JOIN?
A 2. fejezetben hangslyoztuk, hogy milyen fontos, hogy a klnbz dolgokra vonatkoz adatokat sztvlasszuk s kln tblkban troljuk. A vals letben a legtbb problma megoldshoz tbb kln tblban szerepl adatokat kell sszekapcsolnunk vsrlkat a megrendelseikkel, gyfeleket a foglalsaikkal, jtkosokat a pontszmaikkal, hallgatkat az ltaluk felvett rkkal, vagy recepteket a szksges hozzvalkkal. Ahhoz, hogy ezeket az sszetettebb feladatokat megoldjuk, tbb tblt kell sszekapcsolnunk, gy kapjuk meg a keresett vlaszokat. Ehhez a JOIN (sszekapcsols) kulcsszt kell hasznlnunk. Az elz fejezetbl kiderlt, milyen hasznos lehet egy problma megoldsnl kt adat halmaz metszett ltrehozni. Ugyanakkor, ha visszaemlksznk, az INTERSECT mindkt eredmnyhalmaz sszes oszlopt sszehasonltja. A JOIN szintn metszetet hoz ltre,

azzal a klnbsggel, hogy az adatbzis-kezel rendszer a JOIN esetben csak az ltalunk meghatrozott oszlopokat veszi figyelembe. gy a JOIN segtsgvel kt nagyon klnb z szerkezet tbla metszett is ltrehozhatjuk a kivlasztott oszlopokban megegyez rtkek alapjn. Pldul egy JOIN segtsgvel sszeprosthatjuk a vsrlkat a megren delseikkel, ha a Customers (Vsrlk) tbla CustomerID (Vsrlazonost) s az Orders (Megrendelsek) tbla CustomerID mezit hasonltjuk ssze. Amint ksbb ltni fogjuk, a JOIN-t az SQL-utastsok FROM zradkban alkalmazzuk. A JOIN egy logikai tblt hatroz meg, ami kt tbla vagy eredmnyhalmaz sszekap csolsbl jn ltre. Azltal, hogy a JOIN-t a FROM zradkba helyezzk, egy ilyen ssze kapcsolt tblt hatrozunk meg, s ebbl fogja a lekrdezs kivlogatni a vgs ered mnyhalmazt. Ms szavakkal, a JOIN annak az egyetlen tblnak a helyn ll, amelyet a FROM zradkban a korbbi fejezetekben megismert mdon hasznltunk. Amint az ki fog derlni a fejezet sorn, tbb JOIN mveletet is megadhatunk, amivel kettnl tbb tblbl hozhatunk ltre sszetett eredmnyhalmazokat

Az INNER JOIN
Az SQL-szabvny a JOIN mvelet vgrehajtsnak tbbfle mdjt is meghatrozza, ame lyek kzl a leggyakoribb az gynevezett INNER JOIN (bels sszekapcsols). Kpzeljk el egy pillanatra, hogy ssze akarjuk kapcsolni a hallgatkat azokkal az rkkal, amelyeket felvettek. Elkpzelhet, hogy nmelyik hallgat - br felvettk az iskolba - mg nem vett fel egyetlen rt sem, s lehetnek olyan rink is, amelyeket ugyan meghirdettek, de mg egyetlen hallgat sem vette fel. A Students (Hallgatk) s a Classes (rk) tbla kztti INNER JOIN a Students tblbl fog sorokat visszaadni, sszekapcsolva a Classes tbla soraival (a Students_Schedules Hallgatk_rabeosztsa - tbln keresztl) , de nem fogja visszaadni sem azokat a hall gatkat, akik mg semmilyen rt nem vettek fel, sem azokat az rkat, amelyeket mg egyetlen hallgat sem vett fel. Az INNER JOIN csak azokat a sorokat adja vissza, ahol a kapcsold rtkek mindkt tblban vagy eredmnyhalmazban megegyeznek.

Mit szabad" JOIN segtsgvel sszekapcsolni?


Legtbbszr az egyik tbla elsdleges kulcst s msik tbla megfelel idegen kulcst adjuk meg a JOIN-nak, mint sszekt pontot. Ha emlksznk mg a 2. fejezetbl, az idegen kulcsnak ugyanolyan adattpusnak kell lennie, mint a megfelel elsdleges kulcsnak. Mindazonltal szabad JOIN-nal sszekapcsolni kt tblt vagy eredmnyhalmazt brmely olyan oszlop szerint, amely az SQL-szabvny alapjn "JOIN-megfelel" adattpusba tartozik. ltalnossgban, a karakter tpus oszlopokat sszekapcsolhatjuk msik karakter tpus oszloppal vagy kifejezssel, brmilyen (pldul egsz) szm tpus oszlopot brmilyen ms (mondjuk pldul lebegpontos) szm tpus oszloppal, valamint brmilyen dtum

tpus oszlopot brmilyen dtum tpus oszloppal. Ez lehetv teszi, hogy pldul a Customers tbla sorait sszekapcsoljuk az Employees (Alkalmazottak) tbla soraival a vrosnevet vagy az irnytszmot tartalmaz oszlop szerint (mondjuk ha kivncsiak vagyunk r, hogy mely vsrlk s alkalmazottak lnek ugyanabban a vrosban vagy postakrzetben). Az, hogy lehetsges brmely kt tbla brmely JOIN-megfelel oszlopa kztt JOIN-t hasznlni, meg nem felttlenl jelenti azt, hogy ajnla tos is. Ahhoz, hogy a JOIN rtelmes legyen, az sszekapcsolt oszlopoknak ugyanolyan jelents adatokat kell tartalmazniuk. Pldul nincs rtelme a vsrlk neveit az alkal mazottak postacmvel kapcsolni ssze, habr mindkt oszlop karakter adattpus. Az eredmnyhalmazunk res lesz, hacsak nem rt valaki vletlenl nevet az alkalmazott postacmt tartalmaz oszlopba. Hasonlkppen, semmi rtelme a StudentID s a ClassID kztti JOIN-nak, hiba szm tpus mind a kett. Lehet, hogy lesz nhny sor az ered mnyhalmazban, de ezeknek nem lesz semmilyen jelentsk. Mg amikor rtelmes is bizonyos oszlopokat sszekapcsolni, elfordulhat, hogy olyan lekrdezst hozunk ltre, aminek a megvlaszolsa nagyon sokig tart. Pldul ha olyan oszlopokon hasznlunk JOIN-t, amelyekre az adatbzis rendszergazdja nem adott meg indexet, akkor az adatbzisrendszen jelents tbbletmunkra knyszertjk, valamint ha kifejezsekre alkalmazunk JOIN-t- pldul kt tblbl sszefztt vezetk- s keresztne vekre -, akkor az adatbzisrendszernknek nem csak ltre kell hoznia a kifejezsbl kapott oszlopot minden sorhoz, de lehet, hogy a megfelel vlaszhoz tbbszr is vgig kell futnia mindkt tbla sszes adatn.

Oszlophivatkozsok
Mieltt rtrnnk a JOIN nyelvtanra, szt kell ejtennk mg egy kulcsfontossg tnyrl. Mivel az eddig alkalmazott lekrdezsek egyetlen tblra vonatkoztak, az oszlopnevek hasznlata egyrtelm volt. Viszont ha elkezdnk tbb tblt rint lekrdezsekkel foglal kozni (pldul a JOIN-ok hasznlatnl), akkor ltalban kett vagy tbb tblra hivatko zunk, amelyek viszont tartalmazhatnak azonos nev oszlopokat. Ha emlksznk mg a 2. fejezetre, ott azt a tancsot kaptuk, hogy az egyik tblbl az elsdleges kulcsot a meg felel msik tblba tmsolva a nevvel egytt - hozzunk ltre egy idegen kulcsot.

Hogyan tudjuk teht kristlytisztn elmagyarzni az adatbzis-kezel rendszernek, hogy egy mez melyik msolatra gondolunk az adott lekrdezsben? Az egyszer vlasz az, hogy olyan oszlophivatkozst hasznlunk, amely tartalmazza a tbla nevt. A 8.1. brn lthat egy oszlophivatkozs diagramja. Habr az oszlopnevet hasznlhatjuk nmagban is brmely SQL-utasts zradkban, kifejezetten meg is jellhetjk az oszlopnevet a szltbla nevvel. Ha az oszlopnv nem egyedi a FROM zradkban hasznlt sszes tbla kztt, akkor muszj megjellni az oszlopnevet a szltbla nevvel. Albb lthatjuk, hogyan nz ki egy egyszer SELECT utasts az Employees tbln, amelyben ilyen minstett oszlopneveket hasznlunk: SQL

SELECT Employees.FirstName, Employees.LastName, Employees.PhoneNumber FROM Employees

Most, hogy ezt a kis trkkt is ismerjk, haladjunk tovbb s vizsgljuk meg a JOIN utas tsformjt!

Utastsforma
Az eddig tanultakat felfoghatjuk egy kis orszgti lmnyautzsnak vagy egy rvid htvgi bevsrlkrtnak. Eljtt az ideje, hogy bekapcsoljuk a biztonsgi vet, s kimerszkedjnk az autplyra - vizsgljuk meg az INNER JOIN utastsformjt!

A tblk hasznlata
Kezdjnk elszr egy egyszer feladattal - egy kt tbla kztti INNER JOIN-nal. A 8.2. brn lthat a lekrdezsnl hasznlatos utastsforma.

Amint lthat, a FROM zradk csak egy picivel vlik bonyolultabb. (Az egyszersg kedvrt a WHERE s az ORDER BY zradkoktl egyelre eltekintettnk.) Egyetlen tblanv helyett kt tblanevet adunk meg, s a JOIN kulcsszval kapcsoljuk ket ssze. Vegyk szre, hogy az INNER kulcssz, ami elhagyhat, a JOIN tpust adja meg. Amint a kvetkez fejezetbl megtudhatjuk majd, hasznlhat mg gynevezett OUTER JOIN (kls sszekapcsols) is. Ha nem adjuk meg kifejezetten, hogy milyen tpus JOIN-t szeretnnk, akkor az alaprtelmezs az INNER. Tancsos mindig egyrtelmen kirni, hogy milyen tpus JOIN-t szeretnnk, hogy a lekrdezs jellege tiszta s vilgos legyen. Azok, akik kvetik az A fggelkben tallhat teljes szintaxisdiagra mokat, a Tblahivatkozs JOIN Tblahivatkozs alakkal tallkoz hatnak az sszekapcsolt tbla kifejezs meghatrozsnl. A Tblahivatkozs egy tbla_ neve vagy egy sszekapcsolt tbla lehet, a SELECT utasts FROM zradka pedig egy Tblahivatkozs-t hasznl. Ezeket az sszetett meghatrozsokat fent egybegyr tuk", hogy knyelmesebben, egyetlen diagramon brzolhassuk az egyszer, kt tbla k ztti JOIN-t. A fejezet htralv rszben a diagramokban hasonl egyszerstssel lnk. Az INNER JOIN legfontosabb rsze a msodik tblt kvet ON vagy USING zradk, amely megmondja az adatbzis-kezelnek, hogy pontosan hogyan vgezze el a JOIN mveletet. Az adatbzis-kezel rendszernek ahhoz, hogy megoldja a JOIN-t, az els tbla minden sort logikailag ssze kell kapcsolnia a msodik tbla minden sorval. (Ezt az sszekapcsolst, amelyben egy tbla minden sora sszekapcsoldik egy msik tbla minden sorval, Descartes-szorzatnak nevezik.) A rendszer ez utn alkalmazza az ON vagy USING zradkban megadott feltteleket, kivlogatva a megfelel visszaadand sorokat. A 6. fejezetben megtanultuk, hogyan hasznlhat a keressi felttel a WHERE zradkban. Keressi felttelt hasznlhatunk a JOIN utasts ON zradkban is, megadva egy logikai tesztet, amelynek teljeslnie kell ahhoz, hogy visszakapjunk egy adott sszekapcsolt sor prt. Ne felejtsk el, hogy csak olyan keressi felttelnek van rtelme, amelyben mindkt tblbl legalbb egy-egy oszlopot sszehasonltunk. Akrmilyen bonyolult keressi felt telt rhatunk, de ltalban egyszer egyenlsgi tesztet fogunk alkalmazni az egyik tbla elsdleges kulcsot tartalmaz oszlopa s a msik tbla idegen kulcsot tartalmaz oszlopa kztt. Nzznk meg egy egyszer pldt! Egy jl tgondolt adatbzisban az sszetett osztlyneve ket rdemes egy msik tblban trolni, s a neveket egy egyszer kulcsrtkkel kapcsolni vissza az eredeti tblhoz. Ez segt megelzni az adatbevitel sorn keletkez hibkat. Brki, aki az adatbzisunkat hasznlja, az osztlynevek listjbl vlaszt, nem pedig sajt kezleg gpeli be a nevet (ami eslyt ad a flregpelsre) minden sor esetben. Pldul a Recipes (Receptek) mintaadatbzis a receptosztlyokat kln tblban sorolja fel, elvlasztva maguktl a receptektl. A Recipe_Classes (Receptosztlyok) s a Recipes tblk kztti kapcsolat a 8.3. brn lthat.

Amikor receptekrl, illetve a megfelel receptosztly-lersokrl (RecipeClassDescription) akarunk informcit lekrdezni az adatbzisbl, akkor nem a Recipes tblban szerepl RecipeClassID kdszmokat akarjuk ltni. Lssuk teht, hogyan oldhat meg ez a feladat a JOIN segtsgvel!

Ebben a fejezetben mindenhol a 4. fejezetben hasznlt "Krelem Fordts - Tisztzs - SQL"-mdszert alkalmazzuk. Sorold fel az adatbzisunkban szerepl sszes recept cmt, az elkszts menett, s a receptosztly lerst!"
Fordts - Select recipe title, preparation, and recipe class description recipe class ID from the recipe classes table joined with the recipes table on in the recipe classes table matching recipe class ID in the recipes table (Vlaszd ki a recept cmt, az elkszts menett s a receptosztly lerst a receptosztlyok tbljval sszekapcsolt recepttblbl, ahol az ssze kapcsols a receptosztlyok tbljban tallhat receptosztly-azonost s a receptek tbljban lev receptosztly-azonost szerint trtnik.) Tisztzs - Select recipe title, preparation, and recipe class description from the recipe classes table inner joined with the recipes table on recipe_classes.recipe class ID in the recipe classes table matching = recipes.recipe class ID in the recipes table SQL

SELECT RecipeTitle, Preparation, RecipeClassDescription FROM Recipe_Classes INNER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID

Amint lthat, a Tisztzs lpsben hasznlt kifejezsek mr hasonltanak a vgs, az SQL kdban hasznlt zradkokhoz. Ahogy egyre bonyolultabb lekrdezseket kezdnk rni, rdemes lesz ezt a mdszert kvetni, ami segt a tisztzstl eljutni a vgs SQL-megoldsig.

Amikor a FROM zradkban tbb tblt hasznlunk, mindig a megfelel tbla nevvel minstett oszlopneveket hasznljuk, hogy teljesen vilgos legyen, melyik tbla melyik oszlopra gondolunk. (Mr ltszik, mirt szaktottunk idt a tblahivatkozsok lersra!) Vegyk szre, hogy az ON zradkban azrt volt muszj minsteni a RecipeClassID (Receptosztly-azonost) neveket, mert tbb ilyen nev oszlop is ltezik - az egyik a Recipes tblban, a msik a Recipe_Classes tblban. Ugyanezrt nem kellett a SELECT zradkban a RecipeTitle (Receptcm), a Preparation (Elkszts) s RecipeClassDescription (Receptosztly lersa) oszlopneveket minsteni, mivel ezek mind csak egyszer fordulnak el az sszes tbla kztt. Ha a kimenetben ltni szeretnnk a RecipeClassID-t is, akkor meg kell mondanunk az adatbzis-kezelnek, hogy melyik RecipeClassID-re van szksgnk arra, amelyik a Recipe_Classes tblban szerepel, vagy arra, amelyik a Recipes tblban tallhat. Egy olyan lekrdezs, ahol minden nv minstett, a kvetkezkppen nz ki: SQL

SELECT Recipes.RecipeTitle, Recipes.Preparation, Recipe_Classes.RecipeClassDescription FROM Recipe_Classes INNER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID

Br a legtbb forgalomban lv SQL-megvalsts tmogatja a JOIN kulcsszt, vannak olyanok is, amelyek nem. Ha az adatbzis-kezel rendszernk nem tmogatja a JOIN-t, akkor is meg tudjuk oldani a feladatot, gy, hogy a FROM zradkban felsoroljuk az sszes tblt, amire szksgnk van, s az ON zradk helyett a WHERE zradkba tesszk a keressi felttelt. A JOIN-t nem tmogat adatbzisrendszerekben teht gy nz ki a feladatunk megoldsa:

SELECT Recipes.RecipeTitle, Recipes.Preparation, Recipe_Classes.RecipeClassDescription FROM Recipe_Classes, Recipes WHERE Recipe_Classes.RecipeClassID = Recipes.RecipeClassID
Tulajdonkppen egy kezd szmra ez a forma sokkal termszetesebbnek tnhet az egy szer lekrdezsek esetben. Az SQL-szabvny azonban lehetv teszi, hogy kizrlag a FROM zradkon bell pontosan meghatrozzuk a vgs eredmnyhalmaz forrst. Fogjuk fel a FROM zradkot gy, mint ami pontosan meghatroz egy sszekapcsolt eredmnyhalmazt, amibl az adatbzis-kezel kinyeri a kvnt vlaszt. Az SQLszabvny szerint a WHERE zradk csak arra szolgl, hogy a FROM zradk ltal meghatrozott eredmnyhalmazbl kiszrjn bizonyos sorokat.

Ugye, hogy nem olyan bonyolult? De vajon mi trtnt a 8.2. brn lthat USING zra dkkal? Ha a kt tblban a kt sszehasonltand oszlopnak ugyanaz a neve, s az sszekapcsols feltteleknt egyszeren ezek egyenlsgt akarjuk hasznlni, akkor hasznlhatjuk a USING zradkot a megfelel oszlopnvvel. Nzzk meg az elz pldt a USING zradk segtsgvel megvalstva: Sorold fel az adatbzisunkban szerepl sszes recepthez tartoz cmet, az elkszts menett s a receptosztly lerst! Fordts - Select recipe title, preparation, and recipe class description from the recipe classes table joined with the recipes table using recipe class ID (Vlaszd ki a recept cmt, az elkszts menett s a receptosztly lerst a receptosztlyok tbljval sszekapcsolt recepttblbl, ahol az sszekap csols a receptosztlyok tbljban tallhat receptosztly-azonost szerint trtnik.) Tisztzs - Select recipe title, preparation, and recipe class description from the recipe classes table joine d w i t h t h e recipes table using recipe class ID SQL SELECT Recipes.RecipeTitle, Recipes.Preparation,

Recipe_Classes.RecipeClassDescription FROM Recipe_Classes INNER JOIN Recipes USING (RecipeClassID)


Nhny adatbzisrendszer mg nem tmogatja a USING kulcsszt. Ha az ltalunk hasznlt rendszerben nem hasznlhat a USING, ugyanezt az eredmnyt mindig elrhetjk egy ON zradkkal s egy egyenlsgi sszehasonltssal. Az SQL-szabvny meghatroz egy gynevezett NATURAL JOIN-t (termszetes sszekapcsols) is, ami kt megadott tblt minden azonos nev oszlop sszehasonltsval kapcsol ssze. Ha csak a kt kvnt sszekapcsol oszlopnak van azonos neve a kt tblban, s az adatbzis-kezel rendszer tmogatja a NATURAL JOIN-t, akkor a pldnkat a kvetkez mdon is megoldhatjuk:

SELECT Recipes.RecipeTitle, Recipes.Preparation, Recipe_Classes.RecipeClassDescription FROM Recipe_Classes NATURAL INNER JOIN Recipes
A NATURAL kulcssz hasznlata esetn ne adjunk meg ON vagy USING zradkot. Ne felejtsk el, hogy az INNER kulcssz hasznlata nem ktelez. Ha NATURAL JOIN-t runk, akkor a rendszer INNER tpus sszekapcsolst felttelez.

Amint ebben a rszben korbban mr emltettk, az adatbzisrendszer elszr ltrehozza az els s a msodik tbla sorainak sszes lehetsges kombincijt, majd alkalmazza az ON vagy USING zradkban megadott felttelt. Ez alapjn gy tnhet, hogy rengeteg tbbletmunkra knyszertjk a rendszert, hiszen elszr ltrehozza az sszes lehetsges kombinci halmazt, majd ezek kzl alkalomadtn egszen kevs illeszked sort fog kiszrni a szmunkra. Valjban biztosak lehetnk benne, hogy az sszes modern relcisadatbzis-kezel min dig kirtkeli a teljes JOIN zradkot, mieltt elkezdi kiolvasni a sorokat. Az eddigiekben bemutatott pldafeladatot sok adatbzis-kezel rendszer gy kezdi el megoldani, hogy vesz egy sort a Recipes_Classes tblbl, majd egy bels hivatkozst kvet - egy indexet (ha a tbla tervezje megadott ilyet) -, amelynek a segtsgvel gyorsan megtallja az sszetartoz sorokat a Recipes tblbl, amelyek illeszkednek a Recipe_Classes tbla els sorhoz, mieltt a Recipes_Classes kvetkez sorra lpne. Ms szval, az adatbzis rendszer okosan egy optimlis eljrst kvet, amelynek sorn csak az sszetartoz soro kat kell kiolvasnia. Ez a nhny szz soros tblkbl ll adatbzisok esetben taln nem tnik fontosnak, de ha a rendszernek tbbszzezer sorral kell megbirkznia, akkor a klnbsg g s fld!

Korrelcis nevek (lnevek) hozzrendelse tblkhoz


Az SQL-szabvny meghatroz egy mdszert, amivel lnevet - a szabvny szhasznlatval korrelcis nevet- adhatunk brmelyik tblnak, amelyet a FROM zradkban hasznlunk. Ez a lehetsg igen hasznos lehet, amikor olyan sszetett lekrdezseket runk, amelyek hossz, bonyolult nev tblkat hasznlnak. A hossz nev tblknak adhatunk egy egyszer nevet, amelyet hasznlva knyelmesebb az oszlophivatkozsok megadsa.

A 8.4. brn lthat, hogyan rendelhetnk korrelcis nevet egy tblhoz a FROM zradkban. Ahhoz, hogy egy tblnak korrelcis nevet adjunk, a tbla neve utn helyezzk el a nem ktelez AS kulcsszt, majd a kvnt korrelcis nevet. (Mint minden nem ktelez kulcs sz esetben, ajnlatos az AS kulcsszt minden esetben kitenni, gy utlag knnyebb lesz a lekrdezst olvasni, illetve megrteni.) Miutn egy tblhoz hozzrendeltnk egy korrel cis nevet, onnantl kezdve azt a tbla eredeti neve helyett hasznlhatjuk brmely zradk ban, belertve a SELECT zradkot, az ON s Where zradk keressi feltteleit, s az ORDER BY zradkot. Elsre persze sszezavarodhatunk, mivel a SELECT zradkot ltalban elbb rjuk meg, mint a FROM zradkot. Ha a FROM zradkban lnevet sznd kozunk adni egy tblnak, akkor a SELECT zradkban az oszlopnevek minstsnl is ezt az lnevet kell hasznlnunk. Alaktsuk t az eddig hasznlt pldafeladat megoldst korrelcis nevek segtsgvel, csak a prba kedvrt. me a lekrdezs, amelyben a Recipes tbla korrelcis neve R lesz, a Recipe_Classes tbl pedig RC: SQL

SELECT R.RecipeTitle, R.Preparation, RC.RecipeClassDescription FROM Recipe_Classes AS RC INNER JOIN Recipes AS R ON RC.RecipeClassID = R.RecipeClassID

Tegyk fel, hogy hozz akarunk toldani a lekrdezshez egy szrt, ami csak a Main course (Ftel) vagy a Dessert (Desszert) osztlyba tartoz recepteket adja vissza. (A szrkrl a 6. fejezetben olvashattunk.) Miutn megadtuk a korrelcis nevet, a tovbbiakban a tbl ra val sszes hivatkozsban az j nevet kell hasznlnunk. me az SQL-plda: SQL

SELECT R.RecipeTitle, R.Preparation, RC.RecipeClassDescription FROM Recipe_Classes AS RC INNER JOIN Recipes AS R ON RC.RecipeClassID = R.RecipeClassID WHERE RC.RecipeClassDescription = 'Main course' OR RC.RecipeClassDescription = 'Dessert'

Nem muszj minden tblhoz korrelcis nevet rendelni. Az elz pldban megtehettk volna, hogy csak a Recipes vagy csak a Recipe_Class tblhoz rendelnk korrelcis ne vet. Bizonyos esetekben azonban muszj egy tblhoz korrelcis nevet rendelnnk egy sszetett JOIN-on bell. Ugorjunk most egyet, s trjnk t a Bowling League (Tekebaj noksg) adatbzisra, s vizsgljunk meg egy olyan esetet, ahol ez a helyzet. A 8.5. brn lthat a Teams (Csapatok) s a Bowlers (Jtkosok) tblk kztti kapcsolat.

Amint lthat, a TeamID (Csapatazonost) egy idegen kulcs a Bowlers tblban, amely segt megtallni az informcit egy csapat sszes jtkosrl. A csapat jtkosai kzl az egyik egyben csapatkapitny is, ezrt a Bowlers tbla BowlerID-ja (Jtkosazonost) s a Teams tbla CaptainID-ja (Csapatkapitny-azonost) kztt is van egy sszekapcsols. Ha egyetlen lekrdezssel akarjuk kiratni a csapatnevet, a csapatkapitny nevt, s az sszes jtkos nevt, akkor a Bowlers tblnak ktszer kell szerepelnie a lekrdezsben -egyszer azrt, hogy sszekapcsoljuk a CaptainID-t a csapatkapitny nevvel, s egyszer azrt, hogy sszekapcsoljuk a TeamID-val, hogy megkapjuk az adott csapat tagjainak a listjt. Ebben az esetben muszj lnevet rendelni a Bowlers tbla egyik vagy mindkt pldnyhoz, hogy az adatbzisrendszer meg tudja klnbztetni az egyik pldnyt, amelyik a csapatkapitny nevhez kapcsoldik, a msik pldnytl, amelyikbl a csapatta gok listjt kapjuk majd meg. A fejezetben ksbb lthatunk egy olyan pldt, ahol a meg oldshoz egy tblbl tbb pldnyt kell hasznlni, illetve ezekhez lneveket kell rendelni. Az emltett plda, amely a Bowling League adatbzist hasznlja, a Pldk rsz Kettnl tbb tbla cm rszben tallhat.

SELECT utastsok begyazsa


Tegyk a dolgokat kicsit rdekesebb! A legtbb SQL-megvalstsban a FROM zradkban a tblanv helyre behelyettesthet egy teljes SELECT utasts. Az SQL-szabvny az ilyen begyazott SELECT utastst szrmaztatott tblnak hvja. Ha belegondolunk, a SELECT utasts valjban egy md arra, hogy egy vagy tbb tblbl adatok egy rszhalmazt nyerjk ki. Termszetesen hozz kell rendelnnk egy korrelcis nevet, hogy a begyazott lekrdezs vgrehajtsbl kapott eredmnyhalmaznak legyen neve. A 8.6. brn lthat, hogyan kell a JOIN zradkba SELECT utastst begyazni. Vegyk szre az brn, hogy a SELECT utasts tartalmazhatja brmelyik lekrdezsi zra dkot, kivve az ORDER BY-t. Ezenkvl az INNER JOIN kulcsszavak brmelyik oldaln hasznlhatunk SELECT utastsokat vagy tblkat, vegyesen is.

Vessnk ismt egy pillantst a Recipes s a Recipe_Classes tblkra! Felttelezzk, hogy a feladat tovbbra is csak a ftelek s desszertek lekrdezse. me a lekrdezs j vlto zata, amelyben a Recipe_Classes tblt egy olyan SELECT utastsn vezetjk keresztl, amely rsze az INNER JOIN zradknak: SQL

SELECT R.RecipeTitle, R.Preparation, RCFiltered.ClassName FROM (SELECT RecipeClassID, RecipeClassDescription AS ClassName FROM Recipe_Classes AS RC WHERE RC.ClassName = 'Main course' OR RC.ClassName = 'Dessert') AS RCFiltered INNER JOIN Recipes AS R ON RCFiltered.RecipeClassID = R.RecipeClassID

8.6. bra
A tblanevek SELECT-re cserlse egy JOIN-on bell

Nhny adatbzis-kezel rendszer nem tmogatja a SELECT utasts FROM zradkba val begyazst. Ha a rendszernk nem tmogat ja ezt a szolgltatst, akkor ltalban megoldja a problmt, ha a bels SELECT-et egy nzettblba mentjk, s a nzettbla nevt hasznljuk a SELECT utasts helyett. A CD-mellkleten tallhat mintaadatbzisok egyikt a MySQL adatbzis-kezel rend szerrel hoztuk ltre, amely nem tmogatja a SELECT utastsok begyazst. Ha meg nzzk ezeket a MySQL adatbzisokat a CD-n, azt talljuk majd, hogy a begyazott SELECT-et ignyl lekrdezseket gy oldottuk meg, hogy egy nzettblt mentettnk, majd a vgs lekrdezsben a nzettbla nevt hasznltuk.

Figyelem! Elszr is, ha gy dntnk, hogy egy tblanv helyre egy begyazott SELECT utastst tesznk, gyzdjnk meg rla, hogy nem csak azokat az oszlopokat szerepeltetjk, amelyeket a vgeredmnyben szeretnnk majd ltni, hanem a JOlN-ban az sszekapcsols hoz hasznlt egyb oszlopokat is. Ezrt szerepel a begyazott utastsban mind a RecipeClassID, mind a RecipeClassDescription. A jtk kedvrt a RecipeClassDescription a begyazott utastsban a ClassName (Osztlynv) lnevet kapta, ezrt a SELECT zradk RecipeClassDescription helyett ClassName-re hivatkozik. Vegyk szre, hogy az ON zradk most a begyazott SELECT utasts korrelcis nevre - RCFiltered - hivatkozik a tbla eredeti neve vagy a tblhoz a begyazott SELECT utastsban hozzrendelt korrelcis nv helyett. Ha az adatbzis-kezel rendszernk elg okosan tud optimalizlni, akkor a fenti mdon megfogalmazott lekrdezseknek ugyanolyan gyorsnak kell lennik, mint a korbbi vlto zat esetben, ahol a RecipeClassDescription szerinti szrt egy WHERE zradkkal adtuk meg a JOIN utn. Sejthetjk, hogy az adatbzis-kezel a lekrdezs leghatkonyabb teljes tse rdekben elszr megszri a Recipeclass tbla sorait, mieltt megkezden az sszeha sonltst a Recipes tbla soraival. Sokkal lassabb lehet elszr kapcsolni ssze a Recipe_Classes sszes sort a Recipes tbla megfelel soraival s azutn alkalmazni a szrt. Ha gy talljuk, hogy ez a lekrdezs tbb idt vesz ignybe, mint indokolt, akkor a WHERE zradkot egy a JOlN-ba gyazott SELECT utastsba trakva megprblhatjuk rvenni az adatbzis-kezelt, hogy elszr vgezze el a Recipe_Classes szerinti szrst.

JOIN begyazsa JOIN-ba


Habr sok feladat megoldhat kt tbla sszekapcsolsval, az sszes kvnt adat kinyer shez gyakran lesz szksgnk hrom, ngy vagy tbb tbla sszekapcsolsra. Pldul megprblhatjuk a receptekhez kapcsold sszes lnyeges informcit - a recept tpusa, a recept neve s a recept hozzvalinak listja - egyetlen lekrdezssel megkapni. Az ezt a feladatot megold lekrdezshez szksges tblkat a 8.7. brn lthatjuk.

gy nz ki, t klnbz tblbl lesz szksgnk adatokra! Ne aggdjunk - a feladatot meg tudjuk oldani egy bonyolultabb FROM zradkkal, amelyben a JOIN zradkokba ms JOIN-okat gyazunk. A trkk a kvetkez: mindenhol, ahol szablyosan hasznlhat egy tbla neve, ott hasznlhatunk egy zrjelek kz gyazott teljes JOIN zradkot is. (A korrelcis nevet tartalmaz zradkokat itt elhagytuk, s az ON zradkot vlasztot tuk, hogy egy egyszer, kt tbla kztti JOIN-t adjunk meg.)

Most adjuk hozz a harmadik tblt a koktlhoz, egyszeren tegynk egy nyit zrjelet az els tblanv el, egy bezrjelet a keressi felttel utn, majd rjunk a kifejezs vgre egy INNER JOIN-t, egy tblanevet, az ON kulcsszt s mg egy keressi felttelt. Az ered mny a 8.9. brn lthat.

Ha belegondolunk, a zrjelek kztti INNER JOIN, ami az els kt tblt sszekapcsolja, egy logikai tblt alkot, egy bels, tmeneti eredmnyhalmazt. Ez az eredmnyhalmaz veszi t az els pldban, a 8.8. brn szerepl egyszer tblanv helyt. Ezt az eljrst-

egy adott teljes JOIN zradk zrjelek kz helyezst s egy kvetkez JOIN kulcssz, tblanv, ON kulcssz s keressi felttel hozzadst - tovbb folytathatjuk, amg meg kapjuk azt a teljes eredmnyhalmazt, amit szerettnk volna. rjunk egy olyan lekrdezst, amelyhez a 8.7. brn lthat sszes tblbl kellenek majd adatok, s lssuk a megoldst! rd ki a receptek tpust, nevt, elksztsnek menett, a hozzvalk nevt, a hozz valk sorszmt, a hozzvalk mennyisgt s a hozzvalk mennyisgnek mrtk egysgt a receptek adatbzisbl, sorszm szerint rendezve! Fordts - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount,and measurement description from the recipe classes table joined with the recipes table on recipe class ID in the recipe classes table matching recipe class ID in the recipes table, then joined with the recipe ingredients table on recipe ID in the recipes table matching recipe ID in the recipe ingredients table, then joined with the ingredients table on ingredient ID in the ingredients table matching ingredient ID in the recipe ingredients table, and then finally joined with the measurements table on measurement amount ID in the measurements table matching measurement amount ID in the recipe ingredients table, order by recipe title and recipe sequence number (Vlaszd ki a receptosztly lerst, a recept cmt, az elkszts menett, a hozzval nevt, sorszmt, mennyisgt s mrtkegysgt a receptosz tlyok tbljbl, sszekapcsolva a receptek tbljval a receptosztlyok tbljban szerepl receptosztly-azonost s a receptek tbljban lev receptosztly-azonost szerint, majd ezt sszekapcsolva a recepthozzvalk tbljval a receptek tbljban szerepl receptazonost s a recepthozz valk tbljban lev receptazonost szerint, majd ezt sszekapcsolva a hozzvalk tbljval a hozzvalk tbljban szerepl hozzval-azono st s a recepthozzvalk tbljban lev hozzval-azonost szerint, s vgl ezt sszekapcsolva a mennyisgek tbljval a recepthozzvalk tbljban szerepl mennyisgazonost s a mennyisgek tbljban lev mennyisgazonost szerint, a recept cme s sorszma szerint rendezve.) Tisztzs - Select t h e recipe class description, recipe title, preparation i n s t r u c t i o n s , ingredient name, recipe sequence number, amount, and measurement description from the recipe classes t a b l e inner joine d w i t h t h e recipes t a b l e on recipe_classes.recipe class ID i n t h e r e c i p e c l a s s e s t a b l e m a t c h i n g = recipes.recipe class ID i n t h e r e c i p e s t a b l e , t h e n inner joined with the recipe ingredients table

on recipes.recipe ID in the recipes table matching = recipe_ ingredients.recipe ID in the recipe ingredients table, then inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table matching = ingredients.ingredient ID in the recipe ingredients table, and then finally inner joined with the measurements table on measurements.measurement amount ID i n t h e m e a s u r e m e n t s table matching = recipe ingredients.measurement amount ID in the recipe ingredients table order by recipe title and recipe sequence number SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM (((Recipe_Classes INNER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID) INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeiD) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID ORDER BY RecipeTitle, RecipeSeqNo

Ez igen! Szeretne valaki nekiltni s hozzadni egy szrt, ami csak a ftelek osztlyban lev recepteket engedi t? Ha a vlaszunk az, hogy csupn egy WHERE zradkra van szksg az ORDER BY zradk eltt, akkor fejn talltuk a szget. Valjban ahol egyszer tblanv ll, az brmikor helyettesthet egy kt tblt sszekap csol JOIN zradkkal. A 8.9. brrl az olvashat le, hogy elszr az els s a msodik tblt kapcsoljuk ssze egymssal, majd az eredmnyt a harmadik tblval. De ssze kapcsolhatjuk elbb a msodik s a harmadik tblt is (legalbbis ha a harmadik tbla a msodikkal van kapcsolatban, nem az elsvel) s azutn az eredmnyt az els tblval. A 8.10 brn ez a vltozat lthat.

Megvilgthatjuk a problmt egy festszeti hasonlattal. Ha ki szeretnnk keverni egy pasztellzld sznt, nem szmt a kevers sorrendje. Ha elbb a fehr festket a kkkel ke verjk ssze, majd az gy kapott pasztellkkbe srgt kevernk, a vgeredmny ugyanaz a szn lesz, mint ha elbb a kk s a srga festket keverjk ssze, majd a kapott zldhz kevernk fehret. Az imnt mutatott, t tblt hasznl lekrdezst megvalsthattuk volna a kvetkez SQL-kddal is: SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM Recipe_Classes INNER JOIN (((Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID) ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID ORDER BY RecipeTitle, RecipeSeqNo

J, ha tisztban vagyunk ezzel a lehetsggel is, mivel brmikor tallkozhatunk ilyen megvalstssal msok ltal rt lekrdezsekben vagy a Query By Example programmal lt rehozott SQL kdban. Ezenkvl nmelyik adatbzis-kezel bels optimalizlja rzkeny a JOIN zradkok sorrendjre. Ha egy sok JOIN-t hasznl lekrdezs vgrehajtst tl lassnak talljuk egy nagy adatbzison, lehet, hogy gyorsthatunk rajta a JOIN-ok sorrend jnek megvltoztatsval az SQL-utastsban. Az egyszersg kedvrt a fejezet sorn hasznlt lekrdezsekben ltalban sorban, balrl jobbra s fentrl lefel haladva kvetik egymst a JOIN-ok, a B fggelkben tallhat diagramoknak megfelelen.

Ellenrizzk a kapcsolatokat!
Idig eljutva lthat, hogy a tblink kztti kapcsolatok alapvet fontossgak. Ha azt ltjuk, hogy a szmunkra szksges adatok klnbz tblkban helyezkednek el, akkor elfordulhat, hogy az elz pldhoz hasonl bonyolultsg FROM zradkot kell ltre hoznunk ahhoz, hogy az sszes informcimorzst rtelmes mdon ki tudjuk gyjteni. Ha nem vagyunk tisztban a tblink kztti kapcsolatokkal s az sszekt oszlopokkal, amelyeken keresztl megvalsulnak ezek a kapcsolatok, akkor knnyen csapdba kerl hetnk. Sokszor szmos kapcsolatot kell vgigkvetnnk, hogy megkapjuk a kvnt adatokat. Egyszerstsk pldul az elz lekrdezst, s krjk csak a receptneveket s a hozzva lk neveit: Add meg az sszes receptem nevt s az ezekhez a receptekhez tartoz sszes hozzval nevt! Fordts - Select the recipe title and the ingredient name from the recipes table joined with the recipe ingredients table on recipe ID in the recipes table matching recipe ID in the recipe ingredients table, and then joined with the ingredients table on ingredient ID in the ingredients table matching ingredient ID in the recipe ingredients table (Vlaszd ki a recept cmt s a hozzval nevt a receptek tbljbl, sszekapcsolva a recepthozzvalk tbljval a recepthozzvalk tblj ban lev receptazonost s a receptek tbljban tallhat receptazonost szerint, majd ezt egyestve a hozzvalk tbljval a hozzvalk tbljban szerepl hozzval-azonost s a recepthozzvalk tbljban lev hozz val-azonost szerint.) Tisztzs - Select the recipe title and the ingredient name from the recipes table inner joined with the recipe ingredients table on recipes.recipe ID in the recipes table matching = recipe_ingredients.recipe ID in the recipe ingredients table,

and then inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table matching = recipe_ingredients.ingredient ID in the recipe ingredient
table

SQL

SELECT Recipes.RecipeTitle, Ingredients.IngredientName FROM (Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID

Feltnt, hogy br a Recipe_Ingredients (Recepthozzvalk) tblbl egyetlen oszlopra sem volt szksgnk, a lekrdezsben mgis hasznlnunk kellett? Ennek az az oka, hogy a Recipes s az Ingredients tblk csak a Recipe_Ingredients tbln keresztl vannak kapcsolatban.

Az INNER JOIN alkalmazsi lehetsgei


Most, hogy mr ismerjk az INNER JOIN hasznlatnak alapjait, nzznk meg nhny feladatfajtt, amelyek megoldhatk a segtsgvel!

Kapcsold sorok keresse


Amint azt tudjuk, az INNER JOIN alkalmazsa leggyakrabban tblk sszekapcsolsa abbl a clbl, hogy klnbz, egymssal kapcsolatban ll tblkbl krhessnk le adatokat. lljon itt egy felsorols, amely olyan lekrdezsekre mutat pldkat a mintaadatbzisokbl, amelyek megoldhatk az INNER JOIN-nal: Add meg a beszlltk listjt s a termkeket, amelyeket szlltanak neknk!" rd ki az alkalmazottakat s a vsrlkat, akiktl rendelst vettek fel!" Mutasd meg az gynkket s az ltaluk lekttt rendezvnyeket!" Sorold fel a megrendelket s az ltaluk lekttt eladkat!" Keresd meg azokat az eladkat, akik fellptek Berg vagy Hallmark nev megrendelnk rendezvnyein!" Sorold fel az pleteket s minden plet sszes osztlytermt!" rd ki a tanszk dolgozit s az egyes tanrok rit! Mutasd meg az sszes tekecsapatot s mindegyik csapat kapitnynak a nevt!" Adj listt az sszes tekecsapatrl s a csapatok sszes tagjrl! Mutasd meg azokat a recepteket, amelyek marhahst vagy fokhagymt tartalmaznak!" Sorold fel az sszes hozzvalt azokhoz a receptekhez, amelyek tartalmaznak rpt!"

A fejezet Pldk cm rszben megmutatjuk, hogyan rhatk meg az ilyen s ehhez hasonl feladatokat megold lekrdezsek.

Egyez rtkek keresse


Az INNER JOIN egzotikusabb hasznlata olyan sorok megkeresse kett vagy tbb ered mnyhalmazban, amelyeknek egy vagy tbb olyan rtke egyezik meg, amelyek nem kap csold kulcsrtkek. Ha emlksznk mg, a 7. fejezetben azt olvashattuk, hogy ltezik egy az INTERSECT-tel egyenrtk megolds, ami az INNER JOIN-t hasznlja. Kvetkezzen nmi zelt olyan tpus feladatokbl, amelyek megoldhatk ezzel a mdszerrel: "Sorold fel az ugyanolyan nev vsrlkat s alkalmazottakat! rd ki azokat a vsrlkat s alkalmazottakat, akik ugyanabban a vrosban laknak!" Keresd meg az sszes vsrlt, aki biciklit s buksisakot is rendelt!" Keresd meg az sszes gynkt s eladt, akiknek ugyanaz az irnytszma!" Sorold fel azokat az eladkat, akik fellptek Bonnicksen s Rosales megrendelnk rendezvnyein! "Adj listt az ugyanolyan keresztnev nev hallgatkrl s tanrokrl!" "Adj listt azokrl a hallgatkrl, akiknek rajzbl legalbb 85% az rtkelse, s emel lett szmtstechnikbl is legalbb 85%o-t rtek el!" Keresd meg azokat a tekejtkosokat, akiknek ugyanaz az irnytszmuk!" "Keresd meg azokat a tekejtkosokat, akiknek a tiszta pontszma legalbb 155, mind a Thunderbird Lanes, mind a Bolero Lanes plyn!" Keresd meg azokat a hozzvalkat, amelyekbl ugyanakkora mennyisgre van szksg!" "Mutasd meg azokat a recepteket, amelyek marhahst s fokhagymt is tartalmaznak!" A kvetkez rszben megmutatjuk, hogyan oldhatk meg az ehhez hasonl feladatok.

Pldk
Mr tudjuk, hogyan lehet INNER JOIN-ok segtsgvel lekrdezseket rni, s lttunk pr pldt olyan feladatokra, amelyek egy INNER JOIN-nal oldhatk meg. Most vessnk egy pillantst egy meglehetsen tfog pldahalmazra, amelynek pldi mind INNER JOIN-t hasznlnak. A pldk kztt szerepel az sszes mintaadatbzis, s a segtsgkkel megta nulhatjuk, hogyan hasznlhat az INNER JOIN adatok kinyersre kt tblbl, kettnl tbb tblbl, illetve hogyan oldhatunk meg feladatokat rtkek egyezse alapjn. Ezenkvl ksztettnk az eredmnyhalmazokbl is mintkat; ezek kzvetlenl az SQLutastsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ugyanaz, mint a CD-mellkleten tallhat megfelel SQL-lekrdezs neve. Minden lekrdezst a megfe lel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz lekrdezsek neve ,,CH08-cal kezddik. A pldkat a knyv elejn tallhat bevezets tmutatst kvetve tlthetjk be s prblhatjuk ki.

Mivel a pldk nagy rsze sszetett JOIN-okat hasznl, elfordulhat, hogy az adatbzis-kezelnk kicsit mshogy dolgozza fel ezeket a le krdezseket. Ezrt lehet, hogy az eredmnyhalmazbl ltalunk itt felsorolt els nhny sor nem pontosan egyezik meg azzal a vlasszal, amit az otthoni futtats sorn kapunk, de az sszes sor szma a vlaszban ugyanannyi kell, hogy legyen: Az egyszersg kedv rt a tovbbiakban a Fordts s Tisztzs rszeket sszevonjuk.

Kt tbla
Induljunk ki az alapsznekbl! Elszr olyan lekrdezspldkat mutatunk, amelyek csupn kt tbla kztti INNER JOIN-t ignyelnek.

Sales Orders adatbzis


,,Jelentsd meg az sszes termket a termkcsoportjukkal egytt!" Fordts/ - Select category description and product name Tisztzs from the categories table inner joined with the products table on categories.category ID in the categories table matching = products.category ID in the products table (Vlaszd ki a termkcsoportot s a termknevet a termkcsoportok tblj val sszekapcsolt termktblbl, ahol az sszekapcsols a termkcsoportok tbljban szerepl termkcsoport-azonost s a termkek tbljban lev termkcsoport -azonost szerint trtnik.) SQL SELECT Categories.CategoryDescription,

Products.ProductName FROM Categories INNER JOIN Products ON Categories.CategoryID - Products.CategoryID


CH08_Products_And_Categories (40 sor)

CategoryDescription ProductName Accessories Accessories Accessories Accessories Accessories Accessories Accessories Accessories Accessories Dog Ear Cyclecomputer Dog Ear Helmet Mount Mirrors Viscount C-500 Wireless Bike Computer Kryptonite Advanced 2000 U-Lock Nikoma Lok-Tight U-Lock Viscount Microshell Helmet Viscount CardioSport Sport Watch Viscount Tru-Beat Heart Transmitter Dog Ear Monster Grip Gloves
< < tovbbi sorok > >

Entertainment Agency adatbzis


Sorold fel az eladkat, a szerzdsk kezdeti s befejez dtumt s a szerzds sszegt! Fordts/ - Select entertainer stage name, start date, end date, Tisztzs and contract price from the entertainers table inner joined with the engagements table on entertainers.entertainer ID in the entertainers table matching = engagements.entertainer ID in the engagements table (Vlaszd ki az elad mvsznevt, a kezd dtumot, a befejez dtumot s a szerzds sszegt az eladk tbljval INNER JOIN-nal sszekapcsolt rendezvnytblbl, ahol az sszekapcsols az eladk tbljnak eladazonostja s a rendezvnyek tbljnak eladazonostja szerint trtnik.) SQL SELECT Entertainers.EntStageName,

Engagements.StartDate, Engagements.EndDate, Engagements.ContractPrice FROM Entertainers INNER JOIN Engagements ON Entertainers.EntertainerID Engagements.EntertainerID

School Scheduling adatbzis


rd ki azokat a tantrgyakat, amelyekbl van oktats szerdn!" Fordts/ - Select subject name Tisztzs from the subjects table inner joined with the classes table

on subjects.subject ID in the subjects table matching = classes.subject ID in the classes table where Wednesday schedule is = true (Vlaszd ki azokat a tantrgyneveket a tantrgyak tbljval INNER JOIN-nal sszekapcsolt ratblbl ahol az sszekapcsols a tantrgyak tbljban lev trgyazonost s az rk tbljban szerepl trgyazonost szerint trtntahol a szerdai beoszts rtke igaz.) SQL

SELECT DISTINCT Subjects.SubjectName FROM Subjects INNER JOIN Classes ON Subjects.SubjectID = Classes.SubjectID WHERE Classes.WednesdaySchedule = -1

Mivel ugyanolyan rbl tbb is lehet egy nap, a DISTlNCT kulcsszt hasznltuk, ami kiszri az ismtld sorokat. Egyes adatbzis-kezel rendszerek tmogatjk a TRUE kulcsszt, de mi egy ltalnosabb, minden bitjn egy r tk egsz rtket (-1) hasznltunk. Ha az adatbzis-kezel rendszernk az igaz-hamis rtkeket egy biten trolja, akkor az igaz rtk ellenrzshez 1-gyel is vgezhetjk az sszehasonltst. A hamis rtket mindig a O jelenti.

Bowling League adatbzis


Sorold fel a csapatokat s az egyes csapatok kapitnynak nevt! Fordts/ - Select team name and captain full name Tisztzs from the teams table inner joined with the bowlers table on team captain ID equals = bowler ID

(Vlaszd ki a csapatnevet s a csapatkapitny teljes nevt a csapatok tbl jbl, amelyet INNER JOIN-nal sszekapcsoltunk a jtkosok tbljval, a csapatkapitny-azonost s a jtkosazonost szerint.) SQL

SELECT Teams.TeamName, (Bowlers.BowlerLastName ||', '|| Bowlers.BowlerFirstName) AS CaptainName FROM Teams INNER JOIN Bowlers ON Teams.CaptainID = Bowlers.BowlerID

Recipes adatbzis
Mutasd meg azokat a recepteket, amelyek marhahst s fokhagymt is tartalmaznak!" Fordts/ - Select unique distinct recipe title Tisztzs from the recipes table joined with the recipe ingredients table on recipes.recipe ID in the recipes table matching = recipe_ingredients.recipe ID in the recipe ingredients table where ingredient ID is in the the list of beef and garlie IDs (1, 9) (Vlaszd ki azokat az egyedi receptcmeket a receptek tbljbl, amelyet sszekapcsoltunk a recepthozzvalk tbljval a recepttblabeli receptazo nost s a recepthozzvalk tbljban lev receptazonost szerint, ahol a hozzval azonostja a marhahs s a fokhagyma alkotta listbl kerl ki.) SQL SELECT DISTINCT Recipes.RecipeTitle

FROM Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID WHERE Recipe_Ingredients.IngredientID IN (1, 9)

Mivel nmelyik recept tartalmazhat mind marhahst, mind fok hagymt, a DISTINCT kulcsszt alkalmaztuk, ami kiszri az ismt ld sorokat.

Kettnl tbb tbla


Most tegyk a dolgokat kicsit izgalmasabb olyan kvnsgokkal, amelyek kettnl tbb tbla sszekapcsolsval teljesthetk!

Sales Orders adatbzis


Keresd meg az sszes vsrlt, aki valaha is rendelt buksisakot! Fordts/ - Select customer first name, customer last name Tisztzs from the customers table inner joined with the orders table on customers.customer ID in the costumers table matching = orders.customer ID in the orders table, then inner joined with the order details table on orders.order number in the orders table matching = order_details.order number in the order details table, then inner joined with the products table on products.product number in the products table matching = order_details.product number in the order details table where product name contains LIKE '%Helmet%' (Vlaszd ki azoknak a vsrlknak a keresztnevt s vezetknevt a vsr lk tbljbl, amelyet INNER JOIN-nak sszekapcsoltunk a megrendel sek tbljval a vsrlk tbljban lev vsrlazonost s a megrendel sek tbljban tallhat vsrlazonost szerint, majd ezt sszekapcsoltuk egy INNER JOIN-nal a megrendelsek rszleteit tartalmaz tblval a meg rendelsek tbljnak megrendelsi szma s a megrendels rszleteit tar talmaz tbla megrendelsi szma szerint, majd ezt sszekapcsoltuk egy INNER JOIN-nal a termkek tbljval a termkek tbljnak termkszma s a megrendels rszleteit tartalmaz tbla termkszma szerint, ahol a termknv tartalmazza a Helmet karakterlncot.)

SQL

SELECT DISTINCT Customers.CustFirstName, Customers.CustLastName FROM ((Customers INNER JOIN Orders ON Customers.CustomerID - Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%Helmet%'

Ha az adatbzis-kezel rendszernk megklnbzteti a kis- s nagybe tket a karakter tpus mezkben, akkor erre oda kell figyelnnk, ami kor megadjuk a keressi felttelt. Pldul sok adatbzis-kezelben a helmet (buksisak) s a Helmet' klnbznek szmt. Lehet, hogy nmelyik vsrl tbb alkalommal is rendelt buksisakot, ezrt a DISTINCT kulcsszt alkalmaztuk, ami kiszri az ismtld sorokat.

Entertainment Agency adatbzis


Talld meg az sszes eladt, aki Berg vagy Hallmark nev megrendelink rendezvnyein jtszott! Fordts/ - Select unique distinct entertainer stage name Tisztzs from the entertainers table

with the engagements table ID in the entertainers table matching = engagements.entertainer ID in the engagements table, then inner joined with the customers table on customers.customer ID in the costumers table matching = engagements.customer ID in the engagement table where the customer last name is = 'Berg' or the customer last name is = 'Hallmark' (Vlaszd ki azokat egyedi mvszneveket az eladk tbljval INNER JOIN-nal sszekapcsolt rendezvnyek tbljbl - ahol az sszekapcsols az eladk tbljban lev eladazonost s a rendezvnyek tbljban tallhat eladazonost szerint trtnt, majd ezt sszekapcsoltuk a meg rendelk tbljval a megrendelk tbljban lev megrendelazonost s a rendezvnyek tbljban tallhat megrendelazonost szerint -, amelyeknl a megrendel vezetkneve = Berg vagy Hallmark.)
on entertainers.entertainer

inner joined

SQL

SELECT DISTINCT Entertainers.EntStageName FROM (Entertainers INNER JOIN Engagements ON Entertainers.EntertainerID Engagements.EntertainerID) INNER JOIN Customers ON Customers.CustomerID = Engagements.CustomerID WHERE Customers.CustLastName = 'Berg' OR Customers.CustLastName = 'Hallmark'

Bowling League adatbzis


Sorold fel az sszes tornt, a tornk egyes mrkzseit s a jtkok vgeredmnyt! Fordts/ - Select tourney ID, tourney location, match ID, lanes, odd lane Tisztzs team, even lane team, game number, game winner from the tournaments table inner joined with the tourney matches table on tournaments.tourney ID in the tournaments table matching = tourney_matches.tourney ID in the tourney matches table, then inner joined with the teams table aliased as odd team on oddteam.team ID in the even team table matches = teams.odd lane team ID in the teams table, then inner joined with the teams table aliased as even team on eventeam.team ID in the even team table matches = tourney_matches.even lane team ID in the tourney matches table, then inner joined with the match games table on match_games.matchID in the match games table matches = tourney_matches.match ID in the tourney matches table, then inner joined with the teams table aliased as winner on w i n n e r . t e a m I D in the winner table matches = match_games.winning team ID in the match games table (Vlaszd ki a torna azonostjt, a torna helysznt, a mrkzs azonostjt, a plykat, a pros plyn lev csapatokat, a pratlan plyn lev csapato kat, a jtk sorszmt, s a jtk nyertest a torna tbljbl, amelyet INNER JOIN-nal sszekapcsoltunk a mrkzsek tbljval a torna tbljban lev tornaazonost s a mrkzsek tbljban tallhat tornaazonost szerint, majd ezt INNER JOIN-nal sszekapcsoltuk a csapatok tbljval odd team (pratlan csapat) lnven a pratlan csapatok mrkzseit tartalmaz tbla csapatazonostja s csapatok tbljban lev pratlancsapat-azonost sze rint, majd ezt INNER JOIN-nal sszekapcsoltuk a csapatok tbljval even te am (pros csapat) lnven a pros csapatok mrkzseit tartalmaz tbla csapatazonostja s a torna mrkzseit tartalmaz tbla proscsapat-azonostja szerint, majd ezt INNER JOIN-nal sszekapcsoltuk a jtkok tbljval a jtkok tbljnak mrkzsazonostja s a mrkzsek tbljnak mrk zsazonostja szerint, majd ezt INNER JOIN-nal sszekapcsoltuk a csapatok tbljval winner (nyertes) lnven a tbla csapatazonostja s a jtkok tbljnak nyertescsapat-azonostja szerint.) SQL

SELECT Tournaments.TourneyID AS Tourney, Tournaments.TourneyLocation AS Location, Tourney_Matches.MatchiD, Tourney_Matches.Lanes, OddTeam.TeamName AS OddLaneTeam, EvenTeam.TeamName AS EvenLaneTeam,

Match_Games.GameNumber AS GameNo, Winner.TeamName AS Winner FROM Tournaments INNER JOIN Tourney_Matches ON Tournaments.TourneyID = Tourney_Matches.TourneyID INNER JOIN Teams AS OddTeam ON OddTeam.TeamID = Tourney_Matches.OddLaneTeamID INNER JOIN Teams AS EvenTeam ON EvenTeam.TeamID = Tourney_Matches.EvenLaneTeamID INNER JOIN Match_Games ON Match_Games.MatchID = Tourney_Matches.MatchID INNER JOIN Teams AS Winner ON Winner.TeamID = Match_Games.WinningTeamID
Ez egy igazn izgalmas lekrdezs, mivel egyetlen tbla (Teams) h rom pldnyra van szksg a megoldshoz. A tblk kzl legalbb kettnek korrelcis nevet kellett adnunk, hogy szablyos legyen a lekrdezs, de inkbb mind a hromnak adtunk lnevet, ami tkrzi a lekrdezsben betlttt szerepket. Ezenkvl az SQL rsz megrsakor nem kvettk pontosan a Fordts/Tisztzs rszt. gy szemlletesen ltszik, hogy az egymsba gyazott JOIN-okat gy hatrozhatjuk meg, ahogyan jlesik, mindaddig, amg nem keverjk ssze a kapcsoldsokat.

Habr gy tnik, hogy a sorok tornk s mrkzsek szerint rendezet tek, ez csupn az a sorrend, amelyben az ltalunk hasznlt adatb zis-kezel (jelen esetben a Microsoft Office Access) visszaadta az eredmny sorait. Ha biztosak akarunk lenni benne, hogy a kapott sorok bizonyos szempont szerint rende zettek, a lekrdezst ki kell egsztennk egy ORDER BY zradkkal.

Recipes adatbzis
Mutasd meg a ftelek receptjeit s a hozzvalik listjt!
Fordts/ - Select recipe title, ingredient name, Tisztzs measurement description, and amount from the recipe classes table inner joined with the recipes table on recipes.recipe class ID in the recipes table matches = recipe_classes.recipe class ID in the recipe classes table, then inner joined with the recipe ingredients table on recipes.recipe ID in the recipes table matches = recipe_ingredients.recipe ID in the recipe ingredients table, then inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table, and finally inner joined with the measurements table on measurements.measure amount ID in the measurements table matches = recipe_ingredients.measure amount ID in the recipe ingredients table, where recipe class description is = 'Main course' (Vlaszd ki a recept cmt, a hozzval nevt, a mennyisg lerst s mrtkegysgt a receptosztlyok tbljval INNER JOIN-nal sszekapcsolt recepttblbl, ahol az sszekapcsols a receptosztlyok tbljban lev receptosztly-azonost s a receptek tbljnak receptosztly-azonostja szerint trtnt, majd ezt INNER JOIN-nal sszekapcsoltuk a recepthozzvalk tbljval a recepthozzvalk tbljnak receptazonostja s a receptek tb ljban lev receptazonost szerint, majd ezt INNER JOIN-nal sszekapcsol tuk a hozzvalk tbljval a hozzvalk tbljnak hozzval-azonostja s a recepthozzvalk tbljban lev hozzval-azonost szerint, majd ezt INNER JOIN-nal sszekapcsoltuk a mennyisgek tbljval a mennyisgtbla mennyisgazonostja s a recepthozzvalk tbljnak mennyisgazonos tja szerint, ha a receptosztly lersa Main course, vagyis ftel.) SQL

SELECT Recipes.RecipeTitle, Ingredients.IngredientName, Measurements.MeasurementDescription, Recipe_Ingredients.Amount FROM (((Recipe_Classes

INNER JOIN Recipes ON Recipes.RecipeClassID Recipe_Classes.RecipeClassID) INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeiD) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientiD) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountiD WHERE Recipe_Classes.RecipeClassDescription = 'Main course'
A MeasureAmountID (mennyisgazonost) mind az Ingredients (Hozzvalk) tblban, mind a Recipe_Ingredients (Recepthozzvalk) tblban szerepel. Ha az utols JOIN-t gy hatrozzuk meg, hogy a Recipe_Ingredients tbla helyett az Ingredients tbla MeasureAmountID-jt hasznlja, akkor az adott hozz val alaprtelmezett mennyisgt fogjuk visszakapni, ahelyett, ami a receptben szerepel.

Egyez rtkek keresse


Vgl bvtsk a lehetsgeket mg egy dimenzival: az utols pldahalmazban olyan lekrdezseket tallunk, amelyek kt vagy tbb eredmnyhalmaz vagy tbla azonos rt keire alkalmaznak JOIN-t. (Ha az adatbzis-kezel rendszernk tmogatja az INTERSECT kulcsszt, akkor az albbi problmk kzl sokat megoldhatunk az eredmnyhalmazok metszetvel is.)

Sales Orders adatbzis


Keresd meg az sszes vsrlt, aki kerkprt s buksisakot is rendelt!"
Ez egy elg egyszer feladatnak tnik - taln tlsgosan is egyszernek. Tegyk fel a krdst most ms mdon, gy, hogy vilgosabb legyen, mit is vrunk el az adatb zis-kezeltl:

Talld meg az sszes vsrlt, aki rendelt kerkprt, majd keresd meg az sszes vsrlt, aki rendelt buksisakot, s vgl rd ki a kt listbl a kzs vsrlkat, hogy megkapjuk, kik rendeltek kerkprt s buksisakot is!"
1. fordts - Select customer first name and customer last name from those common to the set of customers who ordered bicycles and the set of customers who ordered helmets (Vlaszd ki azoknak a vsrlknak a keresztnevt s a vezetknevt, akik szerepelnek mind a kerkprt rendelt vsrlk kztt, mind a buksisakot rendelt vsrlk kztt.) 2. fordts/ - Select customer first name and customer last name from tisztzs (Select unique distinct customer name, customer first name, customer last name from the customers table inner joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table. then inner joined with the order details table on orders.order number in the orders table matches = order_ details.order number in the order details table then inner joined with the products table on products.product number in the products table matches = order_details.product number in the order details table where product name contains LIKE %Bike') as cust bikes inner joined with (Select unique distinct customer ID from the customers table inner joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table, then inner joined with the order details table on orders.order number in the orders table matches = order_ details.order number in the order details table, then joined with the products table on products.product number in the products table matches = order_details.product number in the order details table where product name contains LIKE '%Helmet') as cust helmets on cust bikes.customer ID in the cust bikes table matches = cust helmets.customer ID in the cust helmets table

SQL

SELECT CustBikes.CustFirstName, CustBikes.CustLastName FROM (SELECT DISTINCT Customers.CustomerID, Customers.CustFirstName, Customers.CustLastName FROM ((Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%Bike') AS CustBikes INNER JOIN (SELECT DISTINCT Customers.CustomerID FROM ((Customers INNER JOIN Orders ON Customers.CustomerID -- Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%Helmet') AS CustHelmets ON CustBikes.CustomerID = CustHelmets.CustomerID

A msodik begyazott SELECT utastst egyszerstettk, hogy csak a vsrlazonostt adja vissza, mert a kt halmaz INNER JOIN-nal trtn sszekapcsolshoz csak erre az oszlopra van szksg. Valjban a Customers tblval val sszekapcsolst el is hagyhattuk volna, s a vsrlazonostt kiolvashattuk volna az Orders tblbl. Emlkezznk vissza, hogy a FROM zradkokba begyazott SELECT utastsokra logikai tblkknt gondolhatunk, s minden utastshoz egyedi nevet rendelhetnk, hogy megrjuk a vgs ON zradkot.

A fenti problmt a kt halmaz metszetvel is megoldhatjuk, de az INTERSECT hasznla ta esetn a kimenet sszes oszlopt bele kell foglalnunk mindkt eredmnyhalmazba, amelybl metszetet kpznk. szintn szlva ez nem biztos, hogy a legjobb mdja a problma megoldsnak. A 11. fejezetben bemutatjuk, hogyan rhetnk clt hatko nyabban allekrdezsek segtsgvel.

Entertainment Agency adatbzis Sorold fel azokat az eladkat, akik a Berg s a Hallmark nev megrendelknek is jtszottak! Amint korbban lttuk, a Berg vagy Hallmark megoldsa knny. Fogalmazzuk meg mshogy a feladatot, hogy egyrtelmbb legyen, mit vrunk el az adatbzis-kezeltl: Talld meg az sszes eladt, aki jtszott Berg egy rendezvnyn, majd keresd meg az sszes eladt, aki jtszott Hallmark egy rendezvnyn, s vgl mutasd meg a k zs eladkat, hogy megkapjuk, kik jtszottak mindkt megrendel rendezvnyn!" 1. fordts - Select entertainer stage name from those common to the set of entertainers who played for Berg and the set of entertainers who played for Hallmark (Vlaszd ki azoknak az eladknak a mvsznevt, akik szerepelnek mind a Berg rendezvnyn fellpett eladk kztt, mind a Hallmark rendezv nyn fellpett eladk kztt.) 2. fordts/ - Select entertainer stage name Tisztzs from (Select unique distinct entertainer stage name from the entertainers table inner joined with the engagements table

on entertainers.entertainer ID in the entertainer table matches = engagements.entertainer ID in the engagements table. then inner joined with the customers table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table where customer last name is = 'Berg') as entberg inner joined with (Select unique distinct entertainer stage names from the entertainers table inner joined with the engagements table on entertainers.entertainer ID in the entertainers table matches = engagements.entertainer ID in the engagement table. then joined with the customers table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table where customer last name is = 'Hallmark') as enthallmark on entberg.entertainer ID in the entberg table matches = enthallmark.entertainer ID in the enthallmark table SQL

SELECT EntBerg.EntStageName FROM (SELECT DISTINCT Entertainers.EntertainerID, Entertainers.EntStageName FROM (Entertainers INNER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID) INNER JOIN Customers ON Customers.CustomerID = Engagements.CustomerID WHERE Customers.CustLastName 'Berg') AS EntBerg INNER JOIN (SELECT DISTINCT Entertainers.EntertainerID, Entertainers.EntStageName FROM (Entertainers INNER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID) INNER JOIN Customers ON Customers.CustomerID = Engagements.CustomerID WHERE Customers.CustLastName 'Hallmark')

AS EntHallmark ON EntBerg.EntertainerID = EntHallmark.EntertainerID

Ez egy jabb plda egy olyan feladatra, amit az INTERSECT haszn latval is megoldhatunk. Allekrdezsekkel mg hatkonyabban clt rhetnk; ezekrl a 11. fejezetben olvashatunk.

School Scheduling adatbzis


Mutasd meg azokat a hallgatkat s tanrokat, akiknek ugyanaz a keresztnevk! Fordts/ - Select student full name and staff full name Tisztzs from the students table inner joined with the staff table on students.first name in the students table matches = staff.first name in the staff table (Vlaszd ki azoknak a hallgatknak s tanroknak a teljes nevt a hallgatk s a tanrok tbljbl, amelyeket a kt tbla keresztnv mezi szerint sszekapcsoltunk egy INNER JOIN-nal, akiknl a keresztnv megegyezik.) SQL SELECT (Students.StudFirstName || ' ' ||

Students.StudLastName) AS StudFullName, (Staff.StfFirstName || ' ' || Staff.StfLastName) AS StfFullName FROM Students INNER JOIN Staff ON Students.StudFirstName = Staff.StfFirstName

Bowling League adatbzis


Keresd meg azokat a jtkosokat, akiknek a tiszta pontszmuk legalbb 170 mind a Thunderbird Lanes, mind a Bolero Lanes plykon! Valban, ez egy jabb csinljunk metszetet JOIN-nal feladat. Tegyk fel a krdst mskpp, hogy egyrtelmbb legyen, mit vrunk el az adatbzis-kezeltl: ,, Keresd meg az sszes jtkost, akinek a tiszta pontszma legalbb 170 a Thunder bird Lanes plyn, majd keresd meg az sszes jtkost, akinek a tiszta pontszma leg albb 170 a Bolero Lanes plyn, s vgl rd ki a kzs jtkosokat, hogy megkap juk, kinek volt j eredmnye mindkt tekeplyn! 1. fordts - Select bowler full name from those common to the set of bowlers who have a score of 170 or better at Thunderbird Lanes and the set of bowlers who have a score of 170 or better at Bolero Lanes (Vlaszd ki a jtkos teljes nevt azok kzl, akik szerepelnek mind a Thunderbird Lane plyn legalbb 170 pontot elrtek kztt, mind a Bolero Lane plyn legalbb 170 pontot elrtek kztt.) 2. fordts/ - Select bowler full name Tisztzs from (Select unique distinct bowler ID and bowler full name from the bowlers table inner joined with the bowler scores table on bowlers.bowler ID in the bowlers table matches = bowler_scores.bowler ID in the bowler scores table, then inner joined with the tourney matches table on tourney_matches.match ID in the tourney matches table matches = bowler_scores.match ID in the bowler scores table, and finally inner joined with the tournaments table on tournaments.tourney ID in the tournaments table matches = tourney_matches.tourney ID in the tourney matches table where tourney location is = 'Thunderbird Lanes' and raw score is greater than of equal to >= 170) as bowlertbird inner joined with (Select unique distinct bowler ID and bowler full name from the bowlers table inner joined with the bowler scores table on bowlers.bowler ID in the bowlers table matches = bower_scores.bowler ID in the bowler scores table, then inner joined with the tourney matches table on tourney_matches.match ID in the tourney matches table matches = bowler_scores.match ID in the bowler scores table,

and finally inner joined with the tournaments table on tournaments.tourney ID in the tournaments table matches = tourney_matches.tourney ID in the tourney matches table where tourney location is = 'Bolero Lanes' and raw score is greater than or equal to >= 170) as bowlerbolero on bowlertbird.bowler ID in the bowlertbird table matches = bowlerbolero.bowler ID in the bowlerbolero table
SQL

SELECT BowlerTbird.BowlerFullName FROM (SELECT DISTINCT Bowlers.BowlerID, (Bowlers.BowlerLastName || ', ' || Bowlers.BowlerFirstName) AS BowlerFullName FROM ((Bowlers INNER JOIN Bowler_Scores ON Bowlers.BowlerID = Bowler_Scores.BoWlerID) INNER JOIN Tourney_Matches ON Tourney_Matches.MatchID = Bowler_Scores.MatchID) INNER JOIN Tournaments ON Tournaments.TourneyID = Tourney_Matches.TourneyID WHERE Tournaments.TourneyLocation 'Thunderbird Lanes' AND Bowler_Scores.RawScore >= 170) AS BowlerTbird INNER JOIN (SELECT DISTINCT Bowlers.BowlerID, (Bowlers.BowlerLastName || ', ' || Bowlers.BowlerFirstName) AS BowlerFullName FROM ((Bowlers INNER JOIN Bowler_Scores ON Bowlers.BowlerID = Bowler_Scores.BowlerID) INNER JOIN Tourney_Matches ON Tourney_Matches.MatchID = Bowler_Scores MatchiD) INNER JOIN Tournaments ON Tournaments.TourneyID = Tourney_Matches.TourneyID WHERE Tournaments.TourneyLocation = 'Bolero Lanes' AND Bowler_Scores.RawScore >= 170) AS BowlerBolero ON BowlerTbird.BowlerID = BowlerBolero.BowlerID

Mivel egy tekejtkosnak brmelyik plyn lehetett egynl tbbszr is nagy pontszma, a DISTINCT kulcsszt hasznltuk, amely kiszri az ismtld sorokat. Ez is egy olyan feladat, amit knnyebb allekrdezsekkel megolda ni, amelyekrl a 11. fejezetben olvashatunk.

Recipes adatbzis
Mutasd meg az sszes hozzvalt azokhoz a receptekhez, amelyek tartalmaznak rpt! Fordts/ - Select recipe ID, recipe title, and ingredient name Tisztzs from the recipes table inner joined with the recipe ingredients table on recipes.recipe ID in the recipes table matches = recipe_ingredients.recipe ID in the recipe ingredients table, inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table, then finally inner joined with (Select recipe ID from the ingredients table inner joined with the recipe ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table where ingredient name is = 'Carrot') as carrots on recipes.recipe ID in the recipes table matches = carrots.recipe ID in the carrots table
SQL

SELECT Recipes.RecipeID, Recipes.RecipeTitle,

Ingredients.IngredientName FROM ((Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipelD = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID) INNER JOIN (SELECT Recipe_Ingredients.RecipeID FROM Ingredients INNER JOIN Recipe_Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID WHERE Ingredients.IngredientName = 'Carrot') AS Carrots ON Recipes.RecipeID = Carrots.RecipeID

Ez a krelem egyszerbben is megfogalmazhat egy allekrdezssel. Ennek a menett a 11. fejezetben lthatjuk majd.

sszefoglals
A fejezet sorn alaposan kitrgyaltuk, hogy milyen mdon lehet kt vagy tbb tblt vagy eredmnyhalmazt sszekapcsolni egyez mezkn keresztl. A JOIN fogalmnak meghat rozsval kezdtk, majd feltrtuk az INNER JOIN-ok ksztsnek rszleteit. Megmutattuk, mik a JOIN-nl alkalmazhat megengedett felttelek, s felhvtuk a figyelmet az rtelmet len JOIN-ok veszlyre. Egy egyszer pldval, kt tbla sszekapcsolsval kezdtnk. Ez utn megmutattuk, hogyan lehet a FROM zradkban a tblkhoz korrelcis (l-) nevet rendelni. Az lnevek hasznlatnak lehetnek knyelmi okai, de vannak olyan esetek is, amikor az alkalmazsuk elkerlhetetlen pldul amikor ugyanaz a tbla egyszerre tbb helyen szerepel, vagy ha begyazott SELECT-et hasznlunk. Megmutattuk, hogyan helyettesthet egy tblahivatkozs a FROM zradkban egy megfe lel begyazott SELECT utastssal. Ez utn j lehetsgeket feltrva megmutattuk, hogyan lehet kettnl tbb tblt vagy eredmnyhalmazt sszekapcsolni. Az INNER JOIN utasts formja trgyalsnak befejezseknt az tgondolt adatbzisszerkezet fontossgt hangs lyoztuk, illetve azt, hogy tisztban kell lennnk a tblink kztti kapcsolatokkal. Felsoroltuk az okait egy sor pldval szemlltetve -, hogy mirt hasznos az INNER JOIN. A fejezet tovbbi rszben tbb mint egy tucat, INNER JOIN-t alkalmaz pldt mu tattunk be. A pldkat hrom rszre osztottuk: kt tbla kztti JOIN-ok, kettnl tbb tbla kztti JOIN-ok s egyez rtkek szerinti JOIN-ok. A kvetkez fejezetben bemu tatjuk a JOIN egy msik vltozatt - ez lesz az OUTER JOIN , fejezetnk vgn pedig olyan krelmeket tallunk, amelyeket nllan dolgozhatunk ki.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis 1. Sorold fel a vsrlkat s a dtumokat, amikor rendelst adtak fel, a dtum
szerint elrendezve!" (Tipp: a megoldshoz kt tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Customers_And_OrderDates (944 sor). 2. rd ki a dolgozkat azokkal a vsrlkkal egytt, akiknek a rszre rendelst vettek fel!"

3.

4.

5.

6.

(Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Employees_And_Customers (211 sor). Jelentsd meg az sszes rendelst, az egyes rendelsekhez tartoz termkeket, az egyes termkekrt jr sszeget, a rendelsi szm szerint rendezve! (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Orders_With_Products (3975 sor). Mutasd meg a beszlltkat s azokat a termkeket, amelyeket 100 dollros r alatt szlltanak neknk! (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Vendors_And_Products_Less_Than_lOO (66 sor). Keresd meg azokat a vsrlkat s alkalmazottakat, akiknek ugyanaz a vezetknevk! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Customers_And_Employees_Same_LastName (16 sor). Keresd meg azokat a vsrlkat s alkalmazottakat, akik ugyanabban a vrosban laknak! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Customers_Employees_Same_City (10 sor).

Entertainment Agency adatbzis 1. "Jelentsd meg az eladkat s a lekttt fellpseket a lekts kezd dtuma
szerint rendezve! (Tipp: a megoldshoz kt tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Agents_Booked Dates ( 1 1 1 sor). 2. "rd ki a megrendelket s az ltaluk lekttt eladkat! (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Customers_Booked_Entertainers (75 sor). 3. Keresd meg azokat az gynkket s eladkat, akiknek ugyanaz az irnytszmuk! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Agents_Entertainers_Same_Postal (10 sor).

School Scheduling adatbzis


1. "Jelentsd meg az pleteket s az egyes pletekben lev osztlytermeket! (Tipp: a megoldshoz kt tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Buildings_Classrooms (44 sor). 2. Sorold fel a hallgatkat s az sszes rt, amit felvettek! (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Student_Enrollments (33 sor).

3. Sorold fel a tanszk dolgozit s hogy ki milyen trgyat oktat! (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Staff_Subjects (110 sor). 4. Keresd meg azokat a hallgatkat, akiknek legalbb 85%-os az rtkelsk rajzbl, s emellett valamilyen szmtstechnikai trgybl is legalbb 85%-ot rtek el! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Good_Art_CS_Students (1 sor).

Bowling League adatbzis


1. Sorold fel a csapatokat s az sszes csapattagot! (Tipp: a megoldshoz kt tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Teams_And_Bowlers (32 sor). 2. Jelentsd meg a jtkosokat, hogy mely mrkzseken jtszottak, valamint az egyes jtkokban elrt pontszmokat!" (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Bowler_Game_Scores (1344 sor). 3. Keresd meg azokat a jtkosokat, akiknek ugyanaz az irnytszmuk! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Bowlers_Same_ZipCode (92 sor).

Recipes adatbzis
1. Sorold fel az sszes saltareceptet!" (Tipp: a megoldshoz kt tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Salads (l sor). 2. Sorold fel az sszes receptet, amely tartalmaz tejtermket!" (Tipp: a megoldshoz kettnl tbb tbla kztti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Recipes_Containing_Dairy (2 sor). 3. Keresd meg azokat a hozzvalkat, amelyekbl az alaprtelmezett mennyisgre van szksg! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Ingredients_Same_Measure (628 sor). 4. Mutasd meg azokat a recepteket, amelyek tartalmaznak marhahst s fokhagymt! (Tipp: a megoldshoz egyez rtkek szerinti JOIN-ra lesz szksg.) A megolds itt tallhat: CH08_Beef_And_Garlic_Recipes (l sor).

Kls sszekapcsols
A problma s a megolds kztti egyetlen klnbsg, hogy a megoldst az ember megrti. Charles Franklin Kettering, feltall, 1876-1958

A fejezet tmakrei
Mi az OUTER JOIN? A LEFT s a RIGHT OUTER JOIN A FULL OUTER JOIN Pldk sszefog(lal)s nll feladatok

Az elz fejezetben az INNER JOIN mveleteket trgyaltuk, vagyis azt, hogy miknt kap csolhatunk egymshoz kt vagy tbb tblt, illetve eredmnyhalmazt, az egyez sorokat keresve. Eljtt az ideje az OUTER JOIN mveletek trgyalsnak: ezttal gy kapcsolunk ssze tblkat, hogy az egyez sorokon tl az eltreket is megtalljuk.

Mi az OUTER JOIN?
Ahogy az elz fejezetben elmondtuk, az SQL-szabvny kt vagy tbb tbla, illetve eredmnyhalmaz sszekapcsolshoz a JOIN mveletek tbb tpust hatrozza meg. Az OUTER JOIN (kls sszekapcsols) segtsgvel nem csak az ltalunk megadott feltteleknek megfelel sorokat nyerhetjk ki egy adatbzisbl, hanem az sszekapcsolt adathalmazok egyikbl vagy msikbl - esetleg mindkettbl - azokat is, amelyek nem felelnek meg ezeknek a feltteleknek. Ttelezzk fel pldnak okrt, hogy a School Scheduling adatbzisbl akarunk a hallga tkrl s az ltaluk felvett rkrl informcit nyerni. Ahogy az elz fejezetben megta nultuk, az INNER JOIN csak a legalbb egy rra feliratkozott hallgatkat, illetve a leg albb egy hallgat ltal felvett rkat mutatja meg. Nem mutatja meg azokat a hallgatkat,

akik felvtelt nyertek az iskolba, de mg nem iratkoztak fel egyetlen rra sem, s azokat az rkat sem, amelyek ugyan felvehetk, de egyetlen hallgat sem mutatott rdekldst irntuk. Mi a teend akkor, ha fel akarjuk soroltatni az sszes hallgatt, s ha vettek mr fel rkat, akkor azokat is? Ehhez hasonl problma, ha ki akarjuk ratni az sszes rt s azokat a hallgatkat is, akik felvettk az rkat - ha vannak mr ilyenek. Az effle feladatok megoldsra valk az OUTER JOIN mveletek. A 91. bra halmazdiagram segtsgvel mutatja be hallgatk s az rk egy lehetsges kapcsolatt. Ahogy lthatjuk, nhny hallgat mg nem jelentkezett egy rra sem, s nhny rt mg egyetlen hallgat sem vett fel.

Ha az sszes hallgat s az ltaluk felvett rk listjra vagyunk kvncsiak, a 9 2. brn alapul eredmnyt fogjuk kapni. Felmerlhet a krds: Mit fogunk ltni azoknl a hallgatknl, akik egy rt sem vettek fel? Ha esznkbe jut a Null rtk, ms szval a semmi fogalma, amelyet az 5. fejezetben trgyaltunk, akkor mr tudjuk is, hogy mit fogunk ltni. Ha az adatbzisrendszer egy lekrdezs sorn, amelyben a hallgatkra s a hozzjuk kapcsolt rkra vagyunk kvn csiak, olyan hallgathoz r, aki mg egyetlen rt sem vett fel, a Classes (rk) tbla minden oszlopra Null rtket fog visszaadni. A kt halmaz klnbsgnek fogalmra gondolva, amit a 7. fejezetben trgyaltunk, a Classes tbla Null rtket tartalmaz sorai az sszes hallgat halmaza, illetve a legalbb egy rt felvett hallgatk halmaza kztti klnbsget jelentik.

Ehhez hasonlan, az sszes rt, illetve a legalbb egy rt felvett hallgatkat kirat lekrdezs esetben a Students tbla Null rtket tartalmaz res sorai az sszes ra halmaza s a legalbb egy hallgat ltal felvett rk halmaza kztti klnbsget jelentik. Ahogy grtk, az OUTER JOIN-nal Null rtkekre keresve egy msik megoldst kapunk arra, hogy megtalljuk kt halmaz klnbsgt. Az EXCEPT mvelettel szemben, amely kt halmaz teljes soraira illeszkedik, a JOIN mvelettel az illeszts nhny oszlopra (rendszerint az elsdleges s az idegen kulcsra) korltozhat.

A LEFT s a RIGHT OUTER JOIN


Az OUTER JOIN utastst ltalban olyan esetekben hasznljuk, ahol ltni akarjuk az egyik tbla vagy eredmnyhalmaz sszes sort s a msik tbla vagy eredmnyhalmaz illeszked sorait. Ehhez a LEFT OUTER JOIN vagy a RIGHT OUTER JOIN utasts a megfelel eszkz. Mi a klnbsg LEFT (bal) s RIGHT (jobb) kztt? Idzzk fel az elz fejezetbl, hogy az INNER JOIN mvelet kt tblra alkalmazhat, mgpedig a kvetkezkppen: megne vezzk az els tblt, berjuk a JOIN kulcsszt, majd megnevezzk a msodik tblt. Ha a lekrdezshez OUTER JOIN utastst hasznlunk, akkor az SQL-szabvny az elsknt megnevezett tblt tekinti a bal oldalon lvnek, a msodikknt megnevezettet pedig a jobb oldalon lvnek. gy amennyiben ltni szeretnnk az els tbla minden sort s a msodik tbla illeszked sorait, a LEFT OUTER JOIN utastst kell hasznlnunk. Ha pedig a msodik tbla minden sort s az els tbla illeszked sorait szeretnnk ltni, akkor a RIGHT OUTER JOIN utastst kell megadnunk.

Utastsforma
Vizsgljuk meg a LEFT vagy RIGHT OUTER JOIN mveletet tartalmaz utastsok felp tsekor hasznlt utastsformt!

Tblk hasznlata
Kezdjk egy egyszer, tblkat hasznl OUTER JOIN-t tartalmaz utasts felptsvel

A kt tbla felhasznlsval kszlt, OUTER JOIN utastst tartalmaz lekrdezs felpt shez szksges szintaxisdiagramot a 9.3. bra mutatja be.

Az INNER JOIN-hoz hasonlan (amelyet a 8. fejezetben trgyaltunk) minden mvelet a FROM zradkban trtnik. (A dolgok egyszerstse vgett a WHERE s az ORDER BY zradkokat itt elhagytuk.) Egyetlen tblanv megadsa helyett kt tblanevet adunk meg, a JOIN kulcsszval sszekapcsolva. Ha nem adjuk meg a kvnt JOIN tpust, az adatbzisrendszer INNER JOIN-t felttelez. Ez esetben, lvn, hogy OUTER JOIN-t szeretnnk, meg kell adnunk, hogy LEFT vagy RIGHT JOIN-ra gondolunk. Az OUTER kulcssz elhagyhat. Azoknak, akik az A" fggelkben tallhat teljes szintaxisdiagramo kat is kvetik, rdemes tudniuk, hogy a megfelel rszeket (Select uta sts, Tblahivatkozs, Kapcsolt tbla) leegyszerstettk, hogy a trgyalt utastsformra sszpontosthassunk. Minden JOIN legfontosabb rsze a msodik tblanevet kvet ON vagy USING zradk, ami azt tudatja az adatbzisrendszernkkel, hogy a JOIN hogyan hajtand vgre. A JOIN kirtkelsekor az adatbzisrendszer logikailag kombinlja az els tbla minden sort a msodik tbla minden sorval (az ilyen kombincit, amelynek sorn az els tbla minden sort kombinljuk a msodik tbla minden sorval, Descartes-szorzatnak vagy direkt szorzatnak nevezzk), majd az ON vagy USING zradkban lv felttelek vizsglatval megkeresi a visszaadand illeszked sorokat. Tekintve, hogy OUTER JOIN mveletet kr tnk, az adatbzisrendszer visszaadja a LEFT (bal oldali) vagy RIGHT (jobb oldali) tbla nem illeszked sorait is.

Mr tanultunk a keressi felttelek WHERE-zradkk alaktsrl a 6. fejezetben. A JOIN utni ON zradkban hasznlt keressi felttellel logikai vizsglatot vgeztethetnk el, amelynek igaz eredmnyt kell adnia, hogy az adatbzisrendszer a kt sszekapcsolt sort visszaadja. Csak olyan keressi felttelt van rtelme rni, amely az els tblnak legalbb egy oszlopt a msodik tbla legalbb egy oszlophoz hasonltja. Br meglehetsen sszetett keressi felttel rhat, ltalban elvgeztethetnk egy egyszer egyenlsgvizs glatot az egyik tbla elsdleges kulcsa, illetve a msodik tbla idegen kulcsa kztt. Hogy ne bonyoltsuk a dolgokat, kezdjk az utols fejezetben hasznlt, receptosztlyokrl s receptekrl szl pldval. Ne feledjk, hogy egy jl megtervezett adatbzisban az sszetett osztlyneveket el kell klnteni egy msodik tblba, amelybl a neveket aztn egy egyszer kulcsrtkkel kapcsoljuk az els tblhoz. A Recipes (Receptek) minta adatbzisban a receptosztlyok s a receptek kln tblkban vannak. A Recipe_Classes (Receptosztlyok) s a Recipes tblk kapcsolatt a 9.4. bra mutatja be. Amikor elszr vgiggondoltuk, hogy a troland receptjeink milyen osztlyokba sorolha tk, lehet, hogy az sszes esznkbe jut receptosztly nevt gpre vittk. Most, pr recept begpelse utn j volna megtudni, hogy mely csoportok nem tartalmaznak mg recepte ket. Ezen fell j lenne kiratni az sszes receptosztlyt, osztlyonknt a mr bert receptek cmeivel Mindkt problma megoldhat egy OUTERJOIN utastssal.

A fejezet sorn a 4. fejezetben bevezetett Krelem-Fordts Tisztzs-SQL-mdszert kvetjk. Mutasd meg az adatbzis sszes recepttpust a hozzjuk tartoz receptekkel!" Fordts - Select recipe class description and recipe title from the recipe classes table left outer joined with the recipes table on recipe class ID in the recipe classes table matching recipe class ID in the recipes table (Vlaszd ki a receptosztlyok meghatrozst s a receptek cmt a recept osztlyok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a re ceptek tbljval, a receptosztlyok tbljban lv receptosztly-azonostt a receptek tbljban tallhat receptosztly-azonostnak megfeleltetve.)

Tisztzs - Select recipe class description and recipe title from the recipe classes table left outer joined with the recipes table on recipe_ classes.recipe class ID in the recipe classes table matching = recipes.recipe class ID in the recipes table SQL SELECT Recipe_Classes.RecipeClassDescription,

Recipes.RecipeTitle FROM Recipe_Classes LEFT OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID


Ha a FROM zradkban tbb tblt is megadunk, ne feledkezznk meg arrl, hogy rninden oszlopnevet rninden elfordulskor a tblanvvel egytt adjunk meg, hogy teljesen egyr telm legyen, hogy melyik tbla melyik oszlopra utalunk. Vegyk szre, hogy a Recipe ClassID (Receptosztly-azonost) oszlop nevt a tblanvvel egytt kellett megadnunk, hi szen kt RecipeClassID nev oszloppal dolgoztunk a Redpes tblban lvvel, illetve a Recipe_Classes tblban tallhatval Br az SQL legtbb kereskedelmi megvalstsa tmogatja az OUTER JOIN-t, van nhny, amelyik nem. Ha az adatbzisunk nem tmogat ja az OUTER JOIN-t, akkor gy oldhatjuk meg a problmt, hogy minden szksges tblt felsorolunk a FROM zradkban, majd az ON zradkban szerepl keressi feltte leket a WHERE zradkba tesszk. Az adatbzisunk ltal megkvnt- a szabvnyostl eltr- OUTER JOIN utastst helyettest utastsformrl az adatbzisunk dokument cijbl tudhatunk meg bvebbet. Pldul a Microsoft SQL Server korai vltozatai az albbi utastsformt fogadjk el (figyeljnk a 'WHERE-zradkban lv csillagra!):

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle FROM Recipe_Classes, Recipes WHERE Recipe_Classes.RecipeClassID *= Recipes.RecipeClassID


Ha az Oracle-t hasznljuk, a lehetsges utastsforma a kvetkez (figyeljnk a WHERE zradkban szerepl pluszjelre!):

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle FROM Recipe_Classes, Recipes WHERE Recipe_Classes.RecipeClassID = Recipes.RecipeClassID(+)

szintn szlva, ezeket a furcsa utastsformkat azoknak az adatbzisrendszereknek a kszti talltk ki, amelyekben az OUTER JOIN mvelet biztostotta kpessget mr jval azeltt meg akartk valstani, hogy az utasts bekerlt volna az SQL-szabvnyba. Szerencsre az SQL-szabvnyban meghatrozott utastsforma lehetv teszi a szmunk ra, hogy a vgs eredmnyhalmaz forrst teljes egszben a FROM zradkn bell ad juk meg. Gondoljunk gy a FROM zradkra, mint egy olyan kapcsolt eredmnyhalmaz teljes megadsra, amelybl az adatbzisrendszer kinyeri a vlaszokat. Az SQL-szabvny szerint a WHERE zradkot csak arra hasznljuk, hogy a FROM zradkkal meghatro zott eredmnyhalmazbl sorokat szrjnk ki. Tekintve, hogy a WHERE-zradk haszn latval ltrehozott OUTER JOIN-szer mkds adatbzisrendszerenknt vltoz nyelvtant jelent, tbbfle, a szabvnytl eltr rendszer hasznlata esetn tbbfle utastsfor ma megtanulsra lehet szksgnk. Ha a mintul szolgl lekrdezst a Recipes pldaadatbzison futtatjuk, 16 sort kell vissza kapnunk. Minthogy levesreceptet nem vittnk be az adatbzisba, Null rtket kell kapnunk a RecipeTitle (Receptcm) oszlopnak abban a sorban, ahol a RecipeClassDescription (Receptosztly lersa) oszlopban "Soup" (leves) szerepel. Ennek a sornak a megtallshoz a kvetkezkpp jrjunk el: Sorold fel azokat a receptosztlyokat, amelyekben mg nincs recept!" Fordts - Select recipe class description from the recipe classes table left outer joined with the recipes table on recipe class ID where recipe ID is empty (Vlaszd ki azoknak a receptosztlyoknak a meghatrozst a receptoszt lyok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a recep tek tbljval a receptosztly-azonostk szerint, amelyeknl a receptazo nost res.) Tisztzs - Select recipe class description from the recipe classes table left outer joined with the recipes table on recipe_classes.recipe class ID in the recipe table matches = recipes.recipe class ID in the recipes table where recipe ID is empty NULL SQL SELECT Recipe_Classes.RecipeClassDescription

FROM Recipe_Classes LEFT OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID WHERE Recipes.RecipeID IS NULL

Ha vgiggondoljuk, most ppen egy klnbsgkpzst, vagyis egy EXCEPT mveletet v geztk el (lsd a 7. fejezetet), de JOIN utastst hasznlva. Kicsit olyan ez, mintha annyit mondannk, hogy Mutasd meg az sszes receptosztlyt, kivve azokat, amelyek a recep tek tbljban is elfordulnak." A 9.5. brn lthat halmazdiagram segt elkpzelni, hogy mi is trtnik.

A 9.5. brn minden recepthez tartozik receptosztly, de vannak olyan receptek, amelyek hez mg nem hatroztunk meg receptosztly. Az IS NULL vizsglattal azokat a vilgosabb, kls krben lv sorokat krjk el a rendszertl, amelyekhez nem tartozik semmi a bels, sttebb krrel jellt receptek kzl. Vegyk szre, hogy az OUTERJOIN utastsnak a 9.3. brn bemutatott szintaxisdiagramjn lthat egy elhagyhat USING zradk is. Ha a vizsglt oszlopoknak a kt tblban azonos a nevk, s egyenlsgvizsglatot akarunk vgezni rajtuk, hasznlhatjuk a USING zradkot is, az oszlopnevek megjellsvel. Oldjuk meg jra az elz problmt, ezttal a USING hasznlatval! Jelentsd meg azokat a receptosztlyokat, amelyekben mg nincs recept!" Fordts - Select recipe class description from the recipe classes table left outer joined with the recipes table using recipe class ID where recipe ID is empty (Vlaszd ki azoknak a receptosztlyoknak a meghatrozst a receptoszt lyok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a recep tek tbljval a receptosztly-azonostk szerint, amelyeknl a receptazo nost res.) Tisztzs - Select recipe class description from the recipe classes table left outer joined with the recipes table using recipe class ID where recipe ID is empty NULL

SQL

SELECT Recipe_Classes.RecipeClassDescription FROM Recipe_Classes LEFT OUTER JOIN Recipes USING (RecipeClassID) WHERE Recipes.RecipelD IS NULL

Az utasts alakja lnyegesen egyszerbb a USING hasznlatval, igaz? Van azonban egy aprcska csapda a dologban: a USING zradkban szerepl minden oszlop elveszti a tb ljval a kapcsolatot, ugyanis az SQL-szabvny kimondja, hogy az adatbzisrendszernek egybe kell olvasztania a kt oszlopot. gy aztn ebben a pldban eredmnyknt egyet len RecipeClassID oszlopot kapunk, amelyre nem hivatkozhatunk a SELECT vagy ms zradkokban, sem Recipes.RecipeClassID-knt, sem Recipe_Classes.RecipeClassID-knt. Figyelnnk kell arra is, hogy nhny adatbzisrendszer mg nem tmogatja a USING zradkot. Ha ezzel a problmval kerlnk szembe az adatbzisrendszernk hasznlata sorn, akkor mindig helyettesthetjk a USING zradkot egyenlsget vizsgl ON zra dkkal Az SQL-szabvny meghatroz mg egy tovbbi JOIN tpus mveletet, a NATURAL JOIN-t (termszetes sszekapcsols). A NATURAL JOIN uta sts kt tblt az sszes azonos nev oszlop sszehasonltsval kapcsol ssze. Ha az adatbzisrendszernk ismeri a NATURAL JOIN-t, s csak a vizsglt oszlopok kz sek, akkor az elz pldafeladat gy is megoldhat:

SELECT Recipe_Classes.RecipeClassDescription FROM Recipe_Classes NATURAL LEFT OUTER JOIN Recipes WHERE Recipes.RecipeID IS NULL
NATURALJOIN hasznlatakor ne adjunk meg ON vagy USING zradkot!

SELECT utasts begyazsa


Ahogy a 8. fejezetben lthattuk, a legtbb SQL-megvalsts megengedi, hogy a FROM zradk brmely tblanevt egy teljes SELECT utastssal helyettestsk. Persze ilyenkor meg kell adnunk egy korrelcis nevet (az lnevek hozzrendelsvel kapcsolatban lsd a 8. fejezetet), hogy a begyazott lekrdezs kirtkelsekor kapott eredmnyre hivatkoz ni tudjunk. Az OUTER JOIN begyazott SELECT utastssal trtn hasznlatt a 9.6. bra mutatja be. Vegyk szre, hogy a SELECT-tet tartalmaz kifejezsek - eltekintve az ORDER BY zradktl - az sszes lekrdezsben hasznlhat zradkot tartalmazhatjk. Az OUTER JOIN kulcsszavak brmely oldaln a tblanevekkel azonos mdon hasznlhatunk SELECT utas tsokat.

Lssuk ismt a Recipes s a Recipe_Classes tblkat. Ebben a pldban ttelezzk fel, hogy csak a saltk (Salads), a levesek (Soups) s a ftelek (Main courses) rdekesek a szmunkra. me a SELECT-tel megszrt Recipe_Classes tbla, amelyet LEFT OUTER JOIN mvelettel sszekapcsoltunk a Recipes tblval: SQL

SELECT RCFiltered.ClassName, R.RecipeTitle FROM (SELECT RecipeClassID, RecipeClassDescription AS ClassName FROM Recipe_Classes AS RC WHERE RC.ClassName - 'Salads' OR RC.ClassName - 'Soup' OR RC.ClassName 'Main Course') AS RCFiltered LEFT OUTER JOIN Recipes AS R ON RCFiltered.RecipeClassiD = R.RecipeClassID

Ha a SELECT utastst FROM zradkban hasznljuk, vatosnak kell lennnk. Ha gy dntnk, hogy egy tblanevet SELECT utastsra cserlnk, akkor figyeljnk oda, hogy ne csak a vgeredmnyben lthat oszlopokat vegyk fel a SELECT paramterei kz, hanem azokat is, amelyek a JOIN-mvelethez kellenek. Ezrt ltjuk a begyazott kifejezsben a RecipeClassDescription oszlopot s a RecipeClassID oszlopot is. Pusztn a szrakozs kedvrt a begyazott utastsban a RecipeClassDescription oszlopnak a ClassName (Osztlynv) lnevet adtuk. Ennek eredmnyekppen a kls SELECT utasts a Recipe ClassDescription oszlop helyett a ClassName oszloppal dolgozik. szrevehetjk, hogy az ON zradk itt mr a begyazott SELECT utastsban szerepl RCFiltered korrelcis nvre hivatkozik az eredeti tblanv vagy ahelyett a korrelcis nv helyett, amelyet a be gyazott SELECT utasts belsejben rendeltnk a tblhoz.

Tekintve, hogy a Recipes mintaadatbzisunkban egyetlen levesrecept sem szerepel, a lekrdezs futtatsa utn egyetlen sort fogunk ltni, amelyben a RecipeClassDescription oszlop rtke leves (Soup), s amely mellett a RecipeTitle oszlopban Null rtk szerepel. Ugyanilyen egyszer dolog olyan lekrdezst rni, ahol a Recipes tbln futtatott SELECT utasts az OUTER JOIN mvelet jobb oldaln ll. Pldnak okrt az albbi mdon kerestethettk volna ki a ''beef'' szt a cmkben tartalmaz recepteket: SQL

SELECT RCFiltered.ClassName, R.RecipeTitle FROM (SELECT RecipeClassID, RecipeClassDescription AS ClassName FROM Recipe_Classes AS RC WHERE RC.ClassName = 'Salads' OR RC.ClassName = 'Soup' OR RC.ClassName = 'Main Course') AS RCFiltered LEFT OUTER JOIN (SELECT Recipes.RecipeClassID, Recipes.Recipe Title FROM Recipes WHERE Recipes.RecipeTitle LIKE '%beef%') AS R ON RCFiltered.RecipeClassiD = R.RecipeClassID

Ne feledjk, hogy a LEFT OUTERJOIN utasts a JOIN mvelet bal oldaln ll eredmny halmaz vagy tbla sszes sorban keres, nem trdve azzal, hogy a jobb oldalon ll-e illeszked sor. Az elz lekrdezs, azon fell, hogy visszaad egy olyan sort, amelyben a Soup mellett a RecipeTitle oszlop Null rtket tartalmaz, visszaad egy hasonlan Null rtkkel br Salad sort is. gy vlhetnnk, hogy az adatbzisban nincsenek saltarecep tek, holott vannak, mde egyik saltarecept cme sem tartalmazza a "beef" szt. Taln feltnt, hogy a JOIN utasts utni ON zradkba akr teljes keressi felttelt is berhatunk. Ez teljesen igaz, pldafeladatunk kvet kez megoldsa az SQL-szabvny szerint tkletesen szablyos:

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle FROM Recipe_Classes LEFT OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID AND (Recipe_Classes.RecipeClassDescription = 'Salads' OR Recipe_Classes.RecipeClassDescription = 'Soup' OR Recipe_Classes.RecipeClassDescription = 'Main Course') AND Recipes.RecipeTitle LIKE '%beef%'

Vizsgldsaink szerint nhny jelents SQL-megvalsts sajnos a fenti kdot hibsan futtatja, vagy egyltaln el sem fogadja, gy ht azt tancsoljuk, hogy az ON zradk ke ressi felttelben mindig kt tblt vagy eredmnyhalmazt sszehasonlt felttelt adjunk meg. Ha a szban forg tblk sorait szrni akarjuk, akkor tegyk ezt egy begyazott SELECT utasts WHERE zradkaknt megfogalmazott keressi felttellel.

JOIN utastsok egymsba gyazsa


Br sok problma megoldhat mindssze kt tbla sszekapcsolsval, krdseink egy rszre csak hrom, ngy, vagy esetleg ennl is tbb tbla sszekapcsolsval kaphatunk vlaszt. Pldnak okrt tegyk fel, hogy a receptekrl minden fontos informcit a recept tpust, a recept cmt s az sszes hozzvalt - egyetlen lekrdezssel akarjuk megkapni. Most, hogy rtjk, hogy az OUTER JOIN mvelet mire val, akr kirathatjuk az sszes receptosztlyt - azokat is, amelyekhez mg nem adtunk meg recepteket - s az sszes receptet, minden rszletkkel egytt. A 9.7. bra minden, a krds megvlaszo lshoz szksges tblt feltntet.

gy nz ki, hogy t klnbz tbla adataira van szksgnk! Ahogy azonban a 8. fejezet ben lttuk, a feladat megoldhat egy sszetettebb - JOIN zradkokba gyazott JOIN zra dkokat tartalmaz - FROM zradk megalkotsval. me a trkk: mindenhol, ahol megad hatunk tblanevet, megadhatunk teljes, zrjelek kztti JOIN zradkot is. A 9.8. bra kt tbla sszekapcsolsnak egyszerstett vltozatt mutatja be (elhagyva a korrelcisnvzradkokat s az ON zradkot vlasztva a kt tbla INNER vagy OUTER JOIN-nal trtn sszekapcsolshoz). A harmadik tblt gy tudjuk az eddigiekhez kapcsolni, hogy az els tbla neve eltt z rjelet nyitunk, amit a keressi felttelt kveten bezrunk, utna kvetkezhet a msodik JOIN kulcssz, a harmadik tbla neve, az ON kulcssz s a msodik keressi felttel. A te endinket a 9.9. bra mutatja be.

Ha belegondolunk, a zrjelen belli, JOIN utastssal sszekapcsolt tblk egy logikai tblt, ha gy tetszik, bels eredmnyhalmazt adnak. Ez az eredmnyhalmaz veszi t a 9.8. bra els, egyszer tbljnak a helyt. A mveletet folytathatjuk: az egsz eddigi JOIN zradkot zrjelek kz tehetjk, jabb JOIN kulcsszt rhatunk az utastshoz, jabb tblanvvel, amelyet jabb ON kulcssz kvet, jabb keressi felttellel, egszen addig, amg elll a kvnt eredmnyhalmaz. rjunk olyan lekrdezst, amely a 9.7. brn lthat sszes tblbl hasznl adatokat, s lssuk mi trtnik! (Ezt a lekrdezstpust egy olyan jelentshez hasznlhatjuk, amely az sszes receptosztly sszes receptjnek adatait kirja.) Mutasd meg a recepteket tartalmaz adatbzis minden recepttpust, a bennk lv receptek cmt, az elkszts menett, a hozzvalk nevt, a hozzvalk sorrendjt, a hozzvalk mennyisgt s a hozzvalk megadsnl hasznlt mrtkegysgeket, a receptek cme s sorszma szerint rendezve!"

Fordts - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, and measurement description from the recipe classes table left outer joined with the recipes table on recipe class ID in the recipe classes table matching recipe ID in the recipes table, then joined with the recipe ingredients table on recipe ID in the recipes table matching recipe ID in the recipe ingredients table, then joined with the ingredients table on ingredient ID in the ingredients table matching ingredient ID in the recipe ingredients table, and then finally joined with the measurements table on measurement amount ID in the measurements table matching measurement amount ID in the recipe ingredients table,order by recipe title and recipe sequence number (Vlaszd ki a receptosztlyok lerst, a receptek cmt, az elksztsi utastsokat, a hozzvalk nevt, a receptek sorszmt, a mennyisgeket s a mrtkegysgeket a receptosztlyok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a receptek tbljval, a receptosztlyok tblj nak receptosztly-azonostit megfeleltetve a receptek tbljban lev re ceptazonostknak, majd ezt sszekapcsoltuk a recepthozzvalk tbljval a recepttbla receptazonostit megfeleltetve a recepthozzvalk tbljnak receptazonostinak, majd ezt sszekapcsoltuk a hozzvalk tbljval a hozzvalk tbljnak hozzval-azonostit megfeleltetve a recepthozz valk tbljnak hozzval-azonostinak, s vgl ezt sszekapcsoltuk a mrtkegysgek tbljval a tbla mennyisgazonostit megfeleltetve a recepthozzvalk tbljban lev mennyisgazonostknak, receptcm s receptsorszm szerint rendezve.) Tisztzs - Select the recipe class description, recipe title, preparation instruction, ingredient name, recipe sequence number, amount and measurement description from recipe classes table left outer joined with the recipes table on recipe_classes .recipe class ID in the recipe classes table matching = recipes .recipe class ID in the recipes table, then inner joined with the recipe ingredients table on recipes.recipe ID in the recipes table matching = recipe_ingredients.recipe ID in the recipe ingredients table, then inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table matching = recipe_ingredients.ingredient ID in the recipe ingredient. table, and then finally inner joined with the measurements table on measurements.measurement amount ID in the

measurements table matching = recipe_ingredients.measurement amount ID in the recipe ingredients table order by recipe title, recipe sequence number SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM (((Recipe_Classes LEFT OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID) INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID ORDER BY RecipeTitle, RecipeSeqNo

Valjban brhov, ahov egybknt egy tblanevet tennnk, tehetjk kt tbla JOIN mvelettel kpzett sszekapcsolst is. A 9.9. bra azt sugallja, hogy elszr az els tbla egyestend a msodikkal, majd a kapott eredmny a harmadikkal. Ugyanakkor az is jrhat t, ha elszr a msodik s a harmadik tblt kapcsoljuk ssze (mr amennyiben a harmadik tbla a msodikkal ll logikai kapcsolatban, nem pedig az elsvel), s csak ez utn hajtjuk vgre az utols sszekapcsolst az els tblval. A 9.10. bra ez utbbi md szert mutatja be. Az elzekben vizsglt, t tblt hasznl lekrdezs SQL kdjt a kvetkezkppen is felrhattuk volna: SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM Recipe_Classes LEFT OUTER JOIN (((Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureMountID = Recipe_Ingredients.MeasureArnountID) ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID ORDER BY RecipeTitle, RecipeSeqNo

Ne feledjk, hogy nhny adatbzisrendszer optimalizlja rzkeny a JOIN utastsok sorrendjre. Ha egy sok JOIN mveletet tartalmaz lekrdezs futtatsa egy nagy adatb zison hossz idt vesz ignybe, az SQL kdban szerepl JOIN utastsok sorrendjnek megvltoztatsa a futs felgyorsulst eredmnyezheti. szrevehettk, hogy mindssze egyetlen OUTER JOIN utastst hasznltunk az elz, tbb JOIN utastst tartalmaz pldkban. Lehet, hogy azon trjk a fejnket, hogy lehetsges s rtelmes-e tbb OUTER JOIN utastst hasznlni egy sszetett JOIN kifejezsben. Tegyk fel, hogy azon tl, hogy vannak recepteket mg nem tartalmaz receptosztlyaink, rendelkeznk pr olyan recepttel is, amelyekhez eleddig nem adtunk meg hozzvalkat Az elz pldban nem tallkozunk a Recipes tbla egyetlen olyan sorval sem, amelynek ne lenne a Recipe_Ingredients tblban megfelel sora. Ennek az az oka, hogy az INNER JOIN utasts az ilyeneket elhagyja. Akkor ht jelentsk meg most az sszes receptet!

Sorold fel a recepteket tartalmaz adatbzis minden recepttpust, a bennk lv receptek cmt, az elkszts menett, a hozzvalk nevt, a hozzvalk sorrendjt, a hozzvalk mennyisgt s a hozzvalk megadsnl hasznlt mrtkegysgeket, a receptek cme s sorszma szerint rendezve!" Fordts - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, and measurement description from the recipe classes table left outer joined with the recipes table on recipe class ID in the recipe classes table matching recipe class ID in the recipes table, then left outer joined with the recipe ingredients table on recipe ID in the recipes table matching recipe ID in the recipe ingredients table, then joined with the ingredients table on ingredient ID in the ingredients table matching ingredient ID in the recipe ingredients table, and then finally joined with the measurements table on measurement amount ID in the measurements table matching measurement amount ID in the recipe ingredients table, order by recipe title and recipe sequence number (Vlaszd ki a receptosztlyok lerst, a receptek cmt, az elksztsi utast sokat, a hozzvalk nevt, a receptek sorszmt, a mennyisgeket s a mr tkegysgeket a receptosztlyok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a receptek tbljval, a receptosztlyok receptosztly-azo nostja s a receptek tbla receptosztly-azonostja szerint, majd ezt szintn LEFT OUTER JOIN-nal sszekapcsoltuk a recepthozzvalk tbljval, a re ceptek tbljban lev receptazonostk s a recepthozzvalk tbljban le v receptazonostk megfeleltetsvel, majd ezt sszekapcsoltuk a hozzva lk tbljval, a hozzvalk tbljnak hozzval-azonostit megfeleltetve a recepthozzvalk tbljban lev hozzval-azonostknak, s vgl ezt sszekapcsoltuk a mrtkegysgek tbljval, a mrtkegysgek tbljnak mennyisgazonosti s a recepthozzvalk tbljnak mennyisgazonosti szerint, receptcm s receptsorszm szerint rendezve.) Tisztzs - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount and measurement description from the recipe classes table left outer joined with the recipes table on recipe_classes.recipe class ID in the recipe classes table matching = recipes.recipe class ID in the recipes table, then left outer joined with the recipe ingredients table on recipes.recipe ID in the recipe table matching = recipe_ingredients.recipe ID in the recipe ingredients table inner joined with the ingredients table

on ingredients.ingredient ID in the ingredients table matching = recipe_ingredients.ingredient ID in the recipe ingredients table and then finally inner joined with the measurements table on measurement.measurement amount ID in the measurements table matching = recipe_ingredients.measurement amount ID in the recipe ingredients table, order by recipe title and recipe sequence number SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM (((Recipe_Classes LEFT OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID) LEFT OUTER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeiD) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID ORDER BY RecipeTitle, RecipeSeqNo

Legynk vatosak! Az effle, tbb OUTER JOIN utastst tartalmaz kd csak azokban az esetekben mkdik helyesen, ha kvetjk az egy-a-tbbhz kapcsolatok ltal kijellt utat. Vessnk megint egy pillantst a 9.11. brn lthat, Recipe_Classes, Redpes s a Recipe_Ingredients tblk kztti kapcsolatra:

Az egy-a-tbbhz kapcsolatot nha szl-gyermek kapcsolatnak nevezik. Minden szlsor nak (ezek vannak a kapcsolat "egy"-oldaln) nulla vagy ennl tbb gyermeksora (ezek vannak a kapcsolat tbb-oldaln) lehet Ha nincsenek rva sorok a tbb oldalon (pl dul a Recipes tblnak lehet olyan sora, ahol a RecipeClassID oszlop Null rtkkel br), akkor a gyermektbla minden sornak rendelkeznie kell megfelel sorral a szltblban. gy ht van rtelme a Recipe_Classes LEFT JOIN Recipes kifejezsnek, amellyel kigyjthetk a Recipe_Classes tblnak a Recipes tblban gyermeksorral mg nem rendelkez sorai. A Recipe_Classes RIGHT JOIN Recipes kifejezsnek pedig (rva sorok hinya esetn) az INNER JOIN utastssal megegyez eredmnyt kell adnia. Ehhez hasonlan a Recipes LEFT JOIN Recipe_lngredients kifejezs is rtelmes, hiszen lehetnek olyan receptjeink, amelyeknek eleddig nem jegyeztk fel a hozzvalit A Recipes RIGHT JOIN Recipe_Ingredients kifejezs ellenben nem mkdik, mert a Recipe_Ingredients tblban lv kapcsoloszlop (RecipelD) a tbla sszetett elsdleges kulcsnak rsze. gy biztosra vehet, hogy a Recipe_Ingredients tblban nincsenek rva sorok, lvn az elsdleges kulcsot alkot tblk egyike sem tartalmazhat Null rtket Lpjnk ht egy lpssel tovbb, a mindezidig egyetlen receptben sem szerepl hozzva lk (ingredients) lekrdezshez. Elszr is nzzk meg figyelmesen a 9.12. brt, amelyen a tblk, kztk az Ingredients tbla kapcsolata lthat.

Prbljuk ki a kvetkez lekrdezst (vigyzat: buktat van a dologban!):


Mutasd meg az adatbzisban trolt sszes recepttpust, valamint az sszes recept cmt, az elkszts menett, a hozzjuk tartoz hozzval-sorszmokat, a hozzvalk mennyisgt, a hozzvalk mrtkegysgeit s vgl az sszes hozzvalnevet, a recep tek cme s sorszma szerint rendezve!"

Fordts

- Select the recipe class description, recipe title,preparation instructions,ingredient name,recipe sequence number,

amount,and measurement description from the recipe classes table left outer joined with the recipes table on recipe class ID in the recipe classes table matches class ID in the recipes table, then left outer joined with the recipe ingredients table on recipe ID in the recipes table matches recipe ID in the recipe ingredients table, then joined with the measurements table on measurement amount ID in the measurements table matches measurement amount ID in the measurements table,and then finally right outer joined with the ingredients table on ingredient ID in the ingredients table matches ingredient ID in the recipe ingredients table, order by recipe title and recipe sequence number (Vlaszd ki a receptosztlyok lerst, a receptek cmt, az elksztsi utastsokat, a hozzvalk nevt, a receptek sorszmt, a mennyisgeket s a mrtkegysgeket a receptosztlyok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a receptek tbljval, a receptoszt lyok tbljnak receptosztly-azonostit megfeleltetve a recepttbla osz tlyazonostinak, majd ezt szintn LEFT OUTER JOIN-nal sszekapcsol tuk a recepthozzvalk tbljval, a receptek tbljban lev receptazo nostk s a recepthozzvalk tbljnak receptazonosti szerint, majd ezt sszekapcsoltuk a mrtkegysgek tbljval, a mrtkegysgtbla mrtkegysg-azonostit megfeleltetve a recepthozzvalk tbljban lev mrtkegysg-azonostknak, s vgl ezt RIGHT OUTER JOIN-nal sszekapcsoltuk az sszetevk tbljval, az sszetevk tbljnak hozzval-azonostit megfeleltetve a recepthozzvalk tbljban lev hozzval-azonostknak, receptcm s receptsorszm szerint rendezve.) Tisztzs - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount and measurement description from the recipe classes table left outer joined with the recipes table on recipe_classes .recipe class ID in the recipe classes table matches = recipes.class ID in the recipes table, then left outer joined with the recipe ingredients table on recipes.recipe ID in the recipes table matches = recipe_ingredients.recipe ID in the recipe ingredients table, then inner joined with the measurements table on measurements.measurement amount ID
in the measurements table matches = measurements.measurement amount ID in the measurements table,

and then finally right outer joined with the ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table, order by recipe title and recipe sequence number

SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM (((Recipe_Classes LEFT OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID Recipes.RecipeClassID) LEFT OUTER JOIN Recipe_Ingredients ON Recipes.RecipelD = Recipe_Ingredients.RecipeID) INNER JOIN Measurements ON Measurements.MeasureMountID ^ Recipe_Ingredients.MeasureAmountID) RIGHT OUTER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID ORDER BY RecipeTitle, RecipeSeqNo

gy vljk, hogy ez gy mkdni fog? Ht, a vlasz egy messze visszhangz NEM! A legtbb adatbzisrendszer a teljes FROM zradk elemzse utn prblja megllaptani a tblk kap csolatainak kiptshez vezet leghatsosabb mdszert. Mindenesetre most ttelezzk fel, hogy az adatbzisrendszer gy dnt, hogy a JOIN utastsaink zrjelbe foglalsnak mi kntjt tkletesen kvetni fogja. Ez annyit tesz, hogy az adatbzisrendszer a legbels JOIN utastssal (a Recipe_Classes tbla sszekapcsolsa a Recipes tblval) kezdi a munkt, s innen halad kifel. A Recipe_Classes tblnak van nhny olyan sora, amelyeknek nincs megfelelje a Recipes tblban, vagyis az els JOIN utasts olyan sorokat is vissza fog adni, ahol a RecipeClassID oszlop Null rtk. Ha ismt a 9.12. brra pillantunk, lthatjuk, hogy a RecipeClasses s a Recipes tblk kztt egy-a-tbbhz kapcsolat ll fenn, ezrt az sszes receptet visszakap juk, hacsak nincsenek receptosztlyhoz nem rendelt receptjeink. A kvetkez sszekapcso ls a Recipe_Ingredients tblval gyszintn LEFT OUTER JOIN mvelettel valsul meg. Lt ni akarunk a Null rtkekre val tekintet nlkl minden sort az elz (a Recipe_Classes s a Recipes tbla kztti) sszekapcsolsbl, illetve a nekik megfelel sorokat a Recipe_Ingredients tblbl. Az elz esethez hasonlan, minthogy a Recipe_Classes tb la pr sornak nincs megfelelje a Recipes tblban, s a Recipes tbla pr sornak nincs megfelelje a Recipe_Ingredients tblban, jnhny sor kaphat Null rtket a Recipe_Ingredients tblbl szrmaz IngredientID oszlopban. Annyit tettnk, hogy bejr tuk a Recipe_Classes s Recipes tblk, illetve a Recipes s Recipe_Ingredients tblk kzt ti egy-a-tbbhz kapcsolatokat. Eddig minden rendben volt. (Aprop, az utols, a Measurements tblval vgzett INNER JOIN mvelet okafogyott: tudjuk, hogy minden hozzvalhoz tartozik MeasurementAmountID rtk.)

Most jn a problma. Az utols RIGHT OUTER JOIN utasts veszi az Ingredients tbla sszes sort, s az sszes megfelel sort az elz JOIN mveletek eredmnybl. Az 5. fejezetbl mg emlksznk, hogy a Null klnleges rtk - nem egyenl egyetlen msik rtkkel, mg egy msik Null rtkkel sem. Null-tl klnbz rtk szerepel az Ingredients tbla sszes sornak IngredientID oszlopban. Egyetlen olyan sor sem fog illeszkedni rjuk az elz JOIN mveletek eredmnybl, amelynek IngredientID oszlo pban Null rtk van, gy ezeket az utols JOIN mvelet el fogja hagyni! Megjelenik az sszes, egyetlen receptben sem hasznlt hozzval, de nem fogjuk ltni a recept nl kli receptosztlyokat, sem a hozzvalk nlkli recepteket. Ha az adatbzisrendszernk a JOIN mveletek eltr sorrendben trtn elvgzse mellett dnt, a Null rtk illeszthetetlensge miatt megjelenhetnek recept nlkli receptosztlyok, hozzval nlkli receptek, ellenben nem fogjuk megtallni a mindezidig recept nlkl maradt hozzvalkat Nhny adatbzisrendszer felismerheti ezt a logikai problmt, s a lekrdezs lefuttatst elvetheti valamifle flrerthet OUTERJOIN mveletek" hibaze nettel. A baj, amivel szembeslnk, abbl ered, hogy visszafel prbltunk haladni az egy-a-tbbhz kapcsolat mentn. A hegyrl lefel egyszer az t, felfel azonban esetleg klnleges eszkzk kellenek. Mi ht a problma megoldsa? Olvassunk tovbb, s kiderl!

A FULL OUTER JOIN


A FULL (teljes) OUTERJOIN se nem LEFT (bal), se nem RIGHT (jobb) - hanem mindkett. Megjelenti a JOIN mveletben lv mindkt tbla vagy eredmnyhalmaz sszes sort. Ha a JOIN mvelet bal oldaln lv soroknak nincs megfeleljk, a jobb oldali eredmny halmazbl Null rtk kerl melljk. Hasonlan, ha a JOIN mvelet jobb oldaln lv so roknak nincs megfeleljk, Null rtkek kerlnek melljk a bal oldali eredmnyhalmazbl

Utastsforma
Most, hogy mr JOIN mveletekkel dolgozunk egy ideje, a FULL OUTER JOIN utasts formja magtl rtetd lesz. A 9 1 3 . brn ttanulmnyozhatjuk a FULL OUTER JOIN szintaxisdiagramjt.

A dolgok egyszerstse vgett a tblanv, a SELECT utasts, illetve egy msik JOIN mvelet eredmnyhalmaznak helyn a tblahivatkozs kifejezst hasznljuk. Vessnk egy jabb pillantst az elz rsz vgn felvetett problmra, amelyet a FULL OUTER JOIN-nal mr helyesen tudunk megoldani: Mutasd meg az adatbzisban trolt sszes recepttpust, valamint az sszes recept cmt, az elkszts menett, a hozzjuk tartoz hozzval-sorszmokat, a hozz valk mennyisgt, a hozzvalk mrtkegysgeit s vgl az sszes hozzvalnevet, a receptek cme s sorszma szerint rendezve!" Fordts - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, and measurement description from the recipe classes table full outer joined with the recipes table on recipe class ID in the recipe classes table matches recipe class ID in the recipes table, then left outer joined with the recipe ingredients table on recipe ID in the recipes table matches recipe ID in the recipe ingredients table, then joined with the measurements table on measurement amount ID in the measurements table matches measurement amount ID in the recipe ingredients table, and then finally full outer joined with the ingredients table on ingredient ID in the ingredients table matches ingredient ID in the recipe ingredients table, order by recipe title and recipe sequence number (Vlaszd ki a receptosztlyok lerst, a receptek cmt, az elksztsi utas tsokat, a hozzvalk nevt, a receptek sorszmt, a mennyisgeket s a mrtkegysgeket a receptosztlyok tbljbl, amelyet FULL OUTER JOIN-nal sszekapcsoltunk a receptek tbljval, a receptosztlyok tblj nak receptosztly-azonostit megfeleltetve a recepttbla receptosztly-azonostinak, majd ezt LEFT OUTER JOIN-nal sszekapcsoltuk a recepthozz valk tbljval, a mrtkegysgek tbljnak mrtkegysg-azonostit megfeleltetve a recepthozzvalk tbljban lev mrtkegysg-azonos tknak, vgl ezt FULL OUTER JOIN-nal sszekapcsoltunk a hozzvalk tbljval, a hozzvalk tbljnak hozzval-azonostit megfeleltetve a recepthozzvalk tbljban lev hozzval-azonostknak, a receptek cme s a receptek sorszma szerint rendezve.) Tisztzs - Select the recipe class description, recipe title, preparation instructions, ingredient name, recipe sequence number, amount, and measurement description from the recipe classes table full outer joined with the recipes table on recipe_classes .recipe class ID in the recipe classes table matches = recipes .recipe class ID in the recipes table,

then left outer joined with the recipe ingredients table on recipes.recipe ID in the recipes table matches = recipe_ingredients.recipe ID in the recipe ingredients table, then inner joined with the measurements table on measurements.measurement amount ID in the measurements table matches = recipe_ingredients.measurement amount ID in the recipe ingredients table, and then finally full outer joined with the ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table, order by recipe title and recipe sequence number
SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Recipes.Preparation, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM (((Recipe_Classes FULL OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID) LEFT OUTER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Measurements ON Measurements.MeasureAmountID Recipe_Ingredients.MeasureAmountID) FULL OUTER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID ORDER BY RecipeTitle, RecipeSeqNo

Ezttal az els s az utols JOIN utasts veszi a JOIN utasts mindkt oldaln lv sszes sort, gy a Null rtkek illeszthetetlensgbl szrmaz problma megolddik. Most mr nem csak a recept nlkli receptosztlyok s a hozzvalk nlkli receptek ltszanak, ha nem az eleddig egyetlen receptben szerepl hozzvalk is. Lehet, hogy mkdik a lekr dezs akkor is, ha az els JOIN utasts egy LEFT OUTER JOIN, de minthogy nem tudhat juk elre, hogy az adatbzisrendszernk milyen sorrendben dolgozza fel a JOIN utastso kat, a helyes vlaszt biztostand hasznljunk FULL OUTER JOIN-t ell is, htul is.

Ahogy arra szmthattunk, az SQL-szabvny LEFT OUTER JOIN s RIGHT OUTER JOIN utastsait nem tmogat adatbzisrendszerek a FULL OUTER JOIN utasts helyett is eltr utastsokat hasznlnak. Az adatbzisunk ltal megkvnt, a szabvnyostl eltr, az OUTER JOIN utastst helyettest utasts formrl az adatbzisunk dokumentcijbl tudhatunk meg bvebbet. Pldul a Microsoft SQL Server korai vltozatai az albbi utastsformt fogadjk el (figyeljnk a WHERE zradkban lv csillagokra!):

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle FROM Recipe_Classes, Recipes WHERE Recipe_Classes.RecipeClassID *=* Recipes.RecipeClassID
A FULL OUTER JOIN utastst nem, de a LEFT s a RIGHT OUTER JOIN utastst tmogat termkek egyenrtk eredmnyhez a LEFT OUTER JOIN s a RIGHT OUTER JOIN mvele teken vgzett UNION mvelettel jutnak el. A UNION utastst a kvetkez fejezetben rsz letekbe menen trgyaljuk. Minthogy a FULL OUTER JOIN utastshoz megadott WHERE zradk pontos formja termkenknt vltoz, tbbfle, a szabvnytl eltr rendszer hasznlata esetn tbbfle nyelvtan megtanulsra lehet szksg.

Nem kulcsmezkn vgzett FULL OUTER JOIN mvelet


Mindezidig az OUTER JOIN utastsok trgyalsa sorn csak olyan eseteket vizsgltunk, ahol az OUTER JOIN-nal a tblkat vagy eredmnyhalmazokat egymssal kapcsolatban lv kulcsmezk alapjn kapcsoltuk egymshoz. Ugyanakkor nhny rdekes problma megoldsa sorn az OUTER JOIN mveletet nem kulcsmezkn hajtjuk vgre. Pldul az elz fejezetben lthattuk, hogy miknt lehet a School Scheduling adatbzis azonos keresztnev hallgatit s tanrait megtallni. Ttelezzk fel, hogy ezttal ki akarjuk ratni az sszes hallgatt s az sszes tanrt, megmutatva azokat, akiknek azonos a keresztne vk. Ez a feladat a FULL OUTER JOIN utastssal vgezhet el. Mutasd meg az sszes hallgatt, az sszes tanrt, s rd ki azokat, akiknek azonos a keresztnevk!" Fordts - Select student full name and staff full name from the students table full outer joined with the staff table on first name in the students table matches first name in the staff table (Vlaszd ki a hallgatk teljes nevt s a tanrok teljes nevt a hallgatk adatbzisbl, amelyet FULL OUTER JOIN-nal sszekapcsoltunk a tanrok tbljval, a hallgatk vezetknevt megfeleltetve a tanrok vezetkne vnek.) Tisztzs - Select student full name and staff full name from the students table

full outer joined with the staff table on students.first name in the students table matches = staff.first name in the staff table

SQL

SELECT (Students.StudFirstName || ' ' || Students.StudLastName) AS StudFullName, (Staff.StfFirstName || ' ' || Staff.StfLastName) AS StfFullName FROM Students FULL OUTER JOIN Staff ON Students.StudFirstName Staff.StfFirstName

A UNION JOIN
Az OUTERJOIN utastsok trgyalsa nem lenne teljes, ha a UNION JOIN utastst legalbb egyszer nem emltennk meg. Az SQL-szabvny szerint a UNION JOIN utasts tulajdon kppen egy olyan FULL OUTERJOIN, amelynek az eredmnybl a megfeleltetett sorokat

elhagyjuk. Az utastsformt a 9.14. bra mutatja. Mint ahogy arra szmtani lehet, nem sok kereskedelmi SQL-megvalsts tmogatja a UNION JOIN utastst. Hogy szintk legynk, megoldhatatlan problma volt szmunkra a UNION JOIN utasts hasznlatra megfelel indokot tallni.

Az OUTER JOIN hasznlatnak terletei


Minthogy az OUTER JOIN utastsok nem csak azokat a sorokat mutatjk meg, amelyeknek megtalljk a megfeleljt, hanem azokat is, amelyeknek nem, jl hasznlhatak azoknak a soroknak a fellelsre, amelyeknek nincs megfeleltethet prjuk a msik tblban mr ha egyltaln van ilyen sor. Jk olyankor is, amikor a keresett soroknak van ugyan megfe leljk nhny egyb oszlopban, de nem mindben. Ezen fell hasznunkra vannak akkor, amikor olyan jelentshez gyjtnk anyagot, amelyben meg szeretnnk jelenteni az sszes termkcsoportot (arra val tekintet nlkl, hogy lteznek-e ezekhez kapcsold sorok

a tbbi tblban), vagy az sszes vsrlt (arra val tekintet nlkl, hogy a vsrl valaha is adott-e fel rendelst). Kvetkezzk pr plda az OUTER JOIN utastsok valamelyikvel megoldhat esetekre.

Hinyz rtkek megtallsa


Elfordul, hogy arra vagyunk kvncsiak, hogy mi hinyzik. gy tallhatjuk meg a hinyz adatokat, hogy egy OUTER JOIN utastssal a Null rtkre keresnk. me nhny hinyz rtkekkel kapcsolatos gyakorlfeladat: Melyek azok a termkek, amelyekre soha nem rkezett rendels?" Mutasd meg azokat a vsrlkat, akik sosem rendeltek buksisakot! Sorold fel azokat az eladkat, akiket mg sehov sem hvtak szerepelni! ,,Jelentsd meg azokat az gynkket, akik mg egy eladnknak sem szereztek munkt! Mutasd meg azokat a tornkat, amelyen mg nem jtszottak mrkzst! ,,rd ki a kar azon tagjait, akik nem vgeznek tantsi tevkenysget! ,,Jelentsd meg azokat a hallgatkat, akik mg sohasem adtak le rt! Mutasd meg azokat az rkat, amelyeket senki nem vettjel! Sorold fel az eddig egy receptben sem emltett hozzvalkat! Jelentsd meg a hinyz recepttpusokat!

Rszlegesen megfeleltetett informci megtallsa


F1eg jelentsek ksztsekor jhet jl egy vagy tbb tbla sszes sornak kiratsa a kapcsold tblk megfeleltetett soraival egytt. me nhny rszlegesen megfeleltetett informcival kapcsolatos, OUTER JOIN utastssal megoldhat feladat: Sorolj fel minden rendelst, az idpontjval s a termkkel egytt! ,,Jelentsd meg az sszes vsrlt s minden kerkprrendelst! Mutasd meg az sszes mvszeti stlust a stlust kedvel megrendelkkel! rd ki az sszes eladt s minden lekttt fellpsket! ,,rd ki az sszes jtkost s azokat a meccseket, ahol 160-nl tbbet gurtottak! ,,Jelentsd meg az sszes tornt s minden lejtszott mrkzst! Mutasd meg az sszes tantrgycsoportot s az sszes trgy minden rjt! Sorold fel az sszes hallgatt s minden rt, amit eddigfelvettek! ,,Jelentsd meg az sszes kart s az ltaluk tartott rkat! Sorold fel az sszes recepttpust s az rintett hozzvalkat! Mutasd meg az sszes hozzvalt s minden receptet, amelyhez kellenek!

Pldk
Mostanra mr ismerjk az OUTER JOIN utastst tartalmaz lekrdezsek megalkotsnak mikntjt, s lttunk nhny OUTER JOIN-nal megvlaszolhat krdstpust is. Tekintsnk t nhny jellemz pldt, amelyek mindegyikben OUTER JOIN utastst hasznlunk. Ezekben a gyakorlatokban mintaadatbzisaink mindegyike elkerl, mikzben hinyz vagy rszlegesen megfeleltetett rtkeket igyeksznk fellelni. Az SQL kd utn rgtn bemutatjuk a kd ltal visszaadott eredmnyhalmaz-mintt. Az a nv, amely megelzi az eredmnyhalmazt, megegyezik a CD-mellkleten lv minta adatokon lefuttathat lekrdezsvel. Minden lekrdezst a hozz tartoz mintaadatbzis ban troltunk (ahogy a pldban jeleztk), s az ehhez a fejezethez tartoz lekrdezsek neve el CH09-et rtunk. A knyv bevezetjben tallhat utastsokat kvetve betlthetjk s kiprblhatjuk a mintkat. Lvn, hogy a kvetkez pldk kzl sok sszetett JOIN utastsokkal dolgozik, az adatbzisrendszernk optimalizlja klnbzkppen dolgozhatja fel a lekrdezseket. Ebbl kifolylag az eredmnyek els nhny sora eltr het a megadottl, ugyanakkor a sorok szmnak meg kell egyeznie vele. A szoksos Fordts" s Tisztzs rszeket az egyszersget szem eltt tartva a kvetkez pldk mindegyiknl egyestettk.

Sales Orders adatbzis


Melyek azok a termkek, amelyekre soha nem rkezett rendels? Fordts/ - Select product number and product name from the products Tisztzs table left outer joined with the order details table on products.product number in the products table matches = order_details .product number in the order details table where the order detail order number is null SQL SELECT Products.ProductNumber,

Products.ProductName FROM Products LEFT OUTER JOIN Order_Details ON Products.ProductNumber = Order_Details.ProductNumber WHERE Order_Details.OrderNumber IS NULL

Jelentsd meg az sszes vsrlt s minden kerkprrendelst! Fordts 1. - Select customer full name, order date, product name, quantity ordered, and quoted price from the customers table left outer joined with the orders table on customer ID, then joined with the order details table on order number, then joined with the products table on product number, then finally joined with the categories table on category ID where category description is 'Bikes' (Vlaszd ki azoknak a vsrlknak a teljes nevt, a rendelsk dtumt, a termk nevt, a megrendelt mennyisget s az rat a vsrlk tbljbl amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a rendelsek tbljval a vsrlazonost alapjn, majd ezt sszekapcsoltuk a rendelsek rszlete it tartalmaz tblval a rendelsszm alapjn, majd ezt sszekapcsoltuk a termkek tbljval a termkszm alapjn, s vgl ezt sszekapcsoltuk a termkcsoportok tbljval a termkcsoport-azonost alapjn-, akiknl a termkcsoport lersa kerkprok.) Fordts 2/ - Select customer full name, order date, product name, quantity Tisztzs ordered, and quoted price from the customers table left outer joined with (Select customer ID, order date, product name, quantity ordered, and quoted price from the orders table
inner joined with the order details table on orders.order number

in the orders table matches = order_details .order number in the order details table,

then joined with the products table on order_details.product number in the order details table matches = products.product number in the products table, then finally joined with the categories table on categories.category ID in the categories table matches = products.category ID in the products table where category description is = 'Bikes') as rd on customers.customer ID in the customers table matches = rd.customerID in the embedded SELECT statement Minthogy csak bizonyos rendelsekre (a kerkprokra) vagyunk kvncsiak, a fordtsi folyamatot kt rszre szedtk, gy kiemelve azt, hogy a rendelseket az OUTER JOIN mvelet alkalmazsa eltt kell szrnnk. SQL

SELECT Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, RD.OrderDate, RD.ProductName, RD.QuantityOrdered, RD.QuotedPrice

FROM Customers LEFT OUTER JOIN (SELECT Orders.CustomerID, Orders.OrderDate, Products.ProductName, Order_Details.QuantityOrdered, Order_Details.QuotedPrice FROM ((Orders INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Order_Details.ProductNumber Products.ProductNumber) INNER JOIN Categories ON Categories.CategoryID = Products.CategoryID WHERE Categories.CategoryDescription = 'Bikes') AS RD ON Customers.CustomerID - RD.CustomerID

Ez a lekrdezs meglehetsen cseles, hiszen az sszes vsrlra szeret nnk az OUTER JOIN mveletet alkalmazni a kerkprrendelsek te kintetben. Ha a ''Fordts 1''-bl rnnk SQL kdot, akkor nem tallnnk meg azokat a vsrlkat, akik nem rendeltek kerkprt. A Customers s az Orders tblkon elvgzett OUTER JOIN visszaadja az sszes vsrlt s minden rendelst. Amikor azonban kibvtjk a lekrdezst a kerkprrendelsekre vonatkoz szrfelttellel, mr csak a kerkprt rendel vsrlkat fogjuk megkapni.

A Fordts 2" bemutatja a helyes mdszert: ltrehozunk egy bels eredmnyhalmazt ami csak a kerkprrendelseket tartalmazza -, majd ezt egyestjk egy OUTER JOIN utastst hasznlva a Customers tblval, hogy kinyerjk a vgs eredmnyt. (gy ltszik, hogy William Thompson igazn remek gyfl!)

Entertainment Agency adatbzis


Sorold fel azokat az eladkat, akiket mg sehov sem hvtak szerepelni! Fordts/ - Select entertainer ID and entertainer stage name Tisztzs from the entertainers table left outer joined with the engagements table on entertainers.entertainer ID in the entertainers table matches = engagements.entertainer ID in the engagements table
where engagement number is null

SQL

SELECT Entertainers.EntertainerID, Entertainers.EntStageName FROM Entertainers LEFT OUTER JOIN Engagements ON Entertainers.EntertainerID Engagements.EntertainerID WHERE Engagements.EngagementNumber IS NULL

Mutasd meg az sszes mvszeti stlust a stlust kedvel megrendelkkel Fordts/ - Select style ID, style name, customer ID, customer first name, Tisztzs and customer last name from the musical styles table
left outer joined with

(the musical preferences table inner joined with the customers table on musical_preferences.customer ID in the musical preferences table matches = customers.customer ID in the customers table) on musical_styles.style ID in the musical styles table matches = musical_preferences.style ID in the musical preferences table SQL

SELECT Musical_Styles.StyleID, Musical_Styles.StyleName, Customers.CustomerID, Customers.CustFirstName,

Customers.CustLastName FROM Musical_Styles LEFT OUTER JOIN (Musical_Preferences INNER JOIN Customers ON Musical_Preferences.CustomerID = Customers.CustomerID) ON Musical_Styles.StyleID = Musical_Preferences.StyleID

(Ezek szerint senki nem szereti az tvenes vek zenjt...) A FROM zradkot meglehets odafigyelssel fogalmaztuk meg. Igye keztnk gy befolysolni az adatbzisrendszert, hogy elszr hajtsa vgre a Musical_Preferences s a Customers tblk kztti INNER JOIN mveletet, s csak ezt kveten jjjn a kapott eredmny s a Musical_Styles tbla kztti OUTER JOIN. Ha az adatbzisrendszernk hajlamos a JOIN utastsokat balrl jobbra haladva feldol gozni, esetleg rdemes az INNER JOIN utastst tartalmaz FROM zradkot elsknt a Musical_Styles tblval vgzett RIGHT OUTERJOIN mveletnek kvetnie. A Microsoft Office Accessben a helyes vlaszt csak akkor kapjuk meg, ha az INNER JOIN utastst be gyazott SELECT-knt hasznljuk.

School Scheduling adatbzis


rd ki a kar azon tagjait, akik nem vgeznek tantsi tevkenysget!" Fordts/ - Select staff first name and staff last name Tisztzs from the staff table left outer joined with the faculty classes table on staff.staff ID in the staff table matches = faculty_classes.staff ID in the faculty classes table where class ID is null

SQL

SELECT Staff.StfFirstName, Staff.StfLastName, FROM Staff LEFT OUTER JOIN Faculty_Classes ON Staff.StaffID = Faculty_Classes.StaffID WHERE Faculty_Classes.ClassID IS NULL

,,Jelentsd meg azokat a hallgatkat, akik mg sohasem adtak le rt! Fordts/ - Select student full name Tisztzs from the students table left outer joined with (Select student ID from the student schedules table inner joined with the student class status table on student_dass_status.class status in the student class status table matches = student_schedules.class status in the student schedules table where class status description is = 'withdrew') as withdrew on students.student ID in the students table matches = withdrew.student ID in the embedded Select statement where the student_schedules.student ID in the student schedules table is null
SQL

SELECT Students.StudLastName || ', ' || Students.StudFirstName AS StudFullName FROM Students LEFT OUTER JOIN (SELECT Student_Schedules.StudentlD FROM Student_Class_Status INNER JOIN Student_Schedules ON Student_Class_Status.ClassStatus = Student_Schedules.ClassStatus WHERE Student_Class_Status.ClassStatus Description = 'withdrew') AS Withdrew ON Students.StudentID = Withdrew.StudentID WHERE Withdrew.StudentID IS NULL

Mutasd meg az sszes trgycsoportot s az sszes trgy minden rjt! Fordts/ - Select category description, subject name, classroom ID, Tisztzs start time, and duration from the categories table left outer joined with the subjects table on categories.category ID in the categories table matches = subjects.category ID in the subjects table, then left outer joined with the classes table on subjects .subject ID in the subjects table matches = classes.subject ID in the classes table
SQL

SELECT Categories.CategoryDescription, Subjects.SubjectName, Classes.ClassroomID, Classes.StartTime, Classes.Duration FROM (Categories LEFT OUTER JOIN Subjects ON Categories.CategoryID = Subjects.CategoryID) LEFT OUTER JOIN Classes ON Subjects.SubjectID = Classes.SubjectID
Az egymsba gyazsok sorrendjnek megllaptsakor most is igen figyelmesen jrtunk el, hogy a vrt eredmnyt kapjuk.

Az eredmnyhalmaz tovbbi rszben ltni fogjuk, hogy a Developing a Feasibility Plan, a Computer Programming, s az American Government trgyakhoz egyelre nem tarto zik ra. Azt is megfigyelhetjk, hogy a Psychology, a French s a German trgycsoportok ban mg nincsenek trgyak.

Bowling League adatbzis


Mutasd meg a le nem jtszott tornkat!
Fordts/ - Select tourney ID, tourney date, Tisztzs from the tournaments table
left outer joined on tournaments.tourney
and tourney location

with the tourney matches table ID in the tournaments table matches = tourney_matches.tourney ID in the tourney matches table where match ID is null

SQL

SELECT Tournaments.TourneyID, Tournaments.TourneyDate, Tournaments.TourneyLocation FROM Tournaments LEFT OUTER JOIN Tourney_Matches ON Tournaments.TourneyID = Tourney_Matches.TourneyID WHERE Tourney_Matches.MatchID IS NULL

Sorold fel az sszes jtkost, s azokat a jtkokat, ahol 180 felett gurtottak!
Fordts 1. - Select bowler name, tourney date, tourney location,match ID, and raw score from the bowlers table left outer joined with the bowler scores table on bowler ID, then inner joined with the tourney matches table on match ID, then finally inner joined with the tournaments table on tournament ID where raw score in the bowler scores table is greater than 180 (Vlaszd ki a jtkosok nevt, a torna dtumt, a torna helyt, a mrkzs azonostt s a tiszta pontszmot a jtkosok tbljbl, amelyet LEFT OUTER JOIN-nal sszekapcsoltunk a jtkosok eredmnyeit tartalmaz tb lval a jtkosazonost alapjn, majd ezt INNER JOIN-nal sszekapcsoltuk a tornk mrkzseit tartalmaz tblval a mrkzsazonost alapjn, vgl ezt INNER JOIN-nal sszekapcsoltuk a tornk tbljval a tornaazono st alapjn, ahol a jtkosok eredmnyeit trol tblban a tiszta pontszm 180-nl magasabb.) Ltjuk, hogy az elz fordts mirt nem fog mkdni? A LEFT JOIN jobb oldaln lv tblk egyikn kell szrst vgezni, gy aztn a szrst egy begyazott SELECT utastsban kell elhelyezni. Gondoljuk t jra a fordtst, aztn kvetkezhet a tisztzs s vgl a problma megoldsa. Fordts 2./ - Select bowler name, tourney date, tourney location, Tisztzs match ID, and raw score

the bowlers table left outer joined with the (Select tourney date, tourney location, match ID, bowler ID, and raw score from the bowler scores table inner joined with the tourney matches table on bowler_scores.match ID in the bowler scores table matches = tourney_matches.match ID in the tourney matches table, then inner joined with the tournaments table on tournaments.tournament ID in the tournaments table matches = tourney_ matches.tournament ID in the tourney matches table where raw score is greater than >180) as ti on bowlers.bowler ID in the bowlers table matches = ti.bowler ID in the embedded SELECT statement
from

SQL

SELECT Bowlers.BowlerLastName || ', ' || Bowlers.BowlerFirstName AS BowlerName, TI.TourneyDate, TI.TourneyLocation, TI.MatchID, TI.RawScore FROM Bowlers LEFT OUTER JOIN

(SELECT Tournaments.TourneyDate, Tournaments.TourneyLocation, Bowler_Scores.MatchID, Bowler_Scores.BowlerID, Bowler_Scores.RawScore FROM (Bowler_Scores INNER JOIN Tourney_Matches ON Bowler_Scores.MatchID = Tourney_Matches.MatchID) INNER JOIN Tournaments ON Tournaments.TourneyID = Tourney_Matches.TourneyID WHERE Bowler_Scores.RawScore > 180) AS TI ON Bowlers.BowlerID = TI.BowlerID

Igen, ez ismt olyan plda, ahol elszr kell megalkotni a megszrt, INNER JOIN mveletet kvn eredmnyhalmazt, s csak ez utn kvetkezhet az OUTER JOIN mvelet, amely majd elvgzi az sszekapcsolst azzal a tblval, amelyikbl az sszes sor kell.

Recipes adatbzis
Mutasd meg az eddig egy receptben sem emltett hozzvalkat!
Fordts/ - Select ingredient name from the ingredients table Tisztzs left outer joined with the recipe ingredients table

ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table where recipe ID is null
SQL

on ingredients.ingredient

SELECT Ingredients.IngredientName FROM Ingredients LEFT OUTER JOIN Recipe_Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID WHERE Recipe_Ingredients.RecipeID IS NULL

Sorold fel az adatbzisban trolt sszes recepttpust, valamint az sszes recept cmt, a hozzjuk tartoz hozzval-sorszmokat, a hozzvalk mennyisgt, a hozzvalk mrtkegysgeit s vgl az sszes hozzvalnevet! Fordts/ - Select the recipe class description, recipe title, Tisztzs ingredient name,recipe sequence number, amount, and measurement description from the recipe classes table full outer joined with the recipes table on recipe_classes.recipe class ID in the recipe classes table matches = recipes.recipe class ID in the recipes table, then left outer joined with the recipe ingredients table on recipes.recipe ID in the recipes table matches = recipe_ingredients.recipe ID in the recipe ingredients table, then inner joined with the measurements table

on measurements.measurement amount

ID in the measurements table matches = recipe_ ingredients.measurement amount ID in the recipe ingredients table, and then finally full outer joined with the ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ ingredients.ingredient ID in the recipe ingredients table

SQL

SELECT Recipe_Classes.RecipeClassDescription, Recipes.RecipeTitle, Ingredients.IngredientName, Recipe_Ingredients.RecipeSeqNo, Recipe_Ingredients.Amount, Measurements.MeasurementDescription FROM (((Recipe_Classes FULL OUTER JOIN Recipes ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID) LEFT OUTER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Measurements ON Measurements.MeasureAmountID = Recipe_Ingredients.MeasureAmountID) FULL OUTER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID ON Recipe_Classes.RecipeClassID = Recipes.RecipeClassID

Ez volt az a feladat, amelyet a FULL OUTER JOIN utastsrl szl rszben mr megoldottunk. Azt a dntst, hogy itt is szerepeltetjk, az indokolja, hogy gy lthatjuk az eredmnyt is. A lekrdezst nem talljuk meg a CD-n lv mintaadatbzisok kztt, sem a Microsoft Access, sem a MySQL rsznl, lvn egyik termk sem tmogatja a FULL OUTER JOIN mveletet. A FULL OUTER JOIN-on alapul megolds helyett a CD-re a kt OUTER JOIN mveleten, illetve ezek UNION utastssal trtn sszekapcsolsn alapul, az elzvel azonos eredmnyt hoz megolds kerlt. A UNION hasznlatrl a kvetkez fejezetben fogunk tanulni. Az itt bemutatott ered mny a lekrdezs Microsoft SQL Serveren trtn futtatsbl szrmazik.

sszefoglals
Ebben a fejezetben ttekintettk az OUTER JOIN utastsok vilgt. Kezdetnek megadtunk egy OUTER JOIN-t tartalmaz mveletet, majd sszehasonltottuk a 8. fejezetben megismert INNER JOIN-nal. Ezt kveten megtanultuk, hogy miknt lehet egyszer, kt tblt haszn l LEFT, illetve RIGHT OUTER JOIN utastst tartalmaz lekrdezseket s bonyolultabb, begyazott SELECT utastsokat alkotni, hogy aztn tbb JOIN mveletet felhasznl kifeje zsekkel folytathassuk. Megmutattuk, hogy a Null rtkre trtn keresssel prostott OUTER JOIN azonos eredmnyt ad a 7. fejezetben megismert, klnbsgkpzsre haszn latos EXCEPT mvelettel. Megvizsgltunk nhny olyan nehzsget, amellyel a tbb OUTER JOIN utastst tartalmaz lekrdezsek rsa sorn tallkozhatunk. A LEFT s a RIGHT OUTER JOIN utastsok megismerst egy olyan, tbb OUTER JOIN mveletet ignyl problma felvetsvel zrtuk, ami nem oldhat meg, ha csak a LEFT vagy a RIGHT OUTER JOIN-t hasznlhatjuk A FULL OUTER JOIN utastst trgyalva megmutattuk, hogy ezt a sszekapcsolsi tpust tovbbi INNER JOIN s OUTER JOIN utastsokkal kiegsztve miknt kaphatunk helyes vlaszt az elz problmra. Rviden kitrtnk a FULL OUTER JOIN egy vltozatra, a UNION JOIN utastsra, s nhny, ilyen mvelettel megvlaszolhat krds segtsg vel bemutattuk a felhasznlsi lehetsgeit. A fejezet fennmarad rszben kzel egy tucat pldt lthattunk az OUTERJOIN utasts hasznlatra. Adtunk pr pldt minden mintaadatbzisunkkal kapcsolatban, hogy lssuk a feltett krdsek megvlaszolsra alkalmas kifejezsek mgtt megbv gondolatmenetet. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis


1. Mutasd meg azokat a vsrlkat, akik sohasem rendeltek buksisakot! (Tipp: ez megint olyan krds, amelyhez elbb egy INNER JOIN mvelet szksges, amivel megtalljuk az sszes buksisak-rendelst, majd OUTER JOIN mveletet hajtunk vgre a vsrlkra vonatkozlag.) A megolds itt tallhat: CH09_Customers_No_Helmets (2 sor). 2. ,,Jelentsd meg azokat a vsrlkat, akikkel azonos irnytszm alatt nincs rtkestnk!" A megolds itt tallhat: CH09_Customers_No_Rep_Same_Zip (18 sor). 3. Sorolj fel minden rendelst, a dtumval s a termkkel egytt! A megolds itt tallhat: CH09_All_Products_Any_Order_Dates (2682 sor).

Entertainment Agency adatbzis


,,Jelentsd meg azokat az gynkket, akik mg egy eladnknak sem szereztek munkt! A megolds itt tallhat: CH09_ Agents_No_Contracts (1 sor). 2. Mutasd meg azokat a megrendelket, akik mg nem ktttek le fellpst! A megolds itt tallhat: CH09_ Customers_No_Bookings (2 sor). 3. Sorold fel az sszes eladt s minden lekttt fellpsket! A megolds itt tallhat: CH09_ All_Entertainers_And_Any_Engagements (112 sor).
1.

School Scheduling adatbzis


1. Mutasd meg azokat az rkat, amelyeket senki nem vett fel!" (Tipp: csak azok a sorok kellenek hozz a Student_Classes tblbl, amelyekben enrolled, vagyis feliratkozott szerepel, a completed s a withdreW elvgezte vagy leadta sorok rdektelenek.) A megolds itt tallhat: CH09_ Classes_No_Students_Enrolled (63 sor) 2. Jelentsd meg azokat a trgyakat, amelyekhez nem tartozik szak! A megolds itt tallhat: CH09_ Subjects_No_Faculty (1 sor)

3. Jelentsd meg az sszes olyan hallgatt, aki mg nem vett fel egyetlen trgyat sem!"
(Tipp: elszr azokat a hallgatkat kell megkeresnnk, akik feliratkoztak (enrolled) valamilyen trgyra, majd azokat a hallgatkat, akik nincsenek benne ebben az eredmnyhalmazban.) A megolds itt tallhat: CH09_ Students_Not_Currently_Enrolled (2 sor)

4. ,,Jelentsd meg az sszes kan, s az ltaluk knlt trgyakat!''


A megolds itt tallhat: CH09_All_Faculty_And_Any_Classes (79 sor)

Bowling League adatbzis 1. ,,Jelentsd meg azokat a mrkzseket, amelyekrl mg nincs adat!" A megolds itt tallhat: CH09_ Matches_Not_Played_Yet (1 sor) 2. ,,Jelentsd meg a tornkat s a lejtszott mrkzseket!"
A megolds itt tallhat: CH09_ All_Tourneys_Match_Results (174 sor)

Recipes adatbzis 1. ,,Jelentsd meg a hinyz recepttpusokat!"


A megolds itt tallhat: CH09_Recipe_Classes_No_Recipes (1 sor) 2. Mutasd meg az sszes hozzvalt, s minden receptet, amelyikhez kellenek!" A megolds itt tallhat: CH09_All_Ingredients_Any_Recipes (108 sor)

3. "rd ki a salad, a soup s a main courses kategrikat s a bennk lv recepteket!"


A megolds itt tallhat: CH09_Salad_Soup_Main_Courses (9 sor)

4. Jelentsd meg az sszes receptosztlyt s a bennk lv recepteket!"


A megolds itt tallhat: CH09_ All_RecipesClasses_And_Matching_Recipes (16 sor)

Uni
Knyrgm azoknak, akiknek a jmborsga lehetv teszi, hogy tiltakozzanak, hogy imdkozzanak az unirt... " - Sam Houston, Texas llam hse

A fejezet tmakrei
Mi az a UNION? UNION utastst tartalmaz lekrdezsek A UNION utasts hasznlatnak terletei Pldk sszefoglals nll feladatok

A 7. fejezetben bevezettnk hrom alapvet halmazmveletet: a metszetkpzst, a klnbsgkpzst s az unit. A 8. fejezet megmutatta, hogy a metszetkpzssel azonos rtk mvelet gy is vgezhet, hogy a kulcsmezkn alapul INNER JOIN mvelettel kapcsoljuk ssze az eredmnyhalmazokat A 9. fejezet a halmazok klnbsgnek kpz st trgyalta az OUTER JOIN mvelet, illetve a Null rtkek megkeressnek segtsgvel. Ez a fejezet a harmadik mveletrl, az unirl szl.

Mi az a UNION?
A UNION (uni) utasts lehetv teszi, hogy kt vagy tbb hasonl eredmnyhalmazbl kivlasztott sorokat egyetlen eredmnyhalmazz egyestsnk. Hangslyozzuk, hogy nem oszlopokrl", hanem sorokrl van sz. A 8. s a 9. fejezetben megtanultuk kt vagy tbb eredmnyhalmaz oszlopainak JOIN mvelettel trtn sszeboronlst. A JOIN utasts az eredmnyhalmaz oszlopait egyms mell helyezi. Pldnak okrt, ha JOIN utastssal egyestjk a Recipe_Classes (Receptosztlyok) tbla RecipeClassDescription (Receptosztly lersa) mezjt s a Recipes (Receptek) tbla RecipeTitle (Receptcm) mezjt, az eredmny a 10.1. brhoz lesz hasonl.

10.1. bra Adatok kinyerse kt tblbl JOIN utastssal

Elszr is vessnk egy gyors pillantst egy egyszer, UNION-t tartalmaz utasts formjra, amit a 10.2. brn mutatunk be.

A UNION utasts egybeilleszti az egyik eredmnyhalmazbl szrmaz sorokat a msikbl szrmazkkal. Mindkt eredmnyhalmaz ltrehozsa olyan SELECT utastssal trtnik, amely azon fell, hogy a FROM zradkban sszetett JOIN utastst tartalmazhat, rendelkez het WHERE, HAVING, illetve GROUP BY zradkokkal is. Az elkszlt eredmnyhalmazo kat vgl a UNION kulcssz hasznlatval kapcsoljuk ssze. (A GROUP BY zradkkal a 13., a HAVING zradkkal pedig a 14. fejezetben foglalkozunk.) Ha a Recipe_Classes s a RecipeTitle tblk unijn lefuttatjuk a RecipeClassDescription mezben trolt rtkeket megjelent lekrdezst, akkor a 10.3. brn lthathoz hasonl vlaszt kapunk. Vegyk szre, hogy az eredmnyl kapott halmaz egyetlen oszlopbl ll. Az oszlop a nevt a SELECT utastsban szereplk kzl az elstl rkli, de tartalmaz adatot a RecipeTitle oszlopbl (Asparagus) csakgy, mint a RecipeClassesDescription oszlopbl (Dessert). A kt oszlop adatai azonban nem egyms mellett, hanem egyetlen oszlopban, egyms alatt jelen nek meg.

A 10.2. brt tanulmnyozva esetleg elgondolkodtunk az ALL kulcssz cljrl, amelyet az bra szerint nem ktelez hasznlnunk. Ezt a kulcsszt elhagyva az adatbzisrendszer a tbbszr elfordul rtkeket csak egyszer jelenti meg. Pldul ha a RecipeClass Description oszlopban s a RecipeTitle oszlopban egyarnt tallhat Dessert, akkor a vg s eredmnyhalmazba csak egyetlen Dessert rtket tartalmaz sor kerl. Amennyiben vi szont berjuk az utastsba az ALL kulcsszt, az sszes Dessert megjelenik. Ha belegondo lunk, a UNION ALL forma lnyegesen hatkonyabb lehet, mivel az adatbzisrendszer nem vgez tbbletmunkt a tbbszr szerepl rtkeket keresve. Ha bizonyosak vagyunk afe ll, hogy a UNION utastssal egyestett lekrdezseink nem tartalmaznak tbbszr elfor dul sorokat (vagy ezek nem zavarnak bennnket), akkor hasznljuk mindig az ALL kulcsszt. Ahhoz, hogy a UNION mvelet megtrtnhessen, a bemeneti eredmnyhalmazoknak meg kell felelnik nhny kvetelmnynek. Elszr is a UNION utastssal sszekapcsolt kt SELECT utastsban a SELECT utasts utn ugyanannyi oszlopnevet kell megadnunk, gy az eredmnyhalmaz is ugyanannyi oszloppal br majd. Msodszor, a megjellt oszlo poknak az SQL-szabvny szerint sszehasonlthatnak kell lennik.
A teljes SQL:2003-szabvny engedlyezi a UNION mvelet egymstl eltr oszlopokon val vgrehajtst is, a legtbb kereskedelmi SQLmegvalsts azonban csak az ltalunk is trgyalt alapvet, ms szval belp szint szabvnynak felel meg. Elfordulhat, hogy a UNION utastsnak ennl kreatvabb felhasznlst is tmogatja az adatbzisrendszernk.

Ahogy a 6. fejezetben trgyaltuk, szveges rtkeket csak szveges rtkekkel, szmokat csak szmokkal s dtumokat, illetve idrtkeket is csak egyez formtum adatokkal rdemes sszehasonltanunk. Br nhny adatbzisrendszer megengedi az adattpusok

keverst az sszehasonltsokon bell, nem sok rtelme van egy szveges rtket pldul a Jnos szt -, egy szmrtkkel - pldul az 55-tel - sszehasonltani. sszehason lthatnak akkor neveznk kt oszlopot, ha van rtelme a kt oszlopot WHERE zradkban sszehasonltani. Ezt jelenti az, hogy az SQL-szabvny megkveteli, hogy a UNION mvelet egyik bemeneti rtkhalmaznak sszehasonlthat adattpusnak kell lennie a msik be meneti rtkhalmazzal.

UNION utastst tartalmaz lekrdezsek


Az INNER JOIN-rl, illetve az OUTER JOIN-rl szl elz fejezetekben azt tanulmnyoz tuk, hogy miknt alkothatunk SELECT utastsokat a SELECT, FROM s WHERE zradkok felhasznlsval. A fejezetek kzppontjba a FROM zradkon belli sszetett JOIN utastsok kerltek. UNION mveletet tartalmaz utasts rsakor olyan SELECT kifejezst adunk meg, amely kt vagy tbb SELECT utastst egy UNION mvelettel kt ssze. Minden SELECT utastsnak lehet egyszer vagy sszetett FROM zradka, ahogy azt az elvgzend feladat megkvnja.

Egyszer SELECT utastsok hasznlata


Kezdjk azzal, hogy ellltjuk kt egyszer, a FROM zradkban egyetlen tblt hasznl SELECT utasts unijt A 10.4. bra kt egyszer SELECT utastson vgzett UNION mvelet szintaxisdiagramjt mutatja be.

A JOIN utaststl eltren itt minden a kt SELECT utastst sszekapcsol UNION mve leten bell trtnik. Ahogy korbban mr szltunk rla, ha az ALL kulcsszt elhagyjuk, az adatbzisrendszer minden tbbszr elfordul sorbl csak az elst hagyja meg. Ez azzal jrhat, hogy az eredmnyhalmaz esetleg a UNION utastsban szerepl bemeneti rtkhal mazok sorainak sszegnl kevesebb sorral fog brni. Ha viszont az ALL kulcsszt hasznl juk, az eredmnyhalmaz sorainak szma meg fog egyezni a UNION utastsban szerepl bemeneti rtkhalmazok sorainak sszegvel.

Az SQL-szabvny meghatroz egy CORRESPONDING nev zradkot is, amelyet a UNION kulcssz utn helyezve jelezhetjk, hogy a UNION mveletet a bemeneti rtkhalmazok egyforma nev oszlopait sszehasonltva kvnjuk elvgeztetni. Az sszehasonltst tovbb finomthatjuk, ha a CORRESPONDING kulcssz utn felsoroljuk az sszehasonltand oszlopok neveit. Br a nagyobb kereskedelmi SQLmegvalstsok kztt nem leltnk olyat, amely vgre tudn hajtani ezt a feladatot, a hasznlatunkban lv termk ksbbi vltozataiba esetleg bekerl majd a tmogatsa. Hozzunk ltre egy egyszer unit - olyan, a vsrlk s a beszlltk cmeit tartalmaz listt, amely a Sales Orders mintaadatbzison alapul majd. A 10.5. bra bemutatja a kt szksges tblt.

10.5. bra A Sales Orders mintaadatbzis Customers s Vendors tbli Vegyk szre, hogy nincs termszetes kapcsolat a kt tbla kztt, viszont mindkettben vannak hasonl rtelm s adattpus oszlopok. A cmlisthoz a nv, az utca s hzszm, a vros neve, az llam neve, illetve az irnytszm oszlopok kellenek. Minthogy ezek a mezk mindkt tblban sszehasonlthat mdon, szveges adatknt troldnak, az adattpusok miatt nem kell aggdnunk. (Nhny adatbzis-tervez az irnytszmokat szmknt troln, de ez nem jelent gondot, mr amennyiben a kt tbla irnytszmot tartalmaz oszlopai sszehasonlthat adattpusak.) Van azrt egy gondunk: mg a neveket a Vendors (Beszlltk) tblban egy oszlopban troljuk, addig a Customers (Vsrlk) tblban mr kt mezre vannak bontva a CustFirstName, illetve CustLastName (vagyis keresztnv s vezetknv) oszlopokra. Annak rdekben, hogy a kt tblbl azonos szm oszlopot tudjunk hasznlni, olyan kifejezst kell alkotnunk, amely a Customers tbla kt oszlopt egyestve, egy oszlopknt adja t a UNION mveletnek a Vendors tbla szintn egyetlen oszlopval egytt. Alkossuk meg ezt a lekrdezst! A fejezet sorn a 4. fejezetben bevezetett Krelem- Fordts Tisztzs- SQL" mdszert hasznljuk.

Kszts egy cmlistt, amely a vsrlk nevt, cmt, vrost, llamt s irny tszmt, valamint a beszlltk nevt, cmt, vrost, llamt s irnytszmt tartalmazza!" Fordts - Select customer full name, customer address, customer city, customer state, and customer ZIP Code from the customers table combined with vendor name, vendor address, vendor city, vendor state, and vendor ZIP Code from the vendors table (Vlaszd ki a vsrlk teljes nevt, cmt, vrost, llamt s irnytszmt a vsrlk tbljbl, s ezt egyestsd a beszlltk nevvel, cmvel, vro sval, llamval s irnytszmval a beszlltk tbljbl.) Tisztzs - Select customer full name, customer address, customer city, customer state, and customer ZIP Code from the customers table combined with union Select vendor name, vendor address, vendor city, vendor state, and vendor ZIP Code from the vendors table SQL SELECT Customers.CustLastName || ', ' ||

Customers.CustFirstName AS MailingName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION SELECT Vendors.VendName, Vendors.VendStreetAddress, Vendors.VendCity, Vendors.VendState, Vendors.VendZipCode FROM Vendors
Figyeljk meg, hogy mindkt SELECT utasts t oszlopot llt el, de a Customers tbla esetben kln kifejezst kellett hasznlnunk a kt nevet tartalmaz oszlop egyestsre. Mindkt SELECT utasts sszes oszlopa szveges adat, teht az sszehasonlthatsgukat illetleg nem tkztnk problmba. Esetleg elgondolkodunk azon, hogy mi lesz a lekrdezs futtatsa utn kapott oszlopok neve. J krds! Az SQL-szabvny meghatrozza, hogy amennyiben a megfelel oszlopok nevei azonosak (pldnak okrt az els SELECT utasts negyedik oszlopnak neve megegyezik a msodik SELECT utasts negyedik oszlopval), akkor a kimeneti oszlop neve egyezzen meg velk. Amennyiben az oszlopnevek eltrnek (mint az elzekben megalkotott pldnkban), akkor az SQL-szabvny a kvetkezkpp rendelkezik: "Ha a lekrdez kifejezs azonnali UNION vagy INTERSECT mveletet tartalmaz, s a megnyitott tblk megfelel oszlopnevei nem egyezek, akkor az eredmnyl kapott oszlop nevt a megvalsts hatrozza meg." Magyarn, az adatbzisrendszernk dnti el, hogy milyen nevet rendel a kimeneti oszlop hoz. Az adatbzisrendszernk akkor kveti az SQL-szabvnyt, ha a vlasztott nv nem szerepel az UNION mvelet ms bemeneti oszlopnak neveknt. A legtbb kereskedelmi

adatbzisrendszer alaprtelmezs szerint az els SQL-utastsban szerepl nevet adja az eredmnyoszlopnak. Az elz plda esetben teht MailingName, CustStreetAddress, CustCity, CustState, s CustZipCode oszlopokat fogunk ltni. szrevehetjk, hogy az ALL kulcsszt nem hasznltuk a UNION utastsban. Br valsz ntlen, hogy egy vsrl vezetk- s keresztneve megegyezik egy beszllt nevvel (a cmrl, vrosrl, llamrl s irnytszmrl most nem beszlnk), el akartuk kerlni a cmek tbbszri elfordulst. Ha biztosak vagyunk abban, hogy nem lesznek tbbszr elfordul rtkek a UNION mvelet bemeneti oszlopaiban, akkor hasznlhatjuk az ALL kulcsszt. Az ALL kulcssz minden valsznsg szerint felgyorstja a lekrdezs lefutst, hiszen ilyenkor az adatbzisrendszer nem vgez tbbletmunkt a tbbszri elfordulsok kikszblse rdekben.

sszetett SELECT utastsok egyestse


Ahogy gondolhatjuk, a UNION mvelettel sszekapcsolt SELECT utastsok olyan sszetet tek lehetnek, amennyire csak a feladat elvgzshez szksges. Az egyetlen megkts, hogy a SELECT utastsoknak vgs soron azonos szm oszlopot kell ellltaniuk, illetve a megfelel oszlopoknak sszehasonthat adattpusnak kell lennik Ttelezzk fel, hogy egy olyan listt szeretnnk, amelyben benne van az sszes vsrlnk, az ltaluk rendelt kerkprok, mindez egyestve az sszes beszlltval, illetve az ltaluk szlltott kerkprokkal. Elszr is keressk ki a szksges tblkat! A 10.6. bra a vsrlk s a termkek egymshoz rendelshez szksges tblkat mutatja. gy tnik, hogy ngy tblt kell JOIN mvelettel sszekapcsolnunk. Ha ltni szeretnnk a beszlltkat s az ltaluk rult kerkprokat, a 10.7. brn lthat tblkra van szksgnk

Ahogy a 8. fejezetben trgyaltuk, tbb JOIN zradkot is egymsba gyazhatunk, gy sszekapcsolhatjuk a tblinkat egy sszetett problma megoldshoz szksges adatok sszegyjtshez. Ha ismtlsre van szksgnk, a 10.8. tbla bemutatja a hrom tbla egymsba gyazsakor hasznlt utastsformt. Immr rendelkezsnkre ll az sszes ismeret a krds megvlaszolshoz. Megalkothatjuk az sszetett INNER JOIN mveletet, amely megadja a vsrlk adatait, beszrhatjuk a UNION kulcsszt, majd vgl megalkothatjuk a beszlltk adatainak kinyershez szksges sszetett INNER JOIN mveletet is. Sorold fel a vsrlkat s az ltaluk rendelt kerkprokat, egyestve a beszlltkkal s az ltaluk szlltott kerkprokkal! Fordts - Select customer full name and product name from the customers table joined with the orders table on customer ID in the customers table matches customer ID in the orders table, then joined with the order details table on order number in the orders table matches order number in the order details table, and then joined with the products table on product number in the products table matches product number in the order details table where product name contains 'bike', combined with select vendor name and product name from the vendors table joined with the product vendors table on vendor ID in the vendors table matches vendor ID in the product vendors table, and then joined with the products table on product number in the products table matches product number in the product vendors table where product name contains 'bike' (Vlaszd ki a vsrlk teljes nevt a vsrlk tbljbl, amelyet sszekap csoltunk a rendelsek tbljval a vsrlazonost alapjn, megfeleltetve a vsrlk tbljnak vsrlazonostit a rendelsek tbljban lev vsrl-

azonostknak, majd ezt sszekapcsoltuk a rendelsek rszleteit tartalmaz tblval a rendelsszm alapjn, a rendelsek tbljnak rendelsszmait megfeleltetve a rendelsek rszleteit tartalmaz tbla rendelsszmainak, majd ezt sszekapcsoltuk a termkek tbljval a termkszm alapjn, a ter mktbla termkszmait megfeleltetve a rendelsek rszleteit tartalmaz tb la termkszmainak, ahol a termk neve tartalmazza a kerkpr szt, majd mindennek vedd az unijt a beszllt nevt s a termk nevt a beszlltk tbljbl kivlaszt utastssal, amelyet sszekapcsoltunk a termkbeszll tk tbljval a beszlltazonost alapjn, a beszlltk tbljnak beszlltazonostit megfeleltetve a termkbeszlltk tbljban lev beszlltazonostknak, majd ezt sszekapcsoltuk a termkek tbljval a termkszm alapjn, a termkek tbljnak termkszmait megfeleltetne a termkbeszlltk tbljban lev termkszmoknak, ha a termk neve tartalmazza a kerkpr szt.) Tisztzs - Select customer full name and product name from the customers table joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table, then joined with the order details table on orders.order number in the orders table matches = order_details.order number in the order details table, and then joined with the products table on products.product number in the products table matches = order_details.product number in the order details table where product name contains like '%bike%', combined with union select vendor name and product name from the vendors table joined with the product vendors table on vendors.vendor ID in the vendors table matches = product_vendors.vendor ID in the product vendors table, and then joined with the products table on products.product number in the products table matches = product_vendors.product number in the product vendors table where product name contains like '%bike%' SQL SELECT Customers.CustLastName || ', ' ||

Customers.CustFirstName AS FullName, Products.ProductName, 'Customer' AS RowID FROM ((Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber =

Order_Details.ProductNumber WHERE Products.ProductName LIKE '%bike%' UNION SELECT Vendors.VendName, Products.ProductName, 'Vendor' AS RowID FROM (Vendors INNER JOIN Product_Vendors ON Vendors.VendorID = Product_Vendors.VendorID) INNER JOIN Products ON Products.ProductNumber = Product_Vendors.ProductNumber WHERE Products.ProductName LIKE '%bike%'
Ht, ez nem sokkal rvidebb a Rktrtnl, de legalbb elvgzi a teendt! Figyeljk meg, hogy bevezettnk egy RowID (sorazonost) nev azonostt mindkt SELECT utastsban, hogy knnyen elklnthessk a vsrlk, illetve a beszlltk kzl szrmaz sorokat. Ksztetst rezhetnk a DISTINCT kulcssz beszrsra az els SELECT utastsba, mond vn, hogy az igazn j gyfl egynl tbbszr is megrendelheti ugyanazt a kerkprmodellt. Minthogy nem hasznltuk az ALL kulcsszt az UNION utastsban, a lekrdezs eleve eltnteti a tbbszri elfordulsokat, gy ha beszrjuk a DISTINCT kulcsszt, arra krjk az adatbzisrendszert, hogy a tbbszri elfordulsokat kiszr tbbletmunkt ktszer is vgezze el. Ha UNION utastst tartalmaz lekrdezst kell alkotnunk, akkor rdemes elszr az egyes SELECT utastsokat megrnunk. Ennek vgeztvel knnyedn tmsolhatjuk a SELECT utastsokat az j lekrdezsbe, ahol a UNION kulcsszval vlasztjuk el azokat egymstl.

Tbb UNION mvelet hasznlata


Mindezidig csak annyit mutattunk meg, hogy kt rtkhalmaz miknt egyesthet a UNION utasts segtsgvel. Igazsg szerint a msodik SELECT utastst jabb UNION kulcssz kvetheti, majd ezt jabb SELECT utasts. Br nhny SQL-megvalsts korltoz za a UNION mveletekkel egyesthet rtkhalmazok szmt, elmletben addig bvthetjk a lekrdezsnket jabb UNION-okkal s SELECT-ekkel, ameddig csak kedvnk tartja. Ttelezzk fel, hogy hrom klnbz tblbl a Customers, az Employees s a Vendors tblkbl - kell cmlistt ksztennk, mondjuk karcsonyi dvzllapok cmzshez. Az ennek a listnak az elksztshez hasznlatos szintaxisdiagramot a 10.9. bra mutatja be.

10.9. bra Hrom tbla egyestse UNION utastssal Lthat, hogy kln SELECT utastssal nyerjk ki a neveket s a cmeket a Customers tblbl, ezt UNION utastssal egyestjk az Employees tbla hasonl adataival, s ezt is UNION mvelettel egyestjk a Vendors tblbl szrmaz nevekkel s cmekkel. (A folyamat egyszerstse vgett a Fordts s a Tisztzs rszeket ebben a pldban sszevontuk.) Ksztsd el a vsrlk, alkalmazottak s beszlltk cmlistjt! Fordts/ - Select customer full name, customer street address, customer Tisztzs city, customer state, and customer ZIP Code from the customers table combined with union
select employee full name, employee street address, employee city, employee state,

and employee ZIP Code

the employees table combined with union select vendor name, vendor street address, vendor city, vendor state, and vendor ZIP Code from the vendors table
from

SQL

SELECT Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION SELECT Employees.EmpFirstName || ' ' || Employees.EmpLastName AS EmpFullName, Employees.EmpStreetAddress, Employees.EmpCity, Employees.EmpState, Employees.EmpZipCode FROM Employees UNION SELECT Vendors.VendName, Vendors.VendStreetAddress, Vendors.VendCity, Vendors.VendState, Vendors.VendZipCode FROM Vendors

Termszetesen ha a cmlistt egy bizonyos vrosra, llamra, vagy irnytszm-tartomnyra szrni szeretnnk, megtehetjk, mgpedig gy, hogy megadunk egy WHERE zradkot, brmely vagy akr az sszes SELECT utasts rszeknt. Pldnak okrt, ha a vsrlk, alkalmazottak s beszlltk listjt csak egy bizonyos llamra vonatkozlag akarjuk elkszteni, akkor WHERE zradkot kell adnunk az sszes begyazott SELECT utastshoz. Alkalmazhatunk szrst egyetlen SELECT utastson is: pldul akkor, amikor a texasi beszlltk, az sszes vsrl s az sszes alkalmazott listjt ksztjk el.

Unik rendezse
Hogyan trtnik a UNION utasts eredmnyeknt kapottak rendezse? Sok adatbzis rendszer esetben azt tapasztalhatjuk, hogy az eredmnyhalmazban a kimeneti oszlopok egyszeren a bemeneti oszlopok rendezst kvetve jelennek meg, balrl jobbra. Pldul az imnti pldnkban szerepl, hrom tbla unijt megvalst lekrdezsnl a sorokban a rendezs alapja a nevek, kt azonos nvnl az utck s a hzszmok, s gy tovbb. Hogy a postsok se szomorkodjanak (s esetleg kedvezmnyt kapjunk a tmeges levlfel adskor), rendezzk a sorokat irnytszm szerint. Ez elvgezhet egy ORDER BY zradk hozzadsval, ha odafigyelnk arra, hogy a zradknak az utols SELECT utasts legvgn kell llnia. Az ORDER BY zradk ugyanis a UNION mvelettel kpzett eredmnyhalmazra, nem pedig a SELECT utasts kimenetre vonatkozik. A 10.10. bra bemutatja, hogy miknt hajthat vgre egy ilyen rendezs.

Ahogy a diagram mutatja, annyi UNION s SELECT utastst alkalmazunk az egyestend eredmnyhalmazok kinyerse vgett, amennyit csak akarunk, de az ORDER BY zradk nak az utasts vgn kell kvetkeznie. Felmerlhet a krds: Milyen oszlopnevet vagy oszlopszmot hasznljunk az ORDER BY zradkban? Ne feledjk, hogy a lekrdezs elz rszeinek egyttes rendezsrl van sz. Amint azt mr trgyaltuk, az oszlopnevek ugyan megvalstsfggek, a legtbb adatbzisrendszer mgis az els SELECT utasts sorn megadott oszlopneveket hasznlja. Megadhatjuk az oszlop sorszmt is; ilyenkor az els kimeneti oszlop kapja az 1-es szmot. Abban a lekrdezsben, amely a neveket, cmeket, vrosokat, llamokat s irnytsz mokat adja meg, az 5-s oszlopszm (az irnytszmok az tdik oszlopban vannak) megadsval rendezhetjk a kimenetet irnytszmok szerint. Rendezzk a cmlistt elllt lekrdezs eredmnyt mindkt mdon. me az oszlop neve szerinti rendezs helyes utastsformja: SQL

SELECT Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION SELECT Employees.EmpFirstName || ' ' || Employees.EmpLastName AS EmpFullName, Employees.EmpStreetAddress, Employees.EmpCity, Employees.EmpState, Employees.EmpZipCode FROM Employees UNION SELECT Vendors.VendName, Vendors.VendStreetAddress, Vendors.VendCity, Vendors.VendState, Vendors.VendZipCode FROM Vendors ORDER BY CustZipCode

Termszetesen abbl indulunk ki, hogy a kimenetben annak az oszlopnak a neve, amely alapjn rendezni akarunk, megegyezik az els SELECT utastsban megadott oszlopnvvel. Az oszlop sorszma alapjn megadott rendezsi felttel hasznlatt a kvetkez plda szemllteti: SQL

SELECT Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION SELECT Employees.EmpFirstName || ' ' || Employees.EmpLastName AS EmpFullName, Employees.EmpStreetAddress, Employees.EmpCity, Employees.EmpState, Employees.EmpZipCode FROM Employees UNION SELECT Vendors.VendName, Vendors.VendStreetAddress, Vendors.VendCity, Vendors.VendState, Vendors.VendZipCode FROM Vendors ORDER BY 5

A UNION utasts hasznlatnak terletei


A UNION utastst aligha fogjuk olyan sokszor hasznlni, mint az INNER JOIN-t vagy az OUTER JOIN-t. A UNION utastsnak leginkbb klnbz tblkbl szrmaz, kt vagy tbb hasonl eredmnyhalmaz egyestsekor fogjuk hasznt ltni. Br a UNION utastst lehet egyazon tblbl szrmaz kt eredmnyhalmaz egyestsre is hasznlni, az ilyen esetek rendszerint megoldhatk egy sszetettebb WHERE zradkot tartalmaz SELECT utastssal is. A Pldk cm rszben felvetnk pr ilyen problmt, hogy megmutassuk, hogyan oldhat meg a feladat hatkonyabban a WHERE zradkkal Kvetkezzen nhny olyan, a mintaadatbzisainkra vonatkoz krelem, amely a UNION utastssal fogalmazhat meg: Mutasd meg az sszes vsrl s beszllt nevt s cmt! Ksztsd el a kerkprt rendel s a buksisakat rendel vsrlk egyestett listjt!" (Ez is azoknak a krelmeknek az egyike, amelyet megfogalmazhatunk egy SELECT utastssal s egy sszetett WHERE zradkkal.) lltsd el a vsrlk s a beszlltk cmjegyzkt! rd ki a kerkprt rendel vsrlk s a kerkprt szllt beszlltk kzs listjt! Ksztsd el az gynkket s az eladkat egyest listt! lltsd el a kortrs zent kedvel megrendelk s a kortrs zent jtsz eladk kzs listjt!"

Mutasd meg a rajzbl 85 vagy tbb pontos tlagot elrt hallgatk s a 9-es vagy jobb minsts, rajzot tant kari oktatk kzs listjt!" " Talld meg azokat a jtkosokat, akik a Thunderbird Lanes plyn legalbb 155-s tiszta pontszmot rtek el, egyestve a listt a Bolero Lanes plyn legalbb 140-es tiszta pontszmot elrkkel! (Ez is olyan eset, ami megoldhat egy SELECT utastssal s egy sszetett WHERE zradkkal.)" "Sorold fel kzs listn a torna pratlan plyn indul mrkzseit, a csapatok neve it, a csapatkapitnyokat, valamint a pros plyn indul mrkzseket, a csapatok neveit s a csapatkapitnyokat!" "llts ssze szjegyzket az sszes receptnvbl s hozzvalbl!" ,,Jelents meg kzs listt az sszes hozzvalval s az alaprtelmezett mrtkegy sgeikkel, illetve a receptekben felhasznlt hozzvalkkal s az alaprtelmezett mrtkegysgeikkel!"

Pldk
Mostanra mr ismerjk a UNION utastst tartalmaz lekrdezsek megalkotsnak mikntjt, s lttunk nhny UNION-nal megvlaszolhat krdstpust is. Tekintsnk t nhny jellemz pldt, amelyek mindegyikben UNION utastst hasznlunk, s ame lyekben mintaadatbzisaink mindegyike elkerl! A pldk azt szemlltetik, hogy miknt egyesthetjk UNION mvelettel kt eredmnyhalmaz sorait. Az SQL kd utn rgtn bemutatjuk a kd ltal visszaadott eredmnyhalmaz-mintt. Az a nv, amely megelzi az eredmnyhalmazt, megegyezik a knyv CD-mellkletn lv mintaadatokon lefuttathat lekrdezs nevvel. Minden lekrdezst a hozz tartoz min taadatbzisban troltunk (ahogy a pldban jeleztk), s az ehhez a fejezethez tartoz le krdezsek neve el CH10-et rtunk. A knyv bevezetjben tallhat utastsokat kvet ve a szmtgpnkbe tlthetjk s kiprblhatjuk a mintkat. A szoksos Fordts" s Tisztzs" rszeket az egyszersg kedvrt a kvetkez pldk mindegyiknl sszevontuk.

Sales Orders adatbzis


Mutasd meg az sszes vsrl s alkalmazott nevt s cmt, minden elfordulsukat belertve, irnytszm szerint rendezve!" Fordts/ - Select customer first name, customer last name, Tisztzs customer street address, customer city, customer state, and customer ZIP Code from the customers table combined with union all Select employee first name, employee last name, employee street address, employee city,

employee state, from

and employee ZIP Code the employees table, order by ZIP Code

SQL

SELECT Customers.CustFirstName, Customers.CustLastName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION ALL SELECT Employees.EmpFirstName, Employees.EmpLastName, Employees.EmpStreetAddress, Employees.EmpCity, Employees.EmpState, Employees.EmpZipCode FROM Employees ORDER BY CustZipCode

(Kirk DeGrasse bizonyra vsrl s alkalmazott egyszemlyben.) Ksztsd el a kerkprt rendel s a buksisakot rendel vsrlk egyestett listjt! Fordts/ - Select customer first name, customer last name, Tisztzs and the constant 'Bike' from the customers table joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table, then joined with the order details table on orders.order number in the orders table matches

= order_details.order number in the order details table, and then joined with the products table on product number in the products table matches = order_details.product number in the order details table where product name contains like '%bike%,' combined with union Select customer first name, customer last name, and then constant 'Helmet' from the customers table joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table then joined with the order details table on orders.order number in the orders table matches = order_details.order number in the order details table, and then joined with the products table on product number in the products table matches = order_details.product number in the order details table where product name contains like '%helmet%'
SQL

SELECT Customers.CustFirstName, Customers.CustLastName, 'Bike' AS ProdType FROM ( (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%bike%' UNION SELECT Customers.CustFirstName, Customers.CustLastName, 'Helmet' AS ProdType FROM ((Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%helmet%'

Figyeljk meg, hogy ez is azoknak a feladatoknak az egyike, amelyek megoldhatk egy SELECT utastssal s egy lnyegesen sszetettebb WHERE zradkkal. A UNION utasts hasznlatnak egyetlen elnye, hogy lnyegesen egyszerbb egy tovbbi halmazazono st oszlop hozzadsa (esetnkben a ProdType oszloprl van sz) az eredmnyhalma zokhoz, amibl megllapthatjuk, hogy melyik vsrl melyik bemeneti halmazbl kerlt az eredmnyoszlopba. Ugyanakkor fontos lehet tudnunk, hogy a legtbb adatbzisrend szer a UNION mveletnl sokkal gyorsabban rtkeli ki a WHERE zradkokat mg azokban az esetekben is, amikor ez utbbi sszetett feltteleket tartalmaz. Lssuk ugyan ennek a feladatnak a megoldst WHERE zradkkal: SQL

SELECT DISTINCT Customers.CustFirstName, Customers.CustLastName FROM ((Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%bike%' OR Products.ProductName LIKE '%helmet%'

Lthatjuk, hogy a DISTINCT kulcssz szksges a tbbszr elfordul sorok kikszblshez, amennyiben nem UNION utastst haszn lunk. Ne feledjk, hogy a UNION utasts automatikusan eltvoltja a tbbszri elfordu lsokat, hacsak nem UNION ALL formban adjuk meg. A DISTINCT kulcssz hasznlata megengedett a UNION utastssal egytt is, de ilyenkor az adatbzisrendszernkkel a szksgesnl tbb munkt vgeztetnk el.

Entertainment Agency adatbzis Kszts egy az gynkket s eladkat egyest listt!"


Fordts/ - Select agent full name, and the constant 'Agent' Tisztzs from the agents table combined with union Select entertainer stage name, and the constant 'Entertainer' the entertainers table

from

SQL

SELECT Agents.AgtLastName || ', ' || Agents.AgtFirstName AS Name, 'Agent' AS Type FROM Agents UNION SELECT Entertainers.EntStageName, 'Entertainer' AS Type FROM Entertainers

School Scheduling adatbzis


Mutasd meg a rajzbl 85 vagy tbb pontos tlagot elrt hallgatk s a 9-es vagy jobb minsts, rajzot tant kari oktatk kzs listjt! Fordts/ - Select student first name aliased as FirstName, student last name Tisztzs aliased as LastName, and grade aliased as Score from the students table joined with the student schedules table on students.student ID in the students table matches = student_schedules.student ID in the student schedules table then joined with the student class status table on student_class_status.class status in the student class status table matches = student_schedules.class status in the student schedules table, then joined with the classes table on classes.class ID in the classes table matches = student_schedules.class ID in the student schedules table,
and then joined with the subjects table

ID in the subjects table matches = classes.subject ID in the classes table where class status description is = 'completed' and grade is greater than or equal to >= 85 and category ID is = 'ART' combined with union Select staff first name, staff last name, and proficiency rating aliased as Score from the staff table joined with the faculty subjects table on staff.staff ID in the staff table matches = faculty_subjects.staff ID in the faculty subjects table, and then joined with the subjects table on subjects.subject ID in the subjects table matches = faculty_subjects.subject ID in the faculty subjects table where proficiency rating is greater than > 8 and category ID is = 'ART'
SQL

on subjects.subject

SELECT Students.StudFirstName AS FirstName, Students.StudLastName AS LastName, Student_Schedules.Grade AS Score, 'Student' AS Type FROM (((Students INNER JOIN Student_Schedules ON Students.StudentID = Student_Schedules.StudentID) INNER JOIN Student_Class_Status ON Student_Class_Status.ClassStatus = Student_Schedules.ClassStatus) INNER JOIN Classes

ON Classes.ClassID = Student_Schedules.ClassID) INNER JOIN Subjects ON Subjects.SubjectID = Classes.SubjectID WHERE Student_Class_Status.ClassStatusDescription = 'Completed' AND Student , Schedules.Grade >= 85 AND Subjects.CategoryID = 'ART' UNION SELECT Staff.StfFirstName, Staff.StfLastName, Faculty_Subjects.ProficiencyRating AS Score, 'Faculty' AS Type FROM (Staff INNER JOIN Faculty_Subjects ON Staff.StaffID = Faculty_Subjects.StaffID) INNER JOIN Subjects ON Subjects.SubjectID = Faculty_Subjects.SubjectID WHERE Faculty_Subjects.ProficiencyRating > 8 AND Subjects.CategoryID = 'ART'

Bowling League adatbzis


Sorold fel kzs listn a torna pratlan plyn indul mrkzseit, a csapatok neve
it, a csapatkapitnyokat, valamint a pros plyn indul mrkzseket, a csapatok neveit s a csapatkapitnyokat!

Fordts/ - Select tourney location, tourney date, match ID, team name, Tisztzs captain name and the constant 'Odd Lane'
from

the tournaments table with the tourney matches table on tournaments.tourney ID in the tournaments table equals = tourney_matches.tourney ID in the tourney matches table,
joined

then joined with the teams table


on tourney_matches.odd lane team

ID in the tourney matches table equals = teams.team ID in the teams table, and then joined with the bowlers table on teams.captain ID in the teams table equals = bowlers.bowler ID in the bowlers table combined with union all Select tourney location, tourney date, match ID, team name, captain name and the constant 'Even Lane' from the tournaments table joined with the tourney matches table on tournaments.tourney ID in the tournaments table equals = tourney_matches.tourney ID in the tourney matches table, then joined with the teams table on tourney_matches.even lane team ID in the tourney matches table equals = teams.team ID in the teams table and then joined with the bowlers table on teams.captain ID in the teams table equals = bowlers.bowler ID in the bowlers table order by tourney date 2, and match ID 3
SQL

SELECT Tournaments.TourneyLocation, Tournaments.TourneyDate, Tourney_Matches.MatchID, Teams.TeamName, Bowlers.BowlerLastName || ' ' || Bowlers.BowlerFirstName AS Captain, 'Odd Lane' AS Lane FROM ((Tournaments INNER JOIN Tourney_Matches ON Tournaments.TourneyID = Tourney_Matches.TourneyID) INNER JOIN Teams ON Teams.TeamID = Tourney_Matches.OddLaneTeamID) INNER JOIN Bowlers ON Bowlers.BowlerID = Teams.CaptainID UNION ALL SELECT Tournaments.TourneyLocation, Tournaments.TourneyDate, Tourney_Matches.MatchID, Teams.TeamName, Bowlers.BowlerLastName || ' ' || Bowlers.BowlerFirstName AS Captain, 'Even Lane' AS Lane

FROM ((Tournaments INNER JOIN Tourney_Matches ON Tournaments.TourneyID = Tourney_Matches.TourneyID) INNER JOIN Teams ON Teams.TeamID = Tourney_Matches.EvenLaneTeamID) INNER JOIN Bowlers ON Bowlers.BowlerID = Teams.CaptainID ORDER BY 2, 3
Figyeljk meg, hogy a kt SELECT utasts szinte teljesen megegyezik! Az egyetlen klnb sg abban ll, hogy mg az els SELECT utasts a Tourney_Matches tblt a Teams tblval az OddLaneTeamID mez alapjn egyesti, addig a msik az egyestst EvenLaneTeamID mez alapjn vgzi. Azt is figyeljk meg, hogy a megolds sorn gy dntttnk, hogy az oszlopnevek (TourneyDate, illetve MatchID) helyett inkbb az oszlopok sorszma (m sodik, illetve harmadik oszlop) alapjn vgezzk a rendezst. Vgl megemltjk, hogy a UNION ALL forma hasznlata azrt jogos, mert egyik csapat sem jtszik nmaga ellen.

Recipes adatbzis
llts ssze szjegyzket az sszes receptnvbl s hozzvalbl!" Fordts/ - Select recipe class description and the constant 'Recipe Class' Tisztzs from the recipe classes table combined with u n i o n Select recipe title, and the constant 'Recipe'

from

the recipes table combined with union Select ingredient name, and the constant 'Ingredient' from the ingredients table

SQL

SELECT Recipe_Classes.RecipeClassDescription AS IndexName, 'Recipe Class' AS Type FROM Recipe_Classes UNION SELECT Recipes.RecipeTitle, 'Recipe' AS Type FROM Recipes UNION SELECT Ingredients.IngredientName, 'Ingredient' AS Type FROM Ingredients

sszefoglals
A fejezetet az uni mvelet rtelmezsvel kezdtk, s megmutattuk a klnbsget kt tbla JOIN utastssal trtn sszekapcsolsa, illetve az eredmnyhalmazok UNION utas tssal val egyestse kztt. Ez utn megtanultuk, hogy miknt alkothatjuk meg kt, azo nos tblbl oszlopokat megjelent SELECT utasts unijt. Megismertk az ALL kulcssz jelentsgt, megjegyezve, hogy vagy azokban az esetekben rdemes hasznlni, amikor tudjuk, hogy a lekrdezseinkben nem lesznek tbbszr elfordul rtkek, vagy akkor, amikor nem trdnk a tbbszr elfordul rtkekkel. Ezt kveten tovbblptnk az olyan sszetett SELECT utastsok egyestse fel, amelyek mindegyike JOIN mvelettel kapcsolt ssze tbb tblt, majd ismertettk, hogy miknt lehet egyesteni kettnl tbb eredmnyhalmazt a UNION utastssal. A UNION kulcsszt tartalmaz utastsok formj nak trgyalst az eredmny rendezsnek bemutatsval zrtuk.

Megvizsgltuk, hogy milyen esetekben van hasznunkra a UNION mvelet, s felvetettnk egy sor krdst, amelyek megvlaszolhatk a UNION utasts segtsgvel. A Pldk rsz nhny pldval szemlltette a UNION utasts hasznlatt a mintaadatbzisokon, hogy lssuk a feltett krdsek megvlaszolsra alkalmas kifejezsek mgtt megbv gondo latmenetet. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis 1. Sorold fel kzs listban azokat a vsrlkat, akik rendeltek buksisakot, azokkal
a beszlltkkal egytt, akik szlltanak buksisakot! (Tipp: kt sszetett, JOIN mveletet tartalmaz SELECT utastst kell a UNION kulcsszval sszekapcsolnunk.) A megolds itt tallhat: CHlO_Customer_Helmets_Vendor_Helmets (91 sor).

Entertainment Agency adatbzis 1. Kszts egy a vsrlkat s az eladkat egyest listt!


(Tipp: ahhoz, hogy mindkt SELECT utastsban azonos szm oszlop legyen, az egyik nvhez kln kifejezst kell rendelnnk.) A megolds itt tallhat: CHlO_Customers_UNION_Entertainers (28 sor). 2. lltsd el a kortrs zent kedvel megrendelk s a kortrs zent jtsz eladk kzs listjt! (Tipp: kt sszetett, JOIN mveletet tartalmaz SELECT utastst kell a UNION kulcsszval sszekapcsolnunk) A megolds itt tallhat: CHlO_Customers_Entertainers_Contemporary (5 sor).

School Scheduling adatbzis 1. Ksztsd el a hallgatk s a tanrok cmlistjt, irnytszm szerint rendezve!
(Tipp: prbljuk oszlopszmmal megadni a rendezsi felttelt.) A megolds itt tallhat: CHlO_Students_Staff_Mailing_List (45 sor)

Bowling League adatbzis 1. Talld meg azokat a jtkosokat, akik a Thunderbird Lanes plyn legalbb
155-s tiszta pontszmot rtek el, egyestve a listt a Bolero Lanes plyn legalbb 140-es tiszta pontszmot elrkkel! (Tipp: ez is olyan feladat, amely megoldhat egy SELECT utastssal s egy ssze tett WHERE zradkkal.) A UNION utastst hasznl megolds itt tallhat: CH10_Good_Bowlers_TBird_Bolero_UNION (129 sor) A WHERE utastst hasznl megolds itt tallhat: CH10_Good_Bowlers_TBird_Bolero_WHERE (35 sor) Prbljuk megindokolni, hogy mirt tr el az eredmny sorainak a szma az elz krds ktfle megoldsnl! (Tipp: az els lekrdezsben prblkozzunk a UNION utasts hasznlatval!)

Recipes adatbzis 1. ,,Jelents meg kzs listt az sszes hozzvalval s az alaprtelmezett mrtkegys
geikkel, illetve a receptekben felhasznlt hozzvalkkal s az alaprtelmezett mr tkegysgeikkel! (Tipp: a megoldshoz egy egyszer s egy sszetett JOIN utastsra lesz szksg.) A megolds itt tallhat: CH10_Ingredient_Recipe_Measurements (144 sor).

Allekrdezsek
Nem oldhatunk meg problmkat ugyanazzal a gondolkodsmddal, mint amivel ltrehoztuk ket. - Albert Einstein

A fejezet tmakrei
Mi az az allekrdezs? Allekrdezsek oszlopkifejezsknt Szrs allekrdezsekkel Az allekrdezsek hasznlati terletei Pldk sszefoglals nll feladatok

Az elz hrom fejezetben megmutattuk, hogyan dolgozzunk egynl tbb tblbl szrmaz adatokkal. Az sszes idig vett mdszer az informcik rszhalmaznak sszekapcsolsra sszpontostott egy vagy tbb oszlop s egy vagy tbb sor egy teljes tblbl, vagy egy a FROM zradkba gyazott lekrdezs. Ezenkvl felfedeztk a halmazok sszekapcsolst is a UNION mvelettel. Ebben a fejezetben megmutatjuk, hogyan lehet egy tblbl vagy lekrdezsbl egy oszlopot kinyerni s azt egy SELECT vagy WHERE rtkkifejezseknt felhasznlni. Kt fontos dolgot is meg kell tanulnunk ebben a fejezetben: 1. Az SQL-ben mindig tbb mdja van annak, hogy egy adott problmt megoldjunk. Olyannyira, hogy ez a fejezet korbban mr trgyalt feladatokra mutat jabb megoldsokat. 2. Olyan sszetett szrket alkothatunk, amelyek nem a FROM zradkban megadott tblkra tmaszkodnak. Ez nagyon fontos, mert a WHERE zradkban hasznlt allekrdezsek jelentik az egyetlen mdjt annak, hogy helyes szm vlaszsort kap junk, ha kapcsold tblk szrt tartalma alapjn akarjuk egy tbla sorait megkapni.

Ez a fejezet halad tmakrket trgyal, s felttelezi, hogy elolvastuk s megrtettk a 7, 8. s 9. fejezetet.

Mi az az allekrdezs?
Egyszeren fogalmazva, az allekrdezs (avagy alkrds) egy olyan SELECT-kifejezs, amelyet egy SELECT utasts valamelyik rszbe gyazunk be, gy kapva meg a teljes lekrdezst. Ebben a fejezetben pontosabban is meghatrozzuk az allekrdezseket, s megmutatjuk, hogyan lehet azokat a FROM zradkon kvl hasznlni. Az SQL-szabvny az allekrdezsek hrom tpust hatrozza meg: 1. Sorallekrdezs - olyan begyazott SELECT kifejezs, amely egynl tbb oszlopot s legfeljebb egy sort ad vissza. 2. Tbla-allekrdezs - olyan begyazott SELECT kifejezs, amely egy vagy tbb oszlopot s nulla vagy tbb sort ad vissza. 3. Skalris allekrdezs - olyan begyazott SELECT kifejezs, amely pontosan egy oszlopot s legfeljebb egy sort ad vissza.

Sorallekrdezsek
Alkottunk mr olyan lekrdezseket, amelyek egy SELECT utastst gyaztak be egy FROM zradkba, ami lehetv tette a sorok szrst mg azeltt, hogy az eredmnyt ms tblk kal vagy lekrdezsekkel egyestettk volna. (Ezt hvjk tbla-allekrdezsnek, ahogy azt hamarosan ltni fogjuk). A sorallekrdezs a SELECT utasts egy olyan klnleges formja, ami egynl tbb oszlopot, de csak egy sort ad vissza. Az SQL-szabvny szerint a sorallekrdezssel egy a szabvnyban sorrtkkonstruktornak nevezett dolgot hozhatunk ltre. A WHERE zradk ltrehozsakor ltalban olyan kere ssi felttelt adunk meg, amely az egyik tblnk valamelyik oszlopt hasonltja ssze vagy egy msik oszloppal, vagy egy adott literlis rtkkel. Az SQL-szabvny ugyanakkor megengedi, hogy olyan keressi felttelt alkossunk, ami tbb rtket egy logikai sorknt hasonlt ssze egy msik, szintn egy logikai sorknt kezelt rtkhalmazzal (kt sorrtkkonstruktort). Az sszehasonltand rtkek listjt vagy zrjelezett listaknt adhatjuk meg, vagy egy sorallekrdezssel nyernk ki egy sort valamelyik tblbl. Sajnos azonban ezt az utastsformt nem sok kereskedelmi forgalomban lv adatbziskezel tmogatja. Mirt is lehet hasznos a sorallekrdezs? Pldaknt vegynk egy Products (Termkek) nev tblt, amelyben kt kln mezben trolunk egy sszetett alkatrsz-azonostt. Az azonost els rsze (SKUClass) mondjuk az alkatrsz jellegre utal karaktereket tartalmaz, ami egy szmtgp-alkatrszeket gyrt gyfl esetben pldul CPU vagy DSK lehet, az azonost msodik rsze (SKUNumber) pedig a termk azonostja a termkcso porton bell. Tegyk fel, hogy az sszes DSK09775 vagy annl magasabb sszetett azonostj alkatrszre vagyunk kvncsiak. me egy plda, ami egy sorrtkkonstruktort hasznl WHERE zradkkal oldja meg a feladatot:

SQL

SELECT SKUClass, SKUNumber, ProductName FROM Products WHERE (SKUClass, SKUNumber) >= ('DSK', 9775)

Az elz WHERE zradk olyan sorokat kr le, amelyekben az SKUClass s az SKUNumber egyttese nagyobb, mint a DSK s a 9775 egyttese. Az albbi krelem ezzel egyenrtk: SQL

SELECT SKUClass, SKUNumber, ProductName FROM Products WHERE (SKUClass > 'DSK') OR ((SKUClass = 'DSK') AND (SKUNumber >= 9775))

Az sszehasonlts msodik felt lecserlhetnnk egy olyan SELECT utastsra, amely egy kt oszlopbl ll sort ad vissza - vagyis egy sorallekrdezsre (akr a WHERE zradkkal leszktve a vlaszt egy sorra). A legtbb adatbzis-kezel azonban nem tmogatja sem a sorrtkkonstruktorokat, sem a sorallekrdezseket, ezrt ebben a fejezetben tbb nem lesz rluk sz.

Tbla-allekrdezsek
lljunk meg egy pillanatra! Az elz hrom fejezetben nem volt mr sz rla, hogyan gyazhatunk be egy tbb sort s oszlopot visszaad SELECT kifejezst egy FROM zradkba? De bizony volt, becsempsztk! Mr az elz fejezetekben is hasznltunk tbla-allekrdezseket, hogy egy lekrdezs FROM zradkba sszetett eredmnyt rak hassunk. Most megltjuk, hogyan lehet egy tbla-allekrdezst az IN llts (prediktum) sszehasonlt rtkeinek forrsaknt hasznlni - ennek alapjait a 6. fejezetben tanultuk meg. Emellett megtanulunk mg egy pr olyan j sszehasonlt kulcsszt, amelyeket csak tbla-allekrdezsekben hasznlunk.

Skalris allekrdezsek
Arrl is sz lesz ebben a fejezetben, hogyan hasznlhatunk skalris allekrdezseket br hol, ahol egybknt rtkkifejezst hasznlnnk. A skalris allekrdezsek segtsgvel egy oszlopot vagy szmtott kifejezst kaphatunk egy olyan tblbl, amely nem felttle nl szerepel a f lekrdezs FROM zradkban. A skalris allekrdezs ltal visszaadott rtket a SELECT zradknak megadott oszloplistban vagy egy WHERE zradk sszeha sonlt rtkeknt is felhasznlhatjuk.

Allekrdezsek oszlopkifejezsknt
Az 5. fejezetben sokat tanultunk arrl, hogyan hasznlhatunk kifejezseket egy lekrdezs szmtott oszlopainak ltrehozshoz. Akkor nem mondtuk el, hogy a SELECT utasts egy klnleges fajtjt, az allekrdezst is hasznlhatjuk arra, hogy egy msik tblbl adatokat szerezznk, mg akkor is, ha az a tbla nem szerepel a FROM zradkban.

Utastsforma
Trjnk vissza az alapokhoz, s nzzk meg a 11.1. brn a SELECT utasts egyszer alakjt:

Egyszernek tnik, de valjban nem az, mert az rtkkifejezs akr igen sszetett is le het. Az rtkkifejezsek sszes lehetsges alkotelemt a 11.2. brn lthatjuk.

Az 5. fejezetben megmutattuk, hogyan lehet egyszer rtkkifejezseket kpezni literlis rtkekkel, Oszlophivatkozsok s fggvnyekkel. Vegyk szre, hogy mr a SELECT kifejezs is szerepel a listn. Eszerint a kzvetlenl a SELECT kulcssz utn ll kifejez sek listjban skalris allekrdezst is hasznlhatunk. Mint mr emltettk, a skalris

allekrdezs olyan SELECT kifejezs, amely pontosan egy oszlopot s nem tbb mint egy sort ad vissza. Ez gy is van rendjn, hiszen olyan helyre helyettestjk be, ahol ltalban egy oszlopnevet vagy egy egyetlen oszloppal visszatr kifejezst hasznlnnk. Ezen a ponton felmerlhet a krds: mire j ez? Az gy hasznlt allekrdezssel egy msik tblbl vagy lekrdezsbl foglalhatunk bele egy rtket a lekrdezsnk kimenetbe. Az allekrdezs FROM zradknak adatforrsaknt hasznlt tblnak vagy lekrdezsnek nem kell szerepelnie a befoglal lekrdezs FROM zradkban. Legtbbszr az allekrdezs WHERE zradknak megadott felttelekkel kell biztostanunk, hogy az legfeljebb egy sort adjon vissza. Az allekrdezs ezen felttele akr a kls lekrdezs ltal visszaadott rtkre is hivatkozhat, hogy az adott sorhoz tartoz adatot kinyerje. Nzznk pr pldt a Sales Orders mintaadatbzis Customers (Vsrlk) s Orders (Rendelsek) tblinak felhasznlsval. A kt tbla kapcsolatt a 11.3. bra mutatja. Alkossunk lekrdezst, amely kirja egy adott nap sszes rendelst, s egy allekrdezssel kigyjti a megfelel vsrlk vezetkneveit a Customers tblbl!

A fejezetben vgig a 4. fejezetben bemutatott Krelem - Fordts Tisztzs- SQL"-mdszert alkalmazzuk, tovbb zrjelekkel jelljk a Tisztzs rszben az allekrdezseket, s ahol lehet, behzzuk ket, hogy jobban ltszdjanak. "Mutasd meg az sszes 2007. oktber 3-n leszlltott rendelst s mindegyik rendels hez a megfelel vsrl vezetknevt!" Fordts - Select order number, order date, ship date, and also select the related customer last name out of the customers table from the orders table where ship date is October 3, 2007 (Vlaszd ki a rendelsszmot, a rendels dtumt, a szllts dtumt s az ezekhez tartoz vsrl vezetknevt a vsrlk tbljbl, ha a szllts dtuma 2007. oktber 3.)

Tisztzs - Select order number, order date, ship date, and also (select the related customer last name out of the from customers table) from the orders table where ship date is = October 3, 2007 '2007-10-03' SQL SELECT Orders.OrderNumber, Orders.OrderDate,

Orders.ShipDate, (SELECT Customers.CustLastName FROM Customers WHERE Customers.CustomerID a Orders.CustomerID) FROM Orders WHERE Orders.ShipDate = '2007-10-03'
Vegyk szre, hogy az allekrdezsben a CustomerID (vsrlazonost) rtkt korltozni kellett az Orders tblbl vett sarok CustomerID rtkre, msklnben az allekrdezsben a Customers tbla sszes sort megkaptuk volna. Ne felejtsk el, hogy itt egy skalris allekrdezsnek- vagyis egy olyan lekrdezsnek, ami csak egy rtket ad vissza egy sor bl - kell szerepelnie, ezrt tennnk kell valamit, hogy legfeljebb egy sort kapjunk vissza. Mivel a CustomerID a Customers tbla elsdleges kulcsa, biztosak lehetnk benne, hogy az Orders tbla CustomerID oszlopval val sszevets pontosan egy sort eredmnyez. Akik a 8. fejezetben trgyalt INNER JOIN mkdsi elvt megrtettk, most valsznleg azon gondolkodnak, mirt akarn brki a fent lert mdon megoldani ezt a feladatot ahe lyett, hogy a kls lekrdezs FROM zradkban egy JOIN-nal sszekapcsoln az Orders s Customers tblkat. A jelenlegi clunk azonban az, hogy egy egyszer pldn keresztl megmutassuk a kimeneti oszlopok allekrdezssel val ellltsnak elvt. Termszetesen ezt a feladatot az albbi, INNER JOIN-t hasznl lekrdezssel clszer megoldani: SQL

SELECT Orders.OrderNumber, Orders.OrderDate, Orders.ShipDate, Customers.CustLastName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.OrderID WHERE Orders.ShipDate = '2007-10-03'

Bevezets az sszest fggvnyek hasznlatba: a COUNT s a MAX


Most, hogy mr rtjk a kimeneti oszlopok allekrdezsekkel val ellltsnak lnyegt, szlestsk ki a ltkrnket, s nzzk meg, hogyan lehet ez a lehetsg a hasznunkra. Elszr is vessnk egy pillantst egy pr sszest fggvnyre (rszletesen a kvetkez fejezetben lesz rluk sz)!

Az SQL-szabvny szmos olyan fggvnyt hatroz meg, amelyek egy lekrdezsben rtke ket szmtanak ki. Ezek egy rsze az sszest fggvnyek egy eredmnyhalmazon belli sorok egy csoportjbl szmt ki egyetlen rtket. sszest fggvnyekkel megszm llhatjuk pldul a sorokat, megkereshetjk a legnagyobb s legkisebb rtket sorok egy csoportjn bell, vagy kiszmthatjuk az eredmnyhalmaz rtkeinek vagy kifejezseinek az tlagt, illetve sszegt. Nzznk meg pr ilyen fggvnyt s hogy miknt hasznosthatk egy allekrdezsen bell. A 11.4. bra a COUNT s a fggvnyt mutatja, amelyek kpesek egy SELECT zradkban kimeneti oszlopot ellltani.

A COUNT-tal egy eredmnyhalmaz sorainak, illetve nem Null rtkeinek a szmt kapjuk meg. A sorok szmnak kidertsre a COUNT(*) hasznlatos. Ha a COUNT(oszlop_neve) segtsgvel egy bizonyos oszlopot adunk meg az eredmnyhalmazban, az adatbzis-kezel rendszer a nem Null rtk sorokat szmllja meg, de a DISTINCT kulcssz hozzadsval az egyedi rtkeket is megszmlltathatjuk. Hasonlkpp, a MAX egy oszlopon belli leg nagyobb rtk visszaadsra szolgl. Ha az rtkkifejezs szmot jell, a legmagasabb rt ket kapjuk az oszlopbl vagy a megadott kifejezsbl. Ha az rtkkifejezs karakteres adattpust ad vissza, a legnagyobb rtk az adatbzis-kezel jelsorrendjtl fgg. Oldjunk meg egy pr rdekes feladatot ezeknek a fggvnyeknek egy allekrdezsben val hasznlatval: rd ki az sszes vsrl nevt s a rendelseik szmt! Fordts - Select customer first name, customer last name, and also select the count of orders from the orders table for this customer from the customers table (Vlaszd ki a vsrl keresztnevt s vezetknevt, s vlaszd ki a rendel sek szmt a rendelsek tbljbl ehhez a vsrlhoz a vsrlk tbljbl.) Tisztzs - Select customer first name, customer last name and also ( ee t t e c u t o o d r ( )f o slc h o n f r e s * r m t e o d r t be h r es a l f rt i c s o e o hs u t m r w e eo d r . u t m rI = h r r e sc so e D c so e sc so e I ) ut m r.ut m rD from the customers table

SQL

SELECT Customers.CustFirstName, Customers.CustLastName, (SELECT COUNT(*) FROM Orders WHERE Orders.CustomerID Customers.CustomerID) AS CountOfOrders FROM Customers

A kimeneti oszlopknt hasznlt allekrdezsek kezdenek rdekesek lenni! A IV. rszben majd mg tbbet tudunk meg az sszest fggvnyek kreatv hasznlatrl, de ha nem akarunk tbbet, mint a kapcsold sorokat megszmllni, az allekrdezs j mdszer. St, ha semmi mst nem szeretnnk, mint a vsrl nevt s a rendelsek szmt, akkor nagyjbl ez az egyetlen megolds. Ha az Orders tblt hozzadjuk a f lekrdezs FROM zradkhoz (FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID), tbb sort kapunk minden olyan vsrl esetben, akinek egynl tbb megrendelse volt. A 13. fejezetben majd tanulunk egy msik mdszert, amelyhez a sorokat a vsrl neve szerint csoportostjuk. Nzznk egy msik rdekes feladatot, amelyhez egy msik sszest fggvnyt, a MAX-ot hasznljuk fel: Mutasd meg a vsrlk listjt s az utols napot, amikor rendelst adtak fel! Fordts - Select customer first name, customer last name, and also select the highest order date from the orders table for this customer from the customers table (Vlaszd ki a vsrlk keresztnevt s vezetknevt a vsrlk tbljbl, illetve a hozzjuk tartoz legnagyobb rendelsi dtumot a rendelsek tbljbl.) Tisztzs - Select customer first name, customer last name and also (select the highest max(order date) from the orders table for this customer where orders.customer ID = customers.customer ID) from the customers table SQL SELECT Customers.CustFirstName,

Customers.CustLastName, (SELECT MAX(OrderDate) FROM Orders WHERE Orders.CustomerID = Customers.CustomerID) AS LastOrderDate FROM Customers

Mint azt sejtjk, a MAX ily mdon hasznlva remekl alkalmazhat brmely kapcsold tbla legmagasabb rtknek megkeressre. Ksbb, a fejezet Pldk rszben ezeknek a fggvnyeknek ms alkalmazsait is megmutatjuk.

Szrs allekrdezsekkel
A 6. fejezetben megtanultuk, hogyan szrjk a kapott adatokat egy WHERE zradk hoz zadsval. Arrl is volt sz, hogyan lehet egyszer vagy sszetett sszehasonltsokkal csak a kvnt sorokat megkapni az eredmnyhalmazban. Most ezekre a kpessgekre ptve megmutatjuk, miknt lehet az allekrdezseket sszehasonltsok tagjaiknt hasz nlva mg sszetettebb szrst vgezni.

Utastsforma
Trjnk vissza a 11.1. bra SELECT utastshoz, s nzzk meg azt az utastsformt, amelyet egy egyszer sszehasonlt lltst tartalmaz WHERE zradkkal elltott lekrdezs felptshez hasznlhatunk! Az egyszerstett diagram a 11.5. brn lthat.

A 11.2. brrl emlkezhetnk r, hogy az rtkkifejezs allekrdezs is lehet. A 11.5. bra egyszer pldjban az rtkkifejezst egy oszloppal hasonltjuk ssze, gy az rtkkifejezs nek egy rtke lehet azaz egy skalris allekrdezst kapunk, ami pontosan egy oszlopot s legfeljebb egy sort ad vissza. Oldjunk meg egy olyan egyszerbb feladatot, ami egy allekrdezs ltal visszaadott rtkkel val sszehasonltst tesz szksgess. Ebben a pldban a vsrli rendelsek sszes rszletre lesznk kvncsiak pontosabban minden vsrlnak csak az utols rendelsre. A szksges tblkat a 11.6. bra mutatja.

"rd ki a vsrlkat s a legutols rendelsk minden rszlett! Fordts - Select customer first name, customer last name, order number, order date, product number,product name, and quantity ordered from the customers table joined with the orders table on customer ID in the customers table equals customer ID in the orders table, then joined with the order details table on order number in the orders table equals order number in the order details table, and then joined with the products table on product number in the products table equals product number in the order details table where the order date equals the maximum order date from the orders table for this customer (Vlaszd ki a vsrl keresztnevt s vezetknevt, a rendels szmt s dtumt, a termk szmt s nevt, valamint a rendelt mennyisget a vsrlk tbljbl, amelyet sszekapcsoltunk a rendelsek tbljval a rendelsek tbljban lev vsrlazonost s a vsrlk tbljban tallhat vsrlazonost szerint, majd ezt sszekapcsoltuk a rendelsek rszleteit tartalmaz tblval a rendelsek tbljban lev rendelsszm s a rendelsek rszleteit tartalmaz tbla rendelsszmai alapjn, majd ezt sszekapcsoltuk a termkek tbljval a termkek tbljban lev termk szm s a rendelsek rszleteit tartalmaz tbla termkszmainak egyezse alapjn, ha a rendels dtuma egyenl a rendelsi dtumok maximumval a rendelsek tbljban az adott vsrl esetben.)

Tisztzs

- Select customer first name, customer last name, order number, order date,product number, product name, and quantity ordered from the customers table inner joined with the orders table on customers.customer ID in the customers table equals = orders.customer ID in the orders table, then inner joined with the order details table on orders.order number in the orders table equals = order_details.order number in the order details table, and then inner joined with the products table on products.product number in the products table equals = order_details.product number in the order details table where the order date equals = (select the maximum (order date) from the orders table for this customer where orders.customer ID = customers.customer ID)

SQL

SELECT Customers.CustFirstName, Customers.CustLastName, Orders.OrderNumber, Orders.OrderDate, Order_Details.ProductNumber, Products.ProductName, Order_Details.QuantityOrdered FROM ((Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Orders.OrderDate = (SELECT MAX(OrderDate) FROM Orders AS 02 WHERE 02.CustomerID = Customers.CustomerID)

Feltnt, hogy az Orders tblra val msodik hivatkozsnak (az allekrdezsben szerepl Orders tblnak) lnevet adtunk? Mg ha ki is hagytuk volna az lnevet, sok adatbzis-ke zel rendszer akkor is felismerte volna, hogy az allekrdezsben szerepl Orders tblra gondolunk. Valjban az SQL-szabvny gy rendelkezik, hogy a nem minstett hivatkoz sokat a legbels lekrdezstl kezdve kell feloldani. Ennek ellenre mi megadtunk egy l nevet, hogy teljesen vilgos legyen, hogy az allekrdezs WHERE zradkban hivatkozott Orders tbla valjban az allekrdezs FROM zradkban szerepl tbla. Ha ezt a gyakor-

latot kvetjk, a lekrdezseink sokkal rthetbbek lesznek - akr magunknak, amikor hnapok mltn jra visszatrnk hozzjuk, akr msnak, akinek meg kell rtenie, hogy mit csinl a lekrdezs.

Az allekrdezsek lltsaiban hasznlt klnleges kulcsszavak


Az SQL-szabvny meghatroz nhny, az allekrdezsek WHERE zradkban hasznlhat kulcsszt.

Halmaztagsg: IN
A 6. fejezetben megtanultuk, hogyan hasonlthatunk ssze egy a WHERE zradkban elhe
lyezett IN kulcsszval egy oszlopot vagy kifejezst s rtkek egy listjt. Most mr tudjuk, hogy az IN listjban szerepl rtkkifejezs lehet skalris allekrdezs is. Mi lenne, ha a tel jes listt allekrdezssel hoznnk ltre? Ahogy a 11.7. bra mutatja, ennek nincs akadlya.

Ebben az esetben egy tbla-allekrdezst hasznlhatunk, ami egy oszlopot s annyi sort ad vissza, amennyi a listhoz szksges. Hasznljuk fel a Recipes mintaadatbzist egy pldhoz; a szksges tblkat a 11.8. bra mutatja. Tegyk fel, hogy olyasvalakit ltunk vendgl vacsorra, aki imdja a tengeri tkeket. Habr tudjuk, hogy van egy pr tengeri telreceptnk, nem ismerjk az adatbzisban szerepl sszes hozzval nevt. Azt viszont tudjuk, hogy van egy Seafood (Tengeri hozzvalk) rtk IngredientClassDescription (Hozzvalosztly-lers), ezrt sszekapcsolhatjuk az sszes tblt, s szrhetnk az IngredientClassDescription-re vagy lehetnk kreatvak, s hasznlhatjuk az allekrdezseket s az IN lltst: rd ki az sszes olyan receptet, amelynek van tengeri hozzvalja! Fordts - Select recipe title from the recipes table where the recipe ID is in the selection of recipe IDs from the recipe ingredients table where the ingredient ID is in the selection of ingredient IDs from the ingredients table joined with the ingredient classes table on ingredient class ID in the ingredients table matches ingredient class ID in the ingredient classes table where ingredient class description is 'seafood' (Vlaszd ki azoknak a recepteknek a cmt a receptek tbljbl, amelyeknek a receptazonostja szerepel a hozzvalk tbljbl kivlasz tott receptazonostk kztt, ha a hozzval azonostja szerepel a hozzva lk tbljbl kivlasztott hozzval-azonostk kztt, mely tblt ssze kapcsoltuk a hozzvalosztlyok tbljval a hozzvalk tbljban lev hozzval-azonostk s a hozzvalosztlyok tbljban trolt hozzval azonostk egyezse alapjn, ha a hozzvalosztly lersa seafood", vagyis ''tengeri hozzval''.) Tisztzs - Select recipe title from the recipes table

SQL

where the recipe ID is in the (selection of recipe IDs from the recipe ingredients table where ingredient ID is in the (selection of ingredient IDs from the ingredients table inner joined with the ingredient classes table on ingredients.ingredient class ID in the ingredients table matches = ingredient_classes.ingredient class ID in the ingredient classes table where ingredient class description is = 'seafood')) SELECT RecipeTitle FROM Recipes WHERE Recipes.RecipeID IN

(SELECT RecipeID FROM Recipe_Ingredients WHERE Recipe_Ingredients.IngredientID IN (SELECT IngredientID FROM Ingredients INNER JOIN Ingredient_Classes ON Ingredients.IngredientClassID Ingredient_Classes.IngredientClassID WHERE Ingredient_Classes.IngredientClassDescription = 'Seafood'))
Gondoltuk volna, hogy allekrdezst is lehet allekrdezsbe tenni? Mg egy szinttel tovbb mehettnk volna, ha az INNER JOIN-t kiszedjk a msodik allekrdezsbl. A msodik allekrdezst az albbi mdon is megfogalmazhattuk volna: SQL

(SELECT IngredientID FROM Ingredients WHERE Ingredients.IngredientClassID IN (SELECT IngredientClassID FROM Ingredient_Classes WHERE Ingredient_Classes.IngredientClassDescription = 'Seafood'))

Ez azonban mr olyan, mintha gyval lnnk verbre, mert az IN zradk IN zradkba gyazsa nehezebben-olvashatv teszi a lekrdezst. Az elz pldban csak azrt tettk, hogy megmutassuk, meg lehet csinlni. Meg kell ismtelnnk azonban, hogy csak azrt mert lehet, mg nem biztos, hogy kell. Megegyezhetnk abban, hogy knnyebben ltjuk, mi folyik, ha csak egy IN llts s egy sszetettebb JOIN van az allekrdezsben. Itt egy msik megolds, ami ezt a mdszert alkalmazza: SQL

SELECT RecipeTitle FROM Recipes WHERE Recipes.RecipeID IN (SELECT RecipeID FROM (Recipe_Ingredients INNER JOIN Ingredients ON Recipe_Ingredients.IngredientID = Ingredients.IngredientID) INNER JOIN Ingredient_Classes ON Ingredients.IngredientClassID = Ingredient_Classes.IngredientClassID

WHERE Ingredient_Classes,IngredientClassDescription = 'Seafood')


Felmerlhet a krds: Mirt szenvednk ezzel? Mirt nem csinlunk egy sszetett JOIN-t a kls lekrdezsben s ksz? Azrt, mert rossz vlaszt kapnnk! A visszakapott sarok tulajdonkppen mind a Recipes tbla sorai a tengeri teles receptekre, de egy sort tbbszr is visszakaphatunk. Prbljuk meg az allekrdezs nlkl megoldani, hogy lssuk, mirt kapunk tbbszr szerepl sorokat: SQL

SELECT RecipeTitle FROM ((Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Recipe_Ingredients.IngredientID = Ingredients.IngredientID) INNER JOIN Ingredient_Classes ON Ingredients.IngredientClassID Ingredient_Classes.IngredientClassID WHERE Ingredient_Classes.IngredientClassDescription = 'Seafood')

Ha jbl megnzzk a 11.8. brt, lthatjuk, hogy a Recipe_Ingredients (Recepthozzva lk) tblban a Recipes tbla minden sorhoz tbb sor is tartozhat. A FROM zradk ltal megadott eredmnyhalmaz legalbb annyi sort tartalmaz, mint amennyi a Recipe_Ingredients-ben van, a RecipeTitle (Receptcm) oszlop rtkeinek sokszoros ismtlse mellett. Mg ha hozz is adunk egy szrt, ami az eredmnyeket a Seafood fajtra szkti, akkor is tbb sort kapunk az sszes olyan receptre, amelynek egynl tbb tengeri sszetevje van. Igen, hasznlhatnnk a DISTINCT kulcsszt, de ekkor az adatbzis-kezel knyszerl tbb letmunkra, hogy eltvoltsa az ismtldseket. Ha ezt a DISTINCT-et hasznl lekrdezst nzettblaknt mentjk, majd frissteni prbljuk a nzettbla adatait, azt tapasztaljuk, hogy az nem frissthet, mert a DISTINCT elfedi a sorok egyedisgt, s az adatbzis-kezel nem tudja eldnteni, hogy melyik sort frisstse. Az allekrdezsek eme mdszere akkor vlik igazn fontoss, ha a receptek nevnl tbbet akarunk kiratni. Tegyk fel pldul, hogy az sszes hozzvaljt ki szeretnnk ratni brmely olyan receptnek, amelynek van tengeri hozzvalja. Ha sszetett JOIN-t hasz-

nlunk a kls lekrdezsben s a Seafood hozzvalosztlyra szrnk, csak a tengeri hozzvalkat kapjuk meg, a receptek tbbi hozzvaljt nem. Nzznk egy valamivel bonyolultabb krelmet: Sorold fel azokat a recepteket a hozzvalikkal egytt, amelyekhez kell tengeri hozzval! Fordts - Select recipe title and ingredient name from the recipes table joined with the recipe ingredients table on recipe ID in the recipes table equals recipe ID in the recipe ingredients table,and then joined with the ingredients table on ingredient ID in the ingredients table equals ingredient ID in the recipe ingredients table where the recipe ID is in the selection of recipe IDs from the recipe ingredients table joined with the ingredients table on ingredient ID in the recipe ingredients table equals ingredient ID in the ingredients table, and then joined with the ingredient classes table on ingredient class ID in the ingredients table equals ingredient class ID in the ingredient classes table where ingredient class description is 'seafood' (Vlaszd ki azoknak a recepteknek a nevt s a hozzvalik nevt a recep tek tbljbl s az azzal a receptazonostk szerint sszekapcsolt recept hozzvalk tbljbl, amelyet sszekapcsoltunk a hozzvalk tbljval a hozzvalk tbljban lev hozzval-azonost s a recepthozzvalk tbljban lev hozzval-azonost szerint, ha a recept azonostja szere pel a receptazonostk kztt a recepthozzvalk tbljban, amelyet ssze kapcsoltunk a hozzvalk tbljval a hozzval-azonost szerint, majd ezt sszekapcsoltuk a hozzvalosztlyok tbljval a hozzvalk tbljban lev hozzval-azonostk s a hozzvalosztlyok tbljban trolt hozz val-azonostk szerint, ha a hozzvalosztly lersa seafood.) Tisztzs - Select recipe title, and ingredient name

from the recipes table inner joined with the recipe ingredients table on recipes.recipe ID in the recipes table equals = recipe_ingredients.recipe ID in the recipe ingredients table, and then inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table equals = recipe_ingredients.ingredient ID in the recipe ingredients table where the recipe ID is in the (selection of recipe IDs from the recipe ingredients table inner joined with the ingredients table on recipe_ingredients.ingredient ID

SQL

in the recipe ingredients table equals = ingredients.ingredient ID in the ingredients table and then inner joined with the ingredient classes table on ingredients.ingredient class ID in the ingredients table equals = ingredient_classes.ingredient class ID in the ingredient classes table where ingredient class description is = 'seafood') SELECT Recipes.RecipeTitle, Ingredients.IngredientName FROM (Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID WHERE Recipes.RecipeID IN (SELECT RecipeID FROM (Recipe_Ingredients INNER JOIN Ingredients ON Recipe_Ingredients.IngredientID Ingredients.IngredientID) INNER JOIN Ingredient_Classes ON Ingredients.IngredientClassID = Ingredient_Classes.IngredientClassID WHERE Ingredient_Classes.IngredientClassDescription = 'Seafood')

A dolog nyitja, hogy az sszetett INNER JOIN a lekrdezs f rszben az sszes hozzvalt kigyjti a kivlasztott receptekhez, az sszetett allekrdezs pedig csak a tengeri recep tekhez tartoz receptazonostt adja vissza. gy fest, mintha ktszer hajtannk vgre egy sszetett JOIN-t rltsg, de van benne rendszer!

Mennyisgi lltsok: ALL, SOME s ANY


Amint azt az imnt lttuk, az IN lltssal egy oszlopot vagy kifejezst hasonlthatunk ssze egy listval, hogy megtudjuk, benne van-e a listban az adott oszlop vagy kifejezs, ms szval az oszlop vagy kifejezs egyenl-e a lista egy tagjval. Ha arra vagyunk kvncsiak, hogy az oszlop vagy kifejezs nagyobb vagy kisebb-e, mint a lista elemei kzl brmelyik, az sszes, vagy nhny, a mennyisgi lltsokat hasznlhatjuk erre a clra. Az utastsfor mt a 11.9. bra mutatja.

Ebben az esetben a SELECT kifejezs egy tbla-allekrdezs kell legyen, amely pontosan egy oszlopot s nulla vagy tbb sort ad vissza. Ha az allekrdezs egynl tbb sort ad, a sorok rtkei egy listt alkotnak. Mint lthat, ez az llts egy sszehasonlt mveletet egyest egy kulcsszval, ami megmondja az adatbzis-kezelnek, hogyan alkalmazza a mveletet a lista elemeire. Az ALL kulcssz hasznlatakor az sszehasonltsnak az allekrdezs ltal visszaadott sszes rtkre igaznak kell lennie. A SOME vagy ANY kulcssz hasznlata esetn elg, ha a lista egy elemre igaz az sszehasonlts. Ha belegondolunk, ha az allekrdezs tbb sort ad vissza, az = ALL mindig hamis lesz, kiv ve, ha az allekrdezstl kapott sszes rtk egyforma, s az sszehasonlts bal oldaln ll rtkkifejezs az sszessel megegyezik. Ugyanezen logika alapjn azt gondolhatnnk, hogy a<> ANY mindig hamis lesz, ha a bal oldali rtkkifejezs tnylegesen egyenl brmelyik rtkkel. Valjban az SQL-szabvny ugyangy kezeli a SOME-ot s az ANY-t. Ha teht azt mondjuk, hogy <> SOME vagy <> ANY, akkor az llts igaz, ha a bal oldali rtkkifejezs nem egyenl legalbb egy a listban szerepl rtkkel. Egy msik zavarba ejt pont, hogy ha az allekrdezs nem ad vissza sorokat, akkor brmely sszehasonlts igaz, amelyben az ALL tallhat, s brmelyik hamis, amelyben a SOME vagy az ANY szerepel. Nzznk meg nhny krelmet, hogy mkds kzben lssuk a mennyisgi lltsokat. Elszr oldjunk meg egy feladatot a Redpes adatbzisban (a 11.8. bra segt felidzni a hasznlt tblkat): Mutasd meg a marhahst vagy fokhagymt tartalmaz recepteket! Fordts - Select recipe title from the recipes table where recipe ID is in the selection of recipe IDs from the recipe ingredients table

where ingredient ID equals any of the selection of ingredient IDs from the ingredients table where ingredient name is 'beef' or 'garlie' (Vlaszd ki azoknak a recepteknek a nevt a receptek tbljbl, amelyek nl a recept azonostja szerepel a recepthozzvalk tbljbl kivlasztott receptazonostk kztt, ha a hozzval azonostja megegyezik brmelyik kivlasztott hozzval azonostjval a hozzvalk tbljbl, ahol a hozz val neve beef vagy garlic, vagyis marhahs vagy fokhagyma.) Tisztzs - Select recipe title from the recipes table

SQL

where recipe ID is in the (selection of recipe IDs from the recipe ingredients table where ingredient ID equals = any of the (selection of ingredient IDs from the ingredients table where ingredient name is in 'beef' or 'garlic')) SELECT Recipes.RecipeTitle FROM Recipes WHERE Recipes.RecipeID IN (SELECT Recipe_Ingredients.RecipeID FROM Recipe_Ingredients WHERE Recipe_Ingredients.IngredientID = ANY (SELECT Ingredients.IngredientID FROM Ingredients WHERE Ingredients.IngredientName IN ('Beef', 'Garlic')))

Ha olyan rzsnk tmadna, hogy az = helyett az IN-t is hasznlhatnnk, igazunk van. Egy JOIN-t is ltrehozhattunk volna a Recipe_Ingredients s az Ingredients kztt az els allekrdezsben, hogy megkapjuk a RecipeID-k listjt. Ahogy a fejezet elejn lltottuk, majdnem minden feladatot tbbflekppen is meg lehet oldani az SQL-ben, a mennyisgi lltsok azonban nha olvashatbb teszik a krelmet.

Oldjunk most meg egy bonyolultabb feladatot, hogy lssuk a mennyisgi lltsok valdi erejt. Ez a plda a Sales Orders mintaadatbzist hasznlja, a 11.10. bra pedig a felhasz nlt tblkat mutatja meg. Keresd meg az sszes kiegsztt, ami drgbb, mint brmelyik ruhadarab!" Fordts - Select product name and retail price from the products table joined with the categories table on category ID in the products table matches category ID in the categories table where category description is 'accessories' and retail price is greater than all the selection of retail price from the products table joined with the categories table on category ID in the products table matches category ID in the categories table where category name is 'clothing' (Vlaszd ki a termk nevt s fogyaszti rt a termkek tbljbl, amelyet sszekapcsoltunk a termkcsoportok tbljval a termkcsoport-azonostk szerint, ha a termkcsoport lersa "accessories", vagyis kiegszt, s a fo gyaszti ra nagyobb, mint az sszes fogyaszti r, amit kivlasztottunk a ter mkek tbljbl, amelyet sszekapcsoltunk a termkcsoportok tbljval a termkcsoport-azonostk szerint, ha a termkcsoport neve clothing, va gyis ruhadarab.) Tisztzs - Select product name and retail price

SQL

from the products table inner joined with the categories table on products.category ID in the products table matches = categories.category ID in the categories table where category description is = 'accessories' and retail price is greater than > all the (selection of retail price from the products table inner joined with the categories table on products.category ID in the products table matches = categories.category ID in the categories table where category name is = 'clothing') SELECT Products.ProductName, Products.RetailPrice FROM Products INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID WHERE Categories.CategoryDescription = 'Accessories' AND Products.RetailPrice > ALL (SELECT Products.RetailPrice

FROM Products INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID WHERE Categories.CategoryDescription = 'C1othing')
Mi trtnik itt? Az allekrdezs kinyeri az sszes ruhadarab rt, majd a kls lekrdezs kirja az sszes olyan kiegsztt, amelynek magasabb az ra, mint brmelyik r a ruhada rabok allekrdezsben. Vegyk szre, hogy gy is megoldhatnnk a feladatot, ha azt a RetailPrice-t (Fogyaszti r) keresnnk, ami magasabb, mint az allekrdezsben tallt rak MAX rtke, de a lnyeg itt az ALL hasznlatnak bemutatsa volt.

Ltezst kifejez lltsok: EXISTS


A halmaztagsgi (IN) s a mennyisgi (SOME, ALL, ANY) lltsok egy rtkkifejezssel val sszehasonltst vgeznek ltalban egy kls lekrdezs FROM zradkban meg adott oszloppal. Nha hasznos egyszeren azt tudni, hogy ltezik-e az allekrdezs ltal visszaadott eredmnyhalmazhoz kapcsold sor. A 8. fejezetben megmutattuk az ANDproblmk sszetett INNER JOIN-nal val megoldst. Az EXISTS is hasznlhat ugyan ezen problmk megoldsra. Nzznk meg egy olyan pldt, amit mr megoldottunk a 8. fejezetben:

Keresd meg az sszes vsrlt, aki biciklit s buksisakot is rendelt!"


Fordts - Select customer ID, customer first name, and customer last name from the customers table where there exists some row from the orders table joined with the order details table on order ID in the orders table equals order ID in the order details table, and then joined with the products table on product ID in the products table equals product ID in the order details table where product name contains 'Bike' and the orders table customer ID equals the customers table customer ID, and there also exists some row from the orders table joined with the order details table on order ID in the orders table equals order ID in the order details table, and then joined with the products table on product ID in the products table equals product ID in the order details table where product name contains 'Helmet' and the orders table customer ID equals the customers table customer ID (Vlaszd ki a vsrl azonostjt, keresztnevt s vezetknevt a vsrlk tbljbl, ha ltezik hozz sor a rendelsek tbljban, amelyet sszekap csoltunk a rendelsek rszleteit tartalmaz tblval a rendelsazonostk szerint, majd sszekapcsoltuk a termkek tbljval a termkazonostk szerint, ha a termk neve tartalmazza a Bike, vagyis Kerkpr szt, s a rendelsek tbljban lev vsrlazonost egyenl a vsrlk tblj-

ban lev vsrlazonostval, s ha ltezik hozz sor a rendelsek tblj ban, amelyet sszekapcsoltunk a rendelsek rszleteit tartalmaz tblval a rendelsazonostk alapjn, majd sszekapcsoltuk a termkek tbljval a termkazonostk szerint, ha a termk neve tartalmazza a Helmet, va gyis Buksisak szt, s a rendelsek tbljban lev vsrlazonost egyenl a vsrlk tbljnak vsrlazonostjval.) Tisztzs - Select customer ID, customer first name, and customer last name

SQL

from the customers table where there exists some row (select * from the orders table inner joined with the order details table on orders.order ID in the orders table equals = order_details.order ID in the order details table and then inner joined with the products table on products.product ID in the products table equals = order_details.product ID in the order details table where product name contains LIKE '%Bike' and the orders table customer ID equals = the customers table customer ID), and there also exists some row (select * from the orders table inner joined with the order details table on orders.order ID in the products table equals = order_details.order ID in the order details table and then inner joined with the products table on products.product ID in the products table equals = order_details.product ID in the order details table where product name contains LIKE %Helmet' and the orders table customer ID equals = the customers table customer ID) SELECT Customers.CustomerID, Customers.CustFirstName, Customers.CustLastName FROM Customers WHERE EXISTS (SELECT * FROM (Orders INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber

WHERE Products.ProductName LIKE '%Bike' AND Orders.CustomerID = Customers.CustomerID) AND EXISTS (SELECT * FROM (Orders INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber WHERE Products.ProductName LIKE '%Helmet' AND Orders.CustomerID = Customers.CustomerID)
Tudjuk, hogy a mintaadatbzisban az sszes kerkpr megnevezse tartalmazza a termknv vgn a Bike szt. Van az adatbzisban egy Viscount C-500 Wireless Bike Computer megnevezs termk is, amely azonban nem kerkpr. Hasonlkpp tudjuk, hogy a mintaadatbzisban szerepl sszes buksisaknak a Helmet sz van a megnevezse vgn, s egy msik nv, a Dog Ear Helmet Mount Mirrors, kzpen tartalmazza a Helmet szt, viszont nem buksisak. Azrt vlasztottuk a LIKE %Bike s a LIKE %Helmet hasznlatt a LIKE %Bike% s a LIKE %Helmet% helyett, hogy biztosan a helyes termkeket vlasszuk ki. Az igazsg az, hogy a tblt kellett volna gy tervezni, hogy a knnyebb szrs rdekben rendel kezzk egy termkcsoport mezvel. Ahogy a 2. fejezetben mr emltettk, az ilyen apr tervezsi hibk megnehezthetik a feladat helyes megoldst.
Vegyk szre, hogy a FROM zradkban szerepl brmelyik tbla brmely oszlopnak nevt hasznlhatjuk az allekrdezs SELECT zradkban keresett oszlopknt. Mi az sszes oszlopot jelent ,,* rvidtst hasznltuk. Mshogy fogalmazva a lekrdezs gy szl: Add meg azokat a vsrlkat, akikhez ltezik valamilyen kerkprra szl rendelssor a rendelsek rszletei kztt, s akikhez szintn ltezik valamilyen buksisakra szl ren delssor a rendelsek rszletei kztt!. Mivel nem az OrderID (rendelsazonost) oszlop pal vgeztnk sszehasonltst, nem rdekes, hogy a vsrl kln rendelsben rendelt-e biciklit s buksisakot, vagy sem. Ez a lekrdezs annyira rdekes, hogy ezt a megoldst

Cust_Bikes_And_Helmets_EXISTS nven a mintaadatbzisba mentettk. Az eredeti, INNER JOIN-os megoldst Cust_Bikes_And_Helmets_JOIN nven tallhatjuk meg.

Az allekrdezsek hasznlati terletei


Ezen a ponton mr elg jl kell rtennk, hogyan hasznljuk az allekrdezseket kimeneti oszlopok ellltsra vagy egy WHERE zradkban vgrehajtand sszetett sszehasonl tsra. Az allekrdezsek szles kr felhasznlsnak bemutatsra a legjobb md, hogy mutatunk pr mintafeladatot, amelyeket allekrdezsekkel lehet megoldani, majd pedig adunk egy j adag pldt az nll feladatok rszben.

Allekrdezsek felptse oszlopkifejezsknt


Ahogy ebben a fejezetben mr emltettk, a kapcsold tblkbl rtkeket kiolvas allekrdezseknl feltehetleg hatkonyabb a JOIN hasznlata. Ha azonban az sszest fggvnyekre gondolunk, egy fggvny szmtsi eredmnyeit allekrdezsekkel megkap ni mindjrt sokkal izgalmasabb. Az sszest fggvnyek ily mdon val felhasznlst a kvetkez fejezetben trgyaljuk. Addig is itt van pr feladat, amelyeket kimeneti oszlopot elllt allekrdezsekkel oldhatunk meg: Sorold fel a beszlltkat s az ltaluk neknk eladott termkek szmt! Jelentsd meg a termkeket s a dtumot, amikor a termkeket utoljra megrendeltk! Sorold fel az eladkat s minden elad fellpseinek a szmt! ,,Jelentsd meg az sszes megrendelt s mindegyikk utols lekttt rendezvnynek a dtumt! Sorold fel az sszes tanrt s az ltaluk tartott rk szmt! ,,Jelentsd meg az sszes tantrgyat s az egyes trgyak htfi rinak a szmt! ,,Jelentsd meg az sszes tekejtkost s az ltaluk lejtszott mrkzsek szmt! ,,Jelentsd meg az sszes tekejtkost s az ltaluk elrt legmagasabb pontszmot! ,,rd ki az sszes hsflt s hogy hny receptben szerepelnek! ,,Mutasd meg a receptek fajtit s hogy hny recept van az adott fajtbl!

Allekrdezsek hasznlata szrknt


Most, hogy mr ismerjk az allekrdezseket, bvthetjk az sszetett lekrdezseket megol d eszkztrunkat. Ebben a fejezetben sok rdekes mdjt jrtuk krl annak, hogyan hasz nljunk egy WHERE zradkban allekrdezseket szrknt. A 14. fejezetben megmutatjuk, hogyan lehet az allekrdezseket a HAVING zradkban adatcsoportok szrsre hasznlni. Az albbiakban nhny olyan feladatot lthatunk, amelyeket egy WHERE zradkban sorok szrsre hasznlt allekrdezsek segtsgvel oldhatunk meg. Vegyk szre, hogy ezekbl a feladatokbl j prat mr megoldottunk a korbbi fejezetekben - most arra kell rjnnnk, hogy miknt oldhatjuk meg ket mskpp, allekrdezsekkel. Segtsgknt a feladatok utn zrjelben megadtuk a megoldshoz hasznlhat kulcsszavakat.

Sorold fel azokat a vsrlkat, akik kerkprt rendeltek!" (IN) ,,Jelentsd meg azokat a vsrlkat, akik ruhanemt vagy kiegsztket rendeltek!" (=; SOME) Keresd meg azokat a vsrlkat, akik kerkpros buksisakot rendeltek!" (IN) Keresd meg azokat a vsrlkat, akik kerkprt rendeltek, de nem rendeltek buksisakot!" (NOT EXISTS) Melyek azok a termkek, amelyekbl mg soha nem rendeltek?" (NOT IN) rd ki azokat a megrendelket, akik olyan eladk fellpseit ktttk le, akik country-t vagy country rock-ot jtszanak!" (IN) "Keresd meg azokat az eladkat, akik jtszottak a Bonnicksen vagy a Rosales nev megrendelnl!" C= SOME) ,,Jelentsd meg azokat az gynkket, akik nem ktttek le egyetlen eladt sem!"
(NOT IN)

"Sorold fel azokat az eladkat, akik Bonnicksen s Rosales nev megrendelinknl is jtszottak! (EXISTS) ,,Jelentsd meg a keddi rkra feliratkozott tanulkat!" (IN) "Mutasd meg azokat a tanulkat, akiknek 85 vagy annl tbb a rajzbl elrt tlaguk, s 85 vagy tbb a szmtstechnikai tlaguk!" (EXISTS) ,,Jelentsd meg azokat a tanulkat, akik soha nem adtak le rt!" (NOT IN) rd ki a szerdn tartott rkat!" (IN) ,,Jelentsd meg azokat a csapatkapitnyokat, akiknek magasabb az tlaguk, mint a csapatuk brmely tagjnak!"(> ALL) Mutasd meg a mg le nem jtszott tornkat!" (NOT IN) "Keresd meg azokat a jtkosokat, akiknek 170 vagy tbb volt a tiszta pontszmuk a Thunderbird Lanes s a Bolero Lanes plyn!" (EXISTS) ,,rd ki azokat a jtkosokat, akiknek alacsonyabb az tlaguk, mint a csapatuk tbbi tagjnak!" (< ALL) "Mutasd meg a marhahst s fokhagymt tartalmaz recepteket!" (EXISTS) ,,Jelentsd meg a rpt tartalmaz receptek hozzvalit!" (IN) "Sorold fel azokat a hozzvalkat, amelyeknek a valamelyik receptben felhasznlt mennyisge eltr az alaprtelmezett mennyisgtl!" (<> SOME) rd ki a mg egyetlen receptben sem hasznlt hozzvalkat!" (NOT IN)

Pldk
Most mr tudjuk, hogyan kell allekrdezseket tartalmaz lekrdezseket ltrehozni, s lttunk pr krelmet, amit allekrdezsek segtsgvel fogalmazhatunk meg. Nzznk meg egy egszsges adag pldt, amelyek mindegyike egy vagy tbb allekrdezst hasznl! A pldk a mintaadatbzisokra tmaszkodnak, s a kimenetet biztost vagy szr allekr dezsek hasznlatt mutatjk be. Ezenkvl ksztettnk az eredmnyhalmazokbl is min tkat; ezek kzvetlenl az SQL-utastsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ugyanaz, mint a CD-mellkleten tallhat megfelel SQL-lekrdezs neve.

Minden lekrdezst a megfelel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz lekrdezsek neve ''CH11''-gyel kezddik. A pldkat a knyv elejn tallhat bevezets tmutatst kvetve tlthetjk be s prblhatjuk ki. Ne felejtsk el, hogy a pldinkban hasznlt oszlop- s tblanevek a B fggelkben tallhat mintaadatbzisok szerkezetbl szrmaznak. Mivel sok plda sszetett JOIN-okat hasznl, a hasznlt adatbzis-kezel esetleg ms mdon oldja fel a lekrdezseket, ezrt elfordulhat, hogy az els pr sor nem egyezik az ltalunk kapott eredmnnyel, de a sorok vgleges szma ugyanannyi kell legyen. Az egyszersg kedvrt a kvetkez pldkban sszevontuk a Fordts s a Tisztzs lpseit.

Allekrdezsek kifejezsekben
Sales Orders adatbzis
Sorold fel a beszlltkat s az ltaluk neknk eladott termkek szmt! Fordts/ - Select vendor name Tisztzs (select the count(*) of products
from the product vendors table where

SQL

the product vendor table vendor ID equals = vendors table vendor ID) from vendors table SELECT VendName, (SELECT COUNT(*) FROM Product_Vendors WHERE Product_Vendors.VendoriD = Vendors.VendorID) AS VendProductCount FROM Vendors

A SELECT zradkban lev allekrdezshez lnevet rendeltnk, hogy a kimenet rtelmes nevet adjon. Ha ezt nem tesszk meg, az adatb zis-kezel alkot egy nevet (pldul Expr1 vagy valami hasonl).

Entertainment Agency adatbzis


,,Jelentsd meg az sszes megrendelt s mindegyikk utols lekttt rendezvnynek a dtumt!
Fordts/ Select customer first name, customer last name, and also Tisztzs (select the highest MAX(start date)
from where

SQL

the engagements table the engagements table customer ID equals = the customers table customer ID) from the customers table SELECT Customers.CustFirstName, Customers.CustLastName, (SELECT MAX(StartDate) FROM Engagements WHERE Engagements.CustomerID = Customers.CustomerID) AS LastBooking FROM Customers
Nhny megrendelnl res (Null) a LastBooking sor, mert nekik nincs lekttt rendezvnyk.

School Scheduling adatbzis


,,Jelentsd meg az sszes tantrgyat s az egyes trgyak htfi rinak a szmt!" Fordts/Tisztzs - Select subject name and also (select the count(*) of classes from the classes table where Monday schedule is = true and the classes table subject ID equals = subjects table subject ID) from the subjects table SQL SELECT Subjects.SubjectName,

(SELECT COUNT(*) FROM Classes WHERE MondaySchedule = 1 AND Classes.SubjectID = Subjects.SubjectID) AS MondayCount FROM Subjects
Gyzdjnk meg arrl, hogy az adatbzis-kezelnk ltal tmogatott igaz" rtkre vizsglunk. Emlkezznk vissza, hogy nhny adatb zisrendszer a TRUE kulcsszval vagy a -1 rtkkel val sszehasonltst kvetel meg.

Ha nincsenek sorok, a COUNT sszestfggvny Null helyett 0-t ad vissza.

Bowling League adatbzis


Jelentsd meg az sszes tekejtkost s az ltaluk elrt legmagasabb pontszmot!" Fordts/Tisztzs - Select bowler first name, bowler last name and also (select the highest MAX(raw score) from the bowler scores table

where

the bowler scores table bowler ID equals = the bowlers table bowler ID) from the bowlers table

SQL

SELECT Bowlers.BowlerFirstName, Bowlers.BowlerLastName, (SELECT MAX(RawScore) FROM Bowler_Scores WHERE Bowler_Scores.BowlerID = Bowlers.BowlerID) AS HighScore FROM Bowlers

Recipes adatbzis
rd ki az sszes hsflt, s hogy hny receptben szerepelnek! Fordts/Tisztzs - Select ingredient class description, ingredient name and also (select the count(*) of rows from the recipe ingredients table where the recipe ingredients table ingredient ID equals = the ingredients table ingredient ID) from from ingredient classes table inner joined with the ingredients table on ingredient_classes.ingredient class ID in the ingredients classes table matches = ingredients.ingredient class ID in the ingredients table where ingredient class description is = 'meat'

SQL

SELECT Ingredient_Classes.IngredientClassDescription, Ingredients.IngredientName,

(SELECT COUNT(*) FROM Recipe_Ingredients WHERE Recipe_Ingredients.IngredientID Ingredients.IngredientID) AS RecipeCount FROM Ingredient_Classes INNER JOIN Ingredients ON Ingredient_Classes.IngredientClassID Ingredients.IngredientClassID WHERE Ingredient_Classes.IngredientClassDescription = 'Meat'

Allekrdezsek szrkben
Sales Orders adatbzis
,,Jelentsd meg azokat a vsrlkat, akik ruhanemt vagy kiegsztket rendeltek!" Fordts/ - Select customer ID, customer first name, customer last name Tisztzs from the customers table where customer ID is equal to = any of the (selection of customer ID from the orders table inner joined with the order details table on orders.order number in the orders table matches = order_details.order number in the order details table, then inner joined with the products table

on products.product number

in the products table matches = order_details.product number in the order details table, and then inner joined with the categories table on categories.category ID in the categories table matches = products.category ID in the products table where category description is = 'clothing' or category description is = 'accessories')

SQL

SELECT Customers.CustomerID, Customers.CustFirstName, Customers.CustLastName FROM Customers WHERE Customers.CustomerID = ANY (SELECT Orders.CustomerID FROM ((Orders INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber) INNER JOIN Products ON Products.ProductNumber = Order_Details.ProductNumber) INNER JOIN Categories ON Categories.CategoryID = Products.CategoryID WHERE Categories.CategoryDescription = 'Clothing' OR Categories.CategoryDescription = 'Accessories')

A mka kedvrt ezt a lekrdezst az = ANY hasznlatval oldottuk meg. Ki tudunk-e gondolni egy IN-t vagy EXISTS-t hasznl megoldst? A megoldsokat CH11_Customers_Clothing_OR_Accessories_IN s CH11_Customers_Clothing_OR_Accessories_EXISTS nven megtallhatjuk a minta adatbzisban.

Entertainment Agency adatbzis


Keresd meg azokat az eladkat, akik jtszottak Berg s Hallmark nev megren delinknl! Ezt a feladatot a 8. fejezetben kt sszetett tbla-allekrdezs sszekap csolsval oldottuk meg. Ezttal az EXISTS kulcsszt hasznljuk. Fordts/ - Select entertainer ID and entertainer stage name from the Tisztzs entertainers table where there exists (select * some row from the customers table inner joined with the engagements table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table where customer last name is = 'Berg' and the engagements table entertainer ID equals = the entertainers table entertainer ID), and there also exists (select * some row from the customers table inner joined with the engagements table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table where customer last name is = 'Hallmark' and the engagements table entertainer ID equals = the entertainers table entertainer ID) SQL SELECT Entertainers.EntertainerID,

Entertainers.EntStageName FROM Entertainers WHERE EXISTS (SELECT * FROM Customers INNER JOIN Engagements ON Customers.CustomerID = Engagements.CustomerID WHERE Customers.CustLastName = 'Berg'

AND Engagements.EntertainerID = Entertainers.EntertainerID) AND EXISTS (SELECT * FROM Customers INNER JOIN Engagements ON Customers.CustomerID Engagements.CustomerID WHERE Customers.CustLastName = 'Hallmark' AND Engagements.EntertainerID = Entertainers.EntertainerID)

School Scheduling adatbzis


,,Jelentsd meg azokat a tanulkat, akik soha nem adtak le rt!" Fordts/ Select student ID, student first name, and student last name Tisztzs from the students table where the student ID is not in (selection of student ID from the student schedules table inner joined with the student class status table on student_schedules.class status in the student schedules table matches = student_class_status.class status in the student class status table where class status description is = 'withdrew') SQL SELECT Students.StudentID, Students.StudFirstName, Students.StudLastName FROM Students WHERE Students.StudentID NOT IN (SELECT Student_Schedules.StudentID FROM Student._Schedules INNER JOIN Student_Class_Status ON Student. Schedules.ClassStatus =

Student_Class_Status.ClassStatus WHERE Student_Class_Status.ClassStatusDescription = 'Withdrew')


Ez elg egyszer lekrdezs, amely egy allekrdezsben megkeresi az sszes tanult, aki valaha is adott le rt, aztn lekri az sszes tanult, aki nincs ebben a listban (NOT IN). Hogyan oldhatnnk meg ezt egy OUTER JOIN hasznlatval?

Bowling League adatbzis


,,Jelentsd meg azokat a csapatkapitnyokat, akiknek a bntetpontszma magasabb, mint a csapatuk brmelyik tagjnak! Fordts/ - Select team name,bowler ID,bowler first name, Tisztzs bowler last name, and handicap score from the bowlers table inner joined with the teams table on bowlers.bowler ID in the bowlers table matches = teams.captain ID in the teams table inner joined with the bowler scores table on bowlers.bowler ID in the bowlers table matches = bowler_scores.bowler ID in the bowler scores table where the handicap score is greater than > all the (selection of handicap score from bowlers as B2 inner joined with the bowler scores table as BS2 on B2.bowler ID in the B2 table matches = BS2.bowler ID in the BS2 table where the B2 table bowler ID is not equal <> the bowlers

table bowler ID and the B2 table team ID is equal = to the bowlers table team ID) SQL

SELECT Teams.TeamName, Bowlers.BowlerID, Bowlers.BowlerFirstName, Bowlers.BowlerLastName, Bowler_Scores.HandiCapScore FROM (Bowlers INNER JOIN Teams ON Bowlers.BowlerID = Teams.CaptainID) INNER JOIN Bowler_Scores ON Bowlers.BowlerID = Bowler_Scores.BowlerID WHERE Bowler_Scores.HandiCapScore > All (SELECT BS2.HandiCapScore FROM Bowlers AS B2 INNER JOIN Bowler_Scores AS BS2 ON B2.BowlerID = BS2.BowlerID WHERE B2.BowlerID <> Bowlers.BowlerID AND B2.TeamID = Bowlers.TeamID)

Azrt adtunk kifejezetten lneveket a Bowlers s a Bowler_Scores tb la msodpldnyainak az allekrdezsben, hogy pontosan ltszdjk, mi is folyik. Nem az adott jtkos pontjaival akarunk sszehasonltani, mert gy az > llts hibs lenne. Hasonlkpp, csak az adott csapatban jtsz tbbi jtkos pont szmval akarunk sszehasonltst vgezni.

Recipes adatbzis
,,Jelentsd meg a rpt tartalmaz receptek hozzvalit!" A 8. fejezetben meggrtk, hogy megmutatjuk, miknt oldhatjuk meg a feladatot allekrdezssel. Betartottuk az gretnket! Fordts/ - Select recipe title and ingredient name Tisztzs from the recipes table inner joined with the recipe ingredients table on recipes.recipe ID in the recipes table matches = recipe_ingredients.recipe ID in the recipe ingredients table, and then inner joined with the ingredients table on ingredients.ingredient ID in the ingredients table matches

= recipe_ingredients.ingredient ID in the recipe ingredients table where recipe ID is in the (selection of recipe ID from the ingredients table inner joined with the recipe ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table where ingredient name is = 'carrot') SQL

SELECT Recipes.RecipeTitle, Ingredients.IngredientName FROM (Recipes INNER JOIN Recipe_Ingredients ON Recipes.RecipeID = Recipe_Ingredients.RecipeID) INNER JOIN Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID WHERE Recipes.RecipeID IN (SELECT Recipe_Ingredients.RecipeID FROM Ingredients INNER JOIN Recipe_Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID WHERE Ingredients.IngredientName = 'carrot')

Ha a ,,carrot-ra (rpa) trtn szrst a kls lekrdezsbe tesszk, csak a rpa-hozzvalkat fogjuk ltni a kimenetben. Ebben a feladat ban azonban az sszes hozzvalt ltni szeretnnk az sszes olyan recepthez, ami rpt tartalmaz, ezrt az allekrdezs hasznlata j megolds. Az eredmny ltszlag a recep tek cme szerinti sorrendben rkezik, noha nem adtuk meg az ORDER BY zradkot. Ha minden adatbzis-kezel rendszerben biztostani szeretnnk ezt a sorrendet, mindenkpp adjuk meg az ORDER BY zradkot.

sszefoglals
A fejezetet az SQL-szabvny ltal megadott hrom allekrdezs-tpus - sor-, tbla- s skalris allekrdezs meghatrozsval kezdtk, s felidztk, hogy mr foglalkoztunk a tbla-allekrdezsek FROM zradkban val hasznlatval. Rviden lertuk a sorallekr dezsek hasznlatt, s elmondtuk, hogy ezt mg nem sok kereskedelmi adatbzis-kezel tmogatja. Utna megmutattuk, hogyan hasznljuk az allekrdezseket egy SELECT zradk oszlopkife jezseknt. Megvizsgltunk egy egyszer pldt, majd bemutattunk kt sszest fggvnyt, amelyeket egy msik tblbl szrmaz sszestett informci megszerzsre hasznlhatunk (a kvetkez fejezetben rszletesen foglalkozunk az sszes sszest fggvnnyel). Ez utn azt trgyaltuk, hogy miknt adhatunk meg sszetett szrket allekrdezsek segt sgvel a WHERE zradkban. Elszr egyszer sszehasonltsokkal foglalkoztunk, aztn bemutattuk azokat az sszehasonlt kulcsszavakat IN, SOME, ANY, ALL s EXISTS , amelyek az allekrdezsekbl kpzett lltsok megalkotsakor hasznosak. sszefoglaltuk, mirt hasznosak az allekrdezsek, s adtunk pr allekrdezssel megoldhat mintapldt. A fejezet tovbbi rsze az allekrdezsek hasznlatt mutatta be pldkon keresztl. A pldkat kt csoportra bontottuk: allekrdezsek hasznlata osz lopkifejezsekben s allekrdezsek hasznlata szrkben. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis 1. ,,Jelentsd meg a termkeket s a dtumot, amikor a termkeket utoljra

megrendeltk! (Tipp: hasznljuk a MAX sszest fggvnyt.) A megolds itt tallhat: CH11_Products_Last_Date (40 sor). 2. Sorold fel azokat a vsrlkat, akik kerkprt rendeltek! (Tipp: alkossunk szrt az IN felhasznlsval.) A megolds itt tallhat: CH11_Customers_Order_Bikes (23 sor). 3. Keresd meg azokat a vsrlkat, akik kerkprt rendeltek, de nem rendeltek buksisakot! (Tipp: induljunk ki az elbbi lekrdezsbl, s adjunk hozz egy NOT EXISTS-et hasznl szrt.) A megolds itt tallhat: CH11_Customer_Bikes_No_Helmets (2 sor). 4. Melyek azok a termkek, amelyekbl mg soha nem rendeltek? (Tipp: szrjnk a NOT IN hasznlatval.) A megolds itt tallhat: CH11_Products_Not_Ordered (2 sor).
Entertainment Agency adatbzis 1. Sorold fel az eladkat s minden elad fellpseinek a szmt!

(Tipp: hasznljuk a COUNT sszest fggvnyt.) A megolds itt tallhat: CH11_Entertainers_Engagement_Count 03 sor). 2. rd ki azokat a megrendelket, akik olyan eladk fellpseit ktttk le, akik country-t vagy country rock-ot jtszanak! (Tipp: alkossunk szrt az IN felhasznlsval.) A megolds itt tallhat: CH11_Customers_Who_Like_Country (13 sor). 3. Keresd meg azokat az eladkat, akik jtszottak Berg vagy Hallmark nev megrendelinknl! (Tipp: szrjnk az = SOME segtsgvel.) A megolds itt tallhat: CH11_Entertainers_Berg_OR_Hallmark_SOME (8 sor). 4. ,,Jelentsd meg azokat az gynkket, akik nem ktttek le egyetlen eladt sem! (Tipp: A NOT IN-t hasznlva szrjnk.) A megolds itt tallhat: CH11_Bad_Agents (1 sor).
School Scheduling adatbzis 1. Sorold fel az sszes tanrt s az ltaluk tartott rk szmt!

(Tipp: hasznljuk a COUNT sszest fggvnyt.) A megolds itt tallhat: CH11_Staff_Class_Count (27 sor). 2. ,,Jelentsd meg a keddi rkra feliratkozott tanulkat! (Tipp: alkossunk szrt az IN felhasznlsval.) A megolds itt tallhat: CH11_Students_In_Class_Tuesdays (18 sor). 3. ,,Mutasd meg azokat a tanulkat, akiknek 85 vagy annl tbb a rajzbl elrt tlaguk, s 85 vagy tbb a szmtstechnikai tlaguk!

(Tipp: alkossunk szrt az EXISTS felhasznlsval.) A megolds itt tallhat: CH11_Good_Art_CS_Students_EXISTS (1 sor). 4. rd ki a szerdn tartott rkat! (Tipp: alkossunk szrt az IN felhasznlsval.) A megolds itt tallhat: CH11_Subjects_On_Wednesday (45 sor).
Bowling League adatbzis 1. Jelentsd meg az sszes tekejtkost s az ltaluk lejtszott mrkzsek szmt!

(Tipp: hasznljuk a COUNT sszest fggvnyt.) A megolds itt tallhat: CH11_Bowlers_And_Count_Games (32 sor). 2. Mutasd meg a mg le nem jtszott tornkat! (Tipp: hasznljuk a NOT IN szrt.) A megolds itt tallhat: CH11_Tourneys_Not_Played (6 sor). 3. Keresd meg azokat a jtkosokat, akiknek 170 vagy tbb volt a tiszta pontszmuk a Thunderbird Lanes s a Bolero Lanes plyn! (Tipp: alkossunk szrt az EXISTS felhasznlsval.) A megolds itt tallhat: CH11_Good_Bowlers_TBird_And_Bolero_EXISTS (11 sor). 4. rd ki azokat a jtkosokat, akiknek alacsonyabb a tiszta pontszmuk, mint a csapatuk tbbi tagjnak! (Tipp: ptsnk szrt az< ALL segtsgvel, s hasznljuk a DISTINCT-et is arra az esetre, ha egy jtkos tbbszr ugyanolyan alacsony pontszmmal jtszott.) A megolds itt tallhat: CH11_Bowlers_Low_Score (3 sor).
Recipes adatbzis 1. Mutasd meg a receptek fajtit s hogy hny recept van az adott fajtbl!

(Tipp: hasznljuk a COUNT sszest fggvnyt.) A megolds itt tallhat: CH11_Count_Of_Recipe_Types (7 sor). 2. Mutasd meg a marhahst s fokhagymt tartalmaz recepteket! (Tipp: alkossunk szrt az EXISTS felhasznlsval.) A megolds itt tallhat: CH11_Recipes_Beef_And_Garlic (1 sor). 3. Sorold jel azokat a hozzvalkat, amelyeknek a valamelyik receptben felhasznlt mennyisge eltr az alaprtelmezett mennyisgtl! (Tipp: alkossunk szrt a <> SOME felhasznlsval.) A megolds itt tallhat: CH11_Ingredients_Using_NonStandard_Measure (21 sor). 4. rd ki a mg egyetlen receptben sem hasznlt hozzvalkat! (Tipp: alkossunk szrt a NOT IN felhasznlsval.) A megolds itt tallhat: CH11_Ingredients_No_Recipe (20 sor).

Adatok sszestse s csoportostsa

Egyszer sszestsek
Ktfle statisztika ltezik: az egyiket kikeresi az ember, a msikat kitallja." - Rex Stout Nero Wolfe- Egy szajha halla

A fejezet tmakrei
sszest fggvnyek sszest fggvnyek hasznlata a szrkben Pldk sszefoglals nll feladatok

Mr tudjuk, hogyan vlasszuk ki egy adott krelemhez a szksges oszlopokat, hogyan hatrozzuk meg a rszleteket megad kifejezseket, hogyan kapcsoljuk ssze a szksges oszlopokat tartalmaz tblkat, s azt is, hogyan hatrozzuk meg az eredmnyhalmazba kerl adatokat meghatroz szrfeltteleket. Ezeket a mdszereket azrt ismertettk, hogy megtanuljuk, hogyan nyerhetnk ki rszletes adatokat az adatbzis egy vagy tbb tbljbl. Ebben s a kvetkez kt fejezetben egy lpssel tvolabbrl, tgabb perspek tvbl szemlljk az adatokat, vagyis megprblunk tfog kpet adni. Ebben a fejezetben elmondjuk, hogyan hasznljuk az sszest fggvnyeket informcik egyszer sszegzshez, a 13. fejezetben azt mutatjuk be, hogyan szervezhetjk az adatokat csoportokba a SELECT kifejezs GROUP BY zradka segtsgvel, vgl a 14. fejezetben klnfle szrsi mdszereket ismertetnk, amelyeket az adatok csoportostsa utn alkal mazhatunk.

sszest fggvnyek
Azok a krelmek, amelyekkel eddig tallkoztunk, a FROM s WHERE zradk ltal vissza adott sorokbl szrmaz, egyedi oszloprtkeket magukba foglal vlaszokat ignyeltek. Gyakran tallkozunk azonban az albbiakhoz hasonl krelmekkel, ahol csupn a sorokbl kiszmtott rtkekre van szksg a vlaszhoz. Hny vsrlnk l Seattle-ben? Mi a legalacsonyabb s mi a legmagasabb r, amit a kszletnkben szerepl ttelekhez rendeltnk? Hny trgyat tant Mike Hernandez? Hny rakor kezddik a legkorbbi rnk? Milyen hossz tlagosan egy ra? Hny ttelbl ll a 12. szm rendels? Az SQL-szabvny tbbfle sszest fggvnyt hatroz meg, amelyekkel egyetlen rtket szmthatunk ki az eredmnyhalmaz soraibl vagy egy rtkkifejezs visszaadott rtkbl. A fggvnyeket alkalmazhatjuk az sszes sorra vagy rtkre, vagy a WHERE zradk felhasznlsval sorok vagy rtkek meghatrozott rszhalmazra. sszest fggvnyek alkalmazsval meghatrozhatjuk pldul egy rtkkifejezs legkisebb vagy legnagyobb rtkeit, megszmolhatjuk az eredmnyhalmaz sorait, vagy kiszmthatjuk egy rtkkifeje zs egyedi rtkeinek az sszegt. A 12.1. brn lthat a minden adatbzis-kezel rendszer ltal tmogatott, alapvet sszest fggvnyek utastsformja.

Lthatjuk, hogy az sszest fggvnyek nyelvtana igazn egyszer s lnyegre tr. Az elz fejezetben kt sszest fggvnyt mr hasznltunk allekrdezsekben ahhoz, hogy visszaadjunk egy SELECT zradkban kiszmtott rtket, s ahhoz, hogy lekrdez znk egy WHERE zradk lltsban felhasznlhat rtket. Ezekre a felhasznlsi m dokra mutatunk mg nhny pldt a fejezet htralv rszben.

A 2003-as SQL-szabvny tucatnyinl is tbb tovbbi sszest fgg vnyt hatroz meg, de ezek kztt sok olyan van, amelyeket egyetlen fontosabb kereskedelmi adatbzis-kezel sem valst meg. Ebben a fejezetben azokra az alapvet sszest fggvnyekre sszpontostunk, amelyeket minden fontosabb rendszer tmogat. Miutn megtanultuk, hogyan hasznljuk ket, nzznk utna adatbzisunk dokumentcijban annak, hogy milyen tovbbi fggvnyeket hasznlhatunk az SQLkifejezsekben. Valamennyi sszest fggvny egyetlen rtket ad vissza, tekintet nlkl arra, hogy egy eredmnyhalmaz sorait dolgozza fel, vagy egy rtkkifejezst A COUNT(*) kivtelvel mindegyik sszest fggvny automatikusan figyelmen kvl hagyja a NULL rtkeket. Egyidejleg tbb sszest fggvnyt is hasznlhatunk az rtket visszaad kifejezsek listjban, kzvetlenl a SELECT kulcssz utn, st az sszest fggvnyeket tartalmaz s a literlis rtkeket hasznl rtkkifejezseket egytt, keverve is hasznlhatjuk. De valahnyszor sszest kifejezseket hasznlunk, jrjunk el krltekinten. Amikor egy sszest kifejezst ptnk be, arra krjk az adatbzis-kezelt, hogy egy sorcsoport alapjn szmtson ki egy rtket. A kvetkez fejezetben megtanuljuk, hogyan adjuk meg a clnak megfelel csoportokat a GROUP BY zradk segtsgvel, de ebben a fejezetben mg csak olyan egyszer lekrdezseket vizsglunk, amelyek kifejezett mdon nem hatroznak meg csoportokat. Csoport-meghatrozs hinyban az adatb ziskezel az sszest kifejezsek kiszmtshoz csoport gyannt a FROM s a WHERE zradk ltal visszaadott sszes sort hasznlja. Ha kicsit elgondolkodunk, rjhetnk, hogy nem sok rtelme lenne egy tbla valamelyik oszlopt tartalmaz rtkkifejezst hasznlni sszest fggvnyeken kvl. Emlksznk arra, amikor a COUNT s a MAX sszest fggvnyeket vezettk be a 11. fejezetben? Vizsgljuk meg a kvetkez SQL kdot: SQL

SELECT LastName, COUNT{*) As CountOfStudents FROM Students

A COUNT fggvny csoport-meghatrozs nlkli beptse arra kri az adatbzis-kezelt, hogy szmolja meg a FROM zradkbl visszakapott eredmnyhalmaz sorait A COUNT(*) egyetlen rtket ad vissza - a Students (Hallgatk) tbla sorainak szmt -, ezrt a lekrde zs csak egyetlen sort eredmnyezhet. Melyik LastName (Keresztnv) cellt kell megjelen tenie az adatbzis-kezelnek? A helyes vlasz: az adatbzis-kezel ezt nem tudja eldnteni, ezrt a fenti utasts hibs. Literlis kifejezst viszont bepthetnk, hogy javtsunk a kimeneten. Ezt azrt tehetjk meg, mert a literlis kifejezsek valjban olyan llandk, amelyeknek minden sorra nzve azonos az rtkk. Azaz a kvetkez SQL kd tkletesen helyes:

SQL

SELECT 'The number of students is: ', COUNT(*) As CountOfStudents FROM Students

Ez egyetlen sort ad vissza: The number of students is: 18

Miutn tljutottunk ezen a kis figyelmeztetsen, nzzk meg egyenknt az sszest fggvnyeket, hogyan lehetnek segtsgnkre egy-egy krds megvlaszolsban!

Sorok s rtkek megszmllsa a COUNT segtsgvel


Az SQL-szabvny a COUNT fggvny kt vltozatt hatrozza meg. A COUNT(*) eredmnyhalmazok sorait dolgozza fel, a COUNT(rtkkifejezs) pedig rtkkifejezsek visszaadott rtkeit.

Valamennyi sor sszeszmllsa


A COUNT(*) segtsgvel meghatrozhatjuk, hogy hny sort tartalmaz az eredmnyhalma zunk. A COUNT(*) fggvny az eredmnyhalmaz sszes sort szmba veszi, idertve az ismtld s a NULL rtkeket tartalmaz sorokat is. Kvetkezzen egy egyszer plda arra a krdstpusra, amit ezzel a fggvnnyel megvlaszolhatunk:

Ebben a fejezetben vgig a 4. fejezetben bevezetett Krelem- Fordts - Tisztzs - SQL-mdszert hasznljuk. Valamennyi plda azt felttelezi, hogy alaposan tanulmnyoztuk s megrtettk az elz fejezetekben trgyalt fogalmakat, klnsen a JOIN-ra s az allekrdezsekre vonatkoz fejezeteket.
rd ki a cg alkalmazottainak a szmt!" Fordts - Select the count of employees from the employees table (Vlaszd ki az alkalmazottak szmt az alkalmazottak tbljbl.) Tisztzs - Select the count of employees (*)

from the employees table


SQL

SELECT COUNT(*) FROM Employees

Figyeljk meg, hogy a tisztzsban a (*)-ot hasznltuk, hogy jelezzk, az Employees (Alkalmazottak) tbla valamennyi sort meg akarjuk szmolni. Hasznljunk mi is a csillag jellst a tisztzs sorn, amikor ilyen tpus krelmekkel dolgozunk, mert segt a megfe lel COUNT fggvny kivlasztsban. A pldabeli SELECT utasts egyetlen egyoszlopos sorbl ll halmazt eredmnyez, az Employees tbla sszes sornak szmt kpvisel szmrtkkel.

Nincs megkts arra, hogy a COUNT(*) fggvny hny sort dolgozhat fel. Azt, hogy a COUNT(*) mely sorokat vegye figyelembe, a WHERE zradkkal jelezhetjk. A kvetkez pldban egy olyan SELECT utastst adunk meg, amely az Employees tblban tallhat, Washington llamban l dolgozk sorait szmolja meg: SQL

SELECT COUNT(*) FROM Employees WHERE EmpState = 'WA'

A fejezet anyagt feldolgozva megltjuk, hogyan szrhetjk a WHERE zradk segtsgvel egy tetszleges sszest fggvny feldolgozott sorait vagy rtkeit. Amikor sszest fggvny hasznlunk egy SELECT utastsban, a fggvny eredmnyhal mazban esetenknt egy oszlopnevet is lthatunk. Egyes adatbzis-kezelk visszaadnak egy alaprtelmezett oszlopnevet is, mg msok nem. A fggvny AS paramtert hasznlva rtelmes oszlopnevet adhatunk meg az eredmnyhalmazban. Az elz plda esetben az itt lthat mdon tehetjk ezt meg: SQL

SELECT COUNT(*) AS TotalWashingtonEmployees FROM Employees WHERE EmpState = 'WA'

Az eredmnyhalmazba most mr bekerl a TotalWashingtonEmployees (sszes wa shingtoni alkalmazott) oszlop is; ez tartalmazza a COUNT(*) fggvny visszatrsi rtkt. Ahogy a 12.1. bra szintaxisdiagramja mutatja, ezt a mdszert mindegyik sszest fggvny esetben alkalmazhatjuk.

rtkek sszeszmllsa oszlopokban s kifejezsekben


A COUNT(rtkkifejezs) fggvnyt arra hasznljuk, hogy megszmlljuk, hogy egy rtk kifejezs sszesen hny nem NULL rtket ad vissza. (A kifejezs kzismert neve COUNT - mi is ezt hasznljuk a knyv htralv rszben.) A COUNT sszeszmolja az rtkkife jezs valamennyi visszaadott rtkt, tekintet nlkl arra, hogy egyediek vagy tbbszr szerepelnek, de a vgs sszestsbl automatikusan kihagyja a NULL rtkekeket. A COUNT segtsgvel a kvetkez tpus krdsre adhatunk vlaszt: Hny vsrl tntette fel, hogy melyik megyben l?" Itt azt kell megmondanunk, hogy hny valdi rtk van a megye oszlopban. Emlkezznk vissza, hogy a COUNT(*) a NULL rtkeket is figyelembe veszi, teht nem adna helyes vlaszt. Ezrt helyette a COUNT fggvnyt hasznljuk, s a kvetkezkppen fordtjuk le a krelmet:

- Select the count of non-Null county values as NumberOfKnownCounties from the customers table (Vlaszd ki a nem NULL megyertkeket NumberOfKnownCounties nven a vsrlk tbljbl.) Tisztzs - Select the count of non Null (county) values as NumberOfKnownCounties from the customers table SQL SELECT COUNT(CustCounty)

Fordts

AS NumberOfKnownCounties FROM Customers


Figyeljk meg, hogy a fordtsban s a tisztzsban hangslyozottan nem NULL rtkeket krnk. Br mr tudjuk, hogy ez a fggvny csak nem NULL rtkeket dolgoz fel, helyes gyakorlatot kvetnk, ha mindkt utastst kibvtjk a nem NULL kittellel, gy biztosan a megfelel fggvnyt fogjuk vlasztani. Az itt megadott SELECT utasts egyetlen sort eredmnyez, amely a CustCountry oszlop nem NULL rtk megyeneveinek a szmt tartalmazza. Emlkezznk vissza, hogy a COUNT fggvny a tbbszr szerepl megyeneveket (is) egyedi nek tekinti, s mindegyiket figyelembe veszi a vgs sszestsnl. Szerencsre a tbbszr elfordul rtkeket a DISTINCT mdost segtsgvel figyelmen kvl hagyhatjuk. Lssunk egy pldt, hogyan alkalmazhatjuk ezt egy adott krelem: Hny egyedi megyenv tallhat a customers tblban? Fordts - Select the count of unique non-Null county names as NumberOfUniqueCounties from the customers table (Vlaszd ki az egyedi nem NULL megyeneveket NumberOfUniqueCounties nven a vsrlk tbljbl.) Tisztzs - Select the count of unique non-Null (distinct county) values as NumberOfUniqueCounties from the customers table SQL SELECT COUNT(DISTINCT CustCounty)

AS NumberOfUniqueCounties FROM Customers


Amikor a DISTINCT mdostt hasznljuk, az adatbzis-kezel minden nem NULL rtket lekr a megye oszlopbl, kikszbli a tbbszr szerepl rtkeket, s csak ez utn szmllja ssze a megmaradt rtkeket. A rendszer akkor is hasonlan jr el, amikor a DISTINCT paramtert a SUM, AVG, MIN s fggvnyekkel hasznljuk. A kvetkez pldban kicsit ms vltozatban fogalmazzuk meg az elz krdst, hogy bemutassuk egy szr s a COUNT fggvny egyttes hasznlatt:

Hny Oregon llambeli, egyedi megyenv van a vsrlk tbljban? Fordts - Select the count of unique non-Null county names as NumberOfUniqueOregonCounties from the customers table where the state is 'OR' (Vlaszd ki azokat az egyedi nem NULL megyeneveket NumberOfUniqueOregonCounties nven a vsrlk tbljbl, amelyeknl az llam OR.) Tisztzs - Select the count of unique non-Null (distinct county) names as NumberOfUniqueOregonCounties from the customers table where the state is = 'OR' SQL SELECT COUNT(DISTINCT CustCounty)

AS NumberOfUniqueOregonCounties FROM Customers WHERE CustState = 'OR'


Meg kell jegyezzk, hogy a DISTINCT mdostt nem hasznlhatjuk a COUNT(*) fgg vnnyel egytt. Ennek a megszortsnak j oka van: a COUNT(*) a tbla minden oszlopt figyelembe veszi, s nem tud mit kezdeni azzal, ha brmelyik ismtldik, vagy NULL rt keket tartalmaz.

sszeg kiszmtsa a SUM segtsgvel


Egy szmrtk kifejezs sszegt a SUM fggvny segtsgvel szmthatjuk ki, amely az rtkkifejezs minden nem NULL rtkt feldolgozza, vgl visszaadja a kiszmtott sszeget az eredmnyhalmazban. Ha az rtkkifejezs minden sora NULL, vagy ha a FROM s a WHERE zradk kirtkelsnek eredmnye egy res halmaz, akkor a SUM NULL-t ad vissza. Lssunk egy pldt a SUM ltal megvlaszolhat krdsekre: sszesen mennyit fizetnk ki brknt a dolgozinknak Kaliforniban? Fordts - Select the sum of salary as TotalSalaryAmount from the employees table where the state is 'CA' (Vlaszd ki a fizets sszegt TotalSalaryAmount nven az alkalmazottak tbljbl, ha az llam 'CA'.) Tisztzs - Select the sum of (salary) as TotalSalaryAmount from the employees table where the state is= 'CA' SQL SELECT SUM(Salary) AS TotalSalaryAmount

FROM Employees WHERE EmpState = 'CA'


Az itt hasznlt rtkkifejezsek egyszer oszlophivatkozsok voltak. De hasznlhattunk volna szmrtkeket tartalmaz rtkkifejezseket is, mint a kvetkez pldban:

Mennyit r az aktulis raktrkszletnk? Fordts - Select the sum of wholesale price times quantity on hand as TotalInventoryValue from the products table (Vlaszd ki a nagykereskedelmi r s a kszletmennyisg szorzatt TotalInventoryValue nven a termkek tbljbl.) Tisztzs - Select the sum of (wholesale price times * quantity on hand) as TotalInventoryValue from the products table SQL SELECT SUM(WholesalePrice * QuantityOnHand) AS TotalInventoryValue FROM Products Mint tudjuk, egy sornak tnyleges rtkeket kell tartalmaznia ahhoz, hogy a SUM fggvny feldolgozza. Ebben az esetben az adatbzis-kezel a Products (Termkek) tbla minden megfelel sort feldolgozza, a SUM fggvnnyel sszegzi az eredmnyt, vgl a vgssze get visszaadja az eredmnyhalmazban. A kvetkez plda azt mutatja be, hogyan szmolhatjuk ki egyedi szmrtkek sszegt a SUM segtsgvel: Szmold ki a termkeink nagykereskedelmi rnak sszegt! Fordts - Select the sum of unique wholesale costs as SumOfUniqueWholesaleCosts from the products table (Vlaszd ki az egyedi nagykereskedelmi rak sszegt SumOfUniqueWholesaleCosts nven a termkek tbljbl.) Tisztzs - Select the sum of unique (distinct wholesale costs) as SumOfUniqueWholesaleCosts from the products table SQL SELECT SUM(DISTINCT WholesaleCost)

AS SumOfUniqueWholesaleCosts FROM Products

tlag kiszmtsa az AVG fggvnnyel


Egy jabb szmrtkeken hasznlhat fggvny az AVG, amely az rtkkifejezsek ltal visszaadott nem NULL rtkek szmtani kzept (tlagt )szmtja ki. Az AVG segtsgvel megvlaszolhatjuk pldul a kvetkez krdst: Mekkora az tlagos szerzdsi sszeg az 10014-es szm beszllt esetben? Fordts - Select the average of contract price as AverageContractPrice from the vendor contracts table where the vendor ID is 10014 (Vlaszd ki azoknak a szerzdsi sszegeknek az tlagt AverageContractPrice nven a beszllti szerzdsek tbljbl, amelyeknl a beszlltazonost 10014.)

Tisztzs - Select the average of avg (contract price) as AverageContractPrice from the vendor contracts table where the vendor ID is = 10014 SQL SELECT AVG(ContractPrice)

AS AverageContractPrice FROM Vendor_Contracts WHERE VendorID = 10014


Amikor a tisztzst ksztjk, ne felejtsk el kihzni az average (tlag) szt s avg-t rni a helyre. gyeljnk, hogy ne az average szt hasznljuk a SELECT utn, mert az average nem rvnyes SQL-kulcssz, teht az SQL-utasts rvnytelen lesz, ha hasznlni prbljuk. Az AVG fggvnyt szmrtk feldolgozsra is hasznlhatjuk, ugyangy, mint a SUM fggvnyt. Jegyezzk meg, hogy az AVG fggvnyt nem hasznlhatjuk nem szmrtk rtkkifejezsekkel. A legtbb adatbzis-kezel hibt jelez, ha ezeket a fggvnyeket karakterlnc vagy dtum tpus adatokkal prbljuk hasznlni.

Mekkora az tlagos ttelsszeg a 64-es azonostj rendelsnl?


Fordts - Select the average of price times quantity ordered as AverageItemTotal from the order details table where order ID is 64 (Vlaszd ki az r s a rendelt mennyisg szorzatt AverageItemTotal nven a rendelsek rszleteit tartalmaz tblbl, ahol a rendelsazonost 64.) Tisztzs - Select the average of avg (price times * quantity ordered) as AverageItemTotal from the order details table where order ID is = 64 SQL SELECT AVG(Price * QuantityOrdered)

AS AverageItemTotal FROM Order_Details WHERE OrderID = 64


Ne feledkezznk meg rla, hogy a soroknak rvnyes rtkeket kell tartalmazniuk a Price (r) s a QuantityOrdered (Rendelt mennyisg) oszlopokban ahhoz, hogy az AVG fel tud ja dolgozni ket. Ellenkez esetben a szmrtk kifejezsek NULL rtkre rtkeldnek ki, s az AVG fggvny a teljes sort figyelmen kvl hagyja. Ahogy a SUM esetben is, ha az rtkkifejezs minden sora NULL, vagy ha a FROM s WHERE zradk eredmnye egy res halmaz, akkor az AVG NULL rtkkel tr vissza. Kvetkez pldnkban a DISTINCT mdostt hasznljuk egy egyedi szmrtkeket tartalmaz halmaz tlagnak kiszmtshoz:

Szmtsd ki az sszes egyedi termkr tlagt!"


- Select the average of unique prices as UniqueProductPrices from the products table (Vlaszd ki az egyedi rak tlagt UniqueProductPrices nven a termkek tbljbl.) Tisztzs - Select the average of unique avg (distinct prices) Fordts

as UniqueProductPrices from the products table


SQL

SELECT AVG(DISTINCT Price) AS UniqueProductPrices FROM Products

A legnagyobb rtk meghatrozsa a MAX fggvnnyel


Egy rtkkifejezs visszaadott rtkei kzl a legnagyobbat a MAX fggvnnyel vlaszt hatjuk ki. A MAX fggvny brmilyen adattpust fel tud dolgozni, a visszaadott rtk pedig a feldolgozott adatok tpustl fgg: KARAKTERLNCOK A MAX ltal visszaadott rtket ekkor az adatbzis-kezel vagy a szmtgp ltal hasznlt jelsorrend hatrozza meg. Ha az adatb zis-kezel pldul az ASCII karakterkszleten alapul, a kis- s nagybetket nem megklnbztet sszehasonltst hasznl, a cgneveket a kvetkezkppen fogja rendezni: ...4th Dimension Productions ...Als Auto Shop ...Allegheny & associates ...Zercon Productions ...Zorn credit services. Ebben az esetben a MAX a Zorn credit services-t adja vissza legnagyobb rtkknt. Szmok A MAX fggvny a legnagyobb szmot adja vissza. Datetime A MAX idrend szerint kirtkeli a dtumokat s az idpontokat, s a legutbbi (vagy legksbbi) dtummal vagy idponttal tr vissza. Lssunk nhny pldt arra, hogy miknt hasznlhatjuk a MAX fggvnyt krdsek megvlaszolsra: Mekkora a legnagyobb sszeg, amit egy szerzds keretein bell kifizetnk? Fordts - Select the maximum contract price as LargestContractPrice from the engagements table (Vlaszd ki a legnagyobb szerzdsi sszeget LargestContractPrice nven a rendezvnyek tbljbl.) Tisztzs - Select the average of unique avg (contract price) as LargestContractPrice from the engagements table SQL SELECT MAX(ContractPrice)

AS LargestContractPrice FROM Engagements

Mekkora volt a legnagyobb sorttelsszeg a 3314. rendelsnl? Fordts - Select the maximum price times quantity ordered as LargestItemTotal from the order details table where the order ID is 3314 (Vlaszd ki a legnagyobb rat szorozva a mennyisggel LargestItemTotal nven a rendelsek rszleteit tartalmaz tblbl, ha a rendelsazonost 3314.) Tisztzs - Select the maximum (price times * quantity ordered) as LargestItemTotal from the order details table where the order ID is = 3314 SQL SELECT MAX(Price * QuantityOrdered) AS LargestItemTotal FROM Order_Details WHERE OrderID = 3314 Ksztetst rezhetnk, hogy a DISTINCT paramtert hasznljuk a legnagyobb vagy a jelenlegi rtkek egyedi pldnyainak lekrdezsre. Br az SQL-szabvny engedlyezi a DISTINCT mdostt a fggvny hasznlatakor, a DISTINCT semmilyen hatssal nem br a MAX fggvny esetben. Csak egyetlen legnagyobb rtk ltezhet, tekintet nlkl arra, hogy ez az rtk egyedi-e. Ha pldul a legutbbi felvteli idpontot keressk az Agents (gynkk) tblban, a kvetkez kt kifejezs ugyanazt az rtket fogja visszaadni:

SELECT MAX(DateHired) FROM Agents SELECT MAX(DISTINCT DateHired) FROM Agents


Mivel jelenleg az SQL-szabvny rszt kpezik, ismertettk a fggvny mindkt vltozatt, de azt javasoljuk, hogy a MAX fggvnyt a DISTINCT mdost nlkl hasznljuk. Amikor a DISTINCT mdostt hasznljuk, arra krjk az adatbzis-kezelt, hogy elszr keresse meg az egyedi rtkeket, s utna dntse el, hogy melyik kzlk a legnagyobb vagy a legutbbi, vagyis felesleges munkt vgeztetnk vele.

A legkisebb rtk meghatrozsa a MIN fggvnnyel


A MIN fggvny segtsgvel egy rtkkifejezs visszaadott rtkei kzl a legkisebbet hatrozhatjuk meg. Hasonlt a MAX fggvnyre, de a msik szlsrtket adja vissza: az els karakterlncot (sszehasonltsi mdszertl fggen), a legkisebb szmot, s a legkorbbi dtumot vagy idpontot A MIN fggvnnyel a kvetkezhz hasonl krd sekre felelhetnk: Mekkora a legkisebb sszeg, amit egy termkrt krnk? Fordts - Select the minimum price as LowestProductPrice from the products table (Vlaszd ki a legalacsonyabb rat LowestProductPrice nven a termkek tbljbl.)

Tisztzs - Select the minimum (price) as LowestProductPrice from the products table SQL SELECT MIN(Price) AS LowestProductPrice

FROM Products
Mekkora volt a legkisebb sorttelsszeg a 3314. rendelsnl? Fordts - Select the minimum price times quantity ordered as LowestItemTotal from the order details table where the order ID is 3314 (Vlaszd ki a legalacsonyabb rat szorozva a mennyisggel LowestItemTotal nven a rendelsek rszleteit tartalmaz tblbl, ha a rendelsazonost 3314.) Tisztzs - Select the minimum (price times * quantity ordered) as LowestItemTotal from the order details table where the order ID is = 3314 SQL SELECT MIN(Price * QuantityOrdered)

AS LowestItemTotal FROM Order_Details WHERE OrderID = 3314


Jegyezzk meg, hogy a DISTINCT mdostnak semmilyen hatsa nincs a MIN fggvnyre. (Mr tudjuk, hogy ez volt a helyzet a esetben is.) Csak egyetlen minimumrtk lte zik, fggetlenl attl, hogy ez az rtk egyedi-e. A kvetkez kt pldakifejezs ugyanazt az rtket fogja visszaadni: SELECT MIN(DateHired) FROM Agents SELECT MIN(DISTINCT DateHired) FROM Agents Mivel a jelenlegi SQL-szabvny rszt kpezik, ismertettk a fggvny mindkt vltozatt, de azt javasoljuk, hogy a MIN fggvnyt a DISTINCT mdost nlkl hasznljuk. Amikor a DISTINCT mdostt hasznljuk, arra krjk az adatbzis-kezelt, hogy elszr keresse meg az egyedi rtkeket, s utna dntse el, hogy melyik kzlk a legkisebb vagy a legrgebbi, vagyis felesleges munkt vgeztetnk vele.

Tbb fggvny hasznlata


Ahogy ennek a rsznek az elejn mr emltettk, egyidejleg tbb sszest fggvnyt is hasznlhatunk, gy mindssze egyetlen SELECT utastssal sszehasonlthatunk adatokat. Pldul a MIN s a MAX fggvnyekkel megjelenthetjk egy vsrlnk legrgebbi s leg jabb rendelseinek dtumt, vagy a MAX, MIN, s AVG fggvnyekkel megjelenthetjk egy tanul legalacsonyabb, legmagasabb s tlagos osztlyzatait. Kvetkezzen nhny plda arra, hogy miknt hasznlhatunk kett vagy tbb sszest fggvnyt!

,,Mutasd meg a hirdetsi rszleg dolgozinak legrgebbi s a legjabb vizsglati dtumait!


Fordts - Select the minimum review date as EarliestReviewDate and the maximum review date as RecentReviewDate from the employees table where the department is 'Advertising' (Vlaszd ki a legkorbbi vizsglati idpontot EarliestReviewDate nven s a legksbbi vizsglati idpontot RecentReviewDate nven az alkalmazot tak tbljbl, ha a rszleg Advertising'.) Tisztzs - Select the minimum review date as EarliestReviewDate, and the maximum review date as RecentReviewDate from the employees table where the department is = 'Advertising' SQL SELECT MIN(ReviewDate) AS EarliestReviewDate,

MAX(ReviewDate) AS RecentReviewDate FROM Employees WHERE Department = 'Advertising'


Hny klnbz termket tartalmazott az 553. rendels, s mennyi volt a teljes rendelsi rtk?
Fordts - Select the count of product ID as TotalProductsPurchased and the sum of price times quantity ordered as OrderAmount from the order details table where the order number is 553 (Vlaszd ki azoknak a termkazonostknak a szmt TotalProductsPurchased nven s az rak sszegt szorozva a rendelt mennyisggel OrderAmount nven a rendelsek rszleteit tartalmaz tblbl, amelyeknek a rendelsi szma 553.) Tisztzs - Select the count of (product ID) as TotalProductsPurchased, and the sum of (price times * quantity ordered) as OrderAmount from the order details table where the order number is = 553 SQL SELECT COUNT(ProductlD) AS TotalProductsPurchased,

SUM(Price * QuantityOrdered) AS OrderAmount FROM Order_Details WHERE OrderNumber = 553


Ne felejtsk el, hogy milyen megktseket kell figyelembe vennnk, amikor kt vagy tbb sszest fggvnyt hasznlunk. Elszr is, az sszest fggvnyeket nem gyazhatjuk egymsba. Ez a korltozs rvnytelenn teszi az albbi kifejezst:

SUM(AVG(LineItemTotal))
Msodszor, sszest fggvnyben rtkkifejezsknt nem hasznlhatunk allekrdezseket.

Ez a megkts rvnytelenn teszi az albbi kifejezst: AVG((SELECT Price FROM PRODUCTS WHERE Category = 'Bikes')) A megktsek ellenre lttuk, mennyire egyszeren hasznlhatk az sszest fggvnyek a SELECT zradkban viszonylag sszetett statisztikai adatok kikeressre. Most lssuk, hogyan szrhetjk egy eredmnyhalmaz adatait az sszest fggvnyek segtsgvel!

sszest fggvnyek hasznlata szrkben


Mivel az sszest fggvnyek egyetlen rtket adnak vissza, keressi felttelek sszehason lt lltsaiban is hasznlhatjuk ket. Ehhez azonban az sszest fggvnynket egy allekrdezsbe kell helyeznnk, s az allekrdezst kell az sszehasonlt llts rszeknt hasznlnunk. Ha mindez ismersen cseng, elruljuk, hogy ez nem vletlen. A 11. fejezetben mr megtanultuk, hogyan hasznlhatunk a WHERE zradkban keressi felttelek rszeknt allekrdezseket, illetve sszest fggvnyeket az allekrdezseken bell. Teht leg albbis ltalnos rtelemben vve mr tudjuk, hogyan hasznlhatjuk az sszest fggv nyeket az eredmnyhalmazban kapott adatok szrsre. Bvtsk most tovbb ezt a tudst! Az sszest fggvnyek sszehasonlt lltsokban val hasznlatval rtkkifejezsek r tkt hasonlthatjuk ssze egyetlen statisztikai rtkkel. Br literlis rtkeket is hasznlhat nnk erre a clra, az allekrdezsek rugalmasabb megoldst jelentenek, s dinamikusabb jelleget klcsnznek a felttelnek. Tegyk fel, hogy a kvetkez krelmet intzzk az adatbzis-kezelhz: Sorold fel azoknak a rendezvnyeknek a szerzdsszmt, amelyeknek a szerzdsi sszege nagyobb, mint az sszestett tlagos szerzdsi sszeg, vagy egyenl azzal! Az egyik mdszer, amivel megvlaszolhatjuk ezt a krdst, az, hogy sajt magunk kiszmtjuk az sszestett tlagos szerzdsi sszeget, s a tnyleges rtket beillesztjk az sszehasonlt lltsba: Fordts - Select the engagement number from the engagements table where the contract price is greater than or equal to $24,887.00 (Vlaszd ki azoknak a rendezvnyeknek a szerzdsszmt a rendezvnyek tbljbl, amelyeknl a szerzdsi sszeg nagyobb, mint 24 887 dollr, vagy egyenl azzal.) Tisztzs - Select the engagement number from the engagements table where the contract price is greater or equal to >= $24,887.00 SQL SELECT EngagementNumber

FROM Engagements WHERE ContractPrice >= 24887.00

De mirt dolgoznnk tbbet, mint amennyit szksges? Hasznljuk a megfelel sszest fggvnyt egy allekrdezsben, s hagyjuk a munka nehezt az adatbzis-kezelre! Fordts - Select the engagement number from the engagements table where the contract price is greater than or equal to the overall average contract price in the engagements table (Vlaszd ki azoknak a rendezvnyeknek a szerzdsszmt a rendezvnyek tbljbl, amelyeknl a rendezvnyek tbljban a szerzdsi sszeg na gyobb, mint az sszestett tlagos szerzdsi sszeg, vagy egyenl azzal.) Tisztzs - Select the engagement number

SQL

from the engagements table where the contract price is greater than or equal to the >= overall (select average avg contract price in the from engagements table) SELECT EngagementNumber FROM Engagements WHERE ContractPrice >= (SELECT AVG(ContractPrice) FROM Engagements)

Nyilvnval, hogy akkor vlasztjuk a legjobb utat, ha sszest fggvnyt hasznl allekr dezst ptnk be. Ha literlis rtket hasznlnnk, mindig ellenriznnk kellene, hogy jraszmoltuk-e az tlagos szerzdsi sszeget, mieltt vgrehajtannk a SELECT utastst, htha megvltoztattuk valamelyik szerzdsi sszeget. Radsul arrl is meg kellene gyzdnnk, hogy helyesen rtuk-e be az rtket az sszehasonlt lltsba. Mindezzel nem kell trdnnk, ha allekrdezst hasznlunk. Az AVG fggvny a SELECT minden vg rehajtsakor kirtkeldik, s mindig helyes eredmnyt ad, akr mdostottuk a szerzdsi sszegeket, akr nem. (Ez igaz brmelyik, allekrdezsben hasznlt sszest fggvnyre.) Az sszest fggvnyek ltal kirtkelt sorok szmt is korltozhatjuk az allekrdezs WHERE zradkban. gy leszkthetjk az sszest fggvny ltal szolgltatott statisztikai rtkek krt. A 11. fejezet ta mr tudjuk, hogyan alkalmazzuk a WHERE zradkot allekrdezsekben, nzznk teht egy pldt a mdszer alkalmazsra:

Sorold fel az sszes olyan rendezvny szerzdsszmt s szerzdsi sszegt, amelyeknl a szerzdsi sszeg nagyobb, mint a szerzdsi sszegek teljes sszege 2007 szeptember hnapjnak egszre nzve!
Fordts - Select engagement number and contract price from the engagements table where the contract price is greater than the sum of all contract prices of engagements dated between September 1, 2007, and September 30, 2007

(Vlaszd k i azokat a rendezvnyszmokat s szerzdsi sszegeket a ren dezvnyek tbljbl, ahol a szerzdsi sszeg nagyobb, mint a 2007. szep tember 1. s 2007. szeptember 30. kztti rendezvnyek szerzdsi ssze geinek sszege.) Tisztzs - Select engagement number, and contract price

from the engagements table where the contract price is greater than > the (select sum of all (contract prices) from engagements where dated start date between September 1, 2007 '2007-09-01' and Septomber 30, 2007 '2007-09-30')
SQL

SELECT EngagementNumber, ContractPrice FROM Engagements WHERE ContractPrice > (SELECT SUM(ContractPrice) FROM Engagements WHERE StartDate BETWEEN ' 2 0 0 7 - 0 9 - 0 1 ' AND ' 2 0 0 7 - 0 9 - 3 0 ' )

Azt tapasztalhatjuk, hogy a szrkben nem srn van szksg sszest fggvnyekre, de hasznunkra lehetnek, amikor egyes ritkn felbukkan, rendhagy krdsekre kell felelnnk.

Pldk
Ebben a fejezetben megtanultuk, hogyan hasznljuk az sszest fggvnyeket a SELECT zradkban s allekrdezseken bell, sszehasonlt lltsok rszeknt. Most a minta adatbzisok tblinak segtsgvel bemutatunk nhny tovbbi pldt az sszest fgg vnyek hasznlatra. Pldink az sszest fggvnyek hasznlatt kimeneti oszlopokban s allekrdezsekben mutatjk be. Ezenkvl ksztettnk az eredmnyhalmazokbl is mintkat; ezek kzvetlenl az SQLutastsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ugyanaz, mint a CD-mellkleten tallhat megfelel SQL-lekrdezs neve. Minden lekrdezst a megfe lel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz le krdezsek neve ,,CH12-vel kezddik. A pldkat a knyv elejn tallhat bevezets t mutatst kvetve tlthetjk be s prblhatjuk ki.

Ne felejtsk el, hogy a pldinkban hasznlt oszlop- s tblanevek a B fggelkben tallhat mintaadatbzisok szerkezetbl szr maznak. Az egyszersg kedvrt a kvetkez pldkban sszevontuk a Fordts s a Tisztzs lpseit.

Sales Orders adatbzis


Hny vsrlnk van Kalifornia llamban?" Fordts/ - Select the count(*) as NumberOfCACustomers Tisztzs of all customers from the customers table where the state is = 'CA' SQL SELECT COUNT(*) AS NumberOfCACustomers

FROM Customers WHERE CustState = 'CA'

Sorold fel azokat a termkneveket s szmokat, ahol a jegyzett r nagyobb, mint az sszestett tlagos fogyaszti r a termkek tbljban, vagy egyenl azzal!" Fordts/ - Select the product name, and the product number Tisztzs from the products table inner joined with the order details table on products.product number in the products table matches = order_details.product number in the order details table where the quoted price is greater than or equal to >= (select the average avg(retail price) in the from products table)
SQL

SELECT DISTINCT Products.ProductName, Products.ProductNumber FROM Products INNER JOIN Order_Details ON Products.ProductNumber Order_Details.ProductNumber WHERE Order_Details.QuotedPrice >= (SELECT AVG(RetailPrice) FROM Products)

Azrt dntttnk a DISTINCT hasznlata mellett, mert (legalbbis remljk) egy termkbl egynl tbbet is rendelhettek, s minden termknevet s szmot csak egyszer szeretnnk ltni.

Entertainment Agency adatbzis


Sorold fel a legkorbbi idpont rendezvnyek szerzdsszmt s szerzdsi sszegt! Fordts/ - Select engagement number, and contract price Tisztzs from the engagements table where the start date is equal to the = earliest (select min(start date) in the from engagements table) SQL SELECT EngagementNumber, ContractPrice

FROM Engagements WHERE StartDate = (SELECT MIN(StartDate) FROM Engagements)

Mennyi volt a 2007 oktberben lekttt szerzdsek teljes rtke? Fordts/ - Select the sum of (contract price) as TotalBookedValue Tisztzs from engagements table where the start date is between October 1, 2007 '2007-10-01' and October 31, 2007 '2007-10-31' SQL SELECT SUM(ContractPrice) AS TotalBookedValue

FROM Engagements WHERE StartDate BETWEEN '2007-10-01' AND '2007-10-31'

School Scheduling adatbzis


Mekkora a legnagyobb sszeg, amit valamelyik alkalmazottnak fizetnk?" Fordts/ - Select the maximum (salary) as LargestStaffSalary Tisztzs from the staff table SQL SELECT Max(Salary) AS LargestStaffSalary

FROM Staff

Mekkora a kaliforniai alkalmazottainknak kifizetett teljes sszeg? Fordts/ - Select the sum of (salary) as TotalAmountPaid Tisztzs from the staff table for all our California staff where state = 'CA' SQL SELECT SUM(Salary) AS TotalAmountPaid

FROM Staff WHERE StfState = 'CA'

Bowling League adatbzis


Hny mrkzst jtszottak a Red Rooster Lanes plyn? Fordts/ - Select the count of (tourney location)s as NumberOfTournaments Tisztzs from the tournaments table where the tourney location is = 'Red Rooster Lanes' SQL SELECT COUNT(TourneyLocation)

AS NumberOfTournaments FROM Tournaments WHERE TourneyLocation = 'Red Rooster Lanes'

Sorold fel bcsorrendben azoknak a tekejtkosoknak a vezetk- s keresztnevt, akiknek az tlagos egyni pontszma nagyobb, mint az sszestett tlagos egyni pontszm, vagy egyenl azzal!" Fordts/ - Select the last name, and first name from the bowlers table Tisztzs where the (select average avg(raw score) from the bowlers scores table as BS for the current bowler where BS.bowler ID = bowlers.bowler ID) is greater than or equal >= overall (select avg(raw score) score in the from bowler scores table) sorted order by last name, and first name SQL SELECT Bowlers.BowlerLastName,

Bowlers.BowlerFirstName FROM Bowlers WHERE (SELECT AVG(RawScore) FROM Bowler_Scores AS BS

WHERE BS.BowlerID = Bowlers.BowlerID) >= (SELECT AVG(RawScore) FROM Bowler_Scores) ORDER BY Bowlers.BowlerLastName, Bowlers.BowlerFirstName

Vegyk szre, hogy a problma tletes megoldsra a WHERE zradkban kt allekrdezst hasznltunk.

Recipes adatbzis
Hny recepthez van szksg marhahsra?"
Fordts/ - Select the count (*) of recipes as NumberOfRecipes Tisztzs from the recipes table
where

the recipe ID is in the (selection of recipe IDs in the from recipe ingredients table inner joined with the ingredients table on recipe_ingredients.ingredient ID in the recipe ingredients table matches = ingredients.ingredient ID in the ingredients table where the ingredient name is like 'Beef%')

SQL

SELECT COUNT(*) AS NumberOfRecipes FROM Recipes WHERE Recipes.RecipeID IN (SELECT RecipeID FROM Recipe_Ingredients INNER JOIN Ingredients ON Recipe_Ingredients.IngredientID = Ingredients.IngredientID WHERE Ingredients.IngredientName LIKE 'Beef%')

Hny hozzvalt mrnek csszvel? Fordts/ - Select the count (*) of ingredients as NumberOfIngredients Tisztzs from the ingredients table inner joined with the measurements table on ingredients.measure amount ID in the ingredients table matches = measurements.measure amount ID in the measurements table where the measurement description is = 'Cup' SQL SELECT COUNT(*) AS NumberOfIngredients

FROM Ingredients INNER JOIN Measurements ON Ingredients.MeasureAmountID = Measurements.MeasureAmountID WHERE MeasurementDescription = 'Cup'

sszefoglals
A fejezetet az sszest fggvnyek bemutatsval kezdtk. Megtanultuk, hogy hat ilyen fggvny van, s azt, hogy miknt hasznlhatjuk ket a SELECT utastsban s a SELECT WHERE zradkban. Azt is megtudtuk, hogy - a COUNT(*) kivtelvel a feladata vgrehajtsa kzben valamennyi fggvny figyelmen kvl hagyja a NULL rtkeket.

Ez utn bemutattuk az egyes sszest fggvnyek hasznlatt. Megtanultuk, hogyan szmolhatunk sorokat s rtkeket a COUNT fggvnyek segtsgvel, hogyan tallhatjuk meg a legkisebb s a legnagyobb rtkeket a MIN s a MAX fggvnyekkel, hogyan szmolhatunk kzprtket az AVG fggvnnyel, s azt is, hogyan sszegezhetnk halmazokat a SUM fggvnnyel Mindegyik fggvny esetben bemutattuk a DISTINCT mdost hasznlatt, s megemltettk, hogy ennek a mdostnak nincs hatsa a MIN s a MAX fggvnyre. A fejezetet az sszest fggvnyek szrkben val hasznlatnak bemutatsval zrtuk. Most mr tudjuk, hogyan hasznlhatunk sszest fggvnyeket allekrdezsekben, s hogyan alkalmazhatjuk ezeket az allekrdezseket szrk rszeknt. Arra is fny derlt, hogy a szrket allekrdezsekben is alkalmazhatjuk, amikor az sszest fggvnyek rtke egy meghatrozott halmaz adatain alapul. ppen csak zeltt kaptunk abbl, hogy mi mindenre lehetnk kpesek sszest fggv nyekkel A kvetkez kt fejezetben azt mutatjuk be, hogyan szolgltassunk mg kifino multabb statisztikai adatokat gy, hogy az sszest fggvnyeket csoportostott adatokra alkalmazzuk, s hogyan alkalmazzunk szrket sszest szmtsokra. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis


1. Mekkora a mountain bike kerkprok tlagos fogyaszti ra?"

A megolds itt tallhat: CH12_Average_Price_Of_A_Mountain_Bike (1 sor).


2. Mi volt az utols rendelsnk dtuma?"

A megolds itt tallhat: CH12_Most_Recent_Order_Date (1 sor).


3. Mekkora volt a 8. szm rendels vgsszege?"

A megolds itt tallhat: CH12_Total_Amount_For_Order_Number_8 (1 sor).

Entertainment Agency adatbzis 1. Mekkora a rendezvnyszervez gynkk tlagos fizetse?

A megolds itt tallhat: CH12_Average_Agent_Salary (1 sor).


2. Sorold fel minden olyan rendezvny szerzdsszmt, ahol a szerzdsi sszeg

nagyobb, mint az sszestett tlagos szerzdsi sszeg, vagy egyenl azzal!" (Tipp: a krds megvlaszolshoz allekrdezs hasznlata szksges.) A megolds itt tallhat: CH12_Contract_Price_GE_Average_Contract_Price (45 sor). 3. Hny eladnk van Bellevue-ben? A megolds itt tallhat: CH12_Number_Of_Bellevue_Entertainers (1 sor).
School Scheduling adatbzis 1. Milyen hossz jelenleg az tlagos rahossz? 2.

A megolds itt tallhat: CH12_Average_Class_Duration (1 sor). Sorold fel a tanri kar minden olyan tagjnak vezetk- s keresztnevt, akik a legkorbbi jelvteli idpont ta velnk vannak! (Tipp: a megoldshoz a DateHired oszlopot kirtkel sszest fggvnyt tartalmaz allekrdezsre van szksg). A megolds itt tallhat: CH12_Most_Senior_Staff_Members (3 sor). 3. Hny rt tartanak a 3346. teremben? A megolds itt tallhat: CH12_Number_Of_Classes_Held_In_Room_3346 (1 sor).

Bowling League adatbzis 1. Mekkora a legnagyobb bntetpontszm, amellyel jelenleg egy tekejtkos

rendelkezik?" A megolds itt tallhat: CH12_Current_Highest_Handicap (1 sor). 2. Mely helyszneken tartottak tornkat a legkorbbi tornaidpontban?" A megolds itt tallhat: CH12_Tourney_Locations_For_Earliest_Date (2 sor). 3. Mi az idrendben tallhat legksbbi torna idpontja?" A megolds itt tallhat: CH12_Last_Tourney_Date (1 sor).
Recipes adatbzis 1. Melyik recepthez kell a legtbb gerezd fokhagyma?"

(Tipp: a megoldshoz tbb INNER JOIN s egy allekrdezs alkalmazsra lesz szksg.) A megolds itt tallhat: CH12_Recipe_With_Most_Cloves_of_Garlic (1 sor). 2. Szmold ssze a ftelek receptjeit!" (Tipp: a megoldshoz a Recipe_Classes s a Redpes tblk kztti JOIN alkalmazsra lesz szksg.) A megolds itt tallhat: CH12_Number_Of_Main_Course_Recipes (1 sor). 3. Szmold ki, hny teskanl sra van szksg az sszes recepthez!" A megolds itt tallhat: CH12_Total_Salt_Used (1 sor).

Adatok csoportostsa
Ne merlj el a rszletekben - nzd a teljes kpet! - Ferdinand Foch marsall, a Franciaorszgban llomsoz szvetsges csapatok fparancsnoka

A fejezet tmakrei
Mirt csoportostsuk az adatokat? A GROUP BY zradk Bizonyos korltozsokkal Pldk sszefoglals nll feladatok

A 12. fejezet azt magyarzta el, hogy az sszest fggvnyek (COUNT, MIN, MAX, AVG s SUM) segtsgvel hogyan krhetjk az SQL-t arra, hogy szmtson ki egy rtket a FROM s WHERE zradkban meghatrozott tbla soraibl. Ugyanakkor rmutattunk, hogy ha a SELECT zradkban olyan rtkkifejezst hasznlunk, amely sszest fggvnyt tartalmaz, akkor vagy minden rtkkifejezsnknek literlis rtknek kell lennie, vagy sszest fgg vnyt kell tartalmazniuk. Ennek a jellegzetessgnek j hasznt vehetjk, ha csak sszest sek egyetlen sort szeretnnk ltni, de mi a helyzet akkor, ha a rszsszegekre is kvncsiak vagyunk? Ebben a fejezetben azt mutatjuk be, hogyan llthatunk el ilyen rszsszegeket az adatok csoportostsa rvn.

Mirt csoportostsuk az adatokat?


Ha a Sales Orders adatbzissal dolgozunk, valban hasznos lehet, ha ki tudjuk mutatni a rendelsek szmt (COUNT), az eladsok sszegt (SUM), az eladsok tlagt (AVG), s a legkisebb (MIN) vagy a legnagyobb rendels (MAX) sszegt. Ha ki akarjuk szmolni ezen rtkek brmelyikt egy vsrlra, megrendelsi dtumra vagy termkre vonatko zan, bevezethetnk egy szrt (WHERE), ami kigyjti az adott vsrlra vagy termkre

vonatkoz sorokat. De mi van akkor, ha az sszes vsrlra vonatkoz rszeredmnyeket szeretnnk ltni, a vsrlk neveivel a rszeredmny mellett? Ehhez arra kell krnnk az adatbzis-kezelt, hogy csoportostsa a sorokat. Hasonlkppen, az Entertainment Agency adatbzisbl knnyen kszthetnk kimutatst a rendezvnyek szmrl, sszesthetjk a szerzdsi sszegeket, vagy megkereshetjk a legalacsonyabb s a legmagasabb szerzdsi sszegeket az sszes rendezvnyre vonat kozan. Mg szrhetjk is a sorokat, ha ezeket a szmtsokat egy bizonyos eladra vagy megrendelre, esetleg egy adott dtumra vonatkozan szeretnnk ltni. De ha minden egyes megrendelre vagy eladra vonatkozan egy-egy sorsszeget szeretnnk ltni, megint csak csoportostanunk kell a sorokat.

Kezd vilgoss vlni a dolog? Amikor arra krjk az adatbzis-kezelt, hogy oszloprtkek vagy kifejezsek alapjn csoportostsa a sorokat, az a sorokbl rszhalmazokat hoz ltre a megegyez rtkek alapjn. Ezutn megkrhetjk az adatbzis-kezelt, hogy minden csoportra szmtsa ki az szestett rtkeket. Lssunk egy egyszer pldt az Entertainment Agency adatbzisbl! Elszr is egy olyan lekrdezst kell felptennk, amely kivlasztja a lnyeges oszlopokat: az elad nevt s a szerzds rt. me az SQL kd: SQL

SELECT Entertainers.EntStageName, Engagements.ContractPrice FROM Entertainers

INNER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID ORDER BY EntStageName


Az eredmny valami olyasmi lesz, mint ami az albbi tblzatban lthat. (A mintaadatb zisban ezt a krelmet CH13_Entertainers_And_ContractPrices nven talljuk meg.) Mr tudjuk, hogy megszmolhatjuk az sszes sort, vagy megkereshetjk a ContractPrice (Szerzdses r) oszlop legkisebb, illetve legnagyobb elemt, sszegt vagy tlagt - felt ve, hogy kikszbljk az EntStageName (Elad mvszneve) oszlopot. De akr meg is tarthatjuk az oszlopot, feltve, hogy arra krjk az adatbzis-kezelt, hogy ennek alapjn alkosson csoportokat. Ha az elad mvszneve szerint krnk csoportostst, az adatb zis-kezel ltrehoz egy csoportot (vagyis egyttest) az els tizenegy sorbl ("Carol Peacock Trio"), egy msodikat a kvetkez tizenegybl ("Caroline Coie Cuartet"), s gy tovbb, vgig az egsz tbln. Ezutn mr krhetjk a sorok megszmllst (COUNT), vagy a ContractPrice oszlop SUM, MIN, vagy AVG fggvnyt, s egyetlen sszestett sort fogunk kapni eladnknt. Az eredmny a kvetkez tblzatban lthat:

rdekesnek tnik, ugye? Fogadjunk, hogy tudni szeretnnk, hogyan csinltuk ezt! Nos, a kvetkez rszekben felfedjk a rszleteket.

A GROUP BY zradk
Ahogyan a 12. fejezetben felfedeztk, sokfle rdekes informcit szerezhetnk az sszes t fggvnyek segtsgvel. Ugyanakkor megfigyelhettk, hogy mindegyik pldnk a FROM s a WHERE zradkok ltal visszaadott sszes soron vgrehajtotta az sszest fggvnyeket. Szrhettk ugyan az eredmnyt egyetlen csoportra a WHERE zradkkal, de igazbl nem volt mdunk egy krelemben megnzni a tbbfle csoportbl szrmaz eredmnyeket. Ahhoz, hogy kpesek legynk egy krelmen bell csoportok szerint ssze gezni, szksgnk lesz arra, hogy felvegynk mg egy fontos elemet az SQL-sztrunkba a GROUP BY zradkot.

Utastsforma
Nzzk meg alaposabban a GROUP BY zradkot! A SELECT utastshoz hozzadott GROUP BY alapvet utastsformjt a 13.1. bra mutatja.

A korbbi fejezetekbl mr tudjuk, hogy az adataink forrsul szolgl tblkat a FROM zradkban hatrozzuk meg. A FROM zradkban llhat egyetlen tbla neve, de akr sszetett, JOIN segtsgvel tbbszrsen sszekapcsolt tblk is. Ahogy a 8. fejezetben trgyaltuk, akr egy teljes tbla-allekrdezst (azaz egy SELECT utastst) is begyazhatunk tblahivatkozsknt. Ez utn szksg esetn megadhatunk egy WHERE zradkot is, ahol eldntjk, hogy eldobjuk vagy megtartjuk a FROM zradk megfelel eredmnysorait A WHERE zradkkal a 6. fejezetben foglalkoztunk rszletesen. Amikor egy GROUP BY zradkot adunk az utastshoz, azt rjuk el az adatbzis-kezel nek, hogy a FROM s WHERE zradkok ltal ltrehozott logikai tbla mely oszlopait hasznlja a sorcsoportok meghatrozshoz. Azok a sorok, amelyek az ltalunk elrt osz lopokban ugyanazt az rtket tartalmazzk, egy csoportot fognak alkotni. A GROUP BY

zradkban felsorolt oszlopokat rtkkifejezsekben hasznlhatjuk a SELECT zradkban, s mindegyik csoporton az elz fejezetben trgyalt brmelyik sszest fggvnnyel vgezhetnk szmtsokat. Nzzk meg, hogy a GROUP BY zradk alkalmazsval hogyan szmthatjuk ki egytte senknt (eladcsoportonknt) a szerzdsi sszegekre vonatkoz adatokat ez az a plda, amivel mr korbban knoztuk magunkat. A 13.2. brn lthat, hogy mely tblk szksgesek a problma megoldshoz.

Ebben a fejezetben vgig a 4. fejezetben bevezetett Krelem - Fordts - Tisztzs - SQL"-mdszert kvetjk. rd ki minden egyttes nevt, az egyttes szerzdseinek szmt, a szerzdsek sszestett sszegt, a legalacsonyabb s a legmagasabb szerzdsi sszeget s az sszes szerzdskre vonatkoz tlagos szerzdsi sszeget!" (Tipp: amikor olyan krelemmel van dolgunk, ahol megszmllunk, sszegznk, legki sebb vagy legnagyobb rtket szmtunk, vagy az tlagos szerzdsi sszeget kell megha troznunk a szerzdsek[contracts] rszletei alapjn, de magasabb [entertainers] szinten, akkor a krelemben sszest fggvnyeket s csoportostst kell alkalmaznunk. Ne felejt sk el, hogy valsznleg minden elad tbb szerzdssel rendelkezik.) Fordts - Select entertainer name, the count of contracts, the sum of the contract price, the lowest contract price, the highest contract price, and the average contract price from the entertainers table joined with the engagements table on entertainer ID, grouped by entertainer name (Vlaszd ki az elad nevt, a szerzdsek szmt, az sszestett szerzdsi sszeget, a legalacsonyabb szerzdsi sszeget, a legmagasabb szerzdsi

sszeget s az tlagos szerzdsi sszeget az eladk s a rendezvnyek tbljt az eladazonost szerint sszekapcsolva, s csoportostsd az eredmnyt az eladk neve alapjn.) Tisztzs - Select entertainer name, the count of(*) contracts, the sum of the (contract price), the lowest min(contract price), the highest max(contract price), and the average avg(contract price) from the entertainers table inner joined with the engagements table on entertainers.entertainer ID in the entertainers table matches = engagements.entertainer ID in the engagements table, grouped by entertainer name SQL SELECT Entertainers.EntStageName,

COUNT(*) AS NumContracts, SUM(Engagements.ContractPrice) AS TotPrice, MIN(Engagements.ContractPrice) AS MinPrice, MAX(Engagements.ContractPrice) AS MaxPrice, AVG(Engagements.ContractPrice) AS AvgPrice FROM Entertainers INNER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID GROUP BY Entertainers.EntStageName
Vegyk szre, hogy a legalacsonyabb szt a MIN fggvnnyel, a legmagasabb-at MAX fggvnnyel, az tlag-ot pedig az AVG fggvnnyel helyettestettk, ahogyan azt mr az elz fejezetben bemutattuk. A COUNT(*) fggvnyt is alkalmaztuk, mivel meg akar tuk szmllni az sszes szerzds (contract) sort, fggetlenl az esetleges NULL rtkek tl. A GROUP BY zradk hozzadsa az, ami lehetv teszi, hogy az eladk csoportjain (egytteseken) hajtsunk vgre sszest szmtsokat. Az eladk nevt is ennek a zra dknak ksznheten hasznlhatjuk a SELECT utastsban. (A mintaadatbzisban ezt a krelmet CH13_Aggregate_Contract_Info_By_Entertainer nven talljuk meg.) Arra szmtottunk, hogy a fenti lekrdezs minden eladra kln sort ad vissza? Mi a helyzet azokkal az eladkkal, akiknek nincs lekttt fellpsk? Visszagondolva a 9. fejezetben az OUTER JOIN szerkezettel kapcsolatban tanultakra, esetleg a kvetkez megoldssal prblkoznnk: SQL

SELECT Entertainers.EntStageName, COUNT(*) AS NumContracts, SUM(Engagements.ContractPrice) AS TotPrice,

MIN(Engagements.ContractPrice) AS MinPrice, MAX(Engagements.ContractPrice) AS MaxPrice, AVG(Engagements.ContractPrice) AS AvgPrice FROM Entertainers LEFT OUTER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID GROUP BY Entertainers.EntStageName
rdekes dolog az sszest fggvnyekkel kapcsolatban, hogy figyelmen kvl hagyjk a NULL rtk sorokat. A fenti lekrdezs NULL rtket ad vissza a TotPrice, MinPrice, MaxPrice s AvgPrice rtkekre azoknak az eladknak az esetben, akiknek nincs lekttt fellpsk, de azt tapasztaljuk, hogy a NumContracts 1 rtket vesz fel! Hogy lehetsges ez? Nos, ez az SQL utasts a COUNT(*) fggvnyt hasznlja - azaz az sszes visszaadott sort megszmoljuk. Az OUTER JOIN pontosan egy sort ad vissza azoknl az eladknl, akiknek nincs lekttt fellpsk, ezrt a COUNT ltal visszaadott l helyes rtk. De ha visszaemlksznk az elz fejezetre, esznkbe juthat a COUNT(rtkkifejezs) fggvny is, ami arra utastja az adatbzis-kezel rendszert, hogy a megadott rtkkifejezs vagy oszlopnv sszeszmllsnl csak a NULL rtktl klnbz sorokat vegye figyelembe. Finomtsuk tovbb a lekrdezst: SQL

SELECT Entertainers.EntStageName, COUNT(Engagements.EntertainerID) AS NumContracts, SUM(Engagements.ContractPrice) AS TotPrice, MIN(Engagements.ContractPrice) AS MinPrice, MAX(Engagements.ContractPrice) AS MaxPrice, AVG(Engagements.ContractPrice) AS AvgPrice FROM Entertainers LEFT OUTER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID GROUP BY Entertainers.EntStageName

Mivel az Engagements (Rendezvnyek) tblban tallhat EntertainerID (Eladazonost) oszlop NULL rtk azoknak az eladknak az esetben, akiknek nincs lekttt fellpsk, semmit sem kell megszmolni. Ha lefuttatjuk a lekrdezst, ltjuk, hogy a NumContracts a helyes, 0 rtket veszi fel, ha az eladnak nincs lekttt fellpse. Mi a helyzet akkor, ha egynl tbb rtk alapjn akarunk (vagy szksges) csoportostani? Nzzk mg egyszer ugyanezt a problmt, de most a megrendelk, s nem az eladk szemszgbl, s ttelezzk fel, hogy az eredmnyhalmazban fel szeretnnk tntetni a megrendel keresztnevt s vezetknevt is. A szksges tblkat a 13-3- bra mutatja.

"Sorold fel minden megrendel kereszt- s vezetknevt, a megrendel szerzdseinek szmt s szerzdsi sszegt, a legalacsonyabb s a legmagasabb szerzdsi sszeget, s a megrendel sszes szerzdsre vonatkoz tlagos szerzdsi sszeget!" Fordts - Select customer last name, customer first name, the count of contracts, the sum of the contract price, the lowest contract price, the highest contract price, and the average contract price from the customers table joined with the engagements table on customer ID, grouped by customer last name and customer first name (Vlaszd ki a megrendel keresztnevt, vezetknevt, a szerzdsek szmt, az sszestett szerzdsi sszegeket, a legalacsonyabb szerzdsi sszeget, a legmagasabb szerzdsi sszeget, s az tlagos szerzdsi sszeget a megrendelk s a rendezvnyek tbljbl, amelyet a megren del-azonost alapjn sszekapcsoltunk, s csoportostsd az eredmnyt a megrendelk vezetkneve s keresztneve alapjn.) Tisztzs - Select customer last name, customer first name, the count of(*) contracts, the sum of the (contract price), the lowest min(contract price), the highest max(contract price), and the average avg(contract price) from the customers table inner joined with the engagements table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table grouped by customer last name, and customer first name SQL SELECT Customers.CustLastName,

Customers.CustFirstName, COUNT(*) AS NumContracts, SUM(Engagements.ContractPrice) MIN(Engagements.ContractPrice) MAX(Engagements.ContractPrice) AVG(Engagements.ContractPrice)

AS AS AS AS

TotPrice, MinPrice, MaxPrice, AvgPrice

FROM Customers INNER JOIN Engagements ON Customers.CustomerID = Engagements.CustomerID GROUP BY Customers.CustLastName, Customers.CustFirstName
Az eredmny a kvetkez tblzatban lthat (a mintaadatbzisban ezt a krelmet CH13_Aggregate_Contract_Info_By_Customer nven talljuk meg):

Mivel a megrendel nevnek megjelentshez kt oszlopra van szksgnk, mindkettt fel kellett hasznljuk a GROUP BY zradkban. Emlkezznk vissza, hogy ha olyan oszlo pot akarunk ltni a kimenetben, ami nem sszest szmts eredmnye, akkor az oszlopot a GROUP BY zradkba is be kell pteni. A ContractPrice oszlopot azrt nem ptettk be a GROUP BY zradkba, mert szmos sszest fggvnyt tartalmaz kifejezsben felhasz nltuk. Ha valban beptettk volna a ContractPrice oszlopot, megrendelk s sszegek egyedi csoportjait kaptuk volna. A MIN, MAX s AVG fggvnyek mind ezeket a csoporto stott sszegeket adjk vissza. A COUNT csak akkor lesz egynl nagyobb, ha egy adott megrendelhz egynl tbb azonos sszeg szerzds tartozik. Ha kicsit jobban elgondol kodunk ezen, rjhetnk, hogy a megrendel s sszeg szerinti csoportosts, majd a COUNT fggvnnyel val sszests j mdszer lehet azoknak a megrendelknek a meg keressre, akiknek tbb, azonos sszeg szerzdsk van. Azt gondolnnk, hogy ez a lekrdezs azokat a megrendelket is tartalmazza, akik nem ktttek le fellpst, de nem gy van! Ha valamennyi megrendel adatait meg szeretnnk kapni, tekintet nlkl arra, hogy ktttek-e szerzdst vagy sem, akkor az OUTER JOIN hasznlatra lesz szksgnk, s krltekinten meg kell szmolnunk az Engagements tbla valamelyik oszlopt a COUNT segtsgvel A megolds hasonl ahhoz, amit mr korbban ismertettnk az eladkkal s a rendezvnyekkel kapcsolatban.

Oszlopok s kifejezsek vegyes hasznlata


Tegyk fel, hogy egy oszlopban szeretnnk felsorolni a megrendel nevt, egy msikban oszlopban a megrendel cmt, a legutbbi szerzds dtumt, s az sszestett szerzdsi sszegeket. A megrendel neve a kvetkez kt oszlopbl ll: CustFirstName (Megrendel keresztneve) s CustLastName (Megrendel vezetkneve). A teljes cmhez szksges oszlo pok a CustStreetAddress (cm), a CustCity (vros), a CustState (llam) s a CustZipCode (irnytszm). Lssuk, hogyan foghatunk neki a lekrdezshez szksges SQL-utasts megalkotsnak (a krelmet a mintaadatbzisban CH13_Customers_Last_Booking nven talljuk meg): rd ki minden megrendel teljes nevt, teljes cmt, a legutbbi szerzds dtumt, s a szerzdsek teljes sszegt!" Fordts - Select customer last name and customer first name as CustomerFullName; street address, city, state, and ZIP Code as CustomerFullAddress; the latest contract start date; and the sum of the contract price from the customers table joined with the engagements table on customer ID, grouped by customer last name, customer first name, customer street address, customer city, customer state, and customer ZIP Code (Vlaszd ki a megrendel keresztnevt s vezetknevt CustomerFullName nven; az utcanevet, vrost, llamot s irnytszmot CustomerFullAddress nven; a legutbbi szerzds kezd idpontjt; tovbb az sszestett szerzdsi sszegeket a megrendelk s a rendezvnyek tblibl, amelyeket a megrendel-azonost alapjn sszekapcsoltunk, s csoportostsd az eredmnyt a megrendelk vezetkneve, keresztneve, illetve a megrendel lakcmnek utcaneve, vrosa, llama s irnytszma alapjn.) Tisztzs - Select customer last name and || ', ' || customer first name as CustomerFullName, street address; || ', ' || city; || ', ' || state, and || ' ' || ZIP Code as CustomerFullAddress, the latest max(contract start date) as latest date, and the sum of the (contract price) as total contract price from the customers table inner joined with the engagements table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table grouped by customer last name, customer first name, customer street address, customer city, customer state, and customer ZIP Code SQL SELECT Customers.CustLastName || ', ' ||

Customers.CustFirstName AS CustomerFullName, Customers.CustStreetAddress || ', ' || Customers.CustCity || ', ' ||

Customers.CustState || ' ' || Customers.CustZipCode AS CustomerFullAddress MAX(Engagements.StartDate) AS LatestDate, SUM(Engagements.ContractPrice), AS TotalContractPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerID = Engagements.CustomerID GROUP B Y Customers.CustLastName, Customers.CustFirstName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode
Figyeljk meg, hogy fel kellett sorolnunk a kimeneti kifejezsben hasznlt minden egyes olyan oszlopot, amelyet nem ptettnk be valamelyik sszest fggvnybe. A StartDate (Kezd dtum) s a ContractPrice (Szerzdses r) oszlopokat hasznltuk sszest kifeje zsben, ezrt nem kellett ket a GROUP BY zradkban felsorolnunk. Tulajdonkppen nem lett volna tl sok rtelme sem a StartDate, sem a ContractPrice alapjn csoportostani, mivel ezeket az oszlopokat a tbb megrendeln vgrehajtott sszest szmtsainkban amgy is felhasznltuk. Ha pldul a StartDate alapjn csoportostottunk volna, a MAX(StartDate) a csoportostott rtket adta volna vissza, a SUM(ContractPrice) pedig csak a megrendel egy adott dtuma vonatkoz szerzdseinek sszegt. Nem kaptuk volna meg egynl tbb szerzds sszegt, hacsak a vevnek nem tl valszn mdon egynl tbb szerzdse is lett volna a megadott idpontban.

A GROUP BY zradk hasznlata WHERE zradkban tallhat allekrdezsben


A 11. fejezetben bevezettk a COUNT s a MAX sszest fggvnyeket, s bemutattuk, hogyan szrhetnk sorokat allekrdezsbl szrmaz sszestett rtk segtsgvel, a 12. fejezetben pedig azt mutattuk meg, hogyan hasznljuk a MIN, a MAX s az AVG fggvnyt allekrdezsekben. Nzznk most egy krelmet, amelyhez egyarnt szksg van egy sszest fggvnyt hasznl allekrdezsre s az allekrdezsben megadott GROUP BY zradkra: Sorold fel azokat a rendezvnyszerzdseket, amelyeknek az sszege nagyobb, mint brmely ms megrendel szerzdseinek sszege!" Fordts - Select customer first name, customer last name, engagement start date, and engagement contract price from the customers table joined with the engagements table on customer ID where the contract price is greater than the sum of all contract prices from the engagements table for customers other than the current customer, grouped by customer ID

(Vlaszd ki a megrendelk keresztnevt s vezetknevt, valamint a rendez vny kezd idpontjt s szerzdsi sszegt a megrendelk s a rendezv nyek tbljbl, amelyeket sszekapcsoltunk a megrendelazonostk alap jn, ha a szerzdses sszeg nagyobb, mint az sszestett szerzdsi sszeg a rendezvnyek tbljbl, az sszes megrendelre vonatkoztatva - kivve az aktulis megrendelt vgl az eredmnyt csoportostsd a megrendel azonost alapjn.) Tisztzs - Select customer first name, customer last name, engagement start date, and engagement contract price from the customers table inner joined with the engagements table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table where the contract price is greater than > ALL (select the sum of all (contract prices) from the engagements table as E2 for where E2.customers ID <> other than the current customers.customer ID, grouped by E2.customer ID) SQL SELECT Customers.CustFirstName,

Customers.CustLastName, Engagements.StartDate, Engagements.ContractPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerID = Engagements.CustomerID WHERE Engagements.ContractPrice > ALL (Select SUM(ContractPrice) FROM Engagements AS E2 WHERE E2.CustomerID <> Customers.CustomerID GROUP BY E2.CustomerID)
Elemezzk, mit is csinl az allekrdezs! Minden, a lekrdezs ltal sszekapcsolt Customers s Engagements tblkban megvizsglt rendezvny esetben az allekrdezs a SUM segts gvel, az sszes tbbi megrendelre vonatkozan sszegzi a szerzdsi sszegeket, majd a megrendelazonost alapjn csoportostja az eredmnyt. Mivel sok megrendel tallhat az adatbzisban, az allekrdezs tbb SUM rtkkel fog visszatrni minden megrendel hz eggyel (termszetesen az aktulis megrendelt kivve) , ezrt egy egyszer nagyobb, mint (>) sszehasonlts nem lenne elegend. Szerencsre ahogy azt mr a 11. fejezetben tanultuk - hasznlhatjuk a halmazokon rtelmezett nagyobb, mint (> ALL) sszehasonltst

az rtkhalmaz ellenrzsre. Ha vgrehajtjuk a lekrdezst az Entertainment Agency mintaadatbzison (ennek eredmnyt a CH13_Biggest_Big_Contract tblba mentettk), gy talljuk, hogy csak egy szerzds felel meg a kvnalmainknak; ezt lthatjuk lejjebb.

A SELECT DISTINCT utasts kivltsa


Elgondolkoztunk mr azon, hogy esetleg anlkl hasznlhatnnk a GROUP BY zradkot, hogy akr egyetlen sszest fggvnyt tartalmazna a SELECT utasts? Semmi akadlya! Amikor gy tesznk, ugyanazt az eredmnyt kapjuk, mintha a 4. fejezetben bemutatott DISTINCT kulcsszt hasznlnnk. Lssunk egy egyszer krelmet, amely egyedi rtkeket hasznl, s oldjuk meg mindkt mdszerrel:

Sorold fel a vsrlk tbljban tallhat egyedi vrosneveket!" Fordts 1. - Select the unique city names from the customers table (Vlasszuk ki az egyedi vrosneveket a vsrlk tbljbl.) Tisztzs - Select the unique distinct city names from the customers table SQL SELECT DISTINCT Customers.CustCityName FROM Customers
Fordts 2. - Select city name from the customers table, grouped by city name (Vlaszd ki a vrosneveket a vsrlk tbljbl, s csoportostsd az ered mnyt vrosnevek szerint.) Tisztzs - Select city name from the customers table, grouped by city name SQL SELECT Customers.CustCityName

FROM Customers GROUP BY Customers.CustCityName


Ha visszagondolunk, a GROUP BY a sorokat a csoportost oszlop(ok) alapjn csoporto stja, s csoportonknt egy sort ad vissza. Ez a mdszer kicsit eltr attl, ahogy a DISTINCT kulcsszt hasznljuk, de az eredmny ugyanaz. De melyik a jobb? Az gondolnnk, hogy a DISTINCT tisztbb kifejezse annak, hogy egyedi sorokat szeretnnk kapni, de azt tapasztaljuk, hogy az adatbzis-kezel gyorsabban megoldja a problmt, ha a GROUP BY alkalmazst vlasztjuk, radsul a GROUP BY segtsgvel tbb informcit kapunk az adatainkrl. Nzzk meg a kvetkez lekrdezst:

SQL

SELECT Customers.CustCityName, Count(*) as CustPerCity FROM Customers GROUP BY Customers.CustCityName

Ezzel a lekrdezssel nem csak az egyedi vrosneveket kapjuk meg, de azt is megtudjuk, hogy melyik vrosban hny megrendel van. Ht nem nagyszer?

"Bizonyos korltozsokkal"
Mr emltettk, hogy a GROUP BY zradk bizonyos megktseket jelent a krelmek megalkotsakor. Nzzk, melyek ezek a korltozsok, nehogy valamelyik gyakori hiba ldozataiv vljunk!

Oszlopokra vonatkoz megktsek


Amikor a GROUP BY zradkot hasznljuk, arra krjk az adatbzis-kezel rendszert, hogy alkosson egyedi csoportokat a FROM zradkbl szrmaz s a WHERE zradkban szrt sorokbl. A SELECT zradkaiban tetszs szerint hasznlhatunk sszest fggvnyeket, s ezek a kifejezsek a FROM s a WHERE zradkaiban meghatrozott oszlopok brmelyikt felhasznlhatjk. Ahogy egy korbbi pldban mr rmutattunk, nem lenne tl sszer egy oszlopra sszest kifejezsben hivatkozni, s az oszlopot a csoportost hivatkozsok kz is bepteni. Ha olyan kifejezseket hasznlunk, amelyek oszlophivatkozst tartalmaznak, de sszest fggvnyt nem, akkor fel kell sorolnunk az sszes ilyen mdon hasznlt oszlopot a GROUP BY zradkban. A leggyakoribb hibk kz tartozik, hogy azt hisszk, nyugod tan hivatkozhatunk oszlopokra a nem sszestett kifejezsekben, amg az oszlopok egyedi sorokbl szrmaznak. Nzzk pldul az albbi, helytelen krelmet, amely egy elsdleges kulcsrtket tartalmaz - amirl tudjuk, hogy meghatrozsbl addan egyedi:

rd ki a megrendelazonostt, a megrendel teljes nevt, s a szerzdsi sszegek teljes sszegt!


Fordts - Select customer ID, customer first name, and customer last name as CustFullName, and the sum of contract prices as TotalPrice from the customers table joined with the engagements table on customer ID, grouped by customer ID (Vlaszd ki a megrendelazonostt, a megrendel keresztnevt s vezetknevt CustFullName nven s az sszestett szerzdsi sszegeket TotalPrice nven a megrendelk s a rendezvnyek tbljbl, amelyeket a megrendelazonost alapjn sszekapcsoltunk, majd az eredmnyt csoportostsd, a megrendelazonost alapjn.) Tisztzs - Select customer ID, customer first name and || ' ' ||customer last name as CustFullName,

and the sum of (contract price)s as TotalPrice from the customers table inner joined with the engagements table on customers.customer ID in the customers table matches = engagements.customer ID in the engagements table, grouped by customer ID SQL

SELECT Customers.CustomerID, Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, SUM(Engagements.ContractPrice) AS TotalPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerID = Engagements.CustomerID GROUP B Y Customers.CustomerID

Tudjuk, hogy a CustomerID (Megrendelazonost) megrendelnknt egyedi. Elgsges kellene, hogy legyen, ha a CustomerID alapjn csoportostannk, ahhoz, hogy a megren delk vezetk- s keresztnevre vonatkoz egyedi informcikat kapjunk a CustomerID alapjn kialaktott csoportokon bell. Sajnos azonban az SQL nyelv a nyelvtani formn (a szintaxison), s nem a jelentsen (azaz a szemantikn) alapul. Ms szval az SQL nem kpes figyelembe venni az adatbzis tbliba beletervezett informcikat amibe az is beletartozik, hogy mely oszlopok szolglnak elsdleges kulcsknt. Az SQL megkveteli, hogy a krelem nyelvtana tiszta legyen, azaz le lehessen fordtani az adatbzistblk szerkezetnek ismerete nlkl. Ennek megfelelen a fenti SQL-utasts hibt okoz az SQLszabvnynak megfelel adatbzis-kezel rendszerekben, mivel a SELECT zradkban olyan oszlopokra hivatkoztunk, amelyek sem sszest fggvnyben, sem a G R O U P B Y zradkban nem fordulnak el (CustFirstName s CustLastName). A helyes SQL-krelem a kvetkez: SQL

SELECT Customers.CustomerID, Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, SUM(Engagements.ContractPrice) AS TotalPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerID Engagements.CustomerID GROUP B Y Customers.CustomerID, Customers.CustFirstName, Customers.CustLastName

Lehet, hogy ez tlzsnak tnik, de ez a helyes mdszer!

Egyes adatbzis-kezel rendszerekben a GROUP BY zradkban a SELECT zradkban hasznlt kifejezsek pontos msolatt kell megadnunk. Ilyen pldul az Oracle vagy a Microsoft Office Access. A fenti pldnkban ahelyett, hogy az egyes oszlopokat felsoroltuk volna, az SQL-utastst a kvetkezkppen kellett volna befejeznnk:

GROUP BY Customers.CustomerID, Customers.CustFirstName || ' ' || Customers.CustLastName


Ez ugyan nem felel meg az SQL-szabvnynak, de elfordulhat, hogy csak gy tudjuk mkdsre brni a krelmet a rendszernkn.

Kifejezseken alapul csoportosts


Korbban mr mutattunk nhny mkd pldt olyan kifejezsek megalkotsra, amelyek nem tartalmaznak sszest fggvnyeket. A leggyakoribb hibk egyike, ha a SELECT zradkban ltrehozott kifejezs alapjn prblunk csoportostani, ahelyett, hogy az egyedi oszlopokat vennnk alapul. Ne feledkezznk meg arrl, hogy a GROUP BY zradkban csak a FROM s a WHERE zradkbl szrmaz oszlopokra hivatkozhatunk. Nem hasznl hatunk olyan kifejezst, amit a SELECT zradkban hoztunk ltre. Vessnk egy jabb pillantst egy korbban mr megoldott pldra, hogy lssuk, mit is jelent ez, de ez alkalommal kvessk el a hibt! rd ki valamennyi Washington llambeli megrendel teljes nevt, teljes cmt, a megrendel legutbbi szerzdsnek dtumt, valamint a szerzdseinek a teljes sszegt! SQL SELECT Customers.CustLastName || ' ' ||

Customers.CustFirstName AS CustomerFullName, Customers.CustStreetAddress || ', ' || Customers.CustCity || ', ' || Customers.CustState || ' ' || Customers.CustZip AS CustomerFullAddress MAX(Engagements.StartDate) AS LatestDate, SUM(Engagements.ContractPrice) AS TotalContractPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerID = Engagements.CustomerID WHERE Customers.CustState = 'WA' GROUP BY CustomerFullName, CustomerFullAddress
Van olyan adatbzis-kezel rendszer, amelyik eltri ezt az utastst, de attl ez az utasts mg helytelen. A CustomerFullName (Megrendel teljes neve) s a CustomerFullAddress (Megrendel teljes cme) oszlopok nem lteznek egszen addig, amg az adatbzis-kezel

ki nem rtkeli a FROM, a WHERE s a GROUP BY zradkokat. A GROUP BY nem fogja megtallni ezeket az oszlopokat a FROM s a WHERE ltal visszaadott sorok kztt, ezrt az SQL-szabvnyt szigoran rtelmez adatbzis-kezel rendszer nyelvtani hibt fog jelezni. A korbbiakban mr bemutattuk, mi a helyes megolds: fel kell sorolnunk a Customer FullName s a CustomerFullAddress kifejezsekben felhasznlt valamennyi oszlop ne vt. Egy msik helyes megkzelts lehet, hogy a FROM zradkban a megfelel allekrdezs beptsvel ltrehozzuk a kiszmtott oszlopokat. Kvetkezzen az ezt megvalst kifejezs: SQL

SELECT CE.CustomerFullName, CE.CustomerFullAddress, MAX(CE.StartDate) AS LatestDate, SUM(CE.ContractPrice) AS TotalContractPrice FROM (SELECT Customers.CustLastName || ', ' || Customers.CustFirstName AS CustomerFullName, Customers.CustStreetAddress || ', ' || Customers.CustCity || ', ' || Customers.CustState || ' ' || Customers.CustZip AS CustomerFullAddress, Engagements.StartDate, Engagements.ContractPrice FROM Customers INNER JOIN Engagements ON Customers.CustomerID Engagements.CustomerID WHERE Customers.CustState ='WA') AS CE GROUP BY CE.CustomerFul1Name, CE.CustomerFullAddress

Az utasts mkdik, mivel a CustomerFullName s a CustomerFullAddress oszlopokat a FROM zradkban, kimenetknt ltrehoztuk. El kell ismernnk, hogy ettl a kifejezs meglehetsen sszetett vlt. A gyakorlatban jobb, ha csak felsoroljuk az sszes nem sszetett kifejezsben hasznlni kvnt oszlopot, ahelyett, hogy megprblnnk a kifeje zseket a FROM zradkn bell, oszlopknt ltrehozni.

Mikor hasznljuk a GROUP BY zradkot?


Ha idig jutottunk az olvassban, valsznleg mr elg jl rtjk, hogyan kaphatunk rszsszegeket adatcsoportokra, sszest fggvnyek s a GROUP BY zradk alkalma zsval. gy talltuk, hogy a GROUP BY sokoldal felhasznlsnak bemutatsra az a legjobb mdszer, ha felsorolunk pr olyan problmt, amelyet megoldhatunk ennek az j zradknak a segtsgvel, majd a Pldk rszben tovbbi pldkat mutatunk be:

Sorold fel a beszlltkat s beszlltnknt a termkek napban mrt szlltsi idejt! rd ki minden termk nevt s sszestett eladsait!" Sorold fel minden vsrl s rendelsi idpont esetben a vsrl teljes nevt s valamennyi dtumhoz az adott idpontban rendelt ttelek teljes rt! rd ki minden egyttes azonostjt, az egyttes tagjait, s a tagoknak fizetett ssze get gy, hogy a teljes szerzdsi sszeget elosztod az egyttes tagjainak a szmval! Sorold fel minden gynk nevt, a lekttt rendezvnyek sszestett szerzdsi sszegt s az gynk megbzsainak a szmt! A teljestett rkat tekintve, rd ki trgycsoportonknt s tanulnknt a trgycsoport nevt, a tanul nevt s a tanul tlagos osztlyzatt a trgycsoportban felvett rkra vonatkozan!" Sorold fel trgycsoportonknt a trgycsoport nevt s a knlt rk szmt! Sorold fel a tanrokat s az egyes tanrok ltal tartott rk szmt!" Sorold fel minden tornra s mrkzsre a torna azonostjt, a torna helyt, a mr kzs szmt, a csapatok nevt s az egyes csapatok sszestett bntetpontszmt! rd ki minden tekejtkos nevt s tlagos pontszmt!" Hny recept ltezik hozzvalosztlyonknt?" Melyik hozzvalbl mennyire lesz szksgnk, ha a szakcsknyv valamennyi receptjt el akarjuk kszteni?

Pldk
Mr tudjuk, hogyan alkothatunk lekrdezseket a GROUP BY zradk segtsgvel, s lt tuk, mifle krdseket tudunk megvlaszolni. Nzznk most nhny olyan pldt, amelyek az adatok csoportostst ignylik (minden plda a mintaadatbzisokbl szrmazik)! Ezenkvl ksztettnk az eredmnyhalmazokbl is mintkat; ezek kzvetlenl az SQLutastsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ugyanaz, mint a CD-mellkleten tallhat megfelel SQL-lekrdezs neve. Minden lekrdezst a megfe lel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz le krdezsek neve ,,CH13-mal kezddik. A pldkat a knyv elejn tallhat bevezets t mutatst kvetve tlthetjk be s prblhatjuk ki. Ne felejtsk el, hogy a pldinkban hasznlt oszlop- s tblanevek a B fggelkben tallhat mintaadatbzisok szerkezetbl szrmaznak. Az egyszersg kedvrt a kvetkez pldkban sszevontuk a Fordts s a Tisztzs lpseit. A pldk felttelezik, hogy elolvastuk s megrtettk az elz fejezetekben trgyalt fogalmakat, klns tekintettel a JOIN-okra s az allekrdezsekre.

Sales Orders adatbzis


Sorold fel minden vsrl s megrendelsi dtum esetben a vsrl teljes nevt s az adott idpontban rendelt ttelek teljes sszegt!" Fordts/ - Select customer first name and || ' ' || customer last name Tisztzs as CustFullName, order date, and the
sum

of (quoted price times * quantity ordered) as TotalCost from the customers table
inner joined with the orders table on customers.customer

ID in the customers table matches = orders.customer ID in the orders table, and then inner joined with the order details table on orders.order number in the orders table matches = order_details.order number in the order details table, grouped by customer first name, customer last name, and order date

SQL

SELECT Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, Orders.OrderDate, SUM(Order_Details.QuotedPrice * Order_Details.QuantityOrdered) AS TotalCost FROM (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber GROUP BY Customers.CustFirstName, Customers.CustLastName, Orders.OrderDate

Entertainment Agency adatbzis


Sorold fel minden egyttes azonostjt, az egyttes tagjait, s a tagoknak fizetett sszeget gy, hogy a teljes szerzdsi sszeget elosztod az egyttes tagjainak a szmval!" Ez elg trkks plda, mivel egy tag tbb egyttesbe is tartozhat. Minden egyttes esetben sszegeznnk kell a szerzdsi sszegeket, majd el kell osztanunk az sszeget a tagok szmval (felttelezve, hogy minden tag egyenl sszeget kap). Az sszeszmllshoz az aktulis eladazonost alapjn szrt allekrdezsre van szksg, (az egyttes s nem a tag azonostja alapjn!), azaz az entertainer ID alapjn is csoportostanunk kell! s mg valami, ne felejtsk el kikszblni az inaktv tagokat (Status = 3) sem! Fordts/ - Select entertainer ID, member first name, member last name, Tisztzs and the sum of (contract price)s divided by / the (select count(*) of active members from entertainer members as EM2 in the current entertainer group Where status is not equal to <> not active 3 and the EM2 table entertainer ID equals = the entertainer members table entertainer ID) from the members table inner joined with the entertainer members table on members.member ID in the members table matches = entertainer_members.member ID in the entertainer members table, then inner joined with the entertainers table on entertainers.entertainer ID in the entertainers table matches = entertainer_members.entertainer ID in the entertainer members table, and finally inner joined with the engagements table on entertainers.entertainer ID in the entertainers table matches = engagements.entertainer ID in the engagements table, where member status is not equal to <> not active 3 grouped by entertainer ID, member first name, and member last name, sorted order by member last name SQL SELECT Entertainers.EntertainerID,

Members.MbrFirstName, Members.MbrLastName, SUM(Engagements.ContractPrice)/ (SELECT COUNT(*) FROM Entertainer_Members AS EM2 WHERE EM2.Status <> 3 AND EM2.EntertainerID =

Entertainers.EntertainerID) AS MemberPay FROM ((Members INNER JOIN Entertainer_Members ON Members.MemberID = Entertainer_Members.MemberID) INNER JOIN Entertainers ON Entertainers.EntertainerID = Entertainer_Members.EntertainerID) INNER JOIN Engagements ON Entertainers.EntertainerID = Engagements.EntertainerID WHERE Entertainer_Members.Status<>3 GROUP BY Entertainers.EntertainerID, Members.MbrFirstName, Members.MbrLastName ORDER BY Members.MbrLastName

School Scheduling adatbzis


A

teljestett rkat nzve, sorold fel trgycsoportonknt s tanulnknt a trgycsoport nevt, valamint a tanul nevt s tlagos osztlyzatt a csoportbl felvett trgyak alapjn! Fordts/ - Select category description, student first name, student last name, Tisztzs and the average AVG(of grade) as AvgOfGrade from the categories table inner joined with the subjects table on categories.category ID in the subjects table, = subjects.category ID in the subjects table, then inner joined with the classes table

ID in the subjects table matches = classes.subject ID in the classes table, then inner joined with the student schedules table on classes.class ID in the classes table matches = student_schedules.class ID in the student schedules table, then inner joined with the student class status table on student_class_status.class status in the student class status table matches = student_schedules.class status in the student schedules table, and finally inner joined with the students table on students.student ID in the students table matches = student_schedules.student ID in the student schedules table where class status description is = 'Completed,' grouped by category description, student first name, and student last name SQL

on subjects.subject

SELECT Categories.CategoryDescription, Students.StudFirstName, Students.StudLastName, AVG(Student_Schedules.Grade) AS AvgOfGrade FROM ((((Categories INNER JOIN Subjects ON Categories.CategoryID = Subjects.CategoryID) INNER JOIN Classes ON Subjects.SubjectID = Classes.SubjectID) INNER JOIN Student Schedules ON Classes.ClassID = Student_Schedules.ClassID)

INNER JOIN Student_Class_Status ON Student_Class_Status.ClassStatus = Student_Schedules.ClassStatus) INNER JOIN Students ON Students.StudentID = Student_Schedules.StudentID WHERE Student_Class_Status.ClassStatusDescription = 'Completed' GROUP BY Categories.CategoryDescription, Students.StudFirstName, Students.StudLastName Bowling League adatbzis
rd ki minden torna s mrkzs esetben a tornaazonostt, a torna helyt, a mrkzs szmt, a csapatok nevt s minden csapatnl a csapat sszestett bntetpontszmt!" Fordts/ - Select tourney ID, tourney location, match ID, team name, and Tisztzs the sum of (handicap score) as TotHandiCapScore from the tournaments table inner joined with the tourney matches table on tournaments.tourney ID in the tournaments table matches = tourney_matches.tourney ID in the tourney matches table, then inner joined with the match games table on tourney_matches.match ID in the tourney matches table matches = match__games.match ID in the match games table then inner joined with the bowler scores table on match__games.match ID in the match game table matches = bowler_scores.match ID in the bowler scores table and match_games.game number in the match games table matches = bowler_scores.game number in the bowler scores table, then inner joined with the bowlers table on bowlers.bowler ID in the bowlers table matches = bowler_scores.bowler ID in the bowler scores table, and finally inner joined with the teams table on teams.team ID in the teams table matches = bowlers.team ID in the bowlers table, grouped by tourney ID, tourney location, match ID, and team name SQL SELECT Tournaments.TourneyID,

Tournaments.TourneyLocation, Tourney_Matches.MatchID, Teams.TeamName,

SUM(Bowler_Scores.HandiCapScore) AS TotHandiCapScore FROM ((((Tournaments INNER JOIN Tourney_Matches ON Tournaments.TourneyID = Tourney_Matches.TourneyID) INNER JOIN Match_Garnes ON Tourney_Matches.MatchID = Match_Games.MatchID) INNER JOIN Bowler_Scores ON (Match Games.MatchID = Bowler_Scores.MatchID) AND (Match Games.GameNumber = Bowler_Scores.GarneNurnber)) INNER JOIN Bowlers ON Bowlers.BowlerID = Bowler_Scores.BowlerID) INNER JOIN Teams ON Teams.TeamID = Bowlers.TeamID GROUP BY Tournaments.TourneyID, Tournaments.TourneyLocation, Tourney_Matches.MatchID, Teams.TeamName

rd ki minden tekejtkos legmagasabb pontszmt!


Fordts/ - Select bowler first name, bowler last name, and Tisztzs the maximum (raw score) as HighScore from the bowlers table inner joined with the bowler scores table

on bowlers.bowler

ID in the bowlers table matches = bowler_scores.bowler ID in the bowler scores table, grouped by bowler first name, and bowler last name

SQL

SELECT Bowlers.BowlerFirstName, Bowlers.BowlerLastName, MAX(Bowler_Scores.RawScore) AS HighScore FROM Bowlers INNER JOIN Bowler_Scores ON Bowlers.BowlerID = Bowler_Scores.BowlerID GROUP BY Bowlers.BowlerFirstName, Bowlers.BowlerLastName

Recipes adatbzis
rd ki, hogy hozzvalosztlyonknt hny recept ltezik!
Itt a kihvs abban ll, hogy receptenknt egy bizonyos receptosztlyt egynl tbbszr nem akarunk megszmolni. Ha pldul egy recept tbbfle nvnyi hozzvalt vagy tejtermket tartalmaz, akkor osztlyonknt csak egyszer vehetjk figyelembe. Lehet, hogy eljtt az id a COUNT (DISTINCT <<rtkkifejezs>>) bevetsre? Fordts/ - Select ingredient class description, Tisztzs and the unique count of (distinct recipe ID) as CountOfRecipeID from the ingredient classes table

inner joined

with the ingredients table

on ingredient_classes.ingredient class

ID in the ingredient classes table matches = ingredients.ingredient class ID in the ingredients table, and then inner joined with the recipe ingredients table on ingredients.ingredient ID in the ingredients table matches = recipe_ingredients.ingredient ID in the recipe ingredients table, grouped by ingredient class description

SQL

SELECT Ingredient_Classes.IngredientClassDescription, Count(DISTINCT RecipeID) AS CountOfRecipeID FROM (Ingredient_Classes INNER JOIN Ingredients ON Ingredient_Classes.IngredientClassID = Ingredients.IngredientClassID) INNER JOIN Recipe_Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID GROUP BY Ingredient_Classes.IngredientClassDescription

Mivel a Microsoft Access nem tmogatja a COUNT DISTINCT parancsot, azt vehetjk szre, hogy az Access mintaadatbzisban tallt lekrdezs elszr a FROM zradkban egy tbla-allekrdezs segtsgvel kivlasztja a receptazono st egyedi (DISTINCT) rtkeit, majd sszeszmolja az eredmnysorokat.

sszefoglals
A fejezet elejn elmagyarztuk, hogy mi lehet az okunk arra, hogy csoportostsuk az ada tokat, hogy tbb rszsszeget kapjunk egy eredmnyhalmazbl. Miutn szembesltnk egy nehznek tn pldafeladattal, tovbblptnk, s bemutattuk, hogyan oldjuk meg a problmt s mg sok msikat - a GROUP BY zradk segtsgvel. Arra is mutattunk pldt, hogyan hasznlhatunk egytt oszlopkifejezseket s sszest fggvnyeket. Ezt kveten egy rdekes pldt elemeztnk, ahol a GROUP BY zradkot egy olyan allekrdezsben hasznltuk, amely egy WHERE zradkban szolglt az adatok szrsre. Ksbb rmutattunk, hogy a GROUP BY segtsgvel, de sszest fggvnyek nlkl alkotott lekrdezsek ugyanazt eredmnyezik, mintha a SELECT zradkban a DISTINCT kulcsszt hasznlnnk. Ez utn kitrtnk arra, hogy milyen fontos, hogy a GROUP BY zra dkot kell odafigyelssel ptsk fel, s az oszlopokat ptsk be, ne pedig a kifejezseket. A GROUP BY zradkrl szl fejtegetsnk vgn nhny gyakran elkvetett hibra hvtuk fel a figyelmet. Elmondtuk, hogy az SQL nem ttelez fel semmilyen, az elsdleges kulcsokkal kapcsolatos ismeretet. A SELECT zradkban hasznlt oszlopkifejezsekkel kapcsolatos gyakori hibkra is kitrtnk. sszefoglaltuk, mirt hasznos a GROUP BY zradk, s pldafeladatokat adtunk kzre, amelyeket megoldhatunk a segtsgvel. A fejezet tovbbi rsze arra mutatott pldkat, hogyan alkothatunk a GROUP BY felhasznlst ignyl krelmeket. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval. Sales Orders adatbzis 1. rd ki az sszes beszlltt s beszlltnknt a termkek szlltshoz szksges napok szmt! (Tipp: hasznljuk az AVG sszest fggvnyt, s csoportostsunk a beszlltk szerint.) A megolds itt tallhat: CH13_Vendor_Avg_Delivery (10 sor).

2. rd ki minden termk nevt s sszestett eladsait!

(Tipp: hasznljuk a SUM fggvnyt, a mennyisg s az rak szorzatt, valamint csoportostsunk a termkek neve alapjn.) A megolds itt tallhat: CH13_Sales_By_Product (38 sor). 3. Sorolj fel minden beszlltt s az ltaluk knlt termkeket! A megolds itt tallhat: CH13_Vendor_Product_Count_Group (10 sor). 4. Kihvs: oldjuk meg a 3. problmt allekrdezs segtsgvel! A megolds itt tallhat: CH13_Vendor_Product_Count_Subquery (10 sor).
Entertainment Agency adatbzis 1. rd ki minden gynk nevt, a lekttt fellpsek szerzdsi rtknek sszegt s

az gynk sszes megbzst! (Tipp: ssze kell szoroznunk az sszestett szerzdsi sszegeket s a megbzsokat, s ne felejtsnk el a megbzsi rta alapjn csoportostani sem.) A megolds itt tallhat: CH13_Agent_Sales_And_Commissions (8 sor).
School Scheduling adatbzis

1 . rd ki trgycsoportonknt a trgycsoport nevt s a knlt rk szmt! (Tipp: hasznljuk a COUNT fggvnyt, s csoportostsunk a trgycsoportok nevei alapjn.) A megolds itt tallhat: CH13_Category_Class_Count (16 sor). 2. Sorold fel a tanrokat s az ltaluk tartott rk szmt! (Tipp: hasznljuk a COUNT fggvnyt, s csoportostsunk a tanrok neve alapjn.) A megolds itt tallhat: CH13_Staff_Class_Count (23 sor). 3. Kihvs: oldjuk meg a 2. problmt allekrdezs segtsgvel! A megolds itt tallhat: CH13_Staff_Class_Count (27 sor). 4. Meg tudjuk magyarzni, mirt ad vissza az allekrdezst hasznl megolds ngy sorral tbbet?
Bowling League adatbzis 1. rd ki minden tekejtkos nevt s tlagos pontszmt!

(Tipp: hasznljuk az AVG sszest fggvnyt, s csoportostsunk a jtkosok neve alapjn.) A megolds itt tallhat: CH13_Bowler_Averages (32 sor). 2. Szmold ki minden tekejtkos jelenlegi tlagt s bntetpontszmt! (Tipp: ez egy bartsgos" liga, ezrt a bntetpontszm kiszmtsa gy trtnik, hogy ktszzbl kivonjuk az tlagot, s ennek a 90 szzalkt vesszk. Mieltt kivonnnk ktszzbl, kerektsk s alaktsuk egssz az tlagot, majd a vgered mnyt kerektsk s vgjuk le. Br az SQL-szabvny nem hatrozza meg a ROUND fggvnyt, a legtbb kereskedelmi adatbzis-kezelben megtallhat. A rszletekrt nzzk meg a termk dokumentcijt.) A megolds itt tallhat: CH13_Bowler_Average_Handicap (32 sor).

3.

Kihvs: az rd ki minden tekejtkos legmagasabb pontszmt!-feladatot oldjuk meg allekrdezssel! A megolds itt tallhat: CH13_Bowler_High_Score_Subquery (32 sor).

Recipes adatbzis 1. "Melyik hozzvalbl mennyire lenne szksgnk, ha a szakcsknyv sszes

receptjt el szeretnnk kszteni?" (Tipp: hasznljuk a SUM fggvnyt, majd csoportostsunk a hozzvalk neve s a mrtkegysg-lers alapjn.) A megolds itt tallhat: CH13_Total_Ingredients_Needed (65 sor). 2. Sorold fel az sszes hsfle hozzvalt, s azokat a recepteket, amelyek mindegyiket tartalmazzk!" A megolds itt tallhat: CH13_Meat_Ingredient_Recipe_Count_Group (4 sor). 3. Kihvs: oldjuk meg a 2. problmt allekrdezs segtsgvel! A megolds itt tallhat: CH13_Meat_Ingredient_Recipe_Count_Subquery(ll sor). 4. Meg tudjuk magyarzni, mirt ad vissza az allekrdezst hasznl megolds httel tbb sort?

Csoportostott adatok szrse


Hadd tmjk fejket iskolamesterek, nyelvtannal, badarsggal, leckvel J plinka, szilrdan tartom, tisztbb ltst ad a lngsznek." - Oliver Goldsmith

A fejezet tmakrei
A clcsoport j jelentse Szrkkel minden ms A HAVING hasznlata Pldk sszefoglals nll feladatok

A 12. fejezetben rszletesen ismertettk az SQL-szabvnyban meghatrozott sszest fggvnyeket. Ezt vittk tovbb a 13. fejezetben, amikor lertuk, hogyan krhetjk az adatbzis-kezeltl sorok csoporthalmazait, s hogyan szmthatjuk ki a csoportok sszestett rtkeit. A csoportosts egyik nagy elnye az volt, hogy az rtkkifejezseket csoportostott oszlopok alapjn is ki tudtuk rni, gy azonostva az egyes csoportokat. Ebben a fejezetben helyre illesztjk az sszest s csoportost kiraksjtek utols elemt is. Miutn csoportostottuk a sorokat, s kiszmtottuk az sszestett rtkket, gyakran jl jn, ha az sszestett szmts eredmnyt egy llts (prediktum) segts gvel mg tovbb szrjk. Ahogy hamarosan megltjuk, ehhez a kiraksjtk utols elemre a HAVING zradkra - lesz szksg.

A "clcsoport" j jelentse
Tudjuk mr, hogy miutn sorcsoportokba gyjtttk az adatokat, a MIN, a MAX, az AVG, a SUM s a COUNT segtsgvel minden csoport sszestett adatait lekrhetjk. Tegyk fel, hogy tovbb szeretnnk finomtani az eredmnyhalmazt a csoportok elklntse rdekben - valamelyik sszestett rtk tesztelsvel. Nzznk egy egyszer lekrdezst: Sorold fel azokat az egytteseket, amelyek jazzt jtszanak, s hromnl tbb tagjuk van! Ez nem hangzik tlsgosan bonyolultan, ugye? A krelem megoldshoz szksges tblkat a 14.1. bra mutatja.

Mint ltalban, itt is a 4. fejezetben bevezetett Krelem-FordtsTisztzs-SQL-mdszert kvetjk, valamint a 8.fejezetben megismert JOIN-okat s allekrdezseket, illetve a 9. fejezetben tanult OUTER JOIN-t s a 11. fejezet ben megismert allekrdezseket hasznljuk. A HAVING zradk ismerete nlkl valsznleg ksztetst reznnk, hogy a kvetkez, helytelen mdszerrel prblkozzunk: Fordts - Select the entertainer stage name and the count of members from the entertainers table joined with the entertainer members table on entertainer ID in the entertainers table matches entertainer ID in the entertainer members table where the entertainer ID is in the selection of entertainer IDs from the

entertainer styles table joined with the musical styles table on style ID in the entertainer styles table matches style ID in the musical styles table where the stylename is 'Jazz' and where the count of the members is greater than 3, grouped by entertainer stage name (Vlaszd ki az elad mvsznevt s a tagok szmt az eladk s az egyttestagok tblibl, amelyeket az eladazonost alapjn ssze kapcsoltunk, ha az eladazonost benne van az eladazonostknak abban a halmazban, amelyet az eladk stlust s a zenei stlusokat tartalmaz tblknak a stlusazonost alapjn trtn sszekapcsolsbl nyertnk, s ha az eladk stlust tartalmaz tblban a stlusazonost megegyezik a zenei stlusokat trol tbla stlusazonostjval, s a stlus neve Jazz, s ha a tagok szma nagyobb, mint 3, s csoportostsd az ered mnyt az eladk mvszneve szerint.) Tisztzs - Select the entertainer stage name
from

and the count(*) of members as CountOfMembers the entertainers table inner joined with the entertainer members table on entertainers.entertainer ID in the entertainers table matches = entertainer_members.entertainer ID in the entertainer members table where the entertainer ID is in the (selection of entertainer IDs from the entertainer styles table inner joined with the musical styles table on entertainer_styles.style ID in the entertainer styles table matches = musical_styles.style ID in the musical styles table where the style name is= 'Jazz') and where the count(*) of the members is greater than > 3; grouped by entertainer stage name

SQL

SELECT Entertainers.EntStageName, COUNT(*) AS CountOfMembers FROM Entertainers INNER JOIN Entertainer_Members ON Entertainers.EntertainerID = Entertainer_Members.EntertainerID WHERE Entertainers.EntertainerID IN (SELECT Entertainer_Styles.EntertainerID FROM Entertainer_Styles INNER JOIN Musical_Styles ON Entertainer_Styles.StyleID = Musical_Styles.StyleID

WHERE Musical_Styles.StyleName = 'Jazz') AND COUNT(*) > 3 GROUP BY Entertainers.EntStageName


Mi a baj ezzel az brval? Fleg az, hogy minden, a WHERE zradkban (Emlksznk a 6. fejezetre?) hivatkozott oszlop a FROM zradkban meghatrozott tblbl kell, hogy szrmazzon. A COUNT(*) a FROM zradkbl szrmazik? Ht persze, hogy nem - st a COUNT rtkt csak a sorok csoportostsa utn tudjuk csak kiszmtani! gy tnik, a GROUP BY utn egy j zradkra lesz szksgnk. A 14.2. bra a SELECT utasts teljes utastsformjt bemutatja, az j HAVING zradkkal egytt.

Mivel a HAVING zradk a sorok csoportostsa utn hajtdik vgre, az SQL-szabvny tartalmaz nhny megktst arra nzve, hogy mely oszlopokra hivatkozhatunk a keressi felttelek lltsaiban. rdemes megjegyeznnk, hogy ha nincs GROUP BY, az adatbzis kezel a HAVING zradkot a FROM s a WHERE zradkok ltal visszaadott sszes sorra rtelmezi, gy, mintha a visszaadott sorok egyetlen csoportot alkotnnak. A megktsek ugyanazok, mint a csoportostott lekrdezsek SELECT zradkban hivatko zott oszlopok esetben. Brmilyen, oszlopra val hivatkozs a HAVING zradk keressi felttelben szerepl lltsban eleget kell tegyen a kvetkezknek: vagy meg kell nevez nnk egy a GROUP BY zradkban felsorolt oszlopot, vagy sszest fggvnyen bell kell elhelyeznnk. Ezeknek a megszabsoknak azrt lehet helyk, mert a lehetsges oszlop sszehasonltsoknak a csoportostott sorokat kell felhasznlniuk akr csoportost rtkekrl, akr csoportok sorain vgrehajtott sszest szmtsokrl legyen sz.

Most, hogy mr tudunk egy keveset a HAVING zradkrl, oldjuk meg a korbbi problmt a helyes mdszerrel: Sorold fel azokat az egytteseket, amelyek jazzt jtszanak, s hromnl tbb tagjuk van! Fordts - Select the entertainer stage name and the count of members from the entertainers table joined with the entertainer members table on entertainer ID in the entertainers table matches entertainer ID in the entertainer members table where the entertainer ID is in the selection of entertainer IDs from the entertainer styles table joined with the musical styles table on style ID in the entertainer styles table matches style ID in the musical styles table where the style name is 'Jazz,' grouped by entertainer stage name, and having the count of the members greater than 3 (Vlaszd ki azoknak az egytteseknek a mvsznevt s a tagok szmt az eladk s a tagok tblibl amelyeket az eladazonost alapjn sszekapcsoltunk , amelyeknl az eladk tbljban tallhat eladazo nost megegyezik a tagok tbljban tallhat eladazonostval, s ahol az eladazonost szerepel az eladk stlusait s a zenei stlusokat trol tblk eladazonosti kztt, mely tblkat sszekapcsoltuk a stlusazo nost alapjn, ha a stlusnv "Jazz", s mindezt csoportostsd az eladk mvszneve szerint, tovbb kveteld meg, hogy a tagok szma 3 vagy tbb legyen.) Tisztzs - Select the entertainer stage name and the count(*) of members as CountOfMembers from the entertainers table inner joined with the entertainer members table on entertainers.entertainer ID in the entertainers table matches = entertainer_members.entertainer ID in the entertainer members table where the entertainer ID is in the (selection of entertainer IDs from the entertainer styles table inner joined with the musical styles table on entertainer_styles.style ID in the entertainer styles table matches = musical_styles.style ID in the musical styles table where the style name is = 'Jazz'), grouped by entertainer stage name, and having the count(*) of the members greater than > 3 SQL SELECT Entertainers.EntStageName,

COUNT(*) AS CountOfMembers

FROM Entertainers INNER JOIN Entertainer_Members ON Entertainers.EntertainerID = Entertainer_Members.EntertainerID WHERE Entertainers.EntertainerID IN (SELECT Entertainer_Styles.EntertainerID FROM Entertainer_Styles INNER JOIN Musical_Styles ON Entertainer_Styles.StyleID = Musical_Styles.StyleID WHERE Musical_Styles.StyleName = 'Jazz') GROUP BY Entertainers.EntStageName HAVING COUNT(*) > 3
Br a krelem vgs kimenetben szerepel a COUNT, a COUNT(*) fggvnyt enlkl is hasznlhatnnk a HAVING zradkban. Amg a HAVING zradkban szerepl szmtott rtkek s oszlophivatkozsok levezethetk a csoportostott sorokbl, nyugodtak lehetnk. Ezt a lekrdezst az Entertainment Agency mintaadatbzisban CH14_Jazz_Entertainers_More_Than_3 nven tallhatjuk meg.

Szrkkel minden ms
Most mr kt mdszernk is van a vgs eredmnyhalmaz szrsre: a WHERE s a HAVING zradk hasznlata. Tudjuk, hogy bizonyos korltozsok vonatkoznak a HAVING zradk keressi feltteleiben alkalmazhat lltsokra. Egyes esetekben vlaszthatunk, hogy a kt zradk kzl melyikbe helyezzk a prediktumot. Vizsgljuk meg, mikor rtelmesebb a HAVING helyett a WHERE zradkban elhelyezni a szrt!

A WHERE vagy a HAVING zradkban szrjnk?


A 6. fejezetben megismertk a krelmek FROM zradka ltal visszaadott sorok szrsre felpthet t f lltstpust. Ezek az albbiak voltak: sszehasonlts (=, <>, <, >, >=, <=), tartomny (BETWEEN), tagsg (IN), mintailleszts (LIKE) s az IS NULL. A 11. fejezetben kiterjesztettk a ltkrnket: bemutattuk, hogyan lehet allekrdezseket sszehasonltsi s tagsgi lltsok paramtereiknt hasznlni, s bevezettnk kt tovbbi prediktum osztlyt - mennyisgi (ANY, SOME, ALL) s ltezst kifejez (EEXISTS) -, amelyek param terknt allekrdezseket ignyelnek. Ne felejtsk el, hogy a WHERE zradkban hasznlt keressi felttel a sorokat azeltt szri, mieltt az adatbzis-kezel vgrehajtan a csoportostst. ltalban vve azt mond hatjuk, hogy ha a vgeredmnyben csak a sorok valamilyen rszhalmazt szeretnnk viszontltni, jobb, ha a nemkvnatos sorokat minl elbb kikszbljk a WHERE zradk segtsgvel. Tegyk fel, hogy a kvetkez krelmet szeretnnk megfogalmazni:

Sorold fel azokat az Egyeslt llamok nyugati partjn tallhat llamokat, ahol az sszestett rendelsi sszeg meghaladja az egymilli dollrt! A megoldshoz szksges tblkat a 14.3. brn lthatjuk.

Helynval, ha a krelmet az albbiak szerint fogalmazzuk meg, a vev llamt meghat roz lltst a HAVING-zradkba helyezve:

SQL SELECT Customers.CustState, SUM(Order_Details.QuantityOrdered * Order_Details.QuotedPrice) AS SumOfOrders FROM (Customers INNER JOIN Orders ON Customers.CustomerID - Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber GROUP BY Customers.CustState HAVING SUM(Order_Details.QuantityOrdered * Order_Details.QuotedPrice) > 1000000 AND CustState IN ('WA', 'OR', 'CA')
Mivel az llam oszlopa szerint csoportostunk, lehetsgnk van arra, hogy az oszlopra vonatkoz lltst a HAVING zradkba helyezzk, de ekkor az adatbzis-kezel rendszert a szksgesnl tbb munkra krnnk. Kiderl, hogy a teljes rendelsi sszeg a texasi vsrlk esetben is meghaladja az egymilli dollrt. Ha a szrt a HAVING zradkban helyezzk el, mint ahogy itt lthat, az adatbzis-kezel sszegzi a Texasra vonatkoz sorokat is, elraktrozza az eredmnyt, s csak akkor dobja el, amikor kiderl, hogy a Texas csoportra nincs szksg.

Ha az eredmnyt a vevk llamai alapjn szeretnnk csoportostani, de csak a washingtoni, oregoni s kaliforniai vsrlkra vagyunk kvncsiak, sszerbbnek tnik, hogy a hrom llamot tartalmaz sorokat a WHERE zradkban szrjk, mg mieltt llamonknti csopor tostst krnnk a GROUP BY zradkkal. Ha nem gy tennnk, a FROM zradk az sszes llam vsrlit visszaadn, s felesleges munkval csoportostannk olyan sorokat, amelyek re semmi szksg nincs. me egy jobb megolds a problmra: Fordts - Select customer state and the sum of quantity ordered times quoted price as SumOfOrders from the customers table joined with the orders table on customer ID in the customers table matches customer ID in the orders table, and then joined with the order details table on order number in the orders table matches order number in the order details table where customer state is in the list 'WA, 'OR', 'CA', grouped by customer state, and having the sum of the orders greater than $1 million (Vlaszd ki a vsrl llamt, valamint a rendelt mennyisgek sszegnek s a jegyzett rnak a szorzatt SumOfOrders nven a vsrlk s a rendelsek tblibl, amelyeket a vsrlazonost alapjn sszekapcsoltunk, ha a vsr lk tbljban tallhat vsrlazonost megegyezik a rendelsek tbljban tallhat vsrlazonostval, tovbb ezt kapcsold ssze a rendelsek rsz leteit tartalmaz tblval a rendelsi szm alapjn, s vlaszd ki azokat az adatokat, ahol a rendelsek tbljban tallhat rendelsi szm megegye zik a rendelsek rszleteit tartalmaz tblban tallhat rendelsi szmmal, ha a vev llama WA, ,,ORvagy CA, a vev llama szerint csoportostva, s megkvetelve, hogy a rendelsi sszeg meghaladja az egymilli dollrt.) Tisztzs - Select customer state, and the sum of (quantity ordered times * quoted price) as SumOfOrders from the customers table inner joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table, and then joined with the orders table on orders.order number in the orders table matches = order_details.order number in the order details table where customer state is in the list ('WA', 'OR', 'CA'), grouped by customer state, and
having

SQL

the sum of the orders (quantity ordered * quoted price) greater than > $1 million 1000000 SELECT Customers.CustState, SUM(Order_Details.QuantityOrdered * Order_Details.QuotedPrice) AS SumOfOrders FROM (Customers INNER JOIN Orders ON Customers.CustomerID Orders.CustomerID)

INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber WHERE Customers.CustState IN ('WA', 'OR', 'CA') GROUP BY Customers.CustState HAVING SUM(Order_Details.QuantityOrdered * Order_Details.QuotedPrice) > 1000000
Ezt a lekrdezst a mintaadatbzisban CHl4_West_Coast_Big_Order_States nven tallhatjuk meg.

Ne essnk a HAVING COUNT csapdjba!


Sokszor vagyunk kvncsiak arra, hogy mely ttelcsoportoknak van meghatrozott szmnl kevesebb tagja. Ilyen eset pldul, ha azt szeretnnk tudni, hogy melyik egyttes ll hrom nl kevesebb tagbl, melyik recepthez kell hozzvalknt legfeljebb kt tejtermk, vagy hogy melyik trgyat tantja hrom vagy kevesebb flls egyetemi tanr. A trkk ebben az esetben az, hogy azt is tudni akarjuk, hogy melyik csoportnak van nulla eleme. Nzznk egy pldt, ami rvilgt, hogy milyen csapdba kerlhetnk: Sorold fel azokat a trgycsoportokat, amelyeket hromnl kevesebb flls egyetemi tanr tant!" A megoldshoz szksges tblkat a 14.4. bra mutatja.

Fordts

- Select category description and the count of staff ID as ProfCount from the categories table joined with the faculty categories table on category ID in the categories table matches category ID in the faculty categories table, and then joined with the faculty table on staff ID in the faculty table matches staff ID in the faculty categories table where title is 'Professor,' grouped by category description, and having the count of staff ID less than 3 (Vlaszd ki a trgycsoportlerst s a tanrazonostk szmt ProfCount n ven abbl a tblbl, amelyet a trgycsoportok s a tanszkcsoportok tb lit a csoportazonost alapjn sszekapcsolva, majd ezt a tanszkek s a tanszkcsoportok tblit a tanrazonost alapjn sszekapcsol tblval

sszekapcsolva kaptunk, ha a cm Professor, s az eredmnyt csoporto stsd. trgycsoportlers szerint, s kveteld meg, hogy a tanrazonostk szma hromnl kevesebb legyen.) Tisztzs - Select category description and the count of (staff ID) as ProfCount from the categories table inner joined with the faculty categories table on categories.category ID in the categories table matches = faculty_categories.category ID in the faculty categories table, and then inner joined with the faculty table on faculty.staff ID in the faculty table matches = faculty_categories.staff ID in the faculty categories table where title is = 'Professor,' grouped by category description, and having the count of (staff ID) less than <3 SQL SELECT Categories.CategoryDescription,

COUNT(Faculty_Categories.StaffID) AS ProfCount FROM (Categories INNER JOIN Faculty_Categories ON Categories.CategoryID = Faculty_Categories.CategoryID) INNER JOIN Faculty ON Faculty.StaffID = Faculty_Categories.StaffID WHERE Faculty.Title = 'Professor' GROUP BY Categories.CategoryDescription HAVING COUNT(Faculty_Categories.StaffiD) < 3
Egsz jl fest, nem? Albb lthatjuk a krelem ltal visszaadott eredmnyhalmazt:

szrevettk, hogy az eredmnyhalmazban nincs nulla egyetemi tanrt tartalmaz trgycso port? Ennek az az oka, hogy a COUNT fggvny csak azokat a sorokat szmolja meg, ame lyek a flls egyetemi tanrok kiszrse utn maradtak a Faculty_Categories (Tanszkcso portok) tblban. A vrhatan nullt tartalmaz sorokat a WHERE zradkban eldobtuk. Csak azrt, hogy igazoljuk a gyannkat, miszerint lteznek flls egyetemi tanr nlkli csoportok, lltsunk ssze egy olyan lekrdezst, amelynek a segtsgvel ellenrizhetjk ezt az elmletnket. Emlkezznk vissza, hogy COUNT sszest fggvny nullval tr vissza, ha res halmaz megszmllsra krjk, tovbb arra, hogy eredmnyl res hal mazt kaphatunk, ha a krelmet gy fogalmazzuk meg, hogy vegye figyelembe, hogy hny sor van egy meghatrozott trgycsoportban. ppen gy fogunk tenni, s arra knyszertjk az adatbzis-kezelt, hogy a trgycsoportokat egyenknt nzze vgig. A csoportsorokat fogjuk megszmolni, nem a tanszki trgyak sorait. Nzzk meg az albbi SQL-utastst: SQL

SELECT COUNT(Faculty.StaffID) AS BiologyProfessors FROM (Faculty INNER JOIN Faculty_Categories ON Faculty.StaffID = Faculty_Categories.StaffID) INNER JOIN Categories ON Categories.CategorylD = Faculty_Categories.CategoryID WHERE Categories.CategoryDescription = 'Biology' AND Faculty.Title = 'Professor'

A lekrdezst a mintaadatbzisban CH14_Count_Of_Biology_Professors nven tallhatjuk meg. Mint ltjuk, valban nincsenek olyan flls egyetemi tanrok a School Scheduling mintaadatbzisban, akik biolgit tantanak. A lekrdezst gy fogalmaztuk meg, hogy csak egy trgycsoportot vegyen figyelembe. Mivel nincsenek olyan sorok, amelyek egyszerre tartalmaznak Professor s Biology rtkeket, rvnyes res halmazt kaptunk eredmnyl. Ennl fogva a COUNT fggvny is nullt ad vissza. Most, hogy mindezt mr tudjuk, allekrdezsknt begyazhatjuk ezt a krelmet egy WHERE zradkba, ami kivonatolja a trgycsoport-azonostn alapul egyezseket a kls lekrdezsbl. gy arra knyszertjk az adatbzis-kezelt, hogy a csoportokat egyesvel vizsglja meg, mivel a kls krelemben a trgycsoportlersokat soronknt kri le a Categories tblbl. Az SQL kd a kvetkez lesz: SQL

SELECT Categories.CategoryDescription, (SELECT COUNT(Faculty.StaffID) FROM (Faculty

INNER JOIN Faculty_Categories ON Faculty.StaffID = Faculty_Categories.StaffID) INNER JOIN Categories AS C2 ON C2.CategoryID = Faculty_Categories.CategoryID WHERE C2.CategoryID = Categories.CategoryID AND Faculty.Title = 'Professor') AS ProfCount FROM Categories WHERE (SELECT COUNT(Faculty.StaffID) FROM (Faculty INNER JOIN Faculty_Categories ON Faculty.StaffID = Faculty_Categories.StaffID) INNER JOIN Categories AS C3 ON C3.CategoryID = Faculty_Categories.CategoryID WHERE C3.CategoryID = Categories.CategoryID AND Faculty.Title = 'Professor') < 3
A krelmet a mintaadatbzisban CH14_Subjects_Fewer_3_Professors_RIGHT nven tallhat juk meg. Figyeljk meg, hogy az allekrdezs egy msolatt a SELECT zradkban is elhelyeztk, hogy lssuk a trgycsoportonknti tnyleges szmokat. Ebben az esetben ez jl mkdik, mivel a WHERE zradk allekrdezse rvnyes nulla rtket ad vissza azokra a csoportokra, ahol nincs flls egyetemi tanr. A helyes eredmnyt lent lthatjuk.

Ahogy ltjuk is, sok trgycsoporthoz nincs flls egyetemi tanr hozzrendelve. Br ez a vgs megolds egyltaln nem hasznlja a HAVING zradkot, mgis itt mutatjuk be, rvilgtva, hogy nem mindig a HAVING az egyrtelm eszkz az ilyen feladatok esetben. Mindazonltal a HAVING zradkot tovbbra is hasznlhatjuk szmos ...kevesebb, mint..." tpus problma megoldshoz. Ha fel akarjuk sorolni az sszes olyan vsrlt, aki havi 500 dollrnl kevesebbet vsrolt, de nem vagyunk kvncsiak azokra, akik egyltaln nem vsroltak semmit, akkor a HAVING j (s valsznleg gyorsabban vgrehajthat) megol dst jelent. Viszont ha azokra a vsrlkra is kvncsiak vagyunk, akik semmit sem vsrol tak, akkor hasznljuk a fent ismertetett, nem a HAVING zradkot hasznl megoldst.

A HAVING hasznlati terletei


Mostanra valsznleg mr jl tltjuk, hogyan sszegezhetnk csoportokat sszest fggvnyekkel s a GROUP BY zradkkal, s tudjuk, hogyan szrhetjk a csoportostott adatokat a HAVING segtsgvel. A HAVING sokoldal hasznlatnak bemutatsra most felsorolunk nhny problmt, amelyet ezzel az j zradkkal megoldhatunk, utna pedig - a Pldk rszben - bemutatunk nhny pldt is. Sorold fel a beszlltkat s beszlltnknt a termkek tlagos szlltsi idejt nap ban mrve. Azokra a beszlltkra vagyunk kvncsiak, akiknek az tlagos szlltsi ideje tbb nap, mint az sszes beszlltra szmtott tlagos szlltsi id! rd ki minden olyan termk nevt s sszeladsait, ahol az sszestett elads megha ladja az sszes termkre vonatkoz tlagos eladsokat az adott termkcsoportban! rd ki minden vsrl s rendelsi dtum esetben a vsrl teljes nevt s a rendelt ttelek vgsszegt, feltve, hogy az 1000 dollrnl nagyobb volt!" Hny rendels tartalmazott csupn egyetlen termket? Mely gynkk ktttek 3000 dollrt meghalad rtkben zleteket 2007 decemberben?" Sorold fel azokat az eladkat, akiknek kettnl tbb egymst tfed fellpse van! Sorold fel az gynk nevt, a rendezvnyekhez tartoz szerzdsi sszeget, s az gynk sszes megbzst azoknak az gynkknek az esetben, ahol a megbzsok sszege meghaladja az 1000 dollrt! Van olyan csapatkapitny, akinek a pontszma nagyobb, mint a csapata brmelyik tagjnak? Sorold fel azokat a tekejtkosokat s tlagos jtkpontszmukat, akiknek az tlaga nagyobb, mint 155! Sorold fel azokat a tekejtkosokat, akiknek a legmagasabb pontszma legalbb hsz ponttal meghaladja a jelenlegi tlagukat! A teljestett rkat figyelembe vve, trgycsoportonknt s hallgatnknt sorold fel a trgycsoport nevt, a hallgat nevt, s a hallgatnak az adott trgycsoportba tarto z sszes trgyra vonatkoz tlagos osztlyzatt azoknak a hallgatknak az esetben, akiknek az tlaga tbb, mint 90!"

Sorold fel trgycsoportonknt azoknak a trgycsoportoknak a nevt s a knlt rk szmt, ahol a trgycsoportba hrom vagy tbb ra tartozik! Sorold Jel azokat a tanrokat s a tanr ltal tartott rk szmt, ahol a tanr legalbb egy, de kettnl kevesebb trgyat tant!" Sorold fel azokat a recepteket, amelyek marhahst s fokhagymt egyarnt tartal maznak! sszegezd a s mennyisgt receptosztlyonknt, s rd ki azokat a receptosztlyokat, ahol hromnl tbb teskanl sra van szksg!" Mely recepttpusokbl van kettnl tbb?

Pldk
Mostanra elsajttottuk annak a mdszert, hogy miknt alkothatunk a HAVING zradk segtsgvel lekrdezseket, s arra is lttunk nhny pldt, hogy mifle krdseket tudunk a segtsgvel megvlaszolni. Most lssunk nhny olyan pldt, ahol az adatok csoportostsra s a csoportok sszestett rtkeinek szrsre lesz szksg. Minden plda a mintaadatbzisokbl szrmazik. Ezenkvl ksztettnk az eredmnyhalmazokbl is mintkat; ezek kzvetlenl az SQLutastsformk utn tallhatk. Az eredmnyhalmaz eltt tallhat nv ugyanaz, mint a CD-mellkleten tallhat megfelel SQL-lekrdezs neve. Minden lekrdezst a megfe lel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz le krdezsek neve ,,CHl4-vel kezddik. A pldkat a knyv elejn tallhat bevezets t mutatst kvetve tlthetjk be s prblhatjuk ki. Ne felejtsk el, hogy a pldinkban hasznlt oszlop- s tblanevek a B fggelkben tallhat mintaadatbzisok szerkezetbl szrmaznak. Az egyszersg kedvrt a kvetkez pldkban sszevontuk a Fordts s a Tisztzs lpseit.

Sales Orders adatbzis


Sorold fel minden vsrl s rendelsi dtum esetben a vsrl teljes nevt s a rendelt ttelek sszrtkt, ha az az 1000 dollrt meghaladja!" Fordts/ - Select customer first name and || ' ' || customer last name Tisztzs as CustFullName, order date, and the sum of (quoted price times * quantity ordered) as TotalCost from the customers table inner joined with the orders table on customers.customer ID in the customers table matches = orders.customer ID in the orders table,

and then inner joined with the order details table on orders.order number in the orders table matches = order_details.order number in the order details table, grouped by customer first name, customer last name, and order date, having the sum of (quoted price times * quantity ordered) greater than > 1000 SQL

SELECT Customers.CustFirstName || ' ' || Customers.CustLastName AS CustFullName, Orders.OrderDate, SUM(Order_Details.QuotedPrice * Order_Details.QuantityOrdered) AS TotalCost FROM (Customers INNER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID) INNER JOIN Order_Details ON Orders.OrderNumber = Order_Details.OrderNumber GROUP BY Customers.CustFirstName, Customers.CustLastName, Orders.OrderDate HAVING SUM(Order_Details.QuotedPrice * Order_Details.QuantityOrdered) > 1000

Entertainment Agency adatbzis


Mely gynkk ktttek 3000 dollrt meghalad rtkben zletet 2007 decemberben? Fordts/ - Select the agent first name, agent last name, and the Tisztzs sum of (contract price) as TotalBooked from the agents table inner joined with the engagements table on agents.agent ID in the agents table matches = engagements.agent ID in the engagements table where the engagement start date is between December 1, 2007, '2007-12-01' and December31, 2007. '2007-12-31', grouped by agent first name, and agent last name and having the sum of (contract price) greater than > 3000 SQL SELECT Agents.AgtFirstName, Agents.AgtLastName,

SUM(Engagements.ContractPrice) AS TotalBooked FROM Agents INNER JOIN Engagements ON Agents.AgentID = Engagements.AgentID WHERE Engagements.StartDate BETWEEN ' 2 0 0 7 - 1 2 - 0 1 ' A N D ' 2 0 0 7 - 1 2 - 3 1 ' GROUP BY Agents.AgtFirstName, Agents.AgtLastName HAVING SUM(Engagements.ContractPrice) > 3 0 0 0

School Scheduling adatbzis


,,A teljestett rkat figyelembe vve sorold fel trgycsoport s hallgat szerint a trgycsoport nevt, a tanul nevt, s a tanul tlagos osztlyzatt a trgycso portbl felvett valamennyi ra alapjn! Azokat a tanulkat szeretnnk ltni, akiknek az tlaga meghaladja a 90-et!" Fordts/ - Select category description, student first name, student last name, Tisztzs and the average avg(of grade) as AvgOfGrade from the categories table

inner joined

with the subjects table ID in the categories table matches = subjects.category ID in the subjects table, then inner joined with the classes table on subjects.subject ID = classes.subject ID in the classes table, then inner joined with the student schedules table on classes.class ID in the classes table matches = student_schedules.class ID in the student schedules table, then inner joined with the student class status table on student_class_status.class status in the student class status table matches = student_schedules.class status in the student schedules table, and finally inner joined with the students table on students.student ID in the students table matches = student_schedules.student ID in the student schedules table where class status description is = 'Completed,' grouped by category description, student first name, and student last name; and having the average avg(of grade) greater than > 90
on categories.category

SQL

SELECT Categories.CategoryDescription, Students.StudFirstName, Students.StudLastName, AVG(Student_Schedules.Grade) AS AvgOfGrade FROM ((((Categories INNER JOIN Subjects ON Categories.CategoryID = Subjects.CategoryID) INNER JOIN Classes ON Subjects.SubjectID = Classes.SubjectID) INNER JOIN Student_Schedules ON Classes.ClassID = Student_Schedules.ClassID) INNER JOIN Student_Class_Status ON Student_Class_Status.ClassStatus = Student_Schedules.ClassStatus) INNER JOIN Students ON Students.StudentID = Student_Schedules.StudentID WHERE Student_Class_Status.ClassStatusDescription = 'Completed' GROUP BY Categories.CategoryDescription, Students.StudFirstName,

Students.StudLastName HAVING AVG(Student_Schedules.Grade) > 90

Sorold fel az sszes olyan tanrt s az ltaluk tartott rkat, akik legalbb egy, de hromnl kevesebb rt tartanak!" A HAVING COUNT nulla"problmt gy elztk meg, hogy kijelen tettk, hogy csak azokat a tanrokat szeretnnk ltni, akik legalbb egy rt tartanak.
Fordts/ - Select staff first name, staff last name, and the count of Tisztzs

classes (*) as ClassCount from the staff table inner joined with the faculty classes table on staff.staff ID in the staff table matches = faculty_classes.staff ID in the faculty classes table, grouped by staff first name, and staff last name, and having the count of classes (*) less than < 3

SQL

SELECT Staff.StfFirstName, Staff.StfLastName, COUNT(*) AS ClassCount FROM Staff INNER JOIN Faculty_Classes ON Staff.StaffID = Faculty_Classes.StaffID

GROUP BY Staff.StfFirstName, Staff.StfLastName HAVING COUNT(*) < 3

Bowling League adatbzis


Sorold fel azokat a tekejtkosokat, akiknek a legmagasabb pontszma tbb mint 20 ponttal magasabb, mint a jelenlegi tlaguk! Fordts/ - Select bowler first name, bowler last name, Tisztzs the average avg(raw score) as CurrentAverage, and the maximum (raw score) as HighGame from the bowlers table inner joined with the bowler scores table on bowlers.bowler ID in the bowlers table matches = bowler_scores.bowler ID in the bowler scores table, grouped by bowler first name, and bowler last name, and having the maximum (raw score) greater than > the average avg(raw score) plus + 20

SQL

SELECT Bowlers.BowlerFirstName, Bowlers.BowlerLastName, AVG(Bowler_Scores.RawScore) AS CurrentAverage, MAX(Bowler_Scores.RawScore) AS HighGame FROM Bowlers INNER JOIN Bowler_Scores ON Bowlers.BowlerID = Bowler_Scores.BowlerID GROUP BY Bowlers.BowlerFirstName, Bowlers.BowlerLastName HAVING MAX(Bowler_Scores.RawScore) > (AVG(Bowler_Scores.RawScore) + 20)

Recipes adatbzis
Sorold fel azokat a recepteket, amelyekhez marhahsra s fokhagymra is szksg van!" Fordts/ - Select recipe title from the recipes table Tisztzs where the recipe ID is in the (selection of recipe ID from the ingredients table inner joined with the recipe ingredients table on recipe_ingredients.ingredient ID in the recipe ingredients table matches = ingredients.ingredient ID in the ingredients table where the ingredient name is = 'Beef' or the ingredient name is = 'Garlic', grouped by recipe ID and having the count of the values in (recipe ID) equal to = 2) SQL SELECT Recipes.RecipeTitle

FROM Recipes WHERE Recipes.RecipeID IN (SELECT Recipe_Ingredients.RecipeID FROM Ingredients INNER JOIN Recipe_Ingredients ON Ingredients.IngredientID = Recipe_Ingredients.IngredientID WHERE Ingredients.IngredientName = 'Beef' OR Ingredients.IngredientName = 'Garlic' GROUP BY Recipe_Ingredients.RecipeID HAVING COUNT(Recipe_Ingredients.RecipeID) = 2)

Ez a plda a GROUP BY s a HAVING allekrdezsben val tletes hasznlatt mutatja be, amikor olyan recepteket keresnk, amelyek ben mindkt hozzval szerepel. Amikor a recept egyik hozzvalt sem tartalmazza, akkor nem jelenik meg az allekrdezsben. Amikor csak az egyik hozzvalt tartalmaz za, akkor a szmlls eredmnye 1 lesz, azaz a sort elvetjk. Csak amikor mindkt hozzval szerepel, akkor lesz a COUNT ltal visszaadott rtk 2. Vigyzzunk, mert ha egy recept zzott s egsz fokhagymt is tartalmaz, ez a mdszer nem mkdik! A COUNT a kt fokhagyma-bejegyzsre 2 eredmnyt ad, s a receptet annak ellenre ki vlasztja, hogy az nem tartalmaz marhahst. Ha esetleg csodlkozunk, mirt hasznltuk az OR mveletet, amikor a marhahs s a fokhagyma jelenltt egyarnt megkveteljk a receptben, akkor nzzk t az OR hasznlatra vonatkoz rszt a 6. fejezetben. A problma egy msik lehetsges megoldst a 8. fejezetben kzltk.

sszefoglals
A fejezetet annak a fejtegetsvel kezdtk, hogy miknt szkthetjk a csoportjainkat, s hogyan szrhetjk ket a HAVING zradkban hasznlt sszest szmtsok segtsgvel. Bemutattuk a SELECT e vgs zradknak utastsformjt, s egy egyszer pldn keresztl el is magyarztuk. Ez utn arra mutattunk pldt, hogy a sorok szrsre mikor rszestsk elnyben a WHERE zradkot a HAVING zradkkal szemben. Elmagyarztuk, hogy amikor csak mdunkban ll, mirt jobb, ha a szrt a WHERE zradkban helyezzk el. Mieltt tlsgosan elknyelmesedtnk volna a HAVING hasznlata kzben, bemutattunk egy el kerlend helyzetet, ami az esetlegesen nulla elem csoportok szmllsakor fordul el, de arra is muttatunk mdszert, hogy miknt oldhatjuk meg az ilyen jelleg problmkat. Vgl sszefoglaltuk, hogy mirt hasznos a HAVING zradk, s a HAVING segtsgvel megoldand feladatokat is kzltnk, majd pldkat mutattunk be arra, hogy miknt alkothatunk a HAVING zradkot felhasznl krelmeket. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a megoldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrdezsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQLutastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis 1. Sorold fel azokat a beszlltkat, valamint az tlagos szlltsi idt napban

mrve, ahol a szlltsi id nagyobb, mint az sszes beszlltra vonatkoz tlagos szlltsi id! (Tipp: az sszes beszlltra vonatkoz tlagos szlltsi id lekrdezshez hasznljunk allekrdezst.) A megolds itt tallhat: CH14_Vendor_Avg_Delivery_GT_Overall_Avg (5 sor). 2. rd ki azoknak a termkeknek a nevt s az sszestett eladsait, ahol a termk sszestett eladsai meghaladjk a termkcsoporton belli tlagos eladsokat! (Tipp: az sszehasonltsi rtk kiszmtshoz elszr sszegezzk a termkcso porton belli termkek eladsait a SUM fggvny segtsgvel, s csoportonknt tlagoljuk az sszegeket az AVG felhasznlsval.) A megolds itt tallhat: CH14_Sales_By_Product_GT_Category_Avg (13 sor). 3. Hny rendels tartalmaz csupn egyetlen termket? (Tipp: a FROM zradkban hasznljunk olyan bels lekrdezst, amely felsorolja a rendelsi szmokat azokra a rendelsekre, amelyek csupn egyetlen sorbl llnak, majd szmoljuk meg a sorokat a kls SELECT zradkban.) A megolds itt tallhat: CH14_Single_Item_Order_Count (l sor).
Entertainment Agency adatbzis 1. Sorold fel azokat a eladkat, akiknek kettnl tbb egymst tfed fellpsk

van! (Tipp: alkossunk allekrdezst, s hasznljuk a HAVING zradkot, illetve a COUNT fggvnyt.) A megolds itt tallhat: CHl4_Entertainers_MoreThan_2_0verlap (l sor). 2. Sorold fel az gynk nevt, a lekttt rendezvnyek sszestett szerzdsi sszegt s az gynk sszes megbzst azokban az esetekben, ahol az gynk megbz sainak sszrtke meghaladja az 1000 dollrt! (Tipp: induljunk ki a 13. fejezet hasonl problmjbl, s prbljuk azt HAVING zradkkal kibvteni.) A megolds itt tallhat: CH14_Agent_Sales_Big_Commissions (4 sor).
School Scheduling adatbzis

Sorold fel trgycsoportonknt a trgycsoport nevt s a knlt rk szmt azok nak a trgycsoportoknak az esetben, amelyek hrom vagy tbb rt knlnak! (Tipp: kapcsoljuk ssze a trgycsoportokat a trgyakkal, majd az rkkal, a COUNT fggvnnyel szmoljuk meg a sorokat, s a megfelel HAVING zradkkal meg kapjuk a vgeredmnyt.) A megolds itt tallhat: CH14_Category_Class_Count_3_0r_More (ll sor). 2. ,,Sorold fel a tanrokat s azokat az rkat, amelyeket tartanak! Azokra a tan rokra vagyunk kvncsiak, akik hromnl kevesebb rt tartanak. (Tipp: ez a HAVING COUNT nulla helyzet, ezrt hasznljunk allekrdezst.) A megolds itt tallhat: CH14_Staff_Teaching_LessThan_3 (12 sor).
1.

3. Szmold ssze azokat az rkat, amelyeket minden tanr tart!

(Tipp: a problma megoldshoz valjban nem szksges a HAVING zradk, de esetleg a GROUP BY zradkkal szeretnnk - helytelenl megoldani.) A helyes megoldst a CHl4_Staff_Class_Count_Subquery (27 sor) tblban talljuk, a helytelent pedig a CHl4_Staff_Class_Count_GROUPED (23 sor) tblban.
Bowling League adatbzis 1. Van olyan csapatkapitny, akinek a tiszta pontszma magasabb, mint brmelyik

csapattrs? (Tipp: a kapitnyok legmagasabb tiszta pontszmt gy kaphatjuk meg, hogy a JOIN segtsgvel, a csapatkapitny-azonost alapjn sszekapcsoljuk a csapatok tbljt a jtkosok tbljval, majd ezt a pontszmok tbljval A tbbi csapattag legnagyobb pontszmval egy HAVING zradk segtsgvel, allekrdezsbl vgezzk el az sszehasonltst.) A megolds itt tallhat: CHl4_Captains_Who_Are_Hotshots (O sor). (Nincs olyan kapitny, aki jobban tekzik, mint a csapattrsai!) 2. Sorold fel azoknak a tekejtkosoknak a nevt s pontszmtlagt, akiknek az tlaga meghaladja a 155-t! (Tipp: egyszer HAVING zradkra lesz szksgnk, ahol literlis szmrtkkel hasonltjuk ssze a pontok tlagt az AVG fggvny segtsgvel.) A megolds itt tallhat: CHl4_Good_Bowlers (17 sor). 3. Sorold fel minden olyan tekejtkos keresztnevt s vezetknevt, akinek az tlagos pontszma nagyobb, mint az sszestett tlagos pontszm, vagy egyenl azzal! (Tipp: a megolds mdszert a 12. fejezet pldi kztt mutattuk be. Akkor a WHERE zradkban elhelyezett allekrdezssel oldottuk meg a feladatot - most oldjuk meg a HAVING zradk segtsgvel!) A megolds itt tallhat: CHl4_Better_Than_Overall_Average_HAVING (17 sor).
Recipes adatbzis 1. sszegezd a smennyisget receptosztlyonknt, s rd ki azokat a receptosztlyo

kat, amelyekhez hrom teskanlnl tbb s kell! (Tipp: t tblbl ll sszetett JOIN alkalmazsra lesz szksgnk, hogy kiszrjk a st s a teskanalat, a SUM segtsgvel sszegezzk az eredmnyt, majd elvessk a hrom teskanlnl tbbet hasznl receptosztlyokat.) A megolds itt tallhat: CHl4_Recipe_Classes_Lots_Of_Salt (l sor). 2. Mely receptosztlyokban van kett vagy tbb recept? (Tipp: JOIN segtsgvel kapcsoljuk ssze a receptosztlyok s a receptek tblit, majd a COUNT fggvnnyel szmoljuk meg az eredmnyt, s csak azokat az osztlyokat tartsuk meg a HAVING zradk segtsgvel, amelyekben kt vagy tbb recept tallhat.) A megolds itt tallhat: CHl4_Recipe_Classes_Two_Or_More (4 sor).

Adathalmazok mdostsa

Adathalmazok frisstse
A vltozs, a folyamatos vltozs, az elkerlhetetlen vltozs - ez manapsg a trsadalom meghatroz tnyezje. - Isaac Asimov

A fejezet tmakrei
Mi az az UPDATE? Az UPDATE utasts Az UPDATE hasznlati terletei Pldk sszefoglals nll feladatok

Ahogyan az a II., III. s IV. rszben kiderlt, SELECT utastssal adatokat lekrdezni a tblk bl kihvs s szrakozs is egyben. (Na j, nha sokkal inkbb kihvs, mint szrakozs.) Ha a krdsek megvlaszolsn kvl mst nem akarunk tenni, akkor a knyv eme utols rszre nincs is szksgnk. A legtbb vals alkalmazsban azonban nem csak sszetett krdsekre kell vlaszt adni, hanem lehetv kell tenni a felhasznlknak az adatok mdo stst, trlst, vagy j adatok hozzadst is. Az SQL-szabvny az adatok lekrdezsre hasznlhat SELECT utasts mellett hrom olyan utastst is meghatroz, amely az adatok mdostsra hasznlhat. Ebben a fejezetben a hrom kzl az elsrl - az UPDATE-rl lesz sz.

Mi az az UPDATE?
A SELECT utasts lehetv teszi adathalmazok lekrdezst a tblkbl. Az UPDATE (fris sts) szintn adathalmazokkal dolgozik, de azt teszi lehetv, hogy megvltoztassuk egy vagy tbb sor egy vagy tbb adatt. Mostanra mr ismersek szmunkra a kifejezsek is. Egy oszlop mdostsakor egyszeren egy kifejezst adunk rtkl az oszlopnak.

Legynk azonban vatosak, mert az UPDATE utasts hatkonysga veszlyt is jelent! Az esetek dnt tbbsgben csak egy vagy nhny sort akarunk mdostani. Ha nem vagyunk elvigyzatosak, akkor vletlenl egyszerre sorok ezreit mdosthatjuk. Ennek elkerlsre bemutatunk egy mdszert, amellyel elszr kiprblhatjuk az utastst. Az sszes pldt s a feladatok megoldst megtallhatjuk a megfelel mintaadatbzisok mdosthat (Modify uttag) vltozatban (SalesOrdersModify, EntertammentAgencyModify, SchoolSchedulingModify, BowlingLeagueModify).

Az UPDATE utasts
Az UPDATE utasts formja sokkal egyszerbb, mint a SELECT utasts, amelyrl a korbbi fejezetekben tanultunk. Az UPDATE utastsnak csak hrom zradka van: az UPDATE, a SET s a nem ktelez WHERE zradk, ahogyan az a 15.1. brn lthat.

Az UPDATE kulcssz utn a mdostand tbla nevt adjuk meg, a SET kulcssz utn pe dig egy vagy tbb olyan zradk kvetkezik, amely egy-egy oszlophoz j rtket rendel. Legalbb egy ilyen zradknak ktelez lennie, de annyit sorolhatunk fel, amennyire csak szksgnk van tbb oszlop mdostshoz. A nem ktelez WHERE zradkkal szab lyozhatjuk, hogy a tbla mely sorait mdostsa az utasts.

Az egyszer UPDATE utasts


Lssunk egy pldt, amelyben az oszlopnak egyszeren egy kifejezssel adunk j rtket! Ebben a fejezetben is a 4. fejezetben ismertetett Krelem - Fordts Tisztzs- SQL mdszert fogjuk hasznlni.

Nveld meg minden termk fogyaszti rt 10 szzalkkal! No, ez egy kicsit trkks! Nem knny SQL-szer nyelvre fordtani az ilyen krelmeket, mert sem az angol, sem a magyar nyelvben nem abban a sorrendben szerepelnek a mon datrszek, mint amelyet az UPDATE utasts megkvetel. Vegyk szemgyre kzelebbrl a krelmet, s prbljuk meg meghatrozni a) a mdostand tbla, s b) a mdostand oszlopok nevt. Fogalmazzuk t a krelmet gy, hogy a mondatrszek ebben a sorrendben kvetkezzenek: Mdostsd a termkeket gy, hogy a fogyaszti r 10 szzalkkal njn! Fordts - Update the products table by setting the retail price equal to the retail price plus 10 percent of the price (Mdostsd a termkek tbljt gy, hogy a fogyaszti r egyenl legyen a fogyaszti r plusz tz szzalkkal.) Tisztzs - Update the products table by setting the retail price equal to = the retail price plus + (.10 percent * retail price) SQL UPDATE Products

SET Price = Price + ( 0 . 1 * Price)


Figyeljk meg: nem rhattuk azt, hogy SET Price + 10%. Az egyenlsgjel bal oldaln szerepelnie kell az oszlopnvnek, a jobb oldalra pedig egy olyan kifejezst kell rnunk, amely megadja az j rtket. Ha az j rtk kiszmtshoz fel kell hasznlnunk az oszlop jelenlegi rtkt, akkor szksg szerint szerepeltethetjk az oszlopnevet az egyenlsgjel jobb oldaln is. Ezt a szablyt nagyon vilgosan fogalmazza meg az SQL-szabvny: az adatbzisrendszernek elbb minden rtkad kifejezst ki kell rtkelnie, s csak azutn kezdhet hozz a sorok mdostshoz. Ennek megfelelen az adatbzis, mieltt brmit is mdostana, feloldja a Price (r) oszlopra vonatkoz hivatkozsokat az egyenl sgjel jobb oldaln, azaz behelyettesti a Price oszlop mdosts eltti rtkt. Ez a fajta rtkad utasts minden programozsi nyelvben azonosan mkdik. Igaz, gy tnik, mintha az oszlophoz nmaga rtkt rendelnnk hozz, valjban azonban el vesszk a mdosts eltti rtket, hozzadunk tz szzalkot, s az gy kapott eredmnyt hasznljuk fel az rtkadskor.

Csak a kivlasztott sorok mdostsa


Biztos, hogy mindig a tbla sszes sort mdostani akarjuk? Valsznleg nem. Az UPDATE utastshoz egy WHERE zradk hozzadsval korltozhatjuk, hogy az utasts mely soro kat mdostsa. Nzznk egy msik feladatot: A ruhzati beszlltnk az imnt 4 szzalkos remelst jelentett be. Nveld meg a ruhzati termkek fogyaszti rt 4 szzalkkal!

Fogalmazzuk t a krelmet: Mdostsd a termkeket gy, hogy a fogyaszti r egyenl legyen a fogyaszti r plusz ngy szzalkkal, minden ruhzati termk (3-as termkcsoport) esetben! Fordts - Update the products table by setting the retail price equal to retail price times 1.04 for all products in category 3 (Mdostsd a termkek tbljt gy, hogy a fogyaszti r egyenl legyen a fogyaszti r szorozva 1,04-dal azoknak a termkeknek az esetben, amelyeknek a termkcsoportja a 3-as.) Tisztzs - Update the products table by setting the retail price equal to = retail price times * 1.04 for all where products in category ID = 3 SQL UPDATE Products

SET RetailPrice = RetailPrice * 1.04 WHERE CategoryID = 3


A lekrdezsben egyszerstettk a szmtst, s inkbb 1,04-dal szoroztuk meg az rat, nem pedig hozzadtuk az eredeti rtk 0,04-szorost. Az eredmny matematikai szempontbl azonos, de gyorsabban vgre hajthat, mert hatkonyabban, kt mvelet (r plusz r szorozva 0,04-dal) helyett csupn eggyel (r szorozva l, 04-dal) vgzi el a feladatot. Azok utn, hogy a 11. fejezetben mr az allekrdezsekkel is megkzdttnk, ez igazn egyszer volt, ugye? De ami ksik, nem mlik: az UPDATE utastsok WHERE zradkban gyakran fogunk hasznlni allekrdezseket - de erre majd csak a fejezet ksbbi rszben kerl sor.

Els a biztonsg: ellenrizzk, hogy valban a megfelel sorokat mdostjuk!


Azt ajnljuk, hogy mg a legegyszerbb UPDATE utastsnl is elszr mindig ellenriz zk azt, hogy valban a megfelel sorokat fogjuk-e mdostani. De hogyan is kezdjnk hozz? Amint mr emltettk, az esetek tbbsgben egy WHERE zradkkal leszktjk a mdostand sarok krt. Mirt is ne rhatnnk olyan SELECT utastst, amely visszaadja azokat a sorokat, amelyeket mdostani akarunk? Folytatva korbbi pldnkat, krjnk le az adatbzisbl egy olyan oszlopot, amely alapjn azonostani tudjuk a krdses sort, a mdostand oszlop rgi rtkt, s annak a kifejezsnek az rtkt, amelyet rtkl akarunk adni a mdostand oszlopnak: rd ki azoknak a termkeknek a nevt, a fogyaszti rt s a fogyaszti rat 4 szza lkkal megnvelve a termkek tbljbl, amelyek a 3-as termkcsoportba tartoznak!" Fordts - Select product name, retail price, and retail price times 1.04 from the products table for products in category ID 3

(rd ki a termk nevt, a fogyaszti rat s a fogyaszti rat megszorozva 1,04-dal a termkek tbljbl, azokra a termkekre, amelyek termkcso portja a 3-as.) Tisztzs - Select product name, retail price, and retail price times * 1.04 from the products table for where products in category ID = 3 SQL SELECT ProductName, RetailPrice,

RetailPrice * 1.04 As NewPrice FROM Products WHERE CategoryID = 3


Az eredmnyt a 15.2. bra mutatja.

15.2. bra A mdostand sorok ellenrzse


Figyeljk meg, hogy a lekrdezsben szerepeltettk a termk nevt, gy knnyen megl lapthatjuk, hogy mely sorokat fogjuk mdostani. Ha a kvnt eredmnyt kaptuk, akkor talakthatjuk a SELECT utastst a megfelel UPDATE utastss, trlve a szksgtelen rszeket, illetve megcserlve a FROM s SELECT zradkot. Egyszeren hzzuk ki a felesleges szavakat, rjuk t a tblanevet az UPDATE zradkba, a closzlopot s a kifejezst egy egyenlsgjellel elvlasztva helyezzk t a SET zradkba, msoljuk t a WHERE zradkot, s mr kszen is vagyunk.

Egy rvid kitr: tranzakcik


Mieltt tl mlyre merlnnk az adatmdostsok tengerben, meg kell ismerkednnk az SQL egy nagyon fontos szolgltatsval. Az SQL-szabvny meghatroz egy tranzakci nak nevezett dolgot, amely arra szolgl, hogy elhatrolja s sszefogja a tblkban trolt adatok mdostsainak egy sorozatt. Az SQL tranzakciira gy gondolhatunk, mint egy-egy vals vsrlsi tranzakcira, amely akr online, akr egy zletben trtnhet. A tranzakcit akkor kezdemnyezzk, amikor leadjuk a rendelst, a kvetkez lps a megrendelt ter mk kifizetse, a tranzakci pedig akkor fejezdik be, amikor tvesszk az rut. Ha az ru nem rkezik meg, akkor visszakapjuk a pnznket. Ha az ru nem megfelel, akkor vissza kldjk, s visszakrjk a pnznket. Az SQL-szabvny hrom utastst knl a fenti esemnyek modellezsre. A mdostsok kezdemnyezse eltt kiadott START TRANSACTION paranccsal jelezzk, hogy az ezutn kvetkez mdostsokat el akarjuk hatrolni a tbbitl, s ellenrizni akarjuk. Gondoljunk erre gy, mint a rendels feladsra. Elvgezzk az adatok mdostst - rgztjk a fizetst s az ru tvtelt. Ha minden rendben lezajlott, akkor a COMMIT (vglegests vagy jv hagys) paranccsal vglegesthetjk a mdostsokat. Ha valami hiba csszott a folyamatba (a kifizets vagy az rutvtel meghisult), akkor a ROLLBACK (visszagrgets) paranccsal llthatjuk vissza az adatainkat abba az llapotba, amelyben a tranzakci megkezdse eltt voltak. A fenti vsrls-elads plda egy kicsit suta, a tranzakcikezels azonban az SQL nagyon hasznos szolgltatsa, ami klnsen akkor hasznlhat jl, ha egyszerre tbb tblt kell mdostanunk. Tranzakcik alkalmazsval biztosthatjuk, hogy vagy az sszes mdosts sikerl, vagy egy sem. A vev nem szeretn kifizetni az rut tvtel nlkl, de az elad sem akarja tadni az rut a kifizets nlkl. Jegyezzk meg, hogy a fentiek nem csak az ebben a fejezetben trgyalt UPDATE, hanem a kvetkez kt fejezetben szerepl INSERT s DELETE parancsokra is vonatkoznak. Nem minden adatbzis-kezel valstja meg a tranzakcikat, s a tranzakcikezelsre hasznlatos utastsok formja is eltr lehet. Egyes adatbzisrendszerek lehetv teszik tranzakcik egymsba gyazst, illetve tbb jvhagysi pont ltrehozst. Nhny vgfelhasznlknak sznt adatbzisrendszer, mint pldul a Microsoft Office Access, a httrben mindig j tranzakcit kezd, amikor olyan parancsot adunk ki, ami mdostja az adatokat. Aki mr hasznlt Microsoft Accesst, bizonyra emlkszik azokra az zenetek re, amelyek arrl tjkoztatnak, hogy hny sort fogunk mdostani, s lesz-e sikertelen mdostsi ksrlet. Ilyenkor vagy elfogadjuk a mdostsokat, vagy trljk azokat (ez utbbi felel meg a ROLLBACK-nek). Mint ilyen esetekben mindig, azt javasoljuk, hogy nzznk utna a tmnak sajt adatbzisrendszernk dokumentcijban.

Tbb oszlop mdostsa


Ahogyan azt az UPDATE utasts szintaxisdiagramja (15.1 bra) alapjn gondolhatjuk, egyszerre tbb mdostand oszlop is megadhat, gy, hogy az egyes rtkadsokat vesszvel elvlasztva egyms utn rjuk. Jegyezzk meg: az adatbzis a felsorolt rtkad sok mindegyikt vgrehajtja a WHERE zradk ltal meghatrozott sszes soron. Nzznk egy pldt a School Scheduling adatbzis adatainak frisstsre: Mdostsd az rkat az albbiak szerint: legyen az osztlyterem az 1635-s, s cserld a betemezett napokat htfrl, szerdrl s pntekrl keddre, cstrtkre s szombatra minden rajzra esetben (tantrgy-azonost: 13)" Fordts - Update classes and set classroom ID to l635,Monday schedule to false,Wednesday schedule to false, Friday schedule to false, Tuesday schedule to true,Thursday schedule to true, and Saturday schedule to true for all classes that are subject ID 13 (Mdostsd az rkat: lltsd a tanterem-azonostt 1635-re, a htfi alkal mat hamisra, a szerdai alkalmat hamisra, a pnteki alkalmat hamisra, a ked di alkalmat igazra, a cstrtki alkalmat igazra s a szombati alkalmat igaz ra minden olyan sorban, ahol a tantrgy-azonost 13.) Tisztzs - Update classes and set classroom ID to = l635,Monday schedule to = false, Wednesday schedule to = false, Friday schedule to = false, Tuesday schedule to = true,Thursday schedule to = true, and Saturday schedule to = true for all classes that are where subject ID = 13 SQL UPDATE Classes

SET ClassRoomID = 1635, MondaySchedule = 0, WednesdaySchedule = 0, FridaySchedule = 0, TuesdaySchedule = 1, ThursdaySchedule = 1, SaturdaySchedule = 1 WHERE SubjectID = 13
A legtbb adatbzisrendszer 0-val jelli a hamis, s -1-gyel vagy 1-gyel az igaz rtket, de nem rt, ha ezt ellenrizzk az adatbzisrendsze rnk dokumentcijban. Ha egszen biztosak akarunk lenni abban, hogy csak a htfi, szerdai s pnteki napokra tervezett rajzrkat mdostjuk, akkor az albbiak szerint egsztsk ki a WHERE zradkot: SQL

UPDATE Classes SET ClassRoomID = 1635, MondaySchedule = 0, WednesdaySchedule = 0, FridaySchedule = 0, TuesdaySchedule = 1, ThursdaySchedule = 1, SaturdaySchedule = 1

WHERE SubjectID = 13 AND MondaySchedule = 1 AND WednesdaySchedule = 1 AND FridaySchedule = 1


Figyeljk meg: a szrskor a mdosts eltti rtket vesszk alapul, amikor a feltteleket megfogalmazzuk. Ez a mdostott UPDATE utasts minden olyan sorra hajtdik vgre, ahol a subjectID (tantrgy-azonost) 13, a MondaySchedule, WednesdaySchedule s FridaySchedule mezk rtke pedig igaz (1). Minden olyan sorban, amelyre teljeslnek ezek a felttelek, az UPDATE utasts mdostja a ClassRoomID (osztlyterem-azonost) s a Schedule (Betemezett nap) oszlopokat. Ha ugyanezt az utastst ismtelten lefuttat juk, azt tapasztaljuk, hogy az adatbzis egyetlen sort sem mdost, mivel az els futskor mr megvltoztattunk minden olyan sort, amely kielgtette a szkt feltteleket.

Allekrdezs alkalmazsa a sorok szrsre


Az elz rszek pldiban a 3-as termkcsoportba tartoz termkeket vagy a 13-as tantrgyazonostj rkat mdostottuk. A valsgban az ehhez hasonl azonostkdok nem hor doznak tl sok jelentst. Sokkal valsznbb, hogy azt mondjuk: ruhzati termkek vagy "rajzrk". A SELECT lekrdezsek FROM zradkban JOIN zradkokkal soroljuk fel a kapcsold tblkat, s ezutn a kapcsold tblban szerepl, szemlletesebb jelentssel br rtkeket jelentjk meg. Ahhoz, hogy a kapcsolatokat meg tudjuk hatrozni, mint mindig, termszetesen most is tisztban kell lennnk a tblk kztti sszefggsekkel. A pldnkhoz szksges adatbzistblkat a 15.4. bra mutatja.

Vegyk el ismt a termkmdost utastsunk ellenrzsre szolgl lekrdezst, de ezttal tegyk bele a termkcsoportokat tartalmaz Categories tblt is: SQL

SELECT ProductName, RetailPrice, RetailPrice * 1.04 As NewPrice FROM Products INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID WHERE Categories.CategoryDescription = 'Clothing'

A ruhzat (Clothing) rtkre trtn szrs sokkal szemlletesebb, mint a 3-as termkcso port-azonost hasznlata. Figyeljk meg azonban, hogy az UPDATE szintaxisdiagramja szerint (15.1. bra) az UPDATE kulcsszt csak egyetlen tblanv kvetheti; nem rhatjuk oda a Categories tbla beillesztshez szksges INNER JOIN zradkot. Mi ht a megolds? Emlkezznk vissza a 11. fejezetre, amelyben bemutattuk, hogy a WHERE zradkban hogyan fogalmazhatunk meg olyan felttelt, amely egy msik tblban szerepl rtk alapjn szri a sorokat. Oldjuk meg ismt az rmdostsrl szl feladatot, de most gy, hogy egy allekrdezs segtsgvel szemlletesebb szkt felttelt adunk meg: Mdostsd a termkeket gy, hogy a fogyaszti r egyenl legyen a fogyaszti r plusz ngy szzalkkal, minden ruhzati termk esetben! Fordts - Update the products table by setting the retail price equal to retail price times 1.04 for the products whose category ID is equal to the selection of the category ID from the categories table where the category description is clothing (Mdostsd a termkek tbljt gy, hogy a fogyaszti r egyenl legyen a fogyaszti r szorozva 1,04-dal, azoknak a termkekeknek az esetben, amelyeknek a termkcsoport-azonostja egyenl a termkcsoportok tbl jnak termkcsoport-azonostjval abban a sorban, ahol a termkcsoport lersa ruhzat".) Tisztzs - Update the products table by setting the retail price equal to = retail price times * 1.04 for the products whose where category ID is equal to = the (selection of the the category ID from the categories table where the category description is = 'Clothing') SQL UPDATE Products

SET RetailPrice = RetailPrice * 1.04 WHERE CategoryID = (SELECT CategoryID FROM Categories WHERE CategoryDescription = 'Clothing')
Igaz, hogy a fenti forma nem annyira egyrtelm, mint egy egyszer WHERE zradk, amely egy JOIN zradkkal kapcsolt tbla oszlopra hivatkozik, de a clunkat elrjk vele. Figyeljk meg, hogy egyenlsg mveletet hasznltunk a Products (Termkek) tbla oszlopa s az allekrdezs ltal visszaadott rtk kztt. Ahogyan ezt a 11. fejezetben megjegyeztk, ha egyenlsgvizsglatot akarunk vgezni egy allekrdezs ltal visszaadott rtkkel, akkor az allekrdezs csak egyetlen sort adhat vissza. Ha tbb mint egy termkcsoport-lers (CategoryDescription oszlop)

tartalmazza a Clothing rtket, akkor a lekrdezs meghisul. A pldnk esetben azonban meglehetsen biztosak lehetnk abban, hogy a Clothing lersra szktve csak egyetlen CategoryID rtket kapunk eredmnyl. Minden olyan esetben azonban, amikor nem biztos, hogy az allekrdezs csak egyetlen rtket ad vissza, az IN sszehasonlt mveletet kell hasznlnunk az egyenlsgvizsglat helyett. Oldjuk meg a tantervmdost pldt azonos mdszerrel, s a nem tl szemlletes SubjectID helyett hasznljuk a tantrgykdot vagy a tantrgy nevt, amely a Subject tbla SubjectCode, illetve SubjectName mezjben tallhat. A szksges tblk szerkezete a 15.5. brn lthat.

Oldjuk meg a feladatot ismt, de most allekrdezs hasznlatval: Mdostsd az rkat az albbiak szerint: legyen az osztlyterem az 1635-s, s cserld a betemezett napokat htfrl, szerdrl s pntekrl keddre, cstrtkre, s szombatra minden rajzra esetben!" Fordts - Update classes and set classroom ID to l635,Monday schedule to false,Wednesday schedule to false, Friday schedule to false, Tuesday schedule to true,Thursday schedule to true, and Saturday schedule to true for all classes whose subject ID is in the selection of subject IDs from the subjects table where subject name is 'Drawing' (Mdostsd az rkat: lltsd a tanterem-azonostt 1635-re, a htfi alkal mat hamisra, a szerdai alkalmat hamisra, a pnteki alkalmat hamisra, a ked di alkalmat igazra, a cstrtki alkalmat igazra s a szombati alkalmat igaz ra minden olyan sorban, ahol a tantrgy-azonost egyenl a tantrgyak tbljban lev tantrgy-azonostval abban a sorban, ahol a tantrgy lersa Rajz.)

Tisztzs - Update classes and set classroom ID to = l635,Monday schedule to = false, Wednesday schedule to = false, Friday schedule to = false, Tuesday schedule to = true,Thursday schedule to= true, and Saturday schedule to = true for all classes whose where subject ID is in the (selection of subject IDs from the subjects table where subject name is = 'Drawing') SQL UPDATE Classes

SET ClassRoomID = 1635, MondaySchedule = 0, WednesdaySchedule = 0, FridaySchedule = 0, TuesdaySchedule = 1, ThursdaySchedule = 1, SaturdaySchedule = 1 WHERE SubjectID IN (SELECT SubjectID FROM Subjects WHERE SubjectName = 'Drawing')
Figyeljk meg: br biztosak vagyunk benne, hogy csak egyetlen tantrgy lersa lehet Drawing, a biztonsg kedvrt mgis inkbb az IN mveletet hasznltuk.

Egyes adatbzisrendszerek megengedik a JOIN hasznlatt az UPDATE zradkban


Tbb adatbzisrendszer, amelyek kzl a legismertebbek a Microsoft rendszerei (Microsoft Access s Microsoft SQL Server), lehetv teszi, hogy az UPDATE utasts FROM rszben JOIN zradkkal kapcsolt tblt is szerepeltessnk. A korltozs csupn annyi, hogy a JOINnak az egyik tbla elsdleges kulcsa s a msik tbla idegen kulcsa kztti kapcsolatra kell hivatkoznia, hogy az adatbzisrendszer ki tudja tallni, hogy melyik sort vagy sorokat akar juk mdostani. Ennek segtsgvel elkerlhetjk a WHERE zradkban az allekrdezs hasznlatt akkor is, ha egy msik tblban szerepl rtk alapjn szeretnnk szrni. gy - ha adatbzisunk lehetv teszi - a rajzrk mdostsnak feladatt megoldhatjuk az albbi utastssal is: SQL

UPDATE Classes INNER JOIN Subject ON Classes.SubjectID = Subjects.SubjectID SET ClassRoomID = 1635, MondaySchedule = 0, WednesdaySchedule = 0, FridaySchedule = 0, TuesdaySchedule = 1, ThursdaySchedule = 1, SaturdaySchedule = 1 WHERE Subjects.SubjectName = 'Drawing'

Amint lthat, gy elkerltk az allekrdezs hasznlatt, s ez a forma bizonyos szem pontbl rthetbb is. A fenti formt arra is felhasznlhatjuk, hogy a mdostott rtk kisz mtsakor a SET zradkban alkalmazott allekrdezs helyett egyszeren felhasznljuk a kapcsold tblban szerepl rtkeket is. Gyzdjnk meg sajt adatbzisrendszernk dokumentcijban arrl, hogy tmogatja-e ezt a megoldst. A mintaadatbzisok Microsoft Access szmra kszlt vltozatban ezt a mdszert alkalmaztuk tbb plda megoldsra. Ha mr itt tartunk: az SQL-szabvny megengedi, hogy az UPDATE utastsban szerepl tbla egy nzettbla legyen, ebbl pedig kvetkezik a tblk sszekapcsolsnak lehet sge. A szabvny emellett azonban azt is tartalmazza, hogy a nzettblk mdosthats gra vonatkoz megszortsokat az adott megvalsts hatrozhatja meg. Ez a kikts lehetv teszi az adatbzis-kezelk gyrtinak, hogy minden esetben egy egyszer tbla nevet tegyenek ktelezv, vagy ms mdon korltozzk, hogy milyen nzetet vagy tblakapcsolatokat engednek meg. Mint ilyen esetben mindig, ennek is nzznk utna sajt adatbzisrendszernk dokumentcijban.

Az allekrdezs brmilyen bonyolult lehet; amilyenre csak szksg van a mdostand sorok kiszrshez. Ha pldul az egyik egyetemi tanr ltal tartott sszes elads kezd idpontjt akarjuk megvltoztatni, akkor az allekrdezsbe a Faculty_Classes (Tanszki rk) s a Staff (Tanrok) tblkat is be kell vonnunk. A rsztvev tblkat a 15.6. bra mutatja.

Mondjuk, lltsuk be dlutn kt rai kezdsre Kathryn Patterson minden eladst. (A valsgban ilyen mdostst valsznleg nem vgznk, mert ennek eredmnyekpp lehet, hogy tbb elads fog ugyanabban az idpontban kezddni, de pldnak gy is pp elg rdekes.) A megolds valami ilyesmi lehet:

Mdostsd az rk tbljt gy, hogy Kathryn Patterson minden rjnak kezdete du. 2 ra legyen!" Fordts - Update the classes table by setting the start time to 2:00 P.M. for all classes whose class ID is in the selection of class IDs of faculty classes joined with staff on staff ID in the faculty classes table matches staff ID in the staff table where the staff first name is 'Kathryn' and the staff last name is 'Patterson' (Mdostsd az rk tbljt: lltsd be a kezdetet du. 2. rra minden olyan ra esetben, amelynek az raazonostjt tartalmazza azoknak az raazo nostknak a listja, amelyet a tanszki rk s a tanrok tblinak olyan sszekapcsolsbl kapunk, ahol a tanszki ra tanrazonostja egyenl a tanr tanrazonostjval, s ahol a tanr keresztneve Kathryn, vezetkne ve pedig Patterson.) Tisztzs - Update the classes table by setting the start time to = 2:00 PM '14:00:00' for all classes whose where class ID is in the (selection of class IDs of from faculty classes inner joined with staff on faculty_classes.staff ID in the faculty classes table matches = staff.staff ID in the staff table where the staff first name is = 'Kathryn' and the staff last name is = 'Patterson') SQL UPDATE Classes

SET StartTime = '14:00:00' WHERE ClassID IN (SELECT ClassID FROM Faculty_Classes INNER JOIN Staff ON Faculty_Classes.StafflD = Staff.StaffID WHERE StfFirstName = 'Kathryn' AND StfLastName = 'Patterson')
Teht a trkk csupn annyi, hogy azonostjuk s felsoroljuk a mdostand tbla s min den ms, a feladat megoldshoz szksges kapcsold tbla kztti sszefggseket. Ugyanezt tettk a 8. fejezetben (INNER JOIN) s a 9. fejezetben (OUTER JOIN), amikor a tbb tblbl trtn lekrdezsek FROM zradkt lltottuk gy ssze. Az UPDATE utasts felptsekor csak a mdostand tbla kerlhet az UPDATE kulcssz utn, gy a tbbi tblt csak egy olyan allekrdezsbe tehetjk, amelynek az eredmnyt ssze tud juk kapcsolni a mdostand tblval.

Allekrdezs hasznlata az UPDATE kifejezsben


Ne gondoljuk azonban, hogy ezzel vge is az allekrdezsek alkalmazsnak. A 15.1. brn megfigyelhetjk, hogy a SET zradkban az rtkads jobb oldaln egy rtkkifejezs szerepel. A 15.7. bra emlkeztetl bemutatja, hogy miknt pl fel egy rtkkifejezs.

A 2. fejezetben azt javasoltuk, hogy szmtott rtkeket ne troljunk a tblkban. Mint ahogyan a legtbb szably esetben, itt is vannak kivtelek. Vegyk pldul az Orders (Rendelsek) tblt a Sales Orders mintaadatbzisbl. Ha cgnk rendkvl nagy mret, s tbb ezer rszletez soros megrendelseket kezel, akkor rdemes megfontolnunk egy sszegzett rendelsrtk oszlop felvtelt az Orders tblba. Ennek a szmtott oszlopnak a hasznlatval elkerlhetjk, hogy az sszes rendels meghatrozshoz be kelljen olvas ni a rszletez sorok ezreit. Ha ezt a mdszert vlasztjuk, akkor az alkalmazsunknak tartalmaznia kell olyan kdot, amely a rszletez sarok mdostsakor a szmtott rendelsrtk-oszlopot naprakszen tartja. Mindeddig az rtkadshoz a SET zradkban vagy literlis rtket hasznltunk, vagy egy egyszer rtkkifejezst, amely egy literlis rtkbl, egy mveleti jelbl s egy oszlopbl llt. Vegyk szre, hogy ilyen mdon az adott tbla egy msik oszlopnak az rtkt is felhasznltuk volna, de ez csak ritkn fordul el. rdekesebb eset az, amikor egy olyan SELECT kifejezst (egy allekrdezs eredmnyt) hasznljuk az rtkadsban, amely egy msik tbla adataibl csak egy rtket ad vissza, pldul egy sszeget. Az allekrdezs WHERE zradkban a sorok szktsekor hasznl hatk a mdostand tbla oszlopai is. gy teht, ha egy tblban (Orders) egy sszegz oszlopot egy kapcsold tbla (Order_Details) valamely oszlopnak az sszegvel akarjuk kitlteni, egy allekrdezst alkalmaz UPDATE utastst kell sszelltanunk. Az allekrdezsben sszegezzk a megrendelt mennyisg s az ajnlati r szorzatt, majd ezt a szmtott oszlopban troljuk

Azt pedig, hogy az Order_Details (Rendelsek rszletei) tblbl mindig csak az Orders tblhoz megfelelen kapcsold sorokat vegyk figyelembe, WHERE zradkkal biztost juk. A krelem az albbi lehet: Mdostsd a rendelsek tbljt gy, hogy a rendels sszesen mez egyenl legyen az Order_Details tbla kapcsold sorai alapjn szmolt rendelt mennyisg s az ajnlott r szorzatval!" Fordts - Update the orders table by setting the order total to the sum of quantity ordered times quoted price from the order details table where the order number matches the order number in the orders table (Mdostsd a rendelsek tbljt gy, hogy a rendels sszesen mez a rendelt mennyisg s az ajnlott r szorzata legyen a rendelsek rszleteit tartalmaz tbla azon soraiban, ahol a rendelsszm megegyezik a rendel sek tbljban lev rendelsszmmal.) Tisztzs - Update the orders table by setting the order total to = the (select sum of(quantity ordered times * quoted price) from the order details table where the order_details.order number matches the = orders.order number in the orders table) SQL UPDATE Orders

SET OrderTotal = (SELECT SUM(QuantityOrdered * QuotedPrice) FROM Order_Details WHERE Order_Details.OrderNumber = Orders.OrderNumber)
Ezt a lekrdezst a Sales Order Modify mintaadatbzisban CH15_Update_Order_Totals_Subquery nven tallhatjuk meg. Vegyk szre, hogy nem alkalmaztunk WHERE zradkot a rendelsek szrsre. Ha egy alkalmazsban akarjuk hasznlni a fenti kdrszletet, akkor valsznleg rdemes szkteni a rendelsszm alapjn, hogy az adatbzis csak azt a rendelst mdostsa, amelyikrl tud juk, hogy megvltozott. Egyes adatbzisrendszerek lehetv teszik, hogy ehhez hasonl szmtott mezket hozzunk ltre, s meghatrozzuk, miknt kell az rtkket mdostani. A legtbb adatbzisrendszer tmogatja az gynevezett kioldkat (trigger), amelyeket az adatbzisrendszer automatikusan futtat minden olyan esetben, amikor az adott tblba adatok kerlnek, vagy az ott lv adatok mdosulnak, illetve trldnek. Azokban a rend szerekben, amelyek tmogatjk ezeket a szolgltatsokat, vagy maga a tbla, vagy pedig az adatmdostskor lefut kiold meghatrozsban helyezhetjk el a fenti UPDATE utastst. Mint mindig, a rszleteknek nzznk utna sajt adatbzisrendszernk dokumen tcijban.

Az UPDATE hasznlati terletei


Ezen a ponton mr tudjuk, hogy miknt kell egy vagy tbb sort mdostani egy egyszer literlis rtkkel vagy egy allekrdezs eredmnyeknt elll kifejezssel. Azt is tudjuk, hogyan kell szkteni a mdostand sorok krt. A legjobban gy ismerhetjk meg az UPDATE utasts szles alkalmazsi terlett, ha felsorolunk nhny olyan problmt, amelyet az UPDATE utastssal oldhatunk meg, illetve megoldunk egy sor pldt is:

Cskkentsd az ajnlott rat 2%-kal minden olyan rendels esetben, amelyet tbb mint 30 nappal a megrendels dtuma utn szlltottak ki! Adj 6%-ot minden gynki fizetshez!" Cserld le az sszes Sports World Lanes-re tervezett torna helysznt Oasis Lanes-re! Szmold jra minden hallgat tanulmnyi tlagt a teljestett rk alapjn! Adj 5% kedvezmnyt minden olyan rendelsre, ahol a vsrl tbb mint 50 OOO dollr rtkben vsrolt szeptemberben! Mdostsd a rendezvnyek szerzdsi sszegt gy, hogy az elad napidijt megszorzod a napok szmval, s hozzadsz 15% jutalkot! Frisstsd minden tekejtkos vrost s llamt az irnytszmot nv alapjn kikeresve!" Mdostsd a terletkdot 360-ra minden olyan hallgat s tanr esetben, akinek az irnytszma 98270 vagy 98271!" Biztostsd, hogy minden kerkpr eladsi ra legalbb 45% nyeresget tartalmazzon a legalacsonyabb fogyaszti rat alkalmaz beszllt rhoz kpest! Adj 2% kedvezmnyt minden rendezvnyre azoknak a megrendelknek, akikkel tbb mint 3000 dollr rtk szerzdst ktttnk 2007 oktberben!" Mdostsd a Huckleberrys tekecsapat nevt Manta Rays-re!" Nveld meg a teljes munkaids tanrok brt 5%-kal!" A kiegsztk fogyaszti rt lltsd a legmagasabb beszllti r plusz 35%-ra!" Nveld meg 0,5%-kal minden olyan gynk rszesedst, aki tbb mint 20 000 dollrnyi zletet kttt! Szmtsd ki jra minden tekejtkosra az sszes lettt bbut, a lejtszott mrkzsek szmt, az aktulis tlagot, s az aktulis bntetpontszmot!

Pldk
Ismerjk mr az UPDATE utastsok felptsnek mdszereit, nzznk ht nhny pldt, amelyben egy-egy tbla egy vagy tbb oszlopt kell valahogyan mdostanunk! A pldkat ngy mintaadatbzisbl vettk. A pldk mellett kzljk a mdosul tbla adatait az UPDATE lefuttatsa eltt s utn, illetve a mdostott sorok szmt is. A mdosts utni adatokat tartalmaz tblzat cm ben annak a lekrdezsnek a neve szerepel, amellyel azt a mellkletknt adott CD-n sze repl mintaadatbzisokban megtallhatjuk. Minden lekrdezst a megfelel adatbzisba

tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz lekrdezsek neve ,,CH15-tel kezddik. A pldkat a knyv elejn tallhat bevezets tmutatst kvetve tlthetjk be s prblhatjuk ki.

Ne feledjk, hogy a pldkban hasznlt minden tbla- s oszlopnv megfelel a mintaadatbzisok B fggelkben tallhat sma lersnak. A lersok egyszerstse cljbl a Fordts s Tisztzs rszeket minden pldnl ssze vontuk. A pldk felttelezik, hogy az olvas ttanulmnyozta s megrtette a korbbi fejezetekben lert ismereteket, klns tekintettel az allekrdezsek tmjra.

Sales Orders adatbzis


Cskkentsd az ajnlott rat 2%-kal minden olyan rendels esetben, amelyet tbb mint 30 nappal a megrendels dtuma utn szlltottak ki!"
Fogalmazzuk jra a problmt gy, hogy kzelebb lljon az SQL nyelvtanhoz:

Mdostsd a rendelsek rszleteit gy, hogy az ajnlati r egyenl legyen az ajnlati r szorozva 0,98-dal minden olyan rendels esetben, ahol a kiszlltsi dtum tbb mint 30 nappal ksbbi, mint a megrendelsi dtum!"
Fordts/ - Update the order details table by Tisztzs
setting where

the quoted price equal to = the quoted price times * 0.98 the order ID is in the (selection of order IDs from the orders table where ship date minus - order date is greater than > 30)

SQL

UPDATE Order_Details SET QuotedPrice = QuotedPrice * 0.98 WHERE OrderID IN (SELECT OrderID FROM Orders WHERE (ShipDate - OrderDate) > 30)
A fenti megolds felttelezi, hogy adatbzisrendszernk kpes kt

dtum kztti napok szmt meghatrozni gy, hogy az egyik dtumot kivonja a msikbl. Nzznk utna adatbzisrendszernk dokumentci jban, hogy mkdik-e ez a mdszer.

Biztostsd, hogy minden kerkpr fogyaszti ra legalbb 45% nyeresget tartalmazzon a legalacsonyabb fogyaszti rat alkalmaz beszllt rhoz kpest!" A krelem tfogalmazva az albbi lesz: Mdostsd a termkek tbljt gy, hogy a fogyaszti r egyenl legyen 1,45 szorozva annak a beszlltnak a fogyaszti rval, amelyiknl a legalacsonyabb a termk ra, ha a fogyaszti r mg nem egyenl 1,45 szorozva a fogyaszti rral, s a termkcsoport a 2-es!" Fordts/ - Update the products table by Tisztzs setting the retail price equal to = 1.45 times * the (selection of the unique distinct wholesale price from the product vendors table where the product vendors tables product number is equal to = the products tables product number

and the wholesale price is equal to = the (selection of the minimum (wholesale price) from the product vendors table where the product vendors table product number is equal to = the products table product number)) where the retail price is less than < 1.45 times the (selection of the unique distinct wholesale price from the product vendors table where the product vendors table product number is equal to = the products table's product number and the wholesale price is equal to = the (selection of the minimum (wholesale price) from the product vendors table where the product vendors table's product number is equal to = the products table product number)) and the category ID is equal to = 2

SQL

UPDATE Products SET RetailPrice = ROUND(l.45 * (SELECT DISTINCT WholeSalePrice FROM Product_Vendors WHERE Product_Vendors.ProductNumber = Products.ProductNumber AND WholeSalePrice = (SELECT MIN(WholeSalePrice) FROM Product_Vendors WHERE Product_Vendors.ProductNumber = Products.ProductNumber)), 0) WHERE RetailPrice < 1.45 * (SELECT DISTINCT WholeSalePrice FROM Product_Vendors WHERE Product_Vendors.ProductNumber = Products.ProductNumber AND WholeSalePrice = (SELECT MIN(WholeSalePrice) FROM Product_Vendors WHERE Product_Vendors.ProductNumber = Products.ProductNumber)) AND CategoryID = 2

A Microsoft Access mintaadatbzisban ezt a feladatot az UPDATE zradkban alkalmazott JOIN kulcsszval oldottuk meg, mert az Access nem tmogatja az allekrdezsek hasznlatt a SET zradkban.

Vegyk szre tovbb, hogy az eredmnyknt kapott rat (0 tizedesjegyre) kerektjk. A legtbb kereskedelmi adatbzis-kezel tmogatja a ROUND fggvnyt, br azt az SQL-szabvny nem tartalmazza kifejezetten. A fentieken kvl beilleszthettnk volna mg egy tovbbi allekrdezst, amely meghat rozza a Bikes (Kerkprok) termkcsoport-lershoz tartoz termkcsoport-azonostt a Categories (Termkcsoportok) tbla segtsgvel, de gy gondoltuk, hogy ez az utasts gy is elg bonyolult. Vgl egyedi fogyaszti rat vlasztottunk ki a DISTINCT kulcssz segtsgvel, mert tbb beszlltnl is megtallhatjuk ugyanazt a legalacsonyabb rat, de az sszehasonltshoz egyetlen rtkre van szksgnk.

Ha vgignzzk a Products tblban a kerkprokat (ProductID 1, 2, 6 vagy 11), akkor ltjuk, hogy csak a 2-es termk fogyaszti ra kisebb, mint az adott termk brmely beszllt ltal knlt legalacsonyabb fogyaszti rnak 1,45-szorosa. A 2-es kerkpr fogyaszti ra a 6-os beszlltnl 1269 dollr, amelyet 1,45-dal megszorozva 1840,05 dollrt kapunk. Ezt kerekti az UPDATE utasts egsz szmra.

Entertainment Agency adatbzis


Adj 6%-ot minden gynk fizetshez!" A krelem tfogalmazva az albbi lesz: Mdostsd az gynkk tbljt, s adj hozz minden fizetshez 6%o-ot! Fordts/ - Update the agents table Tisztzs by setting salary equal to = salary times * 1.06 SQL UPDATE Agents

SET Salary = ROUND(Salary * 1.06, 0)


Itt ismt a legtbb kereskedelmi adatbzis-megvalstsban megtall hat ROUND fggvnyt hasznltuk, s 0 tizedesjegyre kerektettnk. A kerekts megvalstsnak rszleteit ellenrizzk sajt adatbzisrendszernk doku mentcijban.

Mdostsd a rendezvnyek szerzdsi sszegt gy, hogy az elad napidijt megszorzod a szerzdtt napok szmval, s hozzadsz 15% jutalkot! Fogalmazzuk t a krelmet: Mdostsd a rendezvnyek tbljt gy, hogy a szerzdsi sszeg l, 15 szorozva a szerzdtt napok szmval szorozva az elad napidjval legyen! Fordts/ - Update the engagements table Tisztzs by setting the contract price equal to = 1.15 times * the (end date minus the start date plus + 1) and then times the * (selection of the entertainer price per day from the entertainers table where the entertainers table entertainer ID is equal to = the engagements table entertainer ID

SQL

UPDATE Engagements SET Engagements.ContractPrice = ROUND(l.15 * (EndDate - StartDate + l) * (Select EntPricePerDay FROM Entertainers WHERE Entertainers.EntertainerID Engagements.EntertainerID), 0)

A fenti megolds felttelezi, hogy adatbzisrendszernk megengedi, hogy a kt dtum kztti napok szmt megkapjuk gy, hogy az egyik dtumbl kivonjuk a msikat. A rszleteket nzzk meg a sajt adatbzisunk dokumentcijban. A klnbsghez hozzadtunk egyet, hogy a rendezvny tnyleges idtartamt megkap juk, ugyanis a rendezvny els s utols napjn is van elads. Egynapos rendezvny esetn nyilvnval, hogy gy kell eljrni: a kezd s a vgdtum azonos, teht a klnb sgk nulla, de a rendezvny pontosan egy napos.

Az Engagements (Rendezvnyek) tblban eredetileg szerepl szerz dsi sszegek csupn sszer hatrok kztt vletlenszeren vlasztott rtkek voltak. Az imnt megrt UPDATE utasts termszetesen sokkal pontosabb sszeget llapt meg az eladk napidja alapjn.

School Scheduling adatbzis


Mdostsd a terleti kdot 360-ra minden olyan hallgat esetben, akinek az irnytszma 98270 vagy 98271!" Az jrafogalmazott krelem az albbi lesz: Mdostsd a hallgatk tbljt gy, hogy a terleti kd 360 legyen minden olyan hallgat esetben, akinek az irnytszma 98270 vagy 98271!" Fordts/ - Update the students table Tisztzs by setting the area code equal to = '360'

where

the student ZIP Code is in the list ('98270', and '98271')

SQL

UPDATE Students SET Students.StudAreaCode = '360' WHERE Students.StudZipCode IN ('98270', '98271')

Szmold jra minden hallgat tanulmnyi tlagt a teljestett rk alapjn!


Az tfogalmazott krelem valami ilyesmi lesz:

Mdostsd a hallgatk tbljt gy, hogy a tanulmnyi tlag egyenl legyen a kreditrtk s az osztlyzat szorzatnak sszege elosztva a kreditrtk sszegvel! Fordts/ - Update the students table Tisztzs by setting the student GPA equal to = the (selection of the sum of(credits times * grade) divided by/ the sum of (credits) from the classes table inner joined with the student schedules table on classes.class ID in the classes table matches = student_schedules.class ID in the student schedules table where the class status is = complete 2 and the student schedules table student ID is equal to = the students table student ID)
SQL

UPDATE Students SET Students.StudGPA = (SELECT ROUND(SUM(Classes.Credits * Student_Schedules.Grade) / SUM(Classes.Credits), 3) FROM Classes INNER JOIN Student_Schedules ON Classes.ClassID = Student_Schedules.ClassID WHERE (Student_Schedules.ClassStatus = 2) AND (Student_Schedules.StudentID = Students.StudentID))

Mivel a Microsoft Access nem tmogatja az sszest fggvnyeket tar talmaz allekrdezsek hasznlatt, ott a megolds egy sor beptett fggvny meghvsa egy a Student_Schedules s a Classes tbln alapul elre ltrehozott nzettbln.

Bowling League adatbzis


Szmtsd ki jra minden tekejtkos szmra az sszes lettt bbut, a lejtszott mrkzsek szmt, az aktulis tlagot s az aktulis bntetpontszmot!" A 13- fejezet feladatai kztt szerepelt egy SELECT lekrdezs a bntetpontszm kiszmtsra. Segtsget a Bowling League mintaadatbzisban szerepl CH13_Bowler_Average_Handicap lekrdezsben tall hatunk. A bntetpontszm kiszmtsnak mdja: 200-bl kivonjuk a tekejtkos tlageredmnyt, s ennek vesszk a 90%-t. Fogalmazzuk jra a krelmet gy: Mdostsd a tekejtkosok tbljt gy, hogy kiszmtod az sszes lettt bbut, a lejtszott mrkzsek szmt, az aktulis tlagot s az aktulis bntetpontszmot a jtkosok pontszmait tartalmaz tbla alapjn!" Fordts/ - Update the bowlers table Tisztzs by setting the total pins equal to = the (selection of the sum of the (raw score) from the bowler scores table where the bowler scores table bowler ID is equal to = the bowlers table bowler ID), and the games bowled equal to = the (selection of the count of the (raw score)

where

the bowler scores table the bowler scores table bowler ID is equal to = the bowlers table bowler ID), and the current average equal to = the (selection of the average avg of the (raw score) from the bowler scores table where the bowler scores table bowler ID is equal to = the bowlers table bowler ID), and the current handicap equal to = the (selection of 0.9 times *(200 minus the average avg of the (raw score)) from the bowler scores table where the bowler scores table bowler ID is equal to = the bowlers table bowler ID)
from

SQL

UPDATE Bowlers SET Bowlers.BowlerTotalPins (SELECT SUM(RawScore) FROM Bowler_Scores WHERE Bowler_Scores.BowlerID = Bowlers.BowlerID), Bowlers.BowlerGamesBowled = (SELECT COUNT(Bowler_Scores.RawScore) FROM Bowler_Scores WHERE Bowler_Scores.BowlerID = Bowlers.BowlerID), Bowlers.BowlerCurrentAverage = (SELECT ROUND(AVG(Bowler_Scores.RawScore), 0) FROM Bowler_Scores WHERE Bowler_Scores.BowlerID = Bowlers.BowlerID),

Bowlers.BowlerCurrentHcp = (SELECT ROUND(0.9 * (200 - ROUND(AVG(Bowler_Scores.RawScore), 0)), 0) FROM Bowler Scores WHERE Bowler_Scores.BowlerID = Bowlers.BowlerID)

Cserld le az sszes Sports World Lanes-re tervezett torna helysznt Oasis Lanes-re!
Fogalmazzuk t a krelmet gy:

Mdostsd a tornk tbljt gy, hogy a torna helyszne Oasis Lane legyen minden olyan torna esetben, amelyet eredetileg a Sports World Lanes-re terveztek!" Fordts/ - Update the tournaments table Tisztzs by setting the tourney location equal to = 'Oasis Lanes' where the original tourney location is equal to = 'Sports World Lanes'
SQL

UPDATE Tournaments SET TourneyLocation = 'Oasis Lanes' WHERE TourneyLocation = 'Sports World Lanes'

sszefoglals
A fejezet elejn rviden bemutattuk az UPDATE utastst, amely nem az adatok lekrdez sre, hanem azok mdostsra alkalmas. Megismerkedtnk az UPDATE utastsformjval, s lttunk egy egyszer pldt, amelyben egy tbla sszes sornak egy oszlopt mdostot tuk egy kifejezs felhasznlsval. Ezt kveten egy jabb pldn keresztl bemutattuk, hogy miknt hasznlhat a WHERE zradk a mdostand sorok krnek leszktsre. Ez utn egy egyszer SELECT utas tst rtunk annak ellenrzsre, hogy valban a megfelel sorokat mdostjuk-e, majd a SELECT utastst tformltuk a megfelel UPDATE utastss. Ez utn elmagyarztuk, mirt is fontosak a tranzakcik, s hogyan lehet ket a hibk elleni vdekezsre felhasz nlni, valamint biztostani, hogy vagy az sszes mdosts vgrehajtdjon, vagy egy sem. Folytatsknt bemutattuk, hogyan lehet egy tbla tbb oszlopt mdostani egyetlen UPDATE utastssal. Ez utn belptnk az allekrdezsek birodalmba. Kezdsknt a WHERE zradkban helyeztnk el bonyolultabb szrfeltteleket. Ksbb azt mutattuk be, hogy a SET z radkban hogyan lehet allekrdezsek eredmnyt rtkadsra felhasznlni. A fejezet fennmarad rszt az UPDATE utastsok felptst szemlltet pldknak szenteltk. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis


1. Adj 5% kedvezmnyt minden olyan rendelsre, amelynl a vsrl tbb mint 50 000 dollr rtkben vsrolt 2007 oktberben! (Tipp: kt egymsba gyazott allekrdezsre lesz szksgnk, amelyben elkeressk az sszes olyan rendelsszmot, amelynek a vsrlazonostja a CustomerID oszlop - benne van azon vsrlk azonostinak a listjban, akik tbb mint 50 000 dollr rtkben rendeltek oktberben.) A megolds itt tallhat: CH15_Give_Discount_To_Good_October_Customers (650 sor mdosul). Futtassuk a CH15_Update_Order_Totals-ban tallhat UPDATE utastst is, hogy az Orders tblban is helyesek legyenek az adataink. 2. A kiegsztk (1-es termkcsoport) fogyaszti rt lltsd a legmagasabb beszllti r plusz 35%-ra!" (Tipp: a pldk kztt a CH15_Adjust_Bike_Retail_Price-ban hasznltunk olyan mdszert, amilyenre itt szksgnk van.) A megolds itt tallhat: CH15_Adjust_Accessory_Retail_Price (11 sor mdosul).

Entertainment Agency adatbzis


1. Adj 2% kedvezmnyt minden rendezvnyre azoknak a megrendelknek, akik

tbb mint 3000 dollr rtk rendezvnyt ktttek le 2007 oktberben!" (Tipp: egy sszest allekrdezsre van szksgnk, amely egy HAVING zradkkal tallja meg azokat a megrendelket, akik tbb mint 3000 dollrnyi rtk rendez vnyt ktttek le 2007 oktberre.) A megolds itt tallhat: CH15_Discount_Good_Customers_October (34 sor mdosul). 2. Nveld meg 0,5%-kal minden olyan gynk rszesedst, aki tbb mint 20 000 dollrnyi zletet kttt! (Tipp: hasznljunk sszest allekrdezst, amely egy HAVING zradkkal tallja meg azokat az gynkket, akik tbb mint 20 000 dollrnyi rtk zletet ktttek.) A megolds itt tallhat: CH15_Reward_Good_Agents (3 sor mdosul).

School Scheduling adatbzis


1. Nveld meg a teljes munkaidben alkalmazott tanrok brt 5%-kal!" (Tipp: a WHERE zradkban hasznljunk egy olyan allekrdezst, amely kikeresi azoknak a tanroknak a tanrazonostjt (StaffID) a tanszk (Faculty) tbljbl, akiknek az llapota (status) teljes munkaids (full time), s az alkalmazott (tenured) mezjk igaz rtk. Ez utbbi az adatbzisrendszernktl fggen 1 vagy -1 lehet.) A megolds itt tallhat: CH15_Give_FullTime_Tenured_Raise (21 sor mdosul). 2. Mdostsd a terleti kdot 360-ra minden olyan tanr esetben, akinek az irnytszma 98270 vagy 98271! A megolds itt tallhat: CH15_Fix_Staff_AreaCode (2 sor mdosul).

Bowling League adatbzis


1. Mdostsd a Huckleberrys tekecsapat nevt Manta Rays-re! A megolds itt tallhat: CH15_Change_Huckleberry_Name (1 sor mdosul). 2. Az irnytszm alapjn mdostsd a vrost s az llamot minden jtkos esetben! (Tipp: hasznljunk kt allekrdezst - egyet, amelyik kikeresi a vrost, s egy msikat, amelyik kikeresi az llamot a WAZips tblbl.) A megolds itt tallhat: CH15_Update_Bowler_City_State (6 sor mdosul).

Adathalmazok beszrsa
Abban a meggyzdsben nttem fel, hogy az egyetlen dolog, amellyel rdemes foglalkozni: j rszletekkel gyaraptani a vilgban ltez pontos ismereteket." - Margaret Mead

A fejezet tmakrei
Mi az az INSERT? Az INSERT utasts Az INSERT hasznlati terletei Pldk sszefoglals nll feladatok

Eddig arrl volt sz, hogy miknt krdezzk le mindenfle kreatv mdon a tblkban lev adatokat; az elz fejezetben pedig megtanultuk az adatokat az UPDATE utastssal mdo stani. De hogyan kerlnek be az adatok a tblkba? Az biztos, hogy nem varzstsre pattannak el a semmibl! Ebben a fejezetben erre a krdsre adjuk meg a vlaszt: hogyan hasznlhatjuk az INSERT utastst adatok bevitelre?

Mi az az INSERT?
A legtbb kereskedelmi adatbzisrendszerhez tartozik valamifle grafikus alkalmazs, amely megjelenti az adatokat, s lehetv teszi velk a munkt. A Microsoft Access-szel pldul egyszeren megkereshetjk a tblaobjektumot, s megnyithatjuk. Az Access egy adatlapnak nevezett sorokbl s oszlopokbl ll tblzatban jelenti meg az adatainkat. Ha a tblzat aljra grgetnk, akkor ott egy res sorba egyszeren elkezdhetjk berni az adatainkat. Ha vgeztnk egy sorral, akkor a kvetkez sorra lpve jabb rekordot adhatunk a tblhoz. Az Access arra is alkalmas, hogy Microsoft SQL tblkat kezeljen hasonl mdon. A MySQL Query Browser-e (Lekrdezstallz) is hasonlan mkdik, illetve az IBM DB2-jhez s az Oracle adatbzisokhoz is lteznek ilyen eszkzk.

De mi is trtnik, amikor az adatok begpelsnek vgeztvel mentjk a mdostsokat? A grafikus alkalmazs valjban SQL-utastsokkal adja hozz a bert adatokat a tblhoz. A parancs, amelyet ilyenkor hasznl, az INSERT (beszrs). A mintafjlok kztt bngszve megtallhatjuk azokat a parancsfjlokat, amelyeket a mintaadatbzisok adatainak feltlts hez hasznltunk. Pldul az EntertainmentAgencyData.SQL fjl els nhny sora az albbi:

USE EntertainmentAgencyExample; INSERT INTO Customers VALUES (10001, 'Doris', 'Hartwig', '4726 - 11th Ave. N.E.', 'Seattle', 'WA', '98105', '555-2671'); INSERT INTO Customers VALUES (10002, 'Deb', 'Waldal', '908 W. Capital Way', 'Tacoma', 'WA', '98413', '555-2496'); INSERT INTO Customers VALUES (10003, 'Peter', 'Brehm', '722 Moss Bay Blvd.', 'Kirkland', 'WA', '98033', '555-2501'); INSERT INTO Customers VALUES (10004, 'Dean', 'McCrae', '4110 Old Redmond Rd.', 'Redmond' , 'WA', '98 0 52', '555-25 0 6'); INSERT INTO Customers VALUES (10005, 'Elizabeth', 'Hallmark', 'Route 2, Box 203B', 'Auburn', 'WA', '98002', '555-2521');
Az els parancs (USE) megmondja az adatbzis-kezelnek, hogy melyik adatbzison hajtsa vgre az utna kvetkez parancsokat. Minden INSERT parancs arra utastja az adatbzist, hogy egyetlen sort szrjon be egy adott tblba. A tbb ezer sor felvitele egy mintaadatb zisba ltszlag munkaignyes feladat, de ha elindtjuk a parancsfjlokat, akkor azt tapasztal juk, hogy mindegyik lefut nhny msodperc alatt. Nhny egyszerbb tbla esetben mi is a grafikus felleteket hasznltuk az adatok kzvetlen begpelsre; ms tblkhoz azonban programokat rtunk, amelyek ellltottk s vgrehajtottk az INSERT utastsokat. Aki otthonosan mozog a Microsoft Accessben s a Visual Basicben, megtallhatja a Sales Orders mintaadatbzis adatait elllt programot a zfrmSellProducts rlapban.

Brmilyen alkalmazst runk legyen az hagyomnyos vagy webalkalmazs , a kdunk biztosan fog olyan rszletet tartalmazni, amely INSERT utastsokat llt ssze s futtat, amikor a felhasznl j adatokat r be. A legtbb esetben az INSERT ... VALUES vltozatot fogjuk hasznlni. Ksbb egy msik formt is bemutatunk, amellyel egyszeren msolha tunk adatokat egyik tblbl a msikba. Az sszes pldt s a feladatok megoldst megtallhatjuk a megfelel mintaadatbzisok mdosthat (,,modify") vltozatban (SalesOrdersModify, EntertainmentAgencyModify, SchoolSchedulingModify, BowlingLeagueModify).

Az INSERT utasts
Az SQL-ben az INSERT utastsnak kt f formja van. Az els vltozatban a VALUES kulcssz utn felsoroljuk az adott tblba j sorknt beszrand rtkeket. A msodik vltozatban egy SELECT zradkot hasznlva olvassuk be azokat az adatokat, amelyeket a mdostand tblba runk. Lssuk elszr a VALUES kulcsszt alkalmaz vltozatot!

rtkek beszrsa
Br az SQL-t elsdlegesen gy terveztk, hogy adathalmazokon dolgozzon, az INSERT utastst mgis arra hasznljuk a leggyakrabban, hogy egyszerre egyetlen sort szrjunk be egy tblba. Egy tblhoz j sort hozzadni legegyszerbben a VALUES kulcsszt tartalmaz INSERT utastssal lehet. Ennek a formnak a szintaxisdiagramjt a 16.1. bra mutatja.

Lthat, hogy az utasts az INSERT INTO kulcsszavakkal kezddik. Ez utn kvetkezik annak a tblnak a neve, amelyhez az adatokat hozz akarjuk adni. Ha minden oszlopnak rtket akarunk adni, akkor az oszlopnevek listjt elhagyhatjuk (Mi pldul nem rtuk ki az oszlopnevek listjt a mintaadatbzisok adatfeltltst vgz INSERT utastsokban, mert minden oszlop rtkt megadtuk.) Ennek ellenre azt javasoljuk, hogy akkor is rjuk ki az oszlopok neveit, ha mindegyikbe akarunk adatot rni. Ha nem gy jrunk el, akkor ksbb, ha valaki j oszlopot ad a tblhoz, vagy mdostja az oszlopok sorrendjt, a mi utastsunk vgrehajtsa meghisul. Az oszlopnvlista egy nyit zrjellel kezddik, amelyet az oszlopnevek vesszvel elvlasztott listja kvet (amennyiben egynl tbb oszlopot adunk meg), majd egy zr zrjellel vgzdik. Az SQL-szabvny szerint a tbla_neve nzettblt is takarhat, de ki kti, hogy a nzettblnak lehetv kell tennie a mdostst s a be szrst. Szmos adatbzisrendszer lehetv teszi, hogy nzettblkba szrjunk be adato kat, de mindegyiknek sajt szablyai vannak, amelyek alapjn meghatrozzk, hogy egy nzettbla mdosthat-e, illetve beszrhat-e bele j adat.

Az esetek tbbsgben egy nzettblba nem szrhatunk be adatokat, ha az oszlopok valamelyike kifejezs vagy sszestfggvny eredmnyt tartalmazza. Egyes adatbzis rendszerek azt is lehetv teszik, hogy a tblanv helyre a JOIN s ON kulcsszavakkal ltrehozott nzetet rjunk. A rszleteknek nzznk utna sajt adatbzisrendszernk dokumentcijban. Ebben a fejezetben csak olyan pldkat fogunk bemutatni, amelyek egy egyszer tblba szrnak be adatokat. Vgl a VALUES kulcssz kvetkezik, majd egy nyit zrjel, egymstl vesszvel elv lasztott rtkkifejezsek listja, s egy zr zrjel. Jegyezzk meg, hogy az rtkeket ugyanolyan sorrendben kell felsorolnunk, mint amilyen sorrendben az oszlopokat sorol tuk fel az oszlopnvlistban. Az els oszlop rtke teht az els kifejezs lesz, a msodik oszlop rtke a msodik kifejezs, s gy tovbb. Ha minden oszlopnak rtket adunk, s elhagyjuk az oszloplistt, akkor az rtkeknek olyan sorrendben kell kvetnik egymst, mint ahogyan az oszlopok a tbla meghatrozsban kvetik egymst. Ha azt akarjuk, hogy az adatbzis egy adott oszlopba a szmra belltott alaprtelmezett rtket rja, ak kor ezt a DEFAULT kulcsszval jelezhetjk. (Ha azonban nem hatroztunk meg az oszlop szmra alaprtelmezst, akkor hibt kapunk.) NULL rtk beszrsra a NULL kulcssz hasznlhat. A korbbi fejezetekbl emlkezhetnk r, hogy egy rtkkifejezs meglehetsen bonyo lult is lehet, s allekrdezseket is tartalmazhat, amelyek akr a mdostand tblbl, akr ms tblkbl krdezhetnek le adatokat. Emlkeztetl lljon itt a 16.2. bra, amely bemutatja az rtkkifejezsek felptst.

Nem minden adatbzisrendszer teszi lehetv SELECT kifejezs hasznlatt az INSERT utasts VALUES zradkban. A rszleteknek nzznk utna sajt adatbzisrendszernk dokumentcijban.

Lssuk, hogyan szrhatunk be egy jabb sort a SalesOrders adatbzis Employees tbljba! Hasonlan minden ms utasts hasznlathoz, itt is ismernnk kell a tbla felptst. Az Employees tbla felptst a 16.3. brn lthatjuk.

Fogalmazzuk meg a krelmet!

Ebben a fejezetben is a 4. fejezetben bevezetett Krelem - Fordts Tisztzs- SQL"-mdszert fogjuk hasznlni. Vedd fel a Susan Metters nev j alkalmazottat, akinek a cme 16547 NE 132nd St, Woodinville, WA 98072, a terletkdja 425, a telefonszma pedig 555-7825!"
A krelemben ltalban nem soroljuk fel ttelesen az oszlopokat, de ne feledkezznk meg rluk a fordtsi lpsben. Az j alkalmazott felvtelt gy fordthatjuk t:

Fordts - Insert into the employees table in the columns first name, last name, street address, city, state, ZIP Code, area code, and phone number the values Susan, Metters, 16547 NE 132nd St, Woodinville,WA, 98072, 425, and 555-7825 (rd be az alkalmazottak tbljnak keresztnv, vezetknv, cm, vros, l lam, irnytszm, terletkd s telefonszm oszlopaiba a kvetkez rt keket: Susan, Metters, 16547 NE 132nd St, Woodinville, WA, 98072, 425, s 555-7825.) Tisztzs - Insert into the employees table in columns (first name, last name, street address, city, state, ZIP Code, area code, and phone number) the values ('Susan', 'Metters', '16547 NE 132nd St','Woodinville', 'WA', '98072', 425, and '555-7825')
SQL

INSERT INTO Employees (EmpFirstName, EmpLastName, EmpStreetAddress, EmpCity, EmpState,

EmpZipCode, EmpAreaCode, EmpPhoneNumber) VALUES ('Susan', 'Metters', '16547 NE 132nd St', 'Woodinville', 'WA', '98072', 425, '555-7825')
A fenti utasts megtallhat a SalesOrders adatbzis mdosthat vltozatban CHl6_Add_Employee nven. Vajon mirt nem foglaltuk bele a lekrdezsbe az elsdleges kulcsot, az EmployeelD (alkalmazottazonost) oszlopot? Ha kvncsiak vagyunk a vlaszra, olvassunk tovbb!

Az elsdleges kulcs kvetkez rtknek ellltsa


A fenti pldalekrdezsbe nem foglaltuk bele az elsdleges kulcsot, az EmployeeID-t. Az elsdleges kulcsnak azonban minden adatbzisrendszerben ktelezen rtkkel rendelkeznie. Nem fog az utasts vgrehajtsa hibval flbeszakadni? A vlasz: nem, de csak azrt, mert kihasznlunk egy olyan szolgltatst, amely majdnem minden kereskedelmi adatbzis-megvalstsban megtallhat. Ha nincs jelentsge az el sdleges kulcs pontos rtknek megelgsznk azzal, hogy valamilyen egyedi rtket tartalmazzon -, akkor ltrehozhatjuk az elsdleges kulcsot egy olyan adattpussal, amelyet az adatbzisrendszer minden j sor bersakor automatikusan megnvel. A Microsoft Accessben ez a tpus az AutoNumber. Az AutoNumber valjban egy olyan egsz szm, amely klnleges jellemzkkel (attribtumokkal) rendelkezik. A Microsoft SQL Server az Identity adattpust hasznlja (amely szintn egsz szm). A MySQL-ben olyan egsz szmot tartalmaz oszlopot hasznlhatunk, amelynek belltjuk az AUTO_INCREMENT jellemzjt. A pldnkban hasznlt SQL-utastsforma mindhrom tpus mintaadatbzis ban mkdni fog, mert mindhrom mintaadatbzis mdosthat vltozatban a megfelel klnleges kpessget hasznlva hoztuk ltre az elsdleges kulcsot tartalmaz oszlopot szinte minden tblban. Az Oracle adatbzis egy kicsit mskpp mkdik Nem klnleges adattpust knl, hanem lehetv teszi egy Sequence (sorozat) tpus loszlop hasznlatt, amelynek a NEXTVAL jellemzjre kell hivatkoznunk minden esetben, amikor egyedi azonostra van szks gnk egy j sor szmra. Tegyk fel, hogy Oracle adatbzisunkban korbban ltrehoztunk egy EmpID nev loszlopot. Az SQL-utastsunk az albbi lehet: SQL

INSERT INTO Employees (EmployeelD, EmpFirstName, EmpLastName, EmpStreetAddress, EmpCity, EmpState, EmpZipCode, EmpAreaCode, EmpPhoneNumber) VALUES (EmpID.NEXTVAL, 'Susan', 'Metters', '16547 NE 132nd St', 'Woodinville', 'WA', '98072', 425, '555-7825')

Vegyk szre, hogy minden oszlopnak adunk rtket, radsul abban a sorrendben, ahogyan a tbla meghatrozsban szerepeinek. gy elhagyhatjuk az oszlopnvlistt, teht az SQL-utasts lehet az albbi is: SQL

INSERT INTO Employees VALUES (EmpID.NEXTVAL, 'Susan', 'Metters', '16547 NE 132nd St', 'Woodinville', 'WA', '98072', 425, '555-7825')

Ahogyan mr korbban is emltettk, nem javasoljuk az oszlopnvlista elhagyst, mert ha az adatbzis rendszergazdja j oszlopot ad a tblhoz, vagy felcserli az oszlopok sorrendjt, akkor az INSERT utasts vgrehajtsa meghisul. Ezt a formt csak a teljessg kedvrt idztk Ha ppen elmlkeds hangulatban vagyunk, esznkbe juthat, hogy nem lehetne ppen ilyen egyszeren egy allekrdezs hasznlatval ellltani a kvetkez elsdleges kulcsot? Az SQL-szabvny termszetesen ezt is tmogatja; ennek megfelelen az INSERT utasts az albbi formt is ltheti: SQL

INSERT INTO Employees (EmployeelD, EmpFirstName, EmpLastName, EmpStreetAddress, EmpCity, EmpState, EmpZipCode, EmpAreaCode, EmpPhoneNumber) VALUES ( (SELECT MAX(EmployeelD) FROM Employees) + l, 'Susan', 'Metters', '16547 NE 132nd St', 'Woodinville', 'WA', '98072', 425, '555-7825')

Sajnos azonban a fbb adatbzisrendszerek kzl tbb nem tmogatja az allekrdezsek hasznlatt a VALUES zradkban. A rszletek tekintetben hagyatkozzunk adatbzisrend szernk dokumentcijra.

Adatok beszrsa a SELECT utasts segtsgvel


Olvasnk elgondolkodhat, hogy vajon mirt adtuk az Adathalmazok beszrsa cmet a fejezetnek, ha egyszerre csak egy sort szrunk be? Bizonyos rtelemben egy sor tbb adata is adathalmazt alkot, de adathalmaznak ltalban tbb sor egyttest nevezzk. Semmi baj: sorok halmazt is beszrhatjuk egy tblba, ha SELECT kifejezst alkalmazunk a VALUES zradk helyett. Mivel a SELECT kifejezsek egy vagy tbb tblbl olvasnak be sorokat, a SELECT-et hasznl INSERT-et az adatmsols hatkony mdszernek is te kinthetjk. A SELECT kifejezst tartalmaz INSERT utasts szintaxisdiagramjt a 16.4. bra mutatja.

Vegyk szre, hogy az INSERT utasts e vltozata ugyangy kezddik, mint az elz: az INSERT INTO kulcsszavak utn megadjuk a mdostand tbla nevt. Ha a SELECT kifejezs ugyanannyi oszlopot ad vissza, ugyanolyan sorrendben, mint ahogyan azok a mdostand tblban szerepelnek, akkor elhagyhatjuk a nem ktelez oszlopnvlistt. De ahogyan azt korbban is javasoltuk, mg ha minden oszlopnak terveznk is rtket adni, akkor se hagyjuk el az oszlopnvlistt, ha ugyanis elhagyjuk, s valaki j oszlopot ad a tblhoz, vagy mdostja az oszlopok sorrendjt, akkor az utastsunk vgrehajtsa meghisul.

Ha megvizsgljuk az A fggelkben kzlt szabvnyos SQL-szintaxisdiagramokat, akkor lthatjuk, hogy a SELECT kifejezs egyszeren egy SELECT utasts, amelyet esetlegesen UNION, INTERSECT vagy EXCEPT mvelettel ms SELECT utastsokhoz kapcsolunk. (Az emltett hrom mvelet lerst megtalljuk a 7. fejezetben, a UNION utasts rszletes magyarzata pedig a 10, fejezetben tallhat.) A SELECT utasts szintaxisdiagramja a 16,5, brn lthat, A korbbi fejezetekbl emlkezhetnk, hogy a tblahivatkozs lehet egy tblanv, tblanevek vesszvel elvlasztott listja, illetve kt vagy tbb tbla sszekapcsolsa JOIN zradkokkal. A keressi felttel lehet egy oszlop s egy rtk egyszer sszehasonlt sa, a BETWEEN, IN, LIKE, NULL kulcsszavakat tartalmaz bonyolultabb felttel, vagy mg bonyolultabb allekrdezs, Rviden: a SELECT lekrdezsek minden kpessge rendelke zsnkre ll a beszrand sor adatainak meghatrozsra, ssunk mlyebbre nhny olyan plda segtsgvel, amelyeknek a megoldshoz SELECT kifejezst tartalmaz INSERT utastst kell hasznlnunk, me az els krelem, amely egy tbla adott sornak lemsolst kri egy msik tblba: pp most vettk fel alkalmazottnak David Smith-t, aki a vsrlnk volt. Msold t David Smith sszes adatt a vsrlk tbljbl az alkalmazottak tbljba! Mint minden utasts megrsakor, most is tisztban kell lennnk a rszt vev tblk szer kezetvel. A kt krdses tbla felptst a 16,6, bra mutatja,

Fogalmazzuk t a krelmet gy, hogy knnyebb legyen SQL-utastss alaktanunk: Msold t az alkalmazottak tbljba a vsrlk tbljnak megfelel oszlopait a David Smith nev vsrl esetben! Fordts - Insert into the employees table in the columns first name, last name, street address, city, state, ZIP code, area code, and phone

number the selection of the first name, last name, street address, city, state, ZIP code, area code, and phone number columns from the customers table where the customer first name is 'David' and the customer last name is 'Smith' (rd be az alkalmazottak tbljnak keresztnv, vezetknv, cm, vros, llam, irnytszm, terletkd s telefonszm oszlopaiba annak a lekrde zsnek az eredmnyt, amely kivlasztja a keresztnevet, vezetknevet, cmet, vrost, llamot, irnytszmot, terletkdot s telefonszmot a vsr lk tbljbl, ha a vsrl keresztneve David, a vezetkneve pedig Smith.) Tisztzs - Insert into the employees table in the columns (first name, last name, street address, city, state, ZIP code, area code, and phone number) the selection of the first name, last name, street address, city, state, ZIP code, area code, and phone number columns from the customers table where the customer first name is = 'David' and the customer last name is = 'Smith' SQL INSERT INTO Employees

(EmpFirstName, EmpLastName, EmpStreetAddress, EmpCity, EmpState, EmpZipCode, EmpAreaCode, EmpPhoneNumber) SELECT Customers.CustFirstName, Customers.CustLastName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode, Customers.CustAreaCode, Customers.CustPhoneNumber FROM Customers WHERE (Customers.CustFirstName = 'David') AND (Customers.CustLastName = 'Smith')
Figyeljk meg, hogy nem szerepeltettk az EmployeelD oszlopot, hanem az adatbzisra hagytuk, hogy automatikusan lltsa el a kvetkez egyedi rtket a beszrand j sor(ok) szmra. Ezt a lekrdezst CHl6_Copy_Customer_To_Employee nven mentettk a Sales Orders mintaadatbzis mdosthat vltozatba. Mivel csak egyetlen David Smith nev vsrlnk van, a fenti utasts csak egyetlen sort szr be az Employees tblba. Ez mg mindig nem adathalmaz, de lthatjuk, milyen egy szer egy SELECT kifejezs segtsgvel lekrdezni a beszrshoz szksges adatokat, ha azok rendelkezsre llnak egy msik tblban.

Lpjnk tovbb egy olyan pldra, amelyben esetleg akr sorok szzait szrjuk be egyszer re. Minden olyan adatbzis-alkalmazsban, amely idrl idre j informcikat gyjt, lta lban tallhat olyan szolgltats, amelynek a segtsgvel a felhasznlk archivlhatjk a korbbi adataikat, vagy biztonsgi msolatot kszthetnek egy adott idpontnl rgebben keletkezett adatokrl egy msik tblba. Az tletnek az az alapja, hogy nem szerencss r gi adatok tmkelegvel lasstani az j adatok feldolgozst, mert archivls nlkl minden lekrdezsnek rg elavult adatok tengerben kell keresnie a megfelel sorokat. rjunk teht egy olyan INSERT utastst, amely minden olyan tranzakci adatt, amely egy adott dtumnl korbban keletkezett, tmsolja egy msik tblba. (A kvetkez fejezetben azt is bemutatjuk majd, hogyan trlhetjk az archivlt adatokat az aktv tblbl.) A kre lem jellemzen gy fest: Archivlj minden 2008. janur 1-je eltti rendezvnyt! Ebben a klnleges esetben az Engagements (Rendezvnyek) s az Engagements_Archive (Archv rendezvnyek) tblnak azonos a felptse, ahogyan azt a 16.7. bra is mutatja.

Ez pldul olyan eset, amikor biztonsgosan elhagyhat az oszloplista. A fordts igen egyszer: Fordts - Insert into the engagements archive table the selection of all columns from the engagements table where the engagement end date is earlier than January 1, 2008 (Szrd be az archv rendezvnyek tbljba annak a lekrdezsnek az eredmnyt, amely kivlasztja az sszes olyan oszlopot a rendezvnyek tbljbl, ahol a vgdtum 2008. janur l. eltti.) Tisztzs - Insert into the engagements archive table

the selection of all columns * from the engagements where the engagement end date is earlier than < January 1, 2008 '2008-01-01' SQL INSERT INTO Engagements_Archive

SELECT Engagements.* FROM Engagements WHERE Engagements.EndDate < '2008-01-01'


Ez mr szinte tl egyszer! De emlkezznk vissza: korbban azt javasoltuk, hogy mindig kifejezetten soroljuk fel, hogy mely oszlopoknak akarunk rtket adni. Ha gy tesznk, akkor az utastsunk akkor is kpes lesz lefutni, ha valaki j oszlopot ad brmelyik tblhoz, vagy mdostja az oszlopok sorrendjt. Igaz, hogy ez egy kicsit tbb erfesztst ignyel, mgis azt javasoljuk, hogy a feladatot megold SQL-utastst inkbb gy rjuk: SQL

INSERT INTO Engagements_Archive (EngagementNumber, StartDate, EndDate, StartTime, StopTime, ContractPrice, CustomerID, AgentID, EntertainerID) SELECT Engagements.EngagementNumber, Engagements.StartDate, Engagements.EndDate, Engagements.StartTime, Engagements.StopTime, Engagements.ContractPrice, Engagements.CustomerID, Engagements.AgentID, Engagements.EntertainerID FROM Engagements WHERE Engagements.EndDate < '2008-01-01'

A lekrdezst CHl6_Archive_Engagements nven tallhatjuk meg az Entertainment Agency mintaadatbzis mdosthat vltozatban.

Most pedig lssunk egy pldt a SELECT kifejezs kreatv hasznlatra: Vegyl fel egy j termket a kerkprok termkcsoportjba Hot Dog Spinner nven, 895 dollros fogyaszti ron!" A megoldshoz szksges tblk szerkezete a 16.8. brn lthat. Addig vilgos, hogy a mdostand tbla a Products (Termkek), de abban a CategoryID (termkcsoport-azonost) oszlopba egy szmrtk azonostt kell tennnk. A krelem azt mondja a kerkprok termkcsoportjba". Hogyan talljuk ki a szksges termkcso port-azonostt? Termszetesen SELECT kifejezssel! A CategorylD-n kvl a ProductName (Termknv) s a RetailPrice (Fogyaszti r) oszlopot is ki akarjuk tlteni, de emlkezznk vissza: a SELECT utasts literlis rtket is visszaadhat egy - vagy akr az sszes oszlop esetben. Teht a megolds az, hogy lekrdezzk a termkcsoport-azonostt a Categories tblbl, a tbbi rtket pedig literlis rtkekknt adjuk meg. Fogalmazzuk t a krelmet, s adjunk r megoldst! Adj egy j sort a termkek tbljhoz, amelyben a termk neve legyen Hot Dog Spinner, a fogyaszti ra 895 dollr, a termkcsoport-azonost pedig a Bikes lers termkcsoport azonostja a termkcsoportok tbljbl! Fordts - Insert into the products table in the columns product name, retail price, and category ID the selection of 'Hot Dog Spinner' as the product name, 895 as the retail price, and category ID from the categories table where the category description is equal to 'Bikes' (rd be a termkek tbljnak termk, fogyaszti r s termkcsoport-azo nost oszlopaiba annak a lekrdezsnek az eredmnyt, amely kivlasztja a Hot Dog Spinner szveget, a 985 szmot s a termkcsoport-azonostt a termkcsoportok tbljbl, ha a termkcsoport lersa "Bikes".) Tisztzs - Insert into the products table in the columns (product name, retail price, and category ID) the selection of 'Hot Dog Spinner' as the product name, 895 as the retail price, and category ID from the categories table where the category description is = 'Bikes' SQL INSERT INTO Products

(ProductName, RetailPrice, CategoryID) SELECT 'Hot Dog Spinner' AS ProductName, 895 AS RetailPrice, CategoryID FROM Categories WHERE CategoryDescription = 'Bikes'

Korbban azt gondolhattuk volna, hogy a SELECT kifejezsek csak arra jk, hogy teljes sorokat msoljunk, de amint ltjuk, arra is alkalmasak, hogy a beszrshoz szksges sszes adat kzl csak nhnyat hatrozzunk meg ms tblk adatai alapjn. A fenti mdszer alkalmazsra lthatunk nhny rdekes esetet a Pldk rszben.

Az INSERT hasznlati terletei


Ha idig elrtnk, akkor mr tudjuk, hogy miknt lehet egy vagy akr tbb sort beszrni egy tblba egyszer VALUES zradk vagy egy SELECT kifejezs segtsgvel Az INSERT utasts szles felhasznlsi krnek bemutatsra az a legjobb, ha felsorolunk nhny olyan problmt, amelyre az INSERT utasts hasznlata adja a megoldst, majd egy sor pldn is bemutatjuk a hasznlatt Az itt felsorolt problmk csak zeltt adnak az INSERT-tel megoldhat feladatok tmkelegbl: Hozd ltre Matthew Patterson tekejtkos rekordjt Neil Patterson rekordjnak lemsolsval! ,,Vedd fel az Entertainment adatbzisba vsrlknt Kendra Hernandezt, akinek a cme 457 211th St NE, Bothell, WA 98200, a telefonszma pedig 555-3945! A Sales Orders adatbzisba vedd fel vsrlknt Mary Bakert, akinek a cme 7834 W32nd Ct, Bothell, WA 98011, a terletkdja 425, a telefonszma pedig 555-9876! Hozz ltre egy Italian nev j tantrgycsoportot a Humanities tanszk szmra "ITA tantrgykddal! ,,Vegyl fel egy j csapatot Aardvarks nven, csapatkapitny nlkl! ,,Rgzts egy j rendezvnyt a Matt Berg nev megrendel szmra: foglald le a Jazz Persuasiont 2008. augusztus 15-re s 16-m, este 7-tl 11-ig; az zletet Karen Smith kttte! ,,Vedd fel a Hot Dog Bikes nev j beszlltt, amelynek a cme 1234 Main Street, Chicago, IL 60620, a telefonszma (773) 555-6543, a faxszma (773) 555-6542, a honlapjnak cme http://www.hotdogbikes.com/ s az e-mail cme Sales@hotdogbikes.com! ,,Vegyl fel egy j rt a 4-es azonostj tantrgy (Intermediate Accounting) szmra 5 kreditpontrt! Az eladst a 3315-s teremben tartjk kedd s cstrtk dlutnon knt 3-kor, s 80perc hossz. ,,Archivld a 2007-es vad minden tornjt, mrkzst, a jtkokat s a jtkosok pontszmait! Vedd fel a New Age-et a zenei stlusok listjra! ,,Archivld a 2008. janur 1-je eltt keletkezett rendelseket a rszletez soraikkal egytt! ,,Angel Kennedy hallgatknt akarja bejegyeztetni magt. A frje mr korbban beiratkozott. Rgzts egy j hallgatrekordot Angel szmra, felhasznlva John rekordjnak adatait! ,,Msold le 2007 minden tornjt s mrkzst 2009 azonos hetre! ,,Az gynk Marianne Wier le szeretne ktni nhny eladt. Hozz ltre a szmra megrendelrekordot az gynkk tbla adatainak felhasznlsval!

Liz Keyser nev vsrlnk szeretn ugyanazokat a termkeket megrendelni, mint amelyeket 2007. december 11-n rendelt. Ksztsd el az j rendelst 2008. jnius 12-i rendelsi dtummal; a szlltsi dtum legyen 2008. jnius 15.! Tim Smith, a tanri kar tagja, szeretne beiratkozni hallgatknt. Hozz ltre hallgatrekordot Tim szmra a tanri rekord adatainak felhasznlsval! Doris Hartwig nev megrendelnk 2008. augusztus 4-re szeretn lektni ugyanazokat az eladkat, akik 2007. december 1-jn jtszottak nla. Angel Kennedy nev vsrlnk meg szeretn rendelni ugyanazokat a termkeket, mint amelyeket 2007. november folyamn rendelt. Ksztsd el szmra a rendelst 2008. jnius 15-i rendelsi s 2008. jnius 18-i szlltsi dtummal!"

Pldk
Mr ismerjk az INSERT utasts felptsnek mdszert, lssunk ht egy sor pldt, amelyek mindegyikben egy vagy tbb sort szrunk be egy tblba! A pldk a minta adatbzisokbl szrmaznak. Minden plda mell mellkeltk azoknak a soroknak az adatait, amelyet az adott INSERT utastsnak a tblba kell szrnia, s megadtuk az jonnan keletkez sorok szmt is. A mdosts utni adatokat tartalmaz tblzat cmben annak a lekrdezsnek a neve szerepel, amellyel azt a mellkletknt adott CD-n szerepl mintaadatbzisokban megtall hatjuk. Minden lekrdezst a megfelel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz lekrdezsek neve "CH16"-tal kezddik. A pldkat a knyv elejn tallhat bevezets tmutatst kvetve tlthetjk be s prblhatjuk ki.
Ne feledjk, hogy a pldkban hasznlt minden tbla- s oszlopnv megfelel a mintaadatbzisok B fggelkben tallhat smalersnak. A lersok egyszerstse cljbl a Fordts s Tisztzs rszeket minden pldnl ssze vontuk. A pldk felttelezik, hogy az olvas ttanulmnyozta s megrtette a korbbi fejezetekben lert ismereteket.

Sales Orders adatbzis


Vedd fel j a Hot Dog Bikes nev beszlltt, amelynek a cme 1234 Main Street, Chicago, IL 60620, a telefonszma (773) 555-6543, a faxszma (773) 555-6542, a honlapjnak cme http://www.hotdogbikes.com/ s az e-mail cme Sales@hotdogbikes.com!" Fordts/ - Insert into the vendors table Tisztzs in the columns (VendName,VendStreetAddress,VendCity,
VendState,VendZipCode,VendPhoneNumber, VendFaxNumber,VendWebPage, and VendEMailAddress) the values ('Hot Dog Bikes', '1234 Main Street',

'Chicago', 'IL', '60620', '(773) 555-6543', '(773) 555-6542', 'http://www.hotdogbikes.com/', and 'Sales@hotdogbikes.com') SQL

INSERT INTO Vendors (VendName, VendStreetAddress, VendCity, VendState, VendZipCode, VendPhoneNumber, VendFaxNumber, VendWebPage, VendEMailAddress) VALUES ('Hot Dog Bikes', '1234 Main Street', 'Chicago', 'IL', '60620', '(773) 555-6543', '(773) 555-6542', 'http://www.hotdogbikes.com/', 'Sales@hotdogbikes.com')

Archivld a 2008. janur 1-je eltt keletkezett rendelseket s a rszletez soraikat! A rendels sszes adatnak archivlshoz mind az Orders, mind az Order_Details tbla adatait le kell msolni, teht kt utastsra lesz szksgnk. Elszr a rendelseket beszr INSERT utastst futtassuk, mert az Order_Details_Archive tbla OrderID oszlopa idegen kulcsot tartalmaz, amely az Orders_Archive azonos nev oszlopra mutat. Ha adatbzisrendszernk tmogatja a tranzakcikat (lsd a 15. fejezetben), akkor rdemes egy j tranzakcit nyitnunk, majd elszr lefuttatni a rendelseket, utna pedig a rendelsrszletezket lemsol utastst, s csak akkor vglegesteni (COMMIT) a mdostsokat, ha mindkett hiba nlkl lefutott. Ha a msodik INSERT utasts hibt eredmnyez, akkor visszagrgethetjk a mdostsokat. Nincs rtelme az adatoknak csak az egyik felt menteni. Mivel dtumok alapjn kell kivlogatni az archivland sorokat, a rendelsrszletezk archivlsakor allekrdezst kell hasznlnunk, amellyel kivlogathatjuk azoknak a megrendelseknek az azonostjt, amelyek az adott dtum eltt keletkeztek. Fordts 1/ - Insert into the orders archive table

Tisztzs

the selection of order number, order date, ship date, customer ID, employee ID, and order total from the orders where the order date is earlier than < '2008-01-01'

SQL

INSERT INTO Orders_Archive SELECT OrderNumber, OrderDate, ShipDate, CustomerID, EmployeelD, OrderTotal FROM Orders WHERE OrderDate < '2008-01-01'

Fordts 2/- Insert into the order details archive table Tisztzs the selection of order number,product number, quoted price, and quantity ordered from the order details where the order number is in the selection of the order number from the orders table where the order date is earlier than < '2008-01-01') SQL INSERT INTO Order_Details_Archive

SELECT OrderNumber, ProductNumber, QuotedPrice, QuantityOrdered FROM Order_Details WHERE Order_Details.OrderNumber IN (SELECT OrderNumber FROM Orders WHERE Orders.OrderDate < '2008-01-01')

Egyik lekrdezs megrsakor sem kvettk azt az ajnlsunkat, mi szerint mindig rjuk ki az oszlopnvlistt. Ezt a pldt azrt ptettk fel gy, hogy olyan esetet is be tudjunk mutatni, ahol nem felttlenl szksges az oszlopnvlista.

Entertainment Agency adatbzis


Vedd fel az Entertainment adatbzisba vsrlknt Kendra Hernandezt, akinek a cme 457 211th St NE, Bothell, WA 98200, a telefonszma pedig 555-3945! Fordts/ - Insert into the customers table Tisztzs in the columns (customer first name, customer last name, customer street address, customer city, customer state, customer ZIP Code, and customer phone number) the values ('Kendra', 'Hernandez', '457 211th St NE', 'Bothell', 'WA', '98200', and '555-3945') SQL INSERT INTO Customers

(CustFirstName, CustLastName, CustStreetAddress, CustCity, CustState, CustZipCode, CustPhoneNumber) VALUES ('Kendra', 'Hernandez', '457 211th St NE', 'Bothell', 'WA', '98200', '555-3945')

Rgzts egy j rendezvnyt a Matt Berg nev megrendel szmra: foglald le a Jazz Persuasiont 2008. augusztus 15-re s 16-ra, este 7-tl 11-ig; az zletet Karen Smith kttte! Ha vetnk egy pillantst az Engagements (Rendezvnyek) tblra, akkor lthatjuk, hogy szksgnk lesz Matt Berg vsrlazonostjra a Customers (Megrendelk) tblbl, a Jazz Persuasion eladazonostjra az Entertainers (Eladk) tblbl, s Karen Smith gynkazonostjra az Agents (gynkk) tblbl. Ezeket az rtkeket egy SELECT kifejezssel krdezhetjk le. A hrom krdses tblt JOIN felttelek nlkl rjuk a FROM zradkba. Ez a mdszer csak azrt mkdik, mert csak egy megrendelnket hvjk Matt Bergnek, csak egy gyn kt hvnak Karen Smith-nek, s csak egy Jazz Persuasion nev eladnk van. Ha vala melyikbl is tbb lenne, akkor tbb sort szrnnk be az Engagements tblba. Ne felejt sk el kiszmtani a szerzdsi sszeget az Entertainers tblban szerepl napidj s a 15%-os haszonkulcs figyelembe vtelvel!

Fordts/Tisztzs - Insert into the engagements table into the (customer ID, entertainer ID, agent ID, start date, end date, start time, end time, and contract price) columns the selection of customer ID, entertainer ID, agent ID, and the values August 15, 2008 '2008-08-15', August 16, 2008 '2008-08-16', '07:00:00 PM' '19:00:00', '11:00:00 P.M.' '23:00:00', and the (entertainer price per day times * 2 times * 1.15) from the customers, entertainers, and agents tables where the customer first name is = 'Matt' and the customer last name is = 'Berg' and the entertainer stage name is = 'Jazz Persuasion' and the agent first name is = 'Karen' and the agent last name is = 'Smith' SQL INSERT INTO Engagements

(CustomerID, EntertainerID, AgentID, StartDate, EndDate, StartTime, StopTime, ContractPrice) SELECT Customers.CustomerID, Entertainers.EntertainerID, Agents.AgentID, '2008-08-15', '2008-08-16', '19:00:00', '23:00:00', ROUND(EntPricePerDay * 2 * 1.15, 0) FROM Customers, Entertainers, Agents WHERE (Customers.CustFirstName = 'Matt') AND (Customers.CustLastName = 'Berg') AND (Entertainers.EntStageName = 'Jazz Persuasion') AND (Agents.AgtFirstName = 'Karen') AND (Agents.AgtLastName = 'Smith')

School Scheduling adatbzis


Hozz ltre egy Italian nev j tantrgycsoportot a Humanities tanszk szmra "ITA" tantrgykddal! Szksgnk lesz a Humanities tanszk azonostjra, amelyet egy a Departments tbln futtatott SELECT kifejezssel kaphatunk meg.

Fordts/ - Insert into the categories table Tisztzs the selection of 'ITA' as the category ID, 'Italian' as the category description, and department ID from the departments table where department name is = 'Humanities' SQL INSERT INTO Categories

SELECT 'ITA' AS CategoryID, 'Italian' AS CategoryDescription, Departments.DepartmentID FROM Departments WHERE Departments.DeptName = 'Humanities'

,,Vegyl fel egy j rt a 4-es azonostj tantrgy (Intermediate Accounting) szmra 5 kreditpontrt! Az eladst a 3315-s teremben tartjk kedd s cstrtk dlutnonknt3-kor, s 80 perc hossz. Felttelezhetjk, hogy az temezett napok alaprtelmezett rtke 0 vagy hamis, teht csak a kedd s a cstrtk szmra kell az 1 vagy igaz rtket megadni. Fordts/ - Insert into the classes table Tisztzs into the columns (subject ID, classroom ID, credits, start time, duration,Tuesday schedule, and Thursday schedule) the values (4, 3315, 5, 15:00:00, 80, 1, and 1) SQL INSERT INTO Classes

(SubjectID, ClassRoomID, Credits, StartTime, Duration, TuesdaySchedule, ThursdaySchedule) VALUES (4, 3315, 5, '15:00:00', 80, 1, 1)

Bowling League adatbzis


Hozd ltre Matthew Patterson tekejtkos rekordjt Neil Patterson rekordjnak lemsolsval! Az sszes lettt bbut, a lejtszott mrkzsek szmt, az aktulis tlagot s az aktulis bntetpontszmot lltsuk 0-ra. Fordts/ - Insert into the bowlers table Tisztzs into the columns (bowler last name, bowler first name, bowler address, bowler city, bowler state, bowler zip, bowler phone number, team ID, bowler total pins, bowler games bowled, bowler current average, and bowler current handicap) selection of bowler last name, the value 'Matthew', bowler address, bowler city, bowler state, bowler zip, bowler phone number, team ID, and the values 0, 0, 0, and 0 from the bowlers table where the bowler last name is = 'Patterson' and the bowler first name is = 'Neil' SQL

INSERT INTO Bowlers (BowlerLastName, BowlerFirstName, BowlerAddress, BowlerCity, BowlerState, BowlerZip, BowlerPhoneNumber, TeamID, BowlerTotalPins, BowlerGamesBowled, BowlerCurrentAverage, BowlerCurrentHcp) SELECT Bowlers.BowlerLastName, 'Matthew', Bowlers.BowlerAddress, Bowlers.BowlerCity, Bowlers.BowlerState, Bowlers.BowlerZip, Bowlers.BowlerPhoneNumber, Bowlers.TeamID,

0, 0, 0, 0 FROM Bowlers WHERE (Bowlers.BowlerLastName - 'Patterson') AND (Bowlers.BowlerFirstName = 'Neil')


,,Vegyl fel egy j csapatot Aardvarks nven, csapatkapitny nlkl! Fordts/ - Insert into the teams table Tisztzs into the columns (team name, and captain ID) the values ('Aardvarks', and Null)
SQL

INSERT INTO Teams (TeamName, CaptainID) VALUES ('Aardvarks', NULL)

sszefoglals
A fejezetet az j adatok beszrsra hasznlhat INSERT utasts rvid lersval kezdtk. Bemutattuk az INSERT utastsformjt s egy egyszer pldt, amely egy rtklistval megadott sort szrt be egy tblba. Ez utn megmutattuk azokat a mdszereket, amelye ket a klnbz adatbzisrendszerek knlnak az elsdleges kulcs egyedi rtknek el lltsra. Elmondtuk, hogy a Microsoft SQL Server az Identity adattpust, a Microsoft Access az AutoNumber adattpust, a MySQL pedig az AUTO_INCREMENT jellemzt knl ja. Rviden elmagyarztuk az Oracle adatbzisokban hasznlt Sequence loszlop haszn latnak mdjt, vgl pedig bemutattuk, hogy miknt lehet a VALUES zradkban alkal mazott allekrdezssel meghatrozni az elsdleges kulcs ltez legnagyobb rtkt, s azt eggyel nvelni. Felfedez utunkat a SELECT kifejezseket alkalmaz INSERT utastsokkal folytattuk, amelyek sorok msolsra hasznlhatk. Elszr ttekintettk a SELECT kifejezs utasts formjt, majd bemutattuk, hogyan lehet egy sort az egyik tblbl egy msikba msolni. Kvetkez pldnkban egyszerre tbb rgi rekordot msoltunk t egy archivl tblba, vgl pedig bemutattuk, hogyan kpes egy SELECT kifejezs egy kapcsold tblbl egy vagy tbb adatot lekrdezni s azt az j sor beszrsakor felhasznlni. A fejezet tovbbi rsze pldkkal szemlltette az INSERT utasts hasznlatt A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis


Liz Keyser nev vsrlnk szeretn ugyanazokat a termkeket megrendelni, mint amelyeket 2007. december 11-n rendelt. Ksztsd el az j rendelst 2008. jnius 12-i rendelsi dtummal; a szlltsi dtum legyen 2008. jnius 15.! (Tipp: az Orders s az Order Details tbla sorait is t kell msolnunk j rende lsazonostnak megteszi, ha Liz Keyser 2008. december 11-i rendelsnek azonostjhoz hozzadunk ezret.) A megolds itt tallhat: CH16_Copy_Decll_Order_For_Keyser (1 j sor), illetve CH16_Copy_Decll_OrderDetails_For_Keyser (4 j sor). 2. A Sales Orders adatbzisba vedd fel vsrlknt Mary Bakert, akinek a cme 7834 W 32nd Ct, Bothell, WA 98011, a terletkdja 425, a telefonszma pedig 555-9876! A megolds itt tallhat: CH16_Add_Customer (1 j sor). 3. Angel Kennedy nev vsrlnk meg szeretn rendelni ugyanazokat a termkeket, mint amelyeket 2007. november folyamn rendelt. Ksztsd el szmra a rendelst 2008. jnius 15-i rendelsi s 2008. jnius 18-i szlltsi dtummal! (Tipp: az Orders s az Order Details tbla sorait is t kell msolnunk j rendels azonostnak megteszi, ha Angel Kennedy novemberi rendelsinek azonostihoz hozzadunk ezret.) A megolds itt tallhat: CH16_Copy_November_Orders_For_AKennedy (7 j sor), illetve CH16_Copy_November_OrderDetails_For_AKennedy (37 j sor).

1.

Entertainment Agency adatbzis


1. Az gynk Marianne Wier le szeretne ktni nhny eladt. Hozz ltre a szmra
megrendelrekordot az gynkk tbla adatainak felhasznlsval! (Tipp: egyszeren msoljuk t a megfelel oszlopokat az Agents tblbl a Customers tblba.) A megolds itt tallhat: CH16_Copy_Agent_To_Customer (1 j sor). 2. Vedd fel a New Age-et a zenei stlusok listjra! A megolds itt tallhat: CH16_Add_Style (1 j sor). 3. Doris Hartwig nev megrendelnk 2008. augusztus 4-re szeretn lektni ugyan azokat az eladkat, akik 2007. december 1-jnjtszottak nla.

(Tipp: Hasznljunk SELECT kifejezst, amely JOIN zradkkal sszekapcsolja a Customers s az Engagements tblt, a szksges dtumokat pedig adjuk meg literlis rtkekknt.) A megolds itt tallhat: CH16_Duplicate_Engagement (1 j sor).

School Scheduling adatbzis


Angel Kennedy hallgatknt akarja bejegyeztetni magt. A frje mr korbban beiratkozott. Rgzts egy j hallgatrekordot Angel szmra, felhasznlva John rekordjnak adatait! A megolds itt tallhat: CH16_Add_Student (1 j sor). 2. Tim Smith, a tanri kar tagja, szeretne beiratkozni hallgatknt. Hozz ltre hallgatrekordot Tim szmra a tanri rekord adatainak felhasznlsval! A megolds itt tallhat: CH16_Enroll_Staff (1 j sor). 1.

Bowling League adatbzis


1. Archivld a 2007-es vad minden tornjt, mrkzst, a jtkokat s a jtkosok pontszmait! (Tipp: ngy klnll utastsra lesz szksgnk a Tournaments, a Tourney_Matches, a Match_Games s a Bowler_Scores tbla szmra.) A megolds itt tallhat: CH16_Archive_2007_Tournaments_l (14 j sor), CH16_Archive_2007_Tournaments_2 (57 j sor), CH16_Archive_2007_Tournaments_3 (168 j sor), illetve CH16_Archive_2007_Tournaments_4 (1344 j sor). 2. Msold le 2007 minden tornjt s mrkzst 2009 azonos hetre! (Tipp: az egyszersg kedvrt ttelezzk fel, hogy az j TourneyID-k rtkt megkaphatjuk gy, hogy a 2007-es tornk azonostjt 25-tel nveljk. Mind a Tourneys, mind a Tourney_Matches tbla sorait t kell msolnunk.) A megolds itt tallhat: CH16_Copy_2007_Tournaments_l (14 j sor) s CH16_Copy_2007_Tournaments_2 (57 j sor).

Adathalmazok trlse
Azrt jttem, hogy szeressem a soraimat, babjaimat, de sokkal tbbet kaptam, mint amire vgytam." - Henry David Thoreau

A fejezet tmakrei
Mi az a DELETE? A DELETE utasts A DELETE hasznlati terletei Pldk sszefoglals nll feladatok

Most mr tudjuk, hogyan kell UPDATE utastssal adatokat mdostani. Azt is megtanultuk, hogyan kell INSERT utastssal adatokat hozzadni egy tblhoz. De hogyan szabaduljunk meg a nemkvnatos adatoktl? Erre a clra az SQL taln legegyszerbb, de legveszlyesebb utastst - a DELETE utastst hasznljuk.

Mi az a DELETE?
Az elz fejezetbl megtudtuk, hogy tblkhoz egszen egyszeren tudunk adatokat hozz adni. A VALUES zradkkal egyszerre egy sort szrhatunk be, mg egy SELECT kifejezssel tbb sort is tmsolhatunk. De mit tegynk, ha tvedsbl adtunk hozz egy sort egy tbl hoz? Hogyan tvoltsunk el olyan sorokat, amelyeket archv tblkba msoltunk? Hogyan tvoltsuk el egy vsrl nevt, aki nem rendel semmit? Hogyan trljk egy hallgat nevt, aki felvtelizett, de egyetlen rra sem iratkozott fel? Hogyan tvoltsunk el minden sort, ha res tblkat akarunk kapni? A vlasz mindegyik krdsre a kvetkez: hasznljuk a DELETE (trls) utastst.

Mint minden ms utasts az SQL-ben, a DELETE is sorhalmazokkal dolgozik. Ahogy azt majd az albbi fejezetbl megtudjuk, a legegyszerbb DELETE utasts az sszes sort trli az ltalunk megadott tblbl, legtbbszr azonban megadjuk a trlend sorok rszhalma zt. Teljes mrtkben igazunk van, ha gy gondoljuk, hogy ehhez egy WHERE zradkra van szksg. Az sszes pldt s a feladatok megoldst megtallhatjuk a megfelel mintaadatbzisok mdosthat (,, modify") vltozatban (SalesOrders Modify, EntertainmentAgencyModify, SchoolSchedulingModify, BowlingLeagueModify).

A DELETE utasts
A DELETE utastsnak csak hrom kulcsszava van: a DELETE, a FROM s a WHERE. A DELETE utasts diagramja a 17.1. brn lthat.

Azt lltottuk, hogy a DELETE utasts az SQL taln legegyszerbb utastsa, s termsze tesen nem vicceltnk - viszont ez a legveszlyesebb vgrehajthat utasts. Ha az utasts ban nem szerepel a WHERE zradk, a DELETE a megadott tbla sszes sort trli. Ez egy j alkalmazs tesztelsnl lehet hasznos, pldul amikor egy ltez tbla sszes sort trlni akarjuk, anlkl, hogy a tbla felptse megvltozna. Tervezhetnk olyan alkal mazst is, amelyben munka- vagy ideiglenes tblkat tltnk fel olyan adatokkal, amelyek egy bizonyos feladatot hajtanak vgre. Pldul ltalnosan elterjedt az INSERT utasts hasznlata, ha tbb sort akarunk tmsolni egy nagyon sszetett SELECT kifejezsbl egy olyan tblba, amelyet utna statikus jelentsek ksztshez fogunk hasznlni. A WHERE zradk nlkli DELETE utasts abban az esetben knyelmes megolds, ha egy j jelen tssor futtatsa eltt trlni akarjuk a rgi sorokat. Az SQL-szabvny szerint a tbla_neve egy lekrdezs (vagy nzettbla) neve is lehet, de a tblnak, amire a lekrdezs neve vonatkozik, "frissthetnek" (updatable) kell lennie. Sok adatbzisrendszer tmogatja sorok trlst a nzettblkbl, s minden adatbzisrendszernek megvannak a maga szablyai azzal kapcsolatban, hogy mitl is lesz egy tbla frissthet nzettbla.

Nhny adatbzisrendszer a nzettbla (az SQL-szabvny szhasznlatban szrmaztatott tbla) meghatrozsra a tbla_neve helyett a JOIN s ON kulcsszavak hasznlatt tmogatja. Azoknak a rendszereknek az esetben, amelyek tmogatjk a szrmaztatott tblk hasznlatt, kzvetlenl a FROM kulcssz utn, tbla_neve.* formtumban meg kell adni annak a tblnak a nevt, amely a JOIN-nal vgzett trls clpontja. A rszleteknek nzznk utna az adatbzisrendszernk dokumentcijban. Fejezetnkben kizrlag egyetlen tblt hasznlunk a DELETE utasts clpontjaknt.

Minden sor trlse


Taln veszlyesen is knny dolog minden sort trlni. A Bowling League mintaadatbzis ban tallhat Bowlers (Tekejtkosok) tbla alapjn szerkessznk egy DELETE utastst! Ebben a fejezetben is a 4. fejezetben bevezetett Krelem -Fordts Tisztzs- SQL"-mdszert fogjuk hasznlni. Trlj minden tekejtkost! Fordts - Delete all rows from the bowlers table (Trlj rninden sort a tekejtkosok tbljbl.) Tisztzs - Delete all rows * from the bowlers table SQL DELETE

FROM Bowlers
Ha a mintaadatbzisban vgrehajtjuk ezt az utastst, vajon tnyleg trl minden sort? Valjban nem, mert megadtunk egy megszortst (egy hivatkozsi psgi szablyt, amelyet a 2. fejezetben trgyaltunk) a Bowlers s a Bowlers_Scores (Jtkosok pontszmai) tblk kzt. Ha egy adott jtkoshoz egyetlen sor is tartozik a Bowlers_Scores tblban, az adatb zisrendszernknek nem szabad megengednie az adott sor trlst a Bowlers tblbl. A Bowling League mintaadatbzis modify vltozatban szerepl kt tekejtkos nem rt el egyetlen pontot sem, ezrt egy egyszer DELETE utastssal trlhetjk a rjuk vonatkoz bejegyzseket. Mg ha egyetlen sort sem akartunk igazn trlni, ez a kt sor vgrvnye sen trldik. Vagy mgsem? Elszr is, sok adatbzis-kezel mkdtet tranzakcinaplt, amelyben rgzti a tblkkal kapcsolatos mdostsainkat, a rendszernaplbl pedig idn knt vissza lehet lltani az elveszett adatokat. Emlkezznk csak a 15. fejezetben rviden trgyalt tranzakcikra. Ha j tranzakcit kezdnk (vagy a rendszer elindt egyet), hiba ese tn visszafordthatjuk a fggben lv vltozsokat. Amint azt mr emltettk, ne feledjk, hogy a Microsoft Office Access olyan adatbzisrend szer, amely automatikusan elindt egy tranzakcit, amikor vgrehajtunk egy lekrdezst a felhasznli felleten. Ha a fenti lekrdezst megprbljuk a Microsoft Accessben futtatni,

a program elszr figyelmeztetst kld, s megadja, hogy hny sort kszl trlni. Ha szrevesszk, hogy az adatbzis-kezel a tbla sszes sort trlni fogja, lellthatjuk a trlst. Ha hagyjuk, hogy a rendszer az els figyelmeztets utn folytassa a tranzakcit, a 17.2. brn lthat hibazenet jelenik meg.

Lthatjuk, hogy kulcs mgsrtse (key violations) miatt a tblban szerepl 34 rekord k zl 32 nem trlhet. Mintha a program ezt kzln velnk: H, fajank, a Bowlers_Scores tblban mg szerepeinek azokra a tekejtkosokra vonatkoz sarok, akiket trlni akarsz! Ha most a No (Nem) gombra kattintunk, s az adatbzisrendszer a nevnkben vgrehajtja a ROLLBACK utastst, egyetlen sor sem trldik. A Yes (Igen) gombra kattintva az adatb zisrendszer vgrehajtja a COMMIT utastst, hogy vgleg trlje az egyetlen ponttal sem rendelkez tekejtkosokra vonatkoz kt sort. A fejezet ksbbi, Pldk cm rszben bemutatjuk, hogyan lehet ktflekppen bizton sgosan trlni azokat a tekejtkosokat, akik egyetlen jtkban sem vettek rszt - ha tnyleg ezt akarjuk tenni.

Csak bizonyos sorok trlse


ltalban korltozni kvnjuk a trlend sarok szmt. Ezt egy WHERE zradk hozzad sval tehetjk meg, ami kiszri a kifejezetten trlni kvnt sorokat. A WHERE zradkok olyan egyszerek, illetve sszetettek lehetnek, mint amilyenekrl mr sz esett a SELECT vagy az UPDATE utastsok kapcsn.

Egyszer WHERE zradk alkalmazsa


Kezdjk valami egyszervel! Tegyk fel, hogy a Sales Orders adatbzisbl trlni akarjuk azokat a rendelseket, amelyekhez nem tartozik rendelsi vgsszeg. A krelem a kvet kezkppen fog kinzni: Trld azokat a rendelseket, amelyeknek a vgsszege nulla! Fordts - Delete from the orders table where the order total is zero (Trld azokat a rendelseket, amelyeknl a rendelsi vgsszeg nulla.) Tisztzs - Delete from the orders table where the order total is = zero 0

SQL

DELETE FROM Orders WHERE OrderTotal = 0

A WHERE zradk egy egyszer sszehasonlt llts segtsgvel keresi meg azokat a sorokat, amelyeknek a rendelsi vgsszege nullval egyenl. Ha a mintaadatbzisban vgrehajtjuk ezt a lekrdezst, azt tapasztaljuk, hogy 11 sor trldik. A lekrdezs mentett vltozatt CH17_Delete_Zero_OrdersA nven tallhatjuk meg.

Els a biztonsg: a megfelel sorok trlsnek biztostsa


Mg az egyszer DELETE lekrdezsek esetben is nagyon ajnlatos ellenrizni, hogy a megfelel sorok fognak-e trldni de hogyan? Mint mr emltettk, a trlni kvnt sorok rszhalmaznak kijellse a legtbb esetben egy WHERE zradkkal trtnik. Mirt nem szerkesztnk elszr egy SELECT lekrdezst, hogy visszaadjuk az eltvoltani kvnt sorokat?
Sorold fel az Orders tbla minden oszlopt azoknak a rendelseknek az esetben, amelyeknek a rendelsi vgsszege nulla! Fordts - Select all columns from the orders table where the order total is zero (Vlaszd ki minden oszlopot a rendelsek tbljbl, ha a rendels vgsszege nulla.) Tisztzs - Select all columns * from the orders table where the order total is = zero 0 SQL SELECT *

FROM Orders WHERE OrderTotal = 0

Ha a Sales Orders mintaadatbzison futtatjuk ezt a lekrdezst, az eredmny a 17.3. brhoz hasonlan fog kinzni. Figyeljk meg, hogy a * helyettest karakterrel jeleztk, hogy ltni akarjuk az sszes osz lopot. Ha az eredmnyhalmaz tartalmazza az sszes trlni kvnt sort, a SELECT utastst gy alaktjuk t a megfelel DELETE utastss, hogy a SELECT *-ot egyszeren DELETE-re cserljk. A 17.4. bra megmutatja, hogyan alaktsuk t a SELECT utastst megfelel for mj DELETE utastss.

17.4. bra

Ellenrz SELECT lekrdezs talaktsa DELETE utastss


Ez az talakts annyira egyszer, hogy badarsg lenne elszr nem ltrehozni a SELECT utastst, hogy meggyzdhessnk rla, hogy tnyleg az ltalunk kvnt sorok trldnek majd. Ne feledjk, hogy amennyiben a DELETE utastst nem vdtk meg egy tranzakciba helyezve, az utasts vgrehajtsa utn a sorok vgleg eltnnek.

Allekrdezs alkalmazsa
Az elz rszben trgyalt lekrdezs, amellyel trlni lehet az sszes nulla rendelsi vg sszeggel rendelkez rendelst, meglehetsen egyszernek tnik. Ne tvesszk viszont szem ell, hogy az OrderTotal oszlop szmtott rtkeket tartalmaz. (A 15. fejezetben mr bemutattuk, hogyan kell az UPDATE utasts segtsgvel kiszmtani s belltani a vg sszeget.) Mi trtnne akkor, ha a felhasznl vagy az alkalmazs nem futtatn a frisstst, miutn a rendels rszleteire vonatkoz egy vagy tbb sort felvette, trlte vagy mdos totta? Lehet, hogy az egyszer lekrdezs megprbl trlni egy olyan rendelst, amelyhez mg tartoznak sorok az Order_Details (Rendelsek rszletei) tblban, s az is lehet, hogy kihagy nhny rendelst, amelynek minden rszlett eltvoltotta, de a vgsszegt nem frisstette. Ha biztonsgosabb mdon akarjuk garantlni, hogy valban olyan rendelseket trlnk, amelyekhez nem tartoznak rendelsi rszletek, egy allekrdezssel ellenrizhetjk, hogy vannak-e illeszked sorok az Order_Details tblban. A krelem a kvetkezkppen fog kinzni.

Trlj minden rendelst, amelynl nem szerepel rendelsi ttel! Fordts - Delete the rows from the orders table where the order number is not in the selection of the order number from the order details table (Trld azokat a sorokat a rendelsek tbljbl, ahol a rendelsi szm nem szerepel a rendelsek rszleteit tartalmaz tbla kivlasztott rendelsi szmai kztt.) Tisztzs - Delete the rows from the orders table where the order number is not in the selection of the order number from the order details) table SQL DELETE FROM Orders

WHERE OrderNumber NOT IN (SELECT OrderNumber FROM Order_Details)


Ez egy kicsit bonyolultabb, mint egy egyszer sszehasonlts a nullval egyenl rendelsi vgsszeg esetben, de biztostja, hogy csak azok a rendelsek trldjenek, amelyekhez nem tartoznak sorok az Orders_Details tblban. A lekrdezs mentett vltozatt a minta adatbzisban CH17_Delete_Zero_OrdersB nven tallhatjuk meg. Ez az sszetettebb lekr dezs lehet, hogy tall s trl olyan sorokat, amelyeknek a nulltl klnbz rendelsi vgsszege nem lett helyesen mdostva, amikor az utols rendelsi ttel is trldtt. Ha WHERE zradkot szerkesztnk egy DELETE lekrdezshez, valsznleg elg gyakran fogjuk hasznlni az IN, a NOT IN, az EXISTS vagy a NOT EXISTS kulcsszavakat. (Ha fel szeretnnk frissteni az emlkeinket, olvassuk el jra a 11. fejezetet.) Vegynk szemgyre mg egy pldt, amelyben a trlni kvnt sorok kiszrshez sszetett WHERE zradkra van szksg: Trlj minden archv tblba msolt, 2 0 . janur 1-je eltt leadott rendelst s 08 rendelsi rszletet! Emlkezznk vissza a 16. fejezetre, amelyben lttuk, hogyan kell az INSERT utastssal rgi sorokat tmsolni egy vagy tbb archv tblba. Miutn tmsoltuk a sorokat, a feldolgozs folyamatt az alkalmazs f rszben gyakran hatkonyabb tehetjk azltal, hogy trljk az archv sorokat. Amint arra a krelem is utal, kt tblbl is kell sorokat trlnnk, ezrt bontsuk fel a krelmet kt rszre. Elszr az Order_Details tblbl kell trlnnk, mert egy konkrt hivatkozsi psgi szably nem engedi, hogy sorokat trljnk az Orders tb lbl, ha illeszked sorok tallhatk az Orders_Details tblban: Trld minden archv tblba msolt, 2 0 . janur 1-je eltt leadott rendels 08 rendelsi rszleteit!

Ltjuk, hogy mirt veszlyes ez? A problma egyik megoldsa az lenne, ha egyszeren trlnnk a sorokat azokbl a rendelsekbl, amelyeket 2008. janur l-je eltt adtak le: Fordts - Delete rows from the order details table where the order number is in the selection of the order number from the orders table where the order date is earlier than January 1, 2008 (Trld azokat a sorokat a rendelsek rszleteit tartalmaz tblbl, amelyeknek a rendelsi szma szerepel abban a listban, amelyet a rendelsek tbljbl a 2008. janur 1-je eltti rendelsi dtum rendelsek kivlasztsval nyertnk.) Tisztzs - Delete rows from the order details table where the order number is in the (selection of the order number from the orders table where the order date is earlier than < January 1, 2008 '2008-01-01') SQL

DELETE FROM Order_Details WHERE OrderNumber IN (SELECT OrderNumber FROM Orders WHERE OrderDate < '2008-01-01')

lekrdezs mentett vltozatt CH17_Delete_Archived_Order_Details_Unsafe nven tall hatjuk meg. Mi a helyzet akkor, ha valaki meggrte, hogy a sorok archivlsnak cljbl futtatja az INSERT lekrdezst, de ezt nem tette meg? Ha futtatjuk ezt a lekrdezst, minden 2008. janur 1-je eltt leadott rendels rszleteit trljk, tekintet nlkl arra, hogy a sorok valban lteznek-e az archv tblban. Biztonsgosabb megolds, ha csak azokat a sorokat trljk, amelyekrl meggyzdtnk, hogy megtallhatk az archv tblban. Prbljuk meg mg egyszer: - Delete rows from the order details table where the order number is in the selection of order number from the order details archive table (Trld azokat a sorokat a rendelsek rszleteit tartalmaz tblbl, amelyeknek a rendelsi szma szerepel a rendelsi rszletek archv tbljbl kivlasztott rendelsi szmok kztt.) Tisztzs - Delete rows from the order details table where the order number is in Fordts

the (selection of order number from the order details archive) table SQL

DELETE FROM OrderDetails WHERE OrderNumber IN (SELECT OrderNumber FROM Order_Details_Archive)

Ennek a lekrdezsnek a mentett vltozatt CH17_Delete_Archived_Order_Details_OK nven tallhatjuk meg. Figyeljk meg, hogy a lekrdezs nem foglalkozik a rendels dtu mval, ugyanakkor ez a megolds sokkal biztonsgosabb, mert csak azokat a sorokat trli a f tblbl, amelyekhez tartozik rendelsi szm az archv tblban. Ha biztosak akarunk lenni afell, hogy azoknak a 2008. janur 1-je eltti rendelseknek a sorait trljk, amelyek mr az archv tblban vannak, a lekrdezsben hasznljuk mindkt IN mveletet, az AND logikai mvelettel prostva.

A DELETE hasznlati terletei


Most mr tisztban kell lennnk azzal, hogyan lehet egy vagy tbb sort trlni egy tblbl akr az sszes sort, akr a WHERE zradk ltal meghatrozott sorokat. A legjobb mdja annak, hogy megismerkedjnk a DELETE utasts szles kr alkalmazsi terleteivel, hogy felsorolunk nhny problmt, amelyeket a fenti utastssal lehet megoldani, majd a Pldk rszben bemutatunk tbb pldt is. Az albbiakban lthat egy kis zelt az olyan tpus problmkbl, amelyeket a DELETE utastssal lehet megoldani: Trld azokat a termkeket, amelyekre soha nem adtak le rendelst! Trlj minden olyan eladt, akit soha nem szerzdtettek le! ,,Trld azokat a tekejtkosokat, akik egyetlen mrkzst sem jtszottak! ,,Trlj minden olyan hallgatt, aki nem iratkozott fel egyetlen rra sem! ,,Trlj minden olyan termkcsoportot, amelyhez nem tartozik termk! ,,Trld azokat a megrendelket, akik mg soha nem ktttek le egyetlen eladt sem! ,,Trld azokat a csapatokat, amelyekben egyetlen jtkos sem tallhat! ,,Trlj minden olyan rt, amelyre nem iratkozott fel egyetlen hallgat sem! ,,Trld azokat a vsrlkat, akik soha nem adtak le rendelst! ,,Trld azokat a zenei stlusokat, amelyekben egyetlen elad sem jtszik! ,,Trlj minden olyan tekemrkzst, amelyet mg nem jtszottak le! ,,Trld azokat a tantrgyakat, amelyekhez nem tartozik ra! ,,Trlj minden olyan rendezvnyt, amelyet mr az archv tblba msoltunk! ,,Trlj minden olyan tornaadatot, amelyet mr az archv tblba msoltunk! ,,Trlj minden olyan beszlltt, aki nem knl egyetlen termket sem! ,,Trld azokat a tagokat (eladkat), akik nem tartoznak egyetlen egytteshez (eladcsoporthoz) sem! ,,Trld azokat az alkalmazottakat, akik semmit sem adtak el!

Pldk
Most mr ismerjk a DELETE lekrdezsek felptsnek mdjt, lssunk ht pr pldt, amelyek kzl mindegyik egy vagy tbb sor trlst kri egy tblbl. A pldk a ngy mintaadatbzisbl szrmaznak. A pldkhoz azokat az adatokat is mellkeltk, amelyeket a DELETE utastsnak el kell tvoltania a cltblbl, s feltntettk a trlend sarok szmt is. A trlend sarok szmt jelz szm eltt kzvetlenl megjelen nv a lekrdezs neve, amelyen az a knyv CD-mel lkletn szerepel. Minden lekrdezst a megfelel adatbzisba tettnk (amint a pldnl ezt jelltk is); az ehhez a fejezethez tartoz lekrdezsek neve CH17 -tel kezddik. A pld kat a knyv elejn tallhat bevezets tmutatst kvetve tlthetjk be s prblhatjuk ki. Ne feledjk hogy a pldkban hasznlt minden tbla- s oszlopnv megfelel a mintaadatbzisok B fggelkben tallhat smalersnak. A lersok egyszerstse cljbl a Fordts s Tisztzs rszeket minden pldnl ssze vontuk. A pldk felttelezik, hogy az olvas ttanulmnyozta s megrtette a korbbi fejezetekben lert ismereteket.

Sales Orders adatbzis


Trld azokat a vsrlkat, akik soha nem adtak le rendelst! Fordts/ - Delete rows from the customers table Tisztzs where the customer ID is not in the (selection of the Customer ID from the orders) table
SQL

DELETE FROM Customers WHERE CustomerID NOT IN (SELECT CustomerID FROM Orders)

,,Trlj minden olyan beszlltt, aki nem knl egyetlen termket sem! Fordts/ - Delete rows from the vendors table Tisztzs where the vendor ID is not in (selection of vendor ID from the product vendors) table

SQL

DELETE FROM Vendors WHERE VendorID NOT IN (SELECT VendorID FROM Product_Vendors)

Entertainment Agency adatbzis


Trlj minden olyan eladt, akit soha nem szerzdtettek le! Fordts l/ - Delete rows from the entertainer members table Tisztzs where the entertainer ID is not in the (selection of entertainer ID from the engagements) table SQL DELETE FROM Entertainer_Members

WHERE EntertainerID NOT IN (SELECT EntertainerID FROM Engagements)

Fordts 2/ - Delete rows from the entertainers table Tisztzs where the entertainer ID is not in the (selection of entertainer ID from the engagements) table SQL DELETE FROM Entertainers

WHERE EntertainerID NOT IN (SELECT EntertainerID FROM Engagements)

Trlj minden olyan rendezvnyt, amelyet mr az archv tblba msoltunk! Fordts/ - Delete rows from the engagements table Tisztzs where the engagement ID is in the (selection of engagement ID from the engagements archive table) SQL DELETE FROM Engagements

WHERE EngagementID IN (SELECT EngagementID FROM Engagements_Archive)


Annak rdekben, hogy megtalljuk a trlni kvnt sorokat, elszr futtatnunk kell a CH16_Archive_Engagements lekrdezst, hogy tmsoljuk az adatokat az archv tblba. Az eredeti mintaadatbzisban szerepl archv tbla res.

School Scheduling adatbzis


Trlj minden olyan rt, amelyre nem iratkozott fel egyetlen hallgat sem! A sorokat elszr a Faculty_Classes, majd a Classes tblbl trljk, mivel az adatbzis egy psgi szably miatt nem engedi, hogy sorokat trljnk a Classes tblbl, ha illeszked sorok tallhatk a Faculty_Classes tblban.

Fordts 1/ - Delete from the faculty classes table Tisztzs where the class ID is not in the (selection of class ID from the student schedules) table SQL DELETE FROM Faculty_Classes

WHERE ClassID NOT IN (SELECT ClassID FROM Student_Classes)

Fordts 2/ - Delete from the classes table Tisztzs where the class ID is not in the (selection of class ID from the student schedules) table SQL DELETE FROM Classes

WHERE ClassID NOT IN (SELECT ClassID FROM Student_Schedules)

Bowling League adatbzis


,,Trld azokat a tekejtkosokat, akik egyetlen mrkzst sem jtszottak! A fenti lekrdezst gy oldhatjuk meg, ha trljk azokat a tekejt kosokat, akik nulla szm mrkzsen vettek rszt, illetve ha trljk azokat, akikhez nem tartozik sor a Bowler_Scores tblban. A msodik megolds biztonsgosabb, mivel nem fgg a lejtszott mrkzsek szmtott rtktl, de oldjuk meg a lekrdezst mind a ktflekppen. Fordts 1/ - Delete rows from the bowlers table Tisztzs where the bowler games bowled is = zero 0 SQL DELETE FROM Bowlers

WHERE BowlerGamesBowled = 0

Fordts 2/ Delete rows from the bowlers table Tisztzs where the bowler ID is not in the (selection of bowler ID from the bowler scores) table SQL DELETE FROM Bowlers

WHERE BowlerID NOT IN (SELECT BowlerID FROM Bowler_Scores)

Trld azokat a csapatokat, amelyekben egyetlen jtkos sem tallhat! Fordts/ - Delete from the teams table Tisztzs where the team ID is not in the (selection of team ID from the bowlers) table SQL DELETE FROM Teams

WHERE TeamID NOT IN (SELECT TeamID FROM Bowlers)

sszefoglals
A fejezetet a tblkbl sorok trlsre hasznlhat DELETE utasts rvid ismertetsvel kezdtk. Bemutattuk a DELETE utastsformjt, s egy egyszer pldn keresztl elmagya rztuk, hogyan kell egy tblbl minden sort trlni. Rviden ttekintettk a tranzakcikat, s bemutattuk, hogy a Microsoft Access adatbzisrendszer hogyan segt vdekezni a hibk ellen az egyes tranzakcik sorn. A tovbbiakban ismertettk a trlni kvnt sorok szmnak korltozsra szolgl WHERE zradk hasznlatt. Elmagyarztuk, hogyan kell a SELECT utastst a trlend sorok ellenrzsre hasznlni, s hogyan kell ezt az utastst DELETE utastss alaktani. Vgezetl alaposan krljrtuk a trlend sorok ellenrzsre szolgl allekrdezsek hasznlatt, ms tblkban ltez vagy nem ltez kapcsold sorokra alapozva, majd pldkon keresztl bemutattuk a DELETE lekrdezsek felptst. A fejezet befejez rszben nhny olyan krdst tesznk fel, amelyekre nllan kell vlaszt keresnnk.

nll feladatok
Az albbiakban a lekrdezsknt megfogalmazand krdsek s utastsok utn annak a lekrdezsnek a nevt lthatjuk a mintaadatbzisokbl, amelyikben megtalljuk a meg oldst. Ha gyakorolni szeretnnk, kidolgozhatjuk az egyes krdsekhez szksges SQL kdot, majd ellenrizhetjk a megoldst az adott mintaadatbzisokban tallhat lekrde zsekkel. Amg ugyanazt az eredmnyt kapjuk, ne aggdjunk, ha a sajt SQL-utastsunk nem egyezik pontosan a mintval.

Sales Orders adatbzis


1. Trld azokat a termkeket, amelyekre soha nem adtak le rendelst!

(Tipp: elszr a Product_Vendors, majd a Products tblbl kell trlnnk.) A megolds itt tallhat: CH17_Delete_Products_Never_Ordered_l (4 sor trlse) s CH17_Delete_Products_Never_Ordered_2 (2 sor trlse). 2. Trld azokat az alkalmazottakat, akik semmit sem adtak el! A megolds itt tallhat: CH17_Delete_Employees_No_Orders (1 sor trlse). 3. Trlj minden olyan termkcsoportot, amelyhez nem tartozik termk! A megolds itt tallhat: a CH17_Delete_Categories_No_Products (1 sor trlse).

Entertainment Agency adatbzis


1. Trld azokat a megrendelket, akik mg soha nem ktttek le egyetlen

eladt sem! A megolds itt tallhat: CH17_Delete_Customers_Never_Booked (2 sor trlse). 2. Trld azokat a zenei stlusokat, amelyekben egyetlen elad semjtszik! A megolds itt tallhat: CH17_Delete_Styles_No_Entertainer (8 sor trlse). 3. Trld azokat a tagokat (eladkat), akik nem tartoznak egyetlen egytteshez (eladcsoporthoz) sem! A megolds itt tallhat: a CH17_Delete_Members_Not_In_Group (nincs sortrls).

School Scheduling adatbzis


1. Trlj minden olyan hallgatt, aki nem iratkozott fel egyetlen rra sem!

A megolds itt tallhat: CH17_Delete_Students_No_Classes (1 sor trlse).


2. Trld azokat a tantrgyakat, amelyekhez nem tartozik ra!

(Tipp: mind a Faculty_Subjects, mind a Subjects tblbl kell sorokat trlnnk.) A megolds itt tallhat: CH17_Delete_Subjects_No_Classes_l (6 sor trlse) s CH17_Delete_Subjects_No_Classes_2 (3 sor trlse).

Bowling League adatbzis


1. Trlj minden olyan tornaadatot, amelyet mr az archv tblba msoltunk!

(Tipp: a Bowler_Scores, Match_Games, Tourney_Matches s Tournaments tblkbl kell sorokat trlnnk. Egyetlen trlsre kijellt sort sem szabad tallnunk, hacsak nem hajtottuk vgre a 16. fejezetben szerepl ngy archv lekrdezst.)

A megolds itt tallhat: CH17_Delete_Archived_2007_Toumaments_l 0344 sor trlse), CH17_Delete_Archived_2007_Tournaments_2 (168 sor trlse), CH17_Delete_Archived_2007_Tournaments_3 (57 sor trlse) s CH17_Delete_Archived_2007_Tournaments_4 (14 sor trlse). 2. Trlj minden olyan tekemrkzst, amelyet mg nem jtszottak le!" A megolds itt tallhat: a CH17_Delete_Matches_Not_played (1 sor trlse).

Fggelkek

Az SQL-szabvnynak megfelel diagramok


Az albbiakban megtallhatjuk a knyvben trgyalt sszes SQL-utasts teljes szintaxisdiagramjt.

A mintaadatbzisok smja
Sales Orders adatbzis

Entertainment Agency adatbzis

School Scheduling adatbzis

Bowling League adatbzis

Recipes adatbzis

Dtum- s idfggvnyek
Amint azt az 5. fejezetben emltettk, az adatbzisrendszerek a legklnflbb fggv nyekkel rendelkeznek, amelyeknek a segtsgvel dtum- s idrtkeket krdezhetnk le, illetve mdosthatunk. Az SQL-szabvny hrom fggvnyt hatroz meg: a CURRENT_DATE, CURRENT_TIME s CURRENT TIMESTAMP fggvnyeket, de nem minden kereskedelmi forgalomban lv adatbzisrendszer tmogatja mind a hrmat. Hogy a sajt adatbzisrendszernkben knnyebb legyen dtum- s idrtkekkel dolgoz ni, sszelltottunk egy a fbb adatbzisrendszerekre vonatkoz fggvnylistt A fgge lkben tallhat listk a fggvny nevt s rvid lerst tartalmazzk; az egyes fggv nyek sajtos utastsformjt az adatbzis-kezelnk dokumentcijbl tudhatjuk meg.

IBM DB2

Microsoft Office Access

Microsoft SQL Server

MySQL

Oracle

Ajnlott irodalom
Ajnlott irodalom
Az albbi knyveket ajnlatos elolvasni, ha tbbet szeretnnk megtudni az adatbzis-ter vezsrl, vagy bvteni akarjuk az SQL-lel kapcsolatos ismereteinket. Tartsuk szem eltt, hogy szakmaibb jellegnl fogva nhny knyv nagy kihvst jelenthet a szmunkra, egyes szerzk pedig igen jelents httrtudst feltteleznek a szmtgpek, az adatbzi sok s a programozs tern.

Adatbzisokrl szl knyvek


Connolly, Thomas s Begg, Carolyn: Database Systems: A Practical Approach to Design, Implementation, and Management (4. kiads). Essex, Anglia, Addison-Wesley, 2004. Date, C. J.: An Introduction to Database Systems (8. kiads). Boston, MA, Addison-Wesley, 2003. Database in Depth: Relational Theory for Practitioners. Sebastopol, CA: OReilly Media, 2005. Hernandez, Michael J.: Database Design for Mere Mortals (2. kiads). Boston, MA, Addison-Wesley, 2003. (Magyarul: Adatbzis-tervezs: A relcis adatbzisok alapjairl fldi halandknak. Kiskapu, 2004.)

Az SQL-rl szl knyvek


Bowman, Judith S., Emerson, Sandra L. s Damovsky, Marcy: The Practical SQL Handbook (4. kiads). Boston, MA, Addison-Wesley, 2001. Celko, Joe.: Joe Celko's SQL for Smarties: Advanced SQL Programming (3. kiads). San Francisco, CA, Morgan Kaufmann Publishers, 2005. (Korbbi kiads magyarul: SQL felsfokon Kiskapu, 2002.) Date, C. J. s Darwen, Hugh: A Guide to the SQL Standard (4. kiads). Reading, MA, Addison-Wesley, 1997. Gruber, Martin: SQL Instant Reference (2. kiads). Alameda, CA, Sybex Inc., 2000. (Magyarul: SQL A-tl Z-ig. Kiskapu, 2003.) Melton, Jim s Simon, Alan R.: Understanding the New SQL A Complete Guide. San Francisco, CA, Morgan Kaufmann Publishers, 2006.

Trgymutat
A,
Access 26, 483 adat 66 adatbzis 3 adatbzisok elmlete 15 adatbzisok fajti 3 adatbzisok tervezse 15 adathalmaz 489 adatok beszrsa 489 adatok csoportostsa 395 adatok feldolgozsa 67 adattpus 94 adattpusok megvltoztatsa 97 alhzs 150, 152 alaprtelmezett rtk 486 alaprtelmezett kitlt karakter 140 alaptblk 9 alrendelt tbla 37 ALL 305, 306, 345,430 lland rtkek 99 allekrdezs 77, 330, 336, 385, 405, 459 allekrdezsek 340, 352, 384, 430, 464 allekrdezsek hasznlata szrknt 352 allekrdezsek oszlopkifejezsknt 332 allekrdezst alkalmaz UPDATE utasts 464 llts 66, 134, 430 lnv 116 lnevek 225, 227 loszlop 488 als hatr-144 and 19, 28, 158, 161 ANSI 50 ANSI NCITS-H2 55 ANSI/ISO szabvny 51 ANY 345, 430 aposztrf 99, 165 archv sorok 513 archivl! adatok 493 rva rekord 9, 39 rva sorok 279 AS 115, 116, 226 ASC79 ASCII 95, 138 ASYMMETRIC 145 talakts 99 tlag kiszmtsa 378 attribtum 64 AUTO_INCREMENT 488 AutoNumber 488 AVG 378, 385 azonos nev oszlopok 219 azonosts 34 azonostkdok 458

B
begyazott SQL 52 belp szint SQL 53 bentrl kifel 109 beszrs 484 betsz 19, 27 BETWEEN 135, 147, 169, 430 BETWEEN ... AND 144 bicikli 196, 208 biciklik s buksisakok 214 BIGINT 95 binris adatok 95 BINARY95 BINARY LARGE OBJECT 95 BIT 95, 96 BIT VARYING 95 bizonyos sorok trlse 510 BLOB 95 BOOLEAN 96 bvts 54 bvtett adattpus 97 buksisak 196, 208 bntetpontszm 476

COMMIT 456, 510 CONCAT 104 CORRESPONDING 307 COUNT 334, 373, 374, 435 COUNT DISTINCT 420 COUNT 335, 374, 375, 577, 401, 430 COUNT(rtkkifejezs) 375, 401 CPK37 CURRENCY97 CURRENT TIMESTAMP 539 CURRENT_DATE 539 CURRENT_TIME 539 csillag 73, 150, 374 csonkols 98 csoport 398 csoportosts 399, 425 cskken sorrend 79

D
Database 2 50 DATE 96, 111 DATE kulcssz 102 DATETIME 112 dtum 96 dtum- s idrtkek 539 dtum- s idmveletek 104, 110 dtum-id literlok 101 dtumkifejezsek 110, 118 dtumliterl 101 DB2 5, 50 dBase 5 dBase IV 57 DEC 95 DECIMAL 95 DEFAULT 486 DELETE 507, 508 DESC 79 Descartes-szorzat 221, 264 dinamikus adatok 3 direkt szorzat 264

C,Cs
Call-Level Interface 54 CAST 97, 106, 109 clcsoport 426 CHAR 95 CHAR LARGE OBJECT 95 CHAR VARYING 95 CHARACTER 95 CH^^CTER LARGE OBJECT 95 CHARACTER VARYING 95 clause 65, 134 CLI 54 CLOB 95 Codd4 Cold Fusion 5

DISTINCT 74, 75, 239, 241, 312, 320, 335, 343, 376, 377, 381, 407 DOUBLE PRECISION 96

E,
EBCDIC 95, 139 egy-a-sokhoz 10 egy-a-tbbhz 10, 11 egy-a-tbbhz kapcsolat 38 egy-az-egyhez 10 egy-az-egyhez kapcsolat 37 egyed 6 egyedi pldny 7 egyedi sorazonostk 97 egyenlsg 140 egyenlsgvizsglat 460 egyenltlensg 140 egyes szm 20 egyestend halmazok 204 egyez rtkek keresse 236, 247 egymsba gyazott mveletek 108 egymst tfed tartomnyok 169 egyszer elsdleges kulcs 34 egyszer sszehasonlt llts 337 egyszer SELECT utastsok 306 egyszer uni 307 egyszer UPDATE utasts 452 egyszer WHERE zradk 510 egy-tbb kapcsolat 278 elem 190 elemz adatbzisok 3 eltag 19 elsbbsgi sorrend 166 elsdleges kulcs 6, 7, 8, 29, 34, 210, 218, 488 elsdleges tbla 10 elsrend prediktumlogika 5 eltr hosszsg karakterlncok 140 Entry SQL 53 eredmnyhalmaz 67 eredmnyhalmazok klnbsge 199

eredmnyhalmazok metszete 193 eredmnyhalmazok unija 205 eredmnyoszlop 309 rtkad utasts 453 rtkek beszrsa 485 rtkek sszeszmllsa 375 rtkkifejezs 464 rtkkifejezsek 119 rtkkifejezst tartalmaz SELECT utasts 120 rtktartomny 96 ESCAPE 152 esemny 6 Euler 194 EXCEPT 197, 200, 203, 211, 212 EXISTS 349, 430, 513 exponencilis szmok 96

F
false 96 feloldatlan kapcsolat 13 feloldatlan tbb-a-tbbhz kapcsolat 12 feloldott tbb-a-tbbhz kapcsolat 13 fels hatr 144 felttelek elsbbsge 166 felttelek kirtkelse 165 felttelek zrjelezse 167 FIPS 54 FK37 FLOAT 96 frissts 451 frissthet 508 frissthet nzettbla 508 FROM 66, 218, 223, 398, 508 FULL OUTERJOIN 282, 285, 299 Full SQL 53 fggvny 64

G
GROUP BY 66, 398, 405, 411

H
halmaz 190 halmazdiagram 194 halmazelmlet 4 halmazmveletek 191, 207 halmazok egyestse 213 halmaztagsg 340 hamis 96, 457 hatrol karakterek 102 hatrolt azonost 20, 28 HAVING 66, 426, 430 HAVING COUNT 433 helyes szerkezet 28 helyettest karakter 73, 150, 152, 512 hinyz rtkek 121, 287 hivatkozsi psg 39, 51 hivatkozsi psgi szably 509 hosszrtk 106

INNER JOIN 218, 221, 235, 236 INSERT 483, 485 INSERT ... VALUES 484 INSERT INTO 485 INT 95, 96 INTEGER 95 Intermediate SQL 53 INTERSECT 195, 208 INTERVAL 97, 111 IS NULL 135, 153, 430 ismeretlen rtk 34 ismeretlen rtkek 121, 153 ismtld sorok 241 ISO 51

J
jellemz 6, 64, 190, 192 jellemzk 199 jelsorrend 78, 335 JOIN 196, 217, 461, 509 JOIN begyazsa JOIN-ba 2 29 JOIN utastsok egymsba gyazsa 272 JOIN zradkok sorrendje 234 jvhagys 456 jvhagysi pont 456

IBM 48 IBM DB2 483, 539 idegen kulcs 8, 37, 218 Identity 488 id 966 idblyeg 96 idblyeg-literl 101 idkifejezsek 112 idkz 94 idkz-literl 103 idliterl 101 idtartomny-literl 103 igaz 96, 457 IN 135, 148,340,430,460, 513 informci 66 informcik rendezse 77 INGRES 5, 49, 51

K
kapcsolat 10 kapcsolati szablyok 39 kapcsolatok37, 234 kapcsolatok kvetkezetessge 39 kapcsol tbla 12, 25, 32, 38 kapcsold sorok keresse 235 karakteres adattpus 95 karakterlnc 95 karakterlnc-literl 99 karakterlncok sszehasonltsa 138 karaktersorrend 138 krdjel 150

kerekts 109, 470 krelmek lefordtsa SQL-re 68 keressi felttel 134, 137, 221, 491 kereskedelmi megvalstsok 57 kettnl tbb tbla egyestse 275 kettskereszt 150 kirtkelsi sorrend 107, 165, 167 kifejezs 94 kifejezsek elnevezse 115 kifejezsek hasznlata 113 kifejezsek tpusai 104 kifejezseken alapul csoportosts 410 kiknyszerts 43 kimeneti oszlop 336 kimeneti oszlop neve 308 kimeneti oszlopot elllt allekrdezsek 352 kiold 37, 44, 465 kis- s nagybetk 151 kisebb mint 142 kisebb vagy egyenl 144 kivlasztott sorok mdostsa 453 kivve 141 kivons 107, 197 konkrt rtkek meghatrozsa 99 korltozsok 408 korltoz trlsi szably 39 korrelcis nv 269 kzelt szm 96 kzpszint SQL 53 kulcs megsrtse 510 kulcsmezk 285 kurzor 77 klnbsg 191, 197, 211, 212 klnbsgkpzs 197, 202, 268 kls sszekapcsols 202, 261

lekrdezs 9, 64, 81 ltezst kifejez llts 349 LIKE 135, 150, 152, 430 literlis rtkek 999 literlis kifejezsek 373 logikai adattpus 9)6 logikai tbla 218

M
msodlagos tbla 10 msolt mezk 29 matematikai kifejezs 104 matematikai kifejezsek 107, 117 334, 380, 381 megfelel sorok trlsnek biztostsa 511 megktsek 408 megszorts 44, 509 MEM0 95 ments 81 mentett lekrdezs 9 mentett SELECT utastsok 81 mennyisgi llts 348 mennyisgi lltsok 345 mret 95 mestersges elsdleges kulcs 36 metszet 191, 210 metszetkpzs 192, 194 mez 6, 7, 64, 190 mezk finomhangolsa 18 meznevek 19 Microsoft Access 57, 456, 483 Microsoft Office Access 81, 509 Microsoft SQL Server 81, 488 MIN 381 minden sor trlse 509 minstett oszlopnevek 220 mintailleszts 135, 149, 430 mintaillesztsi felttel 149 mintakarakterlncok 150 mdostand sorok ellenrzse 455 MONEY97

L
LEFT OUTER JOIN 263, 271 legkisebb rtk 381 legnagyobb rtk 335, 380

mveletek egymsba gyazsa 108 mveleti adatbzisok 3 MySQL 5, 102, 483, 488

O,
objektum 6 ODBC 54 ON 221, 264, 269, 272, 509 optimalizl eljrsok 169 orl9, 28, 159, 161, 174, 445 Oracle 5, 49, 483, 488 Oracle 8i 5 ORDER BY 77, 78, 204, 246, 314 oszlop 64, 190 oszlophivatkozsok 219 oszlopkifejezs 352 oszlopnevek 308, 485 oszlopnvlista 500 oszlopok sorrendje 72 oszlopokra vonatkoz megktsek 408 oszlopsorrend 80 oszts 107 OUTER JOIN 202, 261, 268, 286, 403 sszeads 107 sszeegyeztethet 9)7 sszefzs 104 sszefz kifejezs 104 sszefz kifejezsek 114 sszeg kiszmtsa 377 sszegz oszlop 464 sszehasonlts 135, 137, 430 sszehasonlthat 305 sszehasonlt llts 137 sszehasonlt felttel 161 sszekapcsols 196, 217 sszekapcsolt oszlopok 219 sszes oszlop lekrse 73 sszest fggvnyek 334, 371, 384, 385, 398, 399 sszetett elemek 198 sszetett elsdleges kulcs 8, 12, 34, 38 sszetett matematikai kifejezsek 108 sszetett SELECT utastsok 309 sszevont keressi felttel 158

N
nagyobb mint 142 nagyobb vagy egyenl 143 NATIONAL CHAR 95 NATIONAL CHAR VARYING 95 NATIONAL CHARACTER 95 NATIONAL CHARACTER LARGE OBJECT 95 NATIONAL CHARACTER VARYING 95 NATURAL JOIN 224, 269 NCHAR95 NCHAR LARGE OBJECT 95 NCHAR VARYING 95 NCITS 55 NCLOB 95 ngyszgletes pecket dugni kerek lyukba 98 nem egyenl 142 nem rtelmezhet rtkek 12 2 nemzetkzi karakteres adattpus 95 nv 18 NEXTVAL 488 nzettbla 9, 64, 485 NOT 155, 163, 165 NOT EXISTS 513 NOT IN 513 nvekv sorrend 79 NTEXT95 Null 120, 123, 153, 171, 174, 262, 282 NULL rtkek 375 Null felttel 153 NULL kulcssz 486 nulla 121 nulla hosszsg karakterlnc 121 NUMERIC 95

p
Paradox 5 PK37 PL/SQL 65 pontos szm 95 pontossg 95 predicate 135 prediktum 66, 135, 430

S, Sz
SAA 54 search condition 135 SELECT 63, 65, 113, 489 SELECT DISTINCT 407 SELECT kifejezs 64, 332 SELECT kifejezst tartalmaz INSERT utasts 489 SELECT lekrdezs 64, 77 SELECT lekrdezs talaktsa DELETE utastss 512 SELECT utasts 64, 65 SELECT utasts begyazsa 269 SELECT utastsok begyazsa 227, 228 semmi 120 SEQUEL 48 SEQUEL/2 48 SEQUEL-XRM 48 Sequence 488 SERIAL 97 SET 452, 464 skalris allekrdezs 77, 330, 331, 332 SMALLINT 95 sok-a-sokhoz 10 SOME 345, 430 sor 64, 190 sorallekrdezs 330 sorcsoportok 398 sorrtkkonstruktor 330 sorismtls 74 sorok kizrsa 155, 163 sorok szma 335 sorok szrse 458 SQL 48 SQL Access 54 SQL Server 5 SQL/86 51 SQL/89 52 SQL/92 52 SQL/Data System 50

Q
QUEL 49, 51

R
R:BASE 5, 57 RDBMS 49 REAL 96 rejtett tbbrszes mez 24 rekord 6, 7, 64, 190 relci 5, 6, 64 relcis adatbzis 4 relcis adatbzisok 3 relcis adatbzisprogramok 5 relcis modell 4, 47 Relational Software 49 rendezs 78, 314 rendezsi sorrend 80 rszhalmazok 396 rszlegesen megfeleltetett informci 287 rszletez sorok 464 rszsszegek 395 rszvtel mrtke 42, 43 rszvtel tpusa 40 . RIGHT OUTER JOIN 263 ROLLBACK 456, 510 ROUND 422, 470 ROWID 97 rvidts 19, 27, 73

SQL/DS 50 SQL-szabvnyok 54 SQUARE 49 START TRANSACTION 456 statikus adatok 4 strukturlt lekrdeznyelv SUM 377 Super Base 57 Sybase Enterprise Application Studio 5 SYMMETRIC 145 System R5, System/R szablyos azonost 20, 28 szabvny 50 szmtott rtk 512 szmtott mez 21, 29 szmtott mezk 22 szmtott oszlop 115, 332, 464 szmtott oszlopok elnevezse 116 szmlls 374 szmliterlok 101 szmtani kzp 378 szrmaztatott oszlop 115 szrmaztatott tbla 227, 509 szzalkjell50 szlsrtk 381 szerkezet 18 szinonima 71 szorzs 107 szrs 134, 337 szrs allekrdezsekkel 337 szr 430 szrk 384 szl-gyermek kapcsolat 279 szltbla 220

T
tbla (54 tbla elsdleges kulcs 213 tbla-allekrdezs 330, 331 tblahivatkozs 283, 398, 491

tblk 6 tblk finomhangolsa 16 tblk szerepe 40 tblakapcsolatok 37 tagsg 135, 148, 430 trolt eljrs 64 tartomny94, 135, 144, 430 tartomnyfelttel 144 teljes SQL 53 termszetes sszekapcsols 224, 269 TEXT 95 TIME 96 TIME kulcssz 102 TIMESTAMP 9)6 TIMESTAMP kulcssz 103 TINYINT 96 tizedestrtek 96 TOP 81 tbb felttel 157 tbb fggvny 382 tbb oszlop 11 tbb oszlop mdostsa 457 tbb oszlop szerinti rendezs 80 tbb UNION mvelet 313 tbb-a-tbbhz 10, 12, 25 tbb-a-tbbhz kapcsolat 38 tbbrtk mez 10, 19 tbbrtk mezk 14 tbbes szm 20, 18 tbbrszes mez 21 tbbrszes mezk feloldsa 11 tbbszint trlsi szably 40 tbbszr szerepl mezk 19 tmb 11 trls 507 trlsi szably 39 trlni kvnt sorok ellenrzse 511 Transact-SQL 65 tranzakcik 456 tranzakcik egymsba gyazsa 456 tranzakcinapl 509 trigger 37, 465

true 96, 239 tuple 6, 64

U,
uni 191, 203, 206, 215, 303 unik rendezse 314 UNION 203, 206, 213, 303, 306, 316 UNION AL 204, 305, 320 UNION JOIN 286 updatable 508 UPDATE 451, 461, 464, 466 USE 484 USING 221, 224, 264, 268 gyfl-kiszolgl rendszerek 5 res halmaz 435

vgrehajtsi sorrend 107 Venn-diagram 194 virtulis tbla 9 Visual Studio 5 visszagrgets 456

w
WHERE 66, 136, 232, 267, 337, 385, 405,430,452,508,510 WHERE zradk 133

x
X/OPEN 54 X3 50 X3H2 50

v
VALUES 485, 486 VARCHAR 95 vdkarakter 152 vglegests 456 vgrehajts 81

z
zradk 65, 134 zr res karakterek 140 zrjelek 108 zrjelezett keressi felttelek 167

Das könnte Ihnen auch gefallen