kategória | ||||||||||
|
||||||||||
|
||
1. &nb 434h73e sp; &nb 434h73e sp; A DBU program elindítása után meg kell nyitni az adatállományt ( F2 és a Database kiválasztása, majd a megjelenő ablakból az adatállomány nevét kell kiválasztani, OK ).
Ezután az F3 billentyű leütésével, majd a Database kiválasztásával megkapjuk az adatállomány struktúráját.
Ezután az F5 billentyű leütésével és a Database kiválasztásával megjelenik a képernyőn az adatállomány tartalma, melyben a nyíl-billentyűk segítségével tudunk közlekedni.
2. &nb 434h73e sp; &nb 434h73e sp; A DBU program elindítása után az F3 billentyűt kell leütni és kiválasztani a Database menüpontot. A megjelenő táblázatot ki kell tölteni a feladatban megadottaknak megfelelően. Az egyes értékek beütése után ENTER-t kell ütni. A következő sorba a lefelé nyíllal léphetünk. A táblázat kitöltése után az F4 billentyű leütésével kérjük a struktúra elmentését. Ekkor kell megadni az állomány nevét. A név beütése után az OK -ra kell ENTER-t ütni.
3. &nb 434h73e sp; &nb 434h73e sp; A DBU program elindítása után nyissuk meg a kívánt adatállományt (ARU.DBF) az 1. feladatban leírtaknak megfelelően. Az F3 billentyű (Create) leütése után válasszuk az index menüpontot. A megjelenő ablakba be kell írni az indexállomány nevét (amelyet létre szeretnénk hozni, pl. ARIND), majd a kulcsmező nevét (akod). Az OK-ra üssünk ENTER-t. A bal felső sarokban megjelenő üzenet jelzi, hogy az indexállomány létre jött.
4. &nb 434h73e sp; &nb 434h73e sp; Az 1. feladat b) pontjában ismertetett módon nyissuk meg az adatállományt, majd jelenítsük meg a tartalmát a képernyőn. Mivel az adatállományunk üres, így csak az üres táblázatot fogjuk látni. A táblázatban töltsünk ki 5 sort. Egy-egy mezőbe belépni, illetve kilépni belőle az ENTER billentyűvel lehet. ůj sorba a lefelé nyíllal léphetünk.
5. &nb 434h73e sp; &nb 434h73e sp; Az 1. feladat b) pontjában ismertetett módon nyissuk meg az adatállományt, majd jelenítsük meg a tartalmát a képernyőn. A DELETE billentyű leütésével az 1. rekordot törlésre állítjuk. A táblázat fejlécében megjelenik a <DELETED> felirat. Ezután a lefelé nyíl segítségével pozícionáljunk a 4. rekordra, majd üssük le a DELETE billentyűt.
6. &nb 434h73e sp; &nb 434h73e sp; Az 1. feladatban ismertetett módon nyissuk meg az adatállományt. Az F6 billentyű leütésére megjelenő menüből válasszuk ki a PACK menüpontot. A bal felső sarokban megjelenő kérdésre válaszoljunk az Y leütésével. A megjelenő üzenet jelzi a művelet végrehajtását.
7. &nb 434h73e sp; &nb 434h73e sp; Az 1. feladat b) pontjában ismertetett módon nyissuk meg az adatállományt. Az F6 billentyű leütésére megjelenő menüből válasszuk ki a ZAP menüpontot. A bal felső sarokban megjelenő kérdésre válaszoljunk az Y leütésével. A megjelenő üzenet jelzi a művelet végrehajtását.
A DBU programból az ESC billentyűvel lehet kilépni!
8. &nb 434h73e sp; &nb 434h73e sp;
CREATE TABLE etel
(ekod NUMBER(5) PRIMARY KEY,
enev CHAR(40),
etelf CHAR(25),
kaloria NUMBER(7,2),
ar NUMBER(6,2),
keszido NUMBER(5),
skod NUMBER(3))
CREATE TABLE etrend
(ho NUMBER(2) NOT NULL,
nap NUMBER(2) NOT NULL,
etszam NUMBER(1) NOT NULL,
ekod NUMBER(5))
CREATE TABLE szakacs
(skod NUMBER(3) PRIMARY KEY,
snev CHAR(40),
szev NUMBER(4),
fokozat CHAR(10))
A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreternél a NUMBER adattípusnak nem adható meg a hossza, ezért célszerűbb a DECIMAL adattípust használata. Az elsődleges kulcs definíciója pedig az oszlopmegadások után következik:
CREATE TABLE etel
(ekod DECIMAL(5),
enev CHAR(40),
etelf CHAR(25),
kaloria DECIMAL(7,2),
ar DECIMAL(6,2),
keszido DECIMAL(5),
skod DECIMAL(3),
PRIMARY KEY (ekod))
CREATE TABLE etrend
(ho DECIMAL(2) NOT NULL,
nap DECIMAL(2) NOT NULL,
etszam DECIMAL(1) NOT NULL,
ekod DECIMAL(5))
CREATE TABLE szakacs
(skod DECIMAL(3),
snev CHAR(40),
szev DECIMAL(4),
fokozat CHAR(10)
PRIMARY KEY (skod))
9. &nb 434h73e sp; &nb 434h73e sp; &nb 434h73e sp;
CREATE INDEX etind ON etel(ekod)
CREATE INDEX szakind ON szakacs(skod)
A GUPTA adatbáziskezelő rendszer megköveteli, hogy az elsődleges kulcsra UNIQUE indexet hozzunk létre. Addig a tábla nem használható:
CREATE UNIQUE INDEX etind ON etel(ekod)
CREATE UNIQUE INDEX szakind ON szakacs(skod)
10. &nb 434h73e sp;
INSERT INTO etel (ekod,enev,etelf,kaloria,ar,keszido,skod)
VALUES (34231,'DERELYE','TESZTA',350,80,140,123)
Mivel a sor minden mezője kitöltésre kerül és ismerjük a táblában az oszlopok sorrendjét, az oszlopok felsorolása kimaradhat az utasításból:
11. &nb 434h73e sp;
INSERT INTO etel
VALUES (34231,'DERELYE','TESZTA',350,80,140,123)
A megadott adatokat az INSERT utasítás segítségével lehet felvinni a táblákba az előző feladatban ismertetett módon.
12. &nb 434h73e sp; UPDATE etel SET ar=120, kaloria=210 WHERE ekod=54321
13. &nb 434h73e sp; UPDATE etel SET ar=ar+20
14. &nb 434h73e sp; UPDATE etel SET keszido=keszido-20 WHERE kaloria>300
15. &nb 434h73e sp; SELECT * FROM etel
16. &nb 434h73e sp; SELECT * FROM etel WHERE etelf='LEVES'
17. &nb 434h73e sp;
SELECT enev,ar FROM etel
WHERE etelf IN('LEVES','HUS','GYUMOLCS')
18. &nb 434h73e sp; SELECT enev,etelf,kaloria FROM etel WHERE kaloria>200
19. &nb 434h73e sp;
SELECT enev,ar,kaloria FROM etel
WHERE ar<150 ORDER BY ar
20. &nb 434h73e sp;
SELECT env,etelf,keszido FROM etel
WHERE keszido<=30 ORDER BY keszido DESC
21. &nb 434h73e sp; SELECT DISTINCT etelf FROM etel
22. &nb 434h73e sp;
SELECT enev,kaloria,keszido FROM etel
WHERE kaloria BETWEEN 100 AND 300
ORDER BY kaloria DESC, enev
23. &nb 434h73e sp;
SELECT enev,ar,keszido FROM etel
WHERE etelf='HUS' AND ar BETWEEN 200 AND 500
ORDER BY ar DESC, keszido DESC
24. &nb 434h73e sp;
a)
SELECT * FROM szakacs ORDER BY szev
b) SELECT * FROM szakacs ORDER BY szev DESC
25. &nb 434h73e sp; SELECT * FROM szakacs ORDER BY fokozat, szev DESC
26. &nb 434h73e sp; SELECT DISTINCT fokozat FROM szakacs
27. &nb 434h73e sp; SELECT snev,szev FROM szakacs WHERE fokozat='MESTER' ORDER BY snev
28. &nb 434h73e sp;
SELECT snev,fokozat FROM szakacs
WHERE szev<1960 ORDER BY fokozat,snev
29. &nb 434h73e sp; SELECT * FROM etrend WHERE ho=6 AND nap=21
30. &nb 434h73e sp; SELECT * FROM etrend WHERE etszam=3 ORDER BY ho,nap
31. &nb 434h73e sp;
SELECT ekod FROM etrend
WHERE ho=2 AND nap=1 AND etszam=5
32. &nb 434h73e sp; SELECT * FROM etel WHERE enev LIKE 'B%'
33. &nb 434h73e sp; SELECT enev,ar FROM etel WHERE enev LIKE '_O%'
34. &nb 434h73e sp; SELECT snev,fokozat FROM szakacs WHERE snev LIKE 'K_R%'
35. &nb 434h73e sp; SELECT MAX(ar) FROM etel
36. &nb 434h73e sp; SELECT MIN(szev) FROM szakacs
37. &nb 434h73e sp; SELECT MAX(kaloria) FROM etel
38. &nb 434h73e sp; SELECT MIN(ar) FROM etel
39. &nb 434h73e sp; SELECT MAX(ar)-MIN(ar) FROM etel
40. &nb 434h73e sp; SELECT MAX(szev)-MIN(szev) FROM szakacs
41. &nb 434h73e sp; SELECT COUNT(*) FROM etel
42. &nb 434h73e sp; SELECT COUNT(*) FROM etel WHERE etelf='HUS'
43. &nb 434h73e sp; SELECT COUNT(*) FROM szakacs WHERE fokozat='KUKTA'
44. &nb 434h73e sp; SELECT COUNT(*) FROM etrend WHERE ho=3 AND nap=15
45. &nb 434h73e sp;
a)
SELECT COUNT(*) FROM etrend WHERE ekod=20345
b) SELECT COUNT(*) FROM etrend WHERE ekod=20345 AND etszam=1
46. &nb 434h73e sp;
SELECT AVG(kaloria) FROM etel
WHERE etelf='EDESSEG'
47. &nb 434h73e sp; SELECT SUM(ar) FROM etel WHERE etelf='GYUMOLCS'
48. &nb 434h73e sp; SELECT AVG(ar) FROM etel WHERE kaloria<200
49. &nb 434h73e sp; SELECT COUNT(*) FROM etel WHERE keszido>60
A táblázatban az elkészítési idő percben van megadva!
50. &nb 434h73e sp;
SELECT SUM(keszido) FROM etel
WHERE etelf='LEVES' AND ar<80
51. &nb 434h73e sp; SELECT MIN(ar) FROM etel WHERE etelf='EDESSEG'
52. &nb 434h73e sp; SELECT MIN(szev) FROM szakacs WHERE fokozat='KUKTA'
53. &nb 434h73e sp;
SELECT MAX(ar) FROM etel
WHERE kaloria BETWEEN 200 AND 300
54. &nb 434h73e sp;
SELECT snev,szev FROM szakacs
WHERE szev=(SELECT MAX(szev) FROM szakacs)
55. &nb 434h73e sp;
SELECT ar,enev, FROM etel
WHERE ar=(SELECT MIN(ar) FROM etel)
56. &nb 434h73e sp;
SELECT enev,etelf FROM etel
WHERE ar<(SELECT AVG(ar) FROM etel)
57. &nb 434h73e sp;
SELECT snev,szev,fokozat FROM szakacs
WHERE szev<(SELECT AVG(szev) FROM szakacs)
ORDER BY szev DESC
58. &nb 434h73e sp;
SELECT fokozat, MIN(szev) FROM szakacs
GROUP BY fokozat
Az oszlopok megadásánál célszerű a fokozatot is felsorolni, mert egyébként csak a születési éveket kapnánk eredményül, és nem tudnánk, hogy melyik melyik fokozathoz tartozik. Az oszlopok megadásánál az oszlopfüggvénnyel együtt csak az az oszlopnév szerepelhet, amelyre a csoportosítást végezzük.
59. &nb 434h73e sp; SELECT etelf, AVG(ar) FROM etel GROUP BY etelf
60. &nb 434h73e sp; SELECT ho, MAX(nap) FROM etrend GROUP BY ho
61. &nb 434h73e sp;
SELECT etelf, SUM(kaloria) FROM etel
WHERE keszido<60
GROUP BY etelf
62. &nb 434h73e sp;
a)
SELECT ho, COUNT(*) FROM etrend WHERE ekod=12345 GROUP BY ho
b) SELECT ho, COUNT(*) FROM etrend
WHERE ekod=12345 AND etszam=5 GROUP BY ho
63. &nb 434h73e sp;
SELECT ho,
COUNT(*) FROM etrend GROUP BY ho
HAVING ho IN(3,4,5)
A feltételt WHERE opcióban is megadhatjuk:
SELECT ho, COUNT(*) FROM etrend WHERE ho IN(3,4,5)
GROUP BY ho
64. &nb 434h73e sp;
SELECT etelf, AVG(kaloria) FROM etel GROUP BY etelf
HAVING etelf IN('TESZTA','EDESSEG')
A feltételt WHERE opcióban is megadhatjuk:
SELECT etelf, AVG(kaloria) FROM etel
WHERE etelf IN('TESZTA','EDESSEG') GROUP BY etelf
65. &nb 434h73e sp;
SELECT enev,ar FROM etel WHERE etelf='LEVES' AND
ar=(SELECT MIN(ar) FROM etel WHERE etelf='LEVES')
A belső SELECT segítségével meghatározzuk a legolcsóbb leves árát. A külső SELECT utasításban leválogatjuk azokat az ételeket, amelyek ára megegyezik a belső SELECT által meghatározott értékkel. Azonban itt is meg kell adni azt a feltételt, hogy a leválogatást csak a levesek közül végezze, hiszen előfordulhat, hogy más ételféleségek között is van olyan étel, amelynek ára megegyezik azzal az árral, amelyet a belső SELECT meghatározott. Ekkor azokat az ételeket is leválogatnánk, pedig mi csak a levesekre vagyunk kíváncsiak.
Így tehát a feltételt kétszer kell megadnunk, mind a belső, mind a külső SELECT-ben szerepelnie kell.
66. &nb 434h73e sp;
SELECT snev FROM szakacs WHERE fokozat='MESTER' AND
szev=(SELECT MIN(szev) FROM szakacs
WHERE fokozat='MESTER')
A fokozatra vonatkozó feltételt mind a belső, mind a külső SELECT-ben meg kellett adni, hasonlóan az előző feladat megoldásához.
67. &nb 434h73e sp;
SELECT enev,etelf,ar,snev,fokozat FROM etel,szakacs
WHERE etel.skod=szakacs.skod
ORDER BY etelf,enev
68. &nb 434h73e sp;
SELECT enev,ar,snev FROM etel,szakacs
WHERE etelf='HUS' AND etel.skod=szakacs.skod
69. &nb 434h73e sp;
SELECT nap,etszam,enev FROM etrend,etel
WHERE ho=5 AND etel.ekod=etrend.ekod
ORDER BY nap,etszam
70. &nb 434h73e sp;
SELECT etszam,enev,szakacs FROM etrend,etel,szakacs
WHERE ho=7 AND nap=23 AND etrend.ekod=etel.ekod
AND etel.skod=szakacs.skod
71. &nb 434h73e sp;
SELECT enev,etelf FROM etel WHERE skod=
(SELECT skod FROM szakacs WHERE snev='FALANK EDE')
Ahhoz, hogy meghatározzuk a Falánk Ede által készített ételeket, meg kell tudnunk, hogy mi a kódja ennek a szakácsnak, hiszen a az ETEL táblában csak a szakácsok kódja szerepel, a nevük nem. A név alapján a kódot a SZAKACS táblából tudjuk kikeresni. Erre szolgál a belső SELECT. A külső SELECT segítségével válogatjuk le a keresett ételeket.
A feladatot a két tábla összekapcsolásával is meg lehet oldani:
SELECT enev,etelf FROM etel,szakacs
WHERE etel.skod=szakacs.skod AND snev='FALANK EDE'
72. &nb 434h73e sp;
SELECT DISTINCT ho,nap FROM etrend
WHERE ekod=(SELECT ekod FROM etel WHERE skod=
(SELECT skod FROM szakacs WHERE snev='FALANK EDE'))
Ez az utasítás három egymásba ágyazott SELECT utasításból áll. A legbelső meghatározza a Falánk Ede nevű szakács kódját, a következő pedig azon ételek kódját, amelyeket ő készít el. A külső SELECT az étrendből kiválasztja azokat a napokat, amikor az előbb meghatározott ételek lesznek terítéken. Mivel egy nap több ételt is készíthet Falánk Ede, csak a különböző napokat íratjuk ki.
A leválogatást a
három tábla összekapcsolásával is megfogalmazhatjuk:
SELECT DISTINCT ho,nap FROM etrend,etel,szakacs
WHERE snev='FALANK EDE' AND
etrend.ekod=etel.ekod AND etel.skod=szakacs.skod
73. &nb 434h73e sp;
SELECT snev,fokozat FROM szakacs WHERE skod=
(SELECT skod FROM etel WHERE ekod=
(SELECT ekod FROM etrend WHERE ho=5 AND nap=25))
Ez az utasítás három egymásba ágyazott SELECT utasításból áll. A legbelső meghatározza a május 25-i ételek kódját, a következő az ezeket elkészítő szakácsok kódját, a külső SELECT pedig ezen szakácsok nevét és fokozatát.
A leválogatást a három tábla összekapcsolásával is megfogalmazhatjuk:
SELECT snev,fokozat FROM etrend,etel,szakacs
WHERE ho=5 AND nap=25 AND
etrend.ekod=etel.ekod AND etel.skod=szakacs.skod
74. &nb 434h73e sp;
SELECT enev,ar FROM etel WHERE ar>
(SELECT ar FROM etel WHERE enev='RANTOTT SZELET')
vagy:
SELECT x.enev,x.ar FROM etel x ,etel y
WHERE x.ar>y.ar AND y.enev='RANTOTT SZELET'
Ebben a megfogalmazásban a lekérdezést két tábla összekapcsolásával oldottuk meg. Mind a két tábla az ETEL tábla. Elkészítettük az ETEL tábla önmagával vett direkt szorzatát, és azokat a sorokat választottuk ki belőle, ahol a második ételnév a rántott szelet és az első ár nagyobb, mint a második ár. A SELECT utasításban a két ETEL táblát meg kell különböztetni egymástól, ezért az egyiket x-nek, a másikat y-nak hívjuk. Az oszlopnevek megadásakor mindig jelezni kell, hogy melyik tábla oszlopáról van szó.
75. &nb 434h73e sp;
SELECT ho,nap,SUM(ar) FROM etel,etrend
WHERE etel.ekod=etrend.ekod GROUP BY ho,nap
76. &nb 434h73e sp;
a)
SELECT enev,ar,kaloria FROM etel
WHERE ar<(SELECT AVG(ar) FROM etel)
UNION
SELECT enev,ar,kaloria FROM etel
WHERE keszido<(SELECT AVG(keszido) FROM etel)
b) SELECT enev,ar,kaloria FROM etel
WHERE ar<(SELECT AVG(ar) FROM etel)
INTERSECT
SELECT enev,ar,kaloria FROM etel
WHERE keszido<(SELECT AVG(keszido) FROM etel)
A feladat első részében a két feltétel valamelyikének teljesülését követeltük meg, ezért a két leválogatás eredménytáblájának unióját képeztük. A második részben a két feltételnek együttesen kell teljesülnie, ezért a két eredménytábla metszetét kell képeznünk.
77. &nb 434h73e sp;
SELECT enev FROM etel WHERE ekod IN
(SELECT ekod FROM etrend WHERE eszam=1
INTERSECT
SELECT ekod FROM etrend WHERE eszam=5)
A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza az INTERSECT műveletet.
78. &nb 434h73e sp;
SELECT snev FROM szakacs WHERE skod IN
(SELECT skod FROM etel WHERE etelf='EDESSEG'
MINUS
SELECT skod FROM etel WHERE etelf<>'EDESSEG')
A belső SELECT első része kiválasztja azoknak a szakácsoknak a kódját, akik készítenek édességet, a második rész pedig azokét választja ki, akik más ételeket főznek. Az édességet készítő szakácsok halamzából kivonjuk azoknak a szakácsoknak a halmazát, akik más ételféleséget készítenek. Az így kapott halmaz azoknak a szakácsoknak a kódját fogja tartalmazni, akik csak édességet készítenek. A külső SELECT-ben a szakacs táblából meghatározzuk a szakácsok nevét.
A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza a MINUS műveletet.
79. &nb 434h73e sp;
a) SELECT ho,nap FROM etrend WHERE etszam=5
b) SELECT ho,nap FROM etrend
MINUS
SELECT ho,nap FROM etrend WHERE etszam=5
Az étrend
táblából kiválasztjuk a különböző dátumokat, majd kivonjuk belőle azokat a
dátumokat, amelyeken van 5. étkezés. Ez a parancs nem helyettesíthető egy olyan
leválogatással, amelynek feltétele az, hogy etszam<>5 . Ez ugyanis minden
olyan hónapot és napot leválogatna, amelyen van 5-től különböző számú étkezés.
Azonban ezeken a napokon lehet 5. étkezés is.
c) SELECT ho,nap FROM etrend WHERE etszam=3
MINUS
SELECT ho,nap FROM etrend WHERE etszam>3
Az étrend táblából kiválasztjuk azokat a napokat, amelyeken van 3. étkezés,
majd kivonjuk belőle azokat a napokat, amelyeken van 3-nál nagyobb számú
étkezés.
A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza a MINUS műveletet.
80. &nb 434h73e sp; SELECT snev FROM szakacs WHERE skod NOT IN (SELECT skod FROM etel WHERE etelf='LEVES')
vagy:
SELECT snev FROM szakacs WHERE NOT EXISTS (SELECT * FROM etel WHERE etelf='LEVES' AND szakacs.skod=etel.skod)
81. &nb 434h73e sp;
CREATE VIEW olcso AS
SELECT enev,kaloria,ar FROM etel WHERE ar<100
82. &nb 434h73e sp;
CREATE VIEW husok AS
SELECT enev,ar,keszido,snev,fokozat FROM etel,szakacs WHERE etelf='HUS' AND etel.skod=szakacs.skod
83. &nb 434h73e sp;
CREATE VIEW etlap AS
SELECT etszam,enev,ar,snev FROM etel,etrend,szakacs WHERE ho=7 AND nap=1 AND etel.ekod=etrend.ekod AND etel.skod=szakacs.skod
84. &nb 434h73e sp; SELECT enev,ar,snev FROM etlap WHERE etszam=3
85. &nb 434h73e sp; DROP VIEW etlap
86. &nb 434h73e sp; DELETE FROM etrend WHERE ho=2 AND nap=1
87. &nb 434h73e sp; &nb 434h73e sp; &nb 434h73e sp; DELETE FROM etel WHERE kaloria >300
88. &nb 434h73e sp; DELETE FROM szakacs WHERE szev<1960 AND fokozat='KUKTA'
89. &nb 434h73e sp;
DELETE etrend
Az ETREND tábla minden sora törlődik, de maga a tábla megmarad, így bármikor
vihetünk fel újabb sorokat a táblába.
90. &nb 434h73e sp; DROP TABLE etrend
91. &nb 434h73e sp;
CREATE TABLE orszag
(okod NUMBER (5) PRIMARY KEY,
onev CHAR(25),
foldresz CHAR(10),
terulet NUMBER(7,2),
ed CHAR(1),
fszel NUMBER(3) NOT NULL,
fhossz NUMBER(3) NOT NULL)
CREATE TABLE allat
(akod NUMBER(5) PRIMARY KEY,
anev CHAR(30),
faj CHAR(30),
suly NUMBER(7,2),
hossz NUMBER(7,2),
szdatum DATE)
A GUPTA adatbáziskezelő rendszerben
megvalósított SQL interpreternél a NUMBER adattípusnak nem adható meg a hossza,
ezért célszerűbb a DECIMAL adattípust használata. Az elsődleges kulcs
definíciója pedig az oszlopmegadások után következik:
CREATE TABLE orszag
(okod NUMBER (5),
onev CHAR(25),
foldresz CHAR(10),
terulet NUMBER(7,2),
ed CHAR(1),
fszel NUMBER(3) NOT NULL,
fhossz NUMBER(3) NOT NULL
PRIMARY KEY (okod))
CREATE TABLE allat
(akod NUMBER(5),
anev CHAR(30),
faj CHAR(30),
suly NUMBER(7,2),
hossz NUMBER(7,2),
szdatum DATE
PRIMARY KEY (akod))
92. &nb 434h73e sp;
CREATE INDEX orind ON orszag(okod)
CREATE INDEX alind ON allat(akod)
A GUPTA adatbáziskezelő rendszer
megköveteli, hogy az elsődleges kulcsra UNIQUE indexet hozzunk létre. Addig a
tábla nem használható:
CREATE UNIQUE INDEX orind ON orszag(okod)
CREATE UNIQUE INDEX alind ON allat(akod)
93. &nb 434h73e sp;
INSERT INTO orszag
(okod,onev,foldresz,terulet,nepesseg,legmag)
VALUES (12345,'MAGYARORSZAG','EUROPA',93,10000,1014)
Mivel a rekord minden mezője értéket kap, a mezőneveket nem kell felsorolni, az
utasítás így is megadható:
INSERT INTO orszag
VALUES (12345,'MAGYARORSZAG','EUROPA',93,10000,1014)
94. &nb 434h73e sp;
INSERT INTO allat (akod,anev,hossz)
VALUES (23232,'TATU',120)
Ebben az utasításban a rekordnak csak néhány mezője kap értéket, ezért itt fel
kell sorolni azokat a mezőneveket, amelyekre az értékadás vonatkozik.
95. &nb 434h73e sp; SELECT * FROM allat
96. &nb 434h73e sp; SELECT anev FROM allat
97. &nb 434h73e sp;
SELECT DISTINCT foldresz FROM orszag
Az ORSZAG állományban előforduló földrésznevek közül mindegyiket csak egyszer
szeretnénk kiírni, ezért szükséges a DISTINCT opció.
98. &nb 434h73e sp; SELECT onev FROM orszag ORDER BY onev
99. &nb 434h73e sp; SELECT anev,hossz,suly FROM allat ORDER BY suly DESC
SELECT onev,foldresz FROM orszag ORDER BY foldresz,onev
SELECT anev,szdatum FROM allat ORDER BY szdatum DESC
SELECT onev,terulet FROM orszag ORDER BY terulet DESC, onev
Figyeljünk arra, hogy a rendezésnél a DESC opciót mindig azután a mezőnév után
kell írni, amelyik szerint csökkenő sorrendben szeretnénk rendezni. Ha több
mező szerint is csökkenő rendezettséget szeretnénk elérni, a DESC opciót
SELECT onev,terulet FROM orszag WHERE foldresz='EUROPA'
SELECT hossz,suly,szdatum FROM allat WHERE anev='CSIKOS'
SELECT * FROM orszag WHERE onev='FRANCIAORSZAG'
SELECT onev,terulet,foldresz FROM orszag WHERE terulet>30
SELECT onev FROM orszag WHERE nepesseg BETWEEN 20 AND 50
SELECT onev FROM orszag WHERE foldresz IN('EUROPA','AFRIKA','AZSIA')
AND terulet<8
vagy:
SELECT onev FROM orszag WHERE (foldresz='EUROPA' OR foldresz='AFRIKA'
OR foldresz='AZSIA') AND terulet<8
SELECT anev,suly,szdatum FROM allat WHERE suly>100 AND szdatum>'1992-DEC-31'
SELECT anev,suly,szdatum FROM allat
WHERE suly BETWEEN 5 AND 10 ORDER BY szdatum
SELECT * FROM allat WHERE suly>50 OR
szdatum<'1950-JAN-01' ORDER BY anev
SELECT * FROM allat WHERE anev LIKE 'V%' ORDER BY szdatum
SELECT anev,faj FROM allat WHERE anev LIKE '___A___'
Az A betű előtt és után 3 aláhúzás karakter van, amely a név első, illetve
utolsó 3 ismeretlen betűjét helyettesíti.
SELECT * FROM orszag WHERE onev LIKE '__E%'
Az E betű előtt két aláhúzás karakter van.
SELECT anev,faj,szdatum FROM allat WHERE okod IS NULL
SELECT COUNT(*) FROM orszag
SELECT MAX(terulet) FROM orszag
SELECT onev,terultet FROM orszag WHERE terulet=(SELECT MAX(terulet) FROM orszag)
Azt a sort, amelyben a legnagyobb területérték szerepel, csak belső SELECT
segítségével tudjuk kiválasztani. A belső SELECT eredménye a területértékek
maximuma. A külső SELECT feltétele pedig az, hogy olyan sort (sorokat)
keresünk, amelyben a területérték megegyezik a belső SELECT által adott
maximális értékkel.
SELECT onev,nepesseg FROM orszag WHERE nepesseg=(SELECT MIN(nepesseg) FROM orszag)
a)
SELECT SUM(terulet) FROM orszag WHERE foldresz='EUROPA'
b) SELECT AVG(terulet) FROM orszag WHERE foldresz='EUROPA'
a)
SELECT foldresz, SUM(terulet) FROM orszag GROUP BY foldresz
b) SELECT foldresz, SUM(terulet) FROM orszag WHERE nepesseg>5000
GROUP BY foldresz
Azt, hogy az összegzésben csak azon országok vegyenek részt, amelyek lakossága
5 millió fölött van, a WHERE feltételben tudjuk megfogalmazni. Vigyázat, ezt
nem írhatjuk HAVING opcióként, mert a feltétel nem arra a mezőre vonatkozik,
amelyik szerint a csoportképzés történik.
a)
SELECT COUNT(*) FROM allat WHERE suly>200
b) SELECT COUNT(okod) FROM allat
c) SELECT COUNT(*)-COUNT(okod) FROM allat
SELECT MAX(suly), MIN(suly) FROM allat
a)
SELECT AVG(suly) FROM allat WHERE hossz>200
b) SELECT AVG(suly) FROM allat WHERE hossz<2
SELECT COUNT(*) FROM allat WHERE hossz>500
SELECT COUNT(*) FROM allat WHERE hossz<1
SELECT COUNT(*) FROM allat
WHERE okod=(SELECT okod FROM orszag WHERE onev='MAGYARORSZAG')
Ahhoz, hogy megállapítsuk, hogy hány állat származik Magyarországról, meg kell
keresnünk Magyarország kódját az ORSZAG táblában. Ezért szükséges a belső
SELECT.
A feladatot megoldhatjuk az ALLAT és az ORSZAG tábla összekapcsolásával is:
SELECT COUNT(*) FROM allat,orszag
WHERE onev='MAGYARORSZAG' AND allat.okod=orszag.okod
SELECT anev FROM allat WHERE okod=
(SELECT okod FROM orszag WHERE onev='MAGYARORSZAG')
ORDER BY anev
A feladatot megoldhatjuk a két tábla összekapcsolásával is. Ebből a táblából
azon sorokat kell kiválasztani, amelyekben az országnév MAGYARORSZAG. Az
oszlopok közül pedig csak az anev
oszlopot kell megjeleníteni:
SELECT anev FROM allat,orszag WHERE allat.okod=orszag.okod AND onev='MAGYARORSZAG' ORDER BY anev
SELECT foldresz,onev,anev,faj FROM orszag,allat WHERE orszag.okod=allat.okod
ORDER BY foldresz,onev,anev
A feladatot a két tábla összekapcsolásával oldhatjuk meg. Az eredménytábla
minden sorát meg kell jeleníteni, ezért a WHERE opcióban csak az
összeekapcsolási feltétel szerepel. Az oszlopok közül csak a feladatban
megadott oszlopokat kell kiírni, ezek felsorolása szerepel a SELECT kulcsszó
után. A rendezési feltételeket az ORDER BY opcióban adtuk meg.
SELECT onev FROM orszag WHERE okod IN
(SELECT okod FROM allat WHERE faj='GORILLA')
A belső SELECT több országkódot is eredményezhet, ezért szükséges az
egyenlőségjel helyett az IN operátor használata.
vagy:
SELECT onev FROM orszag,allat WHERE orszag.okod=allat.okod AND anev='GORILLA'
SELECT anev,hossz FROM allat WHERE okod IN
(SELECT okod FROM orszag WHERE foldresz='AMERIKA') AND hossz>200
ORDER BY hossz DESC
A belső SELECT több országkódot ad eredményül, ezért szükséges az egyenlőségjel
helyett az IN operátor használata.
vagy:
SELECT anev,hossz FROM allat,orszag WHERE allat.okod=orszag.okod
AND hossz>200 AND foldresz='AMERIKA' ORDER BY hossz DESC
SELECT faj FROM allat WHERE okod=
(SELECT okod FROM orszag WHERE onev='MAGYARORSZAG')
INTERSECT
SELECT faj FROM allat WHERE okod=
(SELECT okod FROM orszag WHERE onev='OLASZORSZAG')
Egy SELECT utasítással kiválasztjuk azon állatfajtákat, amelyeknek származnak
egyedei Magyarországról, a másik SELECT utasítással pedig azon állatfajtákat,
amelyeknek származnak egyedei Olaszországból. A két eredménytábla metszete adja
azon állatfajtákat, amelyek mindkét országból származnak egyedei.
A GUPTA adatbáziskezelő rendszerben
megvalósított SQL interpreter nem tartalmazza az INTERSECT műveletet.
SELECT anev FROM allat WHERE okod IN
(SELECT okod FROM orszag WHERE foldresz='EUROPA')
UNION
SELECT anev FROM allat WHERE okod IN
(SELECT okod FROM orszag WHERE foldresz='AZSIA')
Az első SELECT utasítással kiválasztjuk az európai állatokat (olyan országokból
származó állatok, amelyek Európábnan vannak), a második SELECT utasítással az
ázsiai állatokat választjuk ki. Mindkét SELECT tartalmaz egy belső SELECT-et. A
két eredménytábla azonos felépítésű, egyesítésük adja az Európából és Ázsiából
származó állatok nevét.
Egyesítés nélkül, egyetlen SELECT utasítással - és belső SELECT-ekkel - is
megkaphatjuk a kívánt eredményt:
SELECT anev FROM allat WHERE okod IN
(SELECT okod FROM orszag WHERE
foldresz IN('EUROPA','AZSIA'))
vagy:
SELECT anev FROM allat,orszag WHERE allat.okod=orszag.okod
AND foldresz IN('EUROPA','AZSIA')
SELECT anev FROM allat WHERE suly=(SELECT MAX(suly) FROM allat)
UNION
SELECT anev FROM allat WHERE suly=(SELECT MIN(suly) FROM allat)
SELECT faj FROM allat WHERE okod=
(SELECT okod FROM orszag WHERE onev='MAGYARORSZAG')
MINUS
SELECT faj FROM allat WHERE okod=
(SELECT okod FROM orszag WHERE onev='NEMETORSZAG')
Az első SELECT utasítással azon állatfajtákat határozzuk meg, amelyek
Magyarországról származnak. A második SELECT utasítással pedig a Németországból
származó fajtákat választjuk ki. Az első erdménytáblából ki kell vonni a
második eredménytáblát. Így az első eredménytáblának csak azon sorai maradnak
meg, amelyek a második eredménytáblában nem szerepelnek, vagyis azon
állatfajták, amelyeknek vannak Magyarországról származó egyedei, de nincsenek
Németországból származó egyedei.
A GUPTA adatbáziskezelő rendszerben
megvalósított SQL interpreter nem tartalmazza a MINUS műveletet.
CREATE VIEW EUROALLAT AS
SELECT anev,faj,szev,onev FROM allat,orszag
WHERE foldresz='EUROPA' AND allat.okod=orszag.okod
SELECT * FROM euroallat ORDER BY onev,faj,anev
SELECT anev,szev FROM euroallat WHERE szev=1996 ORDER BY szev
DROP VIEW euroallat
UPDATE orszag SET terulet=9976, foldresz='AMERIKA' WHERE onev='KANADA'
UPDATE orszag SET nepesseg=nepesseg+2 WHERE foldresz='AFRIKA'
UPDATE allat SET suly=suly-0.1 WHERE faj='UHU'
DELETE FROM orszag WHERE terulet<10
DELETE FROM allat WHERE szdatum<'1920-JAN-01'
DELETE FROM orszag
Mivel az utasításban feltételt nem adtunk meg, a tábla minden sora törlődik. Ez
azonban nem jelenti a tábla megszünését. A tábla továbbra is létezik, csak
nincs egyetlen sora sem. Bármikor vihetünk fel a táblába adatokat, a mezők
leírását továbbra is nyilvántartja a rendszer.
DROP TABLE orszag
Találat: 1293