Adatbázisok I Az SQL nyelv SQL (Structured Query Language) Deklaratív nyelv, 1974-ben publikálták Halmaz orientált megközelítés, a relációs algebra műveleteinek megvalósítására Előzménye a SEQUEL (IBM)(Structured English Query Language) Codd., 1971 Strukturált, Angolnyelvre épülő Lekérdező nyelv 2
SQL nyelv Relációs adatmodellen alapuló Szabványosított nyelv 1986 SQL86 1989 SQL89 1992 SQL92 SQL:1999 SQL:2003 SQL:2006 SQL:2008 Kiterjed az adatkezelő tevékenységekre: Adatdefiniáló(DDL) Adatkezelő(DML) Lekérdező(DQL) Vezérlő(DCL) 3 SQL nyelv Descriptív, leíró, a műveleti lépéseket kell megadni Magasszintű parancsok Nem tartalmaz vezérlési, IO elemeket Halmazorientált Bővülő nyelv Van interaktív és beépülő változata NEM adatbázis kezelő rendszer, az adatbázis kezelő integráns része Nem tartalmaz algoritmikus elemeket 4
SQL felhasználási lehetőségei Fejlesztőeszközökbe beépítve (űrlap, jelentés) CASE eszközök Alkalmazásgenerátorokban pl. unipaas Interaktív felhasználás (SQL konzol) Ad hoc lekérdezések adatbázis karbantartás Más programnyelvekbe beépítve procedurális nyelvekben (pl. C, C#, C++, Java, Php, stb.) adatbázis-kezelők saját procedurális kiegészítőibe (PL/SQL) SQL szkriptek 5 SQL szintakszisa Az SQL nyelvben egyetlen parancs, a SELECT parancs szolgál az adatok lekérdezésére alkalmas a relációs algebra minden műveletének a leképzésére SELECT projekciós rész FROM alaptáblák WHERE szelekciós rész GROUP BY csoportképzőkif. HAVING csoportszűrő feltétel ORDER BY mezőlista [ASC DESC] ; 6
Szelekciós feltétel A feltétel megfogalmazásánál használható operátorok: relációs operátorok (=,!=, <, >,!<,!>, <>, <=, >=) algebrai operátorok (+,-,*,/) logikai operátorok (AND, OR, NOT) o1 [NOT] BETWEEN o2 AND o3:az o1 érték az o2 és az o3 közéesik o1 [NOT] IN (o2 [,o3,...,oi]): az o1 érték a megadott értékhalmazba esik o1 [NOT] LIKE 'ss' [ESCAPE 'x']: az o1 sztringhasonlítása a mintához, ahol %: tetszőleges karaktersorozatot helyettesít _: egyetlen egy karaktert helyettesít o1 IS [NOT] NULL: annak vizsgálata, hogy az o1 üres-e 7 AUTO Példa relációk TUL RSZ TIP SZIN EVJ AR 1 BKX-720 Opel Bordó 1991 1000000 1 CMT-111 Golf Piros 1981 350000 2 AAA-156 Trabant Fehér 1985 100000 3 LUI-999 Opel Kék 1991 450000 1 KJS-234 Lada Kék 1989 275000 EMBER ID NEV SZULEV CIM 1 Béla 1975 Budapest 2 Géza 1979 Miskolc 3 Feri 1974 Pécs 8
Példák Autók rendszámai: Emberek neve és címe: SELECT rsz FROM auto; SELECT nev, cím Eredmény: FROM ember; Eredmény: RSZ BKX-720 CMT-111 AAA-156 LUI-999 KJS-234 NEV CIM Béla Budapest Géza Miskolc Feri Pécs 9 Példa Az emberek minden adatát listázzuk ki: SELECT * FROM ember; Eredmény: ID NEV SZULEV CIM 1 Béla 1975 Budapest 2 Géza 1979 Miskolc 3 Feri 1974 Pécs A * karakter jelöli, hogy minden mezőre kíváncsiak vagyunk 10
Példa Az autó típusok listája: SELECT tip FROM auto; TIP Opel Golf Trabant Opel Lada Lista ismétlés nélkül: SELECT DISTINCT tip FROM auto; TIP Opel Golf Trabant Lada 11 Al lekérdezések (Al-SELECT) az SQL támogatja azt a lehetőséget, hogy a szelekciós feltételben nemcsak létező, letárolt adatelemekre hivatkozzunk, hanem számított kifejezéseket is alkalmazhassunk a számítást egy másik SELECT utasítással tudjuk megadni tehát az egyik lekérdezés szelekciós feltételében hivatkozunk egy másik lekérdezés eredményére az al-lekérdezéstmindig zárójelben kell megadni, hogy elemei elkülönüljenek formailag megegyezik a normál SELECT utasítással (kivétel:al- SELECT-ben nem lehet rendezni) 12
Az Al-SELECT operátorai Az al-lekérdezéseredményétől függően különbözőoperátorokat kapcsolhatunk az al-select-hez: ha az eredmény egy rekord: skalár operátorok (relációs operátorok) használhatók ha az eredmény több rekord: halmazoperátorok (IN, ANY, ALL, EXISTS) használhatók SELECT FROM WHERE m IN (al-select); SELECT FROM WHERE m (relop) ANY (al-select); SELECT FROM WHERE m (relop)all (al-select); SELECT FROM WHERE EXISTS (al-select); (relop): tetszőleges relációs operátor ANY : a halmaz bármely eleméhez hasonlít, ha egyet talál igazzal tér vissza ALL : a halmaz minden eleméhez hasonlít, ha akár egyre nem teljesül hamisat ad vissza EXISTS : az eredményhalmaz üres-e (ha üres, akkor hamissal tér vissza) 13 Példák al-select-re Annak az autónak a rendszáma, amelynek ára kisebb mint valamely piros autó ára: SELECT rszfrom autówhere ár < ANY (SELECT ár FROM autó WHERE szin= piros ); A piros autók áránál kisebb áru autók rendszáma: SELECT rszfrom autówhere ár < ALL (SELECT ár FROM autó WHERE szin= piros ); Azok az emberek, akiknek nincs autójuk: SELECT e.név, e.cím FROM ember e WHERE NOT EXISTS (SELECT * FROM autó a WHERE a.tulaj=e.id); SELECT név FROM ember WHERE ID NOT IN (SELECT tulfrom autó); 14
Példák al-select-re Írassuk ki a kék színűautótulajdonosainak nevét: SELECT név, cím FROM ember WHERE idin(select tul FROM auto WHERE szin= kék ); NEV Béla Feri CIM Budapest Pécs 15 Összesített, aggregált értékek Csoportokra képeznek egyértékű mezőt. Min(k) Max(k) AVG(k) SUM(k) COUNT(k) 16
SQL Feladatok Tantárgy Oktató tkód cím kredit oktató okód Név tanszék fizetés N:M 17 SQL Feladatok 1. Adjuk meg az oktatók nevét névsorba rendezve: SELECT név FROM oktató ORDER BY név; 2. Az Oktatók összes adata, fizetésük csökkenő sorrendjében: SELECT * FROM oktató ORDER BY fizetés DESC; 3. A Matematika tanszéken oktatók neve: SELECT név FROM oktató WHERE tanszék='matematika'; 18
Feladatok 4. Az 5 kreditnél többet érőtantárgyak kódja és címe: SELECT tkód, cím FROM tantárgy WHERE kredit>5; 5. Azoknak az oktatóknak a neve, akiknek nincs tantárgya: SELECT névfrom oktatówhere okódnot IN (SELECT oktató FROM tantárgy); 6. Azoknak az oktatóknak a neve, akiknek nincs 5 kreditnél többet érő tantárgya: SELECT névfrom oktatówhere okódnot IN (SELECT oktató FROM tantárgy WHERE kredit>5); 19 Feladatok 7. Az átlagos kreditpontszám: SELECT avg(kredit) FROM tantárgy; 8. A Matematika tanszéken oktatók létszáma: SELECT count(*) FROM oktató WHERE tanszék= Matematika ; 9. A legnagyobb kreditpontszámútantárgyak címe: SELECT cím FROM tantárgy WHERE kredit = (SELECT max(kredit) FROM tantárgy); 20
Feladatok 10. Tanszékenként az oktatók létszáma: SELECT tanszék, count(*) FROM oktató GROUP BY tanszék; (+létszám szerint csökkenőbe rendezve: ORDER BY count(*) DESC;) 11. Saját tanszékükre jellemző átlagnál kevesebbet kereső oktatók neve: SELECT o1.név FROM oktató o1 WHERE o1.fizetés < (SELECT avg(o2.fizetés) FROM oktató o2 WHERE o1.tanszék=o2.tanszék); 12. Tanszékek listája ismétlődés nélkül: SELECT DISTINCT tanszék FROM oktató; 21 SQL Feladatok 13. A 150 és 220 eftközött keresőoktatók: SELECT * FROM oktató WHERE fizetés BETWEEN 150000 AND 220000; VAGY: SELECT * FROM oktató WHERE fizetés >= 150000 AND fizetés <= 220000; 22
Ellenőrző feladatok 1. Írassuk ki azokat az autókat, amelyek ára az átlagár alatt van. 2. Írassuk ki a legidősebb autórendszámát, típusát és évjáratát 3. Írassuk ki az autók összértékét! 23