kategória | ||||||||||
|
||||||||||
|
||
Négy résznyelve bontható:
lekérdező QUERY Language
adatdefiníciós DDL (Data Definition Language)
adatmanipulációs DML (Data Manipulation Language)
adatvezérlő DCL (Data Control Language
SQLPLUS |
|
EXIT vagy QUIT |
|
CONN[ECT] [felh_név[/jelszó]]| [felh_név[/jelszó@adatbázis]] |
|
DISCONNECT |
|
|
Az SQL parancsokat ;-vel kell lezárni. |
HELP parancsnév |
|
/* Megjegyzés */ |
|
SET PAUSE ON/OFF |
Képernyőgörgetés laponkénti megállással. |
LIST [szám] |
SQL buffer listázása. |
A[PPEND] |
Aktuláis sor végére karakterek fűzése. |
C[HANGE] ksor1/ksor2 |
|
I[NPUT] |
Bufferben lévő SQL parancshoz új sor hozzáfűzése. |
DEL |
Az aktuális sort törli a bufferből. |
SAVE fnev [CRE|REP|APP] |
A buffer tartalmát fájlba írja. |
GET |
Kimentett SQL fájlt bufferbe visszatölt. |
EDIT [fnev] |
Az op.r. editorát hívja meg fnev szerkesztésre. |
DEF[INE] változó=érték |
Változót definiálhatunk |
DEF[INE] változó |
Megjeleníti a változó értékét |
UNDEF[INE] változó |
Megszünteti a változót |
DEFINE _EDITOR='editor név' |
Megadhatjuk, mely editor használja a rendszer az EDIT paranccsal |
@|STA[RT] fnev p1[ p2]. |
SQL kiterjesztésű fnev parancsfájlt futtat, p1,p2,.,pn paraméterek, amelyekre a parancsfájlban &1,&2,.,&n -nel lehet hivatkozni. |
RUN vagy / |
a buffer tartalmát futtaja |
SPOOL [ON/OFF/OUT] | [fnev] |
Fájlba menti a képernyő tartalmát |
HOST |
Kilépés az op.r.-be. |
DESC[RIBE] [felhasználói név]tábla[@adatbázis] |
Tábla szerkezetét írja ki. |
Ábra Az aktuális buffer és a külső editor
A CHAR, DATE, NUMBER standard ORACLE adattípusok értékeinek konstans alakja.
Pl: 'karaktersorozat'
-123.45
'01-JAN-97'
Literál, változó, függvény, mezőnév magában is, vagy ezeknek operátorokkal való összekapcsolása kifejezést alkot.
A kifejezésnek értéke van: pl. egy szám, szöveg, dátum, vagy igaz, hamis.
Az igaz, hamis értékű kifejezést logika 818c24i i kifejezésnek, vagy feltételnek hívjuk.
Neve van
Értéket adhatunk neki (DEF[INE] változó = érték, vagy a @|RUN parancsfájl p1[ p2]. paraméterek segítségével, lásd 2.2 részben)
Hivatkozhatunk rá (ACCEPT vagy DEFINE által létrehozott változóra &változónév, az @|RUN parancsfájl p1[ p2]. paraméterekre &1, &2 stb. lásd 2.2)
A változóknak csak literálokat adhatunk értékül. (Lásd 2.2 rész.)
Pl:'&varos'
Lekérdező
szelekciós_utasítás UNION szelekciós_utasítás |
szelekciós_utasítás eredményét mint halmazt kell felfogni. |
szelekciós_utasítás MINUS szelekciós_utasítás |
|
szelekciós_ut. INTERSECT szelekciós_ut. |
|
Logikai
NOT |
Nem |
AND |
És |
OR |
Vagy |
ALL(kifejezés[,kifejezés]. | szelekciós utasítás) |
Minden. Előtte szerepelnie kell relációs operátornak. |
ANY(kifejezés[,kifejezés]. | szelekciós utasítás) |
Valamelyik. Előtte szerepelnie kell relációs operátornak. |
BETWEEN kifejezés AND kifejezés |
|
EXISTS (szelekciós_utasítás) |
Igaz, ha a szelekciós_utasítás ad vissza értéket |
IN(kifejezés[,kifejezés]. | szelekciós_utasítás) |
|
kifejezés IS NOT NULL |
|
kifejezés IS NULL |
|
LIKE kifejezés |
|
NOT BETWEEN kifejezés AND kifejezés |
|
NOT EXISTS (szelekciós utasítás) |
|
NOT IN(kifejezés[,kifejezés]. | szelekciós utasítás) |
|
NOT LIKE kifejezés |
|
Numerikus
Relációs vagy összehasonlító
operátor |
jelentés |
|
|
!=, <>, ^= |
|
> |
|
< |
|
>= |
|
<= |
|
Dátumra
dátumkifejezés - dátumkifejezés è napok száma a két dátum között
Sztringekre
karakterkifejezés || karakterkifejezés è Konkatenáció
SELECT [DISTINCT] kifejezés [aliasnév][, kifejezés [aliasnév]].
FROM táblanév;
|
Példa |
SELECT Vnev, Unev, lakcim FROM olvaso;
SELECT * FROM konyv;
SELECT * FROM tab; (csak az Oracle-nél)
SELECT varos FROM kiado; |
SELECT DISTINCT varos FROM kiado; |
|
varos |
varos |
|
LONDON |
LONDON |
|
NEW YORK |
NEW YORK |
|
LONDON |
|
|
LONDON |
|
|
SELECT [DISTINCT] kifejezés [aliasnév][, kifejezés [aliasnév]].
FROM táblanév
WHERE keresési_feltétel;
egyszerű összehasonlítás
összehasonlítás egy halmaz elemeivel
összehasonlítás NULL értékkel
összetett keresési feltétel
Egyszerű összehasonlítás
oszlopnév relációs_operátor kifejezés|konstans
Összehasonlítás egy halmaz elemeivel
oszlopnév összehasonlító_operátor halmaz_definíció
operátor |
jelentés |
BETWEEN kif. AND kif. |
|
IN (lista) |
|
LIKE kar_minta |
|
Összehasonlítás NULL értékkel
oszlopnév IS NULL
Összetett keresési feltételek
operátor |
jelentés |
NOT |
|
AND |
|
OR |
|
A használható operátorokról bővebben a 2.3.4 részben olvashatunk.
|
Példa |
||
|
ORACLE |
MSSQL |
|
|
SELECT o_azon, Vnev, Unev, lakcim FROM olvaso WHERE lakcim like 'EGER%' AND okod=6; |
SELECT o_azon, Vnev, Unev, lakcim FROM olvaso WHERE lakcim like "EGER*" AND okod=6; |
|
o_azon |
Vnev |
Unev |
lakcim |
|
POR |
OSZKÁR |
EGER DOBO U.21. |
SELECT isbn,cim, kiad_dat FROM konyv WHERE kiad_dat BETWEEN AND
isbn |
cim |
kiad_dat |
|
EGRI CSILLAGOK |
|
|
KOSZIVU EMBER FIAI |
|
SELECT * FROM olvaso WHERE okod IS NULL;
o_azon |
vnev |
unev |
lakcim |
beir_dat |
okod |
|
GIPSZ |
JAKAB |
DEBRECEN FAL U. 1. |
|
|
|
KEMENY |
HELEN |
APAFA FA U. 12. |
|
|
SELECT [DISTINCT] kifejezés [aliasnév][, kifejezés [aliasnév]].
FROM táblanév
[WHERE keresési_feltétel]
ORDER BY kifejezés [DESC] [, kifejezés[DESC]].;
|
Példa |
SELECT isbn, cim,kiad_dat FROM konyv
WHERE kiad_azon='K001' /* MSACCESS-ben ' helyett "*/
ORDER BY cim;
isbn |
cim |
kiad_dat |
|
EGRI CSILLAGOK |
|
|
KOSZIVU EMBER FIAI |
|
SELECT isbn, lelt_szam,kolcs_e FROM peldany
ORDER BY isbn, lelt_szam;
SELECT [DISTINCT] kifejezés [aliasnév][, kifejezés [aliasnév]].
FROM táblanév
[WHERE keresési_feltétel]
GROUP BY kifejezés [,kifejezés].
[HAVING csopkiv. feltétel]
[ORDER BY kifejezés [DESC] [, kifejezés[DESC]].];
AVG([DISTINCT|ALL] kifejezés) |
A Null értéket figyelmen kívül hagyja. |
COUNT([DISTINCT|ALL] ) |
A Null értéket figyelmen kívül hagyja. |
MAX([DISTINCT|ALL] kifejezés) |
|
MIN([DISTINCT|ALL] kifejezés) |
|
SUM([DISTINCT|ALL] kifejezés) |
|
A függvények NUMBER típusú adatokra alkalmazhatók, kivéve a MAX(), MIN(), COUNT() függvényeket, amelyek CHAR és DATE típusú adatokra is működnek.
|
Példa |
SELECT okod, min(beir_dat), max(beir_dat), COUNT(*)
FROM olvaso
GROUP BY okod
HAVING COUNT(*)>1;
okod |
min(beir_dat) |
max(beir_dat) |
COUNT(*) |
|
|
|
|
|
|
|
|
INITCAP(kifejezés) |
|
INSTR(kifejezés,'sztring') |
|
LENGTH(kifejezés) |
|
LOWER(kifejezés) |
|
SUBSTR(kifejezés, kp, hossz) |
|
UPPER(kifejezés) |
|
ABS(kifejezés) |
|
GREATEST(kifejezés,kif2) |
|
LEAST(kifejezés,kif2) |
|
MOD(kifejezés, osztó) |
|
POWER(kifejezés,kitevő) |
|
ROUND(kifejezés,szám) |
|
SIGN(kifejezés) |
|
SQRT(kifejezés) |
|
TRUNC(kifejezés,szám) |
|
egyéb műveletek:*,/,+,-
ADD_MONTHS(dát,hónapszám) |
|
GREATEST(d1,d2) |
|
LEAST(d1,d2) |
|
MONTHS_BETWEEN(d1,d2) |
|
ROUND(dátum,formátum) |
|
TO_DATE(sztring) |
|
TO_CHAR(dátum[,formátum]) |
|
SYSDATE |
|
|
Példa |
|
|
|
ORACLE |
MSACCESS |
|
|
SELECT lelt_szam, o_azon, SYSDATE-kolcs_dat ota_kint_van FROM kolcson; |
SELECT lelt_szam, o_azon, now-kolcs_dat as ota_kint_van FROM kolcson; |
|
lelt_szam |
o_azon |
ota_kint_van |
L002 |
|
|
L003 |
|
|
L004 |
|
|
L005 |
|
|
L007 |
|
|
L008 |
|
|
NVL(oszlopkif, kif) =oszlopkif, ha az nem NULL, egyébként =kif
|
Példa SELECT NVL(ar,0) FROM peldany; |
SELECT [DISTINCT] kifejezés [aliasnév][, kifejezés [aliasnév]].
FROM táblanév [aliasnév], táblanév [aliasnév]
WHERE kapcs_oszlop1 összehas_operátor kapcs_oszlop2 AND további_feltétel
[GROUP BY kifejezés [,kifejezés].]
[HAVING csopkiv_feltétel]
[ORDER BY kifejezés [DESC] [, kifejezés[DESC]].];
|
Példa |
ORACLE |
MSACCESS |
SELECT Vnev, Unev, lakcim, kolcs_dat FROM olvaso o, kolcson k WHERE o.o_azon=k.o_azon AND SYSDATE-kolcs_dat>30; |
SELECT Vnev, Unev, lakcim, kolcs_dat FROM olvaso INNER JOIN kolcson
ON olvaso.o_azon=kolcson.o_azon |
Vnev |
Unev |
lakcim |
kolcs_dat |
KEMENY |
HELEN |
APAFA FA U. 12. |
|
MINTA |
MOKUS |
SARAND FELFAL U. 9. |
|
KEMENY |
HELEN |
APAFA FA U. 12. |
|
GIPSZ |
JAKAB |
DEBRECEN FAL U. 1. |
|
ORACLE |
MSACCESS |
SELECT a.kiad_azon, kiad_nev, varos, isbn,cim FROM konyv k, kiado a WHERE a.kiad_azon=k.kiad_azon; |
SELECT kiado.kiad_azon, kiad_nev, varos, isbn, cim FROM kiado INNER JOIN konyv ON kiado.kiad_azon=konyv.kiad_azon; |
kiad_azon |
kiad_nev |
varos |
isbn |
cim |
K001 |
TANKONYVKIADO |
LONDON |
|
EGRI CSILLAGOK |
K001 |
TANKONYVKIADO |
LONDON |
|
KOSZIVU EMBER FIAI |
K002 |
AKADEMIAI KIADO |
NEW YORK |
|
TUSKEVAR |
K002 |
AKADEMIAI KIADO |
NEW YORK |
|
ANATOMIA |
K003 |
GONDOLAT KIADO |
LONDON |
|
EMPATIA |
K003 |
GONDOLAT KIADO |
LONDON |
|
RECEPTEK |
Outer Join(+) azt a táblát egészíti ki NULL értékekkel, amely a kapcsoló oszlop mellett van.
ORACLE |
MSACCESS |
SELECT a.kiad_azon, kiad_nev, varos, isbn, cim FROM kiado a, konyv k WHERE a.kiad_azon=k.kiad_azon (+); |
SELECT kiado.kiad_azon, kiad_nev, varos, isbn, cim FROM kiado LEFT JOIN konyv ON kiado.kiad_azon=konyv.kiad_azon; |
kiad_azon |
kiad_nev |
varos |
isbn |
cim |
K001 |
TANKONYVKIADO |
LONDON |
|
EGRI CSILLAGOK |
K001 |
TANKONYVKIADO |
LONDON |
|
KOSZIVU EMBER FIAI |
K002 |
AKADEMIAI KIADO |
NEW YORK |
|
TUSKEVAR |
K002 |
AKADEMIAI KIADO |
NEW YORK |
|
ANATOMIA |
K003 |
GONDOLAT KIADO |
LONDON |
|
EMPATIA |
K003 |
GONDOLAT KIADO |
LONDON |
|
RECEPTEK |
K004 |
KOSSUTH KIADO |
LONDON |
|
|
|
Példa nem equijoinra |
Listázzuk ki azokat, akik később iratkoztak be, mint GIPSZ JAKAB.
ORACLE |
MSACCESS |
SELECT x.vnev,x.unev,x.lakcim, y.vnev,y.unev FROM olvaso x,olvaso y WHERE x.beir_dat>y.beir_dat AND UPPER(y.vnev)='GIPSZ' AND UPPER(y.unev)='JAKAB'; |
SELECT x.vnev,x.unev,x.lakcim, y.vnev,y.unev FROM olvaso as x,olvaso as y WHERE x.beir_dat>y.beir_dat AND y.vnev="GIPSZ" AND y.unev="JAKAB"; |
Pl: Listázzuk ki, hogy az egyes olvasóknál hány könyv van.
ORACLE |
MSACCESS |
SELECT vnev, unev, count(k.lelt_szam) FROM olvaso o, kolcson k WHERE o.o_azon=k.o_azon (+) group by o.o_azon,vnev,unev; |
SELECT vnev, unev, count(kolcson.lelt_szam) FROM olvaso left join kolcson on olvaso.o_azon=kolcson.o_azon group by olvaso.o_azon,vnev,unev; |
Az első SELECT WHERE részében újabb SELECT, össz. 15.
A beágyazott SELECT egyszerre több rekordot is visszaadhat. Ezek kezelésére használhatók a következők:
ANY
ALL
EXISTS
A belső SELECT-ből átvehetünk több oszlopot is.
|
Példa |
Listázzuk ki azokat, akik később iratkoztak be, mint GIPSZ JAKAB.
ORACLE |
MSACCESS |
SELECT vnev,unev,lakcim FROM olvaso WHERE beir_dat>(select beir_dat From olvaso where vnev='GIPSZ' AND unev='JAKAB'); |
SELECT vnev,unev,lakcim FROM olvaso WHERE beir_dat>(select beir_dat From olvaso where vnev="GIPSZ" AND unev="JAKAB"); |
Listázzuk ki azon könyveket (ISBN, cim), amelyek Gipsz Jakabnál vannak.
ORACLE |
MSACCESS |
SELECT v.isbn,cim FROM konyv v, peldany p WHERE v.isbn=p.isbn AND lelt_szam IN (SELECT lelt_szam FROM kolcson k, olvaso o WHERE k.o_azon=o.o_azon AND UPPER(vnev)='GIPSZ' AND UPPER(unev)='JAKAB'); |
SELECT konyv.isbn,cim FROM konyv inner join peldany ON konyv.isbn=peldany.isbn where lelt_szam IN (SELECT lelt_szam FROM kolcson inner join olvaso ON kolcson.o_azon=olvaso.o_azon where vnev="GIPSZ" AND unev="JAKAB"); |
isbn |
cim |
|
EGRI CSILLAGOK |
|
ANATOMIA |
|
Példa korrelált lekérdezésre: a belső SELECT hivatkozik a külsőre. |
Listázzuk ki azokat a könyveket, amelyeknek az ára nagyobb a könyv kiadója által kiadott könyvek átlagáránál.
ORACLE |
MSACCESS |
SELECT lelt_szam,k.isbn,cim,ar,kiad_azon FROM konyv k,peldany p WHERE p.isbn=k.isbn and ar>(SELECT avg(ar) FROM peldany, konyv WHERE k.kiad_azon=kiad_azon); |
SELECT lelt_szam,k.isbn,cim,ar,kiad_azon FROM konyv as k,peldany as p WHERE p.isbn=k.isbn and ar>(SELECT avg(ar) FROM peldany, konyv WHERE k.kiad_azon=kiad_azon); |
lelt_szam isbn cim ar kiad_azon
L001 100001 TUSKEVAR 1100 K002
L002 100001 TUSKEVAR 1100 K002
L003 100001 TUSKEVAR 1150 K002
L004 100002 EGRI CSILLAGOK 800 K001
L005 100002 EGRI CSILLAGOK 800 K001
L006 100003 KOSZIVU EMBER FIAI 1200 K001
Pl: Lisázzuk ki azokat a műveket, amelyek kölcsönözhetők.
SELECT szerzo,cim
FROM konyv
WHERE isbn in (select isbn From peldany
where kolcs_e=1);
Listázzuk ki azokat a műveket, amelyeket Londonban adtak ki, és van kölcsönözhető példány belőlük.
SELECT [ALL] | [DISTINCT] ,kifejezés [aliasnév]]...
FROM táblanév
CONNECT BY PRIOR oszlopnév1= oszlopnév2
START WITH oszlopnév=kifejezés;
A CONNECT BY részben adható meg a hierarchiát kódoló két oszlop neve (az oszlopnév1 az alacsonyabb, míg a oszlopnév2 a magasabb szinten lévő adat a hierarchiában).
A visszakeresés kiindulási pontját a START WITH után lehet megadni.
Példa:
Listázzuk ki NAGY KLARA összes beosztottját!
SELECT LPAD(' ', 2*LEVEL)||VNEV||UNEV STRUKTURA,LEVEL,D_AZON,FONOK
FROM DOLGOZO
CONNECT BY PRIOR D_AZON = FONOK START WITH VNEV='NAGY' AND UNEV='KLARA';
STRUKTURA LEVEL D_AZON FONOK
-------- ----- ------ -----
NAGY KLARA 1 D01
KISS TEREZ 2 D02 D01
SZILARD ISTVAN 3 D04 D02
BARNA PETER 2 D03 D01
KEREK EMIL 3 D05 D03
FUTO ERZSEBET 2 D06 D01
Listázzuk ki NAGY KLARA összes közvetlen beosztottját!
SELECT LPAD(' ', 2*LEVEL)||VNEV||UNEV STRUKTURA,LEVEL,D_AZON,FONOK
FROM DOLGOZO
WHERE level=2
CONNECT BY PRIOR D_AZON = FONOK START WITH VNEV='NAGY' AND UNEV='KLARA';
Számítsuk ki a különböző vezetői szinteken az átlagfizetést!
SELECT LEVEL,AVG(FIZETES)
FROM DOLGOZO
CONNECT BY PRIOR D_AZON = FONOK START WITH VNEV='NAGY' AND UNEV='KLARA'
GROUP BY LEVEL;
feladatok
Határozzuk meg, hány londoni kiadó van az adatbázisunkban.
Határozzuk meg, kik azok a debreceniek, akik 1990 februárjában iratkoztak be.
Határozzuk meg, hány darab kölcsönözhető, és hány darab köteles példány van a könyvtárunkban.
Határozzuk meg, hány darab 1994 január 1-től régebbi kölcsönözhető mű (létezik kölcsönözhető példánya) van a könyvtárunkban.
Melyik kiadótól van a legrégebbi könyvünk.
Listázzuk ki az olvasókat és adataik mellet azt, hogy az általuk legrégebben kivitt példány hány hete van náluk, névsor szerint rendezve.
Listázzuk ki a FEKETE ISTVAN által írt könyveket.
Irassuk ki azokat a könyveket, amelyekre egynél több előjegyzés van.
Irassuk ki azokat a könyveket, amelyek drágábbak, mint a TANKONYVKIADO által kiadott könyvek átlagára.
Irassuk ki, hogy az egyes szerzők hány könyvet írtak, névsor szerint rendezve.
Irassuk ki, hogy az egyes olvasóknál hány példány van kint, darabszám szerint csökkenően rendezve, és a listában csak azok legyenek benne, akiknél legalább két könyv van.
Irassuk ki, hogy az egyes olvasók hány könyvre jegyeztek elő.
Hány olvasónak nincs még figyelmeztetése (okod IS NULL).
Mennyi pénz szükséges a jelenlegi dolgozók havi bérének 10 %-os emeléséhez.
Irassuk ki, hogy az EGRI CSILLAGOKra jegyeztek-e elő, és ha igen, akkor ki(k).
Határozzuk meg a könyvtárosok átlagfizetését.
Irassuk ki BARNA PETER szintjén az átlagfizetést.
Irassuk ki az EGRI CSILLAGOK című könyv bent lévő példányait.
Kiviheti-e GIPSZ JAKAB az TUSKEVAR című könyvet? És az EGRI CSILLAGOKat.
Listázzuk ki a CIMVAL változó által meghatározott könyvből bent lévő kivihető (kölcsönözhető és nincs kikölcsönözve) példányokat.
megoldások
SELECT COUNT(kiad_azon) FROM kiado WHERE varos='LONDON';
SELECT * FROM olvaso WHERE lakcim LIKE 'DEBRECEN %' AND beir_dat<'01-MAR-1990' AND beir_dat>='01-FEB-1990';
SELECT kolcs_e, COUNT(*) FROM peldany GROUP BY kolcs_e;
SELECT COUNT(ISBN) FROM konyv WHERE kiad_dat<'01-JAN-1994' AND ISBN IN (SELECT ISBN FROM peldany WHERE kolcs_e=1);
SELECT cim,kiad_dat,a.* FROM kiado a, konyv k WHERE k.kiad_azon=a.kiad_azon AND kiad_dat=(SELECT MIN(kiad_dat) FROM konyv);
SELECT o.*, (sysdate-kolcs_dat)/7 FROM olvaso o,kolcson k WHERE o.o_azon=k.o_azon AND kolcs_dat = (SELECT MIN(kolcs_dat) FROM kolcson WHERE o_azon=o.o_azon);
SELECT * FROM konyv WHERE ISBN IN (SELECT ISBN FROM irta i, szerzo s WHERE i.szerzo_azon=s.szerzo_azon AND vnev='FEKETE' AND unev='ISTVAN');
SELECT * FROM konyv WHERE ISBN IN (SELECT ISBN FROM elojegy GROUP BY ISBN HAVING COUNT(ISBN)>1);
SELECT * FROM konyv WHERE ar>(SELECT
AVG(NVL(ar,0)) FROM konyv k, kiado a WHERE a.kiad_azon=k.kiad_azon (+) AND kiad_nev='TANKONYVKIADO');
SELECT MAX(vnev), MAX(unev), COUNT(s.szerzo_azon)
FROM szerzo s, irta i
WHERE s.szerzo_azon=i.szerzo_azon
GROUP BY s.szerzo_azon
ORDER BY MAX(vnev), MAX(unev);
SELECT MAX(vnev), MAX(unev), COUNT(NVL(lelt_szam,0))
FROM olvaso o, kolcson k
WHERE o.o_azon=k.o_azon (+)
GROUP BY o.o_azon
HAVING COUNT(NVL(lelt_szam,0))>1
ORDER BY COUNT(NVL(lelt_szam,0)) DESC;
SELECT MAX(vnev), MAX(unev),COUNT(NVL(ISBN,0)) FROM
olvaso o, elojegy e
WHERE o.o_azon=e.o_azon (+)
GROUP BY o.o_azon;
SELECT * FROM olvaso WHERE okod IS NULL OR okod=0;
SELECT SUM(1.1*fizetes-fizetes) FROM dolgozo;
SELECT * FROM olvaso WHERE o_azon in (SELECT o_azon
FROM elojegy e,konyv k
WHERE k.ISBN=e.ISBN AND cim='EGRI CSILLAGOK');
SELECT AVG(fizetes) FROM dolgozo WHERE beosztas='KONYVTAROS';
SELECT
AVG(fizetes) FROM dolgozo
WHERE LEVEL=(SELECT LEVEL FROM dolgozo CONNECT BY PRIOR d_azon=fonok START WITH
vnev='BARNA' AND unev='PETER')
CONNECT BY PRIOR d_azon=fonok START WITH vnev='BARNA' AND unev='PETER';
SELECT lelt_szam FROM peldany MINUS SELECT k.lelt_szam FROM kolcson k, peldany p WHERE k.lelt_szam=p.lelt_szam AND ISBN = (SELECT ISBN FROM konyv WHERE cim='EGRI CSILLAGOK');
GIPSZ JAKABnál kint lévő könyvek száma kisebb-e,
mint a maximálisan kivihető könyvek száma (3)?
SELECT COUNT(NVL(lelt_szam,0))<3 FROM olvaso o, kolcson k
WHERE o.o_azon=k.o_azon (+) AND vnev='GIPSZ' AND unev='JAKAB'
Van-e jelenleg az TUSKEVAR ból példány
GIPSZ JAKABnál?
SELECT vnev,unev FROM olvaso o, kolcson k
WHERE o.o_azon=k. o_azon AND vnev='GIPSZ' AND unev='JAKAB' AND lelt_szam IN
(SELECT lelt_szam FROM konyv k, peldany p WHERE k.ISBN=p.ISBN AND
cim='TUSKEVAR');
Az előjegyzési sorban GIPSZ JAKAB előtt lévők száma kisebb-e, mint ahány
szabad, kivihető példány van az TUSKEVARból jelenleg a könyvtárban?
Az előjegyzési sorban GIPSZ JAKAB előtt lévők száma:
SELECT COUNT(e.o_azon) FROM olvaso o, elojegy e WHERE o.o_azon=e.o_azon AND
ISBN=(SELECT ISBN FROM konyv WHERE cim=' TUSKEVAR') AND eloj_dat < (SELECT
eloj_dat FROM olvaso o, elojegy e WHERE o.o_azon=e.o_azon AND vnev='GIPSZ' AND
unev='JAKAB');
Hány szabad, kivihető példány van az TUSKEVARból?
SELECT COUNT(p.lelt_szam) FROM peldany p, kolcson k WHERE p.lelt_szam
=k.lelt_szam (+) AND kolcs_e=1 AND o_azon is NULL AND ISBN = (SELECT ISBN FROM
konyv WHERE cim=' TUSKEVAR');
Az EGRI CSILLAGOK című könyv esetén a megoldás ugyanez, érdemes ilyen esetekben
változókat használni (cim=&CIMVALT).
SELECT p.lelt_szam FROM peldany p, kolcson k WHERE p.lelt_szam =k.lelt_szam (+) AND kolcs_e=1 AND o_azon is NULL AND ISBN = (SELECT ISBN FROM konyv WHERE cim=&CIMVAL);
CHAR |
NUMBER[(n[)]][,d)} |
DATE |
LONG |
RAW |
VARCHAR |
LONG VARCHAR |
DECIMAL |
INTEGER |
SMALLINT |
FLOAT |
LONG RAW |
CREATE TABLE táblanév
(oszlopnév adattípus (szélesség) [NOT NULL],
oszlopnév adattípus (szélesség) [NOT NULL],
oszlopnév adattípus (szélesség) [NOT NULL]);
Táblanév: max 30 karakter, egyedi, a névképzési szabályoknak megfelelő.
|
A CREATE TABLE utasítás teljes leírását lásd a Függelék A-ben. Példa Lásd Függelék B. |
ALTER TABLE táblanév
ADD oszlopnév adattípus (szélesség);
[DROP megszorítás]
Új oszlop táblához adása.
ALTER TABLE táblanév
MODIFY oszlopnév adattípus (új_szélesség) [NOT NULL|NULL];
[DROP megszorítás]
Meglévő oszlop szélesítése.
|
Példa |
ALTER TABLE kiado
ADD telefon NUMBER(10);
ALTER TABLE kiado
MODIFY varos CHAR(20);
Táblában lévő oszlopot nem lehet direkt módon törölni. (Helyette: Új tábla létrehozása kevesebb oszloppal, értékek átmásolása, régi tábla törlése.)
Csak olyan oszlop típusát lehet megváltoztatni, illetve méretét csökkenteni, amelyben minden sor értéke NULL.
Egy létező oszlop csak akkor változtatható NOT NULL típusúvá, ha minden sorában nem NULL érték áll.
DROP TABLE táblanév;
|
Példa A Suli-könyvtár adatbázisának törlése (a táblák törlési sorrendje lényeges) |
drop table elojegy;
drop table kolcson;
drop table peldany;
drop table konyv;
drop table kiado;
drop table olvaso;
CREATE VIEW nézetnév [aliasnév]
AS szelekciós utasítás;
ORDER BY rész nem lehet benne, több táblára is működik.
DROP VIEW nézetnév;
CREATE [UNIQUE] INDEX indnév. ON tábnév. (oszlnév [ASC|DESC]);
DROP INDEX indnév.[ON tábnév];
INSERT INTO tábnév [(on1,on2,.)]
VALUES (e1,e2,e3,.) | szelekciós utasítás;
UPDATE tábnév SET on1=e1,on2=e2,..
WHERE keresési felt. | szelekciós utasítás;
DELETE FROM tábnév
[WHERE keresési felt. | szelekciós utasítás};
Csak teljes sor törlése.
Ha nincs WHERE vagy szelekciós, akkor minden sort töröl.
feladatok
Képzeljük el, hogy egy könyvesboltot vezetünk. Készítsünk egy olyan adatbázist, amelyben nyilvántarthatjuk a készleten lévő könyveket, a rendeléseket, és az eladásokat.
Hozzuk létre a következő táblákat.
Vigyünk fel néhány szállítót a szallito táblába.
Rendeljünk könyveket.
A rendelés megérkezésekor, állítsuk be a teljesítés dátumát az adott napi dátumra, és aktualizáljuk a készletet, ahol az egységárat a beszerzési ártól (rendeles tábla egysegar mezője) állítsuk nagyobbra.
Az egyes könyvek eladásakor aktualizáljuk a készletet (darab mező), és bővítsük az eladás táblát.
Kérdezzük le, hogy milyen könyvekből kell új rendelést feladni (pl. darab<2).
Megoldások
CREATE TABLE
szallito (szall_azon CHAR(3) NOT NULL PRIMARY KEY,
szall_nev CHAR(20) CHECK (szall_nev=UPPER(szall_nev)),
cim CHAR(30) CHECK (cim=UPPER(cim)) );
CREATE TABLE rendeles (rend_szam CHAR(4) NOT NULL PRIMARY KEY,
ISBN CHAR(6) NOT NULL, rend_dat DATE DEFAULT SYSDATE NOT NULL,
szall_azon NOT NULL REFERENCES szallito,
telj_dat DATE,
egysegar NUMBER (4) NOT NULL,
mennyiseg NUMBER (4));
CREATE TABLE keszlet (ISBN CHAR(6) NOT NULL, besz_dat DATE DEFAULT SYSDATE NOT
NULL,
PRIMARY KEY(ISBN, besz_dat),
cim CHAR(20) NOT NULL CHECK (cim=UPPER(cim)),
szerzo CHAR(25) CHECK (szerzo=UPPER(szerzo),
egysegar NUMBER(4) NOT NULL,
darab NUMBER(4) NOT NULL);
CREATE TABLE eladas (ISBN CHAR(6) NOT NULL, egysegar NUMBER(4) NOT NULL,
besz_dat DATE DEFAULT SYSDATE NOT NULL);
INSERT INTO szallito VALUES ('001','FOSPED','BUDAPEST');
INSERT INTO rendeles VALUES ('0001', '100001',SYSDATE,'001',NULL,1300,10);
UPDATE rendeles SET telj_dat=SYSDATE
WHERE rend_szam='0001';
Tranzakció: Tetszőleges adatmanipulációs utasítások egy sorozata.
lefutott a tranzakció à ellentmondásmentes adatbázis
nem futott le a tranzakció à ellentmondásos adatbázis
COMMIT
A tranzakció utáni állapotot rögzíti.
ROLLBACK
A tranzakció előtti állapotot állítja vissza.
Ezek a parancsok automatikusan és expliciten is meghívásra kerülnek.
Az Oracle rendszerbe történő bejelentkezéshez szükséges
felhasználói név
jelszó
jogok
A jogok lehetnek
a rendszer használatával kapcsolatos jogok (privilégiumok)
a táblák használatával kapcsolatos jogok (hozzáférési jogok)
Connect
Resource
Dba
CONNECT
bejelentkezhet az Oracle RDBMS-be és használhatja
betekinthet táblákba, amelyekre SELECT jogot kapott
betekinthet a Public minősítésű táblákba
az adatmanipulációs utasításokat használhatja azokra a táblákra, amelyekre a tábla tulajdonosa megfelelő jogokat adott (INSERT, DELETE, UPDATE)
nézettáblákat (view) definiálhat
RESOURCE
minden CONNECT jog
táblák, indexek létrehozása és törlése
az általa létrehozott táblákra vonatkozóan jogokat adhat tovább más felhasználóknak
az általa létrehozott táblákra, indexekre igénybe veheti a rendszer AUDITING szolgáltatását
DBA
minden RESOURCE jog
bármely felhasználó adataiba betekinthet, és lekérdezést hajthat végre
jogokat adhat és vonhat vissza bárkitől
PUBLIC-nak minősíthet adatokat
rendszer AUDITING
teljes adatbázis export/import
SELECT |
INDEX |
INSERT |
ALTER |
DELETE |
UPDATE |
REFERENCES |
|
A tábla tulajdonosa vagy DBA jogú felhasználó adhatja illetve vonhatja vissza ezeket a hozzáférési jogokat.
Privilégiumok és hozzáférési jogok adása illetve visszavonása a GRANT illetve a REVOKE utasítással történik.
GRANT privilégium TO felhasználó IDENTIFIED BY jelszó;
REVOKE privilégium FROM felhasználó;
GRANT ALL | hozzáférési_jog [,hozzáférési_jog .] ON táblanév TO PUBLIC | felhaszáló [,felhaszáló] [WITH GRANT OPTION];
GRANT oszlop_jog (oszlop)[, oszlop_jog (oszlop) .] ON táblanév TO PUBLIC | felhaszáló [,felhaszáló] [WITH GRANT OPTION];
REVOKE ALL | hozzáférési_jog [,hozzáférési_jog .] ON táblanév FROM PUBLIC | felhaszáló;
A felhasználó helyett állhat a PUBLIC is, ekkor mindenki számára biztosítjuk a jogokat.
Az összes hozzáférési jog helyett állhat ALL.
oszlop_jog: UPDATE, REFERENCES
[WITH GRANT OPTION] ha megadjuk, a felhasználó továbbadhatja a jogokat.
Találat: 1975