Professional Documents
Culture Documents
Bevezets az SQL-be
OKTATSI SEGDANYAG AZ
ADATBZISKEZELS CM GYAKORLATHOZ
Tartalomjegyzk
I. Adatbzisok .............................................................................................................................. 3
II. Adatdefincis nyelv ............................................................................................................... 6
1. Adattpusok....................................................................................................................... 7
2. Tblk ltrehozsa, mdostsa, trlse........................................................................ 8
3. Nzettblk ltrehozsa s trlse................................................................................. 9
III. Adatmanipulcis nyelv......................................................................................................10
IV. Query.....................................................................................................................................12
1. Projekci ........................................................................................................................13
2. Szelekci (WHERE)......................................................................................................14
3. Kivlasztott sorok rendezse (ORDER BY) .............................................................17
4. Csoportok kpzse (GROUP BY, HAVING)..........................................................18
5. Szrmaztatott adatok lekrdezse (fggvnyek, mveletek)....................................20
6. Join mvelet elvgzse (WHERE AND).........................................................24
7. Egymsba gyazott lekrdezsek (WHERE rszben jabb SELECT)..................26
I. Adatbzisok
Repltr adatbzisa
A jaratok tbla szerkezete
Nv
Null?
Tpus
--------------- ------------ ---------------NOT NULL NUMBER(3)
SZAM
INDULAS
NOT NULL NUMBER(4)
ERKEZES
NOT NULL NUMBER(4)
HONKOD
NOT NULL CHAR(3)
HOVKOD
NOT NULL CHAR(3)
NAPOK
CHAR(7)
SZAM
INDULAS ERKEZES
-------- ------------ ------------- -----123
1152
1436
111
1023
1145
112
1535
1643
113
2032
2115
114
1322
1423
115
1415
1510
Nv
Null?
Tpus
--------------- -------- ---------------KOD
CHAR(3)
VAROS
CHAR(25)
CHECKIN
NUMBER(1)
ILLETEK
NUMBER(5)
KOD VAROS
CHECKIN
------ ------------------------------- ------------- --------------001
Budapest, Ferihegy 1
1
002
Praha
2
003
Warszawa Internacionalna
1
004
Paris Orly
2
005
London Heathrow
HON
HOV
------ ---------001
002
002
001
001
003
003
001
003
004
001
003
Nv
Null?
Tpus
---------------------------------------------------RKOD
NOT NULL CHAR(3)
OSSZEG
NOT NULL NUMBER(5)
KELT
DATE
SZLA
CHAR(10)
ROGZ
NOT NULL CHAR(30)
RKO OSSZEG
KELT
ROGZ
------ -------------- ------------ ------------------------ ----------001
10000
99-OKT-08
kovacs
003
30000
99-OKT-08
NAGY
001
11328
99-DEC-28
Virag
002
23560
00-JAN-13
Lakatos A.
002
2356
00-FEB-09
Virag
002
48000
00-SZE-11
Hegyi
003
42000
01-JN-12
Magyar Bela
004
9364
01-JL-30
Kiss Edit
004
12000
01-AUG-28
Tth dm
NAPOK
hksc-sv
hkscp-v
hkscpsv
hks-psv
-ks-p
hkscpsv
ILLETEK
5000
5000
8000
10000
12000
SZLA
99/M182
99/R436
99/M183
00/M182
00/M011
00/M032
01/R136
01/R658
01/R200
A parancs lersa
A tbla ltrejtt.
A kvetkez oldalon lv, a mesehsk kis boltjnak adatait felhasznl tbla hasznlhat
gyakorlsra, s elrhet a http://oracle.inf.unideb.hu/isqlplus/ felletrl.
Mesehs adatbzis
Relci
Attribtumok
Megjegyzs
MESEHOS
RENDELES
TARTALMAZ
RENDSZAM, CIKKNEV,
MENNYISEG
CIKK
CIKKNEV, EGYSEGAR
Null?
-------NOT NULL
NOT NULL
Tpus
-------CHAR(3)
CHAR(15)
CHAR(20)
NUMBER
AZO
--M01
M02
M03
M04
M05
M06
M07
M08
M09
M10
M11
M12
M13
CIKKNEV
EGYSEGAR
------------ --------repa
20
magnespor
20
cipo
300
puskagolyo
50
mezesbodon
60
kalacs
90
sutolapat
150
kosar
200
szemfestek
150
puska
300
smirgli
20
salata
100
rokacsapda
300
pipihus
200
eros paprika
20
eleszto
15
NEV
--------------Vasorru Baba
Vadasz
Micimacko
Maci Laci
Torpilla
Hetfeju sarkany
A harom nyul
Okoska
Piroska
Tapsi Hapsi
Susu
Vuk
Torpapa
CIM
EGYENLEG
-------------------- --------Mezeskalacs Haz
2500
Vadaszles
0
Szazholdas Pagony
-1000
Hollywood
5030
Gombahaz
Sarkanybarlang
700
Nyuszihaz
-3400
Gombahaz
Erdoszeli haziko
6700
Hollywood
9920
Sarkanybarlang
1130
Rokalyuk
-250
Gombahaz
400
Null?
-------NOT NULL
NOT NULL
Tpus
-------NUMBER
CHAR(12)
NUMBER
RENDSZAM
--------6
13
16
17
22
23
23
25
34
37
37
37
46
49
53
61
66
78
80
97
RENDSZAM
--------6
13
16
17
22
23
25
34
37
46
49
53
61
66
78
80
97
CIKKNEV
MENNYISEG
------------ --------cipo
6
szemfestek
12
rokacsapda
3
repa
200
magnespor
319
szemfestek
4
salata
6
puska
2
cipo
2
smirgli
17
mezesbodon
3
eleszto
20
szemfestek
8
puskagolyo
56
mezesbodon
5
kalacs
1
salata
12
sutolapat
1
cipo
2
kosar
1
MAZ
--M07
M05
M02
M07
M01
M02
M02
M05
M01
M01
M02
M03
M09
M07
M01
M02
M09
Tpus
-------CHAR(12)
NUMBER
Tpus
------NUMBER
CHAR(3)
DATE
DATUM
--------94-OKT-07
93-JAN-01
94-MR-15
92-JAN-21
94-AUG-25
96-OKT-12
97-FEB-28
95-DEC-03
00-JAN-12
96-JL-21
98-MR-05
01-JN-02
03-PR-05
93-OKT-30
95-JL-02
94-NOV-18
96-OKT-20
A lekrdez nyelv adatdefincis nyelvnek (Data Definition Language, DDL) szoktk nevezni
azon parancsok sszessgt, amelyek tblk s egyb objektumok ltrehozst, mdostst s
trlst teszik lehetv.
Ezen kziknyvben az albbiakat trgyaljuk:
1. Adattpusok............................................................................................................................... 7
2. Tblk ltrehozsa, mdostsa, trlse................................................................................ 8
3. Nzettblk ltrehozsa s trlse ......................................................................................... 9
II.1. Adattpusok
II.1.1.1.1.
Tblanv, oszlopnv
max. 30 karakter
hasznlhat karakterek:
Ha aposztrfok kz zrt, brmilyen ASCII karakter lehet
Ha ettl eltr, az albbiak hasznlhatk:
angol acb kis- s nagybeti,
szmjegyek,
$_#
betvel kezddik,
kis- s nagybetk nem megklnbztetettek, kivve, ha aposztrfok kztt szerepelnek,
a tblanevek az adatbzisban, az oszlopnevek a tblban egyediek.
II.1.1.1.2.
Nhny adattpus
CHAR ASCII/EBCDIC,
max 240 karakter
vltoz hosszal troldnak
[pl. CHAR (6)]
NUMBER 09, eljel, tizedes pont,
max. 42 karakterbl llhat
[pl. NUMBER (3) vagy NUMBER (5,2)]
VARCHAR, LONG
VARCHAR
DECIMAL, INTEGER,
SMALLINT, FLOAT
LONG RAW
Az adatmanipulcis nyelvbe (Data Manipulation Language, DML) szoktk egyesek sorolni azon
parancsokat, amelyek az adatok bevitelt, mdostst s trlst teszik lehetv.
Trgyalsra kerlnek itt az
INSERT INTO
UPDATE
DELETE
parancsok.
10
'kovacs',
'99/M182' );
'99/R436' );
11
IV. QUERY
A lekrdezsnek, vagyis a QUERY-nek gyakorlatilag egyetlen parancsa van, a SELECT*, amelyhez tbb kulcsszt s kulcskifejezst alkalmazhatunk a keress szktshez.
A tmakr itt trgyalt rszei:
1. Projekci .................................................................................................................................13
2. Szelekci (WHERE)..............................................................................................................14
3. Kivlasztott sorok rendezse (ORDER BY) .....................................................................17
4. Csoportok kpzse (GROUP BY, HAVING)..................................................................18
5. Szrmaztatott adatok lekrdezse (fggvnyek, mveletek) ............................................20
6. Join mvelet elvgzse (WHERE AND).................................................................24
7. Egymsba gyazott lekrdezsek (WHERE rszben jabb SELECT) ..........................26
12
IV.1. Projekci
SELECT [DISTINCT] oszlopnv [alias_nv], oszlopnv [alias_nv],
FROM tblanv;
SQL> SELECT * FROM jaratok;
SZAM INDULAS ERKEZES HON
--------- --------- --------- --- --- ------123
1152 1436
001
111
1023 1145
002
112
1535 1643
001
113
2032 2115
003
114
1322 1423
003
HOV NAPOK
002
001
003
001
004
hksc-sv
hkscp-v
hkscpsv
hks-psv
-ks-p---
BOL
----001
002
001
003
003
BA
----002
001
003
001
004
SQL> SELECT
2 DISTINCT honkod bol
3 FROM jaratok;
BOL
----001
002
003
13
IV.2. Szelekci:
SELECT [DISTINCT] oszlopnv [alias_nv], oszlopnv [alias_nv],
FROM tblanv
WHERE keressi felttel;
Keressi felttelek:
1) Egyszer sszehasonlts
oszlopnv
oszlopnv
sszehasonlt opertor
sszehasonlt opertor
sszehasonlt opertorok:
= | < | <= | > | >= |
!= | <> | ^=
konstans
oszlopkifejezs
Oszlopkifejezs:
oszlopnv
oszlopokra alkalmazhat beptett
fggvnyek, aritmetikai vagy karaktermveletek
Konstans:
CHAR, NUMBER vagy DATE
tpus
CHAR, DATE: aposztrfok kztt
CHAR esetn Case sensitive
halmazsszehasonlt_opertor
halmazdefinci
IS NULL
ILLETEK
----------5000
5000
10000
12000
BOL
----002
003
SZAM BOL BA
----------- ----- ---112 001 003
113 003 001
114 003 004
115 001 003
f) Budapestrl Varsba men jratot keresnk keddi 11:00 s 16:00 ra kztti rkezssel.
SQL> SELECT szam jarat, indulas
2 FROM jaratok
3 WHERE honkod='001'
4 AND hovkod='003'
5 AND napok LIKE '__s%'
6 AND erkezes BETWEEN 1100 AND 1600;
JARAT INDULAS
--------- ------------115
1415
g) Kilistzzuk a Budapestre Varsbl s Paris Orly-rl rkez jratokat.
SQL> SELECT szam jarat, erkezes
2 FROM jaratok
3 WHERE hovkod='001'
4 AND honkod IN ('003','004');
JARAT ERKEZES
--------- ------------113
2115
h) Kilistzzuk a Budapestre a nem Varsbl s nem Paris Orly-rl rkez jratokat.
SQL> SELECT szam jarat, erkezes
2 FROM jaratok
3 WHERE hovkod='001'
4
AND honkod NOT IN ('003','004');
JARAT ERKEZES
--------- ------------111
1145
16
b) Rendezzk a repltereket a bejelentkezsi id szerint cskken, azon bell a repltr kdja szerint nvekv
sorrendbe!
SQL> SELECT * FROM repter
2 ORDER BY checkin DESC, kod;
KOD VAROS
CHECKIN ILLETEK
------ ----------------------------------------005 London Heathrow
12000
002 Praha
2
5000
004 Paris Orly
2
10000
001 Budapest, Ferihegy 1
1
5000
003 Warszawa Internacionalna
1
8000
17
SUM, AVG
numerikus adatokra.
MIN, MAX, COUNT
numerikus, karakter s dtum tpus adatokra.
A kifejezs ltal meghatrozott oszlopba es csoportok rtkeire vonatkoznak.
Jelentsk:
AVG([DISTINCT|ALL] kifejezs)
tlagot ad. A NULL rtkeket figyelmen kvl hagyja.
SUM([DISTINCT|ALL] kifejezs)
sszeget ad. A NULL rtkeket figyelmen kvl hagyja.
MIN([DISTINCT|ALL] kifejezs)
A legkisebb rtket adja vissza.
MAX([DISTINCT|ALL] kifejezs)
A legnagyobb rtket adja vissza.
COUNT([DISTINCT|ALL] *|kifejezs) Adatok szmt adja vissza (* esetn az sszest),
a NULL rtkeket vigyelmen kvl hagyva.
ltalban nem alkalmazhatk egytt az egyszer lekrdezsekkel.
2) Csoportok kpzse
Az eredmnyl kapott sorok csoportostsa.
GROUP BY oszlopnv_gb:
A csoportosts ezen oszlop/oszlopok azonos rtkei alapjn trtnik, majd ezutn valamely
msik oszlop csoportostott soraiba tartoz rtkeit sszegezhetjk, rendezhetjk, tlagolhatjuk
stb.
HAVING csoportkivlasztsi felttel:
A HAVING-et akkor hasznljuk, ha nem az sszes, hanem csak bizonyos GROUP BY ltal
kivlasztott csoportokra van szksgnk.
A GROUP BY ltal kialaktott csoportokbl kivlasztja azon sorokat, amelyek eleget tesznek az
t kvet csoportkivlasztsi felttelnek. Ha GROUP BY nincsen megadva, akkor a tbla egsze
egy csoportnak tekinthet.
Megjegyzsek:
1. Ha a felttel sszetett, akkor minden elemi felttelnek aggregl fggvnyeket kell tartalmaznia.
18
a) Nzzk meg, hogy az azonos bejelentkezsi idvel rendelkez repltereknl mennyi az illetkek sszege s
tlaga, illetve hogy mennyi a minimlis s a maximlis illetk!
SQL> SELECT checkin, SUM (illetek), AVG ( illetek ) , MIN(illetek), MAX(illetek)
2 FROM repter
3 GROUP BY checkin;
CHECKIN SUM(ILLETEK) AVG(ILLETEK) MIN(ILLETEK) MAX(ILLETEK)
-------------- ------------------- ------------------ ----------------- -----------------1
13000
6500
5000
8000
2
15000
7500
5000
10000
12000
12000
12000
12000
b) Hny jrat indul az egyes replterekrl? s mikor indul a legkorbbi?
SQL> SELECT honkod, COUNT(honkod), min(indulas)
2 FROM jaratok
3 GROUP BY honkod;
HON COUNT(HONKOD) MIN(INDULAS)
----- ----------------------- -----------------001
3
1152
002
1
1023
003
2
1322
c) Nzzk meg, hogy az azonos bejelentkezsi idvel rendelkez replterek illetknek mennyi az tlaga, de
csak azokban az esetekben, ahol az nem haladja meg a 7000 Ft-ot!
SQL> SELECT checkin, AVG ( illetek )
2 FROM repter
3 GROUP BY checkin
4
HAVING AVG ( illetek ) <= 7000;
CHECKIN AVG(ILLETEK)
------------- ----------------1
6500
19
Precedencijuk a szoksos.
A NULL 0, gy a legtbb fggvny nem tudja rtelmezni. Megolds: ld. az NVL fggvnyt.
2) Karakterkezel fggvnyek
Megjelenthetk a SELECT-ben, felhasznlhatk annak WHERE s ORDER BY rszben.
Nhny fggvny:
Paramtere:
Eredmnye:
INITCAP({oszlop | kifejezs})
LOWER({oszlop | kifejezs})
UPPER({oszlop | kifejezs})
kovacs vagy kOVAcs KOVACS
LENGTH({oszlop | kifejezs})
rtkek hossza
CONCAT({oszlop1 | kifejezs1}, {oszlop2 | kifejezs2}) a kt megadott karakterlncot
sszefzi. Azonos a (||) opertorral.
INSTR(kifejezs, 'keresend sztring') az els elforduls pozciszmt adja vissza
20
dtum
dtum
napok szma
Nhny fggvny:
ADD_MONTHS(dtum, hozzadand_hnapok_szma) hozzads.
GREATEST(dtum1, dtum2) a nagyobbikat adja vissza.
LEAST(dtum1, dtum2) a kisebbiket adja vissza.
MONTHS_BETWEEN(dtum1, dtum2) a kt dtum klnbsge hnapokban.
Eredmnye egy szm.
NEX_DAY(dtum, nap) meghatrozza a megadott dtum utni nap nev nap dtumt.
LAST_DAY(dtum) meghatrozza a megadott dtum ltal meghatrozott hnap utols
napjnak dtumt.
ROUND(dtum, formtum) a legkzelebbi egsz napra kerekti.
TRUNC(dtum, formtum) a befejezett egsz napot adja vissza.
4) Konverzis fggvnyek
A teljes dtum az vszzad, v, hnap, nap, ra, perc, msodperc rszekbl ll.
TO_CHAR({szm | 'dtum'} [,'formtummaszk']) konverzis fggvny:
a szm s a dtum tpus adatot karakteres tpus adatt konvertlja
rtkadsnl pl.:
SQL>SELECT TO_CHAR(datum,'YYYY. month fmDD.') datumok
2 FROM rendeles;
TO_NUMBER(karakterlnc [,'formtummaszk']) konverzis fggvny:
a szmot tartalmaz karakteres tpus adatot szmm konvertlja
21
Mveletek dtumokkal:
sszeadhatk, kivonhatk egymsbl, hozzadhatk, kivonhatk napok.
rtkadsnl, pldul mai nap + 7 nap:
SQL> UPDATE szamlak
2 SET kelt=SYSDATE+7, rogz='Tth dm'
3 WHERE osszeg=12000;
5) Az NVL fggvny
NLV(oszlopkifejezs, helyettest_rtk) Ha egy adott helyen NULL szerepel, a fggvny a
helyettest_rtk-et adja vissza, ellenkez esetben a trolt adatot.
Lnyeges pl. az AVG fggvnynl, ahol a NULL eltorzthatja az eredmnyt.
a) Listzzuk ki, hogy mely jratok menetideje kisebb, mint 2 ra (azaz 120 perc), s rassuk ki a menetidt is!
SQL> SELECT szam jarat, erkezes-indulas
2 FROM jaratok
3 WHERE erkezesindulas<120;
JARAT ERKEZESINDULAS
--------- --------------112
108
113
83
114
101
115
95
22
AVG(CHECKIN)
-----------------1.5
AVG(NVL(CHECKIN,0))
---------------------------1.2
c) rassuk ki a 10 000-nl kisebb szmlasszegeket, azok harmadt, majd azok harmadt 2 tizedes jeggyel
megjelentve!
SQL> SELECT osszeg, NVL(osszeg,0)/3, TRUNC(NVL(osszeg,0)/3,2)
2 FROM szamlak
3 WHERE osszeg<10000;
OSSZEG NVL(OSSZEG,0)/3 TRUNC(NVL(OSSZEG,0)/3,2)
------------- ----------------------- -----------------------------------2356
785.33333
785.33
9364
3121.3333
3121.33
d) rassuk ki a szmlk rgztinek nevt (mindenkit csak egyszer)!
SQL> SELECT DISTINCT INITCAP(rogz)
2 FROM szamlak;
INITCAP(ROGZ)
-----------------------------Hegyi
Kiss Edit
Kovacs
Lakatos A.
Magyar Bela
Nagy
Toth Adam
Virag
e) Listzzuk ki a szmlk keltt, valamint az esedkessgi dtumukat, amely a keltezstl szmtott 30. nap!
SQL> SELECT szla szamlaszam, kelt, kelt+30 esedekes
2 FROM szamlak
23
IV.6. Join
SELECT oszlopnv, oszlopnv,
FROM tblanv [alias nv], tblanv [alias nv]
WHERE kapcsol_oszlop1 szehasonlt_opertor kapcsol_oszlop2
AND
A JOIN lehetv teszi a klnbz tblkban lv adatok kapcsol felttelek alapjn val
sszekapcsolst.
a) Listzzuk ki, hogy melyik jrat melyik repltrrl indul!
SQL> SELECT szam jarat, varos honnan
2 FROM jaratok, repter
3 WHERE honkod = kod;
JARAT HONNAN
--------- ------------------------123 Budapest, Ferihegy 1
112 Budapest, Ferihegy 1
115 Budapest, Ferihegy 1
111 Praha
113 Warszawa Internacionalna
114 Warszawa Internacionalna
b) Egsztsk ki a fenti listt azzal, hogy kiratjuk, hov megy a jrat! A megjelentett lista legyen a jratok
szma szerinti nvekv sorrendben!
SQL> SELECT szam jarat, r1.varos honnan, r2.varos hova
2 FROM jaratok, repter r1, repter r2
3 WHERE honkod = r1.kod AND hovkod = r2.kod
4 ORDER BY szam;
JARAT HONNAN
HOVA
--------- ------------------------------------- ------------------------111 Praha
Budapest, Ferihegy 1
112 Budapest, Ferihegy 1
Warszawa Internacionalna
113 Warszawa Internacionalna
Budapest, Ferihegy 1
114 Warszawa Internacionalna
Paris Orly
115 Budapest, Ferihegy 1
Warszawa Internacionalna
123 Budapest, Ferihegy 1
Praha
c) Mely replterek kldtek 10 000 Ft-nl nagyobb szmlkat?
SQL> SELECT varos, osszeg
2 FROM repter, szamlak
3 WHERE kod = rkod
4
AND osszeg>10000;
VAROS
------------------------Budapest, Ferihegy 1
Praha
Praha
Warszawa Internacionalna
Warszawa Internacionalna
Paris Orly
OSSZEG
----------11328
23560
48000
30000
42000
12000
24
25
INDULAS
-----------1535
2032
1322
1415
b) Milyen jratszmmal s mikor indtanak jratot azok a replterek, amelyek 20 000 Ft-nl nagyobb
szmlt kldtek?
SQL> SELECT szam jarat, indulas indul, r1.varos repterrol, r2.varos repterre
2 FROM jaratok, repter r1, repter r2
3 WHERE honkod=r1.kod AND hovkod=r2.kod AND r1.kod IN
4
(SELECT DISTINCT rkod
5
FROM szamlak
6
WHERE osszeg > 20000);
JARAT INDUL REPTERROL
REPTERRE
--------- ----------- --------------------------------- ------------------------111
1023 Praha
Budapest, Ferihegy 1
113
2032 Warszawa Internacionalna Budapest, Ferihegy 1
114
1322 Warszawa Internacionalna Paris Orly
c) Mely replterekrl rkezett M kd szmla?
SQL> SELECT DISTINCT varos
2 FROM repter, szamlak sz
3 WHERE rkod = kod AND
4 EXISTS ( SELECT * FROM szamlak
5 WHERE sz.szla LIKE '__/M%');
VAROS
------------------------Budapest, Ferihegy 1
Praha
26