Az Oracle SQL 1. Az első lépések
Történelem 1. E. F. Codd, 1970: relációs adatmodell ("A Relational Model of Data for Large Shared Data Banks", Communications of the ACM) P. Chen, 1976: kiterjeszti a kulcsok halmazelméleti leírásával IBM, 1976: adatbázisgép tervének közzététele Alapja az „R” adatbázis Kidolgozói Codd és Chen
Célkitűzések IBM-nél A tárolás módja és a logikai adatszerkezet független legyen egymástól Külön adatbázisnyelv, ami szabványosítja az adatszerkezet definiálását az adatok kezelését az adatok biztonságára vonatkozó előírásokat Az adatkezelő utasítások az „adatbevitel - módosítás - törlés” logikáját követik, a fizikai műveleteket elrejtik Munkájuk eredménye a SEQUEL nyelv (Structured English Query Language) tervezői: D. D. Chamberlin, R. F. Boyce
Történelem 2. A SEQUEL név később SQL-re rövidül Hosszú csend, nincs jelentős fejlesztés az IBM-nél (védik a piacon lévő termékeiket?) Relational Software, 1979: az SQL első, kereskedelemben hozzáférhető megvalósítása Új cégek jelennek meg saját relációs adatbáziskezelővel és SQL-lel: 1983: Oracle (adatbáziskezelőjük: Oracle) 1984: Relational Co. (adatbáziskezelőjük: Informix)
Történelem 3. 1986: ANSI szabvány az SQL alaputasításaira (SQL-86, vagy SQL-1) 1987: ISO szabvány az SQL alaputasításaira (SQL-87) Új cégek, növekvő verseny, az IBM is erősít 1989: második ISO szabvány az SQL-re, újabb területeket szabványosít (SQL-89) 1992: harmadik ISO szabvány az SQL-re (SQL-92, vagy SQL-2)
Történelem 4. 1996: a tárolt eljárások és függvények szabványosítása 1999: ISO szabvány (SQL-1999, vagy SQL-3) 2003: ISO szabvány (SQL-2003) 2006: ISO szabvány (SQL-2006) A szabványok kompromisszumok, csak a meglévő gyakorlatot szentesítik! Minden megvalósítás tartalmaz eltéréseket!
Illik tudni... Az Oracle egy cég neve, 1983-ban alakult Többféle programtermékük is van Ezek közül a legismertebb az Oracle adatbázis-kezelő Különböző operációs rendszerekre létezik Az idők során több verziója is elkészült Mi az Oracle 9i-t használjuk
Ismerkedési lehetőségek Kipróbálás céljából a teljes rendszer letölthető ingyenesen az Oracle honlapjáról (www.oracle.com) A teljes (angol nyelvű) dokumentáció elérhető az Interneten több helyen is Nálunk a címe: http://www.ttk.pte.hu/oracle/ Az Oracle Press és az O’Reilly könyvei
A „gyári” dokumentáció fontosabb könyvei Error Messages Master Glossary Master Index SQL Reference SQL*Plus User’s Guide and Reference
Az SQL nyelv bemutatása
Az Oracle adatbázis csak SQL nyelvű utasításokkal érhető el! Az SQL jelentősége Az Oracle adatbázis csak SQL nyelvű utasításokkal érhető el!
Az SQL nyelv fontosabb formai jellemzői A kulcsszavakban nincs különbség a kis- és nagybetű között select, Select, SELECT egyenértékű Az utasítások végén pontosvessző van Az utasítások szabadon széttörhetők több sorra
Az utasítások szerkezete Követik a beszélt nyelv logikáját, kiolvasva értelmes, kerek angol mondatokat kapunk Az utasítások szakaszokra (záradék, clause) oszthatók minden szakaszt jellemző kulcsszó vezet be az egyes szakaszok pontosítják az utasítás tárgyát és a végrehajtás feltételeit
Példa SQL utasításra SELECT vevokod, nev1, telefon FROM vevok alaputasítás SELECT vevokod, nev1, telefon FROM vevok WHERE nev1 LIKE ‘K%’ ORDER BY nev1, vevokod; WHERE- szakasz: válogatás ORDER BY szakasz: a rendezés megadása
Az utasítások fajtái Adatdefiníciós: CREATE, ALTER, DROP DDL, data definition language Adatkezelési: SELECT, INSERT, UPDATE, DELETE DML, data manipulation language Adatbiztonsági: GRANT, REVOKE DCL, data control language Kiegészítő utasítások az egyes megvalósításokban a tárolás előírása az adatmentés és a visszatöltés elvégzése a működés körülményeinek beállítása
Create Adatbázis objektum létrehozása CREATE TABLE Szamla ( Szamlaszam NUMERIC(24), Tulajdonos VARCHAR(60), Nyitas DATE, Allapot VARCHAR(1), PRIMARY KEY (Szamlaszam) );
Alter Adatbázis-objektum módosítása ALTER TABLE Szamla MODIFY Szamlaszam VARCHAR(26);
DROP Egy adatbázisbeli objektum (index) megszüntetése DROP INDEX Szamla_1; Egy adatbázisbeli objektum (tábla) megszüntetése DROP TABLE egy_tabla;
COMMENT Megjegyzést fűz egy adatbázis-objektumhoz COMMENT ON TABLE Szamla IS 'Ügyfelek bankszámlaszámai'; COMMENT ON COLUMN Szamla.Allapot IS 'Számla állapota: "N" – Normál, "D" – Törölve';
Select leggyakrabban használt utasítás inkább deklaratívnak tekinthető, mint procedurálisnak az adatok egy halmazát válogatja ki a halmaz általában szekvenciálisan olvasható különleges jelzés, EOF – End of File BOF – Beginning of File
Select akiknek egynél több aktív bankszámlája van SELECT COUNT(*), Tulajdonos FROM Szamla WHERE Allapot = 'N' GROUP BY Tulajdonos HAVING COUNT(*) > 1 ORDER BY Tulajdonos
Több Select Az eredményhalmaz oszlopait kell itt felsorolni SELECT Vevo.Nev, (SELECT SUM(Osszeg) FROM Rendeles WHERE VevoID = Vevo.ID) RendelesOsszeg
Összetett Select a legnagyobb árbevételű munkáinkat SELECT munka_szám FROM munka WHERE óraszám*óradíj = ( SELECT max(óraszám*óradíj) FROM munka );
Select/from mely adatbázis-táblákból szeretnénk összegyűjteni az adatokat ? SELECT * FROM Beteg, Kezeles
Select/from minden beteghez csak a hozzá tartozó kezelést SELECT * FROM Beteg KEY JOIN Kezeles definiált külső kulcs a Kezeles tábláról a Beteg táblára !!!! Az orcle ezt nem támogatja, még akkor sem, ha van külső kulcs
Select/Where A Boole-algebra kifejezései használhatók, OR, AND és NOT operátorokkal
Select/Where Szűrési feltételeket fogalmaz meg = szűkíti az eredmény halmazt SELECT * FROM Beteg, Kezeles WHERE Beteg.ID = Kezeles.BetegID AND Kezeles.Datum = CURRENT DATE
Select/ GROUP BY Egyes sorok összevonását, csoportosítását írja elő az eredménytáblában SELECT COUNT(*), Tulajdonos FROM Szamla WHERE Allapot = 'N' GROUP BY Tulajdonos Csoportosítás a tulajdonos alapján, COUNT(*) egy-egy csoport sorainak számát adja vissza, az összevonás előtt
Select/Having Szűrés a csoportosítás utáni eredményhalmazra SELECT COUNT(*), Tulajdonos FROM Szamla WHERE Allapot = 'N' GROUP BY Tulajdonos HAVING COUNT(*) > 1 csak azok a csoportok jelennek meg, amelyek egynél több sorból lettek összevonva
Select/Order By az eredményhalmaz rendezését adja meg SELECT * FROM Beteg ORDER BY Szuletes DESC születési dátum szerint sorba rendezve, elöl a legfiatalabbal
Case select app_id,budget_info_type,amount from acq_budget_info CASE WHEN logikai vizsgálat THEN kifejezés ha igaz .. ELSE kifejezés ha az előzőekre nem illeszkedik A logikai vizsgálat eredményétől függően vezérelhetjük, hogy mit szeretnénk az adott oszlopban látni select app_id,budget_info_type,amount from acq_budget_info
Case A lekérdezés transzponáltja select APP_ID, max(net_income), max(gross_income), max(bonus) from ( select APP_ID, case when BUDGET_INFO_TYPE='net_income' then amount else null end as net_income, case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income, case when BUDGET_INFO_TYPE='bonus' then amount else null end as bonus, from acq_budget_info) xx group by APP_ID
Lekérdezési terv Query plan Az adatbázis kezelők eltérő algoritmusokat használnak (pl: * és @) Az eltérések a változókezelés, elágazások, ciklusok kezelése, kivételkezelés stb. vannak Gyakori a szabály-alapú (rule-based) (relációs adatbázis szerkezetét), és a költség-alapú (cost-based),(átlagát, szórását )
Insert Adatokat ad hozzá egy táblához INSERT INTO Szamla (Szamlaszam, Tulajdonos, Nyitas, Allapot) VALUES (123456, 'H. Kovács Géza', '1996.05.14.', 'N');
Update Módosítást hajtunk végre UPDATE Szamla SET Allapot = 'D' WHERE Szamlaszam = 123456;
Delete Törlés végzünk DELETE FROM Beteg WHERE TAJ = '123 456 789';
Egyéb utasítások Tudunk bonyolultabb algoritmusokat is írni Pl: például komoly adatkezelési feladatokat szeretnénk az ügyfél-oldalról a kiszolgáló-oldalra áthelyezni csak egyszerűsíteni akarjuk a programozást, pl a TAJ számból kiszedni a szóközöket
Jelentős különbségek SQL-ben Az Oracle rendszereiben nincs NUMERIC, helyette a NUMBER-t kell használni Az Oracle nem támogatja a VARCHAR-t, helyette a VARCHAR2-t javasolja Az Oracle nem támogatja a LONG VARCHAR-t, helyette a CLOB-ot javasolja Az Oracle-ben a DATE dátumot és időt is tartalmazhat, más rendszerekben ez csak dátum lehet
Jelentős különbségek SQL-ben SELECT-FROM szakaszba írt összekapcsolási utasításokat, mások csak a SELECT-WHERE-ben fogadják el SELECT * FROM Beteg KEY JOIN Lelet SELECT * FROM Beteg, Lelet WHERE Beteg.ID = Lelet.BetegID
Jelentős különbségek SQL-ben gyors keresésnél csak a teljesen pontosan beírt keresőkérdésre találják meg a választ, néhol figyelni kell a kis- és nagybetűkre, valamint az ékezetek helyes használatára (Oracle, Firebird) Ahol egyenrangúak (Sybase Ase, Sybase ASA)
Jelentős különbségek SQL-ben From nélküli Select SELECT SYSDATE SQL kiszolgálók esetében nem működik, mivel a FROM náluk kötelező nyelvi elem!! az Oracle minden adatbázisában szerepelteti a DUAL táblát, amelynek egyetlen rekordja van. Így Oracle SQL-ben ezt kell írnunk SELECT SYSDATE FROM DUAL
Az SQL utasítások feldolgozása Az alkalmazás egy SQL utasítást (szöveg!) küld az adatbázisba Az adatbázis ellenőrzéseket végez: szintaxis a hivatkozott objektumok megléte, az adattípusok helyessége jogosultság Az adatbázis elvégzi a kért utasítást Adatokat és / vagy állapot-információkat ad vissza SQL utasítás adatbázis alkalmazás adatok
A kliens-server környezet Az adatbáziskezelő egy szerveren fut (nálunk Linux alatt) A használatához a kliens gépekre megfelelő programot kell telepíteni megfelelő módon elküldi az SQL utasításokat fogadja az adatbázisból érkező adatokat Az Oracle által szállított hagyományos kliens program az SQL*Plus Újabb, kényelmesebb az SQL Developer Mindkettő többfajta operációs rendszerre is létezik
Az utasítások végrehajtásának követése Az SQL utasítások végrehajtási módjáról és annak hatékonyságáról felvilágosítást lehet kérni További információk a gyári dokumentációban: SQL*Plus User’s Guide and Reference, 9. fejezet: Tuning SQL*Plus
Az Oracle munkakörnyezete
Objektumok egy adatbázisban 1. Tábla (adattábla, table): az adatok tárolási helye Nézet (nézettábla, view): meglévő táblákból kiválogatott / származtatott adatokat „tartalmaz” (inkább: szolgáltat) táblaként kezelhető mint a választó lekérdezés Accessben Index: az adatok gyors visszakeresését segítő segéd-információk Sorozat (sequence): egyedi egész értékeket szolgáltat hasonló szerep, mint a számláló adattípusnak Accessben
Objektumok egy adatbázisban 2. Tárolt eljárások (function, procedure, package): PL/SQL nyelven írt, az adatbázisban tárolt és az adatbázis-szerveren futó eljárások / függvények / programcsomagok Trigger: különleges PL/SQL eljárás nem az alkalmazás hívja, hanem bizonyos adatbázis-események (pl. rekord beszúrása) hatására automatikusan elindul ellenőrzésre, az integritás biztosítására használjuk Az újabb Oracle verziók a PL/SQL mellett a Java használatát is támogatják
A DUAL tábla Az Oracle specialitása Egy sora és egy oszlopa van Minden felhasználónak van rá SELECT jogosultsága Jól használható számítások végrehajtatására vagy függvények kiértékelésére SELECT 2+3 FROM DUAL; SELECT USER, SYSDATE FROM DUAL;
A TNSNAMES.ORA fájl Egyszerű szövegfájl A hagyományos kliensprogramok esetében minden kliensgépen megtalálható (pl. a C:\oracle\ora92\network\Admin-ban) Az adatbázisok nevéhez megadja a hálózati helyet A karbantartásához külön program is van: Start menü / Programok / Oracle - OraHome92 / Configuration and Migration Tools / Net Manager
A SCOTT felhasználó Az Oracle telepítésekor egy minta-adatbázis is telepíthető: egy SCOTT nevű felhasználó TIGER jelszóval néhány tábla adatokkal Nagyon sok Oracle példa hivatkozik ezekre az adatokra
A DEPT tábla A SCOTT felhasználó táblája DEPT: department (részleg) DEPTNO: department number (a részleg száma) DNAME: department name (a részleg neve) LOC: location (helység)
Az EMP tábla A SCOTT felhasználó táblája EMP: employee, alkalmazott EMPNO: employee number, az alkalmazott kódja ENAME: employee name, az alkalmazott neve JOB: munkakör MGR: manager, a főnökének a kódja HIREDATE: belépési dátum SAL: salary, fizetés COMM: commission, ??? DEPTNO: department number (a részleg száma)
A példa-adatbázis szerkezete
A példa-adatbázis szerkezete A Stolnicki-könyvből átvéve, egyszerűsítve A mezőtípusok az Oracle lehetőségeihez igazítva vevők rendelések cikktörzs a rendelések tételei
A vevők adatai (VEVOK tábla)
A rendelések adatai (RENDEL tábla)
A rendelések tételei (RTETEL tábla)
A cikkek adatai (CIKK tábla) sql01 első lépések